From 6ae833929990a2bbef939fb4c24d1680a54ce50d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 27 Jan 2025 23:24:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/cms/ad/index.ts | 140 +++++ api/cms/ad/model/index.ts | 42 ++ api/cms/article/index.ts | 143 +++++ api/cms/article/model/index.ts | 98 ++++ api/cms/category/index.ts | 126 +++++ api/cms/category/model/index.ts | 82 +++ api/cms/cmsArticleComment/index.ts | 106 ++++ api/cms/cmsArticleComment/model/index.ts | 47 ++ api/cms/cmsProduct/index.ts | 117 +++++ api/cms/cmsProduct/model/index.ts | 105 ++++ api/cms/cmsProductComment/index.ts | 106 ++++ api/cms/cmsProductComment/model/index.ts | 41 ++ api/cms/cmsProductParameter/index.ts | 106 ++++ api/cms/cmsProductParameter/model/index.ts | 33 ++ api/cms/cmsProductSpec/index.ts | 106 ++++ api/cms/cmsProductSpec/model/index.ts | 35 ++ api/cms/cmsProductSpecValue/index.ts | 106 ++++ api/cms/cmsProductSpecValue/model/index.ts | 29 ++ api/cms/cmsProductUrl/index.ts | 106 ++++ api/cms/cmsProductUrl/model/index.ts | 41 ++ api/cms/design/index.ts | 143 +++++ api/cms/design/model/index.ts | 55 ++ api/cms/docs-book/index.ts | 143 +++++ api/cms/docs-book/model/index.ts | 31 ++ api/cms/docs-content/index.ts | 146 ++++++ api/cms/docs-content/model/index.ts | 36 ++ api/cms/docs/index.ts | 143 +++++ api/cms/docs/model/index.ts | 64 +++ api/cms/domain/index.ts | 153 ++++++ api/cms/domain/model/index.ts | 33 ++ api/cms/form-record/index.ts | 126 +++++ api/cms/form-record/model/index.ts | 28 + api/cms/form/index.ts | 143 +++++ api/cms/form/model/index.ts | 33 ++ api/cms/link/index.ts | 113 ++++ api/cms/link/model/index.ts | 29 ++ api/cms/mp-menu/index.ts | 106 ++++ api/cms/mp-menu/model/index.ts | 85 +++ api/cms/mp/index.ts | 103 ++++ api/cms/mp/model/index.ts | 62 +++ api/cms/mpAd/index.ts | 106 ++++ api/cms/mpAd/model/index.ts | 47 ++ api/cms/mpField/index.ts | 132 +++++ api/cms/mpField/model/index.ts | 37 ++ api/cms/mpPages/index.ts | 106 ++++ api/cms/mpPages/model/index.ts | 52 ++ api/cms/navigation/index.ts | 173 ++++++ api/cms/navigation/model/index.ts | 59 +++ api/cms/website/field/index.ts | 159 ++++++ api/cms/website/field/model/index.ts | 45 ++ api/cms/website/index.ts | 169 ++++++ api/cms/website/model/index.ts | 79 +++ api/index.ts | 58 +++ api/json/china-provinces.geo.json | 1 + api/json/industry-data.json | 1 + api/json/regions-data.json | 1 + api/layout/index.ts | 84 +++ api/layout/model/index.ts | 26 + api/oa/app/field/index.ts | 126 +++++ api/oa/app/field/model/index.ts | 24 + api/oa/app/index.ts | 190 +++++++ api/oa/app/model/index.ts | 166 ++++++ api/oa/app/renew/index.ts | 126 +++++ api/oa/app/renew/model/index.ts | 40 ++ api/oa/app/url/index.ts | 106 ++++ api/oa/app/url/model/index.ts | 26 + api/oa/app/user/index.ts | 126 +++++ api/oa/app/user/model/index.ts | 37 ++ api/oa/apply/index.ts | 18 + api/oa/apply/model/index.ts | 43 ++ api/oa/assets/index.ts | 134 +++++ api/oa/assets/model/index.ts | 89 ++++ api/oa/assets/user/index.ts | 129 +++++ api/oa/assets/user/model/index.ts | 35 ++ api/oa/chatgpt/index.ts | 31 ++ api/oa/chatgpt/model/index.ts | 17 + api/oa/customer/index.ts | 140 +++++ api/oa/customer/model/index.ts | 67 +++ api/oa/link/index.ts | 113 ++++ api/oa/link/model/index.ts | 29 ++ api/oa/notice/index.ts | 111 ++++ api/oa/notice/model/index.ts | 40 ++ api/oa/oaApp/index.ts | 106 ++++ api/oa/oaApp/model/index.ts | 149 ++++++ api/oa/oaAppField/index.ts | 106 ++++ api/oa/oaAppField/model/index.ts | 33 ++ api/oa/oaAppRenew/index.ts | 106 ++++ api/oa/oaAppRenew/model/index.ts | 41 ++ api/oa/oaAppUrl/index.ts | 106 ++++ api/oa/oaAppUrl/model/index.ts | 37 ++ api/oa/oaAppUser/index.ts | 106 ++++ api/oa/oaAppUser/model/index.ts | 31 ++ api/oa/oaAssets/index.ts | 106 ++++ api/oa/oaAssets/model/index.ts | 91 ++++ api/oa/oaAssetsCode/index.ts | 106 ++++ api/oa/oaAssetsCode/model/index.ts | 51 ++ api/oa/oaAssetsDomain/index.ts | 106 ++++ api/oa/oaAssetsDomain/model/index.ts | 55 ++ api/oa/oaAssetsEmail/index.ts | 106 ++++ api/oa/oaAssetsEmail/model/index.ts | 55 ++ api/oa/oaAssetsServer/index.ts | 106 ++++ api/oa/oaAssetsServer/model/index.ts | 91 ++++ api/oa/oaAssetsSite/index.ts | 106 ++++ api/oa/oaAssetsSite/model/index.ts | 55 ++ api/oa/oaAssetsUser/index.ts | 106 ++++ api/oa/oaAssetsUser/model/index.ts | 31 ++ api/oa/oaAssetsVhost/index.ts | 106 ++++ api/oa/oaAssetsVhost/model/index.ts | 55 ++ api/oa/oaCompany/index.ts | 106 ++++ api/oa/oaCompany/model/index.ts | 117 +++++ api/oa/oaCompanyField/index.ts | 106 ++++ api/oa/oaCompanyField/model/index.ts | 33 ++ api/oa/oaCompanyUser/index.ts | 106 ++++ api/oa/oaCompanyUser/model/index.ts | 31 ++ api/oa/oaLink/index.ts | 106 ++++ api/oa/oaLink/model/index.ts | 45 ++ api/oa/oaProduct/index.ts | 106 ++++ api/oa/oaProduct/model/index.ts | 65 +++ api/oa/oaProductTabs/index.ts | 106 ++++ api/oa/oaProductTabs/model/index.ts | 49 ++ api/oa/oaTask/index.ts | 106 ++++ api/oa/oaTask/model/index.ts | 85 +++ api/oa/oaTaskCount/index.ts | 106 ++++ api/oa/oaTaskCount/model/index.ts | 45 ++ api/oa/oaTaskRecord/index.ts | 106 ++++ api/oa/oaTaskRecord/model/index.ts | 45 ++ api/oa/oaTaskUser/index.ts | 106 ++++ api/oa/oaTaskUser/model/index.ts | 31 ++ api/oa/order/index.ts | 120 +++++ api/oa/order/model/index.ts | 44 ++ api/oa/product/index.ts | 120 +++++ api/oa/product/model/index.ts | 94 ++++ api/oa/product/tabs/index.ts | 129 +++++ api/oa/product/tabs/model/index.ts | 24 + api/oa/project/index.ts | 106 ++++ api/oa/project/model/index.ts | 56 ++ api/oa/task-count/index.ts | 120 +++++ api/oa/task-count/model/index.ts | 32 ++ api/oa/task-record/index.ts | 120 +++++ api/oa/task-record/model/index.ts | 35 ++ api/oa/task-user/index.ts | 120 +++++ api/oa/task-user/model/index.ts | 27 + api/oa/task/index.ts | 154 ++++++ api/oa/task/model/index.ts | 111 ++++ api/oa/task/model/progress.ts | 9 + api/oa/task/model/task.ts | 8 + api/oa/tennat/index.ts | 155 ++++++ api/oa/tennat/model/index.ts | 39 ++ api/passport/login/index.ts | 109 ++++ api/passport/login/model/index.ts | 46 ++ api/shop/brand/index.ts | 106 ++++ api/shop/brand/model/index.ts | 31 ++ api/shop/cashier/index.ts | 194 +++++++ api/shop/cashier/model/index.ts | 80 +++ api/shop/count/index.ts | 119 +++++ api/shop/count/model/index.ts | 40 ++ api/shop/dealerApply/index.ts | 106 ++++ api/shop/dealerApply/model/index.ts | 41 ++ api/shop/dealerCapital/index.ts | 106 ++++ api/shop/dealerCapital/model/index.ts | 35 ++ api/shop/dealerOrder/index.ts | 106 ++++ api/shop/dealerOrder/model/index.ts | 47 ++ api/shop/dealerReferee/index.ts | 106 ++++ api/shop/dealerReferee/model/index.ts | 29 ++ api/shop/dealerSetting/index.ts | 106 ++++ api/shop/dealerSetting/model/index.ts | 25 + api/shop/dealerUser/index.ts | 106 ++++ api/shop/dealerUser/model/index.ts | 48 ++ api/shop/dealerWithdraw/index.ts | 106 ++++ api/shop/dealerWithdraw/model/index.ts | 47 ++ api/shop/goods/index.ts | 116 +++++ api/shop/goods/model/index.ts | 114 ++++ api/shop/goodsAttr/index.ts | 106 ++++ api/shop/goodsAttr/model/index.ts | 29 ++ api/shop/goodsAttrResult/index.ts | 106 ++++ api/shop/goodsAttrResult/model/index.ts | 27 + api/shop/goodsAttrValue/index.ts | 106 ++++ api/shop/goodsAttrValue/model/index.ts | 59 +++ api/shop/goodsCategory/index.ts | 106 ++++ api/shop/goodsCategory/model/index.ts | 67 +++ api/shop/goodsComment/index.ts | 106 ++++ api/shop/goodsComment/model/index.ts | 61 +++ api/shop/goodsCoupon/index.ts | 106 ++++ api/shop/goodsCoupon/model/index.ts | 35 ++ api/shop/goodsDescription/index.ts | 106 ++++ api/shop/goodsDescription/model/index.ts | 25 + api/shop/goodsLog/index.ts | 106 ++++ api/shop/goodsLog/model/index.ts | 53 ++ api/shop/goodsRelation/index.ts | 106 ++++ api/shop/goodsRelation/model/index.ts | 31 ++ api/shop/goodsRule/index.ts | 106 ++++ api/shop/goodsRule/model/index.ts | 23 + api/shop/goodsSku/index.ts | 118 +++++ api/shop/goodsSku/model/index.ts | 50 ++ api/shop/goodsSpec/index.ts | 106 ++++ api/shop/goodsSpec/model/index.ts | 31 ++ api/shop/goodsSpecRel/index.ts | 106 ++++ api/shop/goodsSpecRel/model/index.ts | 25 + api/shop/order/index.ts | 106 ++++ api/shop/order/model/index.ts | 108 ++++ api/shop/rechargeOrder/index.ts | 106 ++++ api/shop/rechargeOrder/model/index.ts | 63 +++ api/shop/shopCart/index.ts | 106 ++++ api/shop/shopCart/model/index.ts | 72 +++ api/shop/shopMerchant/index.ts | 106 ++++ api/shop/shopMerchant/model/index.ts | 89 ++++ api/shop/shopMerchantAccount/index.ts | 106 ++++ api/shop/shopMerchantAccount/model/index.ts | 39 ++ api/shop/shopMerchantApply/index.ts | 106 ++++ api/shop/shopMerchantApply/model/index.ts | 74 +++ api/shop/shopMerchantCount/index.ts | 106 ++++ api/shop/shopMerchantCount/model/index.ts | 29 ++ api/shop/shopMerchantType/index.ts | 106 ++++ api/shop/shopMerchantType/model/index.ts | 29 ++ api/shop/shopOrderInfo/index.ts | 106 ++++ api/shop/shopOrderInfo/model/index.ts | 62 +++ api/shop/spec/index.ts | 106 ++++ api/shop/spec/model/index.ts | 35 ++ api/shop/specValue/index.ts | 106 ++++ api/shop/specValue/model/index.ts | 33 ++ api/shop/userAddress/index.ts | 106 ++++ api/shop/userAddress/model/index.ts | 43 ++ api/shop/users/index.ts | 106 ++++ api/shop/users/model/index.ts | 49 ++ api/shop/wechatDeposit/index.ts | 106 ++++ api/shop/wechatDeposit/model/index.ts | 43 ++ api/system/access-key/index.ts | 59 +++ api/system/access-key/model/index.ts | 20 + api/system/appstore/index.ts | 11 + api/system/appstore/model/index.ts | 13 + api/system/cache/index.ts | 76 +++ api/system/cache/model/index.ts | 18 + api/system/chat/index.ts | 157 ++++++ api/system/chat/model/index.ts | 49 ++ api/system/chatConversation/index.ts | 106 ++++ api/system/chatConversation/model/index.ts | 37 ++ api/system/chatMessage/index.ts | 120 +++++ api/system/chatMessage/model/index.ts | 49 ++ api/system/company/index.ts | 162 ++++++ api/system/company/model/index.ts | 122 +++++ api/system/companyComment/index.ts | 106 ++++ api/system/companyComment/model/index.ts | 43 ++ api/system/companyContent/index.ts | 106 ++++ api/system/companyContent/model/index.ts | 25 + api/system/companyGit/index.ts | 106 ++++ api/system/companyGit/model/index.ts | 41 ++ api/system/companyParameter/index.ts | 106 ++++ api/system/companyParameter/model/index.ts | 33 ++ api/system/companyUrl/index.ts | 106 ++++ api/system/companyUrl/model/index.ts | 39 ++ api/system/dict-data/index.ts | 87 ++++ api/system/dict-data/model/index.ts | 45 ++ api/system/dict/index.ts | 61 +++ api/system/dict/model/index.ts | 29 ++ api/system/dictionary-data/index.ts | 87 ++++ api/system/dictionary-data/model/index.ts | 33 ++ api/system/dictionary/index.ts | 61 +++ api/system/dictionary/model/index.ts | 29 ++ api/system/environment/index.ts | 125 +++++ api/system/environment/model/index.ts | 25 + api/system/file/index.ts | 234 +++++++++ api/system/file/model/index.ts | 54 ++ api/system/login-record/index.ts | 32 ++ api/system/login-record/model/index.ts | 38 ++ api/system/menu/index.ts | 127 +++++ api/system/menu/model/index.ts | 67 +++ api/system/modules/index.ts | 118 +++++ api/system/modules/model/index.ts | 22 + api/system/operation-record/index.ts | 32 ++ api/system/operation-record/model/index.ts | 56 ++ api/system/order/index.ts | 106 ++++ api/system/order/model/index.ts | 93 ++++ api/system/orderGoods/index.ts | 106 ++++ api/system/orderGoods/model/index.ts | 55 ++ api/system/organization/index.ts | 73 +++ api/system/organization/model/index.ts | 42 ++ api/system/parameter/index.ts | 106 ++++ api/system/parameter/model/index.ts | 31 ++ api/system/payment/index.ts | 121 +++++ api/system/payment/model/index.ts | 55 ++ api/system/plug/index.ts | 125 +++++ api/system/plug/model/index.ts | 67 +++ api/system/role/index.ts | 119 +++++ api/system/role/model/index.ts | 27 + api/system/setting/index.ts | 126 +++++ api/system/setting/model/index.ts | 127 +++++ api/system/tenant/index.ts | 178 +++++++ api/system/tenant/model/index.ts | 46 ++ api/system/url/index.ts | 106 ++++ api/system/url/model/index.ts | 37 ++ api/system/user-collection/index.ts | 106 ++++ api/system/user-collection/model/index.ts | 25 + api/system/user-file/index.ts | 89 ++++ api/system/user-file/model/index.ts | 39 ++ api/system/user-group/index.ts | 120 +++++ api/system/user-group/model/index.ts | 23 + api/system/user/index.ts | 236 +++++++++ api/system/user/model/count.ts | 15 + api/system/user/model/index.ts | 155 ++++++ api/system/version/index.ts | 119 +++++ api/system/version/model/index.ts | 26 + api/system/website/field/index.ts | 146 ++++++ api/system/website/field/model/index.ts | 25 + api/system/website/index.ts | 169 ++++++ api/system/website/model/index.ts | 58 +++ api/system/white-domain/index.ts | 146 ++++++ api/system/white-domain/model/index.ts | 27 + assets/css/main.css | 122 +++++ assets/images/icon_1.png | Bin 0 -> 1503 bytes assets/images/icon_12.png | Bin 0 -> 1965 bytes assets/images/icon_2.png | Bin 0 -> 1852 bytes assets/images/icon_26.png | Bin 0 -> 2151 bytes assets/images/icon_30.png | Bin 0 -> 1496 bytes assets/images/jlt.png | Bin 0 -> 66411 bytes assets/images/toux.png | Bin 0 -> 31134 bytes assets/json/china-provinces.geo.json | 1 + assets/json/industry-data.json | 1 + assets/json/regions-data.json | 1 + assets/logo.png | Bin 0 -> 37459 bytes assets/logo.svg | 18 + assets/scss/var.scss | 3 + ...kJyvf_!!6000000001499-55-tps-70-70 (1).svg | 1 + assets/svg/github-mark-white.svg | 1 + assets/svg/github-mark.svg | 1 + assets/svg/search.svg | 1 + assets/svg/websoft-mark-white.svg | 15 + components/AppFooter.vue | 113 ++++ components/AppHeader.vue | 233 +++++++++ components/Banner.vue | 38 ++ components/Breadcrumb.vue | 29 ++ components/CardList.vue | 44 ++ components/CompanyList.vue | 102 ++++ components/PageBanner.vue | 180 +++++++ components/PageContainer.vue | 30 ++ components/Passport.vue | 51 ++ components/ProductList.vue | 94 ++++ components/ProductShopInfo.vue | 42 ++ components/UnderMaintenance.vue | 24 + components/Upload.vue | 61 +++ components/UserCard.vue | 225 ++++++++ composables/configState.ts | 91 ++++ composables/useClientRequest.ts | 43 ++ composables/useServerRequest.ts | 63 +++ config/index.ts | 75 +++ layouts/default.vue | 180 +++++++ pages/[custom].vue | 76 +++ pages/article/[categoryId].vue | 89 ++++ pages/article/components/CardList.vue | 52 ++ pages/ask/[userId].vue | 211 ++++++++ pages/ask/components/CardList.vue | 55 ++ pages/ask/index.vue | 103 ++++ pages/case/components/CardList.vue | 63 +++ pages/case/components/PageBanner.vue | 115 ++++ pages/case/index.vue | 84 +++ pages/category/components/CardList.vue | 47 ++ pages/category/index.vue | 91 ++++ pages/components/ArticleList.vue | 104 ++++ pages/components/Banner.vue | 96 ++++ pages/components/CardList.vue | 87 ++++ pages/components/Flash.vue | 121 +++++ pages/components/PlugList.vue | 83 +++ pages/components/ProductList.vue | 92 ++++ pages/detail/components/LikeArticle.vue | 64 +++ pages/detail/components/PageBanner.vue | 94 ++++ pages/detail/index.vue | 232 +++++++++ pages/developer/components/CardList.vue | 47 ++ pages/developer/index.vue | 154 ++++++ pages/developer/join-in.vue | 149 ++++++ pages/docs/components/CardList.vue | 47 ++ pages/docs/index.vue | 103 ++++ pages/down/components/CardList.vue | 52 ++ pages/down/index.vue | 96 ++++ pages/index.vue | 68 +++ pages/item/components/Comments.vue | 201 +++++++ pages/item/components/PageBanner.vue | 168 ++++++ pages/item/index.vue | 293 +++++++++++ pages/manage/cms/index.vue | 358 +++++++++++++ pages/manage/index.vue | 373 +++++++++++++ pages/manage/shop/index.vue | 358 +++++++++++++ pages/market/components/CardList.vue | 86 +++ pages/market/index.vue | 75 +++ pages/merchant/index.vue | 82 +++ pages/page/index.vue | 76 +++ pages/passport/components/Auth.vue | 312 +++++++++++ pages/passport/login.vue | 491 ++++++++++++++++++ pages/passport/register.vue | 49 ++ .../checkout/components/PageBanner.vue | 67 +++ pages/product/checkout/index.vue | 226 ++++++++ pages/product/components/CardList.vue | 81 +++ .../product/create/components/PageBanner.vue | 67 +++ pages/product/create/index.vue | 439 ++++++++++++++++ pages/product/create/product.vue | 389 ++++++++++++++ pages/product/createWebsite/index.vue | 25 + pages/product/createWebsite/index2.vue | 25 + pages/product/detail/[id].vue | 168 ++++++ pages/product/index.vue | 75 +++ pages/search/index.vue | 138 +++++ pages/templates/components/CardList.vue | 57 ++ pages/templates/components/PageBanner.vue | 115 ++++ pages/templates/index.vue | 84 +++ pages/user/auth.vue | 58 +++ pages/user/components/Auth.vue | 460 ++++++++++++++++ pages/user/components/Base.vue | 46 ++ pages/user/components/Order.vue | 45 ++ pages/user/components/Password.vue | 31 ++ pages/user/components/UserMenu.vue | 60 +++ pages/user/index.vue | 96 ++++ pages/user/logout.vue | 13 + pages/user/order.vue | 94 ++++ pages/user/password.vue | 139 +++++ plugins/element-ui.js | 6 + public/favicon.ico | Bin 0 -> 4286 bytes public/logo.png | Bin 0 -> 37459 bytes public/robots.txt | 1 + types/global.d.ts | 32 ++ utils/common.ts | 217 ++++++++ utils/domain.ts | 104 ++++ utils/loadScript.ts | 68 +++ utils/request.ts | 88 ++++ utils/tool.ts | 25 + utils/use-form-data.ts | 29 ++ 421 files changed, 35687 insertions(+) create mode 100644 api/cms/ad/index.ts create mode 100644 api/cms/ad/model/index.ts create mode 100644 api/cms/article/index.ts create mode 100644 api/cms/article/model/index.ts create mode 100644 api/cms/category/index.ts create mode 100644 api/cms/category/model/index.ts create mode 100644 api/cms/cmsArticleComment/index.ts create mode 100644 api/cms/cmsArticleComment/model/index.ts create mode 100644 api/cms/cmsProduct/index.ts create mode 100644 api/cms/cmsProduct/model/index.ts create mode 100644 api/cms/cmsProductComment/index.ts create mode 100644 api/cms/cmsProductComment/model/index.ts create mode 100644 api/cms/cmsProductParameter/index.ts create mode 100644 api/cms/cmsProductParameter/model/index.ts create mode 100644 api/cms/cmsProductSpec/index.ts create mode 100644 api/cms/cmsProductSpec/model/index.ts create mode 100644 api/cms/cmsProductSpecValue/index.ts create mode 100644 api/cms/cmsProductSpecValue/model/index.ts create mode 100644 api/cms/cmsProductUrl/index.ts create mode 100644 api/cms/cmsProductUrl/model/index.ts create mode 100644 api/cms/design/index.ts create mode 100644 api/cms/design/model/index.ts create mode 100644 api/cms/docs-book/index.ts create mode 100644 api/cms/docs-book/model/index.ts create mode 100644 api/cms/docs-content/index.ts create mode 100644 api/cms/docs-content/model/index.ts create mode 100644 api/cms/docs/index.ts create mode 100644 api/cms/docs/model/index.ts create mode 100644 api/cms/domain/index.ts create mode 100644 api/cms/domain/model/index.ts create mode 100644 api/cms/form-record/index.ts create mode 100644 api/cms/form-record/model/index.ts create mode 100644 api/cms/form/index.ts create mode 100644 api/cms/form/model/index.ts create mode 100644 api/cms/link/index.ts create mode 100644 api/cms/link/model/index.ts create mode 100644 api/cms/mp-menu/index.ts create mode 100644 api/cms/mp-menu/model/index.ts create mode 100644 api/cms/mp/index.ts create mode 100644 api/cms/mp/model/index.ts create mode 100644 api/cms/mpAd/index.ts create mode 100644 api/cms/mpAd/model/index.ts create mode 100644 api/cms/mpField/index.ts create mode 100644 api/cms/mpField/model/index.ts create mode 100644 api/cms/mpPages/index.ts create mode 100644 api/cms/mpPages/model/index.ts create mode 100644 api/cms/navigation/index.ts create mode 100644 api/cms/navigation/model/index.ts create mode 100644 api/cms/website/field/index.ts create mode 100644 api/cms/website/field/model/index.ts create mode 100644 api/cms/website/index.ts create mode 100644 api/cms/website/model/index.ts create mode 100644 api/index.ts create mode 100644 api/json/china-provinces.geo.json create mode 100644 api/json/industry-data.json create mode 100644 api/json/regions-data.json create mode 100644 api/layout/index.ts create mode 100644 api/layout/model/index.ts create mode 100644 api/oa/app/field/index.ts create mode 100644 api/oa/app/field/model/index.ts create mode 100644 api/oa/app/index.ts create mode 100644 api/oa/app/model/index.ts create mode 100644 api/oa/app/renew/index.ts create mode 100644 api/oa/app/renew/model/index.ts create mode 100644 api/oa/app/url/index.ts create mode 100644 api/oa/app/url/model/index.ts create mode 100644 api/oa/app/user/index.ts create mode 100644 api/oa/app/user/model/index.ts create mode 100644 api/oa/apply/index.ts create mode 100644 api/oa/apply/model/index.ts create mode 100644 api/oa/assets/index.ts create mode 100644 api/oa/assets/model/index.ts create mode 100644 api/oa/assets/user/index.ts create mode 100644 api/oa/assets/user/model/index.ts create mode 100644 api/oa/chatgpt/index.ts create mode 100644 api/oa/chatgpt/model/index.ts create mode 100644 api/oa/customer/index.ts create mode 100644 api/oa/customer/model/index.ts create mode 100644 api/oa/link/index.ts create mode 100644 api/oa/link/model/index.ts create mode 100644 api/oa/notice/index.ts create mode 100644 api/oa/notice/model/index.ts create mode 100644 api/oa/oaApp/index.ts create mode 100644 api/oa/oaApp/model/index.ts create mode 100644 api/oa/oaAppField/index.ts create mode 100644 api/oa/oaAppField/model/index.ts create mode 100644 api/oa/oaAppRenew/index.ts create mode 100644 api/oa/oaAppRenew/model/index.ts create mode 100644 api/oa/oaAppUrl/index.ts create mode 100644 api/oa/oaAppUrl/model/index.ts create mode 100644 api/oa/oaAppUser/index.ts create mode 100644 api/oa/oaAppUser/model/index.ts create mode 100644 api/oa/oaAssets/index.ts create mode 100644 api/oa/oaAssets/model/index.ts create mode 100644 api/oa/oaAssetsCode/index.ts create mode 100644 api/oa/oaAssetsCode/model/index.ts create mode 100644 api/oa/oaAssetsDomain/index.ts create mode 100644 api/oa/oaAssetsDomain/model/index.ts create mode 100644 api/oa/oaAssetsEmail/index.ts create mode 100644 api/oa/oaAssetsEmail/model/index.ts create mode 100644 api/oa/oaAssetsServer/index.ts create mode 100644 api/oa/oaAssetsServer/model/index.ts create mode 100644 api/oa/oaAssetsSite/index.ts create mode 100644 api/oa/oaAssetsSite/model/index.ts create mode 100644 api/oa/oaAssetsUser/index.ts create mode 100644 api/oa/oaAssetsUser/model/index.ts create mode 100644 api/oa/oaAssetsVhost/index.ts create mode 100644 api/oa/oaAssetsVhost/model/index.ts create mode 100644 api/oa/oaCompany/index.ts create mode 100644 api/oa/oaCompany/model/index.ts create mode 100644 api/oa/oaCompanyField/index.ts create mode 100644 api/oa/oaCompanyField/model/index.ts create mode 100644 api/oa/oaCompanyUser/index.ts create mode 100644 api/oa/oaCompanyUser/model/index.ts create mode 100644 api/oa/oaLink/index.ts create mode 100644 api/oa/oaLink/model/index.ts create mode 100644 api/oa/oaProduct/index.ts create mode 100644 api/oa/oaProduct/model/index.ts create mode 100644 api/oa/oaProductTabs/index.ts create mode 100644 api/oa/oaProductTabs/model/index.ts create mode 100644 api/oa/oaTask/index.ts create mode 100644 api/oa/oaTask/model/index.ts create mode 100644 api/oa/oaTaskCount/index.ts create mode 100644 api/oa/oaTaskCount/model/index.ts create mode 100644 api/oa/oaTaskRecord/index.ts create mode 100644 api/oa/oaTaskRecord/model/index.ts create mode 100644 api/oa/oaTaskUser/index.ts create mode 100644 api/oa/oaTaskUser/model/index.ts create mode 100644 api/oa/order/index.ts create mode 100644 api/oa/order/model/index.ts create mode 100644 api/oa/product/index.ts create mode 100644 api/oa/product/model/index.ts create mode 100644 api/oa/product/tabs/index.ts create mode 100644 api/oa/product/tabs/model/index.ts create mode 100644 api/oa/project/index.ts create mode 100644 api/oa/project/model/index.ts create mode 100644 api/oa/task-count/index.ts create mode 100644 api/oa/task-count/model/index.ts create mode 100644 api/oa/task-record/index.ts create mode 100644 api/oa/task-record/model/index.ts create mode 100644 api/oa/task-user/index.ts create mode 100644 api/oa/task-user/model/index.ts create mode 100644 api/oa/task/index.ts create mode 100644 api/oa/task/model/index.ts create mode 100644 api/oa/task/model/progress.ts create mode 100644 api/oa/task/model/task.ts create mode 100644 api/oa/tennat/index.ts create mode 100644 api/oa/tennat/model/index.ts create mode 100644 api/passport/login/index.ts create mode 100644 api/passport/login/model/index.ts create mode 100644 api/shop/brand/index.ts create mode 100644 api/shop/brand/model/index.ts create mode 100644 api/shop/cashier/index.ts create mode 100644 api/shop/cashier/model/index.ts create mode 100644 api/shop/count/index.ts create mode 100644 api/shop/count/model/index.ts create mode 100644 api/shop/dealerApply/index.ts create mode 100644 api/shop/dealerApply/model/index.ts create mode 100644 api/shop/dealerCapital/index.ts create mode 100644 api/shop/dealerCapital/model/index.ts create mode 100644 api/shop/dealerOrder/index.ts create mode 100644 api/shop/dealerOrder/model/index.ts create mode 100644 api/shop/dealerReferee/index.ts create mode 100644 api/shop/dealerReferee/model/index.ts create mode 100644 api/shop/dealerSetting/index.ts create mode 100644 api/shop/dealerSetting/model/index.ts create mode 100644 api/shop/dealerUser/index.ts create mode 100644 api/shop/dealerUser/model/index.ts create mode 100644 api/shop/dealerWithdraw/index.ts create mode 100644 api/shop/dealerWithdraw/model/index.ts create mode 100644 api/shop/goods/index.ts create mode 100644 api/shop/goods/model/index.ts create mode 100644 api/shop/goodsAttr/index.ts create mode 100644 api/shop/goodsAttr/model/index.ts create mode 100644 api/shop/goodsAttrResult/index.ts create mode 100644 api/shop/goodsAttrResult/model/index.ts create mode 100644 api/shop/goodsAttrValue/index.ts create mode 100644 api/shop/goodsAttrValue/model/index.ts create mode 100644 api/shop/goodsCategory/index.ts create mode 100644 api/shop/goodsCategory/model/index.ts create mode 100644 api/shop/goodsComment/index.ts create mode 100644 api/shop/goodsComment/model/index.ts create mode 100644 api/shop/goodsCoupon/index.ts create mode 100644 api/shop/goodsCoupon/model/index.ts create mode 100644 api/shop/goodsDescription/index.ts create mode 100644 api/shop/goodsDescription/model/index.ts create mode 100644 api/shop/goodsLog/index.ts create mode 100644 api/shop/goodsLog/model/index.ts create mode 100644 api/shop/goodsRelation/index.ts create mode 100644 api/shop/goodsRelation/model/index.ts create mode 100644 api/shop/goodsRule/index.ts create mode 100644 api/shop/goodsRule/model/index.ts create mode 100644 api/shop/goodsSku/index.ts create mode 100644 api/shop/goodsSku/model/index.ts create mode 100644 api/shop/goodsSpec/index.ts create mode 100644 api/shop/goodsSpec/model/index.ts create mode 100644 api/shop/goodsSpecRel/index.ts create mode 100644 api/shop/goodsSpecRel/model/index.ts create mode 100644 api/shop/order/index.ts create mode 100644 api/shop/order/model/index.ts create mode 100644 api/shop/rechargeOrder/index.ts create mode 100644 api/shop/rechargeOrder/model/index.ts create mode 100644 api/shop/shopCart/index.ts create mode 100644 api/shop/shopCart/model/index.ts create mode 100644 api/shop/shopMerchant/index.ts create mode 100644 api/shop/shopMerchant/model/index.ts create mode 100644 api/shop/shopMerchantAccount/index.ts create mode 100644 api/shop/shopMerchantAccount/model/index.ts create mode 100644 api/shop/shopMerchantApply/index.ts create mode 100644 api/shop/shopMerchantApply/model/index.ts create mode 100644 api/shop/shopMerchantCount/index.ts create mode 100644 api/shop/shopMerchantCount/model/index.ts create mode 100644 api/shop/shopMerchantType/index.ts create mode 100644 api/shop/shopMerchantType/model/index.ts create mode 100644 api/shop/shopOrderInfo/index.ts create mode 100644 api/shop/shopOrderInfo/model/index.ts create mode 100644 api/shop/spec/index.ts create mode 100644 api/shop/spec/model/index.ts create mode 100644 api/shop/specValue/index.ts create mode 100644 api/shop/specValue/model/index.ts create mode 100644 api/shop/userAddress/index.ts create mode 100644 api/shop/userAddress/model/index.ts create mode 100644 api/shop/users/index.ts create mode 100644 api/shop/users/model/index.ts create mode 100644 api/shop/wechatDeposit/index.ts create mode 100644 api/shop/wechatDeposit/model/index.ts create mode 100644 api/system/access-key/index.ts create mode 100644 api/system/access-key/model/index.ts create mode 100644 api/system/appstore/index.ts create mode 100644 api/system/appstore/model/index.ts create mode 100644 api/system/cache/index.ts create mode 100644 api/system/cache/model/index.ts create mode 100644 api/system/chat/index.ts create mode 100644 api/system/chat/model/index.ts create mode 100644 api/system/chatConversation/index.ts create mode 100644 api/system/chatConversation/model/index.ts create mode 100644 api/system/chatMessage/index.ts create mode 100644 api/system/chatMessage/model/index.ts create mode 100644 api/system/company/index.ts create mode 100644 api/system/company/model/index.ts create mode 100644 api/system/companyComment/index.ts create mode 100644 api/system/companyComment/model/index.ts create mode 100644 api/system/companyContent/index.ts create mode 100644 api/system/companyContent/model/index.ts create mode 100644 api/system/companyGit/index.ts create mode 100644 api/system/companyGit/model/index.ts create mode 100644 api/system/companyParameter/index.ts create mode 100644 api/system/companyParameter/model/index.ts create mode 100644 api/system/companyUrl/index.ts create mode 100644 api/system/companyUrl/model/index.ts create mode 100644 api/system/dict-data/index.ts create mode 100644 api/system/dict-data/model/index.ts create mode 100644 api/system/dict/index.ts create mode 100644 api/system/dict/model/index.ts create mode 100644 api/system/dictionary-data/index.ts create mode 100644 api/system/dictionary-data/model/index.ts create mode 100644 api/system/dictionary/index.ts create mode 100644 api/system/dictionary/model/index.ts create mode 100644 api/system/environment/index.ts create mode 100644 api/system/environment/model/index.ts create mode 100644 api/system/file/index.ts create mode 100644 api/system/file/model/index.ts create mode 100644 api/system/login-record/index.ts create mode 100644 api/system/login-record/model/index.ts create mode 100644 api/system/menu/index.ts create mode 100644 api/system/menu/model/index.ts create mode 100644 api/system/modules/index.ts create mode 100644 api/system/modules/model/index.ts create mode 100644 api/system/operation-record/index.ts create mode 100644 api/system/operation-record/model/index.ts create mode 100644 api/system/order/index.ts create mode 100644 api/system/order/model/index.ts create mode 100644 api/system/orderGoods/index.ts create mode 100644 api/system/orderGoods/model/index.ts create mode 100644 api/system/organization/index.ts create mode 100644 api/system/organization/model/index.ts create mode 100644 api/system/parameter/index.ts create mode 100644 api/system/parameter/model/index.ts create mode 100644 api/system/payment/index.ts create mode 100644 api/system/payment/model/index.ts create mode 100644 api/system/plug/index.ts create mode 100644 api/system/plug/model/index.ts create mode 100644 api/system/role/index.ts create mode 100644 api/system/role/model/index.ts create mode 100644 api/system/setting/index.ts create mode 100644 api/system/setting/model/index.ts create mode 100644 api/system/tenant/index.ts create mode 100644 api/system/tenant/model/index.ts create mode 100644 api/system/url/index.ts create mode 100644 api/system/url/model/index.ts create mode 100644 api/system/user-collection/index.ts create mode 100644 api/system/user-collection/model/index.ts create mode 100644 api/system/user-file/index.ts create mode 100644 api/system/user-file/model/index.ts create mode 100644 api/system/user-group/index.ts create mode 100644 api/system/user-group/model/index.ts create mode 100644 api/system/user/index.ts create mode 100644 api/system/user/model/count.ts create mode 100644 api/system/user/model/index.ts create mode 100644 api/system/version/index.ts create mode 100644 api/system/version/model/index.ts create mode 100644 api/system/website/field/index.ts create mode 100644 api/system/website/field/model/index.ts create mode 100644 api/system/website/index.ts create mode 100644 api/system/website/model/index.ts create mode 100644 api/system/white-domain/index.ts create mode 100644 api/system/white-domain/model/index.ts create mode 100644 assets/css/main.css create mode 100644 assets/images/icon_1.png create mode 100644 assets/images/icon_12.png create mode 100644 assets/images/icon_2.png create mode 100644 assets/images/icon_26.png create mode 100644 assets/images/icon_30.png create mode 100644 assets/images/jlt.png create mode 100644 assets/images/toux.png create mode 100644 assets/json/china-provinces.geo.json create mode 100644 assets/json/industry-data.json create mode 100644 assets/json/regions-data.json create mode 100644 assets/logo.png create mode 100644 assets/logo.svg create mode 100644 assets/scss/var.scss create mode 100644 assets/svg/O1CN01yz6fEl1MwaRtkJyvf_!!6000000001499-55-tps-70-70 (1).svg create mode 100644 assets/svg/github-mark-white.svg create mode 100644 assets/svg/github-mark.svg create mode 100644 assets/svg/search.svg create mode 100644 assets/svg/websoft-mark-white.svg create mode 100644 components/AppFooter.vue create mode 100644 components/AppHeader.vue create mode 100644 components/Banner.vue create mode 100644 components/Breadcrumb.vue create mode 100644 components/CardList.vue create mode 100644 components/CompanyList.vue create mode 100644 components/PageBanner.vue create mode 100644 components/PageContainer.vue create mode 100644 components/Passport.vue create mode 100644 components/ProductList.vue create mode 100644 components/ProductShopInfo.vue create mode 100644 components/UnderMaintenance.vue create mode 100644 components/Upload.vue create mode 100644 components/UserCard.vue create mode 100644 composables/configState.ts create mode 100644 composables/useClientRequest.ts create mode 100644 composables/useServerRequest.ts create mode 100644 config/index.ts create mode 100644 layouts/default.vue create mode 100644 pages/[custom].vue create mode 100644 pages/article/[categoryId].vue create mode 100644 pages/article/components/CardList.vue create mode 100644 pages/ask/[userId].vue create mode 100644 pages/ask/components/CardList.vue create mode 100644 pages/ask/index.vue create mode 100644 pages/case/components/CardList.vue create mode 100644 pages/case/components/PageBanner.vue create mode 100644 pages/case/index.vue create mode 100644 pages/category/components/CardList.vue create mode 100644 pages/category/index.vue create mode 100644 pages/components/ArticleList.vue create mode 100644 pages/components/Banner.vue create mode 100644 pages/components/CardList.vue create mode 100644 pages/components/Flash.vue create mode 100644 pages/components/PlugList.vue create mode 100644 pages/components/ProductList.vue create mode 100644 pages/detail/components/LikeArticle.vue create mode 100644 pages/detail/components/PageBanner.vue create mode 100644 pages/detail/index.vue create mode 100644 pages/developer/components/CardList.vue create mode 100644 pages/developer/index.vue create mode 100644 pages/developer/join-in.vue create mode 100644 pages/docs/components/CardList.vue create mode 100644 pages/docs/index.vue create mode 100644 pages/down/components/CardList.vue create mode 100644 pages/down/index.vue create mode 100644 pages/index.vue create mode 100644 pages/item/components/Comments.vue create mode 100644 pages/item/components/PageBanner.vue create mode 100644 pages/item/index.vue create mode 100644 pages/manage/cms/index.vue create mode 100644 pages/manage/index.vue create mode 100644 pages/manage/shop/index.vue create mode 100644 pages/market/components/CardList.vue create mode 100644 pages/market/index.vue create mode 100644 pages/merchant/index.vue create mode 100644 pages/page/index.vue create mode 100644 pages/passport/components/Auth.vue create mode 100644 pages/passport/login.vue create mode 100644 pages/passport/register.vue create mode 100644 pages/product/checkout/components/PageBanner.vue create mode 100644 pages/product/checkout/index.vue create mode 100644 pages/product/components/CardList.vue create mode 100644 pages/product/create/components/PageBanner.vue create mode 100644 pages/product/create/index.vue create mode 100644 pages/product/create/product.vue create mode 100644 pages/product/createWebsite/index.vue create mode 100644 pages/product/createWebsite/index2.vue create mode 100644 pages/product/detail/[id].vue create mode 100644 pages/product/index.vue create mode 100644 pages/search/index.vue create mode 100644 pages/templates/components/CardList.vue create mode 100644 pages/templates/components/PageBanner.vue create mode 100644 pages/templates/index.vue create mode 100644 pages/user/auth.vue create mode 100644 pages/user/components/Auth.vue create mode 100644 pages/user/components/Base.vue create mode 100644 pages/user/components/Order.vue create mode 100644 pages/user/components/Password.vue create mode 100644 pages/user/components/UserMenu.vue create mode 100644 pages/user/index.vue create mode 100644 pages/user/logout.vue create mode 100644 pages/user/order.vue create mode 100644 pages/user/password.vue create mode 100644 plugins/element-ui.js create mode 100644 public/favicon.ico create mode 100644 public/logo.png create mode 100644 public/robots.txt create mode 100644 types/global.d.ts create mode 100644 utils/common.ts create mode 100644 utils/domain.ts create mode 100644 utils/loadScript.ts create mode 100644 utils/request.ts create mode 100644 utils/tool.ts create mode 100644 utils/use-form-data.ts diff --git a/api/cms/ad/index.ts b/api/cms/ad/index.ts new file mode 100644 index 0000000..6139cd4 --- /dev/null +++ b/api/cms/ad/index.ts @@ -0,0 +1,140 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Ad, AdParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询广告位 + */ +export async function pageAd(params: AdParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/ad/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询广告位列表 + */ +export async function listAd(params?: AdParam) { + const res = await request.get>(MODULES_API_URL + '/cms/ad', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加广告位 + */ +export async function addAd(data: Ad) { + const res = await request.post>( + MODULES_API_URL + '/cms/ad', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改广告位 + */ +export async function updateAd(data: Ad) { + const res = await request.put>( + MODULES_API_URL + '/cms/ad', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除广告位 + */ +export async function removeAd(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/ad/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除广告位 + */ +export async function removeBatchAd(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/ad/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateAdStatus(adId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/ad/status', + { + adId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询广告位 + */ +export async function getAd(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/ad/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/ad/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/ad/model/index.ts b/api/cms/ad/model/index.ts new file mode 100644 index 0000000..209df98 --- /dev/null +++ b/api/cms/ad/model/index.ts @@ -0,0 +1,42 @@ +import type { PageParam } from '@/api'; + +/** + * 广告位 + */ +export interface Ad { + adId?: number; + name?: string; + adType?: string; + type?: string; + width?: string; + height?: string; + path?: string; + images?: string; + userId?: number; + sortNumber?: number; + comments?: string; + status?: number; + createTime?: string; + updateTime?: string; +} + +/** + * 图片列表 + */ +export interface AdItem { + uid?: number; + url?: string; + path?: string; + status?: string; +} + +/** + * 广告位搜索条件 + */ +export interface AdParam extends PageParam { + adId?: string; + name?: number; + type?: number; + adType?: string; + userId?: number; +} diff --git a/api/cms/article/index.ts b/api/cms/article/index.ts new file mode 100644 index 0000000..d21582d --- /dev/null +++ b/api/cms/article/index.ts @@ -0,0 +1,143 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Article, ArticleParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询文章 + */ +export async function pageArticle(params: ArticleParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/article/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询文章列表 + */ +export async function listArticle(params?: ArticleParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/article', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加文章 + */ +export async function addArticle(data: Article) { + const res = await request.post>( + MODULES_API_URL + '/cms/article', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改文章 + */ +export async function updateArticle(data: Article) { + const res = await request.put>( + MODULES_API_URL + '/cms/article', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除文章 + */ +export async function removeArticle(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/article/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除文章 + */ +export async function removeBatchArticle(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/article/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateArticleStatus(articleId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/article/status', + { + articleId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询文章 + */ +export async function getArticle(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/article/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/article/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/article/model/index.ts b/api/cms/article/model/index.ts new file mode 100644 index 0000000..8f3b197 --- /dev/null +++ b/api/cms/article/model/index.ts @@ -0,0 +1,98 @@ +import type { PageParam } from '@/api'; + +/** + * 文章 + */ +export interface Article { + // 文章id + articleId?: number; + // 文章标题 + title?: string; + // 分类类型 + type?: number; + // 展现方式 + showType?: any; + // 文章类型 + categoryId?: number; + // 文章分类 + categoryName?: string; + // 父级分类 + parentId?: number; + // 父级分类名称 + parentName?: string; + // 父级分类路径 + parentPath?: string; + // 封面图 + image?: string; + // 附件 + files?: string; + // 附件 + fileList?: string[]; + // 缩列图 + thumbnail?: string; + // 视频地址 + video?: string; + // 上传的文件类型 + accept?: string; + // 来源 + source?: string; + // 文章内容 + content?: string; + // 虚拟阅读量 + virtualViews?: number; + // 实际阅读量 + actualViews?: number; + // 浏览权限 + permission?: number; + // 访问密码 + password?: string; + // 访问密码(客户端传) + password2?: string; + // 用户ID + userId?: number; + // 用户昵称 + nickname?: string; + // 账号 + username?: string; + // 用户头像 + avatar?: string; + // 作者 + author?: string; + // 所属门店ID + shopId?: number; + // + likes?: number; + // 排序 + sortNumber?: any; + // 备注 + comments?: any; + // 状态 + status?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; + // 租户ID + tenantId?: number; + // 租户名称 + tenantName?: string; + // 租户logo + logo?: string; +} + +/** + * 文章搜索条件 + */ +export interface ArticleParam extends PageParam { + title?: string; + articleId?: number; + categoryId?: number; + status?: string; + sortNumber?: string; + createTime?: string; + username?: string; + nickname?: string; + userId?: number; + // 商户编号 + merchantCode?: string; +} diff --git a/api/cms/category/index.ts b/api/cms/category/index.ts new file mode 100644 index 0000000..e1835ad --- /dev/null +++ b/api/cms/category/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ArticleCategory, ArticleCategoryParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询文章分类 + */ +export async function pageArticleCategory(params: ArticleCategoryParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/article-category/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询文章分类列表 + */ +export async function listArticleCategory(params?: ArticleCategoryParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/article-category', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询文章分类 + */ +export async function getArticleCategory(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/article-category/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加文章分类 + */ +export async function addArticleCategory(data: ArticleCategory) { + const res = await request.post>( + MODULES_API_URL + '/cms/article-category', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改文章分类 + */ +export async function updateArticleCategory(data: ArticleCategory) { + const res = await request.put>( + MODULES_API_URL + '/cms/article-category', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除文章分类 + */ +export async function removeArticleCategory(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/article-category/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除文章分类 + */ +export async function removeBatchArticleCategory(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/article-category/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/article-category/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/category/model/index.ts b/api/cms/category/model/index.ts new file mode 100644 index 0000000..07aceca --- /dev/null +++ b/api/cms/category/model/index.ts @@ -0,0 +1,82 @@ +import type { PageParam } from '@/api'; + +/** + * 文章分类 + */ +export interface ArticleCategory { + // 文章分类id + categoryId?: number; + // 文章分类名称 + categoryName?: string; + // 分类类型 0列表 1页面 2链接 + type?: number; + // 文章分类 + title?: string; + // 文章分类图片 + image?: string; + // 路由/链接 + path?: string; + // 组件路径 + component?: string; + // 页面ID + pageId?: number; + // 页面名称 + pageName?: string; + // 上级分类 + parentId?: number; + // 上级分类名称 + parentName?: string; + // 封面图 + avatar?: string; + // 用户ID + userId?: string; + // 所属门店ID + shopId?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 是否显示在首页 + showIndex?: number; + // 是否推荐 + recommend?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; + key?: number; + value?: number; + // 子菜单 + children?: ArticleCategory[]; + tempPath?: string; + disabled?: boolean; + tenantId?: number; +} + +/** + * 整理分类用于网站导航栏 + */ +export interface ArrangeCategory { + categoryId?: number; + type?: number; + title?: string; + parentId?: number; + avatar?: string; + path?: string; + component?: string; + pageId?: number; + sortNumber?: number; + comments?: string; + status?: number; + children?: ArrangeCategory[]; +} + +/** + * 文章分类搜索条件 + */ +export interface ArticleCategoryParam extends PageParam { + title?: string; + categoryId?: number; +} diff --git a/api/cms/cmsArticleComment/index.ts b/api/cms/cmsArticleComment/index.ts new file mode 100644 index 0000000..3d62d81 --- /dev/null +++ b/api/cms/cmsArticleComment/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CmsArticleComment, CmsArticleCommentParam } from './model'; +import { MODULES_API_URL } from '@/config/index'; + +/** + * 分页查询文章评论表 + */ +export async function pageCmsArticleComment(params: CmsArticleCommentParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/cms-article-comment/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询文章评论表列表 + */ +export async function listCmsArticleComment(params?: CmsArticleCommentParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-article-comment', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加文章评论表 + */ +export async function addCmsArticleComment(data: CmsArticleComment) { + const res = await request.post>( + MODULES_API_URL + '/cms/cms-article-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改文章评论表 + */ +export async function updateCmsArticleComment(data: CmsArticleComment) { + const res = await request.put>( + MODULES_API_URL + '/cms/cms-article-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除文章评论表 + */ +export async function removeCmsArticleComment(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-article-comment/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除文章评论表 + */ +export async function removeBatchCmsArticleComment(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-article-comment/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询文章评论表 + */ +export async function getCmsArticleComment(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-article-comment/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsArticleComment/model/index.ts b/api/cms/cmsArticleComment/model/index.ts new file mode 100644 index 0000000..2490228 --- /dev/null +++ b/api/cms/cmsArticleComment/model/index.ts @@ -0,0 +1,47 @@ +import type { PageParam } from '@/api'; + +/** + * 文章评论表 + */ +export interface CmsArticleComment { + // 评价ID + commentId?: number; + // 文章ID + articleId?: number; + // 评分 (10好评 20中评 30差评) + score?: number; + // 评价内容 + content?: string; + // 是否为图片评价 + isPicture?: number; + // 评论者ID + userId?: number; + // 被评价者ID + toUserId?: number; + // 回复的评论ID + replyCommentId?: number; + // 回复者ID + replyUserId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0未读, 1已读 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 文章评论表搜索条件 + */ +export interface CmsArticleCommentParam extends PageParam { + commentId?: number; + keywords?: string; +} diff --git a/api/cms/cmsProduct/index.ts b/api/cms/cmsProduct/index.ts new file mode 100644 index 0000000..bfcfb7b --- /dev/null +++ b/api/cms/cmsProduct/index.ts @@ -0,0 +1,117 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CmsProduct, CmsProductParam } from './model'; +import { SERVER_API_URL } from '~/config'; +import type { ArticleParam } from "@/api/cms/article/model"; + +/** + * 分页查询产品 + */ +export async function pageCmsProduct(params: CmsProductParam) { + const res = await request.get>>( + SERVER_API_URL + '/cms/cms-product/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品列表 + */ +export async function listCmsProduct(params?: CmsProductParam) { + const res = await request.get>( + SERVER_API_URL + '/cms/cms-product', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品 + */ +export async function addCmsProduct(data: CmsProduct) { + const res = await request.post>( + SERVER_API_URL + '/cms/cms-product', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品 + */ +export async function updateCmsProduct(data: CmsProduct) { + const res = await request.put>( + SERVER_API_URL + '/cms/cms-product', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品 + */ +export async function removeCmsProduct(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/cms/cms-product/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品 + */ +export async function removeBatchCmsProduct(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/cms/cms-product/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品 + */ +export async function getCmsProduct(id: number) { + const res = await request.get>( + SERVER_API_URL + '/cms/cms-product/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getCount(params: ArticleParam) { + const res = await request.get(SERVER_API_URL + '/cms/cms-product/data', { + params + }); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsProduct/model/index.ts b/api/cms/cmsProduct/model/index.ts new file mode 100644 index 0000000..8a603fa --- /dev/null +++ b/api/cms/cmsProduct/model/index.ts @@ -0,0 +1,105 @@ +import type {PageParam} from '@/api'; +import type {CmsProductParameter} from "~/api/cms/cmsProductParameter/model"; +import type {CmsProductUrl} from "~/api/cms/cmsProductUrl/model"; + +/** + * 产品 + */ +export interface CmsProduct { + // 自增ID + productId?: number; + // 类型 0软件产品 1实物商品 2虚拟商品 + type?: number; + // 产品编码 + code?: string; + // 产品标题 + title?: string; + // 封面图 + image?: string; + // 产品详情 + content?: string; + // 父级分类ID + parentId?: number; + // 产品分类ID + categoryId?: number; + // 产品规格 0单规格 1多规格 + specs?: number; + // 货架 + position?: string; + // 单位名称 (个) + unitName?: string; + // 进货价格 + price?: number; + // 销售价格 + salePrice?: number; + // 库存计算方式(10下单减库存 20付款减库存) + deductStockType?: number; + // 轮播图 + files?: any; + // 销量 + sales?: number; + // 库存 + stock?: number; + // 安装次数 + install?: number; + // 消费赚取积分 + gainIntegral?: string; + // 计费方式 + durationMethod?: number; + // 推荐 + recommend?: number; + // 商户ID + merchantId?: number; + merchantName: undefined, + merchantAvatar: undefined, + merchantComments: undefined, + // 状态(0:未上架,1:上架) + isShow?: string; + // 状态, 0上架 1待上架 2待审核 3审核不通过 + status?: number; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 用户ID + userId?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; + // 父级分类名称 + parentName?: string; + // 父级分类路径 + parentPath?: string; + // 分类名称 + categoryName?: string; + // 评分 + rate?: string; + // 是否已购买 + isBuy?: boolean; + // 是否已安装插件 + installed?: boolean; + // 产品参数 + parameters?: CmsProductParameter[]; + // 产品链接 + links?: CmsProductUrl[]; + // 插件入口 + path?: string; + // 标签 + tag?: string; + // 菜单ID + menuId?: number; +} + +/** + * 产品搜索条件 + */ +export interface CmsProductParam extends PageParam { + productId?: number; + status?: number; + keywords?: string; +} diff --git a/api/cms/cmsProductComment/index.ts b/api/cms/cmsProductComment/index.ts new file mode 100644 index 0000000..809b805 --- /dev/null +++ b/api/cms/cmsProductComment/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type {ApiResult, PageResult} from '@/api'; +import type {CmsProductComment, CmsProductCommentParam} from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询产品评论 + */ +export async function pageCmsProductComment(params: CmsProductCommentParam) { + const res = await request.get>>( + SERVER_API_URL + '/cms/cms-product-comment/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品评论列表 + */ +export async function listCmsProductComment(params?: CmsProductCommentParam) { + const res = await request.get>( + SERVER_API_URL + '/cms/cms-product-comment', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品评论 + */ +export async function addCmsProductComment(data: CmsProductComment) { + const res = await request.post>( + SERVER_API_URL + '/cms/cms-product-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品评论 + */ +export async function updateCmsProductComment(data: CmsProductComment) { + const res = await request.put>( + SERVER_API_URL + '/cms/cms-product-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品评论 + */ +export async function removeCmsProductComment(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/cms/cms-product-comment/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品评论 + */ +export async function removeBatchCmsProductComment(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/cms/cms-product-comment/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品评论 + */ +export async function getCmsProductComment(id: number) { + const res = await request.get>( + SERVER_API_URL + '/cms/cms-product-comment/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsProductComment/model/index.ts b/api/cms/cmsProductComment/model/index.ts new file mode 100644 index 0000000..9e5cd18 --- /dev/null +++ b/api/cms/cmsProductComment/model/index.ts @@ -0,0 +1,41 @@ +import type { PageParam } from '@/api'; + +/** + * 产品评论 + */ +export interface CmsProductComment { + // ID + id?: number; + // 产品ID + productId?: number; + // 用户ID + userId?: number; + // 用户头像 + avatar?: string; + // 用户昵称 + nickname?: string; + image?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 评论内容 + comments?: string; + // 评分 + rate?: number; + // 状态 + status?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 子列表 + children?: CmsProductComment[]; +} + +/** + * 产品评论搜索条件 + */ +export interface CmsProductCommentParam extends PageParam { + id?: number; + userId?: number; + keywords?: string; +} diff --git a/api/cms/cmsProductParameter/index.ts b/api/cms/cmsProductParameter/index.ts new file mode 100644 index 0000000..633b037 --- /dev/null +++ b/api/cms/cmsProductParameter/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type {ApiResult, PageResult} from '@/api'; +import type {CmsProductParameter, CmsProductParameterParam} from './model'; +import {SERVER_API_URL} from '@/config'; + +/** + * 分页查询产品参数 + */ +export async function pageCmsProductParameter(params: CmsProductParameterParam) { + const res = await request.get>>( + SERVER_API_URL + '/cms/cms-product-parameter/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品参数列表 + */ +export async function listCmsProductParameter(params?: CmsProductParameterParam) { + const res = await request.get>( + SERVER_API_URL + '/cms/cms-product-parameter', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品参数 + */ +export async function addCmsProductParameter(data: CmsProductParameter) { + const res = await request.post>( + SERVER_API_URL + '/cms/cms-product-parameter', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品参数 + */ +export async function updateCmsProductParameter(data: CmsProductParameter) { + const res = await request.put>( + SERVER_API_URL + '/cms/cms-product-parameter', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品参数 + */ +export async function removeCmsProductParameter(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/cms/cms-product-parameter/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品参数 + */ +export async function removeBatchCmsProductParameter(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/cms/cms-product-parameter/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品参数 + */ +export async function getCmsProductParameter(id: number) { + const res = await request.get>( + SERVER_API_URL + '/cms/cms-product-parameter/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsProductParameter/model/index.ts b/api/cms/cmsProductParameter/model/index.ts new file mode 100644 index 0000000..6d7a761 --- /dev/null +++ b/api/cms/cmsProductParameter/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 产品参数 + */ +export interface CmsProductParameter { + // 自增ID + id?: number; + // 产品ID + productId?: number; + // 参数名称 + name?: string; + // 参数内容 + value?: string; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 产品参数搜索条件 + */ +export interface CmsProductParameterParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/cms/cmsProductSpec/index.ts b/api/cms/cmsProductSpec/index.ts new file mode 100644 index 0000000..d4869db --- /dev/null +++ b/api/cms/cmsProductSpec/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CmsProductSpec, CmsProductSpecParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询规格 + */ +export async function pageCmsProductSpec(params: CmsProductSpecParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/cms-product-spec/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询规格列表 + */ +export async function listCmsProductSpec(params?: CmsProductSpecParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-product-spec', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加规格 + */ +export async function addCmsProductSpec(data: CmsProductSpec) { + const res = await request.post>( + MODULES_API_URL + '/cms/cms-product-spec', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改规格 + */ +export async function updateCmsProductSpec(data: CmsProductSpec) { + const res = await request.put>( + MODULES_API_URL + '/cms/cms-product-spec', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除规格 + */ +export async function removeCmsProductSpec(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-product-spec/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除规格 + */ +export async function removeBatchCmsProductSpec(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-product-spec/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询规格 + */ +export async function getCmsProductSpec(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-product-spec/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsProductSpec/model/index.ts b/api/cms/cmsProductSpec/model/index.ts new file mode 100644 index 0000000..9b11d6b --- /dev/null +++ b/api/cms/cmsProductSpec/model/index.ts @@ -0,0 +1,35 @@ +import type { PageParam } from '@/api'; + +/** + * 规格 + */ +export interface CmsProductSpec { + // 规格ID + specId?: number; + // 规格名称 + specName?: string; + // 规格值 + specValue?: string; + // 创建用户 + userId?: number; + // 更新者 + updater?: number; + // 备注 + comments?: string; + // 状态, 0正常, 1待修,2异常已修,3异常未修 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 规格搜索条件 + */ +export interface CmsProductSpecParam extends PageParam { + specId?: number; + keywords?: string; +} diff --git a/api/cms/cmsProductSpecValue/index.ts b/api/cms/cmsProductSpecValue/index.ts new file mode 100644 index 0000000..b683f8b --- /dev/null +++ b/api/cms/cmsProductSpecValue/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CmsProductSpecValue, CmsProductSpecValueParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询规格值 + */ +export async function pageCmsProductSpecValue(params: CmsProductSpecValueParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/cms-product-spec-value/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询规格值列表 + */ +export async function listCmsProductSpecValue(params?: CmsProductSpecValueParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-product-spec-value', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加规格值 + */ +export async function addCmsProductSpecValue(data: CmsProductSpecValue) { + const res = await request.post>( + MODULES_API_URL + '/cms/cms-product-spec-value', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改规格值 + */ +export async function updateCmsProductSpecValue(data: CmsProductSpecValue) { + const res = await request.put>( + MODULES_API_URL + '/cms/cms-product-spec-value', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除规格值 + */ +export async function removeCmsProductSpecValue(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-product-spec-value/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除规格值 + */ +export async function removeBatchCmsProductSpecValue(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-product-spec-value/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询规格值 + */ +export async function getCmsProductSpecValue(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-product-spec-value/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsProductSpecValue/model/index.ts b/api/cms/cmsProductSpecValue/model/index.ts new file mode 100644 index 0000000..fbd6076 --- /dev/null +++ b/api/cms/cmsProductSpecValue/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 规格值 + */ +export interface CmsProductSpecValue { + // 规格值ID + specValueId?: number; + // 规格组ID + specId?: number; + // 规格值 + specValue?: string; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 规格值搜索条件 + */ +export interface CmsProductSpecValueParam extends PageParam { + specValueId?: number; + keywords?: string; +} diff --git a/api/cms/cmsProductUrl/index.ts b/api/cms/cmsProductUrl/index.ts new file mode 100644 index 0000000..3ff0730 --- /dev/null +++ b/api/cms/cmsProductUrl/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CmsProductUrl, CmsProductUrlParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询域名 + */ +export async function pageCmsProductUrl(params: CmsProductUrlParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/cms-product-url/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询域名列表 + */ +export async function listCmsProductUrl(params?: CmsProductUrlParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-product-url', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加域名 + */ +export async function addCmsProductUrl(data: CmsProductUrl) { + const res = await request.post>( + MODULES_API_URL + '/cms/cms-product-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改域名 + */ +export async function updateCmsProductUrl(data: CmsProductUrl) { + const res = await request.put>( + MODULES_API_URL + '/cms/cms-product-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除域名 + */ +export async function removeCmsProductUrl(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-product-url/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除域名 + */ +export async function removeBatchCmsProductUrl(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/cms-product-url/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询域名 + */ +export async function getCmsProductUrl(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/cms-product-url/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/cmsProductUrl/model/index.ts b/api/cms/cmsProductUrl/model/index.ts new file mode 100644 index 0000000..af842a7 --- /dev/null +++ b/api/cms/cmsProductUrl/model/index.ts @@ -0,0 +1,41 @@ +import type { PageParam } from '@/api'; + +/** + * 域名 + */ +export interface CmsProductUrl { + // 自增ID + id?: number; + // 产品ID + productId?: number; + // 域名类型 + type?: string; + // 域名 + domain?: string; + // 二维码 + qrcode?: string; + // 账号 + account?: string; + // 密码 + password?: string; + // 商户ID + merchantId?: number; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 域名搜索条件 + */ +export interface CmsProductUrlParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/cms/design/index.ts b/api/cms/design/index.ts new file mode 100644 index 0000000..910a4f8 --- /dev/null +++ b/api/cms/design/index.ts @@ -0,0 +1,143 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Design, DesignParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询页面设计 + */ +export async function pageDesign(params: DesignParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/design/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询页面设计列表 + */ +export async function listDesign(params?: DesignParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/design', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加页面设计 + */ +export async function addDesign(data: Design) { + const res = await request.post>( + MODULES_API_URL + '/cms/design', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改页面设计 + */ +export async function updateDesign(data: Design) { + const res = await request.put>( + MODULES_API_URL + '/cms/design', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除页面设计 + */ +export async function removeDesign(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/design/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除页面设计 + */ +export async function removeBatchDesign(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/design/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateDesignStatus(designId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/design/status', + { + designId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询页面设计 + */ +export async function getDesign(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/design/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/design/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/design/model/index.ts b/api/cms/design/model/index.ts new file mode 100644 index 0000000..a1f8674 --- /dev/null +++ b/api/cms/design/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 页面 + */ +export interface Design { + pageId?: number; + name?: string; + keywords?: string; + description?: string; + path?: string; + component?: string; + photo?: string; + content?: string; + // 类型 + type?: string; + // 宽 + width?: string; + // 高 + height?: string; + // 页面样式 + style?: string; + // 附件 + images?: string; + // 用户ID + userId?: number; + // 设为首页 + home?: number; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; + // 页面布局 + layout?: string; + backgroundColor?: string; + demoUrl?: string; + buyUrl?: string; + docUrl?: string; +} + +/** + * 页面搜索条件 + */ +export interface DesignParam extends PageParam { + pageId?: string; + name?: number; + type?: number; + userId?: number; +} diff --git a/api/cms/docs-book/index.ts b/api/cms/docs-book/index.ts new file mode 100644 index 0000000..b3e4937 --- /dev/null +++ b/api/cms/docs-book/index.ts @@ -0,0 +1,143 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DocsBook, DocsBookParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询书籍 + */ +export async function pageDocsBook(params: DocsBookParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/docs-book/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询书籍列表 + */ +export async function listDocsBook(params?: DocsBookParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs-book', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加书籍 + */ +export async function addDocsBook(data: DocsBook) { + const res = await request.post>( + MODULES_API_URL + '/cms/docs-book', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改书籍 + */ +export async function updateDocsBook(data: DocsBook) { + const res = await request.put>( + MODULES_API_URL + '/cms/docs-book', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除书籍 + */ +export async function removeDocsBook(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/docs-book/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除书籍 + */ +export async function removeBatchDocsBook(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/docs-book/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateDocsBookStatus(docsId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/docs-book/status', + { + docsId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询书籍 + */ +export async function getDocsBook(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs-book/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs-book/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/docs-book/model/index.ts b/api/cms/docs-book/model/index.ts new file mode 100644 index 0000000..ddfeff0 --- /dev/null +++ b/api/cms/docs-book/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 书籍内容 + */ +export interface DocsBook { + // 自增ID + bookId?: number; + // 名称 + name?: string; + // 书籍标识 + code?: string; + // 封面图 + photo?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; +} + +/** + * 书籍搜索条件 + */ +export interface DocsBookParam extends PageParam { + bookId?: number; + docsId?: number; +} diff --git a/api/cms/docs-content/index.ts b/api/cms/docs-content/index.ts new file mode 100644 index 0000000..f263076 --- /dev/null +++ b/api/cms/docs-content/index.ts @@ -0,0 +1,146 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DocsContent, DocsContentParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询文档 + */ +export async function pageDocsContent(params: DocsContentParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/docs-content/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询文档列表 + */ +export async function listDocsContent(params?: DocsContentParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs-content', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加文档 + */ +export async function addDocsContent(data: DocsContent) { + const res = await request.post>( + MODULES_API_URL + '/cms/docs-content', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改文档 + */ +export async function updateDocsContent(data: DocsContent) { + const res = await request.put>( + MODULES_API_URL + '/cms/docs-content', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除文档 + */ +export async function removeDocsContent(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/docs-content/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除文档 + */ +export async function removeBatchDocsContent(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/docs-content/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateDocsContentStatus( + docsId?: number, + status?: number +) { + const res = await request.put>( + MODULES_API_URL + '/cms/docs-content/status', + { + docsId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询文档 + */ +export async function getDocsContent(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs-content/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs-content/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/docs-content/model/index.ts b/api/cms/docs-content/model/index.ts new file mode 100644 index 0000000..418108b --- /dev/null +++ b/api/cms/docs-content/model/index.ts @@ -0,0 +1,36 @@ +import type { PageParam } from '@/api'; + +/** + * 文档内容 + */ +export interface DocsContent { + // 自增ID + id?: number; + // 文档内容id + docsId?: number; + // 文档内容 + content?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; + // + key?: number; + // + value?: number; +} + +/** + * 文档内容搜索条件 + */ +export interface DocsContentParam extends PageParam { + id?: number; + docsId?: number; + content?: string; +} diff --git a/api/cms/docs/index.ts b/api/cms/docs/index.ts new file mode 100644 index 0000000..6036e90 --- /dev/null +++ b/api/cms/docs/index.ts @@ -0,0 +1,143 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Docs, DocsParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询文档 + */ +export async function pageDocs(params: DocsParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/docs/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询文档列表 + */ +export async function listDocs(params?: DocsParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加文档 + */ +export async function addDocs(data: Docs) { + const res = await request.post>( + MODULES_API_URL + '/cms/docs', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改文档 + */ +export async function updateDocs(data: Docs) { + const res = await request.put>( + MODULES_API_URL + '/cms/docs', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除文档 + */ +export async function removeDocs(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/docs/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除文档 + */ +export async function removeBatchDocs(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/docs/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateDocsStatus(docsId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/docs/status', + { + docsId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询文档 + */ +export async function getDocs(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/docs/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/docs/model/index.ts b/api/cms/docs/model/index.ts new file mode 100644 index 0000000..b1c1e7b --- /dev/null +++ b/api/cms/docs/model/index.ts @@ -0,0 +1,64 @@ +import type { PageParam } from '@/api'; + +/** + * 文档 + */ +export interface Docs { + // 文档id + docsId?: number; + // 书籍ID + bookId?: number; + // 书籍标识 + code?: string; + // 文档标题 + title?: string; + // 上级分类 + parentId?: number; + // 上级分类名称 + parentName?: string; + // 文档内容 + content?: string; + // 虚拟阅读量 + virtualViews?: string; + // 实际阅读量 + actualViews?: string; + // 用户ID + userId?: string; + // 用户昵称 + nickname?: string; + // 账号 + username?: string; + // 用户头像 + userAvatar?: string; + // 所属门店ID + shopId?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; + key?: number; + value?: number; + isUpdate?: boolean; +} + +/** + * 文档搜索条件 + */ +export interface DocsParam extends PageParam { + bookId?: number; + code?: string; + title?: string; + docsId?: number; + categoryId?: string; + status?: string; + sortNumber?: string; + createTime?: string; + username?: string; + nickname?: string; +} diff --git a/api/cms/domain/index.ts b/api/cms/domain/index.ts new file mode 100644 index 0000000..2af1adb --- /dev/null +++ b/api/cms/domain/index.ts @@ -0,0 +1,153 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Domain, DomainParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询网站域名 + */ +export async function pageDomain(params: DomainParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/domain/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询网站域名列表 + */ +export async function listDomain(params?: DomainParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/domain', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加网站域名 + */ +export async function addDomain(data: Domain) { + const res = await request.post>( + MODULES_API_URL + '/cms/domain', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改网站域名 + */ +export async function updateDomain(data: Domain) { + const res = await request.put>( + MODULES_API_URL + '/cms/domain', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除网站域名 + */ +export async function removeDomain(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/domain/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除网站域名 + */ +export async function removeBatchDomain(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/domain/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateDomainStatus(docsId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/domain/status', + { + docsId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询网站域名 + */ +export async function getDomain(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/domain/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/domain/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function resolvable(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/domain/resolvable/' + id + ); + if (res.data.code === 0 && res.data) { + return res.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/domain/model/index.ts b/api/cms/domain/model/index.ts new file mode 100644 index 0000000..4278f6e --- /dev/null +++ b/api/cms/domain/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 网站域名 + */ +export interface Domain { + // 自增ID + id?: number; + // 域名 + domain?: string; + // 主机记录 + hostName?: string; + // 主机记录值 + hostValue?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; + // 租户ID + tenantId?: number; +} + +/** + * 网站域名搜索条件 + */ +export interface DomainParam extends PageParam { + id?: number; + domain?: string; +} diff --git a/api/cms/form-record/index.ts b/api/cms/form-record/index.ts new file mode 100644 index 0000000..2df2910 --- /dev/null +++ b/api/cms/form-record/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { FormRecord, FormRecordParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询表单设计 + */ +export async function pageFormRecord(params: FormRecordParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/form-record/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询表单设计列表 + */ +export async function listFormRecord(params?: FormRecordParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/form-record', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加表单设计 + */ +export async function addFormRecord(data: FormRecord) { + const res = await request.post>( + MODULES_API_URL + '/cms/form-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改表单设计 + */ +export async function updateFormRecord(data: FormRecord) { + const res = await request.put>( + MODULES_API_URL + '/cms/form-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除表单设计 + */ +export async function removeFormRecord(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form-record/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除表单设计 + */ +export async function removeBatchFormRecord(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form-record/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询表单设计 + */ +export async function getFormRecord(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/form-record/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/form-record/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/form-record/model/index.ts b/api/cms/form-record/model/index.ts new file mode 100644 index 0000000..c8aa781 --- /dev/null +++ b/api/cms/form-record/model/index.ts @@ -0,0 +1,28 @@ +import type { PageParam } from '@/api'; + +/** + * 表单数据 + */ +export interface FormRecord { + formRecordId?: number; + formId?: number; + name?: string; + formData?: string; + formObj?: Object; + userId?: number; + sortNumber?: number; + comments?: string; + status?: number; + createTime?: string; + layout?: string; +} + +/** + * 搜索条件 + */ +export interface FormRecordParam extends PageParam { + formRecordId?: string; + formId?: number; + phone?: string; + name?: number; +} diff --git a/api/cms/form/index.ts b/api/cms/form/index.ts new file mode 100644 index 0000000..5f69d24 --- /dev/null +++ b/api/cms/form/index.ts @@ -0,0 +1,143 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Form, FormParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询表单设计 + */ +export async function pageForm(params: FormParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/form/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询表单设计列表 + */ +export async function listForm(params?: FormParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/form', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加表单设计 + */ +export async function addForm(data: Form) { + const res = await request.post>( + MODULES_API_URL + '/cms/form', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改表单设计 + */ +export async function updateForm(data: Form) { + const res = await request.put>( + MODULES_API_URL + '/cms/form', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除表单设计 + */ +export async function removeForm(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除表单设计 + */ +export async function removeBatchForm(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/form/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateFormStatus(formId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/form/status', + { + formId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询表单设计 + */ +export async function getForm(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/form/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/form/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/form/model/index.ts b/api/cms/form/model/index.ts new file mode 100644 index 0000000..e82aaa6 --- /dev/null +++ b/api/cms/form/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 表单设计 + */ +export interface Form { + formId?: number; + name?: string; + photo?: string; + background?: string; + video?: string; + submitNumber?: number; + layout?: string; + userId?: number; + sortNumber?: number; + comments?: string; + status?: number; + createTime?: string; + hidePhoto?: any; + hideBackground?: number; + hideVideo?: number; + opacity?: number; + data?: any[]; + clearCache?: number; +} + +/** + * 搜索条件 + */ +export interface FormParam extends PageParam { + formId?: number; + name?: number; +} diff --git a/api/cms/link/index.ts b/api/cms/link/index.ts new file mode 100644 index 0000000..bf50f6d --- /dev/null +++ b/api/cms/link/index.ts @@ -0,0 +1,113 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Link, LinkParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询链接 + */ +export async function pageLink(params: LinkParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/link/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询链接列表 + */ +export async function listLink(params?: LinkParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/link', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加链接 + */ +export async function addLink(data: Link) { + const res = await request.post>( + MODULES_API_URL + '/oa/link', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改链接 + */ +export async function updateLink(data: Link) { + const res = await request.put>( + MODULES_API_URL + '/oa/link', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除链接 + */ +export async function removeLink(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/link/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除链接 + */ +export async function removeBatchLink(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/link/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/link/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/link/model/index.ts b/api/cms/link/model/index.ts new file mode 100644 index 0000000..7d7f821 --- /dev/null +++ b/api/cms/link/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 链接 + */ +export interface Link { + id?: number; + name?: string; + icon?: string; + url?: string; + linkType?: string; + appId?: number; + userId?: number; + comments?: string; + recommend?: number; + sortNumber?: number; + deleted?: number; + status?: number; + createTime?: number; +} + +/** + * 链接搜索条件 + */ +export interface LinkParam extends PageParam { + id?: number; + linkType?: string; + name?: string; +} diff --git a/api/cms/mp-menu/index.ts b/api/cms/mp-menu/index.ts new file mode 100644 index 0000000..fe8d53e --- /dev/null +++ b/api/cms/mp-menu/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { MpMenu, MpMenuParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询小程序端菜单 + */ +export async function pageMpMenu(params: MpMenuParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/mp-menu/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询小程序端菜单列表 + */ +export async function listMpMenu(params?: MpMenuParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-menu', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加小程序端菜单 + */ +export async function addMpMenu(data: MpMenu) { + const res = await request.post>( + MODULES_API_URL + '/cms/mp-menu', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改小程序端菜单 + */ +export async function updateMpMenu(data: MpMenu) { + const res = await request.put>( + MODULES_API_URL + '/cms/mp-menu', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除小程序端菜单 + */ +export async function removeMpMenu(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-menu/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除小程序端菜单 + */ +export async function removeBatchMpMenu(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-menu/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询小程序端菜单 + */ +export async function getMpMenu(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-menu/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/mp-menu/model/index.ts b/api/cms/mp-menu/model/index.ts new file mode 100644 index 0000000..8d94058 --- /dev/null +++ b/api/cms/mp-menu/model/index.ts @@ -0,0 +1,85 @@ +import type { PageParam } from '@/api'; + +/** + * 小程序端菜单 + */ +export interface MpMenu { + // ID + menuId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 菜单名称 + title?: string; + // 类型 0自定义 1单页内容2外部链接 + type?: number; + // 是否微信小程序菜单 + isMpWeixin?: boolean; + // 菜单路由地址 + path?: string; + // 菜单组件地址, 目录可为空 + component?: string; + // 打开位置 + target?: string; + // 菜单图标 + icon?: string; + // 图标颜色 + color?: string; + // 上传图标 + avatar?: string; + // 所在行 + rows?: number; + // 是否隐藏, 0否, 1是(仅注册路由不显示在左侧菜单) + hide?: number; + // 位置 0不限 1顶部 2底部 + position?: number; + // 菜单侧栏选中的path + active?: string; + // 其它路由元信息 + meta?: string; + // 绑定的页面 + pageId?: number; + // 绑定的文章分类ID + articleCategoryId?: number; + // 绑定的文章ID + articleId?: number; + // 绑定的表单ID + formId?: number; + // 绑定的书籍标识 + bookCode?: string; + // 绑定的商品分类ID + goodsCategoryId?: number; + // 绑定的商品ID + goodsId?: number; + // 用户ID + userId?: number; + // 是否管理人员可见 + adminShow?: number; + // 设为首页 + home?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0正常, 1冻结 + status?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 子菜单 + children?: MpMenu[]; + pageName?: string; + groupName?: string; +} + +/** + * 小程序端菜单搜索条件 + */ +export interface MpMenuParam extends PageParam { + parentId?: number; + menuId?: number; + pageId?: number; + subpackage?: string; + type?: number; + keywords?: string; +} diff --git a/api/cms/mp/index.ts b/api/cms/mp/index.ts new file mode 100644 index 0000000..7f3ba93 --- /dev/null +++ b/api/cms/mp/index.ts @@ -0,0 +1,103 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Mp, MpParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询小程序信息 + */ +export async function pageMp(params: MpParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/mp/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询小程序信息列表 + */ +export async function listMp(params?: MpParam) { + const res = await request.get>(MODULES_API_URL + '/cms/mp', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加小程序信息 + */ +export async function addMp(data: Mp) { + const res = await request.post>( + MODULES_API_URL + '/cms/mp', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改小程序信息 + */ +export async function updateMp(data: Mp) { + const res = await request.put>( + MODULES_API_URL + '/cms/mp', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除小程序信息 + */ +export async function removeMp(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除小程序信息 + */ +export async function removeBatchMp(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询小程序信息 + */ +export async function getMp(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/mp/model/index.ts b/api/cms/mp/model/index.ts new file mode 100644 index 0000000..91e1233 --- /dev/null +++ b/api/cms/mp/model/index.ts @@ -0,0 +1,62 @@ +import type { PageParam } from '@/api'; + +/** + * 小程序信息 + */ +export interface Mp { + // ID + mpId?: number; + // 小程序ID + appId?: string; + // 小程序密钥 + appSecret?: string; + // 是否主账号 + type?: number; + // 小程序名称 + mpName?: string; + // 小程序简称 + shortName?: string; + // 头像 + avatar?: string; + // 小程序码 + mpQrcode?: string; + // 微信认证 + authentication?: number; + // 主体信息 + companyName?: string; + // 小程序备案 + icpNo?: string; + // 登录邮箱 + email?: string; + // 登录密码 + password?: string; + // 原始ID + ghId?: string; + // 入口页面 + mainPath?: string; + // 过期时间 + expirationTime?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 介绍 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 小程序信息搜索条件 + */ +export interface MpParam extends PageParam { + mpId?: number; + type?: number; + keywords?: string; +} diff --git a/api/cms/mpAd/index.ts b/api/cms/mpAd/index.ts new file mode 100644 index 0000000..ab4b468 --- /dev/null +++ b/api/cms/mpAd/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { MpAd, MpAdParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询小程序广告位 + */ +export async function pageMpAd(params: MpAdParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/mp-ad/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询小程序广告位列表 + */ +export async function listMpAd(params?: MpAdParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-ad', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加小程序广告位 + */ +export async function addMpAd(data: MpAd) { + const res = await request.post>( + MODULES_API_URL + '/cms/mp-ad', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改小程序广告位 + */ +export async function updateMpAd(data: MpAd) { + const res = await request.put>( + MODULES_API_URL + '/cms/mp-ad', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除小程序广告位 + */ +export async function removeMpAd(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-ad/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除小程序广告位 + */ +export async function removeBatchMpAd(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-ad/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询小程序广告位 + */ +export async function getMpAd(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-ad/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/mpAd/model/index.ts b/api/cms/mpAd/model/index.ts new file mode 100644 index 0000000..dcf5801 --- /dev/null +++ b/api/cms/mpAd/model/index.ts @@ -0,0 +1,47 @@ +import type { PageParam } from '@/api'; + +/** + * 小程序广告位 + */ +export interface MpAd { + // ID + adId?: number; + // 页面ID + pageId?: number; + // 页面名称 + pageName?: string; + // 广告类型 + adType?: string; + // 广告位名称 + name?: string; + // 宽 + width?: string; + // 高 + height?: string; + // 广告图片 + images?: string; + // 路由/链接地址 + path?: string; + // 用户ID + userId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 小程序广告位搜索条件 + */ +export interface MpAdParam extends PageParam { + adId?: number; + keywords?: string; +} diff --git a/api/cms/mpField/index.ts b/api/cms/mpField/index.ts new file mode 100644 index 0000000..f3d69a6 --- /dev/null +++ b/api/cms/mpField/index.ts @@ -0,0 +1,132 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { MpField, MpFieldParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询小程序配置 + */ +export async function pageMpField(params: MpFieldParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/mp-field/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询小程序配置列表 + */ +export async function listMpField(params?: MpFieldParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-field', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加小程序配置 + */ +export async function addMpField(data: MpField) { + const res = await request.post>( + MODULES_API_URL + '/cms/mp-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改小程序配置 + */ +export async function updateMpField(data: MpField) { + const res = await request.put>( + MODULES_API_URL + '/cms/mp-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除小程序配置 + */ +export async function removeMpField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-field/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除小程序配置 + */ +export async function removeBatchMpField(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-field/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询小程序配置 + */ +export async function getMpField(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-field/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 清除缓存 + */ +export async function removeMpInfoCache(key?: string) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-field/clearMpInfo/' + key + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 恢复项目参数 + */ +export async function undeleteMpField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-field/undelete/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/mpField/model/index.ts b/api/cms/mpField/model/index.ts new file mode 100644 index 0000000..3738592 --- /dev/null +++ b/api/cms/mpField/model/index.ts @@ -0,0 +1,37 @@ +import type { PageParam } from '@/api'; + +/** + * 小程序配置 + */ +export interface MpField { + // 自增ID + id?: number; + // 类型,0文本 1图片 2其他 + type?: number; + // 名称 + name?: string; + // 备注 + comments?: string; + // 名称 + value?: string; + // 页面ID + pageId?: number; + // 页面名称 + pageName?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 小程序配置搜索条件 + */ +export interface MpFieldParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/cms/mpPages/index.ts b/api/cms/mpPages/index.ts new file mode 100644 index 0000000..fbbf48a --- /dev/null +++ b/api/cms/mpPages/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { MpPages, MpPagesParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询小程序页面 + */ +export async function pageMpPages(params: MpPagesParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/mp-pages/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询小程序页面列表 + */ +export async function listMpPages(params?: MpPagesParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-pages', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加小程序页面 + */ +export async function addMpPages(data: MpPages) { + const res = await request.post>( + MODULES_API_URL + '/cms/mp-pages', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改小程序页面 + */ +export async function updateMpPages(data: MpPages) { + const res = await request.put>( + MODULES_API_URL + '/cms/mp-pages', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除小程序页面 + */ +export async function removeMpPages(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-pages/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除小程序页面 + */ +export async function removeBatchMpPages(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/mp-pages/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询小程序页面 + */ +export async function getMpPages(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/mp-pages/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/mpPages/model/index.ts b/api/cms/mpPages/model/index.ts new file mode 100644 index 0000000..ac06f00 --- /dev/null +++ b/api/cms/mpPages/model/index.ts @@ -0,0 +1,52 @@ +import type { PageParam } from '@/api'; + +/** + * 小程序页面 + */ +export interface MpPages { + // ID + id?: number; + // 上级id, 0是顶级 + parentId?: number; + // 页面名称 + title?: string; + // 页面路径 + path?: string; + // 设为首页 + home?: number; + // 分包 + subpackage?: string; + // 图标 + icon?: string; + // (优先级高于图标) + iconPath?: string; + // (优先级高于图标) + selectedIconPath?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 子页面 + children?: MpPages[]; +} + +/** + * 小程序页面搜索条件 + */ +export interface MpPagesParam extends PageParam { + id?: number; + title?: string; + path?: string; + subpackage?: string; + keywords?: string; +} diff --git a/api/cms/navigation/index.ts b/api/cms/navigation/index.ts new file mode 100644 index 0000000..16ba277 --- /dev/null +++ b/api/cms/navigation/index.ts @@ -0,0 +1,173 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Navigation, NavigationParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询导航 + */ +export async function pageNavigation(params: NavigationParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/navigation/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询导航列表 + */ +export async function listNavigation(params?: NavigationParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/navigation', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加导航 + */ +export async function addNavigation(data: Navigation) { + const res = await request.post>( + MODULES_API_URL + '/cms/navigation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改导航 + */ +export async function updateNavigation(data: Navigation) { + const res = await request.put>( + MODULES_API_URL + '/cms/navigation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除导航 + */ +export async function removeNavigation(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/navigation/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除导航 + */ +export async function removeBatchNavigation(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/navigation/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateNavigationStatus(navigationId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/navigation/status', + { + navigationId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询导航 + */ +export async function getNavigation(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/navigation/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/navigation/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 树形结构 + * @param params + */ +export async function treeNavigation(params?: NavigationParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/navigation/tree', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据path查询导航 + */ +export async function getNavigationByPath(path: string) { + const res = await request.get>( + MODULES_API_URL + '/cms/navigation/getNavigationByPath/' + path + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/navigation/model/index.ts b/api/cms/navigation/model/index.ts new file mode 100644 index 0000000..ce7c851 --- /dev/null +++ b/api/cms/navigation/model/index.ts @@ -0,0 +1,59 @@ +import type {Design} from "~/api/cms/design/model"; + +/** + * 菜单 + */ +export interface Navigation{ + navigationId?: number; + parentId?: number; + title?: string; + path?: string; + icon?: string; + component?: string; + type?: number; + sortNumber?: number; + hide?: number; + permission?: number; + password?: string; + home?: number; + position?: number; + meta?: string; + children?: Navigation[]; + disabled?: boolean; + tenantId?: number; + comments?: string; + status?: number; + pageId?: number; + articleCategoryId?: number; + articleId?: number; + goodsCategoryId?: number; + goodsId?: number; + bookCode?: string; + formId?: number; + pageName?: string; + createTime?: string; + isMpWeixin?: boolean; + target?: string; + layout?: string; + design?: Design; + // 用于面包肖屑 + parentName?: string; + parentPath?: string; + parentStatus?: number; + categoryName?: string; + categoryPath?: string; + currentTitle?: string; + style?: string; + label?: string; + value?: number; +} + +/** + * 菜单搜索参数 + */ +export interface NavigationParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; +} diff --git a/api/cms/website/field/index.ts b/api/cms/website/field/index.ts new file mode 100644 index 0000000..7a3df7d --- /dev/null +++ b/api/cms/website/field/index.ts @@ -0,0 +1,159 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { + WebsiteField, + WebsiteFieldParam +} from '@/api/cms/website/field/model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 分页查询项目参数 + */ +export async function pageWebsiteField(params: WebsiteFieldParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/website-field/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目参数列表 + */ +export async function listWebsiteField(params?: WebsiteFieldParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/website-field', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询项目参数 + */ +export async function getWebsiteField(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/website-field/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加项目参数 + */ +export async function addWebsiteField(data: WebsiteField) { + const res = await request.post>( + MODULES_API_URL + '/cms/website-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改项目参数 + */ +export async function updateWebsiteField(data: WebsiteField) { + const res = await request.put>( + MODULES_API_URL + '/cms/website-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除项目参数 + */ +export async function removeWebsiteField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website-field/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除项目参数 + */ +export async function removeBatchWebsiteField(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website-field/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/website-field/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 恢复项目参数 + */ +export async function undeleteWebsiteField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website-field/undelete/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + + +/** + * 查询网站参数(对象形式) + */ +export async function getSiteConfig(params: WebsiteFieldParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/website-field/config', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/website/field/model/index.ts b/api/cms/website/field/model/index.ts new file mode 100644 index 0000000..e48a3d2 --- /dev/null +++ b/api/cms/website/field/model/index.ts @@ -0,0 +1,45 @@ +import type { PageParam } from '@/api'; + +/** + * 网站参数 + */ +export interface WebsiteField { + id?: number; + name?: string; + value?: string; + comments?: string; + userId?: number; + type?: number; + status?: any; + sortNumber?: any; + createTime?: string; + deleted?: number; +} + +// 约定的网站参数名称 +export interface WebsiteParam { + // 网站名称 + site_logo?: string; + // 登录页面标题 + login_name?: string; + // 登录页面的背景图片 + login_bg_img?: string; +} + +// 约定的小程序参数名称 +export interface MpWeixinParam { + // 小程序LOGO + site_logo?: string; + // 我的页面顶部背景图片 + mp_user_top?: string; +} + +/** + * 网站参数搜索条件 + */ +export interface WebsiteFieldParam extends PageParam { + id?: number; + userId?: number; + name?: string; + websiteId?: number; +} diff --git a/api/cms/website/index.ts b/api/cms/website/index.ts new file mode 100644 index 0000000..831512d --- /dev/null +++ b/api/cms/website/index.ts @@ -0,0 +1,169 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Website, WebsiteParam } from './model'; +import { MODULES_API_URL } from '~/config'; + +/** + * 获取网站信息 + */ +export async function getSiteInfo() { + const res = await request.get>( + MODULES_API_URL + '/cms/website/getSiteInfo' + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 清除缓存 + */ +export async function removeSiteInfoCache(key?: string) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website/clearSiteInfo/' + key + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询网站 + */ +export async function pageWebsite(params: WebsiteParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/website/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询网站列表 + */ +export async function listWebsite(params?: WebsiteParam) { + const res = await request.get>( + MODULES_API_URL + '/cms/website', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加网站 + */ +export async function addWebsite(data: Website) { + const res = await request.post>( + MODULES_API_URL + '/cms/website', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改网站 + */ +export async function updateWebsite(data: Website) { + const res = await request.put>( + MODULES_API_URL + '/cms/website', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除网站 + */ +export async function removeWebsite(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除网站 + */ +export async function removeBatchWebsite(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateWebsiteStatus(websiteId?: number, status?: number) { + const res = await request.put>( + MODULES_API_URL + '/cms/website/status', + { + websiteId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询网站 + */ +export async function getWebsite(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/website/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/website/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/cms/website/model/index.ts b/api/cms/website/model/index.ts new file mode 100644 index 0000000..64dcb29 --- /dev/null +++ b/api/cms/website/model/index.ts @@ -0,0 +1,79 @@ +import type { WebsiteField } from '@/api/cms/website/field/model'; +import type {Navigation} from "@/api/cms/navigation/model"; +import type {ArrangeCategory} from "@/api/cms/category/model"; +import type {Link} from "~/api/cms/link/model"; +import type {User} from "~/api/system/user/model"; + +/** + * 菜单 + */ +export interface Website { + websiteId?: number; + websiteName?: string; + websiteCode?: string; + websiteIcon?: string; + websiteLogo?: string; + websiteDarkLogo?: string; + websiteType?: string; + styles?: string; + keywords?: string; + address?: string; + phone?: string; + email?: string; + version?: number; + expirationTime?: string; + templateId?: string; + industryParent?: string; + industryChild?: string; + companyId?: number; + prefix?: string; + domain?: string; + adminUrl?: string; + icpNo?: string; + policeNo?: string; + comments?: string; + sortNumber?: number; + createTime?: string; + disabled?: boolean; + country?: string; + province?: string; + city?: string; + region?: string; + appId?: number; + fields?: WebsiteField[]; + // 状态码 + status?: number; + // 状态名称 + statusName?: string; + // 状态图标 + statusIcon?: string; + // 状态说明 + statusText?: string; + // 关闭原因 + statusClose?: string; + // 跳转按钮文本 + statusBtnText?: string; + // 跳转地址 + statusUrl?: string; + tenantId?: number; + tenantName?: string; + navigations?: Navigation[]; + categoryList?: ArrangeCategory[]; + links?: Link[]; + // 配置信息 + config?: any; + topNavs?: Navigation[]; + bottomNavs?: Navigation[]; + loginUser?: User; +} + +/** + * 菜单搜索参数 + */ +export interface WebsiteParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; + domain?: string; +} diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000..9077748 --- /dev/null +++ b/api/index.ts @@ -0,0 +1,58 @@ +/** + * 接口统一返回结果 + */ +export interface ApiResult { + // 状态码 + code: number; + // 状态信息 + message?: string; + // 返回数据 + data?: T; +} + +/** + * 分页查询统一结果 + */ +export interface PageResult { + // 返回数据 + list: T[]; + // 总数量 + count: number; +} + +/** + * 分页查询基本参数 + */ +export interface PageParam { + // 第几页 + page?: number; + // 每页多少条 + limit?: number; + // 排序字段 + sort?: string; + sortNum?: string; + // 排序方式, asc升序, desc降序 + order?: string; + // 租户ID + tenantId?: number; + // 企业ID + companyId?: number; + // 商户ID + merchantId?: number; + merchantName?: string; + categoryIds?: any; + // 商品分类 + categoryId?: number; + categoryName?: string; + // 搜素关键词 + keywords?: string; + // 起始时间 + createTimeStart?: number; + // 结束时间 + createTimeEnd?: number; + timeStart?: number; + timeEnd?: number; + isExpireTime?: number; + showSoldStatus?: boolean; + dateTime?: string; +} diff --git a/api/json/china-provinces.geo.json b/api/json/china-provinces.geo.json new file mode 100644 index 0000000..be70ca7 --- /dev/null +++ b/api/json/china-provinces.geo.json @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":"65","size":"550","name":"新疆","cp":[84.9023,42.148],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7588],[96.416,42.7148],[95.9766,42.4951],[96.0645,42.3193],[96.2402,42.2314],[95.9766,41.9238],[95.2734,41.6162],[95.1855,41.792],[94.5703,41.4844],[94.043,41.0889],[93.8672,40.6934],[93.0762,40.6494],[92.6367,39.6387],[92.373,39.3311],[92.373,39.1113],[92.373,39.0234],[90.1758,38.4961],[90.3516,38.2324],[90.6152,38.3203],[90.5273,37.8369],[91.0547,37.4414],[91.3184,37.0898],[90.7031,36.7822],[90.791,36.6064],[91.0547,36.5186],[91.0547,36.0791],[90.8789,36.0352],[90,36.2549],[89.9121,36.0791],[89.7363,36.0791],[89.209,36.2988],[88.7695,36.3428],[88.5938,36.4746],[87.3633,36.4307],[86.2207,36.167],[86.1328,35.8594],[85.6055,35.6836],[85.0781,35.7275],[84.1992,35.376],[83.1445,35.4199],[82.8809,35.6836],[82.4414,35.7275],[82.002,35.332],[81.6504,35.2441],[80.4199,35.4199],[80.2441,35.2881],[80.332,35.1563],[80.2441,35.2002],[79.8926,34.8047],[79.8047,34.4971],[79.1016,34.4531],[79.0137,34.3213],[78.2227,34.7168],[78.0469,35.2441],[78.0469,35.5078],[77.4316,35.4639],[76.8164,35.6396],[76.5527,35.8594],[76.2012,35.8154],[75.9375,36.0352],[76.0254,36.4746],[75.8496,36.6943],[75.498,36.7383],[75.4102,36.958],[75.0586,37.002],[74.8828,36.9141],[74.7949,37.0459],[74.5313,37.0898],[74.5313,37.2217],[74.8828,37.2217],[75.1465,37.4414],[74.8828,37.5732],[74.9707,37.749],[74.8828,38.4521],[74.3555,38.6719],[74.1797,38.6719],[74.0918,38.54],[73.8281,38.584],[73.7402,38.8477],[73.8281,38.9795],[73.4766,39.375],[73.916,39.5068],[73.916,39.6826],[73.8281,39.7705],[74.0039,40.0342],[74.8828,40.3418],[74.7949,40.5176],[75.2344,40.4297],[75.5859,40.6494],[75.7617,40.2979],[76.377,40.3857],[76.9043,41.001],[77.6074,41.001],[78.1348,41.2207],[78.1348,41.3965],[80.1563,42.0557],[80.2441,42.2754],[80.1563,42.627],[80.2441,42.8467],[80.5078,42.8906],[80.4199,43.0664],[80.7715,43.1982],[80.4199,44.165],[80.4199,44.6045],[79.9805,44.8242],[79.9805,44.9561],[81.7383,45.3955],[82.0898,45.2197],[82.5293,45.2197],[82.2656,45.6592],[83.0566,47.2412],[83.6719,47.0215],[84.7266,47.0215],[84.9023,46.8896],[85.5176,47.0654],[85.6934,47.2852],[85.5176,48.1201],[85.7813,48.4277],[86.5723,48.5596],[86.8359,48.8232],[86.748,48.9551],[86.8359,49.1309],[87.8027,49.1748],[87.8906,48.999],[87.7148,48.9111],[88.0664,48.7354],[87.9785,48.6035],[88.5059,48.3838],[88.6816,48.1641],[89.1211,47.9883],[89.5605,48.0322],[89.7363,47.8564],[90.0879,47.8564],[90.3516,47.6807],[90.5273,47.2412],[90.8789,46.9775],[91.0547,46.582],[90.8789,46.3184],[91.0547,46.0107],[90.7031,45.7471],[90.7031,45.5273],[90.8789,45.2197],[91.582,45.0879],[93.5156,44.9561],[94.7461,44.3408],[95.3613,44.2969],[95.3613,44.0332],[95.5371,43.9014],[95.8887,43.2422],[96.3281,42.9346],[96.416,42.7588]]]}},{"type":"Feature","properties":{"id":"54","size":"550","name":"西藏","cp":[87.8695,31.6846],"childNum":7},"geometry":{"type":"Polygon","coordinates":[[[79.0137,34.3213],[79.1016,34.4531],[79.8047,34.4971],[79.8926,34.8047],[80.2441,35.2002],[80.332,35.1563],[80.2441,35.2881],[80.4199,35.4199],[81.6504,35.2441],[82.002,35.332],[82.4414,35.7275],[82.8809,35.6836],[83.1445,35.4199],[84.1992,35.376],[85.0781,35.7275],[85.6055,35.6836],[86.1328,35.8594],[86.2207,36.167],[87.3633,36.4307],[88.5938,36.4746],[88.7695,36.3428],[89.209,36.2988],[89.7363,36.0791],[89.3848,36.0352],[89.4727,35.9033],[89.7363,35.7715],[89.7363,35.4199],[89.4727,35.376],[89.4727,35.2441],[89.5605,34.8926],[89.8242,34.8486],[89.7363,34.6729],[89.8242,34.3652],[89.6484,34.0137],[90.0879,33.4863],[90.7031,33.1348],[91.4063,33.1348],[91.9336,32.8271],[92.1973,32.8271],[92.2852,32.7393],[92.9883,32.7393],[93.5156,32.4756],[93.7793,32.5635],[94.1309,32.4316],[94.6582,32.6074],[95.1855,32.4316],[95.0098,32.2998],[95.1855,32.3438],[95.2734,32.2119],[95.3613,32.168],[95.3613,31.9922],[95.4492,31.8164],[95.8008,31.6846],[95.9766,31.8164],[96.1523,31.5967],[96.2402,31.9482],[96.5039,31.7285],[96.8555,31.6846],[96.7676,31.9922],[97.2949,32.0801],[97.3828,32.5635],[97.7344,32.5195],[98.1738,32.3438],[98.4375,31.8604],[98.877,31.4209],[98.6133,31.2012],[98.9648,30.7617],[99.1406,29.2676],[98.9648,29.1357],[98.9648,28.8281],[98.7891,28.8721],[98.7891,29.0039],[98.7012,28.916],[98.6133,28.5205],[98.7891,28.3447],[98.7012,28.2129],[98.3496,28.125],[98.2617,28.3887],[98.1738,28.125],[97.5586,28.5205],[97.2949,28.0811],[97.3828,27.9053],[97.0313,27.7295],[96.5039,28.125],[95.7129,28.2568],[95.3613,28.125],[95.2734,27.9492],[94.2188,27.5537],[93.8672,27.0264],[93.6035,26.9385],[92.1094,26.8506],[92.0215,27.4658],[91.582,27.5537],[91.582,27.9053],[91.4063,28.0371],[91.0547,27.8613],[90.7031,28.0811],[89.8242,28.2129],[89.6484,28.1689],[89.1211,27.5977],[89.1211,27.334],[89.0332,27.2021],[88.7695,27.4219],[88.8574,27.9932],[88.6816,28.125],[88.1543,27.9053],[87.8906,27.9492],[87.7148,27.8174],[87.0996,27.8174],[86.748,28.125],[86.5723,28.125],[86.4844,27.9053],[86.1328,28.125],[86.0449,27.9053],[85.6934,28.3447],[85.6055,28.2568],[85.166,28.3447],[85.166,28.6523],[84.9023,28.5645],[84.4629,28.7402],[84.2871,28.8721],[84.1992,29.2236],[84.1113,29.2676],[83.584,29.1797],[83.2324,29.5752],[82.1777,30.0586],[82.0898,30.3223],[81.3867,30.3662],[81.2109,30.0146],[81.0352,30.2344],[80.0684,30.5859],[79.7168,30.9375],[79.0137,31.0693],[78.75,31.333],[78.8379,31.5967],[78.6621,31.8164],[78.75,31.9043],[78.4863,32.124],[78.3984,32.5195],[78.75,32.6953],[78.9258,32.3438],[79.2773,32.5635],[79.1016,33.1787],[78.6621,33.6621],[78.6621,34.1016],[78.9258,34.1455],[79.0137,34.3213]]]}},{"type":"Feature","properties":{"id":"15","size":"450","name":"内蒙古","cp":[111.670801,41.818311],"childNum":12},"geometry":{"type":"Polygon","coordinates":[[[97.207,42.8027],[99.4922,42.583],[100.8105,42.6709],[101.7773,42.4951],[102.041,42.2314],[102.7441,42.1436],[103.3594,41.8799],[103.8867,41.792],[104.502,41.8799],[104.502,41.6602],[105.0293,41.5723],[105.7324,41.9238],[107.4023,42.4512],[109.4238,42.4512],[110.3906,42.7588],[111.0059,43.3301],[111.9727,43.6816],[111.9727,43.8135],[111.4453,44.3848],[111.7969,45],[111.9727,45.0879],[113.6426,44.7363],[114.1699,44.9561],[114.5215,45.3955],[115.6641,45.4395],[116.1914,45.7031],[116.2793,45.9668],[116.543,46.2744],[117.334,46.3623],[117.4219,46.582],[117.7734,46.5381],[118.3008,46.7578],[118.7402,46.7139],[118.916,46.7578],[119.0918,46.6699],[119.707,46.626],[119.9707,46.7139],[119.707,47.1973],[118.4766,47.9883],[117.8613,48.0322],[117.334,47.6807],[116.8066,47.9004],[116.1914,47.8564],[115.9277,47.6807],[115.5762,47.9004],[115.4883,48.1641],[115.8398,48.252],[115.8398,48.5596],[116.7188,49.834],[117.7734,49.5264],[118.5645,49.9219],[119.2676,50.0977],[119.3555,50.3174],[119.1797,50.3613],[119.5313,50.7568],[119.5313,50.8887],[119.707,51.0645],[120.1465,51.6797],[120.6738,51.9434],[120.7617,52.1191],[120.7617,52.251],[120.5859,52.3389],[120.6738,52.5146],[120.4102,52.6465],[120.0586,52.6025],[120.0586,52.7344],[120.8496,53.2617],[121.4648,53.3496],[121.8164,53.042],[121.2012,52.5586],[121.6406,52.4268],[121.7285,52.2949],[121.9922,52.2949],[122.168,52.5146],[122.6953,52.251],[122.6074,52.0752],[122.959,51.3281],[123.3105,51.2402],[123.6621,51.3721],[124.3652,51.2842],[124.541,51.3721],[124.8926,51.3721],[125.0684,51.6357],[125.332,51.6357],[126.0352,51.0205],[125.7715,50.7568],[125.7715,50.5371],[125.332,50.1416],[125.1563,49.834],[125.2441,49.1748],[124.8047,49.1309],[124.4531,48.1201],[124.2773,48.5156],[122.4316,47.373],[123.0469,46.7139],[123.3984,46.8896],[123.3984,46.9775],[123.4863,46.9775],[123.5742,46.8457],[123.5742,46.8896],[123.5742,46.6699],[123.0469,46.582],[123.2227,46.2305],[122.7832,46.0107],[122.6953,45.7031],[122.4316,45.8789],[122.2559,45.791],[121.8164,46.0107],[121.7285,45.7471],[121.9043,45.7031],[122.2559,45.2637],[122.0801,44.8682],[122.3438,44.2529],[123.1348,44.4727],[123.4863,43.7256],[123.3105,43.5059],[123.6621,43.374],[123.5742,43.0225],[123.3105,42.9785],[123.1348,42.8027],[122.7832,42.7148],[122.3438,42.8467],[122.3438,42.6709],[121.9922,42.7148],[121.7285,42.4512],[121.4648,42.4951],[120.498,42.0996],[120.1465,41.7041],[119.8828,42.1875],[119.5313,42.3633],[119.3555,42.2754],[119.2676,41.7041],[119.4434,41.6162],[119.2676,41.3086],[118.3887,41.3086],[118.125,41.748],[118.3008,41.792],[118.3008,42.0996],[118.125,42.0557],[117.9492,42.2314],[118.0371,42.4072],[117.7734,42.627],[117.5098,42.583],[117.334,42.4512],[116.8945,42.4072],[116.8066,42.0117],[116.2793,42.0117],[116.0156,41.792],[115.9277,41.9238],[115.2246,41.5723],[114.9609,41.6162],[114.873,42.0996],[114.5215,42.1436],[114.1699,41.792],[114.2578,41.5723],[113.9063,41.4404],[113.9941,41.2207],[113.9063,41.1328],[114.082,40.7373],[114.082,40.5176],[113.8184,40.5176],[113.5547,40.3418],[113.2031,40.3857],[112.7637,40.166],[112.3242,40.2539],[111.9727,39.5947],[111.4453,39.6387],[111.3574,39.4189],[111.0938,39.375],[111.0938,39.5947],[110.6543,39.2871],[110.127,39.4629],[110.2148,39.2871],[109.8633,39.2432],[109.9512,39.1553],[108.9844,38.3203],[109.0723,38.0127],[108.8965,37.9688],[108.8086,38.0127],[108.7207,37.7051],[108.1934,37.6172],[107.666,37.8809],[107.3145,38.1006],[106.7871,38.1885],[106.5234,38.3203],[106.9629,38.9795],[106.7871,39.375],[106.3477,39.2871],[105.9082,38.7158],[105.8203,37.793],[104.3262,37.4414],[103.4473,37.8369],[103.3594,38.0127],[103.5352,38.1445],[103.4473,38.3643],[104.2383,38.9795],[104.0625,39.4189],[103.3594,39.3311],[103.0078,39.1113],[102.4805,39.2432],[101.8652,39.1113],[102.041,38.8916],[101.7773,38.6719],[101.3379,38.7598],[101.25,39.0234],[100.9863,38.9355],[100.8105,39.4189],[100.5469,39.4189],[100.0195,39.7705],[99.4922,39.8584],[100.1074,40.2539],[100.1953,40.6494],[99.9316,41.001],[99.2285,40.8691],[99.0527,40.6934],[98.9648,40.7813],[98.7891,40.6055],[98.5254,40.7373],[98.6133,40.6494],[98.3496,40.5615],[98.3496,40.9131],[97.4707,41.4844],[97.8223,41.6162],[97.8223,41.748],[97.207,42.8027]]]}},{"type":"Feature","properties":{"id":"63","size":"800","name":"青海","cp":[95.2402,35.4199],"childNum":8},"geometry":{"type":"Polygon","coordinates":[[[89.7363,36.0791],[89.9121,36.0791],[90,36.2549],[90.8789,36.0352],[91.0547,36.0791],[91.0547,36.5186],[90.791,36.6064],[90.7031,36.7822],[91.3184,37.0898],[91.0547,37.4414],[90.5273,37.8369],[90.6152,38.3203],[90.3516,38.2324],[90.1758,38.4961],[92.373,39.0234],[92.373,39.1113],[93.1641,39.1992],[93.1641,38.9795],[93.6914,38.9355],[93.8672,38.7158],[94.3066,38.7598],[94.5703,38.3643],[95.0098,38.4082],[95.4492,38.2764],[95.7129,38.3643],[96.2402,38.1006],[96.416,38.2324],[96.6797,38.1885],[96.6797,38.4521],[97.1191,38.584],[97.0313,39.1992],[98.1738,38.8037],[98.3496,39.0234],[98.6133,38.9355],[98.7891,39.0674],[99.1406,38.9355],[99.8438,38.3643],[100.1953,38.2764],[100.0195,38.4521],[100.1074,38.4961],[100.459,38.2764],[100.7227,38.2324],[101.1621,37.8369],[101.5137,37.8809],[101.7773,37.6172],[101.9531,37.7051],[102.1289,37.4414],[102.5684,37.1777],[102.4805,36.958],[102.6563,36.8262],[102.5684,36.7383],[102.832,36.3428],[103.0078,36.2549],[102.9199,36.0791],[102.9199,35.9033],[102.6563,35.7715],[102.832,35.5957],[102.4805,35.5957],[102.3047,35.4199],[102.3926,35.2002],[101.9531,34.8486],[101.9531,34.6289],[102.2168,34.4092],[102.1289,34.2773],[101.6895,34.1016],[100.9863,34.3652],[100.8105,34.2773],[101.25,33.6621],[101.5137,33.7061],[101.6016,33.5303],[101.7773,33.5303],[101.6895,33.3105],[101.7773,33.2227],[101.6016,33.1348],[101.1621,33.2227],[101.25,32.6953],[100.7227,32.6514],[100.7227,32.5195],[100.3711,32.7393],[100.1074,32.6514],[100.1074,32.8711],[99.8438,33.0029],[99.7559,32.7393],[99.2285,32.915],[99.2285,33.0469],[98.877,33.1787],[98.4375,34.0576],[97.8223,34.1895],[97.6465,34.1016],[97.7344,33.9258],[97.3828,33.8818],[97.4707,33.5742],[97.7344,33.3984],[97.3828,32.8711],[97.4707,32.6953],[97.7344,32.5195],[97.3828,32.5635],[97.2949,32.0801],[96.7676,31.9922],[96.8555,31.6846],[96.5039,31.7285],[96.2402,31.9482],[96.1523,31.5967],[95.9766,31.8164],[95.8008,31.6846],[95.4492,31.8164],[95.3613,31.9922],[95.3613,32.168],[95.2734,32.2119],[95.1855,32.3438],[95.0098,32.2998],[95.1855,32.4316],[94.6582,32.6074],[94.1309,32.4316],[93.7793,32.5635],[93.5156,32.4756],[92.9883,32.7393],[92.2852,32.7393],[92.1973,32.8271],[91.9336,32.8271],[91.4063,33.1348],[90.7031,33.1348],[90.0879,33.4863],[89.6484,34.0137],[89.8242,34.3652],[89.7363,34.6729],[89.8242,34.8486],[89.5605,34.8926],[89.4727,35.2441],[89.4727,35.376],[89.7363,35.4199],[89.7363,35.7715],[89.4727,35.9033],[89.3848,36.0352],[89.7363,36.0791]]]}},{"type":"Feature","properties":{"id":"51","size":"900","name":"四川","cp":[101.9199,30.1904],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[101.7773,33.5303],[101.8652,33.5742],[101.9531,33.4424],[101.8652,33.0908],[102.4805,33.4424],[102.2168,33.9258],[102.9199,34.3213],[103.0957,34.1895],[103.1836,33.7939],[104.1504,33.6182],[104.2383,33.3984],[104.4141,33.3105],[104.3262,33.2227],[104.4141,33.0469],[104.3262,32.8711],[104.4141,32.7393],[105.2051,32.6074],[105.3809,32.7393],[105.3809,32.8711],[105.4688,32.915],[105.5566,32.7393],[106.084,32.8711],[106.084,32.7393],[106.3477,32.6514],[107.0508,32.6953],[107.1387,32.4756],[107.2266,32.4316],[107.4023,32.5195],[108.0176,32.168],[108.2813,32.2559],[108.5449,32.2119],[108.3691,32.168],[108.2813,31.9043],[108.5449,31.6846],[108.1934,31.5088],[107.9297,30.8496],[107.4902,30.8496],[107.4023,30.7617],[107.4902,30.6299],[107.0508,30.0146],[106.7871,30.0146],[106.6113,30.3223],[106.2598,30.1904],[105.8203,30.4541],[105.6445,30.2783],[105.5566,30.1025],[105.7324,29.8828],[105.293,29.5313],[105.4688,29.3115],[105.7324,29.2676],[105.8203,28.96],[106.2598,28.8721],[106.3477,28.5205],[105.9961,28.7402],[105.6445,28.4326],[105.9082,28.125],[106.1719,28.125],[106.3477,27.8174],[105.6445,27.6416],[105.5566,27.7734],[105.293,27.7295],[105.2051,27.9932],[105.0293,28.0811],[104.8535,27.9053],[104.4141,27.9492],[104.3262,28.0371],[104.4141,28.125],[104.4141,28.2568],[104.2383,28.4326],[104.4141,28.6084],[103.8867,28.6523],[103.7988,28.3008],[103.4473,28.125],[103.4473,27.7734],[102.9199,27.29],[103.0078,26.3672],[102.6563,26.1914],[102.5684,26.3672],[102.1289,26.1035],[101.8652,26.0596],[101.6016,26.2354],[101.6895,26.3672],[101.4258,26.5869],[101.4258,26.8066],[101.4258,26.7188],[101.1621,27.0264],[101.1621,27.1582],[100.7227,27.8613],[100.3711,27.8174],[100.2832,27.7295],[100.0195,28.125],[100.1953,28.3447],[99.668,28.8281],[99.4043,28.5205],[99.4043,28.1689],[99.2285,28.3008],[99.1406,29.2676],[98.9648,30.7617],[98.6133,31.2012],[98.877,31.4209],[98.4375,31.8604],[98.1738,32.3438],[97.7344,32.5195],[97.4707,32.6953],[97.3828,32.8711],[97.7344,33.3984],[97.4707,33.5742],[97.3828,33.8818],[97.7344,33.9258],[97.6465,34.1016],[97.8223,34.1895],[98.4375,34.0576],[98.877,33.1787],[99.2285,33.0469],[99.2285,32.915],[99.7559,32.7393],[99.8438,33.0029],[100.1074,32.8711],[100.1074,32.6514],[100.3711,32.7393],[100.7227,32.5195],[100.7227,32.6514],[101.25,32.6953],[101.1621,33.2227],[101.6016,33.1348],[101.7773,33.2227],[101.6895,33.3105],[101.7773,33.5303]]]}},{"type":"Feature","properties":{"id":"23","size":"700","name":"黑龙江","cp":[128.642464,46.756967],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[121.4648,53.3496],[123.6621,53.5693],[124.8926,53.0859],[125.0684,53.2178],[125.5957,53.0859],[125.6836,52.9102],[126.123,52.7783],[126.0352,52.6025],[126.2109,52.5146],[126.3867,52.2949],[126.3867,52.207],[126.5625,52.1631],[126.4746,51.9434],[126.9141,51.3721],[126.8262,51.2842],[127.002,51.3281],[126.9141,51.1084],[127.2656,50.7568],[127.3535,50.2734],[127.6172,50.2295],[127.5293,49.8779],[127.793,49.6143],[128.7598,49.5703],[129.1113,49.3506],[129.4629,49.4385],[130.2539,48.8672],[130.6934,48.8672],[130.5176,48.6475],[130.8691,48.2959],[130.6934,48.1201],[131.0449,47.6807],[132.5391,47.7246],[132.627,47.9443],[133.0664,48.1201],[133.5059,48.1201],[134.209,48.3838],[135.0879,48.4277],[134.7363,48.252],[134.5605,47.9883],[134.7363,47.6807],[134.5605,47.4609],[134.3848,47.4609],[134.209,47.2852],[134.209,47.1533],[133.8574,46.5381],[133.9453,46.2744],[133.5059,45.835],[133.418,45.5713],[133.2422,45.5273],[133.0664,45.1318],[132.8906,45.0439],[131.9238,45.3516],[131.5723,45.0439],[131.0449,44.8682],[131.3086,44.0771],[131.2207,43.7256],[131.3086,43.4619],[130.8691,43.418],[130.5176,43.6377],[130.3418,43.9893],[129.9902,43.8574],[129.9023,44.0332],[129.8145,43.9014],[129.2871,43.8135],[129.1992,43.5938],[128.8477,43.5498],[128.4961,44.165],[128.4082,44.4727],[128.0566,44.3408],[128.0566,44.1211],[127.7051,44.1211],[127.5293,44.6045],[127.0898,44.6045],[127.002,44.7803],[127.0898,45],[126.9141,45.1318],[126.5625,45.2637],[126.0352,45.1758],[125.7715,45.3076],[125.6836,45.5273],[125.0684,45.3955],[124.8926,45.5273],[124.3652,45.4395],[124.0137,45.7471],[123.9258,46.2305],[123.2227,46.2305],[123.0469,46.582],[123.5742,46.6699],[123.5742,46.8896],[123.5742,46.8457],[123.4863,46.9775],[123.3984,46.9775],[123.3984,46.8896],[123.0469,46.7139],[122.4316,47.373],[124.2773,48.5156],[124.4531,48.1201],[124.8047,49.1309],[125.2441,49.1748],[125.1563,49.834],[125.332,50.1416],[125.7715,50.5371],[125.7715,50.7568],[126.0352,51.0205],[125.332,51.6357],[125.0684,51.6357],[124.8926,51.3721],[124.541,51.3721],[124.3652,51.2842],[123.6621,51.3721],[123.3105,51.2402],[122.959,51.3281],[122.6074,52.0752],[122.6953,52.251],[122.168,52.5146],[121.9922,52.2949],[121.7285,52.2949],[121.6406,52.4268],[121.2012,52.5586],[121.8164,53.042],[121.4648,53.3496]]]}},{"type":"Feature","properties":{"id":"62","size":"690","name":"甘肃","cp":[103.823557,36.058039],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7148],[97.207,42.8027],[97.8223,41.748],[97.8223,41.6162],[97.4707,41.4844],[98.3496,40.9131],[98.3496,40.5615],[98.6133,40.6494],[98.5254,40.7373],[98.7891,40.6055],[98.9648,40.7813],[99.0527,40.6934],[99.2285,40.8691],[99.9316,41.001],[100.1953,40.6494],[100.1074,40.2539],[99.4922,39.8584],[100.0195,39.7705],[100.5469,39.4189],[100.8105,39.4189],[100.9863,38.9355],[101.25,39.0234],[101.3379,38.7598],[101.7773,38.6719],[102.041,38.8916],[101.8652,39.1113],[102.4805,39.2432],[103.0078,39.1113],[103.3594,39.3311],[104.0625,39.4189],[104.2383,38.9795],[103.4473,38.3643],[103.5352,38.1445],[103.3594,38.0127],[103.4473,37.8369],[104.3262,37.4414],[104.5898,37.4414],[104.5898,37.2217],[104.8535,37.2217],[105.293,36.8262],[105.2051,36.6943],[105.4688,36.123],[105.293,35.9912],[105.3809,35.7715],[105.7324,35.7275],[105.8203,35.5518],[105.9961,35.4639],[105.9082,35.4199],[105.9961,35.4199],[106.084,35.376],[106.2598,35.4199],[106.3477,35.2441],[106.5234,35.332],[106.4355,35.6836],[106.6992,35.6836],[106.9629,35.8154],[106.875,36.123],[106.5234,36.2549],[106.5234,36.4746],[106.4355,36.5625],[106.6113,36.7822],[106.6113,37.0898],[107.3145,37.0898],[107.3145,36.9141],[108.7207,36.3428],[108.6328,35.9912],[108.5449,35.8594],[108.6328,35.5518],[108.5449,35.2881],[107.7539,35.2881],[107.7539,35.1123],[107.8418,35.0244],[107.666,34.9365],[107.2266,34.8926],[106.9629,35.0684],[106.6113,35.0684],[106.5234,34.7607],[106.3477,34.585],[106.6992,34.3213],[106.5234,34.2773],[106.6113,34.1455],[106.4355,33.9258],[106.5234,33.5303],[105.9961,33.6182],[105.7324,33.3984],[105.9961,33.1787],[105.9082,33.0029],[105.4688,32.915],[105.3809,32.8711],[105.3809,32.7393],[105.2051,32.6074],[104.4141,32.7393],[104.3262,32.8711],[104.4141,33.0469],[104.3262,33.2227],[104.4141,33.3105],[104.2383,33.3984],[104.1504,33.6182],[103.1836,33.7939],[103.0957,34.1895],[102.9199,34.3213],[102.2168,33.9258],[102.4805,33.4424],[101.8652,33.0908],[101.9531,33.4424],[101.8652,33.5742],[101.7773,33.5303],[101.6016,33.5303],[101.5137,33.7061],[101.25,33.6621],[100.8105,34.2773],[100.9863,34.3652],[101.6895,34.1016],[102.1289,34.2773],[102.2168,34.4092],[101.9531,34.6289],[101.9531,34.8486],[102.3926,35.2002],[102.3047,35.4199],[102.4805,35.5957],[102.832,35.5957],[102.6563,35.7715],[102.9199,35.9033],[102.9199,36.0791],[103.0078,36.2549],[102.832,36.3428],[102.5684,36.7383],[102.6563,36.8262],[102.4805,36.958],[102.5684,37.1777],[102.1289,37.4414],[101.9531,37.7051],[101.7773,37.6172],[101.5137,37.8809],[101.1621,37.8369],[100.7227,38.2324],[100.459,38.2764],[100.1074,38.4961],[100.0195,38.4521],[100.1953,38.2764],[99.8438,38.3643],[99.1406,38.9355],[98.7891,39.0674],[98.6133,38.9355],[98.3496,39.0234],[98.1738,38.8037],[97.0313,39.1992],[97.1191,38.584],[96.6797,38.4521],[96.6797,38.1885],[96.416,38.2324],[96.2402,38.1006],[95.7129,38.3643],[95.4492,38.2764],[95.0098,38.4082],[94.5703,38.3643],[94.3066,38.7598],[93.8672,38.7158],[93.6914,38.9355],[93.1641,38.9795],[93.1641,39.1992],[92.373,39.1113],[92.373,39.3311],[92.6367,39.6387],[93.0762,40.6494],[93.8672,40.6934],[94.043,41.0889],[94.5703,41.4844],[95.1855,41.792],[95.2734,41.6162],[95.9766,41.9238],[96.2402,42.2314],[96.0645,42.3193],[95.9766,42.4951],[96.416,42.7148]]]}},{"type":"Feature","properties":{"id":"53","size":"1200","name":"云南","cp":[101.512251,24.740609],"childNum":16},"geometry":{"type":"Polygon","coordinates":[[[98.1738,28.125],[98.2617,28.3887],[98.3496,28.125],[98.7012,28.2129],[98.7891,28.3447],[98.6133,28.5205],[98.7012,28.916],[98.7891,29.0039],[98.7891,28.8721],[98.9648,28.8281],[98.9648,29.1357],[99.1406,29.2676],[99.2285,28.3008],[99.4043,28.1689],[99.4043,28.5205],[99.668,28.8281],[100.1953,28.3447],[100.0195,28.125],[100.2832,27.7295],[100.3711,27.8174],[100.7227,27.8613],[101.1621,27.1582],[101.1621,27.0264],[101.4258,26.7188],[101.4258,26.8066],[101.4258,26.5869],[101.6895,26.3672],[101.6016,26.2354],[101.8652,26.0596],[102.1289,26.1035],[102.5684,26.3672],[102.6563,26.1914],[103.0078,26.3672],[102.9199,27.29],[103.4473,27.7734],[103.4473,28.125],[103.7988,28.3008],[103.8867,28.6523],[104.4141,28.6084],[104.2383,28.4326],[104.4141,28.2568],[104.4141,28.125],[104.3262,28.0371],[104.4141,27.9492],[104.8535,27.9053],[105.0293,28.0811],[105.2051,27.9932],[105.293,27.7295],[105.2051,27.3779],[104.5898,27.334],[104.4141,27.4658],[104.1504,27.2461],[103.8867,27.4219],[103.623,27.0264],[103.7109,26.9824],[103.7109,26.7627],[103.8867,26.543],[104.4141,26.6748],[104.6777,26.4111],[104.3262,25.708],[104.8535,25.2246],[104.5898,25.0488],[104.6777,24.9609],[104.502,24.7412],[104.6777,24.3457],[104.7656,24.4775],[105.0293,24.4336],[105.2051,24.082],[105.4688,24.0381],[105.5566,24.126],[105.9961,24.126],[106.1719,23.8184],[106.1719,23.5547],[105.6445,23.4229],[105.5566,23.2031],[105.293,23.3789],[104.8535,23.1592],[104.7656,22.8516],[104.3262,22.6758],[104.1504,22.8076],[103.9746,22.5439],[103.623,22.7637],[103.5352,22.5879],[103.3594,22.8076],[103.0957,22.4561],[102.4805,22.7637],[102.3047,22.4121],[101.8652,22.3682],[101.7773,22.5],[101.6016,22.1924],[101.8652,21.6211],[101.7773,21.1377],[101.6016,21.2256],[101.25,21.1816],[101.1621,21.7529],[100.6348,21.4453],[100.1074,21.4893],[99.9316,22.0605],[99.2285,22.1484],[99.4043,22.5879],[99.3164,22.7197],[99.4922,23.0713],[98.877,23.2031],[98.7012,23.9502],[98.877,24.126],[98.1738,24.082],[97.7344,23.8623],[97.5586,23.9063],[97.7344,24.126],[97.6465,24.4336],[97.5586,24.4336],[97.5586,24.7412],[97.7344,24.8291],[97.8223,25.2686],[98.1738,25.4004],[98.1738,25.6201],[98.3496,25.5762],[98.5254,25.8398],[98.7012,25.8838],[98.6133,26.0596],[98.7012,26.1475],[98.7891,26.5869],[98.7012,27.5098],[98.5254,27.6416],[98.3496,27.5098],[98.1738,28.125]]]}},{"type":"Feature","properties":{"id":"45","size":"1450","name":"广西","cp":[107.7813,23.6426],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[104.502,24.7412],[104.6777,24.6094],[105.2051,24.9609],[105.9961,24.6533],[106.1719,24.7852],[106.1719,24.9609],[106.875,25.1807],[107.0508,25.2686],[106.9629,25.4883],[107.2266,25.6201],[107.4902,25.2246],[107.7539,25.2246],[107.8418,25.1367],[108.1055,25.2246],[108.1934,25.4443],[108.3691,25.5322],[108.6328,25.3125],[108.6328,25.5762],[109.0723,25.5322],[108.9844,25.752],[109.3359,25.708],[109.5117,26.0156],[109.7754,25.8838],[109.9512,26.1914],[110.2148,25.9717],[110.5664,26.3232],[111.1816,26.3232],[111.2695,26.2354],[111.2695,25.8838],[111.4453,25.8398],[111.0059,25.0049],[111.0938,24.9609],[111.3574,25.1367],[111.5332,24.6533],[111.709,24.7852],[112.0605,24.7412],[111.8848,24.6533],[112.0605,24.3457],[111.8848,24.2139],[111.8848,23.9941],[111.7969,23.8184],[111.6211,23.8184],[111.6211,23.6865],[111.3574,23.4668],[111.4453,23.0273],[111.2695,22.8076],[110.7422,22.5439],[110.7422,22.2803],[110.6543,22.1484],[110.3027,22.1484],[110.3027,21.8848],[109.9512,21.8408],[109.8633,21.665],[109.7754,21.6211],[109.7754,21.4014],[109.5996,21.4453],[109.1602,21.3574],[109.248,20.874],[109.0723,20.9619],[109.0723,21.5332],[108.7207,21.5332],[108.6328,21.665],[108.2813,21.4893],[107.8418,21.6211],[107.4023,21.6211],[107.0508,21.7969],[107.0508,21.9287],[106.6992,22.0166],[106.6113,22.4121],[106.7871,22.7637],[106.6992,22.8955],[105.9082,22.9395],[105.5566,23.0713],[105.5566,23.2031],[105.6445,23.4229],[106.1719,23.5547],[106.1719,23.8184],[105.9961,24.126],[105.5566,24.126],[105.4688,24.0381],[105.2051,24.082],[105.0293,24.4336],[104.7656,24.4775],[104.6777,24.3457],[104.502,24.7412]]]}},{"type":"Feature","properties":{"id":"43","size":"1700","name":"湖南","cp":[111.782279,28.09409],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[109.248,28.4766],[109.248,29.1357],[109.5117,29.6191],[109.6875,29.6191],[109.7754,29.751],[110.4785,29.6631],[110.6543,29.751],[110.4785,30.0146],[110.8301,30.1465],[111.7969,29.9268],[112.2363,29.5313],[112.5,29.6191],[112.6758,29.5752],[112.9395,29.7949],[113.0273,29.751],[112.9395,29.4873],[113.0273,29.4434],[113.5547,29.8389],[113.5547,29.707],[113.7305,29.5752],[113.6426,29.3115],[113.7305,29.0918],[113.9063,29.0479],[114.1699,28.8281],[114.082,28.5645],[114.2578,28.3447],[113.7305,27.9492],[113.6426,27.5977],[113.6426,27.3779],[113.8184,27.29],[113.7305,27.1143],[113.9063,26.9385],[113.9063,26.6309],[114.082,26.5869],[113.9941,26.1914],[114.2578,26.1475],[113.9941,26.0596],[113.9063,25.4443],[113.6426,25.3125],[113.2031,25.5322],[112.8516,25.3564],[113.0273,25.2246],[113.0273,24.9609],[112.8516,24.917],[112.5879,25.1367],[112.2363,25.1807],[112.1484,24.873],[112.0605,24.7412],[111.709,24.7852],[111.5332,24.6533],[111.3574,25.1367],[111.0938,24.9609],[111.0059,25.0049],[111.4453,25.8398],[111.2695,25.8838],[111.2695,26.2354],[111.1816,26.3232],[110.5664,26.3232],[110.2148,25.9717],[109.9512,26.1914],[109.7754,25.8838],[109.5117,26.0156],[109.4238,26.2793],[109.248,26.3232],[109.4238,26.5869],[109.3359,26.7188],[109.5117,26.8066],[109.5117,27.0264],[109.3359,27.1582],[108.8965,27.0264],[108.8086,27.1143],[109.4238,27.5977],[109.3359,27.9053],[109.3359,28.2568],[109.248,28.4766]]]}},{"type":"Feature","properties":{"id":"61","size":"1150","name":"陕西","cp":[108.948024,34.263161],"childNum":10},"geometry":{"type":"Polygon","coordinates":[[[105.4688,32.915],[105.9082,33.0029],[105.9961,33.1787],[105.7324,33.3984],[105.9961,33.6182],[106.5234,33.5303],[106.4355,33.9258],[106.6113,34.1455],[106.5234,34.2773],[106.6992,34.3213],[106.3477,34.585],[106.5234,34.7607],[106.6113,35.0684],[106.9629,35.0684],[107.2266,34.8926],[107.666,34.9365],[107.8418,35.0244],[107.7539,35.1123],[107.7539,35.2881],[108.5449,35.2881],[108.6328,35.5518],[108.5449,35.8594],[108.6328,35.9912],[108.7207,36.3428],[107.3145,36.9141],[107.3145,37.0898],[107.3145,37.6172],[107.666,37.8809],[108.1934,37.6172],[108.7207,37.7051],[108.8086,38.0127],[108.8965,37.9688],[109.0723,38.0127],[108.9844,38.3203],[109.9512,39.1553],[109.8633,39.2432],[110.2148,39.2871],[110.127,39.4629],[110.6543,39.2871],[111.0938,39.5947],[111.0938,39.375],[111.1816,39.2432],[110.918,38.7158],[110.8301,38.4961],[110.4785,38.1885],[110.4785,37.9688],[110.8301,37.6611],[110.3906,37.002],[110.4785,36.123],[110.5664,35.6396],[110.2148,34.8926],[110.2148,34.6729],[110.3906,34.585],[110.4785,34.2334],[110.6543,34.1455],[110.6543,33.8379],[111.0059,33.5303],[111.0059,33.2666],[110.7422,33.1348],[110.5664,33.2666],[110.3027,33.1787],[109.5996,33.2666],[109.4238,33.1348],[109.7754,33.0469],[109.7754,32.915],[110.127,32.7393],[110.127,32.6074],[109.6875,32.6074],[109.5117,32.4316],[109.5996,31.7285],[109.248,31.7285],[109.0723,31.9482],[108.5449,32.2119],[108.2813,32.2559],[108.0176,32.168],[107.4023,32.5195],[107.2266,32.4316],[107.1387,32.4756],[107.0508,32.6953],[106.3477,32.6514],[106.084,32.7393],[106.084,32.8711],[105.5566,32.7393],[105.4688,32.915]]]}},{"type":"Feature","properties":{"id":"44","size":"1600","name":"广东","cp":[113.280637,23.125178],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[109.7754,21.4014],[109.7754,21.6211],[109.8633,21.665],[109.9512,21.8408],[110.3027,21.8848],[110.3027,22.1484],[110.6543,22.1484],[110.7422,22.2803],[110.7422,22.5439],[111.2695,22.8076],[111.4453,23.0273],[111.3574,23.4668],[111.6211,23.6865],[111.6211,23.8184],[111.7969,23.8184],[111.8848,23.9941],[111.8848,24.2139],[112.0605,24.3457],[111.8848,24.6533],[112.0605,24.7412],[112.1484,24.873],[112.2363,25.1807],[112.5879,25.1367],[112.8516,24.917],[113.0273,24.9609],[113.0273,25.2246],[112.8516,25.3564],[113.2031,25.5322],[113.6426,25.3125],[113.9063,25.4443],[113.9941,25.2686],[114.6094,25.4004],[114.7852,25.2686],[114.6973,25.1367],[114.4336,24.9609],[114.1699,24.6973],[114.4336,24.5215],[115.4004,24.7852],[115.8398,24.5654],[115.752,24.7852],[115.9277,24.917],[116.2793,24.7852],[116.3672,24.873],[116.543,24.6094],[116.7188,24.6533],[116.9824,24.1699],[116.9824,23.9063],[117.1582,23.5547],[117.334,23.2471],[116.8945,23.3789],[116.6309,23.1152],[116.543,22.8516],[115.9277,22.7197],[115.6641,22.7637],[115.5762,22.6318],[115.0488,22.6758],[114.6094,22.3682],[114.3457,22.5439],[113.9941,22.5],[113.8184,22.1924],[114.3457,22.1484],[114.4336,22.0166],[114.082,21.9287],[113.9941,21.7969],[113.5547,22.0166],[113.1152,21.8408],[112.9395,21.5771],[112.4121,21.4453],[112.2363,21.5332],[111.5332,21.4893],[111.2695,21.3574],[110.7422,21.3574],[110.6543,21.2256],[110.7422,20.918],[110.4785,20.874],[110.6543,20.2588],[110.5664,20.2588],[110.3906,20.127],[110.0391,20.127],[109.8633,20.127],[109.8633,20.3027],[109.5996,20.918],[109.7754,21.4014],[109.7754,21.4014]],[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}},{"type":"Feature","properties":{"id":"22","size":"1120","name":"吉林","cp":[125.7746,43.5938],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[123.2227,46.2305],[123.9258,46.2305],[124.0137,45.7471],[124.3652,45.4395],[124.8926,45.5273],[125.0684,45.3955],[125.6836,45.5273],[125.7715,45.3076],[126.0352,45.1758],[126.5625,45.2637],[126.9141,45.1318],[127.0898,45],[127.002,44.7803],[127.0898,44.6045],[127.5293,44.6045],[127.7051,44.1211],[128.0566,44.1211],[128.0566,44.3408],[128.4082,44.4727],[128.4961,44.165],[128.8477,43.5498],[129.1992,43.5938],[129.2871,43.8135],[129.8145,43.9014],[129.9023,44.0332],[129.9902,43.8574],[130.3418,43.9893],[130.5176,43.6377],[130.8691,43.418],[131.3086,43.4619],[131.3086,43.3301],[131.1328,42.9346],[130.4297,42.7148],[130.6055,42.6709],[130.6055,42.4512],[130.2539,42.7588],[130.2539,42.8906],[130.166,42.9785],[129.9023,43.0225],[129.7266,42.4951],[129.375,42.4512],[128.9355,42.0117],[128.0566,42.0117],[128.3203,41.5723],[128.1445,41.3525],[127.0898,41.5283],[127.1777,41.5723],[126.9141,41.792],[126.6504,41.6602],[126.4746,41.3965],[126.123,40.957],[125.6836,40.8691],[125.5957,40.9131],[125.7715,41.2207],[125.332,41.6602],[125.332,41.9678],[125.4199,42.0996],[125.332,42.1436],[124.8926,42.8027],[124.8926,43.0664],[124.7168,43.0664],[124.4531,42.8467],[124.2773,43.2422],[123.8379,43.4619],[123.6621,43.374],[123.3105,43.5059],[123.4863,43.7256],[123.1348,44.4727],[122.3438,44.2529],[122.0801,44.8682],[122.2559,45.2637],[121.9043,45.7031],[121.7285,45.7471],[121.8164,46.0107],[122.2559,45.791],[122.4316,45.8789],[122.6953,45.7031],[122.7832,46.0107],[123.2227,46.2305]]]}},{"type":"Feature","properties":{"id":"13","size":"1300","name":"河北","cp":[114.502461,38.045474],"childNum":11},"geometry":{"type":"MultiPolygon","coordinates":[[[[114.5215,39.5068],[114.3457,39.8584],[113.9941,39.9902],[114.5215,40.3418],[114.3457,40.3857],[114.2578,40.6055],[114.082,40.7373],[113.9063,41.1328],[113.9941,41.2207],[113.9063,41.4404],[114.2578,41.5723],[114.1699,41.792],[114.5215,42.1436],[114.873,42.0996],[114.9609,41.6162],[115.2246,41.5723],[115.9277,41.9238],[116.0156,41.792],[116.2793,42.0117],[116.8066,42.0117],[116.8945,42.4072],[117.334,42.4512],[117.5098,42.583],[117.7734,42.627],[118.0371,42.4072],[117.9492,42.2314],[118.125,42.0557],[118.3008,42.0996],[118.3008,41.792],[118.125,41.748],[118.3887,41.3086],[119.2676,41.3086],[118.8281,40.8252],[119.2676,40.5176],[119.5313,40.5615],[119.707,40.1221],[119.8828,39.9463],[119.5313,39.6826],[119.4434,39.4189],[118.916,39.0674],[118.4766,38.9355],[118.125,39.0234],[118.0371,39.1992],[118.0371,39.2432],[117.8613,39.4189],[117.9492,39.5947],[117.6855,39.5947],[117.5098,39.7705],[117.5098,39.9902],[117.6855,39.9902],[117.6855,40.0781],[117.4219,40.21],[117.2461,40.5176],[117.4219,40.6494],[116.9824,40.6934],[116.6309,41.0449],[116.3672,40.9131],[116.4551,40.7813],[116.1914,40.7813],[116.1035,40.6055],[115.752,40.5615],[115.9277,40.2539],[115.4004,39.9463],[115.4883,39.6387],[115.752,39.5068],[116.1914,39.5947],[116.3672,39.4629],[116.543,39.5947],[116.8066,39.5947],[116.8945,39.1113],[116.7188,38.9355],[116.7188,38.8037],[117.2461,38.54],[117.5977,38.6279],[117.9492,38.3203],[117.4219,37.8369],[116.8066,37.8369],[116.4551,37.4854],[116.2793,37.5732],[116.2793,37.3535],[116.0156,37.3535],[115.752,36.9141],[115.3125,36.5186],[115.4883,36.167],[115.3125,36.0791],[115.1367,36.2109],[114.9609,36.0791],[114.873,36.123],[113.7305,36.3428],[113.4668,36.6504],[113.7305,36.8701],[113.7305,37.1338],[114.1699,37.6611],[113.9941,37.7051],[113.8184,38.1445],[113.5547,38.2764],[113.5547,38.54],[113.8184,38.8037],[113.8184,38.9355],[113.9063,39.0234],[114.3457,39.0674],[114.5215,39.5068]]],[[[117.2461,40.0781],[117.1582,39.8145],[117.1582,39.6387],[116.8945,39.6826],[116.8945,39.8145],[116.8066,39.9902],[117.2461,40.0781]]]]}},{"type":"Feature","properties":{"id":"42","size":"1500","name":"湖北","cp":[113.298572,30.684355],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.2148,31.1572],[110.127,31.377],[109.6875,31.5527],[109.7754,31.6846],[109.5996,31.7285],[109.5117,32.4316],[109.6875,32.6074],[110.127,32.6074],[110.127,32.7393],[109.7754,32.915],[109.7754,33.0469],[109.4238,33.1348],[109.5996,33.2666],[110.3027,33.1787],[110.5664,33.2666],[110.7422,33.1348],[111.0059,33.2666],[111.5332,32.6074],[112.3242,32.3438],[113.2031,32.4316],[113.4668,32.2998],[113.7305,32.4316],[113.8184,31.8604],[113.9941,31.7725],[114.1699,31.8604],[114.5215,31.7725],[114.6094,31.5527],[114.7852,31.4648],[115.1367,31.5967],[115.2246,31.4209],[115.4004,31.4209],[115.5762,31.2012],[116.0156,31.0254],[115.752,30.6738],[116.1035,30.1904],[116.1035,29.8389],[115.9277,29.707],[115.4883,29.7949],[114.873,29.3994],[114.2578,29.3555],[113.9063,29.0479],[113.7305,29.0918],[113.6426,29.3115],[113.7305,29.5752],[113.5547,29.707],[113.5547,29.8389],[113.0273,29.4434],[112.9395,29.4873],[113.0273,29.751],[112.9395,29.7949],[112.6758,29.5752],[112.5,29.6191],[112.2363,29.5313],[111.7969,29.9268],[110.8301,30.1465],[110.4785,30.0146],[110.6543,29.751],[110.4785,29.6631],[109.7754,29.751],[109.6875,29.6191],[109.5117,29.6191],[109.248,29.1357],[109.0723,29.3555],[108.9844,29.3115],[108.6328,29.8389],[108.457,29.7949],[108.5449,30.2344],[108.457,30.4102],[108.6328,30.5859],[108.8086,30.498],[109.0723,30.6299],[109.1602,30.542],[109.248,30.6299],[109.4238,30.542],[109.8633,30.8936],[110.0391,30.8057],[110.2148,31.1572]]]}},{"type":"Feature","properties":{"id":"52","size":"2000","name":"贵州","cp":[106.6113,26.9385],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[104.1504,27.2461],[104.4141,27.4658],[104.5898,27.334],[105.2051,27.3779],[105.293,27.7295],[105.5566,27.7734],[105.6445,27.6416],[106.3477,27.8174],[106.1719,28.125],[105.9082,28.125],[105.6445,28.4326],[105.9961,28.7402],[106.3477,28.5205],[106.5234,28.5645],[106.4355,28.7842],[106.5234,28.7842],[106.6113,28.6523],[106.6113,28.5205],[106.6992,28.4766],[106.875,28.7842],[107.4023,28.8721],[107.4023,29.1797],[107.5781,29.2236],[107.8418,29.1357],[107.8418,29.0039],[108.2813,29.0918],[108.3691,28.6523],[108.5449,28.6523],[108.5449,28.3887],[108.7207,28.4766],[108.7207,28.2129],[109.0723,28.2129],[109.248,28.4766],[109.3359,28.2568],[109.3359,27.9053],[109.4238,27.5977],[108.8086,27.1143],[108.8965,27.0264],[109.3359,27.1582],[109.5117,27.0264],[109.5117,26.8066],[109.3359,26.7188],[109.4238,26.5869],[109.248,26.3232],[109.4238,26.2793],[109.5117,26.0156],[109.3359,25.708],[108.9844,25.752],[109.0723,25.5322],[108.6328,25.5762],[108.6328,25.3125],[108.3691,25.5322],[108.1934,25.4443],[108.1055,25.2246],[107.8418,25.1367],[107.7539,25.2246],[107.4902,25.2246],[107.2266,25.6201],[106.9629,25.4883],[107.0508,25.2686],[106.875,25.1807],[106.1719,24.9609],[106.1719,24.7852],[105.9961,24.6533],[105.2051,24.9609],[104.6777,24.6094],[104.502,24.7412],[104.6777,24.9609],[104.5898,25.0488],[104.8535,25.2246],[104.3262,25.708],[104.6777,26.4111],[104.4141,26.6748],[103.8867,26.543],[103.7109,26.7627],[103.7109,26.9824],[103.623,27.0264],[103.8867,27.4219],[104.1504,27.2461]]]}},{"type":"Feature","properties":{"id":"37","size":"1500","name":"山东","cp":[118.7402,36.4307],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[115.4883,36.167],[115.3125,36.5186],[115.752,36.9141],[116.0156,37.3535],[116.2793,37.3535],[116.2793,37.5732],[116.4551,37.4854],[116.8066,37.8369],[117.4219,37.8369],[117.9492,38.3203],[118.125,38.1445],[118.916,38.1445],[119.3555,37.6611],[119.0039,37.5293],[119.0039,37.3535],[119.3555,37.1338],[119.707,37.1338],[119.8828,37.3975],[120.498,37.8369],[120.5859,38.1445],[120.9375,38.4521],[121.0254,37.8369],[121.2012,37.6611],[121.9043,37.4854],[122.168,37.6172],[122.2559,37.4854],[122.6074,37.4854],[122.6953,37.3535],[122.6074,36.9141],[122.4316,36.7822],[121.8164,36.8701],[121.7285,36.6943],[121.1133,36.6064],[121.1133,36.4307],[121.377,36.2549],[120.7617,36.167],[120.9375,35.8594],[120.6738,36.0352],[119.707,35.4639],[119.9707,34.9805],[119.3555,35.0244],[119.2676,35.1123],[118.916,35.0244],[118.7402,34.7168],[118.4766,34.6729],[118.3887,34.4092],[118.2129,34.4092],[118.125,34.6289],[117.9492,34.6729],[117.5977,34.4531],[117.334,34.585],[117.2461,34.4531],[116.8066,34.9365],[116.4551,34.8926],[116.3672,34.6289],[116.1914,34.585],[115.5762,34.585],[115.4004,34.8486],[114.7852,35.0684],[115.0488,35.376],[115.2246,35.4199],[115.4883,35.7275],[116.1035,36.0791],[115.3125,35.8154],[115.4883,36.167]]]}},{"type":"Feature","properties":{"id":"36","size":"1700","name":"江西","cp":[115.592151,27.676493],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[114.2578,28.3447],[114.082,28.5645],[114.1699,28.8281],[113.9063,29.0479],[114.2578,29.3555],[114.873,29.3994],[115.4883,29.7949],[115.9277,29.707],[116.1035,29.8389],[116.2793,29.7949],[116.7188,30.0586],[116.8945,29.9268],[116.7188,29.751],[116.7188,29.6191],[117.1582,29.707],[117.0703,29.8389],[117.1582,29.9268],[117.5098,29.6191],[118.0371,29.5752],[118.2129,29.3994],[118.0371,29.1797],[118.0371,29.0479],[118.3887,28.7842],[118.4766,28.3447],[118.4766,28.3008],[118.3008,28.0811],[117.7734,27.8174],[117.5098,27.9932],[116.9824,27.6416],[117.1582,27.29],[117.0703,27.1143],[116.543,26.8066],[116.6309,26.4551],[116.3672,26.2354],[116.4551,26.1035],[116.1914,25.8838],[116.0156,25.2686],[115.8398,25.2246],[115.9277,24.917],[115.752,24.7852],[115.8398,24.5654],[115.4004,24.7852],[114.4336,24.5215],[114.1699,24.6973],[114.4336,24.9609],[114.6973,25.1367],[114.7852,25.2686],[114.6094,25.4004],[113.9941,25.2686],[113.9063,25.4443],[113.9941,26.0596],[114.2578,26.1475],[113.9941,26.1914],[114.082,26.5869],[113.9063,26.6309],[113.9063,26.9385],[113.7305,27.1143],[113.8184,27.29],[113.6426,27.3779],[113.6426,27.5977],[113.7305,27.9492],[114.2578,28.3447]]]}},{"type":"Feature","properties":{"id":"41","size":"1700","name":"河南","cp":[113.0668,33.8818],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.3906,34.585],[110.8301,34.6289],[111.1816,34.8047],[111.5332,34.8486],[111.7969,35.0684],[112.0605,35.0684],[112.0605,35.2881],[112.7637,35.2002],[113.1152,35.332],[113.6426,35.6836],[113.7305,36.3428],[114.873,36.123],[114.9609,36.0791],[115.1367,36.2109],[115.3125,36.0791],[115.4883,36.167],[115.3125,35.8154],[116.1035,36.0791],[115.4883,35.7275],[115.2246,35.4199],[115.0488,35.376],[114.7852,35.0684],[115.4004,34.8486],[115.5762,34.585],[116.1914,34.585],[116.1914,34.4092],[116.543,34.2773],[116.6309,33.9258],[116.1914,33.7061],[116.0156,33.9697],[115.6641,34.0576],[115.5762,33.9258],[115.5762,33.6621],[115.4004,33.5303],[115.3125,33.1787],[114.873,33.1348],[114.873,33.0029],[115.1367,32.8711],[115.2246,32.6074],[115.5762,32.4316],[115.8398,32.5195],[115.9277,31.7725],[115.4883,31.6846],[115.4004,31.4209],[115.2246,31.4209],[115.1367,31.5967],[114.7852,31.4648],[114.6094,31.5527],[114.5215,31.7725],[114.1699,31.8604],[113.9941,31.7725],[113.8184,31.8604],[113.7305,32.4316],[113.4668,32.2998],[113.2031,32.4316],[112.3242,32.3438],[111.5332,32.6074],[111.0059,33.2666],[111.0059,33.5303],[110.6543,33.8379],[110.6543,34.1455],[110.4785,34.2334],[110.3906,34.585]]]}},{"type":"Feature","properties":{"id":"21","size":"1500","name":"辽宁","cp":[122.0438,41.0889],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[119.2676,41.3086],[119.4434,41.6162],[119.2676,41.7041],[119.3555,42.2754],[119.5313,42.3633],[119.8828,42.1875],[120.1465,41.7041],[120.498,42.0996],[121.4648,42.4951],[121.7285,42.4512],[121.9922,42.7148],[122.3438,42.6709],[122.3438,42.8467],[122.7832,42.7148],[123.1348,42.8027],[123.3105,42.9785],[123.5742,43.0225],[123.6621,43.374],[123.8379,43.4619],[124.2773,43.2422],[124.4531,42.8467],[124.7168,43.0664],[124.8926,43.0664],[124.8926,42.8027],[125.332,42.1436],[125.4199,42.0996],[125.332,41.9678],[125.332,41.6602],[125.7715,41.2207],[125.5957,40.9131],[125.6836,40.8691],[124.541,40.21],[124.1016,39.6826],[123.3984,39.6826],[123.1348,39.4189],[123.1348,39.0234],[122.0801,39.0234],[121.5527,38.7158],[121.1133,38.6719],[120.9375,38.9795],[121.377,39.1992],[121.2012,39.5508],[122.0801,40.3857],[121.9922,40.6934],[121.7285,40.8252],[121.2012,40.8252],[120.5859,40.21],[119.8828,39.9463],[119.707,40.1221],[119.5313,40.5615],[119.2676,40.5176],[118.8281,40.8252],[119.2676,41.3086]]]}},{"type":"Feature","properties":{"id":"14","size":"1450","name":"山西","cp":[111.849248,36.857014],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[110.918,38.7158],[111.1816,39.2432],[111.0938,39.375],[111.3574,39.4189],[111.4453,39.6387],[111.9727,39.5947],[112.3242,40.2539],[112.7637,40.166],[113.2031,40.3857],[113.5547,40.3418],[113.8184,40.5176],[114.082,40.5176],[114.082,40.7373],[114.2578,40.6055],[114.3457,40.3857],[114.5215,40.3418],[113.9941,39.9902],[114.3457,39.8584],[114.5215,39.5068],[114.3457,39.0674],[113.9063,39.0234],[113.8184,38.9355],[113.8184,38.8037],[113.5547,38.54],[113.5547,38.2764],[113.8184,38.1445],[113.9941,37.7051],[114.1699,37.6611],[113.7305,37.1338],[113.7305,36.8701],[113.4668,36.6504],[113.7305,36.3428],[113.6426,35.6836],[113.1152,35.332],[112.7637,35.2002],[112.0605,35.2881],[112.0605,35.0684],[111.7969,35.0684],[111.5332,34.8486],[111.1816,34.8047],[110.8301,34.6289],[110.3906,34.585],[110.2148,34.6729],[110.2148,34.8926],[110.5664,35.6396],[110.4785,36.123],[110.3906,37.002],[110.8301,37.6611],[110.4785,37.9688],[110.4785,38.1885],[110.8301,38.4961],[110.918,38.7158]]]}},{"type":"Feature","properties":{"id":"34","size":"1700","name":"安徽","cp":[117.283042,31.26119],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[116.6309,33.9258],[116.543,34.2773],[116.1914,34.4092],[116.1914,34.585],[116.3672,34.6289],[116.8945,34.4092],[117.1582,34.0576],[117.5977,34.0137],[117.7734,33.7061],[118.125,33.75],[117.9492,33.2227],[118.0371,33.1348],[118.2129,33.2227],[118.3008,32.7832],[118.7402,32.7393],[118.916,32.959],[119.1797,32.8271],[119.1797,32.4756],[118.5645,32.5635],[118.6523,32.2119],[118.4766,32.168],[118.3887,31.9482],[118.916,31.5527],[118.7402,31.377],[118.8281,31.2451],[119.3555,31.2891],[119.4434,31.1572],[119.6191,31.1133],[119.6191,31.0693],[119.4434,30.6738],[119.2676,30.6299],[119.3555,30.4102],[118.916,30.3223],[118.916,29.9707],[118.7402,29.707],[118.2129,29.3994],[118.0371,29.5752],[117.5098,29.6191],[117.1582,29.9268],[117.0703,29.8389],[117.1582,29.707],[116.7188,29.6191],[116.7188,29.751],[116.8945,29.9268],[116.7188,30.0586],[116.2793,29.7949],[116.1035,29.8389],[116.1035,30.1904],[115.752,30.6738],[116.0156,31.0254],[115.5762,31.2012],[115.4004,31.4209],[115.4883,31.6846],[115.9277,31.7725],[115.8398,32.5195],[115.5762,32.4316],[115.2246,32.6074],[115.1367,32.8711],[114.873,33.0029],[114.873,33.1348],[115.3125,33.1787],[115.4004,33.5303],[115.5762,33.6621],[115.5762,33.9258],[115.6641,34.0576],[116.0156,33.9697],[116.1914,33.7061],[116.6309,33.9258]]]}},{"type":"Feature","properties":{"id":"35","size":"2000","name":"福建","cp":[118.306239,26.075302],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[118.4766,28.3008],[118.8281,28.2568],[118.7402,28.0371],[118.916,27.4658],[119.2676,27.4219],[119.6191,27.6855],[119.7949,27.29],[120.2344,27.4219],[120.4102,27.1582],[120.7617,27.0264],[120.6738,26.8945],[120.2344,26.8506],[120.2344,26.7188],[120.4102,26.6748],[120.498,26.3672],[120.2344,26.2793],[120.4102,26.1475],[120.0586,26.1914],[119.9707,25.9277],[119.7949,25.9277],[119.9707,25.4004],[119.7949,25.2686],[119.5313,25.1367],[119.4434,25.0049],[119.2676,25.0928],[118.916,24.8291],[118.6523,24.5215],[118.4766,24.5215],[118.4766,24.4336],[118.2129,24.3457],[118.2129,24.1699],[117.8613,23.9941],[117.7734,23.7744],[117.5098,23.5986],[117.1582,23.5547],[116.9824,23.9063],[116.9824,24.1699],[116.7188,24.6533],[116.543,24.6094],[116.3672,24.873],[116.2793,24.7852],[115.9277,24.917],[115.8398,25.2246],[116.0156,25.2686],[116.1914,25.8838],[116.4551,26.1035],[116.3672,26.2354],[116.6309,26.4551],[116.543,26.8066],[117.0703,27.1143],[117.1582,27.29],[116.9824,27.6416],[117.5098,27.9932],[117.7734,27.8174],[118.3008,28.0811],[118.4766,28.3008]]]}},{"type":"Feature","properties":{"id":"33","size":"2100","name":"浙江","cp":[120.498,29.0918],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[118.2129,29.3994],[118.7402,29.707],[118.916,29.9707],[118.916,30.3223],[119.3555,30.4102],[119.2676,30.6299],[119.4434,30.6738],[119.6191,31.0693],[119.6191,31.1133],[119.9707,31.1572],[120.498,30.8057],[120.9375,31.0254],[121.2891,30.6738],[121.9922,30.8057],[122.6953,30.8936],[122.8711,30.7178],[122.959,30.1465],[122.6074,30.1025],[122.6074,29.9268],[122.168,29.5313],[122.3438,28.8721],[121.9922,28.8721],[121.9922,28.4326],[121.7285,28.3447],[121.7285,28.2129],[121.4648,28.2129],[121.5527,28.0371],[121.2891,27.9492],[121.1133,27.4219],[120.6738,27.334],[120.6738,27.1582],[120.9375,27.0264],[120.7617,27.0264],[120.4102,27.1582],[120.2344,27.4219],[119.7949,27.29],[119.6191,27.6855],[119.2676,27.4219],[118.916,27.4658],[118.7402,28.0371],[118.8281,28.2568],[118.4766,28.3008],[118.4766,28.3447],[118.3887,28.7842],[118.0371,29.0479],[118.0371,29.1797],[118.2129,29.3994]]]}},{"type":"Feature","properties":{"id":"32","size":"1950","name":"江苏","cp":[119.767413,33.041544],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[116.3672,34.6289],[116.4551,34.8926],[116.8066,34.9365],[117.2461,34.4531],[117.334,34.585],[117.5977,34.4531],[117.9492,34.6729],[118.125,34.6289],[118.2129,34.4092],[118.3887,34.4092],[118.4766,34.6729],[118.7402,34.7168],[118.916,35.0244],[119.2676,35.1123],[119.3555,35.0244],[119.3555,34.8486],[119.707,34.585],[120.3223,34.3652],[120.9375,33.0469],[121.0254,32.6514],[121.377,32.4756],[121.4648,32.168],[121.9043,31.9922],[121.9922,31.6846],[121.9922,31.5967],[121.2012,31.8604],[121.1133,31.7285],[121.377,31.5088],[121.2012,31.4648],[120.9375,31.0254],[120.498,30.8057],[119.9707,31.1572],[119.6191,31.1133],[119.4434,31.1572],[119.3555,31.2891],[118.8281,31.2451],[118.7402,31.377],[118.916,31.5527],[118.3887,31.9482],[118.4766,32.168],[118.6523,32.2119],[118.5645,32.5635],[119.1797,32.4756],[119.1797,32.8271],[118.916,32.959],[118.7402,32.7393],[118.3008,32.7832],[118.2129,33.2227],[118.0371,33.1348],[117.9492,33.2227],[118.125,33.75],[117.7734,33.7061],[117.5977,34.0137],[117.1582,34.0576],[116.8945,34.4092],[116.3672,34.6289]]]}},{"type":"Feature","properties":{"id":"50","size":"2380","name":"重庆","cp":[107.304962,29.533155],"childNum":40},"geometry":{"type":"Polygon","coordinates":[[[108.5449,31.6846],[108.2813,31.9043],[108.3691,32.168],[108.5449,32.2119],[109.0723,31.9482],[109.248,31.7285],[109.5996,31.7285],[109.7754,31.6846],[109.6875,31.5527],[110.127,31.377],[110.2148,31.1572],[110.0391,30.8057],[109.8633,30.8936],[109.4238,30.542],[109.248,30.6299],[109.1602,30.542],[109.0723,30.6299],[108.8086,30.498],[108.6328,30.5859],[108.457,30.4102],[108.5449,30.2344],[108.457,29.7949],[108.6328,29.8389],[108.9844,29.3115],[109.0723,29.3555],[109.248,29.1357],[109.248,28.4766],[109.0723,28.2129],[108.7207,28.2129],[108.7207,28.4766],[108.5449,28.3887],[108.5449,28.6523],[108.3691,28.6523],[108.2813,29.0918],[107.8418,29.0039],[107.8418,29.1357],[107.5781,29.2236],[107.4023,29.1797],[107.4023,28.8721],[106.875,28.7842],[106.6992,28.4766],[106.6113,28.5205],[106.6113,28.6523],[106.5234,28.7842],[106.4355,28.7842],[106.5234,28.5645],[106.3477,28.5205],[106.2598,28.8721],[105.8203,28.96],[105.7324,29.2676],[105.4688,29.3115],[105.293,29.5313],[105.7324,29.8828],[105.5566,30.1025],[105.6445,30.2783],[105.8203,30.4541],[106.2598,30.1904],[106.6113,30.3223],[106.7871,30.0146],[107.0508,30.0146],[107.4902,30.6299],[107.4023,30.7617],[107.4902,30.8496],[107.9297,30.8496],[108.1934,31.5088],[108.5449,31.6846]]]}},{"type":"Feature","properties":{"id":"64","size":"2100","name":"宁夏","cp":[105.9961,37.3096],"childNum":5},"geometry":{"type":"Polygon","coordinates":[[[104.3262,37.4414],[105.8203,37.793],[105.9082,38.7158],[106.3477,39.2871],[106.7871,39.375],[106.9629,38.9795],[106.5234,38.3203],[106.7871,38.1885],[107.3145,38.1006],[107.666,37.8809],[107.3145,37.6172],[107.3145,37.0898],[106.6113,37.0898],[106.6113,36.7822],[106.4355,36.5625],[106.5234,36.4746],[106.5234,36.2549],[106.875,36.123],[106.9629,35.8154],[106.6992,35.6836],[106.4355,35.6836],[106.5234,35.332],[106.3477,35.2441],[106.2598,35.4199],[106.084,35.376],[105.9961,35.4199],[106.084,35.4639],[105.9961,35.4639],[105.8203,35.5518],[105.7324,35.7275],[105.3809,35.7715],[105.293,35.9912],[105.4688,36.123],[105.2051,36.6943],[105.293,36.8262],[104.8535,37.2217],[104.5898,37.2217],[104.5898,37.4414],[104.3262,37.4414]]]}},{"type":"Feature","properties":{"id":"46","size":"4500","name":"海南","cp":[109.9512,19.2041],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[108.6328,19.3799],[109.0723,19.6436],[109.248,19.9512],[109.5996,20.0391],[110.0391,20.127],[110.3906,20.127],[110.5664,20.2588],[110.6543,20.2588],[111.0938,19.9512],[111.2695,19.9951],[110.6543,19.1602],[110.5664,18.6768],[110.2148,18.5889],[110.0391,18.3691],[109.8633,18.3691],[109.6875,18.1055],[108.9844,18.2813],[108.6328,18.457],[108.6328,19.3799]]]}},{"type":"Feature","properties":{"id":"71","size":"3000","name":"台湾","cp":[120.0254,23.5986],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[121.9043,25.0488],[121.9922,25.0049],[121.8164,24.7412],[121.9043,24.5654],[121.6406,24.0381],[121.377,23.1152],[121.0254,22.6758],[120.8496,22.0605],[120.7617,21.9287],[120.6738,22.3242],[120.2344,22.5879],[120.0586,23.0713],[120.1465,23.6865],[121.0254,25.0488],[121.5527,25.3125],[121.9043,25.0488]]]}},{"type":"Feature","properties":{"id":"11","size":"5000","name":"北京","cp":[116.4551,40.2539],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[117.4219,40.21],[117.334,40.1221],[117.2461,40.0781],[116.8066,39.9902],[116.8945,39.8145],[116.8945,39.6826],[116.8066,39.5947],[116.543,39.5947],[116.3672,39.4629],[116.1914,39.5947],[115.752,39.5068],[115.4883,39.6387],[115.4004,39.9463],[115.9277,40.2539],[115.752,40.5615],[116.1035,40.6055],[116.1914,40.7813],[116.4551,40.7813],[116.3672,40.9131],[116.6309,41.0449],[116.9824,40.6934],[117.4219,40.6494],[117.2461,40.5176],[117.4219,40.21]]]}},{"type":"Feature","properties":{"id":"12","size":"5000","name":"天津","cp":[117.4219,39.4189],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[116.8066,39.5947],[116.8945,39.6826],[117.1582,39.6387],[117.1582,39.8145],[117.2461,40.0781],[117.334,40.1221],[117.4219,40.21],[117.6855,40.0781],[117.6855,39.9902],[117.5098,39.9902],[117.5098,39.7705],[117.6855,39.5947],[117.9492,39.5947],[117.8613,39.4189],[118.0371,39.2432],[118.0371,39.1992],[117.8613,39.1113],[117.5977,38.6279],[117.2461,38.54],[116.7188,38.8037],[116.7188,38.9355],[116.8945,39.1113],[116.8066,39.5947]]]}},{"type":"Feature","properties":{"id":"31","size":"7500","name":"上海","cp":[121.4648,31.2891],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[120.9375,31.0254],[121.2012,31.4648],[121.377,31.5088],[121.1133,31.7285],[121.2012,31.8604],[121.9922,31.5967],[121.9043,31.1572],[121.9922,30.8057],[121.2891,30.6738],[120.9375,31.0254]]]}},{"type":"Feature","properties":{"id":"81","size":"18000","name":"香港","cp":[114.1178,22.3242],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[114.6094,22.4121],[114.5215,22.1484],[114.3457,22.1484],[113.9063,22.1484],[113.8184,22.1924],[113.9063,22.4121],[114.1699,22.5439],[114.3457,22.5439],[114.4336,22.5439],[114.4336,22.4121],[114.6094,22.4121]]]}},{"type":"Feature","properties":{"id":"82","size":"27","name":"澳门","cp":[111.5547,22.1484],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}}]} diff --git a/api/json/industry-data.json b/api/json/industry-data.json new file mode 100644 index 0000000..0d8baa8 --- /dev/null +++ b/api/json/industry-data.json @@ -0,0 +1 @@ +[{"value":1001,"label":"IT服务","children":[{"value":1001000,"label":"计算机软件/硬件/信息服务","children":[]},{"value":1001001,"label":"互联网和相关服务","children":[]},{"value":1001002,"label":"其他","children":[]}],"icon":""},{"value":1002,"label":"制造业","children":[{"value":1002000,"label":"机械/电子","children":[]},{"value":1003000,"label":"服装/纺织","children":[]},{"value":1002002,"label":"汽车","children":[]},{"value":1002005,"label":"金属制品","children":[]},{"value":1003002,"label":"食品/饮料","children":[]},{"value":1003003,"label":"家具/家纺","children":[]},{"value":1002001,"label":"重工制造","children":[]},{"value":1003005,"label":"家电/数码","children":[]},{"value":1002004,"label":"橡胶/塑料","children":[]},{"value":1003004,"label":"日用品/化妆品","children":[]},{"value":1002006,"label":"化学原料制品","children":[]},{"value":1003007,"label":"文教/工美/体育/娱乐用品","children":[]},{"value":1003006,"label":"烟酒/茶","children":[]},{"value":1002007,"label":"非金属矿物","children":[]},{"value":1002003,"label":"其他","children":[]}],"icon":""},{"value":1003,"label":"批发/零售","children":[{"value":1003008,"label":"批发","children":[]},{"value":1003010,"label":"零售","children":[]},{"value":1003001,"label":"超市/便利店/百货商场","children":[]},{"value":1003011,"label":"进出口","children":[]},{"value":1003009,"label":"其他","children":[]}],"icon":""},{"value":1004,"label":"生活服务","children":[{"value":1004001,"label":"餐饮","children":[]},{"value":1004004,"label":"居民服务","children":[]},{"value":1004002,"label":"租赁和商务服务","children":[]},{"value":1004000,"label":"酒店/住宿","children":[]},{"value":1004003,"label":"其他","children":[]}],"icon":""},{"value":1005,"label":"文化/体育/娱乐业","children":[{"value":1005001,"label":"文化/体育","children":[]},{"value":1005002,"label":"娱乐/旅游","children":[]},{"value":1005000,"label":"新闻传媒","children":[]},{"value":1005003,"label":"其他","children":[]}],"icon":""},{"value":1006,"label":"建筑/房地产","children":[{"value":1006001,"label":"建筑业","children":[]},{"value":1006002,"label":"建材装修","children":[]},{"value":1006000,"label":"房地产","children":[]},{"value":1006003,"label":"其他","children":[]}],"icon":""},{"value":1007,"label":"教育","children":[{"value":1007000,"label":"学前教育","children":[],"desc":"如:托儿所、幼儿园"},{"value":1007001,"label":"初中等教育","children":[],"desc":"如:小学、初中、高中、职高"},{"value":1007002,"label":"高等教育","children":[],"desc":"如:大学、高职、高专"},{"value":1007003,"label":"培训机构","children":[]},{"value":1007004,"label":"其他","children":[]}],"icon":""},{"value":1008,"label":"运输/物流/仓储","children":[{"value":1008003,"label":"物流/仓储","children":[]},{"value":1008000,"label":"道路/铁路运输","children":[]},{"value":1008004,"label":"邮政/快递","children":[]},{"value":1008001,"label":"航空运输","children":[]},{"value":1008002,"label":"水上运输","children":[]},{"value":1008005,"label":"其他","children":[]}],"icon":""},{"value":1009,"label":"医疗","children":[{"value":1009000,"label":"医院/医疗机构","children":[]},{"value":1009003,"label":"医疗器械","children":[]},{"value":1009001,"label":"医药制造","children":[]},{"value":1009002,"label":"医药流通","children":[]},{"value":1009004,"label":"其他","children":[]}],"icon":""},{"value":1010,"label":"政府","children":[{"value":1010000,"label":"党政机关","children":[]},{"value":1010001,"label":"国家权力/行政机构","children":[]},{"value":1010002,"label":"检察院/法院/公安","children":[]},{"value":1010003,"label":"民政/人社/交通/卫生","children":[]},{"value":1010004,"label":"发改委/经信委/商务局/统计局","children":[]},{"value":1010005,"label":"国土/规划","children":[]},{"value":1010006,"label":"税务/海关/工商/环保/物价/药品","children":[]},{"value":1010007,"label":"政协/民主党派","children":[]},{"value":1010008,"label":"地方政府","children":[]},{"value":1010009,"label":"其他","children":[]}],"icon":""},{"value":1011,"label":"金融","children":[{"value":1011000,"label":"保险","children":[]},{"value":1011001,"label":"银行","children":[]},{"value":1011002,"label":"证券/投资/基金","children":[]},{"value":1011003,"label":"其他","children":[]}],"icon":""},{"value":1012,"label":"能源/采矿","children":[{"value":1014003,"label":"电力/热力/燃气/水供应业","children":[]},{"value":1012003,"label":"石油/天然气","children":[]},{"value":1012002,"label":"煤炭","children":[]},{"value":1012001,"label":"有色金属","children":[]},{"value":1012000,"label":"钢铁","children":[]},{"value":1012004,"label":"其他","children":[]}],"icon":""},{"value":1013,"label":"农林渔牧","children":[{"value":1013000,"label":"农林渔牧","children":[]}],"icon":""},{"value":1014,"label":"其他行业","children":[{"value":1014000,"label":"科学研究和技术服务业","children":[]},{"value":1014002,"label":"社会组织","children":[]},{"value":1014001,"label":"水利和环境管理","children":[]},{"value":1014004,"label":"国际组织","children":[]},{"value":1014005,"label":"其他","children":[]}],"icon":""}] diff --git a/api/json/regions-data.json b/api/json/regions-data.json new file mode 100644 index 0000000..4cbd130 --- /dev/null +++ b/api/json/regions-data.json @@ -0,0 +1 @@ +[{"label":"北京","value":"110000","children":[{"value":"110100","label":"北京市","children":[{"value":"110101","label":"东城区"},{"value":"110102","label":"西城区"},{"value":"110103","label":"崇文区"},{"value":"110104","label":"宣武区"},{"value":"110105","label":"朝阳区"},{"value":"110106","label":"丰台区"},{"value":"110107","label":"石景山区"},{"value":"110108","label":"海淀区"},{"value":"110109","label":"门头沟区"},{"value":"110111","label":"房山区"},{"value":"110112","label":"通州区"},{"value":"110113","label":"顺义区"},{"value":"110114","label":"昌平区"},{"value":"110115","label":"大兴区"},{"value":"110116","label":"怀柔区"},{"value":"110117","label":"平谷区"},{"value":"110228","label":"密云县"},{"value":"110229","label":"延庆县"}]}]},{"label":"天津","value":"120000","children":[{"value":"120100","label":"天津市","children":[{"value":"120101","label":"和平区"},{"value":"120102","label":"河东区"},{"value":"120103","label":"河西区"},{"value":"120104","label":"南开区"},{"value":"120105","label":"河北区"},{"value":"120106","label":"红桥区"},{"value":"120107","label":"塘沽区"},{"value":"120108","label":"汉沽区"},{"value":"120109","label":"大港区"},{"value":"120110","label":"东丽区"},{"value":"120111","label":"西青区"},{"value":"120112","label":"津南区"},{"value":"120113","label":"北辰区"},{"value":"120114","label":"武清区"},{"value":"120115","label":"宝坻区"},{"value":"120116","label":"滨海新区"},{"value":"120221","label":"宁河县"},{"value":"120223","label":"静海县"},{"value":"120225","label":"蓟县"}]}]},{"label":"河北省","value":"130000","children":[{"value":"130100","label":"石家庄市","children":[{"value":"130102","label":"长安区"},{"value":"130103","label":"桥东区"},{"value":"130104","label":"桥西区"},{"value":"130105","label":"新华区"},{"value":"130107","label":"井陉矿区"},{"value":"130108","label":"裕华区"},{"value":"130121","label":"井陉县"},{"value":"130123","label":"正定县"},{"value":"130124","label":"栾城县"},{"value":"130125","label":"行唐县"},{"value":"130126","label":"灵寿县"},{"value":"130127","label":"高邑县"},{"value":"130128","label":"深泽县"},{"value":"130129","label":"赞皇县"},{"value":"130130","label":"无极县"},{"value":"130131","label":"平山县"},{"value":"130132","label":"元氏县"},{"value":"130133","label":"赵县"},{"value":"130181","label":"辛集市"},{"value":"130182","label":"藁城市"},{"value":"130183","label":"晋州市"},{"value":"130184","label":"新乐市"},{"value":"130185","label":"鹿泉市"}]},{"value":"130200","label":"唐山市","children":[{"value":"130202","label":"路南区"},{"value":"130203","label":"路北区"},{"value":"130204","label":"古冶区"},{"value":"130205","label":"开平区"},{"value":"130207","label":"丰南区"},{"value":"130208","label":"丰润区"},{"value":"130223","label":"滦县"},{"value":"130224","label":"滦南县"},{"value":"130225","label":"乐亭县"},{"value":"130227","label":"迁西县"},{"value":"130229","label":"玉田县"},{"value":"130230","label":"唐海县"},{"value":"130281","label":"遵化市"},{"value":"130283","label":"迁安市"}]},{"value":"130300","label":"秦皇岛市","children":[{"value":"130302","label":"海港区"},{"value":"130303","label":"山海关区"},{"value":"130304","label":"北戴河区"},{"value":"130321","label":"青龙满族自治县"},{"value":"130322","label":"昌黎县"},{"value":"130323","label":"抚宁县"},{"value":"130324","label":"卢龙县"},{"value":"130399","label":"经济技术开发区"}]},{"value":"130400","label":"邯郸市","children":[{"value":"130402","label":"邯山区"},{"value":"130403","label":"丛台区"},{"value":"130404","label":"复兴区"},{"value":"130406","label":"峰峰矿区"},{"value":"130421","label":"邯郸县"},{"value":"130423","label":"临漳县"},{"value":"130424","label":"成安县"},{"value":"130425","label":"大名县"},{"value":"130426","label":"涉县"},{"value":"130427","label":"磁县"},{"value":"130428","label":"肥乡县"},{"value":"130429","label":"永年县"},{"value":"130430","label":"邱县"},{"value":"130431","label":"鸡泽县"},{"value":"130432","label":"广平县"},{"value":"130433","label":"馆陶县"},{"value":"130434","label":"魏县"},{"value":"130435","label":"曲周县"},{"value":"130481","label":"武安市"}]},{"value":"130500","label":"邢台市","children":[{"value":"130502","label":"桥东区"},{"value":"130503","label":"桥西区"},{"value":"130521","label":"邢台县"},{"value":"130522","label":"临城县"},{"value":"130523","label":"内丘县"},{"value":"130524","label":"柏乡县"},{"value":"130525","label":"隆尧县"},{"value":"130526","label":"任县"},{"value":"130527","label":"南和县"},{"value":"130528","label":"宁晋县"},{"value":"130529","label":"巨鹿县"},{"value":"130530","label":"新河县"},{"value":"130531","label":"广宗县"},{"value":"130532","label":"平乡县"},{"value":"130533","label":"威县"},{"value":"130534","label":"清河县"},{"value":"130535","label":"临西县"},{"value":"130581","label":"南宫市"},{"value":"130582","label":"沙河市"}]},{"value":"130600","label":"保定市","children":[{"value":"130602","label":"新市区"},{"value":"130603","label":"北市区"},{"value":"130604","label":"南市区"},{"value":"130621","label":"满城县"},{"value":"130622","label":"清苑县"},{"value":"130623","label":"涞水县"},{"value":"130624","label":"阜平县"},{"value":"130625","label":"徐水县"},{"value":"130626","label":"定兴县"},{"value":"130627","label":"唐县"},{"value":"130628","label":"高阳县"},{"value":"130629","label":"容城县"},{"value":"130630","label":"涞源县"},{"value":"130631","label":"望都县"},{"value":"130632","label":"安新县"},{"value":"130633","label":"易县"},{"value":"130634","label":"曲阳县"},{"value":"130635","label":"蠡县"},{"value":"130636","label":"顺平县"},{"value":"130637","label":"博野县"},{"value":"130638","label":"雄县"},{"value":"130681","label":"涿州市"},{"value":"130682","label":"定州市"},{"value":"130683","label":"安国市"},{"value":"130684","label":"高碑店市"},{"value":"130698","label":"高开区"}]},{"value":"130700","label":"张家口市","children":[{"value":"130702","label":"桥东区"},{"value":"130703","label":"桥西区"},{"value":"130705","label":"宣化区"},{"value":"130706","label":"下花园区"},{"value":"130721","label":"宣化县"},{"value":"130722","label":"张北县"},{"value":"130723","label":"康保县"},{"value":"130724","label":"沽源县"},{"value":"130725","label":"尚义县"},{"value":"130726","label":"蔚县"},{"value":"130727","label":"阳原县"},{"value":"130728","label":"怀安县"},{"value":"130729","label":"万全县"},{"value":"130730","label":"怀来县"},{"value":"130731","label":"涿鹿县"},{"value":"130732","label":"赤城县"},{"value":"130733","label":"崇礼县"}]},{"value":"130800","label":"承德市","children":[{"value":"130802","label":"双桥区"},{"value":"130803","label":"双滦区"},{"value":"130804","label":"鹰手营子矿区"},{"value":"130821","label":"承德县"},{"value":"130822","label":"兴隆县"},{"value":"130823","label":"平泉县"},{"value":"130824","label":"滦平县"},{"value":"130825","label":"隆化县"},{"value":"130826","label":"丰宁满族自治县"},{"value":"130827","label":"宽城满族自治县"},{"value":"130828","label":"围场满族蒙古族自治县"}]},{"value":"130900","label":"沧州市","children":[{"value":"130902","label":"新华区"},{"value":"130903","label":"运河区"},{"value":"130921","label":"沧县"},{"value":"130922","label":"青县"},{"value":"130923","label":"东光县"},{"value":"130924","label":"海兴县"},{"value":"130925","label":"盐山县"},{"value":"130926","label":"肃宁县"},{"value":"130927","label":"南皮县"},{"value":"130928","label":"吴桥县"},{"value":"130929","label":"献县"},{"value":"130930","label":"孟村回族自治县"},{"value":"130981","label":"泊头市"},{"value":"130982","label":"任丘市"},{"value":"130983","label":"黄骅市"},{"value":"130984","label":"河间市"}]},{"value":"131000","label":"廊坊市","children":[{"value":"131002","label":"安次区"},{"value":"131003","label":"广阳区"},{"value":"131022","label":"固安县"},{"value":"131023","label":"永清县"},{"value":"131024","label":"香河县"},{"value":"131025","label":"大城县"},{"value":"131026","label":"文安县"},{"value":"131028","label":"大厂回族自治县"},{"value":"131051","label":"开发区"},{"value":"131052","label":"燕郊经济技术开发区"},{"value":"131081","label":"霸州市"},{"value":"131082","label":"三河市"}]},{"value":"131100","label":"衡水市","children":[{"value":"131102","label":"桃城区"},{"value":"131121","label":"枣强县"},{"value":"131122","label":"武邑县"},{"value":"131123","label":"武强县"},{"value":"131124","label":"饶阳县"},{"value":"131125","label":"安平县"},{"value":"131126","label":"故城县"},{"value":"131127","label":"景县"},{"value":"131128","label":"阜城县"},{"value":"131181","label":"冀州市"},{"value":"131182","label":"深州市"}]}]},{"label":"山西省","value":"140000","children":[{"value":"140100","label":"太原市","children":[{"value":"140105","label":"小店区"},{"value":"140106","label":"迎泽区"},{"value":"140107","label":"杏花岭区"},{"value":"140108","label":"尖草坪区"},{"value":"140109","label":"万柏林区"},{"value":"140110","label":"晋源区"},{"value":"140121","label":"清徐县"},{"value":"140122","label":"阳曲县"},{"value":"140123","label":"娄烦县"},{"value":"140181","label":"古交市"}]},{"value":"140200","label":"大同市","children":[{"value":"140202","label":"城区"},{"value":"140203","label":"矿区"},{"value":"140211","label":"南郊区"},{"value":"140212","label":"新荣区"},{"value":"140221","label":"阳高县"},{"value":"140222","label":"天镇县"},{"value":"140223","label":"广灵县"},{"value":"140224","label":"灵丘县"},{"value":"140225","label":"浑源县"},{"value":"140226","label":"左云县"},{"value":"140227","label":"大同县"}]},{"value":"140300","label":"阳泉市","children":[{"value":"140302","label":"城区"},{"value":"140303","label":"矿区"},{"value":"140311","label":"郊区"},{"value":"140321","label":"平定县"},{"value":"140322","label":"盂县"}]},{"value":"140400","label":"长治市","children":[{"value":"140421","label":"长治县"},{"value":"140423","label":"襄垣县"},{"value":"140424","label":"屯留县"},{"value":"140425","label":"平顺县"},{"value":"140426","label":"黎城县"},{"value":"140427","label":"壶关县"},{"value":"140428","label":"长子县"},{"value":"140429","label":"武乡县"},{"value":"140430","label":"沁县"},{"value":"140431","label":"沁源县"},{"value":"140481","label":"潞城市"},{"value":"140482","label":"城区"},{"value":"140483","label":"郊区"},{"value":"140484","label":"高新区"}]},{"value":"140500","label":"晋城市","children":[{"value":"140502","label":"城区"},{"value":"140521","label":"沁水县"},{"value":"140522","label":"阳城县"},{"value":"140524","label":"陵川县"},{"value":"140525","label":"泽州县"},{"value":"140581","label":"高平市"}]},{"value":"140600","label":"朔州市","children":[{"value":"140602","label":"朔城区"},{"value":"140603","label":"平鲁区"},{"value":"140621","label":"山阴县"},{"value":"140622","label":"应县"},{"value":"140623","label":"右玉县"},{"value":"140624","label":"怀仁县"}]},{"value":"140700","label":"晋中市","children":[{"value":"140702","label":"榆次区"},{"value":"140721","label":"榆社县"},{"value":"140722","label":"左权县"},{"value":"140723","label":"和顺县"},{"value":"140724","label":"昔阳县"},{"value":"140725","label":"寿阳县"},{"value":"140726","label":"太谷县"},{"value":"140727","label":"祁县"},{"value":"140728","label":"平遥县"},{"value":"140729","label":"灵石县"},{"value":"140781","label":"介休市"}]},{"value":"140800","label":"运城市","children":[{"value":"140802","label":"盐湖区"},{"value":"140821","label":"临猗县"},{"value":"140822","label":"万荣县"},{"value":"140823","label":"闻喜县"},{"value":"140824","label":"稷山县"},{"value":"140825","label":"新绛县"},{"value":"140826","label":"绛县"},{"value":"140827","label":"垣曲县"},{"value":"140828","label":"夏县"},{"value":"140829","label":"平陆县"},{"value":"140830","label":"芮城县"},{"value":"140881","label":"永济市"},{"value":"140882","label":"河津市"}]},{"value":"140900","label":"忻州市","children":[{"value":"140902","label":"忻府区"},{"value":"140921","label":"定襄县"},{"value":"140922","label":"五台县"},{"value":"140923","label":"代县"},{"value":"140924","label":"繁峙县"},{"value":"140925","label":"宁武县"},{"value":"140926","label":"静乐县"},{"value":"140927","label":"神池县"},{"value":"140928","label":"五寨县"},{"value":"140929","label":"岢岚县"},{"value":"140930","label":"河曲县"},{"value":"140931","label":"保德县"},{"value":"140932","label":"偏关县"},{"value":"140981","label":"原平市"}]},{"value":"141000","label":"临汾市","children":[{"value":"141002","label":"尧都区"},{"value":"141021","label":"曲沃县"},{"value":"141022","label":"翼城县"},{"value":"141023","label":"襄汾县"},{"value":"141024","label":"洪洞县"},{"value":"141025","label":"古县"},{"value":"141026","label":"安泽县"},{"value":"141027","label":"浮山县"},{"value":"141028","label":"吉县"},{"value":"141029","label":"乡宁县"},{"value":"141030","label":"大宁县"},{"value":"141031","label":"隰县"},{"value":"141032","label":"永和县"},{"value":"141033","label":"蒲县"},{"value":"141034","label":"汾西县"},{"value":"141081","label":"侯马市"},{"value":"141082","label":"霍州市"}]},{"value":"141100","label":"吕梁市","children":[{"value":"141102","label":"离石区"},{"value":"141121","label":"文水县"},{"value":"141122","label":"交城县"},{"value":"141123","label":"兴县"},{"value":"141124","label":"临县"},{"value":"141125","label":"柳林县"},{"value":"141126","label":"石楼县"},{"value":"141127","label":"岚县"},{"value":"141128","label":"方山县"},{"value":"141129","label":"中阳县"},{"value":"141130","label":"交口县"},{"value":"141181","label":"孝义市"},{"value":"141182","label":"汾阳市"}]}]},{"label":"内蒙古自治区","value":"150000","children":[{"value":"150100","label":"呼和浩特市","children":[{"value":"150102","label":"新城区"},{"value":"150103","label":"回民区"},{"value":"150104","label":"玉泉区"},{"value":"150105","label":"赛罕区"},{"value":"150121","label":"土默特左旗"},{"value":"150122","label":"托克托县"},{"value":"150123","label":"和林格尔县"},{"value":"150124","label":"清水河县"},{"value":"150125","label":"武川县"}]},{"value":"150200","label":"包头市","children":[{"value":"150202","label":"东河区"},{"value":"150203","label":"昆都仑区"},{"value":"150204","label":"青山区"},{"value":"150205","label":"石拐区"},{"value":"150206","label":"白云矿区"},{"value":"150207","label":"九原区"},{"value":"150221","label":"土默特右旗"},{"value":"150222","label":"固阳县"},{"value":"150223","label":"达尔罕茂明安联合旗"}]},{"value":"150300","label":"乌海市","children":[{"value":"150302","label":"海勃湾区"},{"value":"150303","label":"海南区"},{"value":"150304","label":"乌达区"}]},{"value":"150400","label":"赤峰市","children":[{"value":"150402","label":"红山区"},{"value":"150403","label":"元宝山区"},{"value":"150404","label":"松山区"},{"value":"150421","label":"阿鲁科尔沁旗"},{"value":"150422","label":"巴林左旗"},{"value":"150423","label":"巴林右旗"},{"value":"150424","label":"林西县"},{"value":"150425","label":"克什克腾旗"},{"value":"150426","label":"翁牛特旗"},{"value":"150428","label":"喀喇沁旗"},{"value":"150429","label":"宁城县"},{"value":"150430","label":"敖汉旗"}]},{"value":"150500","label":"通辽市","children":[{"value":"150502","label":"科尔沁区"},{"value":"150521","label":"科尔沁左翼中旗"},{"value":"150522","label":"科尔沁左翼后旗"},{"value":"150523","label":"开鲁县"},{"value":"150524","label":"库伦旗"},{"value":"150525","label":"奈曼旗"},{"value":"150526","label":"扎鲁特旗"},{"value":"150581","label":"霍林郭勒市"}]},{"value":"150600","label":"鄂尔多斯市","children":[{"value":"150602","label":"东胜区"},{"value":"150621","label":"达拉特旗"},{"value":"150622","label":"准格尔旗"},{"value":"150623","label":"鄂托克前旗"},{"value":"150624","label":"鄂托克旗"},{"value":"150625","label":"杭锦旗"},{"value":"150626","label":"乌审旗"},{"value":"150627","label":"伊金霍洛旗"}]},{"value":"150700","label":"呼伦贝尔市","children":[{"value":"150702","label":"海拉尔区"},{"value":"150721","label":"阿荣旗"},{"value":"150722","label":"莫力达瓦达斡尔族自治旗"},{"value":"150723","label":"鄂伦春自治旗"},{"value":"150724","label":"鄂温克族自治旗"},{"value":"150725","label":"陈巴尔虎旗"},{"value":"150726","label":"新巴尔虎左旗"},{"value":"150727","label":"新巴尔虎右旗"},{"value":"150781","label":"满洲里市"},{"value":"150782","label":"牙克石市"},{"value":"150783","label":"扎兰屯市"},{"value":"150784","label":"额尔古纳市"},{"value":"150785","label":"根河市"}]},{"value":"150800","label":"巴彦淖尔市","children":[{"value":"150802","label":"临河区"},{"value":"150821","label":"五原县"},{"value":"150822","label":"磴口县"},{"value":"150823","label":"乌拉特前旗"},{"value":"150824","label":"乌拉特中旗"},{"value":"150825","label":"乌拉特后旗"},{"value":"150826","label":"杭锦后旗"}]},{"value":"150900","label":"乌兰察布市","children":[{"value":"150902","label":"集宁区"},{"value":"150921","label":"卓资县"},{"value":"150922","label":"化德县"},{"value":"150923","label":"商都县"},{"value":"150924","label":"兴和县"},{"value":"150925","label":"凉城县"},{"value":"150926","label":"察哈尔右翼前旗"},{"value":"150927","label":"察哈尔右翼中旗"},{"value":"150928","label":"察哈尔右翼后旗"},{"value":"150929","label":"四子王旗"},{"value":"150981","label":"丰镇市"}]},{"value":"152200","label":"兴安盟","children":[{"value":"152201","label":"乌兰浩特市"},{"value":"152202","label":"阿尔山市"},{"value":"152221","label":"科尔沁右翼前旗"},{"value":"152222","label":"科尔沁右翼中旗"},{"value":"152223","label":"扎赉特旗"},{"value":"152224","label":"突泉县"}]},{"value":"152500","label":"锡林郭勒盟","children":[{"value":"152501","label":"二连浩特市"},{"value":"152502","label":"锡林浩特市"},{"value":"152522","label":"阿巴嘎旗"},{"value":"152523","label":"苏尼特左旗"},{"value":"152524","label":"苏尼特右旗"},{"value":"152525","label":"东乌珠穆沁旗"},{"value":"152526","label":"西乌珠穆沁旗"},{"value":"152527","label":"太仆寺旗"},{"value":"152528","label":"镶黄旗"},{"value":"152529","label":"正镶白旗"},{"value":"152530","label":"正蓝旗"},{"value":"152531","label":"多伦县"}]},{"value":"152900","label":"阿拉善盟","children":[{"value":"152921","label":"阿拉善左旗"},{"value":"152922","label":"阿拉善右旗"},{"value":"152923","label":"额济纳旗"}]}]},{"label":"辽宁省","value":"210000","children":[{"value":"210100","label":"沈阳市","children":[{"value":"210102","label":"和平区"},{"value":"210103","label":"沈河区"},{"value":"210104","label":"大东区"},{"value":"210105","label":"皇姑区"},{"value":"210106","label":"铁西区"},{"value":"210111","label":"苏家屯区"},{"value":"210112","label":"东陵区"},{"value":"210113","label":"新城子区"},{"value":"210114","label":"于洪区"},{"value":"210122","label":"辽中县"},{"value":"210123","label":"康平县"},{"value":"210124","label":"法库县"},{"value":"210181","label":"新民市"},{"value":"210182","label":"浑南新区"},{"value":"210183","label":"张士开发区"},{"value":"210184","label":"沈北新区"}]},{"value":"210200","label":"大连市","children":[{"value":"210202","label":"中山区"},{"value":"210203","label":"西岗区"},{"value":"210204","label":"沙河口区"},{"value":"210211","label":"甘井子区"},{"value":"210212","label":"旅顺口区"},{"value":"210213","label":"金州区"},{"value":"210224","label":"长海县"},{"value":"210251","label":"开发区"},{"value":"210281","label":"瓦房店市"},{"value":"210282","label":"普兰店市"},{"value":"210283","label":"庄河市"},{"value":"210297","label":"岭前区"}]},{"value":"210300","label":"鞍山市","children":[{"value":"210302","label":"铁东区"},{"value":"210303","label":"铁西区"},{"value":"210304","label":"立山区"},{"value":"210311","label":"千山区"},{"value":"210321","label":"台安县"},{"value":"210323","label":"岫岩满族自治县"},{"value":"210351","label":"高新区"},{"value":"210381","label":"海城市"}]},{"value":"210400","label":"抚顺市","children":[{"value":"210402","label":"新抚区"},{"value":"210403","label":"东洲区"},{"value":"210404","label":"望花区"},{"value":"210411","label":"顺城区"},{"value":"210421","label":"抚顺县"},{"value":"210422","label":"新宾满族自治县"},{"value":"210423","label":"清原满族自治县"}]},{"value":"210500","label":"本溪市","children":[{"value":"210502","label":"平山区"},{"value":"210503","label":"溪湖区"},{"value":"210504","label":"明山区"},{"value":"210505","label":"南芬区"},{"value":"210521","label":"本溪满族自治县"},{"value":"210522","label":"桓仁满族自治县"}]},{"value":"210600","label":"丹东市","children":[{"value":"210602","label":"元宝区"},{"value":"210603","label":"振兴区"},{"value":"210604","label":"振安区"},{"value":"210624","label":"宽甸满族自治县"},{"value":"210681","label":"东港市"},{"value":"210682","label":"凤城市"}]},{"value":"210700","label":"锦州市","children":[{"value":"210702","label":"古塔区"},{"value":"210703","label":"凌河区"},{"value":"210711","label":"太和区"},{"value":"210726","label":"黑山县"},{"value":"210727","label":"义县"},{"value":"210781","label":"凌海市"},{"value":"210782","label":"北镇市"}]},{"value":"210800","label":"营口市","children":[{"value":"210802","label":"站前区"},{"value":"210803","label":"西市区"},{"value":"210804","label":"鲅鱼圈区"},{"value":"210811","label":"老边区"},{"value":"210881","label":"盖州市"},{"value":"210882","label":"大石桥市"}]},{"value":"210900","label":"阜新市","children":[{"value":"210902","label":"海州区"},{"value":"210903","label":"新邱区"},{"value":"210904","label":"太平区"},{"value":"210905","label":"清河门区"},{"value":"210911","label":"细河区"},{"value":"210921","label":"阜新蒙古族自治县"},{"value":"210922","label":"彰武县"}]},{"value":"211000","label":"辽阳市","children":[{"value":"211002","label":"白塔区"},{"value":"211003","label":"文圣区"},{"value":"211004","label":"宏伟区"},{"value":"211005","label":"弓长岭区"},{"value":"211011","label":"太子河区"},{"value":"211021","label":"辽阳县"},{"value":"211081","label":"灯塔市"}]},{"value":"211100","label":"盘锦市","children":[{"value":"211102","label":"双台子区"},{"value":"211103","label":"兴隆台区"},{"value":"211121","label":"大洼县"},{"value":"211122","label":"盘山县"}]},{"value":"211200","label":"铁岭市","children":[{"value":"211202","label":"银州区"},{"value":"211204","label":"清河区"},{"value":"211221","label":"铁岭县"},{"value":"211223","label":"西丰县"},{"value":"211224","label":"昌图县"},{"value":"211281","label":"调兵山市"},{"value":"211282","label":"开原市"}]},{"value":"211300","label":"朝阳市","children":[{"value":"211302","label":"双塔区"},{"value":"211303","label":"龙城区"},{"value":"211321","label":"朝阳县"},{"value":"211322","label":"建平县"},{"value":"211324","label":"喀喇沁左翼蒙古族自治县"},{"value":"211381","label":"北票市"},{"value":"211382","label":"凌源市"}]},{"value":"211400","label":"葫芦岛市","children":[{"value":"211402","label":"连山区"},{"value":"211403","label":"龙港区"},{"value":"211404","label":"南票区"},{"value":"211421","label":"绥中县"},{"value":"211422","label":"建昌县"},{"value":"211481","label":"兴城市"}]}]},{"label":"吉林省","value":"220000","children":[{"value":"220100","label":"长春市","children":[{"value":"220102","label":"南关区"},{"value":"220103","label":"宽城区"},{"value":"220104","label":"朝阳区"},{"value":"220105","label":"二道区"},{"value":"220106","label":"绿园区"},{"value":"220112","label":"双阳区"},{"value":"220122","label":"农安县"},{"value":"220181","label":"九台市"},{"value":"220182","label":"榆树市"},{"value":"220183","label":"德惠市"},{"value":"220184","label":"高新技术产业开发区"},{"value":"220185","label":"汽车产业开发区"},{"value":"220186","label":"经济技术开发区"},{"value":"220187","label":"净月旅游开发区"}]},{"value":"220200","label":"吉林市","children":[{"value":"220202","label":"昌邑区"},{"value":"220203","label":"龙潭区"},{"value":"220204","label":"船营区"},{"value":"220211","label":"丰满区"},{"value":"220221","label":"永吉县"},{"value":"220281","label":"蛟河市"},{"value":"220282","label":"桦甸市"},{"value":"220283","label":"舒兰市"},{"value":"220284","label":"磐石市"}]},{"value":"220300","label":"四平市","children":[{"value":"220302","label":"铁西区"},{"value":"220303","label":"铁东区"},{"value":"220322","label":"梨树县"},{"value":"220323","label":"伊通满族自治县"},{"value":"220381","label":"公主岭市"},{"value":"220382","label":"双辽市"}]},{"value":"220400","label":"辽源市","children":[{"value":"220402","label":"龙山区"},{"value":"220403","label":"西安区"},{"value":"220421","label":"东丰县"},{"value":"220422","label":"东辽县"}]},{"value":"220500","label":"通化市","children":[{"value":"220502","label":"东昌区"},{"value":"220503","label":"二道江区"},{"value":"220521","label":"通化县"},{"value":"220523","label":"辉南县"},{"value":"220524","label":"柳河县"},{"value":"220581","label":"梅河口市"},{"value":"220582","label":"集安市"}]},{"value":"220600","label":"白山市","children":[{"value":"220602","label":"八道江区"},{"value":"220621","label":"抚松县"},{"value":"220622","label":"靖宇县"},{"value":"220623","label":"长白朝鲜族自治县"},{"value":"220625","label":"江源市"},{"value":"220681","label":"临江市"}]},{"value":"220700","label":"松原市","children":[{"value":"220702","label":"宁江区"},{"value":"220721","label":"前郭尔罗斯蒙古族自治县"},{"value":"220722","label":"长岭县"},{"value":"220723","label":"乾安县"},{"value":"220724","label":"扶余县"}]},{"value":"220800","label":"白城市","children":[{"value":"220802","label":"洮北区"},{"value":"220821","label":"镇赉县"},{"value":"220822","label":"通榆县"},{"value":"220881","label":"洮南市"},{"value":"220882","label":"大安市"}]},{"value":"222400","label":"延边朝鲜族自治州","children":[{"value":"222401","label":"延吉市"},{"value":"222402","label":"图们市"},{"value":"222403","label":"敦化市"},{"value":"222404","label":"珲春市"},{"value":"222405","label":"龙井市"},{"value":"222406","label":"和龙市"},{"value":"222424","label":"汪清县"},{"value":"222426","label":"安图县"}]}]},{"label":"黑龙江省","value":"230000","children":[{"value":"230100","label":"哈尔滨市","children":[{"value":"230102","label":"道里区"},{"value":"230103","label":"南岗区"},{"value":"230104","label":"道外区"},{"value":"230106","label":"香坊区"},{"value":"230107","label":"动力区"},{"value":"230108","label":"平房区"},{"value":"230109","label":"松北区"},{"value":"230111","label":"呼兰区"},{"value":"230123","label":"依兰县"},{"value":"230124","label":"方正县"},{"value":"230125","label":"宾县"},{"value":"230126","label":"巴彦县"},{"value":"230127","label":"木兰县"},{"value":"230128","label":"通河县"},{"value":"230129","label":"延寿县"},{"value":"230181","label":"阿城市"},{"value":"230182","label":"双城市"},{"value":"230183","label":"尚志市"},{"value":"230184","label":"五常市"},{"value":"230185","label":"阿城市"}]},{"value":"230200","label":"齐齐哈尔市","children":[{"value":"230202","label":"龙沙区"},{"value":"230203","label":"建华区"},{"value":"230204","label":"铁锋区"},{"value":"230205","label":"昂昂溪区"},{"value":"230206","label":"富拉尔基区"},{"value":"230207","label":"碾子山区"},{"value":"230208","label":"梅里斯达斡尔族区"},{"value":"230221","label":"龙江县"},{"value":"230223","label":"依安县"},{"value":"230224","label":"泰来县"},{"value":"230225","label":"甘南县"},{"value":"230227","label":"富裕县"},{"value":"230229","label":"克山县"},{"value":"230230","label":"克东县"},{"value":"230231","label":"拜泉县"},{"value":"230281","label":"讷河市"}]},{"value":"230300","label":"鸡西市","children":[{"value":"230302","label":"鸡冠区"},{"value":"230303","label":"恒山区"},{"value":"230304","label":"滴道区"},{"value":"230305","label":"梨树区"},{"value":"230306","label":"城子河区"},{"value":"230307","label":"麻山区"},{"value":"230321","label":"鸡东县"},{"value":"230381","label":"虎林市"},{"value":"230382","label":"密山市"}]},{"value":"230400","label":"鹤岗市","children":[{"value":"230402","label":"向阳区"},{"value":"230403","label":"工农区"},{"value":"230404","label":"南山区"},{"value":"230405","label":"兴安区"},{"value":"230406","label":"东山区"},{"value":"230407","label":"兴山区"},{"value":"230421","label":"萝北县"},{"value":"230422","label":"绥滨县"}]},{"value":"230500","label":"双鸭山市","children":[{"value":"230502","label":"尖山区"},{"value":"230503","label":"岭东区"},{"value":"230505","label":"四方台区"},{"value":"230506","label":"宝山区"},{"value":"230521","label":"集贤县"},{"value":"230522","label":"友谊县"},{"value":"230523","label":"宝清县"},{"value":"230524","label":"饶河县"}]},{"value":"230600","label":"大庆市","children":[{"value":"230602","label":"萨尔图区"},{"value":"230603","label":"龙凤区"},{"value":"230604","label":"让胡路区"},{"value":"230605","label":"红岗区"},{"value":"230606","label":"大同区"},{"value":"230621","label":"肇州县"},{"value":"230622","label":"肇源县"},{"value":"230623","label":"林甸县"},{"value":"230624","label":"杜尔伯特蒙古族自治县"}]},{"value":"230700","label":"伊春市","children":[{"value":"230702","label":"伊春区"},{"value":"230703","label":"南岔区"},{"value":"230704","label":"友好区"},{"value":"230705","label":"西林区"},{"value":"230706","label":"翠峦区"},{"value":"230707","label":"新青区"},{"value":"230708","label":"美溪区"},{"value":"230709","label":"金山屯区"},{"value":"230710","label":"五营区"},{"value":"230711","label":"乌马河区"},{"value":"230712","label":"汤旺河区"},{"value":"230713","label":"带岭区"},{"value":"230714","label":"乌伊岭区"},{"value":"230715","label":"红星区"},{"value":"230716","label":"上甘岭区"},{"value":"230722","label":"嘉荫县"},{"value":"230781","label":"铁力市"}]},{"value":"230800","label":"佳木斯市","children":[{"value":"230802","label":"永红区"},{"value":"230803","label":"向阳区"},{"value":"230804","label":"前进区"},{"value":"230805","label":"东风区"},{"value":"230811","label":"郊区"},{"value":"230822","label":"桦南县"},{"value":"230826","label":"桦川县"},{"value":"230828","label":"汤原县"},{"value":"230833","label":"抚远县"},{"value":"230881","label":"同江市"},{"value":"230882","label":"富锦市"}]},{"value":"230900","label":"七台河市","children":[{"value":"230902","label":"新兴区"},{"value":"230903","label":"桃山区"},{"value":"230904","label":"茄子河区"},{"value":"230921","label":"勃利县"}]},{"value":"231000","label":"牡丹江市","children":[{"value":"231002","label":"东安区"},{"value":"231003","label":"阳明区"},{"value":"231004","label":"爱民区"},{"value":"231005","label":"西安区"},{"value":"231024","label":"东宁县"},{"value":"231025","label":"林口县"},{"value":"231081","label":"绥芬河市"},{"value":"231083","label":"海林市"},{"value":"231084","label":"宁安市"},{"value":"231085","label":"穆棱市"}]},{"value":"231100","label":"黑河市","children":[{"value":"231102","label":"爱辉区"},{"value":"231121","label":"嫩江县"},{"value":"231123","label":"逊克县"},{"value":"231124","label":"孙吴县"},{"value":"231181","label":"北安市"},{"value":"231182","label":"五大连池市"}]},{"value":"231200","label":"绥化市","children":[{"value":"231202","label":"北林区"},{"value":"231221","label":"望奎县"},{"value":"231222","label":"兰西县"},{"value":"231223","label":"青冈县"},{"value":"231224","label":"庆安县"},{"value":"231225","label":"明水县"},{"value":"231226","label":"绥棱县"},{"value":"231281","label":"安达市"},{"value":"231282","label":"肇东市"},{"value":"231283","label":"海伦市"}]},{"value":"232700","label":"大兴安岭地区","children":[{"value":"232721","label":"呼玛县"},{"value":"232722","label":"塔河县"},{"value":"232723","label":"漠河县"},{"value":"232724","label":"加格达奇区"}]}]},{"label":"上海","value":"310000","children":[{"value":"310100","label":"上海市","children":[{"value":"310101","label":"黄浦区"},{"value":"310103","label":"卢湾区"},{"value":"310104","label":"徐汇区"},{"value":"310105","label":"长宁区"},{"value":"310106","label":"静安区"},{"value":"310107","label":"普陀区"},{"value":"310108","label":"闸北区"},{"value":"310109","label":"虹口区"},{"value":"310110","label":"杨浦区"},{"value":"310112","label":"闵行区"},{"value":"310113","label":"宝山区"},{"value":"310114","label":"嘉定区"},{"value":"310115","label":"浦东新区"},{"value":"310116","label":"金山区"},{"value":"310117","label":"松江区"},{"value":"310118","label":"青浦区"},{"value":"310119","label":"南汇区"},{"value":"310120","label":"奉贤区"},{"value":"310152","label":"川沙区"},{"value":"310230","label":"崇明县"}]}]},{"label":"江苏省","value":"320000","children":[{"value":"320100","label":"南京市","children":[{"value":"320102","label":"玄武区"},{"value":"320103","label":"白下区"},{"value":"320104","label":"秦淮区"},{"value":"320105","label":"建邺区"},{"value":"320106","label":"鼓楼区"},{"value":"320107","label":"下关区"},{"value":"320111","label":"浦口区"},{"value":"320113","label":"栖霞区"},{"value":"320114","label":"雨花台区"},{"value":"320115","label":"江宁区"},{"value":"320116","label":"六合区"},{"value":"320124","label":"溧水县"},{"value":"320125","label":"高淳县"}]},{"value":"320200","label":"无锡市","children":[{"value":"320202","label":"崇安区"},{"value":"320203","label":"南长区"},{"value":"320204","label":"北塘区"},{"value":"320205","label":"锡山区"},{"value":"320206","label":"惠山区"},{"value":"320211","label":"滨湖区"},{"value":"320281","label":"江阴市"},{"value":"320282","label":"宜兴市"},{"value":"320296","label":"新区"}]},{"value":"320300","label":"徐州市","children":[{"value":"320302","label":"鼓楼区"},{"value":"320303","label":"云龙区"},{"value":"320304","label":"九里区"},{"value":"320305","label":"贾汪区"},{"value":"320311","label":"泉山区"},{"value":"320321","label":"丰县"},{"value":"320322","label":"沛县"},{"value":"320323","label":"铜山县"},{"value":"320324","label":"睢宁县"},{"value":"320381","label":"新沂市"},{"value":"320382","label":"邳州市"}]},{"value":"320400","label":"常州市","children":[{"value":"320402","label":"天宁区"},{"value":"320404","label":"钟楼区"},{"value":"320405","label":"戚墅堰区"},{"value":"320411","label":"新北区"},{"value":"320412","label":"武进区"},{"value":"320481","label":"溧阳市"},{"value":"320482","label":"金坛市"}]},{"value":"320500","label":"苏州市","children":[{"value":"320502","label":"沧浪区"},{"value":"320503","label":"平江区"},{"value":"320504","label":"金阊区"},{"value":"320505","label":"虎丘区"},{"value":"320506","label":"吴中区"},{"value":"320507","label":"相城区"},{"value":"320581","label":"常熟市"},{"value":"320582","label":"张家港市"},{"value":"320583","label":"昆山市"},{"value":"320584","label":"吴江市"},{"value":"320585","label":"太仓市"},{"value":"320594","label":"新区"},{"value":"320595","label":"园区"}]},{"value":"320600","label":"南通市","children":[{"value":"320602","label":"崇川区"},{"value":"320611","label":"港闸区"},{"value":"320612","label":"通州区"},{"value":"320621","label":"海安县"},{"value":"320623","label":"如东县"},{"value":"320681","label":"启东市"},{"value":"320682","label":"如皋市"},{"value":"320683","label":"通州市"},{"value":"320684","label":"海门市"},{"value":"320693","label":"开发区"}]},{"value":"320700","label":"连云港市","children":[{"value":"320703","label":"连云区"},{"value":"320705","label":"新浦区"},{"value":"320706","label":"海州区"},{"value":"320721","label":"赣榆县"},{"value":"320722","label":"东海县"},{"value":"320723","label":"灌云县"},{"value":"320724","label":"灌南县"}]},{"value":"320800","label":"淮安市","children":[{"value":"320802","label":"清河区"},{"value":"320803","label":"楚州区"},{"value":"320804","label":"淮阴区"},{"value":"320811","label":"清浦区"},{"value":"320826","label":"涟水县"},{"value":"320829","label":"洪泽县"},{"value":"320830","label":"盱眙县"},{"value":"320831","label":"金湖县"}]},{"value":"320900","label":"盐城市","children":[{"value":"320902","label":"亭湖区"},{"value":"320903","label":"盐都区"},{"value":"320921","label":"响水县"},{"value":"320922","label":"滨海县"},{"value":"320923","label":"阜宁县"},{"value":"320924","label":"射阳县"},{"value":"320925","label":"建湖县"},{"value":"320981","label":"东台市"},{"value":"320982","label":"大丰市"}]},{"value":"321000","label":"扬州市","children":[{"value":"321002","label":"广陵区"},{"value":"321003","label":"邗江区"},{"value":"321011","label":"维扬区"},{"value":"321023","label":"宝应县"},{"value":"321081","label":"仪征市"},{"value":"321084","label":"高邮市"},{"value":"321088","label":"江都市"},{"value":"321092","label":"经济开发区"}]},{"value":"321100","label":"镇江市","children":[{"value":"321102","label":"京口区"},{"value":"321111","label":"润州区"},{"value":"321112","label":"丹徒区"},{"value":"321181","label":"丹阳市"},{"value":"321182","label":"扬中市"},{"value":"321183","label":"句容市"}]},{"value":"321200","label":"泰州市","children":[{"value":"321202","label":"海陵区"},{"value":"321203","label":"高港区"},{"value":"321281","label":"兴化市"},{"value":"321282","label":"靖江市"},{"value":"321283","label":"泰兴市"},{"value":"321284","label":"姜堰市"}]},{"value":"321300","label":"宿迁市","children":[{"value":"321302","label":"宿城区"},{"value":"321311","label":"宿豫区"},{"value":"321322","label":"沭阳县"},{"value":"321323","label":"泗阳县"},{"value":"321324","label":"泗洪县"}]}]},{"label":"浙江省","value":"330000","children":[{"value":"330100","label":"杭州市","children":[{"value":"330102","label":"上城区"},{"value":"330103","label":"下城区"},{"value":"330104","label":"江干区"},{"value":"330105","label":"拱墅区"},{"value":"330106","label":"西湖区"},{"value":"330108","label":"滨江区"},{"value":"330109","label":"萧山区"},{"value":"330110","label":"余杭区"},{"value":"330122","label":"桐庐县"},{"value":"330127","label":"淳安县"},{"value":"330182","label":"建德市"},{"value":"330183","label":"富阳市"},{"value":"330185","label":"临安市"}]},{"value":"330200","label":"宁波市","children":[{"value":"330203","label":"海曙区"},{"value":"330204","label":"江东区"},{"value":"330205","label":"江北区"},{"value":"330206","label":"北仑区"},{"value":"330211","label":"镇海区"},{"value":"330212","label":"鄞州区"},{"value":"330225","label":"象山县"},{"value":"330226","label":"宁海县"},{"value":"330281","label":"余姚市"},{"value":"330282","label":"慈溪市"},{"value":"330283","label":"奉化市"}]},{"value":"330300","label":"温州市","children":[{"value":"330302","label":"鹿城区"},{"value":"330303","label":"龙湾区"},{"value":"330304","label":"瓯海区"},{"value":"330322","label":"洞头县"},{"value":"330324","label":"永嘉县"},{"value":"330326","label":"平阳县"},{"value":"330327","label":"苍南县"},{"value":"330328","label":"文成县"},{"value":"330329","label":"泰顺县"},{"value":"330381","label":"瑞安市"},{"value":"330382","label":"乐清市"}]},{"value":"330400","label":"嘉兴市","children":[{"value":"330402","label":"南湖区"},{"value":"330411","label":"秀洲区"},{"value":"330421","label":"嘉善县"},{"value":"330424","label":"海盐县"},{"value":"330481","label":"海宁市"},{"value":"330482","label":"平湖市"},{"value":"330483","label":"桐乡市"}]},{"value":"330500","label":"湖州市","children":[{"value":"330502","label":"吴兴区"},{"value":"330503","label":"南浔区"},{"value":"330521","label":"德清县"},{"value":"330522","label":"长兴县"},{"value":"330523","label":"安吉县"}]},{"value":"330600","label":"绍兴市","children":[{"value":"330602","label":"越城区"},{"value":"330621","label":"绍兴县"},{"value":"330624","label":"新昌县"},{"value":"330681","label":"诸暨市"},{"value":"330682","label":"上虞市"},{"value":"330683","label":"嵊州市"}]},{"value":"330700","label":"金华市","children":[{"value":"330702","label":"婺城区"},{"value":"330703","label":"金东区"},{"value":"330723","label":"武义县"},{"value":"330726","label":"浦江县"},{"value":"330727","label":"磐安县"},{"value":"330781","label":"兰溪市"},{"value":"330782","label":"义乌市"},{"value":"330783","label":"东阳市"},{"value":"330784","label":"永康市"}]},{"value":"330800","label":"衢州市","children":[{"value":"330802","label":"柯城区"},{"value":"330803","label":"衢江区"},{"value":"330822","label":"常山县"},{"value":"330824","label":"开化县"},{"value":"330825","label":"龙游县"},{"value":"330881","label":"江山市"}]},{"value":"330900","label":"舟山市","children":[{"value":"330902","label":"定海区"},{"value":"330903","label":"普陀区"},{"value":"330921","label":"岱山县"},{"value":"330922","label":"嵊泗县"}]},{"value":"331000","label":"台州市","children":[{"value":"331002","label":"椒江区"},{"value":"331003","label":"黄岩区"},{"value":"331004","label":"路桥区"},{"value":"331021","label":"玉环县"},{"value":"331022","label":"三门县"},{"value":"331023","label":"天台县"},{"value":"331024","label":"仙居县"},{"value":"331081","label":"温岭市"},{"value":"331082","label":"临海市"}]},{"value":"331100","label":"丽水市","children":[{"value":"331102","label":"莲都区"},{"value":"331121","label":"青田县"},{"value":"331122","label":"缙云县"},{"value":"331123","label":"遂昌县"},{"value":"331124","label":"松阳县"},{"value":"331125","label":"云和县"},{"value":"331126","label":"庆元县"},{"value":"331127","label":"景宁畲族自治县"},{"value":"331181","label":"龙泉市"}]}]},{"label":"安徽省","value":"340000","children":[{"value":"340100","label":"合肥市","children":[{"value":"340102","label":"瑶海区"},{"value":"340103","label":"庐阳区"},{"value":"340104","label":"蜀山区"},{"value":"340111","label":"包河区"},{"value":"340121","label":"长丰县"},{"value":"340122","label":"肥东县"},{"value":"340123","label":"肥西县"},{"value":"340151","label":"高新区"},{"value":"340191","label":"中区"},{"value":"341400","label":"巢湖市"},{"value":"341402","label":"居巢区"},{"value":"341421","label":"庐江县"}]},{"value":"340200","label":"芜湖市","children":[{"value":"340202","label":"镜湖区"},{"value":"340203","label":"弋江区"},{"value":"340207","label":"鸠江区"},{"value":"340208","label":"三山区"},{"value":"340221","label":"芜湖县"},{"value":"340222","label":"繁昌县"},{"value":"340223","label":"南陵县"},{"value":"341422","label":"无为县"}]},{"value":"340300","label":"蚌埠市","children":[{"value":"340302","label":"龙子湖区"},{"value":"340303","label":"蚌山区"},{"value":"340304","label":"禹会区"},{"value":"340311","label":"淮上区"},{"value":"340321","label":"怀远县"},{"value":"340322","label":"五河县"},{"value":"340323","label":"固镇县"}]},{"value":"340400","label":"淮南市","children":[{"value":"340402","label":"大通区"},{"value":"340403","label":"田家庵区"},{"value":"340404","label":"谢家集区"},{"value":"340405","label":"八公山区"},{"value":"340406","label":"潘集区"},{"value":"340421","label":"凤台县"}]},{"value":"340500","label":"马鞍山市","children":[{"value":"340502","label":"金家庄区"},{"value":"340503","label":"花山区"},{"value":"340504","label":"雨山区"},{"value":"340521","label":"当涂县"},{"value":"341423","label":"含山县"},{"value":"341424","label":"和县"}]},{"value":"340600","label":"淮北市","children":[{"value":"340602","label":"杜集区"},{"value":"340603","label":"相山区"},{"value":"340604","label":"烈山区"},{"value":"340621","label":"濉溪县"}]},{"value":"340700","label":"铜陵市","children":[{"value":"340702","label":"铜官山区"},{"value":"340703","label":"狮子山区"},{"value":"340711","label":"郊区"},{"value":"340721","label":"铜陵县"}]},{"value":"340800","label":"安庆市","children":[{"value":"340802","label":"迎江区"},{"value":"340803","label":"大观区"},{"value":"340811","label":"宜秀区"},{"value":"340822","label":"怀宁县"},{"value":"340823","label":"枞阳县"},{"value":"340824","label":"潜山县"},{"value":"340825","label":"太湖县"},{"value":"340826","label":"宿松县"},{"value":"340827","label":"望江县"},{"value":"340828","label":"岳西县"},{"value":"340881","label":"桐城市"}]},{"value":"341000","label":"黄山市","children":[{"value":"341002","label":"屯溪区"},{"value":"341003","label":"黄山区"},{"value":"341004","label":"徽州区"},{"value":"341021","label":"歙县"},{"value":"341022","label":"休宁县"},{"value":"341023","label":"黟县"},{"value":"341024","label":"祁门县"}]},{"value":"341100","label":"滁州市","children":[{"value":"341102","label":"琅琊区"},{"value":"341103","label":"南谯区"},{"value":"341122","label":"来安县"},{"value":"341124","label":"全椒县"},{"value":"341125","label":"定远县"},{"value":"341126","label":"凤阳县"},{"value":"341181","label":"天长市"},{"value":"341182","label":"明光市"}]},{"value":"341200","label":"阜阳市","children":[{"value":"341202","label":"颍州区"},{"value":"341203","label":"颍东区"},{"value":"341204","label":"颍泉区"},{"value":"341221","label":"临泉县"},{"value":"341222","label":"太和县"},{"value":"341225","label":"阜南县"},{"value":"341226","label":"颍上县"},{"value":"341282","label":"界首市"}]},{"value":"341300","label":"宿州市","children":[{"value":"341302","label":"埇桥区"},{"value":"341321","label":"砀山县"},{"value":"341322","label":"萧县"},{"value":"341323","label":"灵璧县"},{"value":"341324","label":"泗县"}]},{"value":"341500","label":"六安市","children":[{"value":"341502","label":"金安区"},{"value":"341503","label":"裕安区"},{"value":"341521","label":"寿县"},{"value":"341522","label":"霍邱县"},{"value":"341523","label":"舒城县"},{"value":"341524","label":"金寨县"},{"value":"341525","label":"霍山县"}]},{"value":"341600","label":"亳州市","children":[{"value":"341602","label":"谯城区"},{"value":"341621","label":"涡阳县"},{"value":"341622","label":"蒙城县"},{"value":"341623","label":"利辛县"}]},{"value":"341700","label":"池州市","children":[{"value":"341702","label":"贵池区"},{"value":"341721","label":"东至县"},{"value":"341722","label":"石台县"},{"value":"341723","label":"青阳县"}]},{"value":"341800","label":"宣城市","children":[{"value":"341802","label":"宣州区"},{"value":"341821","label":"郎溪县"},{"value":"341822","label":"广德县"},{"value":"341823","label":"泾县"},{"value":"341824","label":"绩溪县"},{"value":"341825","label":"旌德县"},{"value":"341881","label":"宁国市"}]}]},{"label":"福建省","value":"350000","children":[{"value":"350100","label":"福州市","children":[{"value":"350102","label":"鼓楼区"},{"value":"350103","label":"台江区"},{"value":"350104","label":"仓山区"},{"value":"350105","label":"马尾区"},{"value":"350111","label":"晋安区"},{"value":"350121","label":"闽侯县"},{"value":"350122","label":"连江县"},{"value":"350123","label":"罗源县"},{"value":"350124","label":"闽清县"},{"value":"350125","label":"永泰县"},{"value":"350128","label":"平潭县"},{"value":"350181","label":"福清市"},{"value":"350182","label":"长乐市"}]},{"value":"350200","label":"厦门市","children":[{"value":"350203","label":"思明区"},{"value":"350205","label":"海沧区"},{"value":"350206","label":"湖里区"},{"value":"350211","label":"集美区"},{"value":"350212","label":"同安区"},{"value":"350213","label":"翔安区"}]},{"value":"350300","label":"莆田市","children":[{"value":"350302","label":"城厢区"},{"value":"350303","label":"涵江区"},{"value":"350304","label":"荔城区"},{"value":"350305","label":"秀屿区"},{"value":"350322","label":"仙游县"}]},{"value":"350400","label":"三明市","children":[{"value":"350402","label":"梅列区"},{"value":"350403","label":"三元区"},{"value":"350421","label":"明溪县"},{"value":"350423","label":"清流县"},{"value":"350424","label":"宁化县"},{"value":"350425","label":"大田县"},{"value":"350426","label":"尤溪县"},{"value":"350427","label":"沙县"},{"value":"350428","label":"将乐县"},{"value":"350429","label":"泰宁县"},{"value":"350430","label":"建宁县"},{"value":"350481","label":"永安市"}]},{"value":"350500","label":"泉州市","children":[{"value":"350502","label":"鲤城区"},{"value":"350503","label":"丰泽区"},{"value":"350504","label":"洛江区"},{"value":"350505","label":"泉港区"},{"value":"350521","label":"惠安县"},{"value":"350524","label":"安溪县"},{"value":"350525","label":"永春县"},{"value":"350526","label":"德化县"},{"value":"350527","label":"金门县"},{"value":"350581","label":"石狮市"},{"value":"350582","label":"晋江市"},{"value":"350583","label":"南安市"}]},{"value":"350600","label":"漳州市","children":[{"value":"350602","label":"芗城区"},{"value":"350603","label":"龙文区"},{"value":"350622","label":"云霄县"},{"value":"350623","label":"漳浦县"},{"value":"350624","label":"诏安县"},{"value":"350625","label":"长泰县"},{"value":"350626","label":"东山县"},{"value":"350627","label":"南靖县"},{"value":"350628","label":"平和县"},{"value":"350629","label":"华安县"},{"value":"350681","label":"龙海市"}]},{"value":"350700","label":"南平市","children":[{"value":"350702","label":"延平区"},{"value":"350721","label":"顺昌县"},{"value":"350722","label":"浦城县"},{"value":"350723","label":"光泽县"},{"value":"350724","label":"松溪县"},{"value":"350725","label":"政和县"},{"value":"350781","label":"邵武市"},{"value":"350782","label":"武夷山市"},{"value":"350783","label":"建瓯市"},{"value":"350784","label":"建阳市"}]},{"value":"350800","label":"龙岩市","children":[{"value":"350802","label":"新罗区"},{"value":"350821","label":"长汀县"},{"value":"350822","label":"永定县"},{"value":"350823","label":"上杭县"},{"value":"350824","label":"武平县"},{"value":"350825","label":"连城县"},{"value":"350881","label":"漳平市"}]},{"value":"350900","label":"宁德市","children":[{"value":"350902","label":"蕉城区"},{"value":"350921","label":"霞浦县"},{"value":"350922","label":"古田县"},{"value":"350923","label":"屏南县"},{"value":"350924","label":"寿宁县"},{"value":"350925","label":"周宁县"},{"value":"350926","label":"柘荣县"},{"value":"350981","label":"福安市"},{"value":"350982","label":"福鼎市"}]}]},{"label":"江西省","value":"360000","children":[{"value":"360100","label":"南昌市","children":[{"value":"360102","label":"东湖区"},{"value":"360103","label":"西湖区"},{"value":"360104","label":"青云谱区"},{"value":"360105","label":"湾里区"},{"value":"360111","label":"青山湖区"},{"value":"360121","label":"南昌县"},{"value":"360122","label":"新建县"},{"value":"360123","label":"安义县"},{"value":"360124","label":"进贤县"},{"value":"360125","label":"红谷滩新区"},{"value":"360126","label":"经济技术开发区"},{"value":"360127","label":"昌北区"}]},{"value":"360200","label":"景德镇市","children":[{"value":"360202","label":"昌江区"},{"value":"360203","label":"珠山区"},{"value":"360222","label":"浮梁县"},{"value":"360281","label":"乐平市"}]},{"value":"360300","label":"萍乡市","children":[{"value":"360302","label":"安源区"},{"value":"360313","label":"湘东区"},{"value":"360321","label":"莲花县"},{"value":"360322","label":"上栗县"},{"value":"360323","label":"芦溪县"}]},{"value":"360400","label":"九江市","children":[{"value":"360402","label":"庐山区"},{"value":"360403","label":"浔阳区"},{"value":"360421","label":"九江县"},{"value":"360423","label":"武宁县"},{"value":"360424","label":"修水县"},{"value":"360425","label":"永修县"},{"value":"360426","label":"德安县"},{"value":"360427","label":"星子县"},{"value":"360428","label":"都昌县"},{"value":"360429","label":"湖口县"},{"value":"360430","label":"彭泽县"},{"value":"360481","label":"瑞昌市"}]},{"value":"360500","label":"新余市","children":[{"value":"360502","label":"渝水区"},{"value":"360521","label":"分宜县"}]},{"value":"360600","label":"鹰潭市","children":[{"value":"360602","label":"月湖区"},{"value":"360622","label":"余江县"},{"value":"360681","label":"贵溪市"}]},{"value":"360700","label":"赣州市","children":[{"value":"360702","label":"章贡区"},{"value":"360721","label":"赣县"},{"value":"360722","label":"信丰县"},{"value":"360723","label":"大余县"},{"value":"360724","label":"上犹县"},{"value":"360725","label":"崇义县"},{"value":"360726","label":"安远县"},{"value":"360727","label":"龙南县"},{"value":"360728","label":"定南县"},{"value":"360729","label":"全南县"},{"value":"360730","label":"宁都县"},{"value":"360731","label":"于都县"},{"value":"360732","label":"兴国县"},{"value":"360733","label":"会昌县"},{"value":"360734","label":"寻乌县"},{"value":"360735","label":"石城县"},{"value":"360751","label":"黄金区"},{"value":"360781","label":"瑞金市"},{"value":"360782","label":"南康市"}]},{"value":"360800","label":"吉安市","children":[{"value":"360802","label":"吉州区"},{"value":"360803","label":"青原区"},{"value":"360821","label":"吉安县"},{"value":"360822","label":"吉水县"},{"value":"360823","label":"峡江县"},{"value":"360824","label":"新干县"},{"value":"360825","label":"永丰县"},{"value":"360826","label":"泰和县"},{"value":"360827","label":"遂川县"},{"value":"360828","label":"万安县"},{"value":"360829","label":"安福县"},{"value":"360830","label":"永新县"},{"value":"360881","label":"井冈山市"}]},{"value":"360900","label":"宜春市","children":[{"value":"360902","label":"袁州区"},{"value":"360921","label":"奉新县"},{"value":"360922","label":"万载县"},{"value":"360923","label":"上高县"},{"value":"360924","label":"宜丰县"},{"value":"360925","label":"靖安县"},{"value":"360926","label":"铜鼓县"},{"value":"360981","label":"丰城市"},{"value":"360982","label":"樟树市"},{"value":"360983","label":"高安市"}]},{"value":"361000","label":"抚州市","children":[{"value":"361002","label":"临川区"},{"value":"361021","label":"南城县"},{"value":"361022","label":"黎川县"},{"value":"361023","label":"南丰县"},{"value":"361024","label":"崇仁县"},{"value":"361025","label":"乐安县"},{"value":"361026","label":"宜黄县"},{"value":"361027","label":"金溪县"},{"value":"361028","label":"资溪县"},{"value":"361029","label":"东乡县"},{"value":"361030","label":"广昌县"}]},{"value":"361100","label":"上饶市","children":[{"value":"361102","label":"信州区"},{"value":"361121","label":"上饶县"},{"value":"361122","label":"广丰县"},{"value":"361123","label":"玉山县"},{"value":"361124","label":"铅山县"},{"value":"361125","label":"横峰县"},{"value":"361126","label":"弋阳县"},{"value":"361127","label":"余干县"},{"value":"361128","label":"鄱阳县"},{"value":"361129","label":"万年县"},{"value":"361130","label":"婺源县"},{"value":"361181","label":"德兴市"}]}]},{"label":"山东省","value":"370000","children":[{"value":"370100","label":"济南市","children":[{"value":"370102","label":"历下区"},{"value":"370103","label":"市中区"},{"value":"370104","label":"槐荫区"},{"value":"370105","label":"天桥区"},{"value":"370112","label":"历城区"},{"value":"370113","label":"长清区"},{"value":"370124","label":"平阴县"},{"value":"370125","label":"济阳县"},{"value":"370126","label":"商河县"},{"value":"370181","label":"章丘市"}]},{"value":"370200","label":"青岛市","children":[{"value":"370202","label":"市南区"},{"value":"370203","label":"市北区"},{"value":"370205","label":"四方区"},{"value":"370211","label":"黄岛区"},{"value":"370212","label":"崂山区"},{"value":"370213","label":"李沧区"},{"value":"370214","label":"城阳区"},{"value":"370251","label":"开发区"},{"value":"370281","label":"胶州市"},{"value":"370282","label":"即墨市"},{"value":"370283","label":"平度市"},{"value":"370284","label":"胶南市"},{"value":"370285","label":"莱西市"}]},{"value":"370300","label":"淄博市","children":[{"value":"370302","label":"淄川区"},{"value":"370303","label":"张店区"},{"value":"370304","label":"博山区"},{"value":"370305","label":"临淄区"},{"value":"370306","label":"周村区"},{"value":"370321","label":"桓台县"},{"value":"370322","label":"高青县"},{"value":"370323","label":"沂源县"}]},{"value":"370400","label":"枣庄市","children":[{"value":"370402","label":"市中区"},{"value":"370403","label":"薛城区"},{"value":"370404","label":"峄城区"},{"value":"370405","label":"台儿庄区"},{"value":"370406","label":"山亭区"},{"value":"370481","label":"滕州市"}]},{"value":"370500","label":"东营市","children":[{"value":"370502","label":"东营区"},{"value":"370503","label":"河口区"},{"value":"370521","label":"垦利县"},{"value":"370522","label":"利津县"},{"value":"370523","label":"广饶县"},{"value":"370589","label":"西城区"},{"value":"370590","label":"东城区"}]},{"value":"370600","label":"烟台市","children":[{"value":"370602","label":"芝罘区"},{"value":"370611","label":"福山区"},{"value":"370612","label":"牟平区"},{"value":"370613","label":"莱山区"},{"value":"370634","label":"长岛县"},{"value":"370681","label":"龙口市"},{"value":"370682","label":"莱阳市"},{"value":"370683","label":"莱州市"},{"value":"370684","label":"蓬莱市"},{"value":"370685","label":"招远市"},{"value":"370686","label":"栖霞市"},{"value":"370687","label":"海阳市"}]},{"value":"370700","label":"潍坊市","children":[{"value":"370702","label":"潍城区"},{"value":"370703","label":"寒亭区"},{"value":"370704","label":"坊子区"},{"value":"370705","label":"奎文区"},{"value":"370724","label":"临朐县"},{"value":"370725","label":"昌乐县"},{"value":"370751","label":"开发区"},{"value":"370781","label":"青州市"},{"value":"370782","label":"诸城市"},{"value":"370783","label":"寿光市"},{"value":"370784","label":"安丘市"},{"value":"370785","label":"高密市"},{"value":"370786","label":"昌邑市"}]},{"value":"370800","label":"济宁市","children":[{"value":"370802","label":"市中区"},{"value":"370811","label":"任城区"},{"value":"370826","label":"微山县"},{"value":"370827","label":"鱼台县"},{"value":"370828","label":"金乡县"},{"value":"370829","label":"嘉祥县"},{"value":"370830","label":"汶上县"},{"value":"370831","label":"泗水县"},{"value":"370832","label":"梁山县"},{"value":"370881","label":"曲阜市"},{"value":"370882","label":"兖州市"},{"value":"370883","label":"邹城市"}]},{"value":"370900","label":"泰安市","children":[{"value":"370902","label":"泰山区"},{"value":"370903","label":"岱岳区"},{"value":"370921","label":"宁阳县"},{"value":"370923","label":"东平县"},{"value":"370982","label":"新泰市"},{"value":"370983","label":"肥城市"}]},{"value":"371000","label":"威海市","children":[{"value":"371002","label":"环翠区"},{"value":"371081","label":"文登市"},{"value":"371082","label":"荣成市"},{"value":"371083","label":"乳山市"}]},{"value":"371100","label":"日照市","children":[{"value":"371102","label":"东港区"},{"value":"371103","label":"岚山区"},{"value":"371121","label":"五莲县"},{"value":"371122","label":"莒县"}]},{"value":"371200","label":"莱芜市","children":[{"value":"371202","label":"莱城区"},{"value":"371203","label":"钢城区"}]},{"value":"371300","label":"临沂市","children":[{"value":"371302","label":"兰山区"},{"value":"371311","label":"罗庄区"},{"value":"371312","label":"河东区"},{"value":"371321","label":"沂南县"},{"value":"371322","label":"郯城县"},{"value":"371323","label":"沂水县"},{"value":"371324","label":"苍山县"},{"value":"371325","label":"费县"},{"value":"371326","label":"平邑县"},{"value":"371327","label":"莒南县"},{"value":"371328","label":"蒙阴县"},{"value":"371329","label":"临沭县"}]},{"value":"371400","label":"德州市","children":[{"value":"371402","label":"德城区"},{"value":"371421","label":"陵县"},{"value":"371422","label":"宁津县"},{"value":"371423","label":"庆云县"},{"value":"371424","label":"临邑县"},{"value":"371425","label":"齐河县"},{"value":"371426","label":"平原县"},{"value":"371427","label":"夏津县"},{"value":"371428","label":"武城县"},{"value":"371451","label":"开发区"},{"value":"371481","label":"乐陵市"},{"value":"371482","label":"禹城市"}]},{"value":"371500","label":"聊城市","children":[{"value":"371502","label":"东昌府区"},{"value":"371521","label":"阳谷县"},{"value":"371522","label":"莘县"},{"value":"371523","label":"茌平县"},{"value":"371524","label":"东阿县"},{"value":"371525","label":"冠县"},{"value":"371526","label":"高唐县"},{"value":"371581","label":"临清市"}]},{"value":"371600","label":"滨州市","children":[{"value":"371602","label":"滨城区"},{"value":"371621","label":"惠民县"},{"value":"371622","label":"阳信县"},{"value":"371623","label":"无棣县"},{"value":"371624","label":"沾化县"},{"value":"371625","label":"博兴县"},{"value":"371626","label":"邹平县"}]},{"value":"371700","label":"菏泽市","children":[{"value":"371702","label":"牡丹区"},{"value":"371721","label":"曹县"},{"value":"371722","label":"单县"},{"value":"371723","label":"成武县"},{"value":"371724","label":"巨野县"},{"value":"371725","label":"郓城县"},{"value":"371726","label":"鄄城县"},{"value":"371727","label":"定陶县"},{"value":"371728","label":"东明县"}]}]},{"label":"河南省","value":"410000","children":[{"value":"410100","label":"郑州市","children":[{"value":"410102","label":"中原区"},{"value":"410103","label":"二七区"},{"value":"410104","label":"管城回族区"},{"value":"410105","label":"金水区"},{"value":"410106","label":"上街区"},{"value":"410108","label":"惠济区"},{"value":"410122","label":"中牟县"},{"value":"410181","label":"巩义市"},{"value":"410182","label":"荥阳市"},{"value":"410183","label":"新密市"},{"value":"410184","label":"新郑市"},{"value":"410185","label":"登封市"},{"value":"410186","label":"郑东新区"},{"value":"410187","label":"高新区"}]},{"value":"410200","label":"开封市","children":[{"value":"410202","label":"龙亭区"},{"value":"410203","label":"顺河回族区"},{"value":"410204","label":"鼓楼区"},{"value":"410205","label":"禹王台区"},{"value":"410211","label":"金明区"},{"value":"410221","label":"杞县"},{"value":"410222","label":"通许县"},{"value":"410223","label":"尉氏县"},{"value":"410224","label":"开封县"},{"value":"410225","label":"兰考县"}]},{"value":"410300","label":"洛阳市","children":[{"value":"410302","label":"老城区"},{"value":"410303","label":"西工区"},{"value":"410304","label":"廛河回族区"},{"value":"410305","label":"涧西区"},{"value":"410306","label":"吉利区"},{"value":"410307","label":"洛龙区"},{"value":"410322","label":"孟津县"},{"value":"410323","label":"新安县"},{"value":"410324","label":"栾川县"},{"value":"410325","label":"嵩县"},{"value":"410326","label":"汝阳县"},{"value":"410327","label":"宜阳县"},{"value":"410328","label":"洛宁县"},{"value":"410329","label":"伊川县"},{"value":"410381","label":"偃师市"},{"value":"471004","label":"高新区"}]},{"value":"410400","label":"平顶山市","children":[{"value":"410402","label":"新华区"},{"value":"410403","label":"卫东区"},{"value":"410404","label":"石龙区"},{"value":"410411","label":"湛河区"},{"value":"410421","label":"宝丰县"},{"value":"410422","label":"叶县"},{"value":"410423","label":"鲁山县"},{"value":"410425","label":"郏县"},{"value":"410481","label":"舞钢市"},{"value":"410482","label":"汝州市"}]},{"value":"410500","label":"安阳市","children":[{"value":"410502","label":"文峰区"},{"value":"410503","label":"北关区"},{"value":"410505","label":"殷都区"},{"value":"410506","label":"龙安区"},{"value":"410522","label":"安阳县"},{"value":"410523","label":"汤阴县"},{"value":"410526","label":"滑县"},{"value":"410527","label":"内黄县"},{"value":"410581","label":"林州市"}]},{"value":"410600","label":"鹤壁市","children":[{"value":"410602","label":"鹤山区"},{"value":"410603","label":"山城区"},{"value":"410611","label":"淇滨区"},{"value":"410621","label":"浚县"},{"value":"410622","label":"淇县"}]},{"value":"410700","label":"新乡市","children":[{"value":"410702","label":"红旗区"},{"value":"410703","label":"卫滨区"},{"value":"410704","label":"凤泉区"},{"value":"410711","label":"牧野区"},{"value":"410721","label":"新乡县"},{"value":"410724","label":"获嘉县"},{"value":"410725","label":"原阳县"},{"value":"410726","label":"延津县"},{"value":"410727","label":"封丘县"},{"value":"410728","label":"长垣县"},{"value":"410781","label":"卫辉市"},{"value":"410782","label":"辉县市"}]},{"value":"410800","label":"焦作市","children":[{"value":"410802","label":"解放区"},{"value":"410803","label":"中站区"},{"value":"410804","label":"马村区"},{"value":"410811","label":"山阳区"},{"value":"410821","label":"修武县"},{"value":"410822","label":"博爱县"},{"value":"410823","label":"武陟县"},{"value":"410825","label":"温县"},{"value":"410882","label":"沁阳市"},{"value":"410883","label":"孟州市"}]},{"value":"410881","label":"济源市"},{"value":"410900","label":"濮阳市","children":[{"value":"410902","label":"华龙区"},{"value":"410922","label":"清丰县"},{"value":"410923","label":"南乐县"},{"value":"410926","label":"范县"},{"value":"410927","label":"台前县"},{"value":"410928","label":"濮阳县"}]},{"value":"411000","label":"许昌市","children":[{"value":"411002","label":"魏都区"},{"value":"411023","label":"许昌县"},{"value":"411024","label":"鄢陵县"},{"value":"411025","label":"襄城县"},{"value":"411081","label":"禹州市"},{"value":"411082","label":"长葛市"}]},{"value":"411100","label":"漯河市","children":[{"value":"411102","label":"源汇区"},{"value":"411103","label":"郾城区"},{"value":"411104","label":"召陵区"},{"value":"411121","label":"舞阳县"},{"value":"411122","label":"临颍县"}]},{"value":"411200","label":"三门峡市","children":[{"value":"411202","label":"湖滨区"},{"value":"411221","label":"渑池县"},{"value":"411222","label":"陕县"},{"value":"411224","label":"卢氏县"},{"value":"411281","label":"义马市"},{"value":"411282","label":"灵宝市"}]},{"value":"411300","label":"南阳市","children":[{"value":"411302","label":"宛城区"},{"value":"411303","label":"卧龙区"},{"value":"411321","label":"南召县"},{"value":"411322","label":"方城县"},{"value":"411323","label":"西峡县"},{"value":"411324","label":"镇平县"},{"value":"411325","label":"内乡县"},{"value":"411326","label":"淅川县"},{"value":"411327","label":"社旗县"},{"value":"411328","label":"唐河县"},{"value":"411329","label":"新野县"},{"value":"411330","label":"桐柏县"},{"value":"411381","label":"邓州市"}]},{"value":"411400","label":"商丘市","children":[{"value":"411402","label":"梁园区"},{"value":"411403","label":"睢阳区"},{"value":"411421","label":"民权县"},{"value":"411422","label":"睢县"},{"value":"411423","label":"宁陵县"},{"value":"411424","label":"柘城县"},{"value":"411425","label":"虞城县"},{"value":"411426","label":"夏邑县"},{"value":"411481","label":"永城市"}]},{"value":"411500","label":"信阳市","children":[{"value":"411502","label":"浉河区"},{"value":"411503","label":"平桥区"},{"value":"411521","label":"罗山县"},{"value":"411522","label":"光山县"},{"value":"411523","label":"新县"},{"value":"411524","label":"商城县"},{"value":"411525","label":"固始县"},{"value":"411526","label":"潢川县"},{"value":"411527","label":"淮滨县"},{"value":"411528","label":"息县"}]},{"value":"411600","label":"周口市","children":[{"value":"411602","label":"川汇区"},{"value":"411621","label":"扶沟县"},{"value":"411622","label":"西华县"},{"value":"411623","label":"商水县"},{"value":"411624","label":"沈丘县"},{"value":"411625","label":"郸城县"},{"value":"411626","label":"淮阳县"},{"value":"411627","label":"太康县"},{"value":"411628","label":"鹿邑县"},{"value":"411681","label":"项城市"}]},{"value":"411700","label":"驻马店市","children":[{"value":"411702","label":"驿城区"},{"value":"411721","label":"西平县"},{"value":"411722","label":"上蔡县"},{"value":"411723","label":"平舆县"},{"value":"411724","label":"正阳县"},{"value":"411725","label":"确山县"},{"value":"411726","label":"泌阳县"},{"value":"411727","label":"汝南县"},{"value":"411728","label":"遂平县"},{"value":"411729","label":"新蔡县"}]}]},{"label":"湖北省","value":"420000","children":[{"value":"420100","label":"武汉市","children":[{"value":"420102","label":"江岸区"},{"value":"420103","label":"江汉区"},{"value":"420104","label":"硚口区"},{"value":"420105","label":"汉阳区"},{"value":"420106","label":"武昌区"},{"value":"420107","label":"青山区"},{"value":"420111","label":"洪山区"},{"value":"420112","label":"东西湖区"},{"value":"420113","label":"汉南区"},{"value":"420114","label":"蔡甸区"},{"value":"420115","label":"江夏区"},{"value":"420116","label":"黄陂区"},{"value":"420117","label":"新洲区"}]},{"value":"420200","label":"黄石市","children":[{"value":"420202","label":"黄石港区"},{"value":"420203","label":"西塞山区"},{"value":"420204","label":"下陆区"},{"value":"420205","label":"铁山区"},{"value":"420222","label":"阳新县"},{"value":"420281","label":"大冶市"}]},{"value":"420300","label":"十堰市","children":[{"value":"420302","label":"茅箭区"},{"value":"420303","label":"张湾区"},{"value":"420321","label":"郧县"},{"value":"420322","label":"郧西县"},{"value":"420323","label":"竹山县"},{"value":"420324","label":"竹溪县"},{"value":"420325","label":"房县"},{"value":"420381","label":"丹江口市"},{"value":"420382","label":"城区"}]},{"value":"420500","label":"宜昌市","children":[{"value":"420502","label":"西陵区"},{"value":"420503","label":"伍家岗区"},{"value":"420504","label":"点军区"},{"value":"420505","label":"猇亭区"},{"value":"420506","label":"夷陵区"},{"value":"420525","label":"远安县"},{"value":"420526","label":"兴山县"},{"value":"420527","label":"秭归县"},{"value":"420528","label":"长阳土家族自治县"},{"value":"420529","label":"五峰土家族自治县"},{"value":"420551","label":"葛洲坝区"},{"value":"420552","label":"开发区"},{"value":"420581","label":"宜都市"},{"value":"420582","label":"当阳市"},{"value":"420583","label":"枝江市"}]},{"value":"420600","label":"襄阳市","children":[{"value":"420602","label":"襄城区"},{"value":"420606","label":"樊城区"},{"value":"420607","label":"襄州区"},{"value":"420624","label":"南漳县"},{"value":"420625","label":"谷城县"},{"value":"420626","label":"保康县"},{"value":"420682","label":"老河口市"},{"value":"420683","label":"枣阳市"},{"value":"420684","label":"宜城市"}]},{"value":"420700","label":"鄂州市","children":[{"value":"420702","label":"梁子湖区"},{"value":"420703","label":"华容区"},{"value":"420704","label":"鄂城区"}]},{"value":"420800","label":"荆门市","children":[{"value":"420802","label":"东宝区"},{"value":"420804","label":"掇刀区"},{"value":"420821","label":"京山县"},{"value":"420822","label":"沙洋县"},{"value":"420881","label":"钟祥市"}]},{"value":"420900","label":"孝感市","children":[{"value":"420902","label":"孝南区"},{"value":"420921","label":"孝昌县"},{"value":"420922","label":"大悟县"},{"value":"420923","label":"云梦县"},{"value":"420981","label":"应城市"},{"value":"420982","label":"安陆市"},{"value":"420984","label":"汉川市"}]},{"value":"421000","label":"荆州市","children":[{"value":"421002","label":"沙市区"},{"value":"421003","label":"荆州区"},{"value":"421022","label":"公安县"},{"value":"421023","label":"监利县"},{"value":"421024","label":"江陵县"},{"value":"421081","label":"石首市"},{"value":"421083","label":"洪湖市"},{"value":"421087","label":"松滋市"}]},{"value":"421100","label":"黄冈市","children":[{"value":"421102","label":"黄州区"},{"value":"421121","label":"团风县"},{"value":"421122","label":"红安县"},{"value":"421123","label":"罗田县"},{"value":"421124","label":"英山县"},{"value":"421125","label":"浠水县"},{"value":"421126","label":"蕲春县"},{"value":"421127","label":"黄梅县"},{"value":"421181","label":"麻城市"},{"value":"421182","label":"武穴市"}]},{"value":"421200","label":"咸宁市","children":[{"value":"421202","label":"咸安区"},{"value":"421221","label":"嘉鱼县"},{"value":"421222","label":"通城县"},{"value":"421223","label":"崇阳县"},{"value":"421224","label":"通山县"},{"value":"421281","label":"赤壁市"},{"value":"421282","label":"温泉城区"}]},{"value":"421300","label":"随州市","children":[{"value":"421302","label":"曾都区"},{"value":"421321","label":"随县"},{"value":"421381","label":"广水市"}]},{"value":"422800","label":"恩施土家族苗族自治州","children":[{"value":"422801","label":"恩施市"},{"value":"422802","label":"利川市"},{"value":"422822","label":"建始县"},{"value":"422823","label":"巴东县"},{"value":"422825","label":"宣恩县"},{"value":"422826","label":"咸丰县"},{"value":"422827","label":"来凤县"},{"value":"422828","label":"鹤峰县"}]},{"value":"429004","label":"仙桃市"},{"value":"429005","label":"潜江市"},{"value":"429006","label":"天门市"},{"value":"429021","label":"神农架林区"}]},{"label":"湖南省","value":"430000","children":[{"value":"430100","label":"长沙市","children":[{"value":"430102","label":"芙蓉区"},{"value":"430103","label":"天心区"},{"value":"430104","label":"岳麓区"},{"value":"430105","label":"开福区"},{"value":"430111","label":"雨花区"},{"value":"430121","label":"长沙县"},{"value":"430122","label":"望城县"},{"value":"430124","label":"宁乡县"},{"value":"430181","label":"浏阳市"}]},{"value":"430200","label":"株洲市","children":[{"value":"430202","label":"荷塘区"},{"value":"430203","label":"芦淞区"},{"value":"430204","label":"石峰区"},{"value":"430211","label":"天元区"},{"value":"430221","label":"株洲县"},{"value":"430223","label":"攸县"},{"value":"430224","label":"茶陵县"},{"value":"430225","label":"炎陵县"},{"value":"430281","label":"醴陵市"}]},{"value":"430300","label":"湘潭市","children":[{"value":"430302","label":"雨湖区"},{"value":"430304","label":"岳塘区"},{"value":"430321","label":"湘潭县"},{"value":"430381","label":"湘乡市"},{"value":"430382","label":"韶山市"}]},{"value":"430400","label":"衡阳市","children":[{"value":"430405","label":"珠晖区"},{"value":"430406","label":"雁峰区"},{"value":"430407","label":"石鼓区"},{"value":"430408","label":"蒸湘区"},{"value":"430412","label":"南岳区"},{"value":"430421","label":"衡阳县"},{"value":"430422","label":"衡南县"},{"value":"430423","label":"衡山县"},{"value":"430424","label":"衡东县"},{"value":"430426","label":"祁东县"},{"value":"430481","label":"耒阳市"},{"value":"430482","label":"常宁市"}]},{"value":"430500","label":"邵阳市","children":[{"value":"430502","label":"双清区"},{"value":"430503","label":"大祥区"},{"value":"430511","label":"北塔区"},{"value":"430521","label":"邵东县"},{"value":"430522","label":"新邵县"},{"value":"430523","label":"邵阳县"},{"value":"430524","label":"隆回县"},{"value":"430525","label":"洞口县"},{"value":"430527","label":"绥宁县"},{"value":"430528","label":"新宁县"},{"value":"430529","label":"城步苗族自治县"},{"value":"430581","label":"武冈市"}]},{"value":"430600","label":"岳阳市","children":[{"value":"430602","label":"岳阳楼区"},{"value":"430603","label":"云溪区"},{"value":"430611","label":"君山区"},{"value":"430621","label":"岳阳县"},{"value":"430623","label":"华容县"},{"value":"430624","label":"湘阴县"},{"value":"430626","label":"平江县"},{"value":"430681","label":"汨罗市"},{"value":"430682","label":"临湘市"}]},{"value":"430700","label":"常德市","children":[{"value":"430702","label":"武陵区"},{"value":"430703","label":"鼎城区"},{"value":"430721","label":"安乡县"},{"value":"430722","label":"汉寿县"},{"value":"430723","label":"澧县"},{"value":"430724","label":"临澧县"},{"value":"430725","label":"桃源县"},{"value":"430726","label":"石门县"},{"value":"430781","label":"津市市"}]},{"value":"430800","label":"张家界市","children":[{"value":"430802","label":"永定区"},{"value":"430811","label":"武陵源区"},{"value":"430821","label":"慈利县"},{"value":"430822","label":"桑植县"}]},{"value":"430900","label":"益阳市","children":[{"value":"430902","label":"资阳区"},{"value":"430903","label":"赫山区"},{"value":"430921","label":"南县"},{"value":"430922","label":"桃江县"},{"value":"430923","label":"安化县"},{"value":"430981","label":"沅江市"}]},{"value":"431000","label":"郴州市","children":[{"value":"431002","label":"北湖区"},{"value":"431003","label":"苏仙区"},{"value":"431021","label":"桂阳县"},{"value":"431022","label":"宜章县"},{"value":"431023","label":"永兴县"},{"value":"431024","label":"嘉禾县"},{"value":"431025","label":"临武县"},{"value":"431026","label":"汝城县"},{"value":"431027","label":"桂东县"},{"value":"431028","label":"安仁县"},{"value":"431081","label":"资兴市"}]},{"value":"431100","label":"永州市","children":[{"value":"431102","label":"零陵区"},{"value":"431103","label":"冷水滩区"},{"value":"431121","label":"祁阳县"},{"value":"431122","label":"东安县"},{"value":"431123","label":"双牌县"},{"value":"431124","label":"道县"},{"value":"431125","label":"江永县"},{"value":"431126","label":"宁远县"},{"value":"431127","label":"蓝山县"},{"value":"431128","label":"新田县"},{"value":"431129","label":"江华瑶族自治县"}]},{"value":"431200","label":"怀化市","children":[{"value":"431202","label":"鹤城区"},{"value":"431221","label":"中方县"},{"value":"431222","label":"沅陵县"},{"value":"431223","label":"辰溪县"},{"value":"431224","label":"溆浦县"},{"value":"431225","label":"会同县"},{"value":"431226","label":"麻阳苗族自治县"},{"value":"431227","label":"新晃侗族自治县"},{"value":"431228","label":"芷江侗族自治县"},{"value":"431229","label":"靖州苗族侗族自治县"},{"value":"431230","label":"通道侗族自治县"},{"value":"431281","label":"洪江市"}]},{"value":"431300","label":"娄底市","children":[{"value":"431302","label":"娄星区"},{"value":"431321","label":"双峰县"},{"value":"431322","label":"新化县"},{"value":"431381","label":"冷水江市"},{"value":"431382","label":"涟源市"}]},{"value":"433100","label":"湘西土家族苗族自治州","children":[{"value":"433101","label":"吉首市"},{"value":"433122","label":"泸溪县"},{"value":"433123","label":"凤凰县"},{"value":"433124","label":"花垣县"},{"value":"433125","label":"保靖县"},{"value":"433126","label":"古丈县"},{"value":"433127","label":"永顺县"},{"value":"433130","label":"龙山县"}]}]},{"label":"广东省","value":"440000","children":[{"value":"440100","label":"广州市","children":[{"value":"440103","label":"荔湾区"},{"value":"440104","label":"越秀区"},{"value":"440105","label":"海珠区"},{"value":"440106","label":"天河区"},{"value":"440111","label":"白云区"},{"value":"440112","label":"黄埔区"},{"value":"440113","label":"番禺区"},{"value":"440114","label":"花都区"},{"value":"440115","label":"南沙区"},{"value":"440116","label":"萝岗区"},{"value":"440183","label":"增城市"},{"value":"440184","label":"从化市"},{"value":"440188","label":"东山区"}]},{"value":"440200","label":"韶关市","children":[{"value":"440203","label":"武江区"},{"value":"440204","label":"浈江区"},{"value":"440205","label":"曲江区"},{"value":"440222","label":"始兴县"},{"value":"440224","label":"仁化县"},{"value":"440229","label":"翁源县"},{"value":"440232","label":"乳源瑶族自治县"},{"value":"440233","label":"新丰县"},{"value":"440281","label":"乐昌市"},{"value":"440282","label":"南雄市"}]},{"value":"440300","label":"深圳市","children":[{"value":"440303","label":"罗湖区"},{"value":"440304","label":"福田区"},{"value":"440305","label":"南山区"},{"value":"440306","label":"宝安区"},{"value":"440307","label":"龙岗区"},{"value":"440308","label":"盐田区"},{"value":"1032697","label":"光明新区"},{"value":"1032698","label":"坪山新区"},{"value":"1032699","label":"大鹏新区"},{"value":"1032700","label":"龙华新区"}]},{"value":"440400","label":"珠海市","children":[{"value":"440402","label":"香洲区"},{"value":"440403","label":"斗门区"},{"value":"440404","label":"金湾区"},{"value":"440486","label":"金唐区"},{"value":"440487","label":"南湾区"}]},{"value":"440500","label":"汕头市","children":[{"value":"440507","label":"龙湖区"},{"value":"440511","label":"金平区"},{"value":"440512","label":"濠江区"},{"value":"440513","label":"潮阳区"},{"value":"440514","label":"潮南区"},{"value":"440515","label":"澄海区"},{"value":"440523","label":"南澳县"}]},{"value":"440600","label":"佛山市","children":[{"value":"440604","label":"禅城区"},{"value":"440605","label":"南海区"},{"value":"440606","label":"顺德区"},{"value":"440607","label":"三水区"},{"value":"440608","label":"高明区"}]},{"value":"440700","label":"江门市","children":[{"value":"440703","label":"蓬江区"},{"value":"440704","label":"江海区"},{"value":"440705","label":"新会区"},{"value":"440781","label":"台山市"},{"value":"440783","label":"开平市"},{"value":"440784","label":"鹤山市"},{"value":"440785","label":"恩平市"}]},{"value":"440800","label":"湛江市","children":[{"value":"440802","label":"赤坎区"},{"value":"440803","label":"霞山区"},{"value":"440804","label":"坡头区"},{"value":"440811","label":"麻章区"},{"value":"440823","label":"遂溪县"},{"value":"440825","label":"徐闻县"},{"value":"440881","label":"廉江市"},{"value":"440882","label":"雷州市"},{"value":"440883","label":"吴川市"}]},{"value":"440900","label":"茂名市","children":[{"value":"440902","label":"茂南区"},{"value":"440903","label":"茂港区"},{"value":"440923","label":"电白县"},{"value":"440981","label":"高州市"},{"value":"440982","label":"化州市"},{"value":"440983","label":"信宜市"}]},{"value":"441200","label":"肇庆市","children":[{"value":"441202","label":"端州区"},{"value":"441203","label":"鼎湖区"},{"value":"441223","label":"广宁县"},{"value":"441224","label":"怀集县"},{"value":"441225","label":"封开县"},{"value":"441226","label":"德庆县"},{"value":"441283","label":"高要市"},{"value":"441284","label":"四会市"}]},{"value":"441300","label":"惠州市","children":[{"value":"441302","label":"惠城区"},{"value":"441303","label":"惠阳区"},{"value":"441322","label":"博罗县"},{"value":"441323","label":"惠东县"},{"value":"441324","label":"龙门县"}]},{"value":"441400","label":"梅州市","children":[{"value":"441402","label":"梅江区"},{"value":"441421","label":"梅县"},{"value":"441422","label":"大埔县"},{"value":"441423","label":"丰顺县"},{"value":"441424","label":"五华县"},{"value":"441426","label":"平远县"},{"value":"441427","label":"蕉岭县"},{"value":"441481","label":"兴宁市"}]},{"value":"441500","label":"汕尾市","children":[{"value":"441502","label":"城区"},{"value":"441521","label":"海丰县"},{"value":"441523","label":"陆河县"},{"value":"441581","label":"陆丰市"}]},{"value":"441600","label":"河源市","children":[{"value":"441602","label":"源城区"},{"value":"441621","label":"紫金县"},{"value":"441622","label":"龙川县"},{"value":"441623","label":"连平县"},{"value":"441624","label":"和平县"},{"value":"441625","label":"东源县"}]},{"value":"441700","label":"阳江市","children":[{"value":"441702","label":"江城区"},{"value":"441721","label":"阳西县"},{"value":"441723","label":"阳东县"},{"value":"441781","label":"阳春市"}]},{"value":"441800","label":"清远市","children":[{"value":"441802","label":"清城区"},{"value":"441821","label":"佛冈县"},{"value":"441823","label":"阳山县"},{"value":"441825","label":"连山壮族瑶族自治县"},{"value":"441826","label":"连南瑶族自治县"},{"value":"441827","label":"清新县"},{"value":"441881","label":"英德市"},{"value":"441882","label":"连州市"}]},{"value":"441900","label":"东莞市"},{"value":"442000","label":"中山市"},{"value":"445100","label":"潮州市","children":[{"value":"445102","label":"湘桥区"},{"value":"445121","label":"潮安县"},{"value":"445122","label":"饶平县"},{"value":"445185","label":"枫溪区"}]},{"value":"445200","label":"揭阳市","children":[{"value":"445202","label":"榕城区"},{"value":"445221","label":"揭东县"},{"value":"445222","label":"揭西县"},{"value":"445224","label":"惠来县"},{"value":"445281","label":"普宁市"},{"value":"445284","label":"东山区"}]},{"value":"445300","label":"云浮市","children":[{"value":"445302","label":"云城区"},{"value":"445321","label":"新兴县"},{"value":"445322","label":"郁南县"},{"value":"445323","label":"云安县"},{"value":"445381","label":"罗定市"}]}]},{"label":"广西壮族自治区","value":"450000","children":[{"value":"450100","label":"南宁市","children":[{"value":"450102","label":"兴宁区"},{"value":"450103","label":"青秀区"},{"value":"450105","label":"江南区"},{"value":"450107","label":"西乡塘区"},{"value":"450108","label":"良庆区"},{"value":"450109","label":"邕宁区"},{"value":"450122","label":"武鸣县"},{"value":"450123","label":"隆安县"},{"value":"450124","label":"马山县"},{"value":"450125","label":"上林县"},{"value":"450126","label":"宾阳县"},{"value":"450127","label":"横县"}]},{"value":"450200","label":"柳州市","children":[{"value":"450202","label":"城中区"},{"value":"450203","label":"鱼峰区"},{"value":"450204","label":"柳南区"},{"value":"450205","label":"柳北区"},{"value":"450221","label":"柳江县"},{"value":"450222","label":"柳城县"},{"value":"450223","label":"鹿寨县"},{"value":"450224","label":"融安县"},{"value":"450225","label":"融水苗族自治县"},{"value":"450226","label":"三江侗族自治县"}]},{"value":"450300","label":"桂林市","children":[{"value":"450302","label":"秀峰区"},{"value":"450303","label":"叠彩区"},{"value":"450304","label":"象山区"},{"value":"450305","label":"七星区"},{"value":"450311","label":"雁山区"},{"value":"450321","label":"阳朔县"},{"value":"450322","label":"临桂县"},{"value":"450323","label":"灵川县"},{"value":"450324","label":"全州县"},{"value":"450325","label":"兴安县"},{"value":"450326","label":"永福县"},{"value":"450327","label":"灌阳县"},{"value":"450328","label":"龙胜各族自治县"},{"value":"450329","label":"资源县"},{"value":"450330","label":"平乐县"},{"value":"450331","label":"荔浦县"},{"value":"450332","label":"恭城瑶族自治县"}]},{"value":"450400","label":"梧州市","children":[{"value":"450403","label":"万秀区"},{"value":"450404","label":"蝶山区"},{"value":"450405","label":"长洲区"},{"value":"450421","label":"苍梧县"},{"value":"450422","label":"藤县"},{"value":"450423","label":"蒙山县"},{"value":"450481","label":"岑溪市"}]},{"value":"450500","label":"北海市","children":[{"value":"450502","label":"海城区"},{"value":"450503","label":"银海区"},{"value":"450512","label":"铁山港区"},{"value":"450521","label":"合浦县"}]},{"value":"450600","label":"防城港市","children":[{"value":"450602","label":"港口区"},{"value":"450603","label":"防城区"},{"value":"450621","label":"上思县"},{"value":"450681","label":"东兴市"}]},{"value":"450700","label":"钦州市","children":[{"value":"450702","label":"钦南区"},{"value":"450703","label":"钦北区"},{"value":"450721","label":"灵山县"},{"value":"450722","label":"浦北县"}]},{"value":"450800","label":"贵港市","children":[{"value":"450802","label":"港北区"},{"value":"450803","label":"港南区"},{"value":"450804","label":"覃塘区"},{"value":"450821","label":"平南县"},{"value":"450881","label":"桂平市"}]},{"value":"450900","label":"玉林市","children":[{"value":"450902","label":"玉州区"},{"value":"450921","label":"容县"},{"value":"450922","label":"陆川县"},{"value":"450923","label":"博白县"},{"value":"450924","label":"兴业县"},{"value":"450981","label":"北流市"}]},{"value":"451000","label":"百色市","children":[{"value":"451002","label":"右江区"},{"value":"451021","label":"田阳县"},{"value":"451022","label":"田东县"},{"value":"451023","label":"平果县"},{"value":"451024","label":"德保县"},{"value":"451025","label":"靖西县"},{"value":"451026","label":"那坡县"},{"value":"451027","label":"凌云县"},{"value":"451028","label":"乐业县"},{"value":"451029","label":"田林县"},{"value":"451030","label":"西林县"},{"value":"451031","label":"隆林各族自治县"}]},{"value":"451100","label":"贺州市","children":[{"value":"451102","label":"八步区"},{"value":"451121","label":"昭平县"},{"value":"451122","label":"钟山县"},{"value":"451123","label":"富川瑶族自治县"}]},{"value":"451200","label":"河池市","children":[{"value":"451202","label":"金城江区"},{"value":"451221","label":"南丹县"},{"value":"451222","label":"天峨县"},{"value":"451223","label":"凤山县"},{"value":"451224","label":"东兰县"},{"value":"451225","label":"罗城仫佬族自治县"},{"value":"451226","label":"环江毛南族自治县"},{"value":"451227","label":"巴马瑶族自治县"},{"value":"451228","label":"都安瑶族自治县"},{"value":"451229","label":"大化瑶族自治县"},{"value":"451281","label":"宜州市"}]},{"value":"451300","label":"来宾市","children":[{"value":"451302","label":"兴宾区"},{"value":"451321","label":"忻城县"},{"value":"451322","label":"象州县"},{"value":"451323","label":"武宣县"},{"value":"451324","label":"金秀瑶族自治县"},{"value":"451381","label":"合山市"}]},{"value":"451400","label":"崇左市","children":[{"value":"451402","label":"江洲区"},{"value":"451421","label":"扶绥县"},{"value":"451422","label":"宁明县"},{"value":"451423","label":"龙州县"},{"value":"451424","label":"大新县"},{"value":"451425","label":"天等县"},{"value":"451481","label":"凭祥市"}]}]},{"label":"海南省","value":"460000","children":[{"value":"460100","label":"海口市","children":[{"value":"460105","label":"秀英区"},{"value":"460106","label":"龙华区"},{"value":"460107","label":"琼山区"},{"value":"460108","label":"美兰区"}]},{"value":"460200","label":"三亚市"},{"value":"469001","label":"五指山市"},{"value":"469002","label":"琼海市"},{"value":"469003","label":"儋州市"},{"value":"469005","label":"文昌市"},{"value":"469006","label":"万宁市"},{"value":"469007","label":"东方市"},{"value":"469025","label":"定安县"},{"value":"469026","label":"屯昌县"},{"value":"469027","label":"澄迈县"},{"value":"469028","label":"临高县"},{"value":"469030","label":"白沙黎族自治县"},{"value":"469031","label":"昌江黎族自治县"},{"value":"469033","label":"乐东黎族自治县"},{"value":"469034","label":"陵水黎族自治县"},{"value":"469035","label":"保亭黎族苗族自治县"},{"value":"469036","label":"琼中黎族苗族自治县"},{"value":"469037","label":"西沙群岛"},{"value":"469038","label":"南沙群岛"},{"value":"469039","label":"中沙群岛的岛礁及其海域"}]},{"label":"重庆","value":"500000","children":[{"value":"500100","label":"重庆市","children":[{"value":"500101","label":"万州区"},{"value":"500102","label":"涪陵区"},{"value":"500103","label":"渝中区"},{"value":"500104","label":"大渡口区"},{"value":"500105","label":"江北区"},{"value":"500106","label":"沙坪坝区"},{"value":"500107","label":"九龙坡区"},{"value":"500108","label":"南岸区"},{"value":"500109","label":"北碚区"},{"value":"500110","label":"万盛区"},{"value":"500111","label":"双桥区"},{"value":"500112","label":"渝北区"},{"value":"500113","label":"巴南区"},{"value":"500114","label":"黔江区"},{"value":"500115","label":"长寿区"},{"value":"500222","label":"綦江县"},{"value":"500223","label":"潼南县"},{"value":"500224","label":"铜梁县"},{"value":"500225","label":"大足县"},{"value":"500226","label":"荣昌县"},{"value":"500227","label":"璧山县"},{"value":"500228","label":"梁平县"},{"value":"500229","label":"城口县"},{"value":"500230","label":"丰都县"},{"value":"500231","label":"垫江县"},{"value":"500232","label":"武隆县"},{"value":"500233","label":"忠县"},{"value":"500234","label":"开县"},{"value":"500235","label":"云阳县"},{"value":"500236","label":"奉节县"},{"value":"500237","label":"巫山县"},{"value":"500238","label":"巫溪县"},{"value":"500240","label":"石柱土家族自治县"},{"value":"500241","label":"秀山土家族苗族自治县"},{"value":"500242","label":"酉阳土家族苗族自治县"},{"value":"500243","label":"彭水苗族土家族自治县"},{"value":"500381","label":"江津区"},{"value":"500382","label":"合川区"},{"value":"500383","label":"永川区"},{"value":"500384","label":"南川区"}]}]},{"label":"四川省","value":"510000","children":[{"value":"510100","label":"成都市","children":[{"value":"510104","label":"锦江区"},{"value":"510105","label":"青羊区"},{"value":"510106","label":"金牛区"},{"value":"510107","label":"武侯区"},{"value":"510108","label":"成华区"},{"value":"510112","label":"龙泉驿区"},{"value":"510113","label":"青白江区"},{"value":"510114","label":"新都区"},{"value":"510115","label":"温江区"},{"value":"510121","label":"金堂县"},{"value":"510122","label":"双流县"},{"value":"510124","label":"郫县"},{"value":"510129","label":"大邑县"},{"value":"510131","label":"蒲江县"},{"value":"510132","label":"新津县"},{"value":"510181","label":"都江堰市"},{"value":"510182","label":"彭州市"},{"value":"510183","label":"邛崃市"},{"value":"510184","label":"崇州市"}]},{"value":"510300","label":"自贡市","children":[{"value":"510302","label":"自流井区"},{"value":"510303","label":"贡井区"},{"value":"510304","label":"大安区"},{"value":"510311","label":"沿滩区"},{"value":"510321","label":"荣县"},{"value":"510322","label":"富顺县"}]},{"value":"510400","label":"攀枝花市","children":[{"value":"510402","label":"东区"},{"value":"510403","label":"西区"},{"value":"510411","label":"仁和区"},{"value":"510421","label":"米易县"},{"value":"510422","label":"盐边县"}]},{"value":"510500","label":"泸州市","children":[{"value":"510502","label":"江阳区"},{"value":"510503","label":"纳溪区"},{"value":"510504","label":"龙马潭区"},{"value":"510521","label":"泸县"},{"value":"510522","label":"合江县"},{"value":"510524","label":"叙永县"},{"value":"510525","label":"古蔺县"}]},{"value":"510600","label":"德阳市","children":[{"value":"510603","label":"旌阳区"},{"value":"510623","label":"中江县"},{"value":"510626","label":"罗江县"},{"value":"510681","label":"广汉市"},{"value":"510682","label":"什邡市"},{"value":"510683","label":"绵竹市"}]},{"value":"510700","label":"绵阳市","children":[{"value":"510703","label":"涪城区"},{"value":"510704","label":"游仙区"},{"value":"510722","label":"三台县"},{"value":"510723","label":"盐亭县"},{"value":"510724","label":"安县"},{"value":"510725","label":"梓潼县"},{"value":"510726","label":"北川羌族自治县"},{"value":"510727","label":"平武县"},{"value":"510751","label":"高新区"},{"value":"510781","label":"江油市"}]},{"value":"510800","label":"广元市","children":[{"value":"510802","label":"利州区"},{"value":"510811","label":"元坝区"},{"value":"510812","label":"朝天区"},{"value":"510821","label":"旺苍县"},{"value":"510822","label":"青川县"},{"value":"510823","label":"剑阁县"},{"value":"510824","label":"苍溪县"}]},{"value":"510900","label":"遂宁市","children":[{"value":"510903","label":"船山区"},{"value":"510904","label":"安居区"},{"value":"510921","label":"蓬溪县"},{"value":"510922","label":"射洪县"},{"value":"510923","label":"大英县"}]},{"value":"511000","label":"内江市","children":[{"value":"511002","label":"市中区"},{"value":"511011","label":"东兴区"},{"value":"511024","label":"威远县"},{"value":"511025","label":"资中县"},{"value":"511028","label":"隆昌县"}]},{"value":"511100","label":"乐山市","children":[{"value":"511102","label":"市中区"},{"value":"511111","label":"沙湾区"},{"value":"511112","label":"五通桥区"},{"value":"511113","label":"金口河区"},{"value":"511123","label":"犍为县"},{"value":"511124","label":"井研县"},{"value":"511126","label":"夹江县"},{"value":"511129","label":"沐川县"},{"value":"511132","label":"峨边彝族自治县"},{"value":"511133","label":"马边彝族自治县"},{"value":"511181","label":"峨眉山市"}]},{"value":"511300","label":"南充市","children":[{"value":"511302","label":"顺庆区"},{"value":"511303","label":"高坪区"},{"value":"511304","label":"嘉陵区"},{"value":"511321","label":"南部县"},{"value":"511322","label":"营山县"},{"value":"511323","label":"蓬安县"},{"value":"511324","label":"仪陇县"},{"value":"511325","label":"西充县"},{"value":"511381","label":"阆中市"}]},{"value":"511400","label":"眉山市","children":[{"value":"511402","label":"东坡区"},{"value":"511421","label":"仁寿县"},{"value":"511422","label":"彭山县"},{"value":"511423","label":"洪雅县"},{"value":"511424","label":"丹棱县"},{"value":"511425","label":"青神县"}]},{"value":"511500","label":"宜宾市","children":[{"value":"511502","label":"翠屏区"},{"value":"511521","label":"宜宾县"},{"value":"511522","label":"南溪县"},{"value":"511523","label":"江安县"},{"value":"511524","label":"长宁县"},{"value":"511525","label":"高县"},{"value":"511526","label":"珙县"},{"value":"511527","label":"筠连县"},{"value":"511528","label":"兴文县"},{"value":"511529","label":"屏山县"}]},{"value":"511600","label":"广安市","children":[{"value":"511602","label":"广安区"},{"value":"511621","label":"岳池县"},{"value":"511622","label":"武胜县"},{"value":"511623","label":"邻水县"},{"value":"511681","label":"华蓥市"},{"value":"511682","label":"市辖区"}]},{"value":"511700","label":"达州市","children":[{"value":"511702","label":"通川区"},{"value":"511721","label":"达县"},{"value":"511722","label":"宣汉县"},{"value":"511723","label":"开江县"},{"value":"511724","label":"大竹县"},{"value":"511725","label":"渠县"},{"value":"511781","label":"万源市"}]},{"value":"511800","label":"雅安市","children":[{"value":"511802","label":"雨城区"},{"value":"511821","label":"名山县"},{"value":"511822","label":"荥经县"},{"value":"511823","label":"汉源县"},{"value":"511824","label":"石棉县"},{"value":"511825","label":"天全县"},{"value":"511826","label":"芦山县"},{"value":"511827","label":"宝兴县"}]},{"value":"511900","label":"巴中市","children":[{"value":"511902","label":"巴州区"},{"value":"511921","label":"通江县"},{"value":"511922","label":"南江县"},{"value":"511923","label":"平昌县"}]},{"value":"512000","label":"资阳市","children":[{"value":"512002","label":"雁江区"},{"value":"512021","label":"安岳县"},{"value":"512022","label":"乐至县"},{"value":"512081","label":"简阳市"}]},{"value":"513200","label":"阿坝藏族羌族自治州","children":[{"value":"513221","label":"汶川县"},{"value":"513222","label":"理县"},{"value":"513223","label":"茂县"},{"value":"513224","label":"松潘县"},{"value":"513225","label":"九寨沟县"},{"value":"513226","label":"金川县"},{"value":"513227","label":"小金县"},{"value":"513228","label":"黑水县"},{"value":"513229","label":"马尔康县"},{"value":"513230","label":"壤塘县"},{"value":"513231","label":"阿坝县"},{"value":"513232","label":"若尔盖县"},{"value":"513233","label":"红原县"}]},{"value":"513300","label":"甘孜藏族自治州","children":[{"value":"513321","label":"康定县"},{"value":"513322","label":"泸定县"},{"value":"513323","label":"丹巴县"},{"value":"513324","label":"九龙县"},{"value":"513325","label":"雅江县"},{"value":"513326","label":"道孚县"},{"value":"513327","label":"炉霍县"},{"value":"513328","label":"甘孜县"},{"value":"513329","label":"新龙县"},{"value":"513330","label":"德格县"},{"value":"513331","label":"白玉县"},{"value":"513332","label":"石渠县"},{"value":"513333","label":"色达县"},{"value":"513334","label":"理塘县"},{"value":"513335","label":"巴塘县"},{"value":"513336","label":"乡城县"},{"value":"513337","label":"稻城县"},{"value":"513338","label":"得荣县"}]},{"value":"513400","label":"凉山彝族自治州","children":[{"value":"513401","label":"西昌市"},{"value":"513422","label":"木里藏族自治县"},{"value":"513423","label":"盐源县"},{"value":"513424","label":"德昌县"},{"value":"513425","label":"会理县"},{"value":"513426","label":"会东县"},{"value":"513427","label":"宁南县"},{"value":"513428","label":"普格县"},{"value":"513429","label":"布拖县"},{"value":"513430","label":"金阳县"},{"value":"513431","label":"昭觉县"},{"value":"513432","label":"喜德县"},{"value":"513433","label":"冕宁县"},{"value":"513434","label":"越西县"},{"value":"513435","label":"甘洛县"},{"value":"513436","label":"美姑县"},{"value":"513437","label":"雷波县"}]}]},{"label":"贵州省","value":"520000","children":[{"value":"520100","label":"贵阳市","children":[{"value":"520102","label":"南明区"},{"value":"520103","label":"云岩区"},{"value":"520111","label":"花溪区"},{"value":"520112","label":"乌当区"},{"value":"520113","label":"白云区"},{"value":"520114","label":"小河区"},{"value":"520121","label":"开阳县"},{"value":"520122","label":"息烽县"},{"value":"520123","label":"修文县"},{"value":"520151","label":"金阳开发区"},{"value":"520181","label":"清镇市"}]},{"value":"520200","label":"六盘水市","children":[{"value":"520201","label":"钟山区"},{"value":"520203","label":"六枝特区"},{"value":"520221","label":"水城县"},{"value":"520222","label":"盘县"}]},{"value":"520300","label":"遵义市","children":[{"value":"520302","label":"红花岗区"},{"value":"520303","label":"汇川区"},{"value":"520321","label":"遵义县"},{"value":"520322","label":"桐梓县"},{"value":"520323","label":"绥阳县"},{"value":"520324","label":"正安县"},{"value":"520325","label":"道真仡佬族苗族自治县"},{"value":"520326","label":"务川仡佬族苗族自治县"},{"value":"520327","label":"凤冈县"},{"value":"520328","label":"湄潭县"},{"value":"520329","label":"余庆县"},{"value":"520330","label":"习水县"},{"value":"520381","label":"赤水市"},{"value":"520382","label":"仁怀市"}]},{"value":"520400","label":"安顺市","children":[{"value":"520402","label":"西秀区"},{"value":"520421","label":"平坝县"},{"value":"520422","label":"普定县"},{"value":"520423","label":"镇宁布依族苗族自治县"},{"value":"520424","label":"关岭布依族苗族自治县"},{"value":"520425","label":"紫云苗族布依族自治县"}]},{"value":"522200","label":"铜仁地区","children":[{"value":"522201","label":"铜仁市"},{"value":"522222","label":"江口县"},{"value":"522223","label":"玉屏侗族自治县"},{"value":"522224","label":"石阡县"},{"value":"522225","label":"思南县"},{"value":"522226","label":"印江土家族苗族自治县"},{"value":"522227","label":"德江县"},{"value":"522228","label":"沿河土家族自治县"},{"value":"522229","label":"松桃苗族自治县"},{"value":"522230","label":"万山特区"}]},{"value":"522300","label":"黔西南布依族苗族自治州","children":[{"value":"522301","label":"兴义市"},{"value":"522322","label":"兴仁县"},{"value":"522323","label":"普安县"},{"value":"522324","label":"晴隆县"},{"value":"522325","label":"贞丰县"},{"value":"522326","label":"望谟县"},{"value":"522327","label":"册亨县"},{"value":"522328","label":"安龙县"}]},{"value":"522400","label":"毕节地区","children":[{"value":"522401","label":"毕节市"},{"value":"522422","label":"大方县"},{"value":"522423","label":"黔西县"},{"value":"522424","label":"金沙县"},{"value":"522425","label":"织金县"},{"value":"522426","label":"纳雍县"},{"value":"522427","label":"威宁彝族回族苗族自治县"},{"value":"522428","label":"赫章县"}]},{"value":"522600","label":"黔东南苗族侗族自治州","children":[{"value":"522601","label":"凯里市"},{"value":"522622","label":"黄平县"},{"value":"522623","label":"施秉县"},{"value":"522624","label":"三穗县"},{"value":"522625","label":"镇远县"},{"value":"522626","label":"岑巩县"},{"value":"522627","label":"天柱县"},{"value":"522628","label":"锦屏县"},{"value":"522629","label":"剑河县"},{"value":"522630","label":"台江县"},{"value":"522631","label":"黎平县"},{"value":"522632","label":"榕江县"},{"value":"522633","label":"从江县"},{"value":"522634","label":"雷山县"},{"value":"522635","label":"麻江县"},{"value":"522636","label":"丹寨县"}]},{"value":"522700","label":"黔南布依族苗族自治州","children":[{"value":"522701","label":"都匀市"},{"value":"522702","label":"福泉市"},{"value":"522722","label":"荔波县"},{"value":"522723","label":"贵定县"},{"value":"522725","label":"瓮安县"},{"value":"522726","label":"独山县"},{"value":"522727","label":"平塘县"},{"value":"522728","label":"罗甸县"},{"value":"522729","label":"长顺县"},{"value":"522730","label":"龙里县"},{"value":"522731","label":"惠水县"},{"value":"522732","label":"三都水族自治县"}]}]},{"label":"云南省","value":"530000","children":[{"value":"530100","label":"昆明市","children":[{"value":"530102","label":"五华区"},{"value":"530103","label":"盘龙区"},{"value":"530111","label":"官渡区"},{"value":"530112","label":"西山区"},{"value":"530113","label":"东川区"},{"value":"530121","label":"呈贡县"},{"value":"530122","label":"晋宁县"},{"value":"530124","label":"富民县"},{"value":"530125","label":"宜良县"},{"value":"530126","label":"石林彝族自治县"},{"value":"530127","label":"嵩明县"},{"value":"530128","label":"禄劝彝族苗族自治县"},{"value":"530129","label":"寻甸回族彝族自治县"},{"value":"530181","label":"安宁市"}]},{"value":"530300","label":"曲靖市","children":[{"value":"530302","label":"麒麟区"},{"value":"530321","label":"马龙县"},{"value":"530322","label":"陆良县"},{"value":"530323","label":"师宗县"},{"value":"530324","label":"罗平县"},{"value":"530325","label":"富源县"},{"value":"530326","label":"会泽县"},{"value":"530328","label":"沾益县"},{"value":"530381","label":"宣威市"}]},{"value":"530400","label":"玉溪市","children":[{"value":"530402","label":"红塔区"},{"value":"530421","label":"江川县"},{"value":"530422","label":"澄江县"},{"value":"530423","label":"通海县"},{"value":"530424","label":"华宁县"},{"value":"530425","label":"易门县"},{"value":"530426","label":"峨山彝族自治县"},{"value":"530427","label":"新平彝族傣族自治县"},{"value":"530428","label":"元江哈尼族彝族傣族自治县"}]},{"value":"530500","label":"保山市","children":[{"value":"530502","label":"隆阳区"},{"value":"530521","label":"施甸县"},{"value":"530522","label":"腾冲县"},{"value":"530523","label":"龙陵县"},{"value":"530524","label":"昌宁县"}]},{"value":"530600","label":"昭通市","children":[{"value":"530602","label":"昭阳区"},{"value":"530621","label":"鲁甸县"},{"value":"530622","label":"巧家县"},{"value":"530623","label":"盐津县"},{"value":"530624","label":"大关县"},{"value":"530625","label":"永善县"},{"value":"530626","label":"绥江县"},{"value":"530627","label":"镇雄县"},{"value":"530628","label":"彝良县"},{"value":"530629","label":"威信县"},{"value":"530630","label":"水富县"}]},{"value":"530700","label":"丽江市","children":[{"value":"530702","label":"古城区"},{"value":"530721","label":"玉龙纳西族自治县"},{"value":"530722","label":"永胜县"},{"value":"530723","label":"华坪县"},{"value":"530724","label":"宁蒗彝族自治县"}]},{"value":"530800","label":"普洱市","children":[{"value":"530802","label":"思茅区"},{"value":"530821","label":"宁洱哈尼族彝族自治县"},{"value":"530822","label":"墨江哈尼族自治县"},{"value":"530823","label":"景东彝族自治县"},{"value":"530824","label":"景谷傣族彝族自治县"},{"value":"530825","label":"镇沅彝族哈尼族拉祜族自治县"},{"value":"530826","label":"江城哈尼族彝族自治县"},{"value":"530827","label":"孟连傣族拉祜族佤族自治县"},{"value":"530828","label":"澜沧拉祜族自治县"},{"value":"530829","label":"西盟佤族自治县"}]},{"value":"530900","label":"临沧市","children":[{"value":"530902","label":"临翔区"},{"value":"530921","label":"凤庆县"},{"value":"530922","label":"云县"},{"value":"530923","label":"永德县"},{"value":"530924","label":"镇康县"},{"value":"530925","label":"双江拉祜族佤族布朗族傣族自治县"},{"value":"530926","label":"耿马傣族佤族自治县"},{"value":"530927","label":"沧源佤族自治县"}]},{"value":"532300","label":"楚雄彝族自治州","children":[{"value":"532301","label":"楚雄市"},{"value":"532322","label":"双柏县"},{"value":"532323","label":"牟定县"},{"value":"532324","label":"南华县"},{"value":"532325","label":"姚安县"},{"value":"532326","label":"大姚县"},{"value":"532327","label":"永仁县"},{"value":"532328","label":"元谋县"},{"value":"532329","label":"武定县"},{"value":"532331","label":"禄丰县"}]},{"value":"532500","label":"红河哈尼族彝族自治州","children":[{"value":"532501","label":"个旧市"},{"value":"532502","label":"开远市"},{"value":"532522","label":"蒙自县"},{"value":"532523","label":"屏边苗族自治县"},{"value":"532524","label":"建水县"},{"value":"532525","label":"石屏县"},{"value":"532526","label":"弥勒县"},{"value":"532527","label":"泸西县"},{"value":"532528","label":"元阳县"},{"value":"532529","label":"红河县"},{"value":"532530","label":"金平苗族瑶族傣族自治县"},{"value":"532531","label":"绿春县"},{"value":"532532","label":"河口瑶族自治县"}]},{"value":"532600","label":"文山壮族苗族自治州","children":[{"value":"532621","label":"文山县"},{"value":"532622","label":"砚山县"},{"value":"532623","label":"西畴县"},{"value":"532624","label":"麻栗坡县"},{"value":"532625","label":"马关县"},{"value":"532626","label":"丘北县"},{"value":"532627","label":"广南县"},{"value":"532628","label":"富宁县"}]},{"value":"532800","label":"西双版纳傣族自治州","children":[{"value":"532801","label":"景洪市"},{"value":"532822","label":"勐海县"},{"value":"532823","label":"勐腊县"}]},{"value":"532900","label":"大理白族自治州","children":[{"value":"532901","label":"大理市"},{"value":"532922","label":"漾濞彝族自治县"},{"value":"532923","label":"祥云县"},{"value":"532924","label":"宾川县"},{"value":"532925","label":"弥渡县"},{"value":"532926","label":"南涧彝族自治县"},{"value":"532927","label":"巍山彝族回族自治县"},{"value":"532928","label":"永平县"},{"value":"532929","label":"云龙县"},{"value":"532930","label":"洱源县"},{"value":"532931","label":"剑川县"},{"value":"532932","label":"鹤庆县"}]},{"value":"533100","label":"德宏傣族景颇族自治州","children":[{"value":"533102","label":"瑞丽市"},{"value":"533103","label":"潞西市"},{"value":"533122","label":"梁河县"},{"value":"533123","label":"盈江县"},{"value":"533124","label":"陇川县"}]},{"value":"533300","label":"怒江傈僳族自治州","children":[{"value":"533321","label":"泸水县"},{"value":"533323","label":"福贡县"},{"value":"533324","label":"贡山独龙族怒族自治县"},{"value":"533325","label":"兰坪白族普米族自治县"}]},{"value":"533400","label":"迪庆藏族自治州","children":[{"value":"533421","label":"香格里拉县"},{"value":"533422","label":"德钦县"},{"value":"533423","label":"维西傈僳族自治县"}]}]},{"label":"西藏自治区","value":"540000","children":[{"value":"540100","label":"拉萨市","children":[{"value":"540102","label":"城关区"},{"value":"540121","label":"林周县"},{"value":"540122","label":"当雄县"},{"value":"540123","label":"尼木县"},{"value":"540124","label":"曲水县"},{"value":"540125","label":"堆龙德庆县"},{"value":"540126","label":"达孜县"},{"value":"540127","label":"墨竹工卡县"}]},{"value":"542100","label":"昌都地区","children":[{"value":"542121","label":"昌都县"},{"value":"542122","label":"江达县"},{"value":"542123","label":"贡觉县"},{"value":"542124","label":"类乌齐县"},{"value":"542125","label":"丁青县"},{"value":"542126","label":"察雅县"},{"value":"542127","label":"八宿县"},{"value":"542128","label":"左贡县"},{"value":"542129","label":"芒康县"},{"value":"542132","label":"洛隆县"},{"value":"542133","label":"边坝县"}]},{"value":"542200","label":"山南地区","children":[{"value":"542221","label":"乃东县"},{"value":"542222","label":"扎囊县"},{"value":"542223","label":"贡嘎县"},{"value":"542224","label":"桑日县"},{"value":"542225","label":"琼结县"},{"value":"542226","label":"曲松县"},{"value":"542227","label":"措美县"},{"value":"542228","label":"洛扎县"},{"value":"542229","label":"加查县"},{"value":"542231","label":"隆子县"},{"value":"542232","label":"错那县"},{"value":"542233","label":"浪卡子县"}]},{"value":"542300","label":"日喀则地区","children":[{"value":"542301","label":"日喀则市"},{"value":"542322","label":"南木林县"},{"value":"542323","label":"江孜县"},{"value":"542324","label":"定日县"},{"value":"542325","label":"萨迦县"},{"value":"542326","label":"拉孜县"},{"value":"542327","label":"昂仁县"},{"value":"542328","label":"谢通门县"},{"value":"542329","label":"白朗县"},{"value":"542330","label":"仁布县"},{"value":"542331","label":"康马县"},{"value":"542332","label":"定结县"},{"value":"542333","label":"仲巴县"},{"value":"542334","label":"亚东县"},{"value":"542335","label":"吉隆县"},{"value":"542336","label":"聂拉木县"},{"value":"542337","label":"萨嘎县"},{"value":"542338","label":"岗巴县"}]},{"value":"542400","label":"那曲地区","children":[{"value":"542421","label":"那曲县"},{"value":"542422","label":"嘉黎县"},{"value":"542423","label":"比如县"},{"value":"542424","label":"聂荣县"},{"value":"542425","label":"安多县"},{"value":"542426","label":"申扎县"},{"value":"542427","label":"索县"},{"value":"542428","label":"班戈县"},{"value":"542429","label":"巴青县"},{"value":"542430","label":"尼玛县"}]},{"value":"542500","label":"阿里地区","children":[{"value":"542521","label":"普兰县"},{"value":"542522","label":"札达县"},{"value":"542523","label":"噶尔县"},{"value":"542524","label":"日土县"},{"value":"542525","label":"革吉县"},{"value":"542526","label":"改则县"},{"value":"542527","label":"措勤县"}]},{"value":"542600","label":"林芝地区","children":[{"value":"542621","label":"林芝县"},{"value":"542622","label":"工布江达县"},{"value":"542623","label":"米林县"},{"value":"542624","label":"墨脱县"},{"value":"542625","label":"波密县"},{"value":"542626","label":"察隅县"},{"value":"542627","label":"朗县"}]}]},{"label":"陕西省","value":"610000","children":[{"value":"610100","label":"西安市","children":[{"value":"610102","label":"新城区"},{"value":"610103","label":"碑林区"},{"value":"610104","label":"莲湖区"},{"value":"610111","label":"灞桥区"},{"value":"610112","label":"未央区"},{"value":"610113","label":"雁塔区"},{"value":"610114","label":"阎良区"},{"value":"610115","label":"临潼区"},{"value":"610116","label":"长安区"},{"value":"610122","label":"蓝田县"},{"value":"610124","label":"周至县"},{"value":"610125","label":"户县"},{"value":"610126","label":"高陵县"}]},{"value":"610200","label":"铜川市","children":[{"value":"610202","label":"王益区"},{"value":"610203","label":"印台区"},{"value":"610204","label":"耀州区"},{"value":"610222","label":"宜君县"}]},{"value":"610300","label":"宝鸡市","children":[{"value":"610302","label":"渭滨区"},{"value":"610303","label":"金台区"},{"value":"610304","label":"陈仓区"},{"value":"610322","label":"凤翔县"},{"value":"610323","label":"岐山县"},{"value":"610324","label":"扶风县"},{"value":"610326","label":"眉县"},{"value":"610327","label":"陇县"},{"value":"610328","label":"千阳县"},{"value":"610329","label":"麟游县"},{"value":"610330","label":"凤县"},{"value":"610331","label":"太白县"}]},{"value":"610400","label":"咸阳市","children":[{"value":"610402","label":"秦都区"},{"value":"610403","label":"杨陵区"},{"value":"610404","label":"渭城区"},{"value":"610422","label":"三原县"},{"value":"610423","label":"泾阳县"},{"value":"610424","label":"乾县"},{"value":"610425","label":"礼泉县"},{"value":"610426","label":"永寿县"},{"value":"610427","label":"彬县"},{"value":"610428","label":"长武县"},{"value":"610429","label":"旬邑县"},{"value":"610430","label":"淳化县"},{"value":"610431","label":"武功县"},{"value":"610481","label":"兴平市"}]},{"value":"610500","label":"渭南市","children":[{"value":"610502","label":"临渭区"},{"value":"610521","label":"华县"},{"value":"610522","label":"潼关县"},{"value":"610523","label":"大荔县"},{"value":"610524","label":"合阳县"},{"value":"610525","label":"澄城县"},{"value":"610526","label":"蒲城县"},{"value":"610527","label":"白水县"},{"value":"610528","label":"富平县"},{"value":"610581","label":"韩城市"},{"value":"610582","label":"华阴市"}]},{"value":"610600","label":"延安市","children":[{"value":"610602","label":"宝塔区"},{"value":"610621","label":"延长县"},{"value":"610622","label":"延川县"},{"value":"610623","label":"子长县"},{"value":"610624","label":"安塞县"},{"value":"610625","label":"志丹县"},{"value":"610626","label":"吴起县"},{"value":"610627","label":"甘泉县"},{"value":"610628","label":"富县"},{"value":"610629","label":"洛川县"},{"value":"610630","label":"宜川县"},{"value":"610631","label":"黄龙县"},{"value":"610632","label":"黄陵县"}]},{"value":"610700","label":"汉中市","children":[{"value":"610702","label":"汉台区"},{"value":"610721","label":"南郑县"},{"value":"610722","label":"城固县"},{"value":"610723","label":"洋县"},{"value":"610724","label":"西乡县"},{"value":"610725","label":"勉县"},{"value":"610726","label":"宁强县"},{"value":"610727","label":"略阳县"},{"value":"610728","label":"镇巴县"},{"value":"610729","label":"留坝县"},{"value":"610730","label":"佛坪县"}]},{"value":"610800","label":"榆林市","children":[{"value":"610802","label":"榆阳区"},{"value":"610821","label":"神木县"},{"value":"610822","label":"府谷县"},{"value":"610823","label":"横山县"},{"value":"610824","label":"靖边县"},{"value":"610825","label":"定边县"},{"value":"610826","label":"绥德县"},{"value":"610827","label":"米脂县"},{"value":"610828","label":"佳县"},{"value":"610829","label":"吴堡县"},{"value":"610830","label":"清涧县"},{"value":"610831","label":"子洲县"}]},{"value":"610900","label":"安康市","children":[{"value":"610902","label":"汉滨区"},{"value":"610921","label":"汉阴县"},{"value":"610922","label":"石泉县"},{"value":"610923","label":"宁陕县"},{"value":"610924","label":"紫阳县"},{"value":"610925","label":"岚皋县"},{"value":"610926","label":"平利县"},{"value":"610927","label":"镇坪县"},{"value":"610928","label":"旬阳县"},{"value":"610929","label":"白河县"}]},{"value":"611000","label":"商洛市","children":[{"value":"611002","label":"商州区"},{"value":"611021","label":"洛南县"},{"value":"611022","label":"丹凤县"},{"value":"611023","label":"商南县"},{"value":"611024","label":"山阳县"},{"value":"611025","label":"镇安县"},{"value":"611026","label":"柞水县"}]}]},{"label":"甘肃省","value":"620000","children":[{"value":"620100","label":"兰州市","children":[{"value":"620102","label":"城关区"},{"value":"620103","label":"七里河区"},{"value":"620104","label":"西固区"},{"value":"620105","label":"安宁区"},{"value":"620111","label":"红古区"},{"value":"620121","label":"永登县"},{"value":"620122","label":"皋兰县"},{"value":"620123","label":"榆中县"}]},{"value":"620200","label":"嘉峪关市"},{"value":"620300","label":"金昌市","children":[{"value":"620302","label":"金川区"},{"value":"620321","label":"永昌县"}]},{"value":"620400","label":"白银市","children":[{"value":"620402","label":"白银区"},{"value":"620403","label":"平川区"},{"value":"620421","label":"靖远县"},{"value":"620422","label":"会宁县"},{"value":"620423","label":"景泰县"}]},{"value":"620500","label":"天水市","children":[{"value":"620502","label":"秦州区"},{"value":"620503","label":"麦积区"},{"value":"620521","label":"清水县"},{"value":"620522","label":"秦安县"},{"value":"620523","label":"甘谷县"},{"value":"620524","label":"武山县"},{"value":"620525","label":"张家川回族自治县"}]},{"value":"620600","label":"武威市","children":[{"value":"620602","label":"凉州区"},{"value":"620621","label":"民勤县"},{"value":"620622","label":"古浪县"},{"value":"620623","label":"天祝藏族自治县"}]},{"value":"620700","label":"张掖市","children":[{"value":"620702","label":"甘州区"},{"value":"620721","label":"肃南裕固族自治县"},{"value":"620722","label":"民乐县"},{"value":"620723","label":"临泽县"},{"value":"620724","label":"高台县"},{"value":"620725","label":"山丹县"}]},{"value":"620800","label":"平凉市","children":[{"value":"620802","label":"崆峒区"},{"value":"620821","label":"泾川县"},{"value":"620822","label":"灵台县"},{"value":"620823","label":"崇信县"},{"value":"620824","label":"华亭县"},{"value":"620825","label":"庄浪县"},{"value":"620826","label":"静宁县"}]},{"value":"620900","label":"酒泉市","children":[{"value":"620902","label":"肃州区"},{"value":"620921","label":"金塔县"},{"value":"620922","label":"安西县"},{"value":"620923","label":"肃北蒙古族自治县"},{"value":"620924","label":"阿克塞哈萨克族自治县"},{"value":"620981","label":"玉门市"},{"value":"620982","label":"敦煌市"}]},{"value":"621000","label":"庆阳市","children":[{"value":"621002","label":"西峰区"},{"value":"621021","label":"庆城县"},{"value":"621022","label":"环县"},{"value":"621023","label":"华池县"},{"value":"621024","label":"合水县"},{"value":"621025","label":"正宁县"},{"value":"621026","label":"宁县"},{"value":"621027","label":"镇原县"}]},{"value":"621100","label":"定西市","children":[{"value":"621102","label":"安定区"},{"value":"621121","label":"通渭县"},{"value":"621122","label":"陇西县"},{"value":"621123","label":"渭源县"},{"value":"621124","label":"临洮县"},{"value":"621125","label":"漳县"},{"value":"621126","label":"岷县"}]},{"value":"621200","label":"陇南市","children":[{"value":"621202","label":"武都区"},{"value":"621221","label":"成县"},{"value":"621222","label":"文县"},{"value":"621223","label":"宕昌县"},{"value":"621224","label":"康县"},{"value":"621225","label":"西和县"},{"value":"621226","label":"礼县"},{"value":"621227","label":"徽县"},{"value":"621228","label":"两当县"}]},{"value":"622900","label":"临夏回族自治州","children":[{"value":"622901","label":"临夏市"},{"value":"622921","label":"临夏县"},{"value":"622922","label":"康乐县"},{"value":"622923","label":"永靖县"},{"value":"622924","label":"广河县"},{"value":"622925","label":"和政县"},{"value":"622926","label":"东乡族自治县"},{"value":"622927","label":"积石山保安族东乡族撒拉族自治县"}]},{"value":"623000","label":"甘南藏族自治州","children":[{"value":"623001","label":"合作市"},{"value":"623021","label":"临潭县"},{"value":"623022","label":"卓尼县"},{"value":"623023","label":"舟曲县"},{"value":"623024","label":"迭部县"},{"value":"623025","label":"玛曲县"},{"value":"623026","label":"碌曲县"},{"value":"623027","label":"夏河县"}]}]},{"label":"青海省","value":"630000","children":[{"value":"630100","label":"西宁市","children":[{"value":"630102","label":"城东区"},{"value":"630103","label":"城中区"},{"value":"630104","label":"城西区"},{"value":"630105","label":"城北区"},{"value":"630121","label":"大通回族土族自治县"},{"value":"630122","label":"湟中县"},{"value":"630123","label":"湟源县"}]},{"value":"632100","label":"海东地区","children":[{"value":"632121","label":"平安县"},{"value":"632122","label":"民和回族土族自治县"},{"value":"632123","label":"乐都县"},{"value":"632126","label":"互助土族自治县"},{"value":"632127","label":"化隆回族自治县"},{"value":"632128","label":"循化撒拉族自治县"}]},{"value":"632200","label":"海北藏族自治州","children":[{"value":"632221","label":"门源回族自治县"},{"value":"632222","label":"祁连县"},{"value":"632223","label":"海晏县"},{"value":"632224","label":"刚察县"}]},{"value":"632300","label":"黄南藏族自治州","children":[{"value":"632321","label":"同仁县"},{"value":"632322","label":"尖扎县"},{"value":"632323","label":"泽库县"},{"value":"632324","label":"河南蒙古族自治县"}]},{"value":"632500","label":"海南藏族自治州","children":[{"value":"632521","label":"共和县"},{"value":"632522","label":"同德县"},{"value":"632523","label":"贵德县"},{"value":"632524","label":"兴海县"},{"value":"632525","label":"贵南县"}]},{"value":"632600","label":"果洛藏族自治州","children":[{"value":"632621","label":"玛沁县"},{"value":"632622","label":"班玛县"},{"value":"632623","label":"甘德县"},{"value":"632624","label":"达日县"},{"value":"632625","label":"久治县"},{"value":"632626","label":"玛多县"}]},{"value":"632700","label":"玉树藏族自治州","children":[{"value":"632721","label":"玉树县"},{"value":"632722","label":"杂多县"},{"value":"632723","label":"称多县"},{"value":"632724","label":"治多县"},{"value":"632725","label":"囊谦县"},{"value":"632726","label":"曲麻莱县"}]},{"value":"632800","label":"海西蒙古族藏族自治州","children":[{"value":"632801","label":"格尔木市"},{"value":"632802","label":"德令哈市"},{"value":"632821","label":"乌兰县"},{"value":"632822","label":"都兰县"},{"value":"632823","label":"天峻县"}]}]},{"label":"宁夏回族自治区","value":"640000","children":[{"value":"640100","label":"银川市","children":[{"value":"640104","label":"兴庆区"},{"value":"640105","label":"西夏区"},{"value":"640106","label":"金凤区"},{"value":"640121","label":"永宁县"},{"value":"640122","label":"贺兰县"},{"value":"640181","label":"灵武市"}]},{"value":"640200","label":"石嘴山市","children":[{"value":"640202","label":"大武口区"},{"value":"640205","label":"惠农区"},{"value":"640221","label":"平罗县"}]},{"value":"640300","label":"吴忠市","children":[{"value":"640302","label":"利通区"},{"value":"640303","label":"红寺堡区"},{"value":"640323","label":"盐池县"},{"value":"640324","label":"同心县"},{"value":"640381","label":"青铜峡市"}]},{"value":"640400","label":"固原市","children":[{"value":"640402","label":"原州区"},{"value":"640422","label":"西吉县"},{"value":"640423","label":"隆德县"},{"value":"640424","label":"泾源县"},{"value":"640425","label":"彭阳县"}]},{"value":"640500","label":"中卫市","children":[{"value":"640502","label":"沙坡头区"},{"value":"640521","label":"中宁县"},{"value":"640522","label":"海原县"}]}]},{"label":"新疆维吾尔自治区","value":"650000","children":[{"value":"650100","label":"乌鲁木齐市","children":[{"value":"650102","label":"天山区"},{"value":"650103","label":"沙依巴克区"},{"value":"650104","label":"新市区"},{"value":"650105","label":"水磨沟区"},{"value":"650106","label":"头屯河区"},{"value":"650107","label":"达坂城区"},{"value":"650108","label":"东山区"},{"value":"650109","label":"米东区"},{"value":"650121","label":"乌鲁木齐县"}]},{"value":"650200","label":"克拉玛依市","children":[{"value":"650202","label":"独山子区"},{"value":"650203","label":"克拉玛依区"},{"value":"650204","label":"白碱滩区"},{"value":"650205","label":"乌尔禾区"}]},{"value":"652100","label":"吐鲁番地区","children":[{"value":"652101","label":"吐鲁番市"},{"value":"652122","label":"鄯善县"},{"value":"652123","label":"托克逊县"}]},{"value":"652200","label":"哈密地区","children":[{"value":"652201","label":"哈密市"},{"value":"652222","label":"巴里坤哈萨克自治县"},{"value":"652223","label":"伊吾县"}]},{"value":"652300","label":"昌吉回族自治州","children":[{"value":"652301","label":"昌吉市"},{"value":"652302","label":"阜康市"},{"value":"652303","label":"米泉市"},{"value":"652323","label":"呼图壁县"},{"value":"652324","label":"玛纳斯县"},{"value":"652325","label":"奇台县"},{"value":"652327","label":"吉木萨尔县"},{"value":"652328","label":"木垒哈萨克自治县"}]},{"value":"652700","label":"博尔塔拉蒙古自治州","children":[{"value":"652701","label":"博乐市"},{"value":"652722","label":"精河县"},{"value":"652723","label":"温泉县"}]},{"value":"652800","label":"巴音郭楞蒙古自治州","children":[{"value":"652801","label":"库尔勒市"},{"value":"652822","label":"轮台县"},{"value":"652823","label":"尉犁县"},{"value":"652824","label":"若羌县"},{"value":"652825","label":"且末县"},{"value":"652826","label":"焉耆回族自治县"},{"value":"652827","label":"和静县"},{"value":"652828","label":"和硕县"},{"value":"652829","label":"博湖县"}]},{"value":"652900","label":"阿克苏地区","children":[{"value":"652901","label":"阿克苏市"},{"value":"652922","label":"温宿县"},{"value":"652923","label":"库车县"},{"value":"652924","label":"沙雅县"},{"value":"652925","label":"新和县"},{"value":"652926","label":"拜城县"},{"value":"652927","label":"乌什县"},{"value":"652928","label":"阿瓦提县"},{"value":"652929","label":"柯坪县"}]},{"value":"653000","label":"克孜勒苏柯尔克孜自治州","children":[{"value":"653001","label":"阿图什市"},{"value":"653022","label":"阿克陶县"},{"value":"653023","label":"阿合奇县"},{"value":"653024","label":"乌恰县"}]},{"value":"653100","label":"喀什地区","children":[{"value":"653101","label":"喀什市"},{"value":"653121","label":"疏附县"},{"value":"653122","label":"疏勒县"},{"value":"653123","label":"英吉沙县"},{"value":"653124","label":"泽普县"},{"value":"653125","label":"莎车县"},{"value":"653126","label":"叶城县"},{"value":"653127","label":"麦盖提县"},{"value":"653128","label":"岳普湖县"},{"value":"653129","label":"伽师县"},{"value":"653130","label":"巴楚县"},{"value":"653131","label":"塔什库尔干塔吉克自治县"}]},{"value":"653200","label":"和田地区","children":[{"value":"653201","label":"和田市"},{"value":"653221","label":"和田县"},{"value":"653222","label":"墨玉县"},{"value":"653223","label":"皮山县"},{"value":"653224","label":"洛浦县"},{"value":"653225","label":"策勒县"},{"value":"653226","label":"于田县"},{"value":"653227","label":"民丰县"}]},{"value":"654000","label":"伊犁哈萨克自治州","children":[{"value":"654002","label":"伊宁市"},{"value":"654003","label":"奎屯市"},{"value":"654021","label":"伊宁县"},{"value":"654022","label":"察布查尔锡伯自治县"},{"value":"654023","label":"霍城县"},{"value":"654024","label":"巩留县"},{"value":"654025","label":"新源县"},{"value":"654026","label":"昭苏县"},{"value":"654027","label":"特克斯县"},{"value":"654028","label":"尼勒克县"}]},{"value":"654200","label":"塔城地区","children":[{"value":"654201","label":"塔城市"},{"value":"654202","label":"乌苏市"},{"value":"654221","label":"额敏县"},{"value":"654223","label":"沙湾县"},{"value":"654224","label":"托里县"},{"value":"654225","label":"裕民县"},{"value":"654226","label":"和布克赛尔蒙古自治县"}]},{"value":"654300","label":"阿勒泰地区","children":[{"value":"654301","label":"阿勒泰市"},{"value":"654321","label":"布尔津县"},{"value":"654322","label":"富蕴县"},{"value":"654323","label":"福海县"},{"value":"654324","label":"哈巴河县"},{"value":"654325","label":"青河县"},{"value":"654326","label":"吉木乃县"}]},{"value":"659001","label":"石河子市"},{"value":"659002","label":"阿拉尔市"},{"value":"659003","label":"图木舒克市"},{"value":"659004","label":"五家渠市"}]},{"label":"台湾省","value":"710000","children":[{"value":"710100","label":"台北市","children":[{"value":"710101","label":"中正区"},{"value":"710102","label":"大同区"},{"value":"710103","label":"中山区"},{"value":"710104","label":"松山区"},{"value":"710105","label":"大安区"},{"value":"710106","label":"万华区"},{"value":"710107","label":"信义区"},{"value":"710108","label":"士林区"},{"value":"710109","label":"北投区"},{"value":"710110","label":"内湖区"},{"value":"710111","label":"南港区"},{"value":"710112","label":"文山区"}]},{"value":"710200","label":"高雄市","children":[{"value":"710201","label":"新兴区"},{"value":"710202","label":"前金区"},{"value":"710203","label":"芩雅区"},{"value":"710204","label":"盐埕区"},{"value":"710205","label":"鼓山区"},{"value":"710206","label":"旗津区"},{"value":"710207","label":"前镇区"},{"value":"710208","label":"三民区"},{"value":"710209","label":"左营区"},{"value":"710210","label":"楠梓区"},{"value":"710211","label":"小港区"}]},{"value":"710300","label":"台南市","children":[{"value":"710301","label":"中西区"},{"value":"710302","label":"东区"},{"value":"710303","label":"南区"},{"value":"710304","label":"北区"},{"value":"710305","label":"安平区"},{"value":"710306","label":"安南区"}]},{"value":"710400","label":"台中市","children":[{"value":"710401","label":"中区"},{"value":"710402","label":"东区"},{"value":"710403","label":"南区"},{"value":"710404","label":"西区"},{"value":"710405","label":"北区"},{"value":"710406","label":"北屯区"},{"value":"710407","label":"西屯区"},{"value":"710408","label":"南屯区"}]},{"value":"710500","label":"金门县"},{"value":"710600","label":"南投县"},{"value":"710700","label":"基隆市","children":[{"value":"710701","label":"仁爱区"},{"value":"710702","label":"信义区"},{"value":"710703","label":"中正区"},{"value":"710704","label":"中山区"},{"value":"710705","label":"安乐区"},{"value":"710706","label":"暖暖区"},{"value":"710707","label":"七堵区"}]},{"value":"710800","label":"新竹市","children":[{"value":"710801","label":"东区"},{"value":"710802","label":"北区"},{"value":"710803","label":"香山区"}]},{"value":"710900","label":"嘉义市","children":[{"value":"710901","label":"东区"},{"value":"710902","label":"西区"}]},{"value":"711100","label":"新北市"},{"value":"711200","label":"宜兰县"},{"value":"711300","label":"新竹县"},{"value":"711400","label":"桃园县"},{"value":"711500","label":"苗栗县"},{"value":"711700","label":"彰化县"},{"value":"711900","label":"嘉义县"},{"value":"712100","label":"云林县"},{"value":"712400","label":"屏东县"},{"value":"712500","label":"台东县"},{"value":"712600","label":"花莲县"},{"value":"712700","label":"澎湖县"}]},{"label":"香港特别行政区","value":"810000","children":[{"value":"810100","label":"香港岛","children":[{"value":"810101","label":"中西区"},{"value":"810102","label":"湾仔"},{"value":"810103","label":"东区"},{"value":"810104","label":"南区"}]},{"value":"810200","label":"九龙","children":[{"value":"810201","label":"九龙城区"},{"value":"810202","label":"油尖旺区"},{"value":"810203","label":"深水埗区"},{"value":"810204","label":"黄大仙区"},{"value":"810205","label":"观塘区"}]},{"value":"810300","label":"新界","children":[{"value":"810301","label":"北区"},{"value":"810302","label":"大埔区"},{"value":"810303","label":"沙田区"},{"value":"810304","label":"西贡区"},{"value":"810305","label":"元朗区"},{"value":"810306","label":"屯门区"},{"value":"810307","label":"荃湾区"},{"value":"810308","label":"葵青区"},{"value":"810309","label":"离岛区"}]}]},{"label":"澳门特别行政区","value":"820000","children":[{"value":"820100","label":"澳门半岛"},{"value":"820200","label":"离岛"}]},{"label":"海外","value":"990000","children":[{"value":"990100","label":"海外"}]}] diff --git a/api/layout/index.ts b/api/layout/index.ts new file mode 100644 index 0000000..947f260 --- /dev/null +++ b/api/layout/index.ts @@ -0,0 +1,84 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { User } from '@/api/system/user/model'; +import type { UpdatePasswordParam } from './model'; +import { MODULES_API_URL, SERVER_API_URL } from '~/config'; +import type {Website} from "~/api/cms/website/model"; + +/** + * 获取网站信息 + */ +export async function getSiteInfo() { + const res = await request.get>( + MODULES_API_URL + '/cms/website/getSiteInfo' + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取当前登录的用户信息、菜单、权限、角色 + */ +export async function getUserInfo(): Promise { + const res = await request.get>(SERVER_API_URL + '/auth/user'); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取服务器时间(实时) + * @return + */ +export async function getServerTime() { + const res = await request.get>( + MODULES_API_URL + '/cms/website/getServerTime' + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取未来7天的日期 + * @return + */ +export async function getNext7day() { + const res = await request.get>( + MODULES_API_URL + '/cms/website/getNext7day' + ); + console.log('res.data.code: ', res.data.code); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 向子模块传递token + * @param url + */ +export async function transferToken(url: string): Promise { + const res = await request.get>(url); + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改当前登录的用户密码 + */ +export async function updatePassword( + data: UpdatePasswordParam +): Promise { + const res = await request.put>( + SERVER_API_URL + '/auth/password', + data + ); + if (res.data.code === 0) { + return res.data.message ?? '修改成功'; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/layout/model/index.ts b/api/layout/model/index.ts new file mode 100644 index 0000000..4173044 --- /dev/null +++ b/api/layout/model/index.ts @@ -0,0 +1,26 @@ + +/** + * 首页布局样式 + */ +export interface Layout { + // 内容区域的宽度 + width?: string; + // 文字颜色 + color?: string; + // 高亮颜色 + hover?: string; + // 背景颜色 + backgroundColor?: string; + headerStyle?: any; + siteNameStyle?: any; +} + +/** + * 修改密码参数 + */ +export interface UpdatePasswordParam { + // 新密码 + password: string; + // 原始密码 + oldPassword: string; +} diff --git a/api/oa/app/field/index.ts b/api/oa/app/field/index.ts new file mode 100644 index 0000000..864e7b1 --- /dev/null +++ b/api/oa/app/field/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { AppField, AppFieldParam } from '@/api/oa/app/field/model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询项目参数 + */ +export async function pageAppField(params: AppFieldParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/app-field/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目参数列表 + */ +export async function listAppField(params?: AppFieldParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-field', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询项目参数 + */ +export async function getAppField(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-field/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加项目参数 + */ +export async function addAppField(data: AppField) { + const res = await request.post>( + MODULES_API_URL + '/oa/app-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改项目参数 + */ +export async function updateAppField(data: AppField) { + const res = await request.put>( + MODULES_API_URL + '/oa/app-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除项目参数 + */ +export async function removeAppField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-field/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除项目参数 + */ +export async function removeBatchAppField(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-field/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-field/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/app/field/model/index.ts b/api/oa/app/field/model/index.ts new file mode 100644 index 0000000..788eaf5 --- /dev/null +++ b/api/oa/app/field/model/index.ts @@ -0,0 +1,24 @@ +import type { PageParam } from '@/api'; + +/** + * 项目参数 + */ +export interface AppField { + id?: number; + name?: string; + comments?: string; + userId?: number; + appId?: number; + status?: any; + sortNumber?: any; + createTime?: string; +} + +/** + * 项目参数搜索条件 + */ +export interface AppFieldParam extends PageParam { + id?: number; + userId?: number; + appId?: number; +} diff --git a/api/oa/app/index.ts b/api/oa/app/index.ts new file mode 100644 index 0000000..022960e --- /dev/null +++ b/api/oa/app/index.ts @@ -0,0 +1,190 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { App, AppParam } from './model/index'; +import { MODULES_API_URL } from '@/config'; + +export async function getCount() { + const res = await request.get(MODULES_API_URL + '/oa/app/data'); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询应用 + */ +export async function pageApp(params: AppParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/app/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用列表 + */ +export async function listApp(params?: AppParam) { + const res = await request.get>(MODULES_API_URL + '/oa/app', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用 + */ +export async function getApp(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/app/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用 + */ +export async function addApp(data: App) { + const res = await request.post>( + MODULES_API_URL + '/oa/app', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用 + */ +export async function updateApp(data: App) { + const res = await request.put>( + MODULES_API_URL + '/oa/app', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用 + */ +export async function removeApp(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用 + */ +export async function removeBatchApp(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/app/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getAppSecret(data: App) { + const res = await request.post>( + MODULES_API_URL + '/open/app/getAppSecret', + data + ); + if (res.data.code === 0 && res.data.data) { + return res.data; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function updateAppSecret(data: App) { + const res = await request.post>( + MODULES_API_URL + '/oa/app/updateAppSecret', + data + ); + if (res.data.code === 0 && res.data.data) { + return res.data; + } + return Promise.reject(new Error(res.data.message)); +} + +// 添加菜单 +export async function saveMenu(data: App) { + const res = await request.post>( + MODULES_API_URL + '/oa/app/saveMenu', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +// 添加菜单按钮 +export async function saveAuthority(data: any[]) { + const res = await request.post>( + MODULES_API_URL + '/oa/app/saveAuthority', + data + ); + if (res.data.code === 0) { + return res.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询我的项目信息 + */ +export async function getMyApp() { + const res = await request.get>( + MODULES_API_URL + '/oa/app/getMyApp' + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/app/model/index.ts b/api/oa/app/model/index.ts new file mode 100644 index 0000000..ef6a027 --- /dev/null +++ b/api/oa/app/model/index.ts @@ -0,0 +1,166 @@ +import type { PageParam } from '@/api'; +import { AppUser } from '@/api/oa/app/user/model'; +import { AppField } from '@/api/oa/app/field/model'; + +/** + * 应用 + */ +export interface App { + // 应用id + appId?: number; + // 应用秘钥 + appSecret?: string; + // 英文名称 + enName?: string; + // 应用名称 + appName?: string; + // 上级id, 0是顶级 + parentId?: number; + // 应用编号 + appCode?: string; + // 应用图标 + appIcon?: string; + appQrcode?: string; + // 应用截图 + images?: string; + // 应用类型 + appType?: string; + appTypeMultiple?: string[]; + // 菜单类型 + menuType?: number; + // 应用地址 + appUrl?: string; + // 后台管理地址 + adminUrl?: string; + // 原型图地址 + prototypeUrl?: string; + // 下载地址 + downUrl?: string; + // 服务器接口地址 + serverUrl?: string; + // 模块接口地址 + modulesUrl?: string; + // 回调地址 + callbackUrl?: string; + // 腾讯文档地址 + gitUrl?: string; + docsUrl?: string; + ipAddress?: string; + fileUrl?: string; + // 应用包名 + packageName?: string; + // 点击次数 + clicks?: string; + // 安装次数 + installs?: string; + // 项目介绍 + content?: string; + // 开发者(个人) + developer?: string; + director?: string; + projectDirector?: string; + salesman?: string; + // 续费金额 + renewMoney?: string; + // 软件定价 + price?: number; + // 评分 + score?: string; + // 星级 + star?: string; + // 菜单组件地址 + component?: string; + // 菜单路由地址 + path?: string; + // 权限标识 + authority?: string; + // 打开位置 + target?: string; + // 是否隐藏, 0否, 1是(仅注册路由不显示在左侧菜单) + hide?: number; + // 菜单侧栏选中的path + active?: string; + // 其它路由元信息 + meta?: string; + // 版本 + edition?: string; + // 版本号 + version?: string; + // 是否已安装 + isUse?: number; + // 排序 + sortNumber?: number; + // 备注 + comments?: any; + tenantName?: string; + companyId?: number; + companyName?: string; + // 租户编号 + tenantCode?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 过期时间 + expirationTime?: string; + // 应用状态 + appStatus?: string; + // 状态 + status?: number; + // 发布者 + userId?: any; + // 发布者昵称 + nickname?: string; + // 子菜单 + children?: App[]; + // 权限树回显选中状态, 0未选中, 1选中 + checked?: boolean; + // + key?: number; + // + value?: number; + // + parentIds?: number[]; + // + openType?: number; + // + search?: any; + // 成员管理 + users?: AppUser[]; + fields?: AppField[]; + // 项目需求 + requirement?: string; + phone?: string; + file1?: string; + file2?: string; + file3?: string; + showCase?: boolean; + showIndex?: boolean; + recommend?: boolean; + categoryName?: string; + title?: string; +} + +/** + * 应用搜索条件 + */ +export interface AppParam extends PageParam { + userId?: number; + appName?: any; + appCode?: string; + appId?: number; + developer?: string; + tenantCode?: string; + parentId?: string; + tenantName?: string; + companyName?: string; + companyId?: number; + status?: number; + nickname?: string; + appStatus?: any; + showCase?: boolean; + showIndex?: boolean; + showExpiration?: boolean; + keywords?: any; + sceneType?: string; +} diff --git a/api/oa/app/renew/index.ts b/api/oa/app/renew/index.ts new file mode 100644 index 0000000..fc0e13f --- /dev/null +++ b/api/oa/app/renew/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { AppRenew, AppRenewParam } from '@/api/oa/app/renew/model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询开发成员 + */ +export async function pageAppRenew(params: AppRenewParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/app-renew/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询开发成员列表 + */ +export async function listAppRenew(params?: AppRenewParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-renew', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询开发成员 + */ +export async function getAppRenew(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-renew/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加开发成员 + */ +export async function addAppRenew(data: AppRenew) { + const res = await request.post>( + MODULES_API_URL + '/oa/app-renew', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改开发成员 + */ +export async function updateAppRenew(data: AppRenew) { + const res = await request.put>( + MODULES_API_URL + '/oa/app-renew', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除开发成员 + */ +export async function removeAppRenew(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-renew/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除开发成员 + */ +export async function removeBatchAppRenew(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-renew/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-renew/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/app/renew/model/index.ts b/api/oa/app/renew/model/index.ts new file mode 100644 index 0000000..5bfd819 --- /dev/null +++ b/api/oa/app/renew/model/index.ts @@ -0,0 +1,40 @@ +import type { PageParam } from '@/api'; + +/** + * 开发成员 + */ +export interface AppRenew { + appRenewId?: number; + money?: any; + comments?: string; + startTime?: any; + endTime?: any; + userId?: number; + nickname?: string; + email?: string; + phone?: string; + mobile?: string; + appId?: number; + companyId?: number; + status?: any; + images?: string; + files?: any; + createTime?: string; + editStatus?: boolean; +} + +/** + * 开发成员搜索条件 + */ +export interface AppRenewParam extends PageParam { + userId?: number; + appId?: number; +} + +export interface UserItem { + key: string; + isEdit?: boolean; + number?: string; + name?: string; + department?: string; +} diff --git a/api/oa/app/url/index.ts b/api/oa/app/url/index.ts new file mode 100644 index 0000000..8bafcf0 --- /dev/null +++ b/api/oa/app/url/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { AppUrl, AppUrlParam } from '@/api/oa/app/url/model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询项目域名 + */ +export async function pageAppUrl(params: AppUrlParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/app-url/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目域名列表 + */ +export async function listAppUrl(params?: AppUrlParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-url', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询项目域名 + */ +export async function getAppUrl(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-url/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加项目域名 + */ +export async function addAppUrl(data: AppUrl) { + const res = await request.post>( + MODULES_API_URL + '/oa/app-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改项目域名 + */ +export async function updateAppUrl(data: AppUrl) { + const res = await request.put>( + MODULES_API_URL + '/oa/app-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除项目域名 + */ +export async function removeAppUrl(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-url/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除项目域名 + */ +export async function removeBatchAppUrl(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-url/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/app/url/model/index.ts b/api/oa/app/url/model/index.ts new file mode 100644 index 0000000..01f11c2 --- /dev/null +++ b/api/oa/app/url/model/index.ts @@ -0,0 +1,26 @@ +import type { PageParam } from '@/api'; + +/** + * 项目域名 + */ +export interface AppUrl { + appUrlId?: number; + name?: string; + domain?: string; + account?: string; + password?: string; + comments?: string; + appId?: number; + status?: any; + sortNumber?: any; + createTime?: string; +} + +/** + * 项目域名搜索条件 + */ +export interface AppUrlParam extends PageParam { + id?: number; + userId?: number; + appId?: number; +} diff --git a/api/oa/app/user/index.ts b/api/oa/app/user/index.ts new file mode 100644 index 0000000..6c3022f --- /dev/null +++ b/api/oa/app/user/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { AppUser, AppUserParam } from '@/api/oa/app/user/model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询开发成员 + */ +export async function pageAppUser(params: AppUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/app-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询开发成员列表 + */ +export async function listAppUser(params?: AppUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询开发成员 + */ +export async function getAppUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加开发成员 + */ +export async function addAppUser(data: AppUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/app-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改开发成员 + */ +export async function updateAppUser(data: AppUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/app-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除开发成员 + */ +export async function removeAppUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除开发成员 + */ +export async function removeBatchAppUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/app-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/app-user/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/app/user/model/index.ts b/api/oa/app/user/model/index.ts new file mode 100644 index 0000000..c544c0d --- /dev/null +++ b/api/oa/app/user/model/index.ts @@ -0,0 +1,37 @@ +import type { PageParam } from '@/api'; + +/** + * 开发成员 + */ +export interface AppUser { + // 开发成员id + appUserId?: number; + role?: number; + userId?: number; + username?: string; + nickname?: string; + avatar?: string; + email?: string; + phone?: string; + mobile?: string; + appId?: number; + status?: string; + createTime?: string; +} + +/** + * 开发成员搜索条件 + */ +export interface AppUserParam extends PageParam { + userId?: number; + appId?: number; + role?: number; +} + +export interface UserItem { + key: string; + isEdit?: boolean; + number?: string; + name?: string; + department?: string; +} diff --git a/api/oa/apply/index.ts b/api/oa/apply/index.ts new file mode 100644 index 0000000..01effea --- /dev/null +++ b/api/oa/apply/index.ts @@ -0,0 +1,18 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { Customer } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 申请免费体验 + */ +export async function apply(data: Customer) { + const res = await request.post>( + MODULES_API_URL + '/customer-apply', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/apply/model/index.ts b/api/oa/apply/model/index.ts new file mode 100644 index 0000000..099dbfd --- /dev/null +++ b/api/oa/apply/model/index.ts @@ -0,0 +1,43 @@ +import type { PageParam } from '@/api'; + +/** + * 客户 + */ +export interface Customer { + // 客户id + customerId?: number; + // 客户类型 + customerType?: string; + // 客户标识 + customerCode: string; + // 客户名称 + customerName?: string; + // 客户头像 + customerAvatar?: string; + // 座机电话 + customerPhone?: string; + // 手机号码 + customerMobile?: string; + // 联系人 + customerContacts?: string; + // 联系地址 + customerAddress?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: string; +} + +/** + * 客户搜索条件 + */ +export interface CustomerParam extends PageParam { + customerName?: string; + customerCode?: string; + // 商户编号 + merchantCode?: string; +} diff --git a/api/oa/assets/index.ts b/api/oa/assets/index.ts new file mode 100644 index 0000000..9a911df --- /dev/null +++ b/api/oa/assets/index.ts @@ -0,0 +1,134 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Assets, AssetsParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +export async function getCount() { + const res = await request.get(MODULES_API_URL + '/oa/assets/data'); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询资产 + */ +export async function pageAssets(params: AssetsParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/assets/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询资产列表 + */ +export async function listAssets(params?: AssetsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/assets', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询服务器 + */ +export async function getAssets(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/assets/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加资产 + */ +export async function addAssets(data: Assets) { + const res = await request.post>( + MODULES_API_URL + '/oa/assets', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改资产 + */ +export async function updateAssets(data: Assets) { + const res = await request.put>( + MODULES_API_URL + '/oa/assets', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除资产 + */ +export async function removeAssets(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/assets/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除资产 + */ +export async function removeBatchAssets(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/assets/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/assets/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/assets/model/index.ts b/api/oa/assets/model/index.ts new file mode 100644 index 0000000..350c94d --- /dev/null +++ b/api/oa/assets/model/index.ts @@ -0,0 +1,89 @@ +import type { PageParam } from '@/api'; +import type { User } from '@/api/system/user/model'; +import {AssetsUser} from "@/api/oa/assets/user/model"; + +/** + * 资产 + */ +export interface Assets { + // 资产id + assetsId?: number; + // 资产类型 + type?: string; + // 资产标识 + code: string; + // 资产名称 + name?: string; + // + account?: string; + // + password?: string; + // + panel?: string; + // + panelAccount?: string; + // + panelPassword?: string; + // + configuration?: any; + root?: string; + // + sortNumber?: number; + financeAmount?: any; + financeYears?: any; + financeRenew?: any; + financeCustomerName?: string; + financeCustomerContact?: string; + financeCustomerPhone?: string; + // + brandAccount?: string; + brandPassword?: string; + btSign?: string; + openPort?: any; + comments?: string; + // 所属客户 + customerId?: number; + customerName?: string; + // 品牌 + brand?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: string; + userId?: number; + companyId?: number; + companyName?: string; + nickname?: string; + // 可见性类型 + visibility?: string; + // 可见用户ID + userList?: User[]; + systemTotal?: Object; + diskInfo?: Object; + netWork?: Object; + sites?: Object; + users?: AssetsUser[]; +} + +/** + * 资产搜索条件 + */ +export interface AssetsParam extends PageParam { + assetsId?: number; + name?: string; + code?: string; + isExpire?: string; + status?: string; + brand?: string; + customerId?: string; + companyId?: number; + companyName?: string; + userId?: number; + showExpiration?: string; + // 商户编号 + merchantCode?: string; +} diff --git a/api/oa/assets/user/index.ts b/api/oa/assets/user/index.ts new file mode 100644 index 0000000..d1e62fc --- /dev/null +++ b/api/oa/assets/user/index.ts @@ -0,0 +1,129 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { + AssetsUser, + AssetsUserParam +} from '@/api/oa/assets/user/model/index'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询开发成员 + */ +export async function pageAssetsUser(params: AssetsUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/assets-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询开发成员列表 + */ +export async function listAssetsUser(params?: AssetsUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/assets-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询开发成员 + */ +export async function getAssetsUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/assets-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加开发成员 + */ +export async function addAssetsUser(data: AssetsUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/assets-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改开发成员 + */ +export async function updateAssetsUser(data: AssetsUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/assets-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除开发成员 + */ +export async function removeAssetsUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/assets-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除开发成员 + */ +export async function removeBatchAssetsUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/assets-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/assets-user/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/assets/user/model/index.ts b/api/oa/assets/user/model/index.ts new file mode 100644 index 0000000..5e9092e --- /dev/null +++ b/api/oa/assets/user/model/index.ts @@ -0,0 +1,35 @@ +import type { PageParam } from '@/api'; + +/** + * 开发成员 + */ +export interface AssetsUser { + // 开发成员id + id?: number; + role?: number; + userId?: number; + username?: string; + nickname?: string; + avatar?: string; + email?: string; + phone?: string; + assetsId?: number; + status?: string; + createTime?: string; +} + +/** + * 开发成员搜索条件 + */ +export interface AssetsUserParam extends PageParam { + userId?: number; + assetsId?: number; +} + +export interface UserItem { + key: string; + isEdit?: boolean; + number?: string; + name?: string; + department?: string; +} diff --git a/api/oa/chatgpt/index.ts b/api/oa/chatgpt/index.ts new file mode 100644 index 0000000..b8dfcd1 --- /dev/null +++ b/api/oa/chatgpt/index.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import { ChatParam } from '@/api/oa/chatgpt/model'; +import {MODULES_API_URL} from "@/config/setting"; + +/** + * 发送 + */ +export async function send(data: ChatParam) { + const res = await request.post>(MODULES_API_URL + '/open/chat/send', data); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 请求openAI + * /open/chat/chat + * 'https://chatgpt.websoft.top/api/open/chat/chat', + */ +export async function chat(data: ChatParam) { + const res = await request.post>( + 'https://chatgpt.websoft.top/api/open/chat/chat', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/chatgpt/model/index.ts b/api/oa/chatgpt/model/index.ts new file mode 100644 index 0000000..abdc126 --- /dev/null +++ b/api/oa/chatgpt/model/index.ts @@ -0,0 +1,17 @@ +/** + * 消息 + */ +export interface Chat { + noticeId?: number; + content?: any; + tenantId?: number; +} + +/** + * 任务搜索条件 + */ +export interface ChatParam { + tenantId?: number; + content?: string; + noticeId?: number; +} diff --git a/api/oa/customer/index.ts b/api/oa/customer/index.ts new file mode 100644 index 0000000..439feca --- /dev/null +++ b/api/oa/customer/index.ts @@ -0,0 +1,140 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Customer, CustomerParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询客户 + */ +export async function pageCustomer(params: CustomerParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/customer/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询客户列表 + */ +export async function listCustomer(params?: CustomerParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/customer', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询客户 + */ +export async function getCustomer(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/customer/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加客户 + */ +export async function addCustomer(data: Customer) { + const res = await request.post>( + MODULES_API_URL + '/oa/customer', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改客户 + */ +export async function updateCustomer(data: Customer) { + const res = await request.put>( + MODULES_API_URL + '/oa/customer', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量修改客户 + */ +export async function updateBatchCustomer(data: Customer[]) { + const res = await request.put>( + MODULES_API_URL + '/oa/customer/batch', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除客户 + */ +export async function removeCustomer(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/customer/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除客户 + */ +export async function removeBatchCustomer(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/customer/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/customer/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/customer/model/index.ts b/api/oa/customer/model/index.ts new file mode 100644 index 0000000..722296a --- /dev/null +++ b/api/oa/customer/model/index.ts @@ -0,0 +1,67 @@ +import type { PageParam } from '@/api'; + +/** + * 客户 + */ +export interface Customer { + // 客户id + customerId?: number; + // 客户类型 + customerType?: string; + // 客户来源 + customerSource?: string; + // 客户标识 + customerCode: string; + // 客户名称 + customerName?: string; + // 客户全称 + customerFullName?: string; + // 客户头像 + customerAvatar?: string; + // 座机电话 + customerPhone?: string; + // 手机号码 + customerMobile?: string; + // 联系人 + customerContacts?: string; + // 联系地址 + customerAddress?: string; + customerProvince?: string; + customerCity?: string; + customerRegion?: string; + longitude?: string; + latitude?: string; + // 跟进状态 + progress?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: string; + // 用户ID + userId?: any; + // 发布者昵称 + nickname?: string; +} + +/** + * 客户搜索条件 + */ +export interface CustomerParam extends PageParam { + customerName?: string; + customerCode?: string; + customerType?: string; + createTimeStart?: string; + createTimeEnd?: string; + customerCategory?: string; + progress?: string; + customerSource?: string; + betweenTime?: any; + userId?: number; + nickname?: string; + // 商户编号 + merchantCode?: string; +} diff --git a/api/oa/link/index.ts b/api/oa/link/index.ts new file mode 100644 index 0000000..ce9827c --- /dev/null +++ b/api/oa/link/index.ts @@ -0,0 +1,113 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Link, LinkParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询链接 + */ +export async function pageLink(params: LinkParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/link/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询链接列表 + */ +export async function listLink(params?: LinkParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/link', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加链接 + */ +export async function addLink(data: Link) { + const res = await request.post>( + MODULES_API_URL + '/oa/link', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改链接 + */ +export async function updateLink(data: Link) { + const res = await request.put>( + MODULES_API_URL + '/oa/link', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除链接 + */ +export async function removeLink(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/link/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除链接 + */ +export async function removeBatchLink(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/link/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/link/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/link/model/index.ts b/api/oa/link/model/index.ts new file mode 100644 index 0000000..7d7f821 --- /dev/null +++ b/api/oa/link/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 链接 + */ +export interface Link { + id?: number; + name?: string; + icon?: string; + url?: string; + linkType?: string; + appId?: number; + userId?: number; + comments?: string; + recommend?: number; + sortNumber?: number; + deleted?: number; + status?: number; + createTime?: number; +} + +/** + * 链接搜索条件 + */ +export interface LinkParam extends PageParam { + id?: number; + linkType?: string; + name?: string; +} diff --git a/api/oa/notice/index.ts b/api/oa/notice/index.ts new file mode 100644 index 0000000..03fb275 --- /dev/null +++ b/api/oa/notice/index.ts @@ -0,0 +1,111 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Notice, NoticeParam } from './model/index'; +import { TabsParam } from '@/api/tabs'; + +/** + * 分页查询消息 + */ +export async function pageNotice(params: NoticeParam) { + const res = await request.get>>( + '/oa/notice/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询消息列表 + */ +export async function listNotice(params?: NoticeParam) { + const res = await request.get>('/oa/notice', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询消息 + */ +export async function getNotice(id: number) { + const res = await request.get>('/oa/notice/' + id); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加消息 + */ +export async function addNotice(data: Notice) { + const res = await request.post>('/oa/notice', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改消息 + */ +export async function updateNotice(data: Notice) { + const res = await request.put>('/oa/notice', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除消息 + */ +export async function removeNotice(id?: number) { + const res = await request.delete>('/oa/notice/' + id); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量修改消息 + */ +export async function updateBatchNotices(data: Notice[]) { + const res = await request.put>('/oa/notice/batch', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除消息 + */ +export async function removeBatchNotice(data: (number | undefined)[]) { + const res = await request.delete>('/oa/notice/batch', { + data + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getCount(params?: TabsParam) { + const res = await request.get>('/oa/notice/count', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/notice/model/index.ts b/api/oa/notice/model/index.ts new file mode 100644 index 0000000..fa7e47b --- /dev/null +++ b/api/oa/notice/model/index.ts @@ -0,0 +1,40 @@ +import type { PageParam } from '@/api'; + +/** + * 消息 + */ +export interface Notice { + // 消息id + noticeRecordId?: number; + noticeId?: number; + title?: string; + channel?: string; + avatar?: string; + content?: string; + files?: string; + developerId?: number; + userId?: number; + sortNumber?: number; + comments?: string; + status?: number; +} + +/** + * 消息搜索条件 + */ +export interface NoticeParam extends PageParam { + type?: string; + noticeRecordId?: number; + noticeId?: number; + userId?: number; + developerId?: number; + status?: number; +} + +// 查询未读数量 +export interface NnReadNum { + notice?: string; + letter?: number; + todo?: number; + chatGPT?: number; +} diff --git a/api/oa/oaApp/index.ts b/api/oa/oaApp/index.ts new file mode 100644 index 0000000..be70f0c --- /dev/null +++ b/api/oa/oaApp/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaApp, OaAppParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询应用 + */ +export async function pageOaApp(params: OaAppParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-app/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用列表 + */ +export async function listOaApp(params?: OaAppParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用 + */ +export async function addOaApp(data: OaApp) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-app', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用 + */ +export async function updateOaApp(data: OaApp) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-app', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用 + */ +export async function removeOaApp(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用 + */ +export async function removeBatchOaApp(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用 + */ +export async function getOaApp(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaApp/model/index.ts b/api/oa/oaApp/model/index.ts new file mode 100644 index 0000000..8c7f077 --- /dev/null +++ b/api/oa/oaApp/model/index.ts @@ -0,0 +1,149 @@ +import type { PageParam } from '@/api'; + +/** + * 应用 + */ +export interface OaApp { + // 应用ID + appId?: number; + // 应用名称 + appName?: string; + // 应用标识 + appCode?: string; + // 应用秘钥 + appSecret?: string; + // 上级id, 0是顶级 + parentId?: number; + // 应用类型 + appType?: string; + // 应用类型 + appTypeMultiple?: string; + // 类型, 0菜单, 1按钮 + menuType?: number; + // 企业ID + companyId?: number; + // 企业名称 + companyName?: string; + // 应用图标 + appIcon?: string; + // 二维码 + appQrcode?: string; + // 链接地址 + appUrl?: string; + // 后台管理地址 + adminUrl?: string; + // 下载地址 + downUrl?: string; + // 链接地址 + serverUrl?: string; + // 文件服务器 + fileUrl?: string; + // 回调地址 + callbackUrl?: string; + // 腾讯文档地址 + docsUrl?: string; + // 代码仓库地址 + gitUrl?: string; + // 原型图地址 + prototypeUrl?: string; + // IP白名单 + ipAddress?: string; + // 应用截图 + images?: string; + // 应用包名 + packageName?: string; + // 下载次数 + clicks?: number; + // 安装次数 + installs?: number; + // 备注 + comments?: string; + // 应用介绍 + content?: string; + // 项目需求 + requirement?: string; + // 开发者(个人或公司) + developer?: string; + // 项目负责人 + director?: string; + // 项目经理 + projectDirector?: string; + // 业务员 + salesman?: string; + // 软件定价 + price?: number; + // 划线价格 + linePrice?: string; + // 评分 + score?: string; + // 星级 + star?: string; + // 菜单路由地址 + path?: string; + // 菜单组件地址, 目录可为空 + component?: string; + // 权限标识 + authority?: string; + // 打开位置 + target?: string; + // 是否隐藏, 0否, 1是(仅注册路由不显示在左侧菜单) + hide?: number; + // 禁止搜索,1禁止 0 允许 + search?: number; + // 菜单侧栏选中的path + active?: string; + // 其它路由元信息 + meta?: string; + // 版本,0正式版 1基础版 2开发版 + edition?: string; + // 版本号 + version?: string; + // 是否已安装 + isUse?: number; + // 附近1 + file1?: string; + // 附件2 + file2?: string; + // 附件3 + file3?: string; + // 是否显示续费提醒 + showExpiration?: number; + // 是否作为案例展示 + showCase?: number; + // 是否显示在首页 + showIndex?: number; + // 是否推荐 + recommend?: number; + // 到期时间 + expirationTime?: string; + // 续费金额 + renewMoney?: string; + // 应用状态 + appStatus?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 用户ID + userId?: number; + // 机构id + organizationId?: number; + // 租户编号 + tenantCode?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 应用搜索条件 + */ +export interface OaAppParam extends PageParam { + appId?: number; + keywords?: string; +} diff --git a/api/oa/oaAppField/index.ts b/api/oa/oaAppField/index.ts new file mode 100644 index 0000000..f80d4b9 --- /dev/null +++ b/api/oa/oaAppField/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAppField, OaAppFieldParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询应用参数 + */ +export async function pageOaAppField(params: OaAppFieldParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-app-field/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用参数列表 + */ +export async function listOaAppField(params?: OaAppFieldParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-field', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用参数 + */ +export async function addOaAppField(data: OaAppField) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-app-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用参数 + */ +export async function updateOaAppField(data: OaAppField) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-app-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用参数 + */ +export async function removeOaAppField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-field/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用参数 + */ +export async function removeBatchOaAppField(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-field/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用参数 + */ +export async function getOaAppField(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-field/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAppField/model/index.ts b/api/oa/oaAppField/model/index.ts new file mode 100644 index 0000000..2949e4e --- /dev/null +++ b/api/oa/oaAppField/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 应用参数 + */ +export interface OaAppField { + // 自增ID + id?: number; + // 应用ID + appId?: number; + // 名称 + name?: string; + // 备注 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1删除 + status?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 应用参数搜索条件 + */ +export interface OaAppFieldParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/oa/oaAppRenew/index.ts b/api/oa/oaAppRenew/index.ts new file mode 100644 index 0000000..b3c6a56 --- /dev/null +++ b/api/oa/oaAppRenew/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAppRenew, OaAppRenewParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询续费管理 + */ +export async function pageOaAppRenew(params: OaAppRenewParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-app-renew/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询续费管理列表 + */ +export async function listOaAppRenew(params?: OaAppRenewParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-renew', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加续费管理 + */ +export async function addOaAppRenew(data: OaAppRenew) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-app-renew', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改续费管理 + */ +export async function updateOaAppRenew(data: OaAppRenew) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-app-renew', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除续费管理 + */ +export async function removeOaAppRenew(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-renew/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除续费管理 + */ +export async function removeBatchOaAppRenew(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-renew/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询续费管理 + */ +export async function getOaAppRenew(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-renew/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAppRenew/model/index.ts b/api/oa/oaAppRenew/model/index.ts new file mode 100644 index 0000000..5b3308a --- /dev/null +++ b/api/oa/oaAppRenew/model/index.ts @@ -0,0 +1,41 @@ +import type { PageParam } from '@/api'; + +/** + * 续费管理 + */ +export interface OaAppRenew { + // 自增ID + appRenewId?: number; + // 应用ID + appId?: number; + // 续费金额 + money?: string; + // 备注 + comments?: string; + // 开始时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 企业ID + companyId?: number; + // 用户ID + userId?: number; + // 付款凭证 + images?: string; + // 用户姓名 + nickname?: string; + // 状态, 0正常, 1待确认 + status?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 续费管理搜索条件 + */ +export interface OaAppRenewParam extends PageParam { + appRenewId?: number; + keywords?: string; +} diff --git a/api/oa/oaAppUrl/index.ts b/api/oa/oaAppUrl/index.ts new file mode 100644 index 0000000..2faa0e4 --- /dev/null +++ b/api/oa/oaAppUrl/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAppUrl, OaAppUrlParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询项目域名 + */ +export async function pageOaAppUrl(params: OaAppUrlParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-app-url/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目域名列表 + */ +export async function listOaAppUrl(params?: OaAppUrlParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-url', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加项目域名 + */ +export async function addOaAppUrl(data: OaAppUrl) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-app-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改项目域名 + */ +export async function updateOaAppUrl(data: OaAppUrl) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-app-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除项目域名 + */ +export async function removeOaAppUrl(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-url/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除项目域名 + */ +export async function removeBatchOaAppUrl(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-url/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询项目域名 + */ +export async function getOaAppUrl(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-url/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAppUrl/model/index.ts b/api/oa/oaAppUrl/model/index.ts new file mode 100644 index 0000000..e97c2f9 --- /dev/null +++ b/api/oa/oaAppUrl/model/index.ts @@ -0,0 +1,37 @@ +import type { PageParam } from '@/api'; + +/** + * 项目域名 + */ +export interface OaAppUrl { + // 自增ID + appUrlId?: number; + // 应用ID + appId?: number; + // 域名类型 + name?: string; + // 域名 + domain?: string; + // 账号 + account?: string; + // 密码 + password?: string; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 项目域名搜索条件 + */ +export interface OaAppUrlParam extends PageParam { + appUrlId?: number; + keywords?: string; +} diff --git a/api/oa/oaAppUser/index.ts b/api/oa/oaAppUser/index.ts new file mode 100644 index 0000000..af11a65 --- /dev/null +++ b/api/oa/oaAppUser/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAppUser, OaAppUserParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询应用成员 + */ +export async function pageOaAppUser(params: OaAppUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-app-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用成员列表 + */ +export async function listOaAppUser(params?: OaAppUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用成员 + */ +export async function addOaAppUser(data: OaAppUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-app-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用成员 + */ +export async function updateOaAppUser(data: OaAppUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-app-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用成员 + */ +export async function removeOaAppUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用成员 + */ +export async function removeBatchOaAppUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-app-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用成员 + */ +export async function getOaAppUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-app-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAppUser/model/index.ts b/api/oa/oaAppUser/model/index.ts new file mode 100644 index 0000000..a354285 --- /dev/null +++ b/api/oa/oaAppUser/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 应用成员 + */ +export interface OaAppUser { + // 自增ID + appUserId?: number; + // 角色,10体验成员 20开发者成员 30管理员 + role?: number; + // 用户ID + userId?: number; + // 应用ID + appId?: number; + // 昵称 + nickname?: string; + // 状态, 0正常, 1待确认 + status?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 应用成员搜索条件 + */ +export interface OaAppUserParam extends PageParam { + appUserId?: number; + keywords?: string; +} diff --git a/api/oa/oaAssets/index.ts b/api/oa/oaAssets/index.ts new file mode 100644 index 0000000..4595a53 --- /dev/null +++ b/api/oa/oaAssets/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssets, OaAssetsParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询服务器资产记录表 + */ +export async function pageOaAssets(params: OaAssetsParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询服务器资产记录表列表 + */ +export async function listOaAssets(params?: OaAssetsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加服务器资产记录表 + */ +export async function addOaAssets(data: OaAssets) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改服务器资产记录表 + */ +export async function updateOaAssets(data: OaAssets) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除服务器资产记录表 + */ +export async function removeOaAssets(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除服务器资产记录表 + */ +export async function removeBatchOaAssets(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询服务器资产记录表 + */ +export async function getOaAssets(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssets/model/index.ts b/api/oa/oaAssets/model/index.ts new file mode 100644 index 0000000..2e0fad8 --- /dev/null +++ b/api/oa/oaAssets/model/index.ts @@ -0,0 +1,91 @@ +import type { PageParam } from '@/api'; + +/** + * 服务器资产记录表 + */ +export interface OaAssets { + // 资产ID + assetsId?: number; + // 资产名称 + name?: string; + // 资产标识 + code?: string; + // 资产类型 + type?: string; + // 服务器厂商 + brand?: string; + // 服务器配置 + configuration?: string; + // 初始账号 + account?: string; + // 初始密码 + password?: string; + // (阿里云/腾讯云)登录账号 + brandAccount?: string; + // (阿里云/腾讯云)登录密码 + brandPassword?: string; + // 宝塔面板 + panel?: string; + // 宝塔面板账号 + panelAccount?: string; + // 宝塔面板密码 + panelPassword?: string; + // 财务信息-合同金额 + financeAmount?: string; + // 购买年限 + financeYears?: number; + // 续费金额 + financeRenew?: string; + // 客户名称 + financeCustomerName?: string; + // 客户联系人 + financeCustomerContact?: string; + // 客户联系电话 + financeCustomerPhone?: string; + // 客户ID + customerId?: number; + // 客户名称 + customerName?: string; + // 开放端口 + openPort?: string; + // 详情内容 + content?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 可见性(public,private,protected) + visibility?: string; + // 宝塔接口秘钥 + btSign?: string; + // 文章排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 客户ID + companyId?: number; + // 用户ID + userId?: number; + // 机构id + organizationId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 服务器资产记录表搜索条件 + */ +export interface OaAssetsParam extends PageParam { + assetsId?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsCode/index.ts b/api/oa/oaAssetsCode/index.ts new file mode 100644 index 0000000..852d4db --- /dev/null +++ b/api/oa/oaAssetsCode/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsCode, OaAssetsCodeParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询代码仓库 + */ +export async function pageOaAssetsCode(params: OaAssetsCodeParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-code/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询代码仓库列表 + */ +export async function listOaAssetsCode(params?: OaAssetsCodeParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-code', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加代码仓库 + */ +export async function addOaAssetsCode(data: OaAssetsCode) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-code', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改代码仓库 + */ +export async function updateOaAssetsCode(data: OaAssetsCode) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-code', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除代码仓库 + */ +export async function removeOaAssetsCode(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-code/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除代码仓库 + */ +export async function removeBatchOaAssetsCode(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-code/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询代码仓库 + */ +export async function getOaAssetsCode(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-code/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsCode/model/index.ts b/api/oa/oaAssetsCode/model/index.ts new file mode 100644 index 0000000..a4d9955 --- /dev/null +++ b/api/oa/oaAssetsCode/model/index.ts @@ -0,0 +1,51 @@ +import type { PageParam } from '@/api'; + +/** + * 代码仓库 + */ +export interface OaAssetsCode { + // ID + id?: number; + // 名称 + name?: string; + // 英文标识 + code?: string; + // 仓库地址 + gitUrl?: string; + // 仓库品牌 + brand?: string; + // 价格 + price?: number; + // 详情内容 + content?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 代码仓库搜索条件 + */ +export interface OaAssetsCodeParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsDomain/index.ts b/api/oa/oaAssetsDomain/index.ts new file mode 100644 index 0000000..b17e937 --- /dev/null +++ b/api/oa/oaAssetsDomain/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsDomain, OaAssetsDomainParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询域名管理记录表 + */ +export async function pageOaAssetsDomain(params: OaAssetsDomainParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-domain/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询域名管理记录表列表 + */ +export async function listOaAssetsDomain(params?: OaAssetsDomainParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-domain', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加域名管理记录表 + */ +export async function addOaAssetsDomain(data: OaAssetsDomain) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-domain', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改域名管理记录表 + */ +export async function updateOaAssetsDomain(data: OaAssetsDomain) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-domain', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除域名管理记录表 + */ +export async function removeOaAssetsDomain(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-domain/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除域名管理记录表 + */ +export async function removeBatchOaAssetsDomain(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-domain/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询域名管理记录表 + */ +export async function getOaAssetsDomain(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-domain/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsDomain/model/index.ts b/api/oa/oaAssetsDomain/model/index.ts new file mode 100644 index 0000000..5dbd752 --- /dev/null +++ b/api/oa/oaAssetsDomain/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 域名管理记录表 + */ +export interface OaAssetsDomain { + // ID + domainId?: number; + // 域名 + name?: string; + // 域名标识 + code?: string; + // 注册厂商 + brand?: string; + // 初始账号 + account?: string; + // 初始密码 + password?: string; + // 价格 + price?: number; + // 详情内容 + content?: string; + // ssl证书 + ssl?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 域名管理记录表搜索条件 + */ +export interface OaAssetsDomainParam extends PageParam { + domainId?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsEmail/index.ts b/api/oa/oaAssetsEmail/index.ts new file mode 100644 index 0000000..9a05b27 --- /dev/null +++ b/api/oa/oaAssetsEmail/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsEmail, OaAssetsEmailParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询企业邮箱记录表 + */ +export async function pageOaAssetsEmail(params: OaAssetsEmailParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-email/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询企业邮箱记录表列表 + */ +export async function listOaAssetsEmail(params?: OaAssetsEmailParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-email', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加企业邮箱记录表 + */ +export async function addOaAssetsEmail(data: OaAssetsEmail) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-email', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改企业邮箱记录表 + */ +export async function updateOaAssetsEmail(data: OaAssetsEmail) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-email', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除企业邮箱记录表 + */ +export async function removeOaAssetsEmail(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-email/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除企业邮箱记录表 + */ +export async function removeBatchOaAssetsEmail(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-email/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询企业邮箱记录表 + */ +export async function getOaAssetsEmail(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-email/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsEmail/model/index.ts b/api/oa/oaAssetsEmail/model/index.ts new file mode 100644 index 0000000..be7f45e --- /dev/null +++ b/api/oa/oaAssetsEmail/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 企业邮箱记录表 + */ +export interface OaAssetsEmail { + // ID + emailId?: number; + // 域名 + name?: string; + // 域名标识 + code?: string; + // 主机型号 + type?: string; + // 品牌厂商 + brand?: string; + // 初始账号 + system?: string; + // 价格 + price?: number; + // 详情内容 + content?: string; + // ssl证书 + ssl?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 企业邮箱记录表搜索条件 + */ +export interface OaAssetsEmailParam extends PageParam { + emailId?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsServer/index.ts b/api/oa/oaAssetsServer/index.ts new file mode 100644 index 0000000..41961bb --- /dev/null +++ b/api/oa/oaAssetsServer/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsServer, OaAssetsServerParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询服务器资产记录表 + */ +export async function pageOaAssetsServer(params: OaAssetsServerParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-server/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询服务器资产记录表列表 + */ +export async function listOaAssetsServer(params?: OaAssetsServerParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-server', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加服务器资产记录表 + */ +export async function addOaAssetsServer(data: OaAssetsServer) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-server', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改服务器资产记录表 + */ +export async function updateOaAssetsServer(data: OaAssetsServer) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-server', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除服务器资产记录表 + */ +export async function removeOaAssetsServer(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-server/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除服务器资产记录表 + */ +export async function removeBatchOaAssetsServer(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-server/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询服务器资产记录表 + */ +export async function getOaAssetsServer(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-server/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsServer/model/index.ts b/api/oa/oaAssetsServer/model/index.ts new file mode 100644 index 0000000..20f652c --- /dev/null +++ b/api/oa/oaAssetsServer/model/index.ts @@ -0,0 +1,91 @@ +import type { PageParam } from '@/api'; + +/** + * 服务器资产记录表 + */ +export interface OaAssetsServer { + // 资产ID + serverId?: number; + // 资产名称 + name?: string; + // 资产标识 + code?: string; + // 资产类型 + type?: string; + // 服务器厂商 + brand?: string; + // 服务器配置 + configuration?: string; + // 初始账号 + account?: string; + // 初始密码 + password?: string; + // (阿里云/腾讯云)登录账号 + brandAccount?: string; + // (阿里云/腾讯云)登录密码 + brandPassword?: string; + // 宝塔面板 + panel?: string; + // 宝塔面板账号 + panelAccount?: string; + // 宝塔面板密码 + panelPassword?: string; + // 财务信息-合同金额 + financeAmount?: string; + // 购买年限 + financeYears?: number; + // 续费金额 + financeRenew?: string; + // 客户名称 + financeCustomerName?: string; + // 客户联系人 + financeCustomerContact?: string; + // 客户联系电话 + financeCustomerPhone?: string; + // 客户ID + customerId?: number; + // 客户名称 + customerName?: string; + // 开放端口 + openPort?: string; + // 详情内容 + content?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 可见性(public,private,protected) + visibility?: string; + // 宝塔接口秘钥 + btSign?: string; + // 文章排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 客户ID + companyId?: number; + // 用户ID + userId?: number; + // 机构id + organizationId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 服务器资产记录表搜索条件 + */ +export interface OaAssetsServerParam extends PageParam { + serverId?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsSite/index.ts b/api/oa/oaAssetsSite/index.ts new file mode 100644 index 0000000..04b99a9 --- /dev/null +++ b/api/oa/oaAssetsSite/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsSite, OaAssetsSiteParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询网站管理记录表 + */ +export async function pageOaAssetsSite(params: OaAssetsSiteParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-site/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询网站管理记录表列表 + */ +export async function listOaAssetsSite(params?: OaAssetsSiteParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-site', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加网站管理记录表 + */ +export async function addOaAssetsSite(data: OaAssetsSite) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-site', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改网站管理记录表 + */ +export async function updateOaAssetsSite(data: OaAssetsSite) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-site', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除网站管理记录表 + */ +export async function removeOaAssetsSite(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-site/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除网站管理记录表 + */ +export async function removeBatchOaAssetsSite(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-site/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询网站管理记录表 + */ +export async function getOaAssetsSite(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-site/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsSite/model/index.ts b/api/oa/oaAssetsSite/model/index.ts new file mode 100644 index 0000000..ed6557f --- /dev/null +++ b/api/oa/oaAssetsSite/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 网站管理记录表 + */ +export interface OaAssetsSite { + // ID + siteId?: number; + // 网站名称 + name?: string; + // 域名标识 + code?: string; + // 主机型号 + type?: string; + // 品牌厂商 + brand?: string; + // 初始账号 + system?: string; + // 价格 + price?: number; + // 详情内容 + content?: string; + // ssl证书 + ssl?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 网站管理记录表搜索条件 + */ +export interface OaAssetsSiteParam extends PageParam { + siteId?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsUser/index.ts b/api/oa/oaAssetsUser/index.ts new file mode 100644 index 0000000..ccd5c5e --- /dev/null +++ b/api/oa/oaAssetsUser/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsUser, OaAssetsUserParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询服务器成员管理 + */ +export async function pageOaAssetsUser(params: OaAssetsUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询服务器成员管理列表 + */ +export async function listOaAssetsUser(params?: OaAssetsUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加服务器成员管理 + */ +export async function addOaAssetsUser(data: OaAssetsUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改服务器成员管理 + */ +export async function updateOaAssetsUser(data: OaAssetsUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除服务器成员管理 + */ +export async function removeOaAssetsUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除服务器成员管理 + */ +export async function removeBatchOaAssetsUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询服务器成员管理 + */ +export async function getOaAssetsUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsUser/model/index.ts b/api/oa/oaAssetsUser/model/index.ts new file mode 100644 index 0000000..d768d2d --- /dev/null +++ b/api/oa/oaAssetsUser/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 服务器成员管理 + */ +export interface OaAssetsUser { + // 自增ID + id?: number; + // 角色,10体验成员 20开发者成员 30管理员 + role?: number; + // 用户ID + userId?: number; + // 应用ID + assetsId?: number; + // 昵称 + nickname?: string; + // 状态, 0正常, 1待确认 + status?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 服务器成员管理搜索条件 + */ +export interface OaAssetsUserParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/oa/oaAssetsVhost/index.ts b/api/oa/oaAssetsVhost/index.ts new file mode 100644 index 0000000..ff0adc5 --- /dev/null +++ b/api/oa/oaAssetsVhost/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaAssetsVhost, OaAssetsVhostParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询虚拟主机记录表 + */ +export async function pageOaAssetsVhost(params: OaAssetsVhostParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-assets-vhost/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询虚拟主机记录表列表 + */ +export async function listOaAssetsVhost(params?: OaAssetsVhostParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-vhost', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加虚拟主机记录表 + */ +export async function addOaAssetsVhost(data: OaAssetsVhost) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-assets-vhost', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改虚拟主机记录表 + */ +export async function updateOaAssetsVhost(data: OaAssetsVhost) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-assets-vhost', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除虚拟主机记录表 + */ +export async function removeOaAssetsVhost(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-vhost/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除虚拟主机记录表 + */ +export async function removeBatchOaAssetsVhost(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-assets-vhost/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询虚拟主机记录表 + */ +export async function getOaAssetsVhost(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-assets-vhost/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaAssetsVhost/model/index.ts b/api/oa/oaAssetsVhost/model/index.ts new file mode 100644 index 0000000..1ddab6b --- /dev/null +++ b/api/oa/oaAssetsVhost/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 虚拟主机记录表 + */ +export interface OaAssetsVhost { + // ID + vhostId?: number; + // 域名 + name?: string; + // 域名标识 + code?: string; + // 主机型号 + type?: string; + // 品牌厂商 + brand?: string; + // 初始账号 + system?: string; + // 价格 + price?: number; + // 详情内容 + content?: string; + // ssl证书 + ssl?: string; + // 购买时间 + startTime?: string; + // 到期时间 + endTime?: string; + // 置顶状态 + isTop?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 描述 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1冻结 + status?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 虚拟主机记录表搜索条件 + */ +export interface OaAssetsVhostParam extends PageParam { + vhostId?: number; + keywords?: string; +} diff --git a/api/oa/oaCompany/index.ts b/api/oa/oaCompany/index.ts new file mode 100644 index 0000000..72868c2 --- /dev/null +++ b/api/oa/oaCompany/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaCompany, OaCompanyParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询企业信息 + */ +export async function pageOaCompany(params: OaCompanyParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-company/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询企业信息列表 + */ +export async function listOaCompany(params?: OaCompanyParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-company', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加企业信息 + */ +export async function addOaCompany(data: OaCompany) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-company', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改企业信息 + */ +export async function updateOaCompany(data: OaCompany) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-company', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除企业信息 + */ +export async function removeOaCompany(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-company/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除企业信息 + */ +export async function removeBatchOaCompany(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-company/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询企业信息 + */ +export async function getOaCompany(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-company/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaCompany/model/index.ts b/api/oa/oaCompany/model/index.ts new file mode 100644 index 0000000..fae4f89 --- /dev/null +++ b/api/oa/oaCompany/model/index.ts @@ -0,0 +1,117 @@ +import type { PageParam } from '@/api'; + +/** + * 企业信息 + */ +export interface OaCompany { + // 企业id + companyId?: number; + // 企业简称 + shortName?: string; + // 企业全称 + companyName?: string; + // 企业标识 + companyCode?: string; + // 类型 10企业 20政府单位 + companyType?: string; + // 企业类型多选 + companyTypeMultiple?: string; + // 应用标识 + companyLogo?: string; + // 应用类型 + appType?: string; + // 绑定域名 + domain?: string; + // 联系电话 + phone?: string; + // 座机电话 + tel?: string; + // 邮箱 + email?: string; + // 发票抬头 + invoiceHeader?: string; + // 企业法人 + businessEntity?: string; + // 服务开始时间 + startTime?: string; + // 服务到期时间 + expirationTime?: string; + // 应用版本 10体验版 20授权版 30旗舰版 + version?: number; + // 成员数量(人数上限) + members?: number; + // 成员数量(当前) + users?: number; + // 行业类型(父级) + industryParent?: string; + // 行业类型(子级) + industryChild?: string; + // 部门数量 + departments?: number; + // 存储空间 + storage?: string; + // 存储空间(上限) + storageMax?: string; + // 所在国家 + country?: string; + // 所在省份 + province?: string; + // 所在城市 + city?: string; + // 所在辖区 + region?: string; + // 街道地址 + address?: string; + // 经度 + longitude?: string; + // 纬度 + latitude?: string; + // 备注 + comments?: string; + // 是否实名认证 + authentication?: number; + // 企业默认主体 + authoritative?: number; + // request合法域名 + requestUrl?: string; + // socket合法域名 + socketUrl?: string; + // 主控端域名 + serverUrl?: string; + // 业务域名 + modulesUrl?: string; + // 是否推荐 + recommend?: number; + // 点赞数量 + likes?: number; + // 点击数量 + clicks?: number; + // 购买数量 + buys?: number; + // 是否含税, 0不含, 1含 + isTax?: number; + // 当前克隆的租户ID + planId?: number; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 用户ID + userId?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 企业信息搜索条件 + */ +export interface OaCompanyParam extends PageParam { + companyId?: number; + keywords?: string; +} diff --git a/api/oa/oaCompanyField/index.ts b/api/oa/oaCompanyField/index.ts new file mode 100644 index 0000000..5525e31 --- /dev/null +++ b/api/oa/oaCompanyField/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaCompanyField, OaCompanyFieldParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询企业参数 + */ +export async function pageOaCompanyField(params: OaCompanyFieldParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-company-field/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询企业参数列表 + */ +export async function listOaCompanyField(params?: OaCompanyFieldParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-company-field', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加企业参数 + */ +export async function addOaCompanyField(data: OaCompanyField) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-company-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改企业参数 + */ +export async function updateOaCompanyField(data: OaCompanyField) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-company-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除企业参数 + */ +export async function removeOaCompanyField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-company-field/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除企业参数 + */ +export async function removeBatchOaCompanyField(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-company-field/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询企业参数 + */ +export async function getOaCompanyField(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-company-field/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaCompanyField/model/index.ts b/api/oa/oaCompanyField/model/index.ts new file mode 100644 index 0000000..2cd4a94 --- /dev/null +++ b/api/oa/oaCompanyField/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 企业参数 + */ +export interface OaCompanyField { + // 自增ID + id?: number; + // 企业ID + companyId?: number; + // 名称 + name?: string; + // 备注 + comments?: string; + // 用户ID + userId?: number; + // 状态, 0正常, 1删除 + status?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 企业参数搜索条件 + */ +export interface OaCompanyFieldParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/oa/oaCompanyUser/index.ts b/api/oa/oaCompanyUser/index.ts new file mode 100644 index 0000000..61ec324 --- /dev/null +++ b/api/oa/oaCompanyUser/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaCompanyUser, OaCompanyUserParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询成员管理 + */ +export async function pageOaCompanyUser(params: OaCompanyUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-company-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询成员管理列表 + */ +export async function listOaCompanyUser(params?: OaCompanyUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-company-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加成员管理 + */ +export async function addOaCompanyUser(data: OaCompanyUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-company-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改成员管理 + */ +export async function updateOaCompanyUser(data: OaCompanyUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-company-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除成员管理 + */ +export async function removeOaCompanyUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-company-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除成员管理 + */ +export async function removeBatchOaCompanyUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-company-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询成员管理 + */ +export async function getOaCompanyUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-company-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaCompanyUser/model/index.ts b/api/oa/oaCompanyUser/model/index.ts new file mode 100644 index 0000000..7294530 --- /dev/null +++ b/api/oa/oaCompanyUser/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 成员管理 + */ +export interface OaCompanyUser { + // 自增ID + companyUserId?: number; + // 角色,10体验成员 20开发者成员 30管理员 + role?: number; + // 用户ID + userId?: number; + // 企业ID + companyId?: number; + // 昵称 + nickname?: string; + // 状态, 0正常, 1待确认 + status?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 成员管理搜索条件 + */ +export interface OaCompanyUserParam extends PageParam { + companyUserId?: number; + keywords?: string; +} diff --git a/api/oa/oaLink/index.ts b/api/oa/oaLink/index.ts new file mode 100644 index 0000000..bf20025 --- /dev/null +++ b/api/oa/oaLink/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaLink, OaLinkParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询常用链接 + */ +export async function pageOaLink(params: OaLinkParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-link/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询常用链接列表 + */ +export async function listOaLink(params?: OaLinkParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-link', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加常用链接 + */ +export async function addOaLink(data: OaLink) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-link', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改常用链接 + */ +export async function updateOaLink(data: OaLink) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-link', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除常用链接 + */ +export async function removeOaLink(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-link/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除常用链接 + */ +export async function removeBatchOaLink(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-link/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询常用链接 + */ +export async function getOaLink(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-link/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaLink/model/index.ts b/api/oa/oaLink/model/index.ts new file mode 100644 index 0000000..63dc11b --- /dev/null +++ b/api/oa/oaLink/model/index.ts @@ -0,0 +1,45 @@ +import type { PageParam } from '@/api'; + +/** + * 常用链接 + */ +export interface OaLink { + // 自增ID + id?: number; + // 链接名称 + name?: string; + // 图标 + icon?: string; + // 链接地址 + url?: string; + // 链接分类 + linkType?: string; + // 应用ID + appId?: number; + // 所属栏目 + categoryId?: number; + // 用户ID + userId?: number; + // 是否推荐 + recommend?: number; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 常用链接搜索条件 + */ +export interface OaLinkParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/oa/oaProduct/index.ts b/api/oa/oaProduct/index.ts new file mode 100644 index 0000000..993136c --- /dev/null +++ b/api/oa/oaProduct/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaProduct, OaProductParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询产品记录表 + */ +export async function pageOaProduct(params: OaProductParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-product/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品记录表列表 + */ +export async function listOaProduct(params?: OaProductParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-product', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品记录表 + */ +export async function addOaProduct(data: OaProduct) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-product', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品记录表 + */ +export async function updateOaProduct(data: OaProduct) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-product', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品记录表 + */ +export async function removeOaProduct(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-product/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品记录表 + */ +export async function removeBatchOaProduct(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-product/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品记录表 + */ +export async function getOaProduct(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-product/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaProduct/model/index.ts b/api/oa/oaProduct/model/index.ts new file mode 100644 index 0000000..8381840 --- /dev/null +++ b/api/oa/oaProduct/model/index.ts @@ -0,0 +1,65 @@ +import type { PageParam } from '@/api'; + +/** + * 产品记录表 + */ +export interface OaProduct { + // 产品ID + productId?: number; + // 产品名称 + name?: string; + // 产品标识 + code?: string; + // 产品详情 + content?: string; + // 产品类型 + type?: string; + // 产品图标 + logo?: string; + // 产品金额 + money?: string; + // 初始销量 + salesInitial?: number; + // 实际销量 + salesActual?: number; + // 库存总量(包含所有sku) + stockTotal?: number; + // 背景颜色 + backgroundColor?: string; + // 背景图片 + backgroundImage?: string; + // 背景图片(gif) + backgroundGif?: string; + // 购买链接 + buyUrl?: string; + // 控制台链接 + adminUrl?: string; + // 附件 + files?: string; + // 企业ID + companyId?: number; + // 用户ID + userId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0已上架, 1已下架 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 产品记录表搜索条件 + */ +export interface OaProductParam extends PageParam { + productId?: number; + keywords?: string; +} diff --git a/api/oa/oaProductTabs/index.ts b/api/oa/oaProductTabs/index.ts new file mode 100644 index 0000000..5137371 --- /dev/null +++ b/api/oa/oaProductTabs/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaProductTabs, OaProductTabsParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询产品标签记录表 + */ +export async function pageOaProductTabs(params: OaProductTabsParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-product-tabs/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品标签记录表列表 + */ +export async function listOaProductTabs(params?: OaProductTabsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-product-tabs', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品标签记录表 + */ +export async function addOaProductTabs(data: OaProductTabs) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-product-tabs', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品标签记录表 + */ +export async function updateOaProductTabs(data: OaProductTabs) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-product-tabs', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品标签记录表 + */ +export async function removeOaProductTabs(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-product-tabs/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品标签记录表 + */ +export async function removeBatchOaProductTabs(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-product-tabs/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品标签记录表 + */ +export async function getOaProductTabs(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-product-tabs/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaProductTabs/model/index.ts b/api/oa/oaProductTabs/model/index.ts new file mode 100644 index 0000000..6f10324 --- /dev/null +++ b/api/oa/oaProductTabs/model/index.ts @@ -0,0 +1,49 @@ +import type { PageParam } from '@/api'; + +/** + * 产品标签记录表 + */ +export interface OaProductTabs { + // 产品标签ID + tabId?: number; + // 产品ID + productId?: number; + // 标签名称 + name?: string; + // 标签类型 + type?: string; + // 产品标签详情 + content?: string; + // 背景颜色 + backgroundColor?: string; + // 背景图片 + backgroundImage?: string; + // 附件 + files?: string; + // 企业ID + companyId?: number; + // 用户ID + userId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0已上架, 1已下架 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 产品标签记录表搜索条件 + */ +export interface OaProductTabsParam extends PageParam { + tabId?: number; + keywords?: string; +} diff --git a/api/oa/oaTask/index.ts b/api/oa/oaTask/index.ts new file mode 100644 index 0000000..b95f643 --- /dev/null +++ b/api/oa/oaTask/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaTask, OaTaskParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询任务记录表 + */ +export async function pageOaTask(params: OaTaskParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-task/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询任务记录表列表 + */ +export async function listOaTask(params?: OaTaskParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加任务记录表 + */ +export async function addOaTask(data: OaTask) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-task', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改任务记录表 + */ +export async function updateOaTask(data: OaTask) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-task', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除任务记录表 + */ +export async function removeOaTask(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除任务记录表 + */ +export async function removeBatchOaTask(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询任务记录表 + */ +export async function getOaTask(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaTask/model/index.ts b/api/oa/oaTask/model/index.ts new file mode 100644 index 0000000..51a7e3c --- /dev/null +++ b/api/oa/oaTask/model/index.ts @@ -0,0 +1,85 @@ +import type { PageParam } from '@/api'; + +/** + * 任务记录表 + */ +export interface OaTask { + // 工单ID + taskId?: number; + // 工单类型 + taskType?: string; + // 任务内容 + name?: string; + // 问题描述 + content?: string; + // 工单附件 + files?: string; + // 工单发起人 + promoter?: number; + // 受理人 + commander?: number; + // 工单状态, 0未开始 1已指派 + progress?: number; + // 优先级 + priority?: string; + // 品质要求 + quality?: string; + // 时限(天) + day?: number; + // 手机号 + phone?: string; + // 开始时间 + startTime?: string; + // 结束时间 + endTime?: string; + // 逾期天数 + overdueDays?: number; + // 项目ID + appId?: number; + // 机构id + organizationId?: number; + // 项目ID + projectId?: number; + // 客户ID + customerId?: number; + // 资产ID + assetsId?: number; + // 用户ID + userId?: number; + // 是否已查阅 + isRead?: number; + // 最后回复人 + lastReadUser?: number; + // 发起人昵称 + nickname?: string; + // 发起人头像 + avatar?: string; + // 最后回复人头像 + lastAvatar?: string; + // 最后回复人昵称 + lastNickname?: string; + // 订单是否已结算(0未结算 1已结算) + isSettled?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0待处理, 1已完成 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 任务记录表搜索条件 + */ +export interface OaTaskParam extends PageParam { + taskId?: number; + keywords?: string; +} diff --git a/api/oa/oaTaskCount/index.ts b/api/oa/oaTaskCount/index.ts new file mode 100644 index 0000000..049f3d8 --- /dev/null +++ b/api/oa/oaTaskCount/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaTaskCount, OaTaskCountParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询数据统计 + */ +export async function pageOaTaskCount(params: OaTaskCountParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-task-count/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询数据统计列表 + */ +export async function listOaTaskCount(params?: OaTaskCountParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task-count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加数据统计 + */ +export async function addOaTaskCount(data: OaTaskCount) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-task-count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改数据统计 + */ +export async function updateOaTaskCount(data: OaTaskCount) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-task-count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除数据统计 + */ +export async function removeOaTaskCount(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task-count/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除数据统计 + */ +export async function removeBatchOaTaskCount(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task-count/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询数据统计 + */ +export async function getOaTaskCount(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task-count/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaTaskCount/model/index.ts b/api/oa/oaTaskCount/model/index.ts new file mode 100644 index 0000000..c451ed0 --- /dev/null +++ b/api/oa/oaTaskCount/model/index.ts @@ -0,0 +1,45 @@ +import type { PageParam } from '@/api'; + +/** + * 数据统计 + */ +export interface OaTaskCount { + // 自增ID + taskCountId?: number; + // 用户ID + userId?: number; + // 待处理数 + pending?: number; + // 闲置的工单(废弃) + unused?: number; + // 已完成数(废弃) + completed?: number; + // 今天处理数 + today?: number; + // 本月处理数 + month?: number; + // 今年处理数 + year?: number; + // 总工单数 + total?: number; + // 部门ID + organizationId?: number; + // 角色ID + roleId?: number; + // 角色标识 + roleCode?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; +} + +/** + * 数据统计搜索条件 + */ +export interface OaTaskCountParam extends PageParam { + taskCountId?: number; + keywords?: string; +} diff --git a/api/oa/oaTaskRecord/index.ts b/api/oa/oaTaskRecord/index.ts new file mode 100644 index 0000000..1607809 --- /dev/null +++ b/api/oa/oaTaskRecord/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaTaskRecord, OaTaskRecordParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询工单回复记录表 + */ +export async function pageOaTaskRecord(params: OaTaskRecordParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-task-record/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询工单回复记录表列表 + */ +export async function listOaTaskRecord(params?: OaTaskRecordParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task-record', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加工单回复记录表 + */ +export async function addOaTaskRecord(data: OaTaskRecord) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-task-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改工单回复记录表 + */ +export async function updateOaTaskRecord(data: OaTaskRecord) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-task-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除工单回复记录表 + */ +export async function removeOaTaskRecord(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task-record/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除工单回复记录表 + */ +export async function removeBatchOaTaskRecord(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task-record/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询工单回复记录表 + */ +export async function getOaTaskRecord(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task-record/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaTaskRecord/model/index.ts b/api/oa/oaTaskRecord/model/index.ts new file mode 100644 index 0000000..09cac63 --- /dev/null +++ b/api/oa/oaTaskRecord/model/index.ts @@ -0,0 +1,45 @@ +import type { PageParam } from '@/api'; + +/** + * 工单回复记录表 + */ +export interface OaTaskRecord { + // 回复ID + taskRecordId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 工单ID + taskId?: number; + // 内容 + content?: string; + // 机密信息 + confidential?: string; + // 联系电话 + phone?: string; + // 工单附件 + files?: string; + // 用户ID + userId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0待处理, 1已完成 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 工单回复记录表搜索条件 + */ +export interface OaTaskRecordParam extends PageParam { + taskRecordId?: number; + keywords?: string; +} diff --git a/api/oa/oaTaskUser/index.ts b/api/oa/oaTaskUser/index.ts new file mode 100644 index 0000000..2b78215 --- /dev/null +++ b/api/oa/oaTaskUser/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OaTaskUser, OaTaskUserParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询工单成员 + */ +export async function pageOaTaskUser(params: OaTaskUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/oa-task-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询工单成员列表 + */ +export async function listOaTaskUser(params?: OaTaskUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加工单成员 + */ +export async function addOaTaskUser(data: OaTaskUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/oa-task-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改工单成员 + */ +export async function updateOaTaskUser(data: OaTaskUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/oa-task-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除工单成员 + */ +export async function removeOaTaskUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除工单成员 + */ +export async function removeBatchOaTaskUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/oa-task-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询工单成员 + */ +export async function getOaTaskUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/oa-task-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/oaTaskUser/model/index.ts b/api/oa/oaTaskUser/model/index.ts new file mode 100644 index 0000000..5fd902f --- /dev/null +++ b/api/oa/oaTaskUser/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 工单成员 + */ +export interface OaTaskUser { + // 自增ID + taskUserId?: number; + // 角色,10体验成员 20开发者成员 30管理员 + role?: number; + // 用户ID + userId?: number; + // 工单ID + taskId?: number; + // 昵称 + nickname?: string; + // 状态, 0待处理, 1已完成 + status?: number; + // 租户id + tenantId?: number; + // 加入时间 + createTime?: string; +} + +/** + * 工单成员搜索条件 + */ +export interface OaTaskUserParam extends PageParam { + taskUserId?: number; + keywords?: string; +} diff --git a/api/oa/order/index.ts b/api/oa/order/index.ts new file mode 100644 index 0000000..eb7ab1f --- /dev/null +++ b/api/oa/order/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Order, OrderParam } from './model'; + +/** + * 分页查询订单 + */ +export async function pageOrder(params: OrderParam) { + const res = await request.get>>( + '/oa/order/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询订单列表 + */ +export async function listOrder(params?: OrderParam) { + const res = await request.get>('/oa/order', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加订单 + */ +export async function addOrder(data: Order) { + const res = await request.post>('/oa/order', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改订单 + */ +export async function updateOrder(data: Order) { + const res = await request.put>('/oa/order', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除订单 + */ +export async function removeOrder(id?: number) { + const res = await request.delete>('/oa/order/' + id); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除订单 + */ +export async function removeBatchOrder(data: (number | undefined)[]) { + const res = await request.delete>('/oa/order/batch', { + data + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateOrderStatus(orderId?: number, status?: number) { + const res = await request.put>('/oa/order/status', { + orderId, + status + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询订单 + */ +export async function getOrder(id: number) { + const res = await request.get>('/oa/order/' + id); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>('/oa/order/existence', { + params: { field, value, id } + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/order/model/index.ts b/api/oa/order/model/index.ts new file mode 100644 index 0000000..0c9a5e7 --- /dev/null +++ b/api/oa/order/model/index.ts @@ -0,0 +1,44 @@ +import type { PageParam } from '@/api'; +import { Company } from '@/api/system/company/model'; + +/** + * 订单 + */ +export interface Order { + orderId?: number; + orderNo?: string; + type?: number; + logo?: string; + money?: number; + payPrice?: number; + planId?: number; + priceId?: number; + gradeId?: number; + userId?: number; + companyId?: number; + nickname?: string; + username?: string; + userAvatar?: string; + shopId?: string; + sortNumber?: number; + comments?: string; + status?: number; + createTime?: string; + updateTime?: string; + company?: Company; +} + +/** + * 订单搜索条件 + */ +export interface OrderParam extends PageParam { + orderId?: number; + orderNo?: string; + type?: number; + status?: string; + sortNumber?: string; + userId?: number; + createTime?: string; + username?: string; + nickname?: string; +} diff --git a/api/oa/product/index.ts b/api/oa/product/index.ts new file mode 100644 index 0000000..be36da9 --- /dev/null +++ b/api/oa/product/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Product, ProductParam } from './model'; + +/** + * 分页查询产品 + */ +export async function pageProduct(params: ProductParam) { + const res = await request.get>>( + '/oa/product/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品列表 + */ +export async function listProduct(params?: ProductParam) { + const res = await request.get>('/oa/product', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品 + */ +export async function addProduct(data: Product) { + const res = await request.post>('/oa/product', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品 + */ +export async function updateProduct(data: Product) { + const res = await request.put>('/oa/product', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品 + */ +export async function removeProduct(id?: number) { + const res = await request.delete>('/oa/product/' + id); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品 + */ +export async function removeBatchProduct(data: (number | undefined)[]) { + const res = await request.delete>('/oa/product/batch', { + data + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateProductStatus(productId?: number, status?: number) { + const res = await request.put>('/oa/product/status', { + productId, + status + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品 + */ +export async function getProduct(id: number) { + const res = await request.get>('/oa/product/' + id); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>('/oa/product/existence', { + params: { field, value, id } + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/product/model/index.ts b/api/oa/product/model/index.ts new file mode 100644 index 0000000..77e551d --- /dev/null +++ b/api/oa/product/model/index.ts @@ -0,0 +1,94 @@ +import type { PageParam } from '@/api'; + +/** + * 产品 + */ +export interface Product { + // 自增ID + productId?: number; + // 类型 0软件产品 1实物商品 2虚拟商品 + type?: number; + // 产品编码 + code?: string; + // 产品标题 + title?: string; + // 封面图 + image?: string; + // 产品详情 + content?: string; + // 父级分类ID + parentId?: number; + // 父级栏目名称 + parentName?: string; + // 产品分类ID + categoryId?: number; + // 产品分类名称 + categoryName?: string; + // 标签 + tag?: string; + // 产品规格 0单规格 1多规格 + specs?: number; + // 货架 + position?: string; + // 单位名称 (个) + unitName?: string; + // 进货价格 + price?: number; + // 销售价格 + salePrice?: number; + // 库存计算方式(10下单减库存 20付款减库存) + deductStockType?: number; + // 启用交付方式 + deliveryMethod?: number; + // 启用购买时长 + durationMethod?: number; + // 启用套餐版本 + packageMethod?: number; + // 最大可购买数量 + canBuyNumber?: number; + // 轮播图 + files?: string; + // 销量 + sales?: number; + // 库存 + stock?: number; + // 消费赚取积分 + gainIntegral?: string; + // 推荐 + recommend?: number; + // 是否官方自营 + official?: boolean; + // 商户ID + merchantId?: number; + // 状态(0:未上架,1:上架) + isShow?: string; + // 状态, 0上架 1待上架 2待审核 3审核不通过 + status?: number; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 用户ID + userId?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; + // 购买数量 + num?: number; +} + +/** + * 产品搜索条件 + */ +export interface ProductParam extends PageParam { + productId?: number; + type?: number; + official?: boolean; + status?: number; + keywords?: string; +} diff --git a/api/oa/product/tabs/index.ts b/api/oa/product/tabs/index.ts new file mode 100644 index 0000000..e7889b1 --- /dev/null +++ b/api/oa/product/tabs/index.ts @@ -0,0 +1,129 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { + ProductTabs, + ProductTabsParam +} from '@/api/oa/product/tabs/model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询产品属性 + */ +export async function pageProductTabs(params: ProductTabsParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/product-tabs/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询产品属性列表 + */ +export async function listProductTabs(params?: ProductTabsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/product-tabs', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询产品属性 + */ +export async function getProductTabs(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/product-tabs/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加产品属性 + */ +export async function addProductTabs(data: ProductTabs) { + const res = await request.post>( + MODULES_API_URL + '/oa/product-tabs', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改产品属性 + */ +export async function updateProductTabs(data: ProductTabs) { + const res = await request.put>( + MODULES_API_URL + '/oa/product-tabs', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除产品属性 + */ +export async function removeProductTabs(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/product-tabs/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除产品属性 + */ +export async function removeBatchProductTabs(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/product-tabs/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/oa/product-tabs/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/product/tabs/model/index.ts b/api/oa/product/tabs/model/index.ts new file mode 100644 index 0000000..9115ef4 --- /dev/null +++ b/api/oa/product/tabs/model/index.ts @@ -0,0 +1,24 @@ +import type { PageParam } from '@/api'; + +/** + * 产品属性 + */ +export interface ProductTabs { + productId?: number; + name?: string; + type?: string; + comments?: string; + userId?: number; + appId?: number; + status?: any; + sortNumber?: number; + createTime?: string; +} + +/** + * 项目参数搜索条件 + */ +export interface ProductTabsParam extends PageParam { + productId?: number; + userId?: number; +} diff --git a/api/oa/project/index.ts b/api/oa/project/index.ts new file mode 100644 index 0000000..3e06eea --- /dev/null +++ b/api/oa/project/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Project, ProjectParam } from './model'; + +/** + * 分页查询项目 + */ +export async function pageProject(params: ProjectParam) { + const res = await request.get>>( + '/oa/project/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目列表 + */ +export async function listProject(params?: ProjectParam) { + const res = await request.get>('/oa/project', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询项目 + */ +export async function getProject(id: number) { + const res = await request.get>('/oa/project/' + id); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加项目 + */ +export async function addProject(data: Project) { + const res = await request.post>('/oa/project', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改项目 + */ +export async function updateProject(data: Project) { + const res = await request.put>('/oa/project', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除项目 + */ +export async function removeProject(id?: number) { + const res = await request.delete>('/oa/project/' + id); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除项目 + */ +export async function removeBatchProject(data: (number | undefined)[]) { + const res = await request.delete>('/oa/project/batch', { + data + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>('/oa/project/existence', { + params: { field, value, id } + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/project/model/index.ts b/api/oa/project/model/index.ts new file mode 100644 index 0000000..bb6e700 --- /dev/null +++ b/api/oa/project/model/index.ts @@ -0,0 +1,56 @@ +import type { PageParam } from '@/api'; + +/** + * 项目 + */ +export interface Project { + // 项目id + projectId?: number; + // 项目类型 + projectType?: string; + // 项目分类 + projectCategory?: string; + // 项目标识 + projectCode: string; + // 项目名称 + projectName?: string; + // 项目图标 + projectAvatar?: string; + url?: string; + urlDev?: string; + urlAdmin?: string; + account?: string; + money?: string; + realMoney?: string; + annualFee?: string; + qrcode?: string; + progress?: string; + views?: string; + // 项目详情 + content?: string; + // 客户ID + customerId?: number; + // 客户名称 + customerName?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: string; + // 用户ID + userId?: number; +} + +/** + * 项目搜索条件 + */ +export interface ProjectParam extends PageParam { + projectName?: string; + projectCode?: string; + status?: string; + // 商户编号 + merchantCode?: string; +} diff --git a/api/oa/task-count/index.ts b/api/oa/task-count/index.ts new file mode 100644 index 0000000..7006fa9 --- /dev/null +++ b/api/oa/task-count/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { TaskCount, TaskCountParam } from './model/index'; +import { TabsParam } from '@/api/tabs'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询统计 + */ +export async function pageTaskCount(params: TaskCountParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/task-count/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询统计列表 + */ +export async function listTaskCount(params?: TaskCountParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询统计 + */ +export async function getTaskCount(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-count/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加统计 + */ +export async function addTaskCount(data: TaskCount) { + const res = await request.post>( + MODULES_API_URL + '/oa/task-count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改统计 + */ +export async function updateTaskCount(data: TaskCount) { + const res = await request.put>( + MODULES_API_URL + '/oa/task-count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除统计 + */ +export async function removeTaskCount(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task-count/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除统计 + */ +export async function removeBatchTaskCount(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task-count/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getCount(params?: TabsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-count/count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/task-count/model/index.ts b/api/oa/task-count/model/index.ts new file mode 100644 index 0000000..41f65d9 --- /dev/null +++ b/api/oa/task-count/model/index.ts @@ -0,0 +1,32 @@ +import type { PageParam } from '@/api'; + +/** + * 统计 + */ +export interface TaskCount { + // 统计id + taskCountId?: number; + userId?: number; + nickname?: string; + avatar?: string; + phone?: string; + pending?: number; + unused?: number; + today?: number; + month?: number; + year?: number; + total?: number; + commander?: number; + createTime?: string; + updateTime?: string; +} + +/** + * 统计搜索条件 + */ +export interface TaskCountParam extends PageParam { + taskCountId?: number; + userId?: number; + roleId?: number; + roleCode?: string; +} diff --git a/api/oa/task-record/index.ts b/api/oa/task-record/index.ts new file mode 100644 index 0000000..76136e4 --- /dev/null +++ b/api/oa/task-record/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { TaskRecord, TaskRecordParam } from './model/index'; +import { TabsParam } from '@/api/tabs'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询任务 + */ +export async function pageTaskRecord(params: TaskRecordParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/task-record/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询任务列表 + */ +export async function listTaskRecord(params?: TaskRecordParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-record', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询任务 + */ +export async function getTaskRecord(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-record/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加任务 + */ +export async function addTaskRecord(data: TaskRecord) { + const res = await request.post>( + MODULES_API_URL + '/oa/task-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改任务 + */ +export async function updateTaskRecord(data: TaskRecord) { + const res = await request.put>( + MODULES_API_URL + '/oa/task-record', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除任务 + */ +export async function removeTaskRecord(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task-record/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除任务 + */ +export async function removeBatchTaskRecord(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task-record/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getCount(params?: TabsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-record/count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/task-record/model/index.ts b/api/oa/task-record/model/index.ts new file mode 100644 index 0000000..50254e3 --- /dev/null +++ b/api/oa/task-record/model/index.ts @@ -0,0 +1,35 @@ +import type { PageParam } from '@/api'; +import { User } from '@/api/user/model'; + +/** + * 任务 + */ +export interface TaskRecord { + // 任务id + taskRecordId?: number; + taskId?: number; + parentId?: number; + nickname?: string; + avatar?: string; + content?: string; + files?: any; + appId?: number; + developerId?: number; + userId?: number; + sortNumber?: number; + comments?: string; + status?: string; + children?: TaskRecord[] | []; + createTime?: string; + toUser: User | null; +} + +/** + * 任务搜索条件 + */ +export interface TaskRecordParam extends PageParam { + taskRecordId?: number; + taskId?: number; + userId?: number; + developerId?: number; +} diff --git a/api/oa/task-user/index.ts b/api/oa/task-user/index.ts new file mode 100644 index 0000000..6ac9da6 --- /dev/null +++ b/api/oa/task-user/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { TaskUser, TaskUserParam } from './model/index'; +import { TabsParam } from '@/api/tabs'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询工单成员 + */ +export async function pageTaskUser(params: TaskUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/task-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询工单成员列表 + */ +export async function listTaskUser(params?: TaskUserParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询工单成员 + */ +export async function getTaskUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加工单成员 + */ +export async function addTaskUser(data: TaskUser) { + const res = await request.post>( + MODULES_API_URL + '/oa/task-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改工单成员 + */ +export async function updateTaskUser(data: TaskUser) { + const res = await request.put>( + MODULES_API_URL + '/oa/task-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除工单成员 + */ +export async function removeTaskUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除工单成员 + */ +export async function removeBatchTaskUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getCount(params?: TabsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task-user/count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/task-user/model/index.ts b/api/oa/task-user/model/index.ts new file mode 100644 index 0000000..334c1ea --- /dev/null +++ b/api/oa/task-user/model/index.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api'; + +/** + * 任务 + */ +export interface TaskUser { + // 任务id + taskUserId?: number; + taskId?: number; + role?: number; + userId?: number; + status?: string; + avatar?: string; + name?: string; + username?: string; + email?: string; + phone?: string; +} + +/** + * 任务搜索条件 + */ +export interface TaskUserParam extends PageParam { + taskUserId?: number; + taskId?: number; + userId?: number; +} diff --git a/api/oa/task/index.ts b/api/oa/task/index.ts new file mode 100644 index 0000000..e8ac5d6 --- /dev/null +++ b/api/oa/task/index.ts @@ -0,0 +1,154 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Task, TaskParam } from './model/index'; +import { TabsParam } from '@/api/tabs'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询任务 + */ +export async function pageTask(params: TaskParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/task/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询任务列表 + */ +export async function listTask(params?: TaskParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询任务 + */ +export async function getTask(id: number) { + const res = await request.get>( + MODULES_API_URL + '/oa/task/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加任务 + */ +export async function addTask(data: Task) { + const res = await request.post>( + MODULES_API_URL + '/oa/task', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改任务 + */ +export async function updateTask(data: Task) { + const res = await request.put>( + MODULES_API_URL + '/oa/task', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除任务 + */ +export async function removeTask(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除任务 + */ +export async function removeBatchTask(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/oa/task/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function getCount(params?: TabsParam) { + const res = await request.get>( + MODULES_API_URL + '/oa/task/count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取工单二维码 + * @param params + */ +export async function taskQRCode(params: TaskParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/task/taskQRCode', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取邀请加入二维码 + * @param params + */ +export async function taskJoinQRCode(params: TaskParam) { + const res = await request.get>>( + MODULES_API_URL + '/oa/task/taskJoinQRCode', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/task/model/index.ts b/api/oa/task/model/index.ts new file mode 100644 index 0000000..31a4cfd --- /dev/null +++ b/api/oa/task/model/index.ts @@ -0,0 +1,111 @@ +import type { PageParam } from '@/api'; +import { TaskRecord } from '@/api/oa/task-record/model'; +import { TaskUser } from '@/api/oa/task-user/model'; + +/** + * 任务 + */ +export interface Task { + // 任务id + taskId?: number; + // 任务名称 + name?: string; + // 任务类型 + taskType?: string; + // 关联应用 + appId?: number; + appName?: string; + // 项目ID + projectId?: string; + // 客户ID + customerId?: string; + // 资产ID + assetsId?: string; + // 开始时间 + startTime?: string; + // 结束时间 + endTime?: string; + // 任务内容 + content?: string; + files?: string; + // 任务发起人 + promoter?: number; + promoterName?: string; + promoterAlias?: string; + promoterAvatar?: string; + promoterCompanyName?: string; + // 任务状态 + progress?: number; + isRead?: boolean; + // 优先级 + priority?: string; + // 品质要求 + quality?: string; + // 期限(天) + day?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + redirect?: string; + // 创建时间 + createTime?: string; + updateTime?: string; + // 状态 + status?: number; + // 发布者 + userId?: any; + // 发布者昵称 + nickname?: string; + // 项目名称 + projectName?: string; + // 图片集 + images?: []; + avatar?: string; + // 受理人 + commander?: number; + commanderName?: string; + commanderAlias?: string; + commanderAvatar?: string; + commanderCompanyName?: string; + commanderRealName?: string; + // 最后回复人 + lastRealName?: string; + lastAvatar?: string; + lastReadUser?: number; + lastNickname?: string; + recordList?: TaskRecord[]; + users?: TaskUser[]; + phone?: string; + overdueDays?: string; + phoneXX?: string; + action?: string; + // 机密信息 + confidential?: any; + tenantId?: number; +} + +/** + * 任务搜索条件 + */ +export interface TaskParam extends PageParam { + taskId?: number; + status?: any; + name?: string; + promoter?: number; + promoterName?: string; + commander?: number; + commanderName?: string; + progress?: number; + betweenTime?: any; + userId?: number; + nickname?: string; + keywords?: any; + current?: string; + pending?: number; + appId?: number; + appName?: string; + companyId?: number; + companyName?: string; + taskType?: string; +} diff --git a/api/oa/task/model/progress.ts b/api/oa/task/model/progress.ts new file mode 100644 index 0000000..20cf262 --- /dev/null +++ b/api/oa/task/model/progress.ts @@ -0,0 +1,9 @@ +/** + * 枚举类 + */ +export const TOBEARRANGED = 0; // 待安排 +export const PENDING = 1; // 待处理 +export const PROCESSING = 2; // 处理中 +export const TOBECONFIRMED = 3; // 待评价 +export const COMPLETED = 4; // 已完成 +export const CLOSED = 5; // 已关闭 diff --git a/api/oa/task/model/task.ts b/api/oa/task/model/task.ts new file mode 100644 index 0000000..0fd77f8 --- /dev/null +++ b/api/oa/task/model/task.ts @@ -0,0 +1,8 @@ +export const TASK_STATUS_0 = 0; // 待处理 +export const TASK_STATUS_1 = 1; // 已完成 + +export const ACTION_1 = '派单'; +export const ACTION_2 = '已解决'; +export const ACTION_3 = '关单'; +export const ACTION_4 = '分享'; +export const ACTION_5 = '编辑'; diff --git a/api/oa/tennat/index.ts b/api/oa/tennat/index.ts new file mode 100644 index 0000000..609092e --- /dev/null +++ b/api/oa/tennat/index.ts @@ -0,0 +1,155 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Tenant, TenantParam } from './model'; +import { Menu } from '@/api/system/menu/model'; + +/** + * 分页查询租户 + */ +export async function pageTenant(params: TenantParam) { + // 租户列表查询需要传一个key + // params.tenantCode = 'ZAcxbdmDQFwUKC3e'; + const res = await request.get>>( + '/system/tenant/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询租户资料 + */ +export async function profile(params?: TenantParam) { + const res = await request.get>('/system/tenant/profile', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询租户列表 + */ +export async function listTenant(params?: TenantParam) { + const res = await request.get>('/system/tenant', { + params + }); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询 + */ +export async function getTenant(id: number) { + const res = await request.get>('/system/tenant/' + id); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加租户 + */ +export async function addTenant(data: Tenant) { + const res = await request.post>('/system/tenant', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改租户 + */ +export async function updateTenant(data: Tenant) { + const res = await request.put>('/system/tenant', data); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除租户 + */ +export async function removeTenant(id?: number) { + const res = await request.delete>('/system/tenant/' + id); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除租户 + */ +export async function removeBatchTenant(data: (number | undefined)[]) { + const res = await request.delete>('/system/tenant/batch', { + data + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 重置用户密码 + */ +export async function updateTenantPassword( + tenantId?: number, + password = 'gxwebsoft.com' +) { + const res = await request.put>('/system/tenant/password', { + tenantId, + password + }); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + '/system/tenant/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 租户初始化 + */ +export async function initialization(roleId?: number) { + const res = await request.get>( + '/system/tenant/role-menu/' + roleId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/oa/tennat/model/index.ts b/api/oa/tennat/model/index.ts new file mode 100644 index 0000000..7f9fbd6 --- /dev/null +++ b/api/oa/tennat/model/index.ts @@ -0,0 +1,39 @@ +import type { PageParam } from '@/api'; + +/** + * 租户 + */ +export interface Tenant { + // 租户id + tenantId?: number; + // 租户名称 + tenantName?: string; + // 应用ID + appId?: string; + // 应用秘钥 + appSecret?: string; + logo?: string; + // 所属客户 + companyName?: string; + // 关联客户ID + companyId?: string; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: number; + // + password?: string; +} + +/** + * 租户搜索条件 + */ +export interface TenantParam extends PageParam { + tenantName?: string; + appId?: string; + companyId?: number; + companyName?: string; + tenantCode?: string; +} diff --git a/api/passport/login/index.ts b/api/passport/login/index.ts new file mode 100644 index 0000000..dd8512c --- /dev/null +++ b/api/passport/login/index.ts @@ -0,0 +1,109 @@ +import request from '@/utils/request'; +// import { setToken } from '@/utils/token-util'; +import type { ApiResult } from '@/api'; +import type { + LoginParam, + LoginResult, + CaptchaResult, + SmsCaptchaResult +} from './model'; +import { SERVER_API_URL } from '~/config'; + +/** + * 登录 + */ +export async function login(data: LoginParam) { + const res = await request.post>( + SERVER_API_URL + '/login', + data + ); + if (res.data.code === 0) { + // setToken(res.data.data?.access_token, data.remember); + if (res.data.data?.user) { + const user = res.data.data?.user; + localStorage.setItem('TenantId', String(user.tenantId)); + localStorage.setItem('UserId', String(user.userId)); + } + + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取验证码 + */ +export async function getCaptcha() { + const res = await request.get>( + SERVER_API_URL + '/captcha' + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function loginBySms(data: LoginParam) { + const res = await request.post>( + SERVER_API_URL + '/loginBySms', + data + ); + if (res.data.code === 0) { + console.log(res.data,'登录成功') + // setToken(res.data.data?.access_token, data.remember); + // if (res.data.data?.user) { + // const user = res.data.data?.user; + // localStorage.setItem('TenantId', String(user.tenantId)); + // localStorage.setItem('Phone', String(user.phone)); + // localStorage.setItem('UserId', String(user.userId)); + // localStorage.setItem('MerchantId', String(user.merchantId)); + // localStorage.setItem('MerchantName', String(user.merchantName)); + // } + + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 发送短信验证码 + */ +export async function sendSmsCaptcha(data: LoginParam) { + const res = await request.post>( + SERVER_API_URL + '/sendSmsCaptcha', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 登录 + */ +export async function remoteLogin(data: LoginParam) { + const res = await request.post>( + 'https://open.gxwebsoft.com/api/login', + data + ); + if (res.data.code === 0) { + // setToken(res.data.data?.access_token, data.remember); + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取企业微信登录链接 + */ +export async function getWxWorkQrConnect(data: any) { + const res = await request.post>( + SERVER_API_URL + '/wx-work', + data + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/passport/login/model/index.ts b/api/passport/login/model/index.ts new file mode 100644 index 0000000..1f1c822 --- /dev/null +++ b/api/passport/login/model/index.ts @@ -0,0 +1,46 @@ +import type { User } from '@/api/system/user/model'; +/** + * 登录参数 + */ +export interface LoginParam { + // 账号 + username?: string; + // 密码 + password?: string; + // 租户id + tenantId?: number; + // 是否记住密码 + remember?: boolean; + // 手机号码 + phone?: string; + // 短信验证码 + code?: string; +} + +/** + * 登录返回结果 + */ +export interface LoginResult { + // token + access_token?: string; + // 用户信息 + user?: User; +} + +/** + * 图形验证码返回结果 + */ +export interface CaptchaResult { + // 图形验证码base64数据 + base64: string; + // 验证码文本 + text: string; +} + +/** + * 短信验证码返回结果 + */ +export interface SmsCaptchaResult { + // 验证码文本 + text: string; +} diff --git a/api/shop/brand/index.ts b/api/shop/brand/index.ts new file mode 100644 index 0000000..2102a84 --- /dev/null +++ b/api/shop/brand/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Brand, BrandParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询品牌 + */ +export async function pageBrand(params: BrandParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/brand/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询品牌列表 + */ +export async function listBrand(params?: BrandParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/brand', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加品牌 + */ +export async function addBrand(data: Brand) { + const res = await request.post>( + MODULES_API_URL + '/shop/brand', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改品牌 + */ +export async function updateBrand(data: Brand) { + const res = await request.put>( + MODULES_API_URL + '/shop/brand', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除品牌 + */ +export async function removeBrand(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/brand/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除品牌 + */ +export async function removeBatchBrand(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/brand/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询品牌 + */ +export async function getBrand(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/brand/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/brand/model/index.ts b/api/shop/brand/model/index.ts new file mode 100644 index 0000000..e2698e6 --- /dev/null +++ b/api/shop/brand/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 品牌 + */ +export interface Brand { + // ID + brandId?: number; + // 品牌名称 + brandName?: string; + // 图标 + image?: string; + // 备注 + comments?: string; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 品牌搜索条件 + */ +export interface BrandParam extends PageParam { + brandId?: number; + keywords?: string; +} diff --git a/api/shop/cashier/index.ts b/api/shop/cashier/index.ts new file mode 100644 index 0000000..790e92c --- /dev/null +++ b/api/shop/cashier/index.ts @@ -0,0 +1,194 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Cashier, CashierParam, CashierVo } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询收银 + */ +export async function pageCashier(params: CashierParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/cashier/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询收银列表 + */ +export async function listCashier(params?: CashierParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/cashier', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询收银列表 + */ +export async function listByGroupId(params?: CashierParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/cashier/listByGroupId', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加收银 + */ +export async function addCashier(data: Cashier) { + const res = await request.post>( + MODULES_API_URL + '/shop/cashier', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改收银 + */ +export async function updateCashier(data: Cashier) { + const res = await request.put>( + MODULES_API_URL + '/shop/cashier', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除收银 + */ +export async function removeCashier(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/cashier/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除收银 + */ +export async function removeBatchCashier(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/cashier/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询收银 + */ +export async function getCashier(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/cashier/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 挂单 + * @param data + */ +export async function packCashier(data: Cashier[]) { + const res = await request.put>( + MODULES_API_URL + '/shop/cashier/packCashier', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 减少数量 + * @param data + */ +export async function subCartNum(data: Cashier) { + const res = await request.put>( + MODULES_API_URL + '/shop/cashier/subCartNum', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 增加数量 + * @param data + */ +export async function addCartNum(data: Cashier) { + const res = await request.put>( + MODULES_API_URL + '/shop/cashier/addCartNum', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 取单 + */ +export async function getByGroup(groupId: number) { + const res = await request.put>( + MODULES_API_URL + '/shop/cashier/getByGroup/' + groupId + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + + +/** + * 删除整单 + */ +export async function removeByGroup(groupId: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/cashier/removeByGroup/' + groupId + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/cashier/model/index.ts b/api/shop/cashier/model/index.ts new file mode 100644 index 0000000..64ed207 --- /dev/null +++ b/api/shop/cashier/model/index.ts @@ -0,0 +1,80 @@ +import type { PageParam } from '@/api'; + +export interface CashierVo { + // 购物车总金额 + totalPrice?: number; + // 宝贝总数量 + totalNums?: number; + // 已选宝贝 + selectNums?: number; + // 是否全选 + selectAll?: boolean; + // 订单备注 + comments?: string; + // 收银台商品列表 + cashiers?: Cashier[]; + // 按groupId分组 + groups?: any[]; +} + +/** + * 收银 + */ +export interface Cashier { + // 收银单ID + id?: number; + // 类型 0商城 1外卖 + type?: number; + // 唯一标识 + code?: string; + // 商品ID + goodsId?: number; + // 商品名称 + goodsName?: string; + // 场地名称 + name?: string; + // 商品封面图 + image?: string; + // 商品规格 + spec?: string; + // 商品价格 + price?: number; + // 商品数量 + cartNum?: number; + // 单商品合计 + totalPrice?: string; + // 0 = 未购买 1 = 已购买 + isPay?: string; + // 是否为立即购买 + isNew?: boolean; + // 是否选中 + selected?: boolean; + // 商户ID + merchantId?: number; + // 用户ID + userId?: string; + // 收银员ID + cashierId?: string; + // 收银单分组ID + groupId?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; + // 是否多规格 + specs?: number; + // 商品规格数据 + goodsSpecValue?: any; +} + +/** + * 收银搜索条件 + */ +export interface CashierParam extends PageParam { + id?: number; + groupId?: number; + showByGroup?: boolean; + keywords?: string; +} diff --git a/api/shop/count/index.ts b/api/shop/count/index.ts new file mode 100644 index 0000000..5f0672b --- /dev/null +++ b/api/shop/count/index.ts @@ -0,0 +1,119 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Count, CountParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +export async function data(params: CountParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/count/data', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询商城销售统计表 + */ +export async function pageCount(params: CountParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/count/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商城销售统计表列表 + */ +export async function listCount(params?: CountParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商城销售统计表 + */ +export async function addCount(data: Count) { + const res = await request.post>( + MODULES_API_URL + '/shop/count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商城销售统计表 + */ +export async function updateCount(data: Count) { + const res = await request.put>( + MODULES_API_URL + '/shop/count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商城销售统计表 + */ +export async function removeCount(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/count/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商城销售统计表 + */ +export async function removeBatchCount(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/count/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商城销售统计表 + */ +export async function getCount(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/count/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/count/model/index.ts b/api/shop/count/model/index.ts new file mode 100644 index 0000000..469c78d --- /dev/null +++ b/api/shop/count/model/index.ts @@ -0,0 +1,40 @@ +import type { PageParam } from '@/api'; + +/** + * 商城销售统计表 + */ +export interface Count { + // ID + id?: number; + // 统计日期 + dateTime?: string; + // 总销售额 + totalPrice?: string; + // 今日销售额 + todayPrice?: string; + // 总会员数 + totalUsers?: string; + // 今日新增 + todayUsers?: string; + // 总订单笔数 + totalOrders?: string; + // 今日订单笔数 + todayOrders?: string; + // 备注 + comments?: string; + // 状态, 0正常, 1冻结 + status?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 商城销售统计表搜索条件 + */ +export interface CountParam extends PageParam { + id?: number; + dateTime?: string; + keywords?: string; +} diff --git a/api/shop/dealerApply/index.ts b/api/shop/dealerApply/index.ts new file mode 100644 index 0000000..4bb169b --- /dev/null +++ b/api/shop/dealerApply/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerApply, DealerApplyParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商申请记录表 + */ +export async function pageDealerApply(params: DealerApplyParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-apply/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商申请记录表列表 + */ +export async function listDealerApply(params?: DealerApplyParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-apply', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商申请记录表 + */ +export async function addDealerApply(data: DealerApply) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-apply', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商申请记录表 + */ +export async function updateDealerApply(data: DealerApply) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-apply', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商申请记录表 + */ +export async function removeDealerApply(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-apply/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商申请记录表 + */ +export async function removeBatchDealerApply(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-apply/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商申请记录表 + */ +export async function getDealerApply(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-apply/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerApply/model/index.ts b/api/shop/dealerApply/model/index.ts new file mode 100644 index 0000000..5226459 --- /dev/null +++ b/api/shop/dealerApply/model/index.ts @@ -0,0 +1,41 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商申请记录表 + */ +export interface DealerApply { + // 主键ID + applyId?: number; + // 用户ID + userId?: number; + // 姓名 + realName?: string; + // 手机号 + mobile?: string; + // 推荐人用户ID + refereeId?: number; + // 申请方式(10需后台审核 20无需审核) + applyType?: number; + // 申请时间 + applyTime?: number; + // 审核状态 (10待审核 20审核通过 30驳回) + applyStatus?: number; + // 审核时间 + auditTime?: number; + // 驳回原因 + rejectReason?: string; + // 商城ID + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 分销商申请记录表搜索条件 + */ +export interface DealerApplyParam extends PageParam { + applyId?: number; + keywords?: string; +} diff --git a/api/shop/dealerCapital/index.ts b/api/shop/dealerCapital/index.ts new file mode 100644 index 0000000..53ff79c --- /dev/null +++ b/api/shop/dealerCapital/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerCapital, DealerCapitalParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商资金明细表 + */ +export async function pageDealerCapital(params: DealerCapitalParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-capital/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商资金明细表列表 + */ +export async function listDealerCapital(params?: DealerCapitalParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-capital', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商资金明细表 + */ +export async function addDealerCapital(data: DealerCapital) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-capital', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商资金明细表 + */ +export async function updateDealerCapital(data: DealerCapital) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-capital', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商资金明细表 + */ +export async function removeDealerCapital(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-capital/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商资金明细表 + */ +export async function removeBatchDealerCapital(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-capital/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商资金明细表 + */ +export async function getDealerCapital(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-capital/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerCapital/model/index.ts b/api/shop/dealerCapital/model/index.ts new file mode 100644 index 0000000..2ada833 --- /dev/null +++ b/api/shop/dealerCapital/model/index.ts @@ -0,0 +1,35 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商资金明细表 + */ +export interface DealerCapital { + // 主键ID + id?: number; + // 分销商用户ID + userId?: number; + // 订单ID + orderId?: number; + // 资金流动类型 (10佣金收入 20提现支出 30转账支出 40转账收入) + flowType?: number; + // 金额 + money?: string; + // 描述 + describe?: string; + // 对方用户ID + toUserId?: number; + // 商城ID + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 分销商资金明细表搜索条件 + */ +export interface DealerCapitalParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/dealerOrder/index.ts b/api/shop/dealerOrder/index.ts new file mode 100644 index 0000000..87b9f8f --- /dev/null +++ b/api/shop/dealerOrder/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerOrder, DealerOrderParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商订单记录表 + */ +export async function pageDealerOrder(params: DealerOrderParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-order/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商订单记录表列表 + */ +export async function listDealerOrder(params?: DealerOrderParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-order', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商订单记录表 + */ +export async function addDealerOrder(data: DealerOrder) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商订单记录表 + */ +export async function updateDealerOrder(data: DealerOrder) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商订单记录表 + */ +export async function removeDealerOrder(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-order/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商订单记录表 + */ +export async function removeBatchDealerOrder(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-order/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商订单记录表 + */ +export async function getDealerOrder(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-order/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerOrder/model/index.ts b/api/shop/dealerOrder/model/index.ts new file mode 100644 index 0000000..b8f6884 --- /dev/null +++ b/api/shop/dealerOrder/model/index.ts @@ -0,0 +1,47 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商订单记录表 + */ +export interface DealerOrder { + // 主键ID + id?: number; + // 买家用户ID + userId?: number; + // 订单ID + orderId?: number; + // 订单总金额(不含运费) + orderPrice?: string; + // 分销商用户id(一级) + firstUserId?: number; + // 分销商用户id(二级) + secondUserId?: number; + // 分销商用户id(三级) + thirdUserId?: number; + // 分销佣金(一级) + firstMoney?: string; + // 分销佣金(二级) + secondMoney?: string; + // 分销佣金(三级) + thirdMoney?: string; + // 订单是否失效(0未失效 1已失效) + isInvalid?: number; + // 佣金结算(0未结算 1已结算) + isSettled?: number; + // 结算时间 + settleTime?: number; + // 商城ID + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 分销商订单记录表搜索条件 + */ +export interface DealerOrderParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/dealerReferee/index.ts b/api/shop/dealerReferee/index.ts new file mode 100644 index 0000000..542d4c3 --- /dev/null +++ b/api/shop/dealerReferee/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerReferee, DealerRefereeParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商推荐关系表 + */ +export async function pageDealerReferee(params: DealerRefereeParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-referee/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商推荐关系表列表 + */ +export async function listDealerReferee(params?: DealerRefereeParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-referee', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商推荐关系表 + */ +export async function addDealerReferee(data: DealerReferee) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-referee', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商推荐关系表 + */ +export async function updateDealerReferee(data: DealerReferee) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-referee', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商推荐关系表 + */ +export async function removeDealerReferee(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-referee/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商推荐关系表 + */ +export async function removeBatchDealerReferee(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-referee/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商推荐关系表 + */ +export async function getDealerReferee(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-referee/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerReferee/model/index.ts b/api/shop/dealerReferee/model/index.ts new file mode 100644 index 0000000..4edc1de --- /dev/null +++ b/api/shop/dealerReferee/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商推荐关系表 + */ +export interface DealerReferee { + // 主键ID + id?: number; + // 分销商用户ID + dealerId?: number; + // 用户id(被推荐人) + userId?: number; + // 推荐关系层级(1,2,3) + level?: number; + // 商城ID + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 分销商推荐关系表搜索条件 + */ +export interface DealerRefereeParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/dealerSetting/index.ts b/api/shop/dealerSetting/index.ts new file mode 100644 index 0000000..bea5005 --- /dev/null +++ b/api/shop/dealerSetting/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerSetting, DealerSettingParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商设置表 + */ +export async function pageDealerSetting(params: DealerSettingParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-setting/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商设置表列表 + */ +export async function listDealerSetting(params?: DealerSettingParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-setting', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商设置表 + */ +export async function addDealerSetting(data: DealerSetting) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-setting', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商设置表 + */ +export async function updateDealerSetting(data: DealerSetting) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-setting', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商设置表 + */ +export async function removeDealerSetting(id?: string) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-setting/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商设置表 + */ +export async function removeBatchDealerSetting(data: (string | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-setting/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商设置表 + */ +export async function getDealerSetting(id: string) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-setting/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerSetting/model/index.ts b/api/shop/dealerSetting/model/index.ts new file mode 100644 index 0000000..9dbe7b6 --- /dev/null +++ b/api/shop/dealerSetting/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商设置表 + */ +export interface DealerSetting { + // 设置项标示 + key?: string; + // 设置项描述 + describe?: string; + // 设置内容(json格式) + values?: string; + // 商城ID + tenantId?: number; + // 更新时间 + updateTime?: number; +} + +/** + * 分销商设置表搜索条件 + */ +export interface DealerSettingParam extends PageParam { + key?: number; + keywords?: string; +} diff --git a/api/shop/dealerUser/index.ts b/api/shop/dealerUser/index.ts new file mode 100644 index 0000000..ea94f46 --- /dev/null +++ b/api/shop/dealerUser/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerUser, DealerUserParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商用户记录表 + */ +export async function pageDealerUser(params: DealerUserParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-user/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商用户记录表列表 + */ +export async function listDealerUser(params?: DealerUserParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商用户记录表 + */ +export async function addDealerUser(data: DealerUser) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商用户记录表 + */ +export async function updateDealerUser(data: DealerUser) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商用户记录表 + */ +export async function removeDealerUser(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商用户记录表 + */ +export async function removeBatchDealerUser(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商用户记录表 + */ +export async function getDealerUser(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerUser/model/index.ts b/api/shop/dealerUser/model/index.ts new file mode 100644 index 0000000..5091a0c --- /dev/null +++ b/api/shop/dealerUser/model/index.ts @@ -0,0 +1,48 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商用户记录表 + */ +export interface DealerUser { + // 自增id + id?: number; + // 分销商用户ID + userId?: number; + // 姓名 + realName?: string; + // 手机号 + mobile?: string; + // 支付密码 + payPassword?: string; + // 当前可提现佣金 + money?: string; + // 已冻结佣金 + freezeMoney?: string; + // 累积提现佣金 + totalMoney?: string; + // 推荐人用户ID + refereeId?: number; + // 成员数量(一级) + firstNum?: number; + // 成员数量(二级) + secondNum?: number; + // 成员数量(三级) + thirdNum?: number; + // 是否删除 + isDelete?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 分销商用户记录表搜索条件 + */ +export interface DealerUserParam extends PageParam { + id?: number; + userId?: number; + keywords?: string; +} diff --git a/api/shop/dealerWithdraw/index.ts b/api/shop/dealerWithdraw/index.ts new file mode 100644 index 0000000..e52e413 --- /dev/null +++ b/api/shop/dealerWithdraw/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DealerWithdraw, DealerWithdrawParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询分销商提现明细表 + */ +export async function pageDealerWithdraw(params: DealerWithdrawParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/dealer-withdraw/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询分销商提现明细表列表 + */ +export async function listDealerWithdraw(params?: DealerWithdrawParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-withdraw', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加分销商提现明细表 + */ +export async function addDealerWithdraw(data: DealerWithdraw) { + const res = await request.post>( + MODULES_API_URL + '/shop/dealer-withdraw', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改分销商提现明细表 + */ +export async function updateDealerWithdraw(data: DealerWithdraw) { + const res = await request.put>( + MODULES_API_URL + '/shop/dealer-withdraw', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除分销商提现明细表 + */ +export async function removeDealerWithdraw(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-withdraw/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除分销商提现明细表 + */ +export async function removeBatchDealerWithdraw(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/dealer-withdraw/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询分销商提现明细表 + */ +export async function getDealerWithdraw(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/dealer-withdraw/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/dealerWithdraw/model/index.ts b/api/shop/dealerWithdraw/model/index.ts new file mode 100644 index 0000000..f6ae4c1 --- /dev/null +++ b/api/shop/dealerWithdraw/model/index.ts @@ -0,0 +1,47 @@ +import type { PageParam } from '@/api'; + +/** + * 分销商提现明细表 + */ +export interface DealerWithdraw { + // 主键ID + id?: number; + // 分销商用户ID + userId?: number; + // 提现金额 + money?: string; + // 打款方式 (10微信 20支付宝 30银行卡) + payType?: number; + // 支付宝姓名 + alipayName?: string; + // 支付宝账号 + alipayAccount?: string; + // 开户行名称 + bankName?: string; + // 银行开户名 + bankAccount?: string; + // 银行卡号 + bankCard?: string; + // 申请状态 (10待审核 20审核通过 30驳回 40已打款) + applyStatus?: number; + // 审核时间 + auditTime?: number; + // 驳回原因 + rejectReason?: string; + // 来源客户端(APP、H5、小程序等) + platform?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 分销商提现明细表搜索条件 + */ +export interface DealerWithdrawParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goods/index.ts b/api/shop/goods/index.ts new file mode 100644 index 0000000..100a82d --- /dev/null +++ b/api/shop/goods/index.ts @@ -0,0 +1,116 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Goods, GoodsParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +export async function getCount(params: GoodsParam) { + const res = await request.get(MODULES_API_URL + '/shop/goods/data', { + params + }); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询商品记录表 + */ +export async function pageGoods(params: GoodsParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品记录表列表 + */ +export async function listGoods(params?: GoodsParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品记录表 + */ +export async function addGoods(data: Goods) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品记录表 + */ +export async function updateGoods(data: Goods) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品记录表 + */ +export async function removeGoods(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品记录表 + */ +export async function removeBatchGoods(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品记录表 + */ +export async function getGoods(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goods/model/index.ts b/api/shop/goods/model/index.ts new file mode 100644 index 0000000..b3f2ce7 --- /dev/null +++ b/api/shop/goods/model/index.ts @@ -0,0 +1,114 @@ +import type { PageParam } from '@/api'; +import type { GoodsSpec } from "@/api/shop/goodsSpec/model"; +import type { GoodsSku } from "@/api/shop/goodsSku/model"; +import type {Merchant} from "~/api/shop/merchant/model"; + +export interface GoodsCount { + totalNum: number; + totalNum2: number; + totalNum3: number; + totalNum4: number; +} +/** + * 商品记录表 + */ +export interface Goods { + // 自增ID + goodsId?: number; + // 类型 1实物商品 2虚拟商品 + type?: number; + // 商品编码 + code?: string; + // 商品标题 + goodsName?: string; + // 商品封面图 + image?: string; + // 商品详情 + content?: string; + // 商品分类ID + categoryId?: number; + // 一级分类 + categoryParent?: string; + // 二级分类 + categoryChildren?: string; + // 商品规格 0单规格 1多规格 + specs?: number; + // 货架 + position?: string; + // 进货价格 + price?: number; + // 销售价格 + salePrice?: number; + // 库存计算方式(10下单减库存 20付款减库存) + deductStockType?: number; + // 封面图 + files?: string; + // 封面图数组 + filesImgs?: any; + // 销量 + sales?: number; + // 库存 + stock?: number; + // 商品重量 + goodsWeight?: number; + // 消费赚取积分 + gainIntegral?: number; + // 推荐 + recommend?: number; + // 商户ID + merchantId?: number; + // 商户名称 + merchantName?: string; + // 状态(0:未上架,1:上架) + isShow?: number; + // 状态, 0上架 1待上架 2待审核 3审核不通过 + status?: number; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 用户ID + userId?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; + // 显示规格名 + specName?: string; + // 商品规格 + goodsSpecs?: GoodsSpec[]; + // 商品sku列表 + goodsSkus?: GoodsSku[]; + // 单位名称 + unitName?: string; + // 购买数量 + num?: number; + radio?: any; + // 店铺信息 + merchant?: Merchant; +} + +export interface BathSet { + + price?: number; + salePrice?: number; + stock?: number; + skuNo?: string; +} + +/** + * 商品记录表搜索条件 + */ +export interface GoodsParam extends PageParam { + parentId?: number; + categoryId?: number; + goodsId?: number; + goodsName?: string; + isShow?: number; + stock?: number; + keywords?: string; +} diff --git a/api/shop/goodsAttr/index.ts b/api/shop/goodsAttr/index.ts new file mode 100644 index 0000000..25ccbdd --- /dev/null +++ b/api/shop/goodsAttr/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsAttr, GoodsAttrParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品属性表 + */ +export async function pageGoodsAttr(params: GoodsAttrParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-attr/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品属性表列表 + */ +export async function listGoodsAttr(params?: GoodsAttrParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-attr', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品属性表 + */ +export async function addGoodsAttr(data: GoodsAttr) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-attr', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品属性表 + */ +export async function updateGoodsAttr(data: GoodsAttr) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-attr', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品属性表 + */ +export async function removeGoodsAttr(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-attr/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品属性表 + */ +export async function removeBatchGoodsAttr(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-attr/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品属性表 + */ +export async function getGoodsAttr(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-attr/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsAttr/model/index.ts b/api/shop/goodsAttr/model/index.ts new file mode 100644 index 0000000..458cfe0 --- /dev/null +++ b/api/shop/goodsAttr/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 商品属性表 + */ +export interface GoodsAttr { + // 主键 + id?: number; + // 商品ID + goodsId?: number; + // 属性名 + attrName?: string; + // 属性值 + attrValues?: string; + // 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 + type?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; +} + +/** + * 商品属性表搜索条件 + */ +export interface GoodsAttrParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsAttrResult/index.ts b/api/shop/goodsAttrResult/index.ts new file mode 100644 index 0000000..de9c0d4 --- /dev/null +++ b/api/shop/goodsAttrResult/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsAttrResult, GoodsAttrResultParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品属性详情表 + */ +export async function pageGoodsAttrResult(params: GoodsAttrResultParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-attr-result/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品属性详情表列表 + */ +export async function listGoodsAttrResult(params?: GoodsAttrResultParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-attr-result', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品属性详情表 + */ +export async function addGoodsAttrResult(data: GoodsAttrResult) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-attr-result', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品属性详情表 + */ +export async function updateGoodsAttrResult(data: GoodsAttrResult) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-attr-result', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品属性详情表 + */ +export async function removeGoodsAttrResult(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-attr-result/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品属性详情表 + */ +export async function removeBatchGoodsAttrResult(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-attr-result/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品属性详情表 + */ +export async function getGoodsAttrResult(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-attr-result/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsAttrResult/model/index.ts b/api/shop/goodsAttrResult/model/index.ts new file mode 100644 index 0000000..62afe50 --- /dev/null +++ b/api/shop/goodsAttrResult/model/index.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api'; + +/** + * 商品属性详情表 + */ +export interface GoodsAttrResult { + // 主键 + id?: number; + // 商品ID + goodsId?: number; + // 商品属性参数 + result?: string; + // 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 + type?: string; + // 租户id + tenantId?: number; + // 更新时间 + updateTime?: string; +} + +/** + * 商品属性详情表搜索条件 + */ +export interface GoodsAttrResultParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsAttrValue/index.ts b/api/shop/goodsAttrValue/index.ts new file mode 100644 index 0000000..24924e6 --- /dev/null +++ b/api/shop/goodsAttrValue/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsAttrValue, GoodsAttrValueParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品属性值表 + */ +export async function pageGoodsAttrValue(params: GoodsAttrValueParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-attr-value/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品属性值表列表 + */ +export async function listGoodsAttrValue(params?: GoodsAttrValueParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-attr-value', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品属性值表 + */ +export async function addGoodsAttrValue(data: GoodsAttrValue) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-attr-value', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品属性值表 + */ +export async function updateGoodsAttrValue(data: GoodsAttrValue) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-attr-value', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品属性值表 + */ +export async function removeGoodsAttrValue(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-attr-value/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品属性值表 + */ +export async function removeBatchGoodsAttrValue(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-attr-value/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品属性值表 + */ +export async function getGoodsAttrValue(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-attr-value/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsAttrValue/model/index.ts b/api/shop/goodsAttrValue/model/index.ts new file mode 100644 index 0000000..2bee0f7 --- /dev/null +++ b/api/shop/goodsAttrValue/model/index.ts @@ -0,0 +1,59 @@ +import type { PageParam } from '@/api'; + +/** + * 商品属性值表 + */ +export interface GoodsAttrValue { + // 主键 + id?: number; + // 商品ID + goodsId?: number; + // 商品属性索引值 (attr_value|attr_value[|....]) + suk?: string; + // 属性对应的库存 + stock?: number; + // 销量 + sales?: number; + // 属性金额 + price?: number; + // 图片 + image?: string; + // 唯一值 + unique?: string; + // 成本价 + cost?: string; + // 商品条码 + barCode?: string; + // 原价 + otPrice?: string; + // 重量 + weight?: string; + // 体积 + volume?: string; + // 一级返佣 + brokerage?: string; + // 二级返佣 + brokerageTwo?: string; + // 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 + type?: string; + // 活动限购数量 + quota?: number; + // 活动限购数量显示 + quotaShow?: number; + // attr_values 创建更新时的属性对应 + attrValue?: string; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 商品属性值表搜索条件 + */ +export interface GoodsAttrValueParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsCategory/index.ts b/api/shop/goodsCategory/index.ts new file mode 100644 index 0000000..0798d1f --- /dev/null +++ b/api/shop/goodsCategory/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsCategory, GoodsCategoryParam } from './model'; +import { MODULES_API_URL } from '@/config/index'; + +/** + * 分页查询商品分类 + */ +export async function pageGoodsCategory(params: GoodsCategoryParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-category/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品分类列表 + */ +export async function listGoodsCategory(params?: GoodsCategoryParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-category', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品分类 + */ +export async function addGoodsCategory(data: GoodsCategory) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-category', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品分类 + */ +export async function updateGoodsCategory(data: GoodsCategory) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-category', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品分类 + */ +export async function removeGoodsCategory(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-category/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品分类 + */ +export async function removeBatchGoodsCategory(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-category/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品分类 + */ +export async function getGoodsCategory(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-category/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsCategory/model/index.ts b/api/shop/goodsCategory/model/index.ts new file mode 100644 index 0000000..8e44f30 --- /dev/null +++ b/api/shop/goodsCategory/model/index.ts @@ -0,0 +1,67 @@ +import type { PageParam } from '@/api'; + +/** + * 商品分类 + */ +export interface GoodsCategory { + // 商品分类ID + categoryId?: number; + // 分类标识 + categoryCode?: string; + // 分类名称 + title?: string; + // 类型 0列表 1单页 2外链 + type?: number; + // 分类图片 + image?: string; + // 上级分类ID + parentId?: number; + // 路由/链接地址 + path?: string; + // 组件路径 + component?: string; + // 绑定的页面 + pageId?: number; + // 用户ID + userId?: number; + // 商品数量 + count?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 是否隐藏, 0否, 1是(仅注册路由不显示在左侧菜单) + hide?: number; + // 是否推荐 + recommend?: number; + // 是否显示在首页 + showIndex?: number; + // 状态, 0正常, 1禁用 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; + disabled?: boolean; + key?: number; + value?: number; + label?: string; + // 子菜单 + children?: GoodsCategory[]; + // 商铺ID + merchantId?: number; +} + +/** + * 商品分类搜索条件 + */ +export interface GoodsCategoryParam extends PageParam { + categoryId?: number; + parentId?: number; + type?: number; + keywords?: string; +} diff --git a/api/shop/goodsComment/index.ts b/api/shop/goodsComment/index.ts new file mode 100644 index 0000000..d8bb8b4 --- /dev/null +++ b/api/shop/goodsComment/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsComment, GoodsCommentParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询评论表 + */ +export async function pageGoodsComment(params: GoodsCommentParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-comment/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询评论表列表 + */ +export async function listGoodsComment(params?: GoodsCommentParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-comment', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加评论表 + */ +export async function addGoodsComment(data: GoodsComment) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改评论表 + */ +export async function updateGoodsComment(data: GoodsComment) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除评论表 + */ +export async function removeGoodsComment(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-comment/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除评论表 + */ +export async function removeBatchGoodsComment(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-comment/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询评论表 + */ +export async function getGoodsComment(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-comment/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsComment/model/index.ts b/api/shop/goodsComment/model/index.ts new file mode 100644 index 0000000..bf42cfa --- /dev/null +++ b/api/shop/goodsComment/model/index.ts @@ -0,0 +1,61 @@ +import type { PageParam } from '@/api'; + +/** + * 评论表 + */ +export interface GoodsComment { + // 评论ID + id?: number; + // 用户ID + uid?: number; + // 订单ID + oid?: number; + // 商品唯一id + unique?: string; + // 商品id + goodsId?: number; + // 某种商品类型(普通商品、秒杀商品) + replyType?: string; + // 商品分数 + goodsScore?: string; + // 服务分数 + serviceScore?: string; + // 评论内容 + comment?: string; + // 评论图片 + pics?: string; + // 管理员回复内容 + merchantReplyContent?: string; + // 管理员回复时间 + merchantReplyTime?: number; + // 0未删除1已删除 + isDel?: string; + // 0未回复1已回复 + isReply?: string; + // 用户名称 + nickname?: string; + // 用户头像 + avatar?: string; + // 商品规格属性值,多个,号隔开 + sku?: string; + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 用户ID + userId?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 更新时间 + updateTime?: string; +} + +/** + * 评论表搜索条件 + */ +export interface GoodsCommentParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsCoupon/index.ts b/api/shop/goodsCoupon/index.ts new file mode 100644 index 0000000..75e4d26 --- /dev/null +++ b/api/shop/goodsCoupon/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsCoupon, GoodsCouponParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品优惠券表 + */ +export async function pageGoodsCoupon(params: GoodsCouponParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-coupon/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品优惠券表列表 + */ +export async function listGoodsCoupon(params?: GoodsCouponParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-coupon', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品优惠券表 + */ +export async function addGoodsCoupon(data: GoodsCoupon) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-coupon', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品优惠券表 + */ +export async function updateGoodsCoupon(data: GoodsCoupon) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-coupon', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品优惠券表 + */ +export async function removeGoodsCoupon(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-coupon/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品优惠券表 + */ +export async function removeBatchGoodsCoupon(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-coupon/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品优惠券表 + */ +export async function getGoodsCoupon(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-coupon/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsCoupon/model/index.ts b/api/shop/goodsCoupon/model/index.ts new file mode 100644 index 0000000..109215d --- /dev/null +++ b/api/shop/goodsCoupon/model/index.ts @@ -0,0 +1,35 @@ +import type { PageParam } from '@/api'; + +/** + * 商品优惠券表 + */ +export interface GoodsCoupon { + // + id?: undefined, + // 商品id + goodsId?: undefined, + // 优惠劵id + issueCouponId?: undefined, + // 排序(数字越小越靠前) + sortNumber?: undefined, + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 用户ID + userId?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 商品优惠券表搜索条件 + */ +export interface GoodsCouponParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsDescription/index.ts b/api/shop/goodsDescription/index.ts new file mode 100644 index 0000000..201328a --- /dev/null +++ b/api/shop/goodsDescription/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsDescription, GoodsDescriptionParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品描述表 + */ +export async function pageGoodsDescription(params: GoodsDescriptionParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-description/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品描述表列表 + */ +export async function listGoodsDescription(params?: GoodsDescriptionParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-description', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品描述表 + */ +export async function addGoodsDescription(data: GoodsDescription) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-description', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品描述表 + */ +export async function updateGoodsDescription(data: GoodsDescription) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-description', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品描述表 + */ +export async function removeGoodsDescription(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-description/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品描述表 + */ +export async function removeBatchGoodsDescription(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-description/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品描述表 + */ +export async function getGoodsDescription(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-description/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsDescription/model/index.ts b/api/shop/goodsDescription/model/index.ts new file mode 100644 index 0000000..804b347 --- /dev/null +++ b/api/shop/goodsDescription/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 商品描述表 + */ +export interface GoodsDescription { + // + id?: number; + // 商品ID + goodsId?: number; + // 商品详情 + description?: string; + // 商品类型 + type?: string; + // 租户id + tenantId?: number; +} + +/** + * 商品描述表搜索条件 + */ +export interface GoodsDescriptionParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsLog/index.ts b/api/shop/goodsLog/index.ts new file mode 100644 index 0000000..bcc2d64 --- /dev/null +++ b/api/shop/goodsLog/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsLog, GoodsLogParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品日志表 + */ +export async function pageGoodsLog(params: GoodsLogParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-log/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品日志表列表 + */ +export async function listGoodsLog(params?: GoodsLogParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-log', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品日志表 + */ +export async function addGoodsLog(data: GoodsLog) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-log', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品日志表 + */ +export async function updateGoodsLog(data: GoodsLog) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-log', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品日志表 + */ +export async function removeGoodsLog(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-log/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品日志表 + */ +export async function removeBatchGoodsLog(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-log/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品日志表 + */ +export async function getGoodsLog(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-log/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsLog/model/index.ts b/api/shop/goodsLog/model/index.ts new file mode 100644 index 0000000..68ecab3 --- /dev/null +++ b/api/shop/goodsLog/model/index.ts @@ -0,0 +1,53 @@ +import type { PageParam } from '@/api'; + +/** + * 商品日志表 + */ +export interface GoodsLog { + // 统计ID + id?: number; + // 类型visit,cart,order,pay,collect,refund + type?: string; + // 商品ID + goodsId?: number; + // 是否浏览 + visitNum?: string; + // 加入购物车数量 + cartNum?: number; + // 下单数量 + orderNum?: number; + // 支付数量 + payNum?: number; + // 支付金额 + payPrice?: string; + // 商品成本价 + costPrice?: string; + // 支付用户ID + payUid?: number; + // 退款数量 + refundNum?: number; + // 退款金额 + refundPrice?: string; + // 收藏 + collectNum?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1冻结 + status?: number; + // 用户ID + userId?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 商品日志表搜索条件 + */ +export interface GoodsLogParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsRelation/index.ts b/api/shop/goodsRelation/index.ts new file mode 100644 index 0000000..40f2f0c --- /dev/null +++ b/api/shop/goodsRelation/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsRelation, GoodsRelationParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品点赞和收藏表 + */ +export async function pageGoodsRelation(params: GoodsRelationParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-relation/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品点赞和收藏表列表 + */ +export async function listGoodsRelation(params?: GoodsRelationParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-relation', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品点赞和收藏表 + */ +export async function addGoodsRelation(data: GoodsRelation) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-relation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品点赞和收藏表 + */ +export async function updateGoodsRelation(data: GoodsRelation) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-relation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品点赞和收藏表 + */ +export async function removeGoodsRelation(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-relation/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品点赞和收藏表 + */ +export async function removeBatchGoodsRelation(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-relation/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品点赞和收藏表 + */ +export async function getGoodsRelation(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-relation/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsRelation/model/index.ts b/api/shop/goodsRelation/model/index.ts new file mode 100644 index 0000000..5e76007 --- /dev/null +++ b/api/shop/goodsRelation/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 商品点赞和收藏表 + */ +export interface GoodsRelation { + // id + id?: number; + // 用户ID + userId?: number; + // 商品ID + goodsId?: number; + // 类型(收藏(collect)、点赞(like)) + type?: string; + // 某种类型的商品(普通商品、秒杀商品) + category?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 更新时间 + updateTime?: string; +} + +/** + * 商品点赞和收藏表搜索条件 + */ +export interface GoodsRelationParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsRule/index.ts b/api/shop/goodsRule/index.ts new file mode 100644 index 0000000..45cb93a --- /dev/null +++ b/api/shop/goodsRule/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsRule, GoodsRuleParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品规则值(规格)表 + */ +export async function pageGoodsRule(params: GoodsRuleParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-rule/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品规则值(规格)表列表 + */ +export async function listGoodsRule(params?: GoodsRuleParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-rule', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品规则值(规格)表 + */ +export async function addGoodsRule(data: GoodsRule) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-rule', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品规则值(规格)表 + */ +export async function updateGoodsRule(data: GoodsRule) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-rule', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品规则值(规格)表 + */ +export async function removeGoodsRule(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-rule/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品规则值(规格)表 + */ +export async function removeBatchGoodsRule(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-rule/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品规则值(规格)表 + */ +export async function getGoodsRule(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-rule/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsRule/model/index.ts b/api/shop/goodsRule/model/index.ts new file mode 100644 index 0000000..6537e30 --- /dev/null +++ b/api/shop/goodsRule/model/index.ts @@ -0,0 +1,23 @@ +import type { PageParam } from '@/api'; + +/** + * 商品规则值(规格)表 + */ +export interface GoodsRule { + // + id?: number; + // 规格名称 + ruleName?: string; + // 规格值 + ruleValue?: string; + // 租户id + tenantId?: number; +} + +/** + * 商品规则值(规格)表搜索条件 + */ +export interface GoodsRuleParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/goodsSku/index.ts b/api/shop/goodsSku/index.ts new file mode 100644 index 0000000..dfb2dd1 --- /dev/null +++ b/api/shop/goodsSku/index.ts @@ -0,0 +1,118 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsSku, GoodsSkuParam } from './model'; +import { MODULES_API_URL } from '@/config'; +import { GoodsSpec } from '@/api/shop/goodsSpec/model'; + +export async function generateGoodsSku(data: GoodsSpec) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-sku/generateGoodsSku', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询商品sku列表 + */ +export async function pageGoodsSku(params: GoodsSkuParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-sku/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品sku列表列表 + */ +export async function listGoodsSku(params?: GoodsSkuParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-sku', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品sku列表 + */ +export async function addGoodsSku(data: GoodsSku) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-sku', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品sku列表 + */ +export async function updateGoodsSku(data: GoodsSku) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-sku', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品sku列表 + */ +export async function removeGoodsSku(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-sku/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品sku列表 + */ +export async function removeBatchGoodsSku(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-sku/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品sku列表 + */ +export async function getGoodsSku(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-sku/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsSku/model/index.ts b/api/shop/goodsSku/model/index.ts new file mode 100644 index 0000000..3d2ab7b --- /dev/null +++ b/api/shop/goodsSku/model/index.ts @@ -0,0 +1,50 @@ +import type { PageParam } from '@/api'; + +/** + * 商品sku列表 + */ +export interface GoodsSku { + // 主键ID + id?: number; + // 商品ID + goodsId?: number; + // 规格组ID + specId?: number; + // 商品图片 + image?: string; + // 商品价格 + price?: number; + // 市场价格 + salePrice?: number; + // 成本价 + cost?: string; + // 库存 + stock?: number; + // sku编码 + skuNo?: string; + // 唯一值 + unique?: string; + // 重量 + weight?: string; + // 体积 + volume?: string; + // 状态, 0正常, 1异常 + status?: number; + // 备注 + comments?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + images?: any; + sku?: string; +} + +/** + * 商品sku列表搜索条件 + */ +export interface GoodsSkuParam extends PageParam { + id?: number; + goodsId?: number; + keywords?: string; +} diff --git a/api/shop/goodsSpec/index.ts b/api/shop/goodsSpec/index.ts new file mode 100644 index 0000000..9934cb3 --- /dev/null +++ b/api/shop/goodsSpec/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsSpec, GoodsSpecParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品多规格 + */ +export async function pageGoodsSpec(params: GoodsSpecParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-spec/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品多规格列表 + */ +export async function listGoodsSpec(params?: GoodsSpecParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-spec', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品多规格 + */ +export async function addGoodsSpec(data: GoodsSpec) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-spec', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品多规格 + */ +export async function updateGoodsSpec(data: GoodsSpec) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-spec', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品多规格 + */ +export async function removeGoodsSpec(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-spec/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品多规格 + */ +export async function removeBatchGoodsSpec(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-spec/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品多规格 + */ +export async function getGoodsSpec(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-spec/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsSpec/model/index.ts b/api/shop/goodsSpec/model/index.ts new file mode 100644 index 0000000..0d4cfd5 --- /dev/null +++ b/api/shop/goodsSpec/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 商品多规格 + */ +export interface GoodsSpec { + // 主键 + id?: number; + // 商品ID + goodsId?: number; + // 规格ID + specId?: number; + // 规格名称 + specName?: string; + // 规格值 + valueList?: any[]; + specValue?: string; + // 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 + type?: string; + // 租户id + tenantId?: number; +} + +/** + * 商品多规格搜索条件 + */ +export interface GoodsSpecParam extends PageParam { + id?: number; + goodsId: number; + keywords?: string; +} diff --git a/api/shop/goodsSpecRel/index.ts b/api/shop/goodsSpecRel/index.ts new file mode 100644 index 0000000..68ea8b0 --- /dev/null +++ b/api/shop/goodsSpecRel/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { GoodsSpecRel, GoodsSpecRelParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商品规格值 + */ +export async function pageGoodsSpecRel(params: GoodsSpecRelParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/goods-spec-rel/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商品规格值列表 + */ +export async function listGoodsSpecRel(params?: GoodsSpecRelParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-spec-rel', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商品规格值 + */ +export async function addGoodsSpecRel(data: GoodsSpecRel) { + const res = await request.post>( + MODULES_API_URL + '/shop/goods-spec-rel', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商品规格值 + */ +export async function updateGoodsSpecRel(data: GoodsSpecRel) { + const res = await request.put>( + MODULES_API_URL + '/shop/goods-spec-rel', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商品规格值 + */ +export async function removeGoodsSpecRel(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-spec-rel/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商品规格值 + */ +export async function removeBatchGoodsSpecRel(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/goods-spec-rel/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商品规格值 + */ +export async function getGoodsSpecRel(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/goods-spec-rel/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/goodsSpecRel/model/index.ts b/api/shop/goodsSpecRel/model/index.ts new file mode 100644 index 0000000..fb8b1bc --- /dev/null +++ b/api/shop/goodsSpecRel/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 商品规格值 + */ +export interface GoodsSpecRel { + // 主键 + id?: number; + // 规格ID + specId?: number; + // 规格值ID + specValueId?: number; + // 规格值 + specValue?: string; + // 租户id + tenantId?: number; +} + +/** + * 商品规格值搜索条件 + */ +export interface GoodsSpecRelParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/order/index.ts b/api/shop/order/index.ts new file mode 100644 index 0000000..96594ab --- /dev/null +++ b/api/shop/order/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Order, OrderParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询 + */ +export async function pageOrder(params: OrderParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/order/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询列表 + */ +export async function listOrder(params?: OrderParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/order', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加 + */ +export async function addOrder(data: Order) { + const res = await request.post>( + MODULES_API_URL + '/shop/order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改 + */ +export async function updateOrder(data: Order) { + const res = await request.put>( + MODULES_API_URL + '/shop/order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除 + */ +export async function removeOrder(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/order/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除 + */ +export async function removeBatchOrder(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/order/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询 + */ +export async function getOrder(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/order/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/order/model/index.ts b/api/shop/order/model/index.ts new file mode 100644 index 0000000..f6dbead --- /dev/null +++ b/api/shop/order/model/index.ts @@ -0,0 +1,108 @@ +import type { PageParam } from '@/api'; + +/** + * + */ +export interface Order { + // + orderId?: number; + // 订单类型,0商城订单 1预定订单 2会员卡 + type?: number; + // 订单号 + orderNo?: string; + // 下单渠道,0小程序预定 1俱乐部训练场 3活动订场 + channel?: number; + // 微信支付订单号 + transactionId?: string; + // 微信退款订单号 + refundOrder?: string; + // 场馆id用于权限判断 + merchantId?: number; + // 商户名称 + merchantName?: string; + // 商户编号 + merchantCode?: string; + couponId?: number; + // 用户id + uid?: number; + // 使用的优惠券id + cid?: number; + // 使用的会员卡id + vid?: number; + // 关联管理员id + aid?: number; + // 核销管理员id + adminId?: number; + // IC卡号 + code?: string; + // 真实姓名 + name?: string; + // 手机号码 + phone?: string; + // 订单总额 + totalPrice?: string; + // 减少的金额,使用VIP会员折扣、优惠券抵扣、优惠券折扣后减去的价格 + reducePrice?: string; + // 实际付款 + payPrice?: string; + // 用于统计 + price?: number; + // 价钱,用于积分赠送 + money?: string; + // 退款金额 + refundMoney?: string; + // 教练价格 + coachPrice?: string; + // 教练id + coachId?: number; + // 1微信支付,2积分,3支付宝,4现金,5POS机,6VIP月卡,7VIP年卡,8VIP次卡,9IC月卡,10IC年卡,11IC次卡,12免费,13VIP充值卡,14IC充值卡,15积分支付,16VIP季卡,17IC季卡 + payType?: string; + // 1已付款,2未付款 + payStatus?: string; + // 1已完成,2未使用,3已取消,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款 + orderStatus?: string; + // 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡 + couponType?: string; + // 二维码地址,保存订单号,支付成功后才生成 + qrcode?: string; + // 优惠说明 + couponDesc?: string; + // vip月卡年卡、ic月卡年卡回退次数 + returnNum?: number; + // vip充值回退金额 + returnMoney?: string; + // 预约详情开始时间数组 + startTime?: string; + // 是否已开具发票:1已开发票,2未开发票,3不能开具发票 + isInvoice?: string; + // 下单时间 + createTime?: number; + // + updateTime?: number; + // 付款时间 + payTime?: number; + // 退款时间 + refundTime?: number; + // 申请退款时间 + refundApplyTime?: number; + // 过期时间 + expirationTime?: string; + // 对账情况:1=已对账;2=未对账;3=已对账,金额对不上;4=未查询到该订单 + checkBill?: number; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; +} + +/** + * 搜索条件 + */ +export interface OrderParam extends PageParam { + orderId?: number; + keywords?: string; +} diff --git a/api/shop/rechargeOrder/index.ts b/api/shop/rechargeOrder/index.ts new file mode 100644 index 0000000..7811179 --- /dev/null +++ b/api/shop/rechargeOrder/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { RechargeOrder, RechargeOrderParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询会员充值订单表 + */ +export async function pageRechargeOrder(params: RechargeOrderParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/recharge-order/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询会员充值订单表列表 + */ +export async function listRechargeOrder(params?: RechargeOrderParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/recharge-order', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加会员充值订单表 + */ +export async function addRechargeOrder(data: RechargeOrder) { + const res = await request.post>( + MODULES_API_URL + '/shop/recharge-order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改会员充值订单表 + */ +export async function updateRechargeOrder(data: RechargeOrder) { + const res = await request.put>( + MODULES_API_URL + '/shop/recharge-order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除会员充值订单表 + */ +export async function removeRechargeOrder(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/recharge-order/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除会员充值订单表 + */ +export async function removeBatchRechargeOrder(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/recharge-order/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询会员充值订单表 + */ +export async function getRechargeOrder(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/recharge-order/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/rechargeOrder/model/index.ts b/api/shop/rechargeOrder/model/index.ts new file mode 100644 index 0000000..4f0799d --- /dev/null +++ b/api/shop/rechargeOrder/model/index.ts @@ -0,0 +1,63 @@ +import type { PageParam } from '@/api'; + +/** + * 会员充值订单表 + */ +export interface RechargeOrder { + // 订单ID + orderId?: number; + // 订单号 + orderNo?: string; + // 用户ID + userId?: number; + // 充值方式(10自定义金额 20套餐充值) + rechargeType?: number; + // 机构id + organizationId?: number; + // 充值套餐ID + planId?: number; + // 用户支付金额 + payPrice?: string; + // 赠送金额 + giftMoney?: string; + // 实际到账金额 + actualMoney?: string; + // 用户可用余额 + balance?: string; + // 支付方式(微信/支付宝) + payMethod?: string; + // 支付状态(10待支付 20已支付) + payStatus?: number; + // 付款时间 + payTime?: number; + // 第三方交易记录ID + tradeId?: number; + // 来源客户端 (APP、H5、小程序等) + platform?: string; + // 所属门店ID + shopId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0正常, 1冻结 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 商户编码 + merchantCode?: string; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 会员充值订单表搜索条件 + */ +export interface RechargeOrderParam extends PageParam { + orderId?: number; + keywords?: string; +} diff --git a/api/shop/shopCart/index.ts b/api/shop/shopCart/index.ts new file mode 100644 index 0000000..fdfe17b --- /dev/null +++ b/api/shop/shopCart/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type {ApiResult, PageResult} from '@/api'; +import type {ShopCart, ShopCartParam} from './model'; +import {SERVER_API_URL} from "~/config"; + +/** + * 分页查询购物车 + */ +export async function pageShopCart(params: ShopCartParam) { + const res = await request.get>>( + SERVER_API_URL + '/shop/shop-cart/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询购物车列表 + */ +export async function listShopCart(params?: ShopCartParam) { + const res = await request.get>( + SERVER_API_URL + '/shop/shop-cart', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加购物车 + */ +export async function addShopCart(data: ShopCart) { + const res = await request.post>( + SERVER_API_URL + '/shop/shop-cart', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改购物车 + */ +export async function updateShopCart(data: ShopCart) { + const res = await request.put>( + SERVER_API_URL + '/shop/shop-cart', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除购物车 + */ +export async function removeShopCart(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/shop/shop-cart/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除购物车 + */ +export async function removeBatchShopCart(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/shop/shop-cart/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询购物车 + */ +export async function getShopCart(id: number) { + const res = await request.get>( + SERVER_API_URL + '/shop/shop-cart/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopCart/model/index.ts b/api/shop/shopCart/model/index.ts new file mode 100644 index 0000000..9fe7ff1 --- /dev/null +++ b/api/shop/shopCart/model/index.ts @@ -0,0 +1,72 @@ +import type { PageParam } from '@/api'; +import type {ShopOrderInfo} from "~/api/shop/shopOrderInfo/model"; +import type {Company} from "~/api/system/company/model"; + +/** + * 购物车 + */ +export interface ShopCart { + // 购物车表ID + id?: string; + // 类型 0商城 1外卖 + type?: number; + // 唯一标识 + code?: string; + // 商品ID + productId?: string; + // 商品规格 + spec?: string; + // 商品价格 + price?: string; + // 商品数量 + cartNum?: number; + // 单商品合计 + totalPrice?: string; + // 0 = 未购买 1 = 已购买 + isPay?: string; + // 是否为立即购买 + isNew?: string; + // 拼团id + combinationId?: number; + // 秒杀产品ID + seckillId?: number; + // 砍价id + bargainId?: number; + // 是否选中 + selected?: string; + // 商户ID + merchantId?: string; + // 用户ID + userId?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; + // 商品封面图 + image?: string; +} + +/** + * 购物车搜索条件 + */ +export interface ShopCartParam extends PageParam { + id?: number; + keywords?: string; +} + +export interface MyCart { + appName?: string, + domain?: string, + adminUrl?: string; + menuId?: number; + num?: number, + type?: number; + payType?: number, + payPrice?: number, + month?: number, + comments?: string, + list?: Company[], + totalPrice?: number +} diff --git a/api/shop/shopMerchant/index.ts b/api/shop/shopMerchant/index.ts new file mode 100644 index 0000000..2b41057 --- /dev/null +++ b/api/shop/shopMerchant/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ShopMerchant, ShopMerchantParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商户 + */ +export async function pageShopMerchant(params: ShopMerchantParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/shop-merchant/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商户列表 + */ +export async function listShopMerchant(params?: ShopMerchantParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商户 + */ +export async function addShopMerchant(data: ShopMerchant) { + const res = await request.post>( + MODULES_API_URL + '/shop/shop-merchant', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商户 + */ +export async function updateShopMerchant(data: ShopMerchant) { + const res = await request.put>( + MODULES_API_URL + '/shop/shop-merchant', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商户 + */ +export async function removeShopMerchant(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商户 + */ +export async function removeBatchShopMerchant(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商户 + */ +export async function getShopMerchant(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopMerchant/model/index.ts b/api/shop/shopMerchant/model/index.ts new file mode 100644 index 0000000..7ed3206 --- /dev/null +++ b/api/shop/shopMerchant/model/index.ts @@ -0,0 +1,89 @@ +import type { PageParam } from '@/api'; + +/** + * 商户 + */ +export interface ShopMerchant { + // ID + merchantId?: number; + // 商户名称 + merchantName?: string; + // 商户编号 + merchantCode?: string; + // 商户类型 + type?: number; + // 商户图标 + image?: string; + // 商户手机号 + phone?: string; + // 商户姓名 + realName?: string; + // 店铺类型 + shopType?: string; + // 项目分类 + itemType?: string; + // 商户分类 + category?: string; + // 行业父级分类 + parentId?: string; + // 商户经营分类 + merchantCategoryId?: number; + // 商户分类 + merchantCategoryTitle?: string; + // 经纬度 + lngAndLat?: string; + // + lng?: string; + // + lat?: string; + // 所在省份 + province?: string; + // 所在城市 + city?: string; + // 所在辖区 + region?: string; + // 详细地址 + address?: string; + // 手续费 + commission?: string; + // 关键字 + keywords?: string; + // 资质图片 + files?: string; + // 营业时间 + businessTime?: string; + // 文章内容 + content?: string; + // 每小时价格 + price?: string; + // 是否自营 + ownStore?: number; + // 是否推荐 + recommend?: number; + // 是否需要审核 + goodsReview?: number; + // 管理入口 + adminUrl?: string; + // 备注 + comments?: string; + // 所有人 + userId?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 商户搜索条件 + */ +export interface ShopMerchantParam extends PageParam { + merchantId?: number; + keywords?: string; +} diff --git a/api/shop/shopMerchantAccount/index.ts b/api/shop/shopMerchantAccount/index.ts new file mode 100644 index 0000000..a8414e3 --- /dev/null +++ b/api/shop/shopMerchantAccount/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ShopMerchantAccount, ShopMerchantAccountParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商户账号 + */ +export async function pageShopMerchantAccount(params: ShopMerchantAccountParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/shop-merchant-account/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商户账号列表 + */ +export async function listShopMerchantAccount(params?: ShopMerchantAccountParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-account', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商户账号 + */ +export async function addShopMerchantAccount(data: ShopMerchantAccount) { + const res = await request.post>( + MODULES_API_URL + '/shop/shop-merchant-account', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商户账号 + */ +export async function updateShopMerchantAccount(data: ShopMerchantAccount) { + const res = await request.put>( + MODULES_API_URL + '/shop/shop-merchant-account', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商户账号 + */ +export async function removeShopMerchantAccount(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-account/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商户账号 + */ +export async function removeBatchShopMerchantAccount(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-account/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商户账号 + */ +export async function getShopMerchantAccount(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-account/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopMerchantAccount/model/index.ts b/api/shop/shopMerchantAccount/model/index.ts new file mode 100644 index 0000000..6dbada0 --- /dev/null +++ b/api/shop/shopMerchantAccount/model/index.ts @@ -0,0 +1,39 @@ +import type { PageParam } from '@/api'; + +/** + * 商户账号 + */ +export interface ShopMerchantAccount { + // ID + id?: number; + // 商户手机号 + phone?: string; + // 真实姓名 + realName?: string; + // 商户ID + merchantId?: number; + // 角色ID + roleId?: number; + // 角色名称 + roleName?: string; + // 用户ID + userId?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 商户账号搜索条件 + */ +export interface ShopMerchantAccountParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/shopMerchantApply/index.ts b/api/shop/shopMerchantApply/index.ts new file mode 100644 index 0000000..9001fdc --- /dev/null +++ b/api/shop/shopMerchantApply/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ShopMerchantApply, ShopMerchantApplyParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商户入驻申请 + */ +export async function pageShopMerchantApply(params: ShopMerchantApplyParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/shop-merchant-apply/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商户入驻申请列表 + */ +export async function listShopMerchantApply(params?: ShopMerchantApplyParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-apply', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商户入驻申请 + */ +export async function addShopMerchantApply(data: ShopMerchantApply) { + const res = await request.post>( + MODULES_API_URL + '/shop/shop-merchant-apply', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商户入驻申请 + */ +export async function updateShopMerchantApply(data: ShopMerchantApply) { + const res = await request.put>( + MODULES_API_URL + '/shop/shop-merchant-apply', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商户入驻申请 + */ +export async function removeShopMerchantApply(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-apply/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商户入驻申请 + */ +export async function removeBatchShopMerchantApply(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-apply/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商户入驻申请 + */ +export async function getShopMerchantApply(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-apply/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopMerchantApply/model/index.ts b/api/shop/shopMerchantApply/model/index.ts new file mode 100644 index 0000000..bf78950 --- /dev/null +++ b/api/shop/shopMerchantApply/model/index.ts @@ -0,0 +1,74 @@ +import type { PageParam } from '@/api'; + +/** + * 商户入驻申请 + */ +export interface ShopMerchantApply { + // ID + applyId?: number; + // 认证类型 + type?: number; + // 商户名称 + merchantName?: string; + // 社会信用代码 + merchantCode?: string; + // 商户图标 + image?: string; + // 商户手机号 + phone?: string; + // 商户姓名 + realName?: string; + // 身份证号码 + idCard?: string; + sfz1?: string; + sfz2?: string; + yyzz?: string; + // 店铺类型 + shopType?: string; + // 行业父级分类 + parentId?: number; + // 所属分类 + categoryId?: number; + // 商户分类 + category?: string; + // 手续费 + commission?: string; + // 关键字 + keywords?: string; + // 资质图片 + files?: string; + // 所有人 + userId?: number; + // 是否自营 + ownStore?: number; + // 是否推荐 + recommend?: number; + // 是否需要审核 + goodsReview?: number; + // 审核完成时间 + completedTime?: string + // 工作负责人 + name2?: string; + // 驳回原因 + reason?: string; + // 审核状态 + checkStatus?: boolean; + // 备注 + comments?: string; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 商户入驻申请搜索条件 + */ +export interface ShopMerchantApplyParam extends PageParam { + applyId?: number; + keywords?: string; +} diff --git a/api/shop/shopMerchantCount/index.ts b/api/shop/shopMerchantCount/index.ts new file mode 100644 index 0000000..9552f46 --- /dev/null +++ b/api/shop/shopMerchantCount/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ShopMerchantCount, ShopMerchantCountParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询门店销售统计表 + */ +export async function pageShopMerchantCount(params: ShopMerchantCountParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/shop-merchant-count/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询门店销售统计表列表 + */ +export async function listShopMerchantCount(params?: ShopMerchantCountParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-count', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加门店销售统计表 + */ +export async function addShopMerchantCount(data: ShopMerchantCount) { + const res = await request.post>( + MODULES_API_URL + '/shop/shop-merchant-count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改门店销售统计表 + */ +export async function updateShopMerchantCount(data: ShopMerchantCount) { + const res = await request.put>( + MODULES_API_URL + '/shop/shop-merchant-count', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除门店销售统计表 + */ +export async function removeShopMerchantCount(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-count/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除门店销售统计表 + */ +export async function removeBatchShopMerchantCount(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-count/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询门店销售统计表 + */ +export async function getShopMerchantCount(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-count/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopMerchantCount/model/index.ts b/api/shop/shopMerchantCount/model/index.ts new file mode 100644 index 0000000..ea27a60 --- /dev/null +++ b/api/shop/shopMerchantCount/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 门店销售统计表 + */ +export interface ShopMerchantCount { + // ID + id?: number; + // 店铺名称 + name?: string; + // 店铺说明 + comments?: string; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 门店销售统计表搜索条件 + */ +export interface ShopMerchantCountParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/shopMerchantType/index.ts b/api/shop/shopMerchantType/index.ts new file mode 100644 index 0000000..8833436 --- /dev/null +++ b/api/shop/shopMerchantType/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ShopMerchantType, ShopMerchantTypeParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询商户类型 + */ +export async function pageShopMerchantType(params: ShopMerchantTypeParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/shop-merchant-type/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询商户类型列表 + */ +export async function listShopMerchantType(params?: ShopMerchantTypeParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-type', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加商户类型 + */ +export async function addShopMerchantType(data: ShopMerchantType) { + const res = await request.post>( + MODULES_API_URL + '/shop/shop-merchant-type', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改商户类型 + */ +export async function updateShopMerchantType(data: ShopMerchantType) { + const res = await request.put>( + MODULES_API_URL + '/shop/shop-merchant-type', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除商户类型 + */ +export async function removeShopMerchantType(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-type/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除商户类型 + */ +export async function removeBatchShopMerchantType(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-merchant-type/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询商户类型 + */ +export async function getShopMerchantType(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/shop-merchant-type/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopMerchantType/model/index.ts b/api/shop/shopMerchantType/model/index.ts new file mode 100644 index 0000000..c051169 --- /dev/null +++ b/api/shop/shopMerchantType/model/index.ts @@ -0,0 +1,29 @@ +import type { PageParam } from '@/api'; + +/** + * 商户类型 + */ +export interface ShopMerchantType { + // ID + id?: number; + // 店铺类型 + name?: string; + // 店铺入驻条件 + comments?: string; + // 状态 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 商户类型搜索条件 + */ +export interface ShopMerchantTypeParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/shopOrderInfo/index.ts b/api/shop/shopOrderInfo/index.ts new file mode 100644 index 0000000..113318f --- /dev/null +++ b/api/shop/shopOrderInfo/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type {ApiResult, PageResult} from '@/api'; +import type {ShopOrderInfo, ShopOrderInfoParam} from './model'; +import {SERVER_API_URL} from '@/config'; + +/** + * 分页查询 + */ +export async function pageShopOrderInfo(params: ShopOrderInfoParam) { + const res = await request.get>>( + SERVER_API_URL + '/shop/order-info/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询列表 + */ +export async function listShopOrderInfo(params?: ShopOrderInfoParam) { + const res = await request.get>( + SERVER_API_URL + '/shop/order-info', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加 + */ +export async function addShopOrderInfo(data: ShopOrderInfo) { + const res = await request.post>( + SERVER_API_URL + '/shop/order-info', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改 + */ +export async function updateShopOrderInfo(data: ShopOrderInfo) { + const res = await request.put>( + SERVER_API_URL + '/shop/order-info', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除 + */ +export async function removeShopOrderInfo(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/shop/order-info/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除 + */ +export async function removeBatchShopOrderInfo(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/shop/order-info/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询 + */ +export async function getShopOrderInfo(id: number) { + const res = await request.get>( + SERVER_API_URL + '/shop/order-info/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/shopOrderInfo/model/index.ts b/api/shop/shopOrderInfo/model/index.ts new file mode 100644 index 0000000..61573e7 --- /dev/null +++ b/api/shop/shopOrderInfo/model/index.ts @@ -0,0 +1,62 @@ +import type { PageParam } from '@/api'; + +/** + * + */ +export interface ShopOrderInfo { + // + id?: number; + // 关联订单表id + oid?: number; + // 关联场馆id + sid?: number; + // 关联场地id + fid?: number; + // 场馆 + siteName?: string; + // 场地 + fieldName?: string; + // 预约时间段 + dateTime?: string; + // 单价 + price?: number; + // 儿童价 + childrenPrice?: string; + // 成人人数 + adultNum?: string; + // 儿童人数 + childrenNum?: string; + // 1已付款,2未付款,3无需付款或占用状态 + payStatus?: string; + // 是否免费:1免费、2收费 + isFree?: string; + // 是否支持儿童票:1支持,2不支持 + isChildren?: string; + // 预订类型:1全场,2半场 + type?: string; + // 组合数据:日期+时间段+场馆id+场地id + mergeData?: string; + // 开场时间 + startTime?: number; + // 下单时间 + orderTime?: number; + // 毫秒时间戳 + timeFlag?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 商品ID + goodsId?: number; + // 商品名称 + goodsName?: string; +} + +/** + * 搜索条件 + */ +export interface ShopOrderInfoParam extends PageParam { + id?: number; + oid?: number; + keywords?: string; +} diff --git a/api/shop/spec/index.ts b/api/shop/spec/index.ts new file mode 100644 index 0000000..d866b0e --- /dev/null +++ b/api/shop/spec/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Spec, SpecParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询规格 + */ +export async function pageSpec(params: SpecParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/spec/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询规格列表 + */ +export async function listSpec(params?: SpecParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/spec', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加规格 + */ +export async function addSpec(data: Spec) { + const res = await request.post>( + MODULES_API_URL + '/shop/spec', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改规格 + */ +export async function updateSpec(data: Spec) { + const res = await request.put>( + MODULES_API_URL + '/shop/spec', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除规格 + */ +export async function removeSpec(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/spec/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除规格 + */ +export async function removeBatchSpec(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/spec/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询规格 + */ +export async function getSpec(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/spec/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/spec/model/index.ts b/api/shop/spec/model/index.ts new file mode 100644 index 0000000..800c169 --- /dev/null +++ b/api/shop/spec/model/index.ts @@ -0,0 +1,35 @@ +import type { PageParam } from '@/api'; + +/** + * 规格 + */ +export interface Spec { + // 规格ID + specId?: number; + // 规格名称 + specName?: string; + // 规格值 + specValue?: string; + // 创建用户 + userId?: number; + // 更新者 + updater?: number; + // 备注 + comments?: string; + // 状态, 0正常, 1待修,2异常已修,3异常未修 + status?: number; + // 排序号 + sortNumber?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 规格搜索条件 + */ +export interface SpecParam extends PageParam { + specId?: number; + keywords?: string; +} diff --git a/api/shop/specValue/index.ts b/api/shop/specValue/index.ts new file mode 100644 index 0000000..8534d11 --- /dev/null +++ b/api/shop/specValue/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { SpecValue, SpecValueParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询规格值 + */ +export async function pageSpecValue(params: SpecValueParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/spec-value/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询规格值列表 + */ +export async function listSpecValue(params?: SpecValueParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/spec-value', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加规格值 + */ +export async function addSpecValue(data: SpecValue) { + const res = await request.post>( + MODULES_API_URL + '/shop/spec-value', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改规格值 + */ +export async function updateSpecValue(data: SpecValue) { + const res = await request.put>( + MODULES_API_URL + '/shop/spec-value', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除规格值 + */ +export async function removeSpecValue(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/spec-value/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除规格值 + */ +export async function removeBatchSpecValue(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/spec-value/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询规格值 + */ +export async function getSpecValue(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/spec-value/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/specValue/model/index.ts b/api/shop/specValue/model/index.ts new file mode 100644 index 0000000..eb1e717 --- /dev/null +++ b/api/shop/specValue/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 规格值 + */ +export interface SpecValue { + // 规格值ID + specValueId?: number; + // 规格值 + specValue?: string; + // 规格组ID + specId?: number; + // 描述 + comments?: string; + // 排序 + sortNumber?: number; + // 租户id + tenantId?: number; + key?: string; + label?: string; + value?: string; + detail?: [string]; + specName?: string; +} + +/** + * 规格值搜索条件 + */ +export interface SpecValueParam extends PageParam { + specValueId?: number; + specId?: number; + keywords?: string; +} diff --git a/api/shop/userAddress/index.ts b/api/shop/userAddress/index.ts new file mode 100644 index 0000000..8896f0f --- /dev/null +++ b/api/shop/userAddress/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { UserAddress, UserAddressParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询收货地址 + */ +export async function pageUserAddress(params: UserAddressParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/user-address/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询收货地址列表 + */ +export async function listUserAddress(params?: UserAddressParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/user-address', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加收货地址 + */ +export async function addUserAddress(data: UserAddress) { + const res = await request.post>( + MODULES_API_URL + '/shop/user-address', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改收货地址 + */ +export async function updateUserAddress(data: UserAddress) { + const res = await request.put>( + MODULES_API_URL + '/shop/user-address', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除收货地址 + */ +export async function removeUserAddress(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/user-address/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除收货地址 + */ +export async function removeBatchUserAddress(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/user-address/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询收货地址 + */ +export async function getUserAddress(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/user-address/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/userAddress/model/index.ts b/api/shop/userAddress/model/index.ts new file mode 100644 index 0000000..6fe9239 --- /dev/null +++ b/api/shop/userAddress/model/index.ts @@ -0,0 +1,43 @@ +import type { PageParam } from '@/api'; + +/** + * 收货地址 + */ +export interface UserAddress { + // 主键ID + id?: number; + // 姓名 + name?: string; + // 手机号码 + phone?: string; + // 所在国家 + country?: string; + // 所在省份 + province?: string; + // 所在城市 + city?: string; + // 所在辖区 + region?: string; + // 收货地址 + address?: string; + // 1先生 2女士 + gender?: number; + // 家、公司、学校 + type?: string; + // 默认收货地址 + default?: string; + // 用户ID + userId?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 收货地址搜索条件 + */ +export interface UserAddressParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/users/index.ts b/api/shop/users/index.ts new file mode 100644 index 0000000..5e8b847 --- /dev/null +++ b/api/shop/users/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Users, UsersParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询 + */ +export async function pageUsers(params: UsersParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/users/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询列表 + */ +export async function listUsers(params?: UsersParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/users', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加 + */ +export async function addUsers(data: Users) { + const res = await request.post>( + MODULES_API_URL + '/shop/users', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改 + */ +export async function updateUsers(data: Users) { + const res = await request.put>( + MODULES_API_URL + '/shop/users', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除 + */ +export async function removeUsers(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/users/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除 + */ +export async function removeBatchUsers(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/users/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询 + */ +export async function getUsers(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/users/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/users/model/index.ts b/api/shop/users/model/index.ts new file mode 100644 index 0000000..9249390 --- /dev/null +++ b/api/shop/users/model/index.ts @@ -0,0 +1,49 @@ +import type { PageParam } from '@/api'; + +/** + * + */ +export interface Users { + // + id?: number; + // 用户唯一小程序id + openId?: string; + // 小程序用户秘钥 + sessionKey?: string; + // 用户名 + username?: string; + // 头像地址 + avatarUrl?: string; + // 1男,2女 + gender?: string; + // 国家 + country?: string; + // 省份 + province?: string; + // 城市 + city?: string; + // 手机号码 + phone?: string; + // 积分 + integral?: string; + // 余额 + money?: string; + // 注册时间 + createTime?: number; + // + idcard?: string; + // + truename?: string; + // 是否管理员:1是;2否 + isAdmin?: number; + // 租户id + tenantId?: number; +} + +/** + * 搜索条件 + */ +export interface UsersParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/shop/wechatDeposit/index.ts b/api/shop/wechatDeposit/index.ts new file mode 100644 index 0000000..0a8efc1 --- /dev/null +++ b/api/shop/wechatDeposit/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { WechatDeposit, WechatDepositParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询押金 + */ +export async function pageWechatDeposit(params: WechatDepositParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/wechat-deposit/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询押金列表 + */ +export async function listWechatDeposit(params?: WechatDepositParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/wechat-deposit', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加押金 + */ +export async function addWechatDeposit(data: WechatDeposit) { + const res = await request.post>( + MODULES_API_URL + '/shop/wechat-deposit', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改押金 + */ +export async function updateWechatDeposit(data: WechatDeposit) { + const res = await request.put>( + MODULES_API_URL + '/shop/wechat-deposit', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除押金 + */ +export async function removeWechatDeposit(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/wechat-deposit/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除押金 + */ +export async function removeBatchWechatDeposit(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/wechat-deposit/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询押金 + */ +export async function getWechatDeposit(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/wechat-deposit/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/shop/wechatDeposit/model/index.ts b/api/shop/wechatDeposit/model/index.ts new file mode 100644 index 0000000..acc1256 --- /dev/null +++ b/api/shop/wechatDeposit/model/index.ts @@ -0,0 +1,43 @@ +import type { PageParam } from '@/api'; + +/** + * 押金 + */ +export interface WechatDeposit { + // + id?: number; + // 订单id + oid?: number; + // 用户id + uid?: number; + // 场地订单号 + orderNum?: string; + // 付款订单号 + wechatOrder?: string; + // 退款订单号 + wechatReturn?: string; + // 场馆名称 + siteName?: string; + // 微信昵称 + username?: string; + // 手机号码 + phone?: string; + // 物品名称 + name?: string; + // 押金金额 + price?: number; + // 押金状态,1已付款,2未付款,已退押金 + status?: string; + // + createTime?: number; + // 租户id + tenantId?: number; +} + +/** + * 押金搜索条件 + */ +export interface WechatDepositParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/access-key/index.ts b/api/system/access-key/index.ts new file mode 100644 index 0000000..8c9d659 --- /dev/null +++ b/api/system/access-key/index.ts @@ -0,0 +1,59 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { AccessKey, AccessKeyParam } from './model'; +import { PageResult } from '@/api'; +import { SERVER_API_URL } from '@/config'; +/** + * 查询AccessKey列表 + */ +export async function pageAccessKey(params: AccessKeyParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/access-key/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加AccessKey + */ +export async function addAccessKey(data: AccessKey) { + const res = await request.post>( + SERVER_API_URL + '/system/access-key', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改AccessKey + */ +export async function updateAccessKey(data: AccessKey) { + const res = await request.put>( + SERVER_API_URL + '/system/access-key', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除AccessKey + */ +export async function removeAccessKey(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/access-key/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/access-key/model/index.ts b/api/system/access-key/model/index.ts new file mode 100644 index 0000000..376b577 --- /dev/null +++ b/api/system/access-key/model/index.ts @@ -0,0 +1,20 @@ +/** + * AccessKey + */ +export interface AccessKey { + id?: number; + phone?: string; + accessKey?: string; + accessSecret?: string; + createTime?: string; + tenantId?: number; + code?: number; +} + +/** + * AccessKey搜索条件 + */ +export interface AccessKeyParam { + id?: number; + accessKey?: string; +} diff --git a/api/system/appstore/index.ts b/api/system/appstore/index.ts new file mode 100644 index 0000000..4acad48 --- /dev/null +++ b/api/system/appstore/index.ts @@ -0,0 +1,11 @@ +// json数据 +export function appstoreType() { + return [ + { value: '0', label: '全部', text: '全部', comments: '' }, + { value: '1', label: '系统管理', text: '系统管理', comments: '' }, + { value: '2', label: '内容管理', text: '内容管理', comments: '' }, + { value: '3', label: '第三方应用', text: '第三方应用', comments: '' }, + { value: '4', label: '办公协同', text: '办公协同', comments: '' }, + { value: '5', label: '商城模块', text: '商城模块', comments: '' } + ]; +} diff --git a/api/system/appstore/model/index.ts b/api/system/appstore/model/index.ts new file mode 100644 index 0000000..c3c9c45 --- /dev/null +++ b/api/system/appstore/model/index.ts @@ -0,0 +1,13 @@ +/** + * 消息 + */ +export interface Appstore { + // 消息id + id?: number; + // 标题 + title?: string; + // 时间 + time?: string; + // 状态 + status?: number; +} diff --git a/api/system/cache/index.ts b/api/system/cache/index.ts new file mode 100644 index 0000000..708e8de --- /dev/null +++ b/api/system/cache/index.ts @@ -0,0 +1,76 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { Cache, CacheParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 查询缓存数据 + */ +export async function listCache(params?: CacheParam) { + const res = await request.get>( + SERVER_API_URL + '/system/cache', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取缓存数据 + * @param key + */ +export async function getCache(key: String) { + const res = await request.get>( + SERVER_API_URL + '/system/cache/' + key + ); + if (res.data.code === 0) { + return res.data.data; + } +} + +/** + * 更新缓存数据 + * @param cache + */ +export async function updateCache(cache: Cache) { + const res = await request.post>( + SERVER_API_URL + '/system/cache', + cache + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除缓存数据 + * @param key + */ +export async function removeCache(key?: String) { + const res = await request.delete>( + SERVER_API_URL + '/system/cache/' + key + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 更新缓存数据 + * @param cache + */ +export async function updateCacheTheme(cache: Cache) { + const res = await request.post>( + SERVER_API_URL + '/system/cache/theme', + cache + ); + if (res.data.code === 0) { + return res.data.message; + } +} diff --git a/api/system/cache/model/index.ts b/api/system/cache/model/index.ts new file mode 100644 index 0000000..dc28d00 --- /dev/null +++ b/api/system/cache/model/index.ts @@ -0,0 +1,18 @@ +import type { PageParam } from '@/api'; + +/** + * 缓存管理 + */ +export interface Cache { + key?: string; + content?: string; + uploadMethod?: any; + expireTime?: number; // 过期时间(秒) +} + +/** + * 搜索条件 + */ +export interface CacheParam extends PageParam { + key?: string; +} diff --git a/api/system/chat/index.ts b/api/system/chat/index.ts new file mode 100644 index 0000000..75d3e27 --- /dev/null +++ b/api/system/chat/index.ts @@ -0,0 +1,157 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { + ChatConversation, + ChatConversationParam, + ChatMessage, + ChatMessageParam +} from '@/api/system/chat/model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 查询聊天列表 + */ +export async function pageChatConversation(params: ChatConversationParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/chat-conversation/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询聊天列表 + */ +export async function pageChatMessage(params: ChatMessageParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/chat-message/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} +/** + * 查询日志列表 + */ +export async function listChatConversation(params?: ChatConversationParam) { + const res = await request.get>( + SERVER_API_URL + '/system/chat-conversation', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加日志 + */ +export async function addChatMessage(data: ChatMessage) { + const res = await request.post>( + SERVER_API_URL + '/system/chat-message', + data + ); + if (res.data.code === 0) { + return res.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加日志 + */ +export async function addChatConversation(data: ChatConversation) { + const res = await request.post>( + SERVER_API_URL + '/system/chat-conversation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改日志 + */ +export async function updateChatConversation(data: any) { + const res = await request.put>( + SERVER_API_URL + '/system/chat-conversation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 绑定日志 + */ +export async function bindChatConversation(data: ChatConversation) { + const res = await request.put>( + SERVER_API_URL + '/system/chat-conversation/bind', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量添加 + */ +export async function addBatchChatConversation(data: ChatConversation[]) { + const res = await request.post>( + SERVER_API_URL + '/system/chat-conversation/batch', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除日志 + */ +export async function removeChatConversation(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/chat-conversation/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除日志 + */ +export async function removeBatchChatConversation( + data: (number | undefined)[] +) { + const res = await request.delete>( + SERVER_API_URL + '/system/chat-conversation/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/chat/model/index.ts b/api/system/chat/model/index.ts new file mode 100644 index 0000000..5ead20e --- /dev/null +++ b/api/system/chat/model/index.ts @@ -0,0 +1,49 @@ +import type { PageParam } from '@/api'; +import type { User } from '@/api/system/user/model'; + +export interface ChatConversation { + id?: number; + userId?: number; + friendId?: number; + userInfo?: User; + friendInfo?: User; + content: string; + messages: ChatMessage[]; + unRead: number; + createTime?: string; + updateTime: string | number | Date; +} + +export interface ChatMessage { + id?: number; + formUserId?: number; + formUserInfo?: User; + toUserInfo?: User; + toUserId?: number; + type: string; + content: string; + status?: number; + createTime?: number; + updateTime?: number; +} + +/** + * 搜索条件 + */ +export interface ChatConversationParam extends PageParam { + userId?: number; + status: number; + onlyFake: boolean; + keywords: string; +} + +/** + * 搜索条件 + */ +export interface ChatMessageParam extends PageParam { + formUserId?: number; + toUserId?: number; + type?: string; + status?: number; + keywords: string; +} diff --git a/api/system/chatConversation/index.ts b/api/system/chatConversation/index.ts new file mode 100644 index 0000000..d848a24 --- /dev/null +++ b/api/system/chatConversation/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ChatConversation, ChatConversationParam } from './model'; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询聊天消息表 + */ +export async function pageChatConversation(params: ChatConversationParam) { + const res = await request.get>>( + MODULES_API_URL + '/shop/chat-conversation/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询聊天消息表列表 + */ +export async function listChatConversation(params?: ChatConversationParam) { + const res = await request.get>( + MODULES_API_URL + '/shop/chat-conversation', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加聊天消息表 + */ +export async function addChatConversation(data: ChatConversation) { + const res = await request.post>( + MODULES_API_URL + '/shop/chat-conversation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改聊天消息表 + */ +export async function updateChatConversation(data: ChatConversation) { + const res = await request.put>( + MODULES_API_URL + '/shop/chat-conversation', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除聊天消息表 + */ +export async function removeChatConversation(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/shop/chat-conversation/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除聊天消息表 + */ +export async function removeBatchChatConversation(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/chat-conversation/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询聊天消息表 + */ +export async function getChatConversation(id: number) { + const res = await request.get>( + MODULES_API_URL + '/shop/chat-conversation/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/chatConversation/model/index.ts b/api/system/chatConversation/model/index.ts new file mode 100644 index 0000000..110806d --- /dev/null +++ b/api/system/chatConversation/model/index.ts @@ -0,0 +1,37 @@ +import type { PageParam } from '@/api'; + +/** + * 聊天消息表 + */ +export interface ChatConversation { + // 自增ID + id?: number; + // 用户ID + userId?: number; + // 好友ID + friendId?: number; + // 消息类型 + type?: number; + // 消息内容 + content?: string; + // 未读消息 + unRead?: number; + // 状态, 0未读, 1已读 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 聊天消息表搜索条件 + */ +export interface ChatConversationParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/chatMessage/index.ts b/api/system/chatMessage/index.ts new file mode 100644 index 0000000..c2ae0b2 --- /dev/null +++ b/api/system/chatMessage/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ChatMessage, ChatMessageParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询聊天消息表 + */ +export async function pageChatMessage(params: ChatMessageParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/chat-message/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询聊天消息表列表 + */ +export async function listChatMessage(params?: ChatMessageParam) { + const res = await request.get>( + SERVER_API_URL + '/system/chat-message', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加聊天消息表 + */ +export async function addChatMessage(data: ChatMessage) { + const res = await request.post>( + SERVER_API_URL + '/system/chat-message', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加聊天消息表 + */ +export async function addBatchChatMessage(data: ChatMessage[]) { + const res = await request.post>( + SERVER_API_URL + '/system/chat-message/batch', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改聊天消息表 + */ +export async function updateChatMessage(data: ChatMessage) { + const res = await request.put>( + SERVER_API_URL + '/system/chat-message', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除聊天消息表 + */ +export async function removeChatMessage(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/chat-message/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除聊天消息表 + */ +export async function removeBatchChatMessage(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/chat-message/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询聊天消息表 + */ +export async function getChatMessage(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/chat-message/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/chatMessage/model/index.ts b/api/system/chatMessage/model/index.ts new file mode 100644 index 0000000..4352a3f --- /dev/null +++ b/api/system/chatMessage/model/index.ts @@ -0,0 +1,49 @@ +import type { PageParam } from '@/api'; + +/** + * 聊天消息表 + */ +export interface ChatMessage { + // 自增ID + id?: number; + // 发送人ID + formUserId?: number; + // 接收人ID + toUserId?: number; + // 消息类型 + type?: string; + // 消息内容 + content?: string; + // 屏蔽接收方 + sideTo?: number; + // 屏蔽发送方 + sideFrom?: number; + // 是否撤回 + withdraw?: number; + // 文件信息 + fileInfo?: string; + toUserName?: any; + formUserName?: string; + // 批量发送 + toUserIds?: any[]; + // 存在联系方式 + hasContact?: number; + // 状态, 0未读, 1已读 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 聊天消息表搜索条件 + */ +export interface ChatMessageParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/company/index.ts b/api/system/company/index.ts new file mode 100644 index 0000000..eb12848 --- /dev/null +++ b/api/system/company/index.ts @@ -0,0 +1,162 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { Company, CompanyParam } from './model'; +import { PageResult } from '@/api'; +import { SERVER_API_URL } from '@/config'; + +/** + * 查询企业资料 + */ +export async function getCompany(params?: CompanyParam) { + const res = await request.get>( + SERVER_API_URL + '/system/company/profile', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询企业资料不限租户 + */ +export async function getCompanyAll(companyId: number) { + const res = await request.get>( + SERVER_API_URL + '/system/company/profileAll/' + companyId + ); + if (res.data.code === 0 && res.data) { + console.log(res.data); + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询Company列表 + */ +export async function pageCompany(params: CompanyParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询Company列表不限租户 + */ +export async function pageCompanyAll(params: CompanyParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company/pageAll', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加Company + */ +export async function addCompany(data: Company) { + const res = await request.post>( + SERVER_API_URL + '/system/company', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改Company + */ +export async function updateCompany(data: Company) { + const res = await request.put>( + SERVER_API_URL + '/system/company', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改CompanyAll + */ +export async function updateCompanyAll(data: Company) { + const res = await request.put>( + SERVER_API_URL + '/system/company/updateCompanyAll', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除Company + */ +export async function removeCompany(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 销毁租户 +export async function destructionTenant(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company/destruction/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除Company + */ +export async function removeBatchCompany(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/company/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/company/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/company/model/index.ts b/api/system/company/model/index.ts new file mode 100644 index 0000000..fc83b8d --- /dev/null +++ b/api/system/company/model/index.ts @@ -0,0 +1,122 @@ +import type { PageParam } from '@/api'; +import type {CompanyParameter} from "~/api/system/companyParameter/model"; +import type {CompanyUrl} from "~/api/system/companyUrl/model"; +import type {CompanyGit} from "~/api/system/companyGit/model"; + +/** + * 企业信息 + */ +export interface Company { + companyId?: number; + type?: number; + menuId?: number; + appName?: string; + shortName?: string; + companyName?: string; + companyType?: number; + companyTypeMultiple?: string; + appType?: string; + companyLogo?: string; + image?: string; + content?: string; + files?: any; + companyCode?: string; + domain?: string; + phone?: string; + tel?: string; + email?: string; + InvoiceHeader?: string; + startTime?: string; + expirationTime?: string; + version?: number; + versionName?: string; + versionCode?: string; + members?: number; + storage?: string; + storageMax?: string; + buys?: number; + clicks?: number; + users?: number; + departments?: number; + industryParent?: string; + industryChild?: string; + country?: string; + province?: string; + city?: string; + region?: string; + address?: string; + latitude?: string; + longitude?: string; + businessEntity?: string; + comments?: any; + authentication?: number; + industryId?: number; + industryName?: string; + status?: number; + userId?: number; + official?: boolean; + price?: number; + deliveryMethod?: number; + chargingMethod?: number; + planId?: number; + sortNumber?: number; + authoritative?: boolean; + merchantId?: number; + tenantId?: number; + tenantName?: string; + tenantCode?: string; + modules?: string; + requestUrl?: string; + socketUrl?: string; + serverUrl?: string; + modulesUrl?: string; + merchantUrl?: string; + websiteUrl?: string; + mpWeixinCode?: string; + mpAlipayCode?: string; + h5Code?: string; + androidUrl?: string; + iosUrl?: string; + avatar?: string; + nickname?: string; + code?: number; + createTime?: string; + updateTime?: string; + password?: string; + password2?: string; + collection?: boolean; + recommend?: boolean; + title?: string; + parentName?: string; + categoryName?: string; + rate?: number; + isBuy?: boolean; + installed?: boolean; + parameters?: CompanyParameter[]; + links?: CompanyUrl[]; + accounts?: CompanyUrl[]; + gits?: CompanyGit[]; +} + +/** + * 企业信息搜索条件 + */ +export interface CompanyParam extends PageParam { + companyId?: number; + type?: number; + official?: boolean; + shortName?: string; + companyName?: string; + domain?: string; + authoritative?: number; + authentication?: number; + industryParent?: string; + industryChild?: string; + province?: string; + city?: string; + region?: string; + version?: number; + status?: number; + recommend?: boolean; + collection?: boolean; +} diff --git a/api/system/companyComment/index.ts b/api/system/companyComment/index.ts new file mode 100644 index 0000000..b6dd6b3 --- /dev/null +++ b/api/system/companyComment/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type {ApiResult, PageResult} from '@/api'; +import type {CompanyComment, CompanyCommentParam} from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询应用评论 + */ +export async function pageCompanyComment(params: CompanyCommentParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company-comment/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用评论列表 + */ +export async function listCompanyComment(params?: CompanyCommentParam) { + const res = await request.get>( + SERVER_API_URL + '/system/company-comment', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用评论 + */ +export async function addCompanyComment(data: CompanyComment) { + const res = await request.post>( + SERVER_API_URL + '/system/company-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用评论 + */ +export async function updateCompanyComment(data: CompanyComment) { + const res = await request.put>( + SERVER_API_URL + '/system/company-comment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用评论 + */ +export async function removeCompanyComment(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-comment/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用评论 + */ +export async function removeBatchCompanyComment(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-comment/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用评论 + */ +export async function getCompanyComment(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/company-comment/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/companyComment/model/index.ts b/api/system/companyComment/model/index.ts new file mode 100644 index 0000000..45d4b6c --- /dev/null +++ b/api/system/companyComment/model/index.ts @@ -0,0 +1,43 @@ +import type { PageParam } from '@/api'; + +/** + * 应用评论 + */ +export interface CompanyComment { + // ID + id?: number; + // 父级ID + parentId?: number; + // 用户ID + userId?: number; + // 企业ID + companyId?: number; + // 评分 + rate?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 评论内容 + comments?: string; + // 状态 + status?: number; + // 租户id + tenantId?: number; + // 租户名称 + tenantName?: string; + // 企业 + logo?: string; + // 创建时间 + createTime?: string; + // 子列表 + children?: CompanyComment[]; +} + +/** + * 应用评论搜索条件 + */ +export interface CompanyCommentParam extends PageParam { + id?: number; + userId?: number; + tenantId?: number; + keywords?: string; +} diff --git a/api/system/companyContent/index.ts b/api/system/companyContent/index.ts new file mode 100644 index 0000000..57fc3bf --- /dev/null +++ b/api/system/companyContent/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyContent, CompanyContentParam } from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询应用详情 + */ +export async function pageCompanyContent(params: CompanyContentParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company-content/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用详情列表 + */ +export async function listCompanyContent(params?: CompanyContentParam) { + const res = await request.get>( + SERVER_API_URL + '/system/company-content', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用详情 + */ +export async function addCompanyContent(data: CompanyContent) { + const res = await request.post>( + SERVER_API_URL + '/system/company-content', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用详情 + */ +export async function updateCompanyContent(data: CompanyContent) { + const res = await request.put>( + SERVER_API_URL + '/system/company-content', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用详情 + */ +export async function removeCompanyContent(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-content/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用详情 + */ +export async function removeBatchCompanyContent(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-content/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用详情 + */ +export async function getCompanyContent(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/company-content/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/companyContent/model/index.ts b/api/system/companyContent/model/index.ts new file mode 100644 index 0000000..226f513 --- /dev/null +++ b/api/system/companyContent/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 应用详情 + */ +export interface CompanyContent { + // + id?: number; + // 企业ID + companyId?: number; + // 详细内容 + content?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 应用详情搜索条件 + */ +export interface CompanyContentParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/companyGit/index.ts b/api/system/companyGit/index.ts new file mode 100644 index 0000000..8e0694b --- /dev/null +++ b/api/system/companyGit/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyGit, CompanyGitParam } from './model'; +import { SERVER_API_URL } from '@/config/index'; + +/** + * 分页查询代码仓库 + */ +export async function pageCompanyGit(params: CompanyGitParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company-git/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询代码仓库列表 + */ +export async function listCompanyGit(params?: CompanyGitParam) { + const res = await request.get>( + SERVER_API_URL + '/system/company-git', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加代码仓库 + */ +export async function addCompanyGit(data: CompanyGit) { + const res = await request.post>( + SERVER_API_URL + '/system/company-git', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改代码仓库 + */ +export async function updateCompanyGit(data: CompanyGit) { + const res = await request.put>( + SERVER_API_URL + '/system/company-git', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除代码仓库 + */ +export async function removeCompanyGit(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-git/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除代码仓库 + */ +export async function removeBatchCompanyGit(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-git/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询代码仓库 + */ +export async function getCompanyGit(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/company-git/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/companyGit/model/index.ts b/api/system/companyGit/model/index.ts new file mode 100644 index 0000000..901a7cd --- /dev/null +++ b/api/system/companyGit/model/index.ts @@ -0,0 +1,41 @@ +import type { PageParam } from '@/api'; + +/** + * 代码仓库 + */ +export interface CompanyGit { + // 自增ID + id?: number; + // 仓库名称 + title?: string; + // 厂商 0私有仓库 1github 2gitee 3其他 + brand?: string; + // 语言 + language?: string; + // 企业ID + companyId?: number; + // 仓库地址 + domain?: string; + // 账号 + account?: string; + // 密码 + password?: string; + // 仓库描述 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 代码仓库搜索条件 + */ +export interface CompanyGitParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/companyParameter/index.ts b/api/system/companyParameter/index.ts new file mode 100644 index 0000000..f438a9e --- /dev/null +++ b/api/system/companyParameter/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyParameter, CompanyParameterParam } from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询应用参数 + */ +export async function pageCompanyParameter(params: CompanyParameterParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company-parameter/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用参数列表 + */ +export async function listCompanyParameter(params?: CompanyParameterParam) { + const res = await request.get>( + SERVER_API_URL + '/system/company-parameter', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用参数 + */ +export async function addCompanyParameter(data: CompanyParameter) { + const res = await request.post>( + SERVER_API_URL + '/system/company-parameter', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用参数 + */ +export async function updateCompanyParameter(data: CompanyParameter) { + const res = await request.put>( + SERVER_API_URL + '/system/company-parameter', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用参数 + */ +export async function removeCompanyParameter(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-parameter/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用参数 + */ +export async function removeBatchCompanyParameter(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-parameter/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用参数 + */ +export async function getCompanyParameter(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/company-parameter/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/companyParameter/model/index.ts b/api/system/companyParameter/model/index.ts new file mode 100644 index 0000000..bf608d8 --- /dev/null +++ b/api/system/companyParameter/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 应用参数 + */ +export interface CompanyParameter { + // 自增ID + id?: number; + // 参数名称 + name?: string; + // 参数内容 + value?: string; + // 企业ID + companyId?: number; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 应用参数搜索条件 + */ +export interface CompanyParameterParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/companyUrl/index.ts b/api/system/companyUrl/index.ts new file mode 100644 index 0000000..d94e3d9 --- /dev/null +++ b/api/system/companyUrl/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyUrl, CompanyUrlParam } from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询应用域名 + */ +export async function pageCompanyUrl(params: CompanyUrlParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company-url/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用域名列表 + */ +export async function listCompanyUrl(params?: CompanyUrlParam) { + const res = await request.get>( + SERVER_API_URL + '/system/company-url', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用域名 + */ +export async function addCompanyUrl(data: CompanyUrl) { + const res = await request.post>( + SERVER_API_URL + '/system/company-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用域名 + */ +export async function updateCompanyUrl(data: CompanyUrl) { + const res = await request.put>( + SERVER_API_URL + '/system/company-url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用域名 + */ +export async function removeCompanyUrl(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-url/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用域名 + */ +export async function removeBatchCompanyUrl(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/company-url/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用域名 + */ +export async function getCompanyUrl(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/company-url/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/companyUrl/model/index.ts b/api/system/companyUrl/model/index.ts new file mode 100644 index 0000000..1ae38e2 --- /dev/null +++ b/api/system/companyUrl/model/index.ts @@ -0,0 +1,39 @@ +import type { PageParam } from '@/api'; + +/** + * 应用域名 + */ +export interface CompanyUrl { + // 自增ID + id?: number; + // 域名类型 + type?: string; + // 企业ID + companyId?: number; + // 域名 + domain?: string; + // 账号 + account?: string; + // 密码 + password?: string; + // 二维码 + qrcode?: string; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 应用域名搜索条件 + */ +export interface CompanyUrlParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/dict-data/index.ts b/api/system/dict-data/index.ts new file mode 100644 index 0000000..2d2961a --- /dev/null +++ b/api/system/dict-data/index.ts @@ -0,0 +1,87 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DictData, DictDataParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询字典数据 + */ +export async function pageDictData(params: DictDataParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/dict-data/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询字典数据列表 + */ +export async function listDictData(params: DictDataParam) { + const res = await request.get>( + SERVER_API_URL + '/system/dict-data', + { params } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加字典数据 + */ +export async function addDictData(data: DictData) { + const res = await request.post>( + SERVER_API_URL + '/system/dict-data', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改字典数据 + */ +export async function updateDictData(data: DictData) { + const res = await request.put>( + SERVER_API_URL + '/system/dict-data', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除字典数据 + */ +export async function removeDictData(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/dict-data/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除字典数据 + */ +export async function removeDictDataBatch(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/dict-data/batch', + { data } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/dict-data/model/index.ts b/api/system/dict-data/model/index.ts new file mode 100644 index 0000000..d4d40a8 --- /dev/null +++ b/api/system/dict-data/model/index.ts @@ -0,0 +1,45 @@ +import { PageParam } from '@/api'; + +/** + * 字典数据 + */ +export interface DictData { + // 字典数据id + dictDataId?: number; + // 字典id + dictId?: number; + // 字典名称 + dictName?: string; + // 字典数据标识 + dictDataCode?: string; + // 字典数据名称 + dictDataName?: string; + // 字典标识 + dictCode?: string; + // 排序号 + sortNumber?: any; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + tenantId?: number; + label?: string; + value?: number; +} + +/** + * 字典数据搜索条件 + */ +export interface DictDataParam extends PageParam { + // 关键字 + keywords?: string; + // 字典标识 + dictCode?: string; + // 字典id + dictId?: number; + // + value?: number; + // + label?: string; + dictDataId?: number; +} diff --git a/api/system/dict/index.ts b/api/system/dict/index.ts new file mode 100644 index 0000000..74a9973 --- /dev/null +++ b/api/system/dict/index.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { Dict, DictParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 查询字典列表 + */ +export async function listDictionaries(params?: DictParam) { + const res = await request.get>( + SERVER_API_URL + '/system/dict', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加字典 + */ +export async function addDict(data: Dict) { + const res = await request.post>( + SERVER_API_URL + '/system/dict', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改字典 + */ +export async function updateDict(data: Dict) { + const res = await request.put>( + SERVER_API_URL + '/system/dict', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除字典 + */ +export async function removeDict(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/dict/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/dict/model/index.ts b/api/system/dict/model/index.ts new file mode 100644 index 0000000..575cb35 --- /dev/null +++ b/api/system/dict/model/index.ts @@ -0,0 +1,29 @@ +/** + * 字典 + */ +export interface Dict { + // 字典id + dictId?: number; + // 字典标识 + dictCode?: string; + // 字典名称 + dictName?: string; + // 排序号 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + type?: number; + tenantId?: number; +} + +/** + * 字典搜索条件 + */ +export interface DictParam { + dictCode?: string; + dictName?: string; + type?: number; + tenantId?: number; +} diff --git a/api/system/dictionary-data/index.ts b/api/system/dictionary-data/index.ts new file mode 100644 index 0000000..6d01044 --- /dev/null +++ b/api/system/dictionary-data/index.ts @@ -0,0 +1,87 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DictionaryData, DictionaryDataParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询字典数据 + */ +export async function pageDictionaryData(params: DictionaryDataParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/dict-data/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询字典数据列表 + */ +export async function listDictionaryData(params: DictionaryDataParam) { + const res = await request.get>( + SERVER_API_URL + '/system/dict-data', + { params } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加字典数据 + */ +export async function addDictionaryData(data: DictionaryData) { + const res = await request.post>( + SERVER_API_URL + '/system/dict-data', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改字典数据 + */ +export async function updateDictionaryData(data: DictionaryData) { + const res = await request.put>( + SERVER_API_URL + '/system/dict-data', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除字典数据 + */ +export async function removeDictionaryData(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/dict-data/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除字典数据 + */ +export async function removeDictionaryDataBatch(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/dict-data/batch', + { data } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/dictionary-data/model/index.ts b/api/system/dictionary-data/model/index.ts new file mode 100644 index 0000000..e1301bd --- /dev/null +++ b/api/system/dictionary-data/model/index.ts @@ -0,0 +1,33 @@ +import { PageParam } from '@/api'; + +/** + * 字典数据 + */ +export interface DictionaryData { + // 字典数据id + dictDataId?: number; + // 字典id + dictId?: number; + // 字典数据标识 + dictDataCode?: string; + // 字典数据名称 + dictDataName?: string; + // 排序号 + sortNumber?: string; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; +} + +/** + * 字典数据搜索条件 + */ +export interface DictionaryDataParam extends PageParam { + // 关键字 + keywords?: string; + // 字典标识 + dictCode?: string; + // 字典id + dictId?: number; +} diff --git a/api/system/dictionary/index.ts b/api/system/dictionary/index.ts new file mode 100644 index 0000000..bb2bff7 --- /dev/null +++ b/api/system/dictionary/index.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { Dictionary, DictionaryParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 查询字典列表 + */ +export async function listDictionaries(params?: DictionaryParam) { + const res = await request.get>( + SERVER_API_URL + '/system/dictionary', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加字典 + */ +export async function addDictionary(data: Dictionary) { + const res = await request.post>( + SERVER_API_URL + '/system/dictionary', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改字典 + */ +export async function updateDictionary(data: Dictionary) { + const res = await request.put>( + SERVER_API_URL + '/system/dictionary', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除字典 + */ +export async function removeDictionary(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/dictionary/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/dictionary/model/index.ts b/api/system/dictionary/model/index.ts new file mode 100644 index 0000000..d72e7c2 --- /dev/null +++ b/api/system/dictionary/model/index.ts @@ -0,0 +1,29 @@ +/** + * 字典 + */ +export interface Dictionary { + // 字典id + dictId?: number; + // 字典标识 + dictCode?: string; + // 字典名称 + dictName?: string; + // 排序号 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + type?: number; + tenantId?: number; +} + +/** + * 字典搜索条件 + */ +export interface DictionaryParam { + dictCode?: string; + dictName?: string; + type?: number; + tenantId?: number; +} diff --git a/api/system/environment/index.ts b/api/system/environment/index.ts new file mode 100644 index 0000000..a71b87f --- /dev/null +++ b/api/system/environment/index.ts @@ -0,0 +1,125 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Environment, EnvironmentParam } from './model/index'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询应用 + */ +export async function pageEnvironment(params?: EnvironmentParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/environment/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用列表 + */ +export async function listEnvironment(params?: EnvironmentParam) { + const res = await request.get>( + SERVER_API_URL + '/system/environment', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用 + */ +export async function getEnvironment(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/environment/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用 + */ +export async function updateEnvironment(data: Environment) { + const res = await request.put>( + SERVER_API_URL + '/system/environment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 排行榜 +export async function ranking(params?: EnvironmentParam) { + const res = await request.get>( + SERVER_API_URL + '/system/environment/ranking', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/environment/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 搜索历史 +export async function searchHistory(params?: String) { + const res = await request.get>( + SERVER_API_URL + '/system/environment/search-history', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 制作插件 + */ +export async function createEnvironment(data: Environment) { + const res = await request.post>( + SERVER_API_URL + '/system/environment/environment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/environment/model/index.ts b/api/system/environment/model/index.ts new file mode 100644 index 0000000..daa916b --- /dev/null +++ b/api/system/environment/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 插件 + */ +export interface Environment { + id?: number; + environmentName?: string; + environmentCode?: string; + brand?: string; + serverIp?: string; + modulesUrl?: string; + modulesApi?: string; + sortNumber?: number; + comments?: string; + status?: number; +} + +/** + * 插件搜索条件 + */ +export interface EnvironmentParam extends PageParam { + id: number; + environmentName: string; +} diff --git a/api/system/file/index.ts b/api/system/file/index.ts new file mode 100644 index 0000000..dbc9f73 --- /dev/null +++ b/api/system/file/index.ts @@ -0,0 +1,234 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { FileRecord, FileRecordParam } from './model'; +import { SERVER_API_URL } from '@/config'; +import { FILE_SERVER } from '@/config'; + +/** + * 上传文件 + */ +export async function uploadFileLocal(file: File, AppId: number) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + FILE_SERVER + '/api/file/upload', + formData, + { + headers: { AppId } + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传文件 + */ +export async function uploadFileLocalByCompany(file: File, CompanyId: number) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + FILE_SERVER + '/api/file/upload', + formData, + { + headers: { CompanyId } + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传文件 + */ +export async function uploadFile(file: File) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + SERVER_API_URL + '/oss/upload', + formData + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传 base64 文件 + * @param base64 文件数据 + * @param fileName 文件名称 + */ +export async function uploadBase64File(base64: string, fileName?: string) { + const formData = new FormData(); + formData.append('base64', base64); + if (fileName) { + formData.append('fileName', fileName); + } + const res = await request.post>( + SERVER_API_URL + '/file/upload/base64', + formData + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传证书 + */ +export async function uploadCert(file: File) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + SERVER_API_URL + '/file/upload', + formData + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询文件上传记录 + */ +export async function pageFiles(params: FileRecordParam) { + const res = await request.get>>( + SERVER_API_URL + '/file/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询文件 + */ +export async function getFile(id: number) { + const res = await request.get>( + SERVER_API_URL + '/file/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除文件 + */ +export async function removeFile(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/file/remove/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除文件 + */ +export async function removeFiles(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/file/remove/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加文件 + */ +export async function addFiles(data: FileRecord) { + const res = await request.post>( + SERVER_API_URL + '/file', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改文件 + */ +export async function updateFiles(data: FileRecord) { + const res = await request.put>( + SERVER_API_URL + '/file', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传阿里云OSS + */ +export async function uploadOss(file: File) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + SERVER_API_URL + '/oss/upload', + formData + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传阿里云OSS + */ +export async function uploadOssByGroupId(file: File, GroupId: string) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + SERVER_API_URL + '/oss/upload', + formData, + { + headers: { GroupId } + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 上传阿里云OSS + */ +export async function uploadOssByAppId(file: File, appId: string) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + SERVER_API_URL + '/oss/upload', + formData, + { + headers: { appId } + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/file/model/index.ts b/api/system/file/model/index.ts new file mode 100644 index 0000000..1977ed2 --- /dev/null +++ b/api/system/file/model/index.ts @@ -0,0 +1,54 @@ +import { PageParam } from '@/api'; + +/** + * 文件上传记录 + */ +export interface FileRecord { + // id + id: number; + // 文件名称 + name?: string; + // 文件存储路径 + path?: string; + // 文件大小 + length?: number; + // 文件类型 + contentType?: string; + // 上传人id + createUserId?: number; + // 分组ID + groupId?: number; + groupName?: string; + // 上传时间 + createTime?: string; + // 描述 + comments?: string; + // 文件访问地址 + url?: string; + // 文件缩略图访问地址 + thumbnail?: string; + // 文件下载地址 + downloadUrl?: string; + // 上传人账号 + createUsername?: string; + // 上传人名称 + createNickname?: string; + // 是否编辑状态 + isUpdate?: boolean; + // 商品SKU索引 + index?: any; +} + +/** + * 文件上传记录查询参数 + */ +export interface FileRecordParam extends PageParam { + name?: string; + path?: string; + contentType?: string; + createNickname?: string; + groupId?: number; + groupName?: string; + count?: number; + page?: number; +} diff --git a/api/system/login-record/index.ts b/api/system/login-record/index.ts new file mode 100644 index 0000000..3648543 --- /dev/null +++ b/api/system/login-record/index.ts @@ -0,0 +1,32 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { LoginRecord, LoginRecordParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询登录日志 + */ +export async function pageLoginRecords(params: LoginRecordParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/login-record/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询登录日志列表 + */ +export async function listLoginRecords(params?: LoginRecordParam) { + const res = await request.get>( + SERVER_API_URL + '/system/login-record', + { params } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/login-record/model/index.ts b/api/system/login-record/model/index.ts new file mode 100644 index 0000000..0836eb5 --- /dev/null +++ b/api/system/login-record/model/index.ts @@ -0,0 +1,38 @@ +import { PageParam } from '@/api'; + +/** + * 登录日志 + */ +export interface LoginRecord { + // 登录日志id + id: number; + // 用户账号 + username: string; + // 操作系统 + os: string; + // 设备名称 + device: string; + // 浏览器类型 + browser: string; + // ip地址 + ip: string; + // 操作类型, 0登录成功, 1登录失败, 2退出登录, 3续签token + loginType: number; + // 备注 + comments: string; + // 操作时间 + createTime: string; + // 用户昵称 + nickname: string; +} + +/** + * 登录日志搜索条件 + */ +export interface LoginRecordParam extends PageParam { + username?: string; + nickname?: string; + createTimeStart?: string; + createTimeEnd?: string; + loginType?: number; +} diff --git a/api/system/menu/index.ts b/api/system/menu/index.ts new file mode 100644 index 0000000..3c39743 --- /dev/null +++ b/api/system/menu/index.ts @@ -0,0 +1,127 @@ +import request from '@/utils/request'; +import type { ApiResult } from '@/api'; +import type { Menu, MenuParam } from './model'; +import { App } from '@/api/dashboard/appstore/model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 查询菜单列表 + */ +export async function listMenus(params: MenuParam) { + const res = await request.get>( + SERVER_API_URL + '/system/menu', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加菜单 + */ +export async function addMenu(data: Menu) { + const res = await request.post>( + SERVER_API_URL + '/system/menu', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改菜单 + */ +export async function updateMenu(data: Menu) { + const res = await request.put>( + SERVER_API_URL + '/system/menu', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除菜单 + */ +export async function removeMenu(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/menu/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 安装应用 + */ +export async function installApp(data: App) { + const res = await request.post>( + SERVER_API_URL + '/system/menu/install', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 卸载应用 + */ +export async function uninstallApp(data: App) { + const res = await request.post>( + SERVER_API_URL + '/system/menu/uninstall', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 菜单克隆 +export async function clone(data: Menu) { + const res = await request.post>( + SERVER_API_URL + '/system/menu/clone', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 制作插件 + */ +export async function createPlug(data: Menu) { + const res = await request.post>( + SERVER_API_URL + '/system/menu/plug', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 安装插件 +export async function installPlug(id?: number) { + const res = await request.get>( + SERVER_API_URL + '/system/menu/install/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/menu/model/index.ts b/api/system/menu/model/index.ts new file mode 100644 index 0000000..4b52e95 --- /dev/null +++ b/api/system/menu/model/index.ts @@ -0,0 +1,67 @@ +/** + * 菜单 + */ +export interface Menu { + // 菜单id + menuId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 菜单名称 + title: string; + // 菜单路由地址 + path: string; + // 菜单组件地址 + component: string; + // 模块API + modulesUrl?: string; + // 模块ID + modules?: string; + // 菜单类型, 0菜单, 1按钮 + menuType?: number; + // 排序号 + sortNumber?: number; + // 权限标识 + authority?: string; + // 菜单图标 + icon?: string; + // 是否隐藏, 0否,1是(仅注册路由不显示左侧菜单) + hide?: number; + // 路由元信息 + meta?: string; + // 创建时间 + createTime?: string; + // 子菜单 + children?: Menu[]; + // 权限树回显选中状态, 0未选中, 1选中 + checked?: boolean; + // + key?: number; + // + value?: number; + // + parentIds?: number[]; + // + openType?: number; + disabled?: boolean; + // + appId?: number; + // + tenantId?: number; + tenantName?: string; + companyId?: number; + // 插件Api + plugUrl?: string; + label?: string; +} + +/** + * 菜单搜索参数 + */ +export interface MenuParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; + menuType?: number; + hide?: number; +} diff --git a/api/system/modules/index.ts b/api/system/modules/index.ts new file mode 100644 index 0000000..c4128d6 --- /dev/null +++ b/api/system/modules/index.ts @@ -0,0 +1,118 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Modules, ModulesParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询角色module + */ +export async function pageModules(params) { + const res = await request.get>>( + SERVER_API_URL + '/system/modules/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询角色列表 + */ +export async function listModules(params?: ModulesParam) { + const res = await request.get>( + SERVER_API_URL + '/system/modules', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加角色 + */ +export async function addModules(data: Modules) { + const res = await request.post>( + SERVER_API_URL + '/system/modules', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改角色 + */ +export async function updateModules(data: Modules) { + const res = await request.put>( + SERVER_API_URL + '/system/modules', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除角色 + */ +export async function removeModules(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/modules/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除角色 + */ +export async function removeModulesBath(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/modules/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取角色分配的菜单 + */ +export async function listModulesMenus(modulesId?: number) { + const res = await request.get>( + SERVER_API_URL + '/system/modules-menu/' + modulesId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改角色菜单 + */ +export async function updateModulesMenus(modulesId?: number, data?: number[]) { + const res = await request.put>( + SERVER_API_URL + '/system/modules-menu/' + modulesId, + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/modules/model/index.ts b/api/system/modules/model/index.ts new file mode 100644 index 0000000..a1cda9b --- /dev/null +++ b/api/system/modules/model/index.ts @@ -0,0 +1,22 @@ +import type { PageParam } from '@/api'; + +/** + * 插件 + */ +export interface Modules { + id?: number; + modules?: string; + modulesUrl?: string; + sortNumber?: number; + comments?: string; + status?: number; +} + +/** + * 插件搜索条件 + */ +export interface ModulesParam extends PageParam { + id: number; + modules: string; + modulesUrl?: string; +} diff --git a/api/system/operation-record/index.ts b/api/system/operation-record/index.ts new file mode 100644 index 0000000..4c2ffd3 --- /dev/null +++ b/api/system/operation-record/index.ts @@ -0,0 +1,32 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OperationRecord, OperationRecordParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询操作日志 + */ +export async function pageOperationRecords(params: OperationRecordParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/operation-record/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询操作日志列表 + */ +export async function listOperationRecords(params?: OperationRecordParam) { + const res = await request.get>( + SERVER_API_URL + '/system/operation-record', + { params } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/operation-record/model/index.ts b/api/system/operation-record/model/index.ts new file mode 100644 index 0000000..fc1425e --- /dev/null +++ b/api/system/operation-record/model/index.ts @@ -0,0 +1,56 @@ +import { PageParam } from '@/api'; + +/** + * 操作日志 + */ +export interface OperationRecord { + // 操作日志id + id?: number; + // 用户id + userId?: number; + // 操作模块 + module: string; + // 操作功能 + description: string; + // 请求地址 + url: string; + // 请求方式 + requestMethod: string; + // 调用方法 + method: string; + // 请求参数 + params: string; + // 返回结果 + result: string; + // 异常信息 + error: string; + // 消耗时间, 单位毫秒 + spendTime: number; + // 操作系统 + os: string; + // 设备名称 + device: string; + // 浏览器类型 + browser: string; + // ip地址 + ip: string; + // 状态, 0成功, 1异常 + status: number; + // 操作时间 + createTime: string; + // 用户昵称 + nickname: string; + // 用户账号 + username: string; +} + +/** + * 操作日志搜索条件 + */ +export interface OperationRecordParam extends PageParam { + username?: string; + module?: string; + createTimeStart?: string; + createTimeEnd?: string; + status?: number; +} diff --git a/api/system/order/index.ts b/api/system/order/index.ts new file mode 100644 index 0000000..f47dd66 --- /dev/null +++ b/api/system/order/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Order, OrderParam } from './model'; +import { SERVER_API_URL } from '@/config/index'; + +/** + * 分页查询订单 + */ +export async function pageOrder(params: OrderParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/order/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询订单列表 + */ +export async function listOrder(params?: OrderParam) { + const res = await request.get>( + SERVER_API_URL + '/system/order', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加订单 + */ +export async function addOrder(data: Order) { + const res = await request.post>( + SERVER_API_URL + '/system/order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改订单 + */ +export async function updateOrder(data: Order) { + const res = await request.put>( + SERVER_API_URL + '/system/order', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除订单 + */ +export async function removeOrder(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/order/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除订单 + */ +export async function removeBatchOrder(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/order/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询订单 + */ +export async function getOrder(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/order/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/order/model/index.ts b/api/system/order/model/index.ts new file mode 100644 index 0000000..292c3a3 --- /dev/null +++ b/api/system/order/model/index.ts @@ -0,0 +1,93 @@ +import type { PageParam } from '@/api'; + +/** + * 订单 + */ +export interface Order { + // 订单号 + orderId?: number; + // 订单编号 + orderNo?: string; + // 订单类型,0产品 1插件 + type?: number; + // 下单渠道,0网站 1小程序 2其他 + channel?: number; + // 微信支付订单号 + transactionId?: string; + // 微信退款订单号 + refundOrder?: string; + // 使用的优惠券id + couponId?: number; + // 真实姓名 + realName?: string; + // 手机号码 + phone?: string; + // 订单总额 + totalPrice?: string; + // 减少的金额,使用VIP会员折扣、优惠券抵扣、优惠券折扣后减去的价格 + reducePrice?: string; + // 实际付款 + payPrice?: string; + // 用于统计 + price?: string; + // 价钱,用于积分赠送 + money?: string; + // 退款金额 + refundMoney?: string; + // 购买数量 + totalNum?: number; + // 0余额支付, 1微信支付,102微信Native,2会员卡支付,3支付宝,4现金,5POS机 + payType?: number; + // 0未付款,1已付款 + payStatus?: string; + // 0未完成,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款 + orderStatus?: number; + // 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡 + couponType?: number; + // 优惠说明 + couponDesc?: string; + // 二维码地址,保存订单号,支付成功后才生成 + qrcode?: string; + // 预约详情开始时间数组 + startTime?: string; + // 是否已开具发票:0未开发票,1已开发票,2不能开具发票 + isInvoice?: string; + // 发票流水号 + invoiceNo?: string; + // 支付时间 + payTime?: string; + // 退款时间 + refundTime?: string; + // 申请退款时间 + refundApplyTime?: string; + // 过期时间 + expirationTime?: string; + // 对账情况:0=未对账;1=已对账;3=已对账,金额对不上;4=未查询到该订单 + checkBill?: number; + // 订单是否已结算(0未结算 1已结算) + isSettled?: number; + // 系统版本号 0当前版本 value=其他版本 + version?: number; + // 用户id + userId?: number; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 修改时间 + updateTime?: string; + // 创建时间 + createTime?: string; +} + +/** + * 订单搜索条件 + */ +export interface OrderParam extends PageParam { + orderId?: number; + keywords?: string; +} diff --git a/api/system/orderGoods/index.ts b/api/system/orderGoods/index.ts new file mode 100644 index 0000000..ce37160 --- /dev/null +++ b/api/system/orderGoods/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OrderGoods, OrderGoodsParam } from './model'; +import {SERVER_API_URL} from '@/config/setting'; + +/** + * 分页查询订单商品 + */ +export async function pageOrderGoods(params: OrderGoodsParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/order-goods/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询订单商品列表 + */ +export async function listOrderGoods(params?: OrderGoodsParam) { + const res = await request.get>( + SERVER_API_URL + '/system/order-goods', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加订单商品 + */ +export async function addOrderGoods(data: OrderGoods) { + const res = await request.post>( + SERVER_API_URL + '/system/order-goods', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改订单商品 + */ +export async function updateOrderGoods(data: OrderGoods) { + const res = await request.put>( + SERVER_API_URL + '/system/order-goods', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除订单商品 + */ +export async function removeOrderGoods(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/order-goods/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除订单商品 + */ +export async function removeBatchOrderGoods(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/order-goods/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询订单商品 + */ +export async function getOrderGoods(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/order-goods/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/orderGoods/model/index.ts b/api/system/orderGoods/model/index.ts new file mode 100644 index 0000000..dddbbbe --- /dev/null +++ b/api/system/orderGoods/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 订单商品 + */ +export interface OrderGoods { + // 订单号 + id?: number; + // 订单类型,0商城 1应用插件 + type?: number; + // 订单ID + orderId?: number; + // 项目ID + itemId?: number; + // 实际付款 + payPrice?: string; + // 购买数量 + totalNum?: number; + // 0未付款,1已付款 + payStatus?: string; + // 0未完成,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款 + orderStatus?: number; + // 预约详情开始时间数组 + startTime?: string; + // 是否已开具发票:0未开发票,1已开发票,2不能开具发票 + isInvoice?: string; + // 发票流水号 + invoiceNo?: string; + // 支付时间 + payTime?: string; + // 过期时间 + expirationTime?: string; + // 用户id + userId?: number; + // 备注 + comments?: string; + // 排序号 + sortNumber?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 修改时间 + updateTime?: string; + // 创建时间 + createTime?: string; +} + +/** + * 订单商品搜索条件 + */ +export interface OrderGoodsParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/organization/index.ts b/api/system/organization/index.ts new file mode 100644 index 0000000..703cf86 --- /dev/null +++ b/api/system/organization/index.ts @@ -0,0 +1,73 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Organization, OrganizationParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询机构 + */ +export async function pageOrganizations(params: OrganizationParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/organization/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询机构列表 + */ +export async function listOrganizations(params?: OrganizationParam) { + const res = await request.get>( + SERVER_API_URL + '/system/organization', + { params } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加机构 + */ +export async function addOrganization(data: Organization) { + const res = await request.post>( + SERVER_API_URL + '/system/organization', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改机构 + */ +export async function updateOrganization(data: Organization) { + const res = await request.put>( + SERVER_API_URL + '/system/organization', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除机构 + */ +export async function removeOrganization(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/organization/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/organization/model/index.ts b/api/system/organization/model/index.ts new file mode 100644 index 0000000..1f9deaa --- /dev/null +++ b/api/system/organization/model/index.ts @@ -0,0 +1,42 @@ +import { PageParam } from '@/api'; + +/** + * 机构 + */ +export interface Organization { + // 机构id + organizationId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 机构名称 + organizationName?: string; + // 机构全称 + organizationFullName?: string; + // 机构代码 + organizationCode?: string; + // 机构类型(字典) + organizationType?: string; + // 排序号 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 机构类型名称 + organizationTypeName?: string; + // + key?: number; + // + value?: number; + // + title?: string; + children?: Organization[]; +} + +/** + * 机构搜索条件 + */ +export interface OrganizationParam extends PageParam { + organizationName?: string; + parentId?: number; +} diff --git a/api/system/parameter/index.ts b/api/system/parameter/index.ts new file mode 100644 index 0000000..1d912b3 --- /dev/null +++ b/api/system/parameter/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Parameter, ParameterParam } from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询应用参数 + */ +export async function pageParameter(params: ParameterParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/parameter/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用参数列表 + */ +export async function listParameter(params?: ParameterParam) { + const res = await request.get>( + SERVER_API_URL + '/system/parameter', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用参数 + */ +export async function addParameter(data: Parameter) { + const res = await request.post>( + SERVER_API_URL + '/system/parameter', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用参数 + */ +export async function updateParameter(data: Parameter) { + const res = await request.put>( + SERVER_API_URL + '/system/parameter', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用参数 + */ +export async function removeParameter(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/parameter/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用参数 + */ +export async function removeBatchParameter(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/parameter/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用参数 + */ +export async function getParameter(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/parameter/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/parameter/model/index.ts b/api/system/parameter/model/index.ts new file mode 100644 index 0000000..ae3d159 --- /dev/null +++ b/api/system/parameter/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 应用参数 + */ +export interface Parameter { + // 自增ID + id?: number; + // 参数名称 + name?: string; + // 参数内容 + value?: string; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 应用参数搜索条件 + */ +export interface ParameterParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/payment/index.ts b/api/system/payment/index.ts new file mode 100644 index 0000000..cfaf7f9 --- /dev/null +++ b/api/system/payment/index.ts @@ -0,0 +1,121 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Payment, PaymentParam } from './model'; +import { SERVER_API_URL } from '@/config'; +import type { Order } from '@/api/shop/order/model'; + +/** + * 分页查询支付方式 + */ +export async function pagePayment(params: PaymentParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/payment/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询支付方式列表 + */ +export async function listPayment(params?: PaymentParam) { + const res = await request.get>( + SERVER_API_URL + '/system/payment', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加支付方式 + */ +export async function addPayment(data: Payment) { + const res = await request.post>( + SERVER_API_URL + '/system/payment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改支付方式 + */ +export async function updatePayment(data: Payment) { + const res = await request.put>( + SERVER_API_URL + '/system/payment', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除支付方式 + */ +export async function removePayment(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/payment/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除支付方式 + */ +export async function removeBatchPayment(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/payment/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询支付方式 + */ +export async function getPayment(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/payment/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 生成支付二维码(微信native) + */ +export async function getNativeCode(data: Order) { + const res = await request.post>( + SERVER_API_URL + '/system/wx-native-pay/codeUrl', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/payment/model/index.ts b/api/system/payment/model/index.ts new file mode 100644 index 0000000..1761bb4 --- /dev/null +++ b/api/system/payment/model/index.ts @@ -0,0 +1,55 @@ +import type { PageParam } from '@/api'; + +/** + * 支付方式 + */ +export interface Payment { + // ID + id?: number; + // 支付方式 + name?: string; + // 支付类型 + type?: number; + // 标识 + code?: string; + // 支付图标 + image?: string; + // 微信商户号类型 1普通商户2子商户 + wechatType?: number; + // 应用ID + appId?: string; + // 商户号 + mchId?: string; + // 设置APIv3密钥 + apiKey?: string; + // 证书文件 (CERT) + apiclientCert?: string; + // 证书文件 (KEY) + apiclientKey?: string; + // 商户证书序列号 + merchantSerialNumber?: string; + // 支付结果通过 + notifyUrl?: string; + // 备注 + comments?: string; + // 文章排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0启用, 1禁用 + status?: boolean; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 支付方式搜索条件 + */ +export interface PaymentParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/plug/index.ts b/api/system/plug/index.ts new file mode 100644 index 0000000..483db41 --- /dev/null +++ b/api/system/plug/index.ts @@ -0,0 +1,125 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Plug, PlugParam } from './model/index'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询应用 + */ +export async function pagePlug(params: PlugParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/plug/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用列表 + */ +export async function listPlug(params?: PlugParam) { + const res = await request.get>( + SERVER_API_URL + '/system/plug', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用 + */ +export async function getPlug(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/plug/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用 + */ +export async function updatePlug(data: Plug) { + const res = await request.put>( + SERVER_API_URL + '/system/plug', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 排行榜 +export async function ranking(params?: PlugParam) { + const res = await request.get>( + SERVER_API_URL + '/system/plug/ranking', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/plug/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +// 搜索历史 +export async function searchHistory(params?: String) { + const res = await request.get>( + SERVER_API_URL + '/system/plug/search-history', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 制作插件 + */ +export async function createPlug(data: Plug) { + const res = await request.post>( + SERVER_API_URL + '/system/plug/plug', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/plug/model/index.ts b/api/system/plug/model/index.ts new file mode 100644 index 0000000..e67242f --- /dev/null +++ b/api/system/plug/model/index.ts @@ -0,0 +1,67 @@ +import type { PageParam } from '@/api'; + +/** + * 插件 + */ +export interface Plug { + plugId?: number; + plugName?: string; + plugCode?: string; + // 菜单id + menuId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 菜单名称 + title?: string; + // 菜单路由地址 + path?: string; + // 菜单组件地址 + component?: string; + // 菜单类型, 0菜单, 1按钮 + menuType?: number; + // 排序号 + sortNumber?: number; + // 权限标识 + authority?: string; + // 菜单图标 + icon?: string; + // 是否隐藏, 0否,1是(仅注册路由不显示左侧菜单) + hide?: number; + // 路由元信息 + meta?: string; + score?: number; + price?: number; + // 创建时间 + createTime?: string; + // 子菜单 + children?: Plug[]; + // 权限树回显选中状态, 0未选中, 1选中 + checked?: boolean; + shortName?: string; + comments?: string; + content?: string; + // + key?: number; + // + value?: number; + // + parentIds?: number[]; + // + openType?: number; + // + userId?: number; + // + appId?: number; + status?: number; + tenantId?: number; +} + +/** + * 插件搜索条件 + */ +export interface PlugParam extends PageParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; +} diff --git a/api/system/role/index.ts b/api/system/role/index.ts new file mode 100644 index 0000000..161ed0e --- /dev/null +++ b/api/system/role/index.ts @@ -0,0 +1,119 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Role, RoleParam } from './model'; +import type { Menu } from '../menu/model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询角色 + */ +export async function pageRoles(params: RoleParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/role/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询角色列表 + */ +export async function listRoles(params?: RoleParam) { + const res = await request.get>( + SERVER_API_URL + '/system/role', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加角色 + */ +export async function addRole(data: Role) { + const res = await request.post>( + SERVER_API_URL + '/system/role', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改角色 + */ +export async function updateRole(data: Role) { + const res = await request.put>( + SERVER_API_URL + '/system/role', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除角色 + */ +export async function removeRole(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/role/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除角色 + */ +export async function removeRoles(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/role/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取角色分配的菜单 + */ +export async function listRoleMenus(roleId?: number) { + const res = await request.get>( + SERVER_API_URL + '/system/role-menu/' + roleId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改角色菜单 + */ +export async function updateRoleMenus(roleId?: number, data?: number[]) { + const res = await request.put>( + SERVER_API_URL + '/system/role-menu/' + roleId, + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/role/model/index.ts b/api/system/role/model/index.ts new file mode 100644 index 0000000..d4c9a50 --- /dev/null +++ b/api/system/role/model/index.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api'; + +/** + * 角色 + */ +export interface Role { + // 角色id + roleId?: number; + // 角色标识 + roleCode?: string; + // 角色名称 + roleName?: string; + sortNumber?: any; + // 备注 + comments?: any; + // 创建时间 + createTime?: string; +} + +/** + * 角色搜索条件 + */ +export interface RoleParam extends PageParam { + roleName?: string; + roleCode?: string; + comments?: string; +} diff --git a/api/system/setting/index.ts b/api/system/setting/index.ts new file mode 100644 index 0000000..65f479c --- /dev/null +++ b/api/system/setting/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Setting, SettingParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询设置 + */ +export async function pageSetting(params: SettingParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/setting/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询设置列表 + */ +export async function listSetting(params?: SettingParam) { + const res = await request.get>( + SERVER_API_URL + '/system/setting', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询 + */ +export async function getSetting(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/setting/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加设置 + */ +export async function addSetting(data: Setting) { + const res = await request.post>( + SERVER_API_URL + '/system/setting', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改设置 + */ +export async function updateSetting(data: Setting) { + const res = await request.put>( + SERVER_API_URL + '/system/setting', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除设置 + */ +export async function removeSetting(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/setting/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除设置 + */ +export async function removeBatchSetting(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/setting/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/setting/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/setting/model/index.ts b/api/system/setting/model/index.ts new file mode 100644 index 0000000..c0bee23 --- /dev/null +++ b/api/system/setting/model/index.ts @@ -0,0 +1,127 @@ +import type { PageParam } from '@/api'; + +/** + * 系统设置 + */ +export interface Setting { + // 公共字段 + settingId?: number; + settingKey?: string; + content?: string; + comments?: string; + tenantName?: string; + tenantId?: string | null; + + // 设置信息 + siteName?: string; + fullName?: string; + tenantCode?: string; + domain?: string; + remarks?: string; + icp?: string; + copyright?: string; + keyword?: string; + phone?: string; + company?: string; + address?: string; + email?: string; + support?: string; + logo?: string; + + // 注册设置 + roleId?: number; + openWxAuth?: number; + openWxBindPhone?: number; + openWxofficialAuth?: number; + openWxofficialBindPhone?: number; + tokenExpireTime?: number; + + // 短信设置 + type?: number; + accessKeyId?: string; + accessKeySecret?: string; + sign?: string; + isNoticeUser?: string; + userTemplateId?: string; + merchantTemplateId?: string; + isNoticeMerchant?: string; + merchantMobiles?: string; + + // 支付设置 + payMethod?: string; + signMode?: string; + alipayAppId?: string; + signType?: string; + appCertPublicKey?: string; + alipayCertPublicKey?: string; + alipayRootCert?: string; + alipayPublicKey?: string; + privateKey?: string; + decryptKey?: string; + balanceIsEnable?: boolean; + wechatIsEnable?: boolean; + alipayIsEnable?: boolean; + wechatType?: string; + mchId?: number; + wechatAppId?: string; + wechatApiKey?: string; + apiclientCert?: string; + apiclientKey?: string; + spAppId?: string; + spMchId?: string; + spApiKey?: string; + spSubAppId?: string; + spSubMchId?: string; + spApiclientCert?: string; + spApiclientKey?: string; + merchantSerialNumber?: string; + + // 微信公众号/小程序设置 + appId?: string; + appSecret?: string; + wxOfficialAccount?: string; + originalId?: string; + + // 企业微信参数 + suiteId?: string; + secret?: string; + corpId?: string; + token?: string; + encodingAESKey?: string; + + // 打印设置 + isOpenPrinter?: string; + printerType?: string; + printerStatus?: string; + printerUser?: string; + printerUserKey?: string; + printerCode?: string; + printerKey?: string; + printerTimes?: string; + + // chatGPT + chatKey?: string; + + // 清除缓存 + clearCache?: string; + + // 主题 + theme?: string; + + // 云存储 + uploadMethod?: any; + fileUrl?: string; + bucketName?: string; + bucketEndpoint?: string; + bucketDomain?: string; + // accessKeyId?: string; 引用上面的 + // accessKeySecret?: string; 引用上面的 +} + +/** + * 系统设置搜索条件 + */ +export interface SettingParam extends PageParam { + settingId?: number; + settingKey?: string; +} diff --git a/api/system/tenant/index.ts b/api/system/tenant/index.ts new file mode 100644 index 0000000..f70e364 --- /dev/null +++ b/api/system/tenant/index.ts @@ -0,0 +1,178 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Tenant, TenantParam } from './model'; +import { Menu } from '@/api/system/menu/model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询租户 + */ +export async function pageTenant(params: TenantParam) { + // 租户列表查询需要传一个key + // params.tenantCode = 'ZAcxbdmDQFwUKC3e'; + const res = await request.get>>( + SERVER_API_URL + '/system/tenant/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询租户资料 + */ +export async function profile(params?: TenantParam) { + const res = await request.get>( + SERVER_API_URL + '/system/tenant/profile', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询租户列表 + */ +export async function listTenant(params?: TenantParam) { + const res = await request.get>( + SERVER_API_URL + '/system/tenant', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询 + */ +export async function getTenant(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/tenant/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加租户 + */ +export async function addTenant(data: Tenant) { + const res = await request.post>( + SERVER_API_URL + '/system/tenant', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改租户 + */ +export async function updateTenant(data: Tenant) { + const res = await request.put>( + SERVER_API_URL + '/system/tenant', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除租户 + */ +export async function removeTenant(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/tenant/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除租户 + */ +export async function removeBatchTenant(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/tenant/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 重置用户密码 + */ +export async function updateTenantPassword( + tenantId?: number, + password = 'gxwebsoft.com' +) { + const res = await request.put>( + SERVER_API_URL + '/system/tenant/password', + { + tenantId, + password + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/tenant/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 租户初始化 + */ +export async function initialization(roleId?: number) { + const res = await request.get>( + SERVER_API_URL + '/system/tenant/role-menu/' + roleId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/tenant/model/index.ts b/api/system/tenant/model/index.ts new file mode 100644 index 0000000..de007b2 --- /dev/null +++ b/api/system/tenant/model/index.ts @@ -0,0 +1,46 @@ +import type { PageParam } from '@/api'; +import { Company } from '@/api/system/company/model'; + +/** + * 租户 + */ +export interface Tenant { + // 租户id + tenantId?: number; + // 租户名称 + tenantName?: string; + // 应用ID + appId?: string; + // 应用秘钥 + appSecret?: string; + // logo + logo?: string; + // 企业名称 + companyName?: string; + // 关联客户ID + companyId?: string; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: number; + // + password?: string; + // 企业信息 + company?: Company | null; +} + +/** + * 租户搜索条件 + */ +export interface TenantParam extends PageParam { + tenantName?: string; + appId?: string; + companyId?: number; + companyName?: string; + version?: string; + province?: string; + city?: string; + tenantCode?: string; +} diff --git a/api/system/url/index.ts b/api/system/url/index.ts new file mode 100644 index 0000000..2a6577d --- /dev/null +++ b/api/system/url/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Url, UrlParam } from './model'; +import {SERVER_API_URL} from '@/config/index'; + +/** + * 分页查询应用域名 + */ +export async function pageUrl(params: UrlParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/url/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询应用域名列表 + */ +export async function listUrl(params?: UrlParam) { + const res = await request.get>( + SERVER_API_URL + '/system/url', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加应用域名 + */ +export async function addUrl(data: Url) { + const res = await request.post>( + SERVER_API_URL + '/system/url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改应用域名 + */ +export async function updateUrl(data: Url) { + const res = await request.put>( + SERVER_API_URL + '/system/url', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除应用域名 + */ +export async function removeUrl(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/url/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除应用域名 + */ +export async function removeBatchUrl(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/url/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询应用域名 + */ +export async function getUrl(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/url/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/url/model/index.ts b/api/system/url/model/index.ts new file mode 100644 index 0000000..e5f74d6 --- /dev/null +++ b/api/system/url/model/index.ts @@ -0,0 +1,37 @@ +import type { PageParam } from '@/api'; + +/** + * 应用域名 + */ +export interface Url { + // 自增ID + id?: number; + // 域名类型 + type?: string; + // 域名 + domain?: string; + // 账号 + account?: string; + // 密码 + password?: string; + // 二维码 + qrcode?: string; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 应用域名搜索条件 + */ +export interface UrlParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/user-collection/index.ts b/api/system/user-collection/index.ts new file mode 100644 index 0000000..cbd1889 --- /dev/null +++ b/api/system/user-collection/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { UserCollection, UserCollectionParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询我的收藏 + */ +export async function pageUserCollection(params: UserCollectionParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/user-collection/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询我的收藏列表 + */ +export async function listUserCollection(params?: UserCollectionParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user-collection', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加我的收藏 + */ +export async function addUserCollection(data: UserCollection) { + const res = await request.post>( + SERVER_API_URL + '/system/user-collection', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改我的收藏 + */ +export async function updateUserCollection(data: UserCollection) { + const res = await request.put>( + SERVER_API_URL + '/system/user-collection', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除我的收藏 + */ +export async function removeUserCollection(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/user-collection/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除我的收藏 + */ +export async function removeBatchUserCollection(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/user-collection/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询我的收藏 + */ +export async function getUserCollection(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/user-collection/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/user-collection/model/index.ts b/api/system/user-collection/model/index.ts new file mode 100644 index 0000000..ebd88c9 --- /dev/null +++ b/api/system/user-collection/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 我的收藏 + */ +export interface UserCollection { + // 主键ID + id?: number; + // 租户ID + tid?: number; + // 用户ID + userId?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 我的收藏搜索条件 + */ +export interface UserCollectionParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/api/system/user-file/index.ts b/api/system/user-file/index.ts new file mode 100644 index 0000000..40f6016 --- /dev/null +++ b/api/system/user-file/index.ts @@ -0,0 +1,89 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { UserFile, UserFileParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询用户文件 + */ +export async function pageUserFiles(params: UserFileParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/user-file/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询用户文件列表 + */ +export async function listUserFiles(params: UserFileParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user-file', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加用户文件 + */ +export async function addUserFile(data: UserFile) { + const res = await request.post>( + SERVER_API_URL + '/system/user-file', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户文件 + */ +export async function updateUserFile(data: UserFile) { + const res = await request.put>( + SERVER_API_URL + '/system/user-file', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除用户文件 + */ +export async function removeUserFile(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/user-file/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除用户文件 + */ +export async function removeUserFiles(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/user-file/batch', + { data } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/user-file/model/index.ts b/api/system/user-file/model/index.ts new file mode 100644 index 0000000..ca51256 --- /dev/null +++ b/api/system/user-file/model/index.ts @@ -0,0 +1,39 @@ +import { PageParam } from '@/api'; + +/** + * 用户文件 + */ +export interface UserFile { + // id + id?: number; + // 用户id + userId?: number; + // 文件名称 + name?: string; + // 是否是文件夹, 0否, 1是 + isDirectory?: number; + // 上级id + parentId?: number; + // 文件存储路径 + path?: string; + // 文件大小 + length?: number; + // 文件类型 + contentType?: string; + // 上传时间 + createTime?: string; + // 文件访问地址 + url?: string; + // 文件缩略图访问地址 + thumbnail?: string; + // 文件下载地址 + downloadUrl?: string; +} + +/** + * 用户文件查询参数 + */ +export interface UserFileParam extends PageParam { + name?: string; + parentId?: number; +} diff --git a/api/system/user-group/index.ts b/api/system/user-group/index.ts new file mode 100644 index 0000000..01e8cbb --- /dev/null +++ b/api/system/user-group/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Group, GroupParam } from '@/api/system/user-group/model'; +import { SERVER_API_URL } from '@/config'; +/** + * 分页查询仓库 + */ +export async function pageGroup(params: GroupParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/user-group/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询仓库列表 + */ +export async function listGroup(params?: GroupParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user-group', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加仓库 + */ +export async function addGroup(data: Group) { + const res = await request.post>( + SERVER_API_URL + '/system/user-group', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改仓库 + */ +export async function updateGroup(data: Group) { + const res = await request.put>( + SERVER_API_URL + '/system/user-group', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 绑定仓库 + */ +export async function bindGroup(data: Group) { + const res = await request.put>( + SERVER_API_URL + '/system/user-group/bind', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量添加设备 + */ +export async function addBatchGroup(data: Group[]) { + const res = await request.post>( + SERVER_API_URL + '/system/user-group/batch', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除仓库 + */ +export async function removeGroup(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/user-group/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除仓库 + */ +export async function removeBatchGroup(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/user-group/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/user-group/model/index.ts b/api/system/user-group/model/index.ts new file mode 100644 index 0000000..dc858cb --- /dev/null +++ b/api/system/user-group/model/index.ts @@ -0,0 +1,23 @@ +import type { PageParam } from '@/api'; + +export interface Group { + groupId?: number; + name?: string; + status?: number; + comments?: any; + sortNumber?: number; + deleted?: number; + tenantId?: number; + createTime?: string; + updateTime?: string; +} + +/** + * 搜索条件 + */ +export interface GroupParam extends PageParam { + groupId?: number; + name?: string; + status?: number; + keywords?: string; +} diff --git a/api/system/user/index.ts b/api/system/user/index.ts new file mode 100644 index 0000000..db453a6 --- /dev/null +++ b/api/system/user/index.ts @@ -0,0 +1,236 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { User, UserParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询用户 + */ +export async function pageUsers(params: UserParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/user/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询用户列表 + */ +export async function listUsers(params?: UserParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询用户列表 + */ +export async function getStaffs(params?: UserParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询用户列表 + */ +export async function getCompanyList(params?: UserParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询用户 + */ +export async function getUser(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/user/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加用户 + */ +export async function addUser(data: User) { + const res = await request.post>( + SERVER_API_URL + '/system/user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户 + */ +export async function updateUser(data: User) { + const res = await request.put>( + SERVER_API_URL + '/system/user', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除用户 + */ +export async function removeUser(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/user/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除用户 + */ +export async function removeUsers(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/user/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateUserStatus(userId?: number, status?: number) { + const res = await request.put>( + SERVER_API_URL + '/system/user/status', + { + userId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改推荐状态 + */ +export async function updateUserRecommend(form) { + const res = await request.put>( + SERVER_API_URL + '/system/user/recommend', + form + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 重置用户密码 + */ +export async function updateUserPassword(userId?: number, password = '123456') { + const res = await request.put>( + SERVER_API_URL + '/system/user/password', + { + userId, + password + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 导入用户 + */ +export async function importUsers(file: File) { + const formData = new FormData(); + formData.append('file', file); + const res = await request.post>( + SERVER_API_URL + '/system/user/import', + formData + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查用户是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/user/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 统计用户余额 + */ +export async function countUserBalance(params?: UserParam) { + const res = await request.get>( + SERVER_API_URL + '/system/user/countUserBalance', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/user/model/count.ts b/api/system/user/model/count.ts new file mode 100644 index 0000000..82442c2 --- /dev/null +++ b/api/system/user/model/count.ts @@ -0,0 +1,15 @@ +import type { PageParam } from '@/api'; + +/** + * 用户 + */ +export interface Count { + balance?: string; +} + +/** + * 用户搜索条件 + */ +export interface UserParam extends PageParam { + organizationId?: number; +} diff --git a/api/system/user/model/index.ts b/api/system/user/model/index.ts new file mode 100644 index 0000000..83b9513 --- /dev/null +++ b/api/system/user/model/index.ts @@ -0,0 +1,155 @@ +import type { PageParam } from '@/api'; +import type { Role } from '../../role/model'; +import type { Menu } from '../../menu/model'; + +/** + * 用户 + */ +export interface User { + // 账号类型 + type?: number; + // 用户id + userId?: number; + // 账号 + username?: string; + // 密码 + password?: string; + password2?: string; + oldPassword?: string; + // 昵称 + nickname?: string; + openId?: string; + sessionKey?: string; + // 别名 + alias?: string; + // 头像 + avatar?: string; + // 性别(字典) + sex?: string; + // 手机号 + phone?: string; + // 脱敏手机号 + mobile?: string; + // 邮箱 + email?: string; + // 出生日期 + birthday?: string; + age?: number; + // 详细地址 + address?: string; + longitude?: string; + latitude?: string; + // 会员等级ID + gradeId?: number; + // 个人简介 + introduction?: string; + // 机构id + organizationId?: number; + // 状态, 0正常, 1冻结 + status?: number; + // 性别名称 + sexName?: string; + province?: string; + city?: string; + region?: string; + // 机构名称 + organizationName?: string; + // 角色列表 + roles?: Role[]; + roleCode?: string; + roleId?: number; + roleName?: string; + // 权限列表 + authorities?: Menu[]; + payTime?: string; + deliveryTime?: string; + receiptTime?: string; + merchantId?: number; + merchantName?: string; + merchantAvatar?: string; + // 可管理的商户 + merchants?: string; + // 创建时间 + createTime?: string; + // 租户ID + tenantId?: number; + // 租户名称 + tenantName?: string; + logo?: string; + companyId?: number; + companyInfo?: any; + planId?: number; + code?: string; + smsCode?: string; + // + remember?: boolean; + balance?: number; + points?: number; + payMoney?: number; + setting?: string; + realName?: string; + companyName?: string; + gradeName?: string; + idCard?: string; + comments?: string; + recommend?: number; + system?: any; + // 头像地址 + avatarUrl?: string; + // 1男,2女 + gender?: string; + // 国家 + country?: string; + // 邮箱是否验证, 0否, 1是 + emailVerified?: number; + // 注册时间 + addTime?: number; + // + idcard?: string; + // + truename?: string; + // 是否超级管理员 + isSuperAdmin?: boolean; + // 是否管理员:1是;2否 + isAdmin?: boolean; + // 是否同意注册协议 + isAgree?: boolean; + // 客户端ID + clientId?: string; + // 注册来源客户端 (APP、H5、小程序等) + platform?: string; + // 排序 + sortNumber?: number; + deleted?: number; + // 实名认证状态 + certification?: boolean; + // 实名认证类型 + certificationType?: number; +} + +/** + * 用户搜索条件 + */ +export interface UserParam extends PageParam { + keywords?: any; + type?: any; + userId?: number; + username?: string; + nickname?: string; + realName?: string; + gradeId?: unknown; + gradeName?: string; + companyName?: string; + city?: string; + cityMate?: string; + sex?: string; + phone?: string; + status?: number; + organizationId?: number; + parentId?: number; + sexName?: string; + roleId?: string; + isAdmin?: number; + showProfile?: boolean; + isStaff?: boolean; +} diff --git a/api/system/version/index.ts b/api/system/version/index.ts new file mode 100644 index 0000000..172673c --- /dev/null +++ b/api/system/version/index.ts @@ -0,0 +1,119 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Version, VersionParam } from './model'; +import type { Menu } from '../menu/model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询角色 + */ +export async function pageVersion(params: VersionParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/version/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询角色列表 + */ +export async function listVersion(params?: VersionParam) { + const res = await request.get>( + SERVER_API_URL + '/system/version', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加角色 + */ +export async function addVersion(data: Version) { + const res = await request.post>( + SERVER_API_URL + '/system/version', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改角色 + */ +export async function updateVersion(data: Version) { + const res = await request.put>( + SERVER_API_URL + '/system/version', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除角色 + */ +export async function removeVersion(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/version/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除角色 + */ +export async function removeVersions(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/version/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取角色分配的菜单 + */ +export async function listVersionMenus(versionId?: number) { + const res = await request.get>( + SERVER_API_URL + '/system/version-menu/' + versionId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改角色菜单 + */ +export async function updateVersionMenus(versionId?: number, data?: number[]) { + const res = await request.put>( + SERVER_API_URL + '/system/version-menu/' + versionId, + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/version/model/index.ts b/api/system/version/model/index.ts new file mode 100644 index 0000000..8899e2f --- /dev/null +++ b/api/system/version/model/index.ts @@ -0,0 +1,26 @@ +import type { PageParam } from '@/api'; + +export interface Version { + id?: number; + versionName?: string; + versionCode?: string; + vueDownloadUrl?: string; + androidDownloadUrl?: string; + iosDownloadUrl?: string; + updateInfo?: any; + isHard?: boolean; + isHot?: boolean; + status?: number; + comments?: string; + tenantId?: number; + createTime?: string; +} + +/** + * 角色搜索条件 + */ +export interface VersionParam extends PageParam { + versionName?: string; + versionCode?: string; + comments?: string; +} diff --git a/api/system/website/field/index.ts b/api/system/website/field/index.ts new file mode 100644 index 0000000..ed3cac1 --- /dev/null +++ b/api/system/website/field/index.ts @@ -0,0 +1,146 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { + Config, + WebsiteField, + WebsiteFieldParam +} from "@/api/cms/website/field/model"; +import { MODULES_API_URL } from '@/config'; + +/** + * 分页查询项目参数 + */ +export async function pageWebsiteField(params: WebsiteFieldParam) { + const res = await request.get>>( + MODULES_API_URL + '/cms/website-field/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目参数列表 + */ +export async function listWebsiteField(params?: WebsiteFieldParam) { + const res = await request.get>( + 'https://modules.gxwebsoft.com/api/cms/website-field', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询项目参数 + */ +export async function getWebsiteField(id: number) { + const res = await request.get>( + MODULES_API_URL + '/cms/website-field/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加项目参数 + */ +export async function addWebsiteField(data: WebsiteField) { + const res = await request.post>( + MODULES_API_URL + '/cms/website-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改项目参数 + */ +export async function updateWebsiteField(data: WebsiteField) { + const res = await request.put>( + MODULES_API_URL + '/cms/website-field', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除项目参数 + */ +export async function removeWebsiteField(id?: number) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website-field/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除项目参数 + */ +export async function removeBatchWebsiteField(data: (number | undefined)[]) { + const res = await request.delete>( + MODULES_API_URL + '/cms/website-field/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + MODULES_API_URL + '/cms/website-field/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询项目参数列表 + */ +export async function configWebsiteField(params?: WebsiteFieldParam) { + const res = await request.get>( + 'https://modules.gxwebsoft.com/api/cms/website-field/config', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/website/field/model/index.ts b/api/system/website/field/model/index.ts new file mode 100644 index 0000000..157263b --- /dev/null +++ b/api/system/website/field/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 网站参数 + */ +export interface WebsiteField { + id?: number; + name?: string; + value?: string; + comments?: string; + userId?: number; + websiteId?: number; + status?: any; + sortNumber?: any; + createTime?: string; +} + +/** + * 网站参数搜索条件 + */ +export interface WebsiteFieldParam extends PageParam { + id?: number; + userId?: number; + websiteId?: number; +} diff --git a/api/system/website/index.ts b/api/system/website/index.ts new file mode 100644 index 0000000..fbfdecf --- /dev/null +++ b/api/system/website/index.ts @@ -0,0 +1,169 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Website, WebsiteParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 获取网站信息 + */ +export async function getSiteInfo() { + const res = await request.get>( + SERVER_API_URL + '/system/website/getSiteInfo' + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 清除缓存 + */ +export async function removeSiteInfoCache(key?: string) { + const res = await request.delete>( + SERVER_API_URL + '/system/website/clearSiteInfo/' + key + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 分页查询网站 + */ +export async function pageWebsite(params: WebsiteParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/website/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询网站列表 + */ +export async function listWebsite(params?: WebsiteParam) { + const res = await request.get>( + SERVER_API_URL + '/system/website', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加网站 + */ +export async function addWebsite(data: Website) { + const res = await request.post>( + SERVER_API_URL + '/system/website', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改网站 + */ +export async function updateWebsite(data: Website) { + const res = await request.put>( + SERVER_API_URL + '/system/website', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除网站 + */ +export async function removeWebsite(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/website/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除网站 + */ +export async function removeBatchWebsite(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/website/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateWebsiteStatus(websiteId?: number, status?: number) { + const res = await request.put>( + SERVER_API_URL + '/system/website/status', + { + websiteId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询网站 + */ +export async function getWebsite(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/website/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/website/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/website/model/index.ts b/api/system/website/model/index.ts new file mode 100644 index 0000000..8dfc0da --- /dev/null +++ b/api/system/website/model/index.ts @@ -0,0 +1,58 @@ +import { WebsiteField } from '@/api/cms/website/field/model'; +import { Navigation } from '@/api/cms/navigation/model'; +import { Link } from '@/api/cms/link/model'; +import { ArrangeCategory } from '@/api/cms/category/model'; + +/** + * 菜单 + */ +export interface Website { + websiteId?: number; + websiteName?: string; + websiteCode?: string; + websiteIcon?: string; + websiteLogo?: string; + websiteDarkLogo?: string; + keywords?: string; + address?: string; + phone?: string; + email?: string; + websiteType?: string; + expirationTime?: string; + templateId?: string; + industryParent?: string; + industryChild?: string; + companyId?: number; + domain?: string; + icpNo?: string; + policeNo?: string; + comments?: string; + sortNumber?: number; + createTime?: string; + disabled?: boolean; + country?: string; + province?: string; + recommend?: number; + city?: string; + region?: string; + appId?: number; + fields?: WebsiteField[]; + status?: number; + tenantId?: number; + tenantName?: string; + navigations?: Navigation[]; + categoryList?: ArrangeCategory[]; + links?: Link[]; + // 配置信息 + config?: any; +} + +/** + * 菜单搜索参数 + */ +export interface WebsiteParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; +} diff --git a/api/system/white-domain/index.ts b/api/system/white-domain/index.ts new file mode 100644 index 0000000..ccce67d --- /dev/null +++ b/api/system/white-domain/index.ts @@ -0,0 +1,146 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { WhiteDomain, WhiteDomainParam } from './model'; +import { SERVER_API_URL } from '@/config'; + +/** + * 分页查询服务器白名单 + */ +export async function pageWhiteDomain(params: WhiteDomainParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/white-domain/page', + { + params + } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 查询服务器白名单列表 + */ +export async function listWhiteDomain(params?: WhiteDomainParam) { + const res = await request.get>( + SERVER_API_URL + '/system/white-domain', + { + params + } + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加服务器白名单 + */ +export async function addWhiteDomain(data: WhiteDomain) { + const res = await request.post>( + SERVER_API_URL + '/system/white-domain', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改服务器白名单 + */ +export async function updateWhiteDomain(data: WhiteDomain) { + const res = await request.put>( + SERVER_API_URL + '/system/white-domain', + data + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 删除服务器白名单 + */ +export async function removeWhiteDomain(id?: number) { + const res = await request.delete>( + SERVER_API_URL + '/system/white-domain/' + id + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量删除服务器白名单 + */ +export async function removeBatchWhiteDomain(data: (number | undefined)[]) { + const res = await request.delete>( + SERVER_API_URL + '/system/white-domain/batch', + { + data + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 修改用户状态 + */ +export async function updateWhiteDomainStatus( + docsId?: number, + status?: number +) { + const res = await request.put>( + SERVER_API_URL + '/system/white-domain/status', + { + docsId, + status + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 根据id查询服务器白名单 + */ +export async function getWhiteDomain(id: number) { + const res = await request.get>( + SERVER_API_URL + '/system/white-domain/' + id + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 检查IP是否存在 + */ +export async function checkExistence( + field: string, + value: string, + id?: number +) { + const res = await request.get>( + SERVER_API_URL + '/system/white-domain/existence', + { + params: { field, value, id } + } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/api/system/white-domain/model/index.ts b/api/system/white-domain/model/index.ts new file mode 100644 index 0000000..8a231df --- /dev/null +++ b/api/system/white-domain/model/index.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api'; + +/** + * 服务器白名单 + */ +export interface WhiteDomain { + // 自增ID + id?: number; + // 域名 + domain?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; +} + +/** + * 服务器白名单搜索条件 + */ +export interface WhiteDomainParam extends PageParam { + id?: number; + domain?: string; +} diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..1c1d1e8 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,122 @@ +* { + margin: 0; + padding: 0; +} + +body { + margin: 0; + font-family: Inter, "Inter Fallback: Arial",ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji; + font-size: 15px; + line-height: 1.4rem; +} + +ul, li { + list-style: none; +} + +a { + text-decoration: none; + color: #333333; +} + +a:hover{ + color: #cf1313; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; +} + +.flex { + display: flex; +} + +.container { + margin: 0 auto; +} + +@media (max-width: 768px){ + .container { + width: auto; + margin: 0 auto; + overflow: hidden; + } +} + +.between { + display: flex; + justify-content: space-between; +} + +.column { + flex-direction: column; +} + +.items-center { + display: flex; + align-items: center; +} + +.text-overflow { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + white-space: nowrap; +} + +.mt-10 { + margin-top: 10px; +} + +.ml-10 { + margin-left: 10px; +} + +.mr-10 { + margin-right: 10px; +} + +.mb-10 { + margin-bottom: 10px; +} + +.mt-20 { + margin-top: 20px; +} + +.mr-20 { + margin-right: 20px; +} + +.mb-20 { + margin-bottom: 20px; +} + +.clearfix:after { + content: ''; + display: block; + clear: both; +} + +.grey { + color: grey; +} + +.red { + color: #ff0000; +} + +.qr_code { + border: 1px solid #eee; + border-radius: 5px; + padding: 45px 0; +} + +.bg-fff { + background: #ffffff; +} + +.link-color { + color: dodgerblue; +} diff --git a/assets/images/icon_1.png b/assets/images/icon_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff32a9ba5e4db1524050de2355153b13a4871ce GIT binary patch literal 1503 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDi`WNG5)>f~za=4$C;Xy|HgVdiY)Xl(9cU}9`$ z=v4~Pj*wm=R%;iu*SQ+p9GS!*(y{$yZa3ifny45_%4 z^ymM7`@;?lV#30c85C?eJ6IcLTw9mG@<`ty<`|QT7=xj`tnF#;BcC0`HaoIzWB8c7 zVs!?i!$M8QBaIGcST_9-7btGp!++$ur|H`>GmTwVv%0Mox$OT6&7^bDF=dnu7ak8C2I&&eb!2TA_f0hBv$xSwbd`Biaz01Jxxy{dU!jwtlhULWcL%L z!?XSEJFgu%a^l1hmtLDqzYi6&&0qGHXZyT5CA}9CimV(*8@lJVDqeJ*>FCqY9MLVQ zx$TBy_?(3*0o{%*{c~H69P*fWRDSiLk{N%_q*Qq7Z~6aUUESKyft$H>!BY2=t91Vv zPe|ElBCwzRk%&TH!?d{WlUshsYl_*k{1obVuGG1fAv9n~)SvhN>nG{d@#$7SJg_L` zxc!Rv@q)<*?$`gnuPm;xLFlFC%+5D@0?~{gBbi>Ei`(=6p7^v4krTZ1`4z;}u7)jG zf6zplJJ@ql_ol^*So*mQ;#Y4pF#PoY=lB1Yx6iN7yI23S^!=W@<=_7P`s~j?Z)s0& z@BfP%b~f+6!SYCw`NFPPF0NNP3irH@PkSbwV4W+x=E*Iub(%{|z6EsoCdf>_ns(@6 z$Nwcq3^yjo3DmPck`IuQY(7%QFnfJ=$Gbxlf_^g^S_@`%aPMk-wS|#If+2X)^v^YC R{NzDJuBWS?%Q~loCIFmTBcT8Q literal 0 HcmV?d00001 diff --git a/assets/images/icon_12.png b/assets/images/icon_12.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa98fb5573546c607e5a1d5bd7f1e8917d26388 GIT binary patch literal 1965 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkcW^8Qe>g4R==4$C`Xy|J0Xkg~*WN2n$YG`C> z=4j#q)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GS&P`{3o|gVD0;d$hE&|z zGQH9x#8KvW`uynZm9HmeS0+qPyRdMnY}+!&cDLzliV}i%-KHm)i%b=DS$Na6EFh!2 zK1ICDAuv*`EMmgli?Xj)%?MkxwzmHD`;#fJckO;~pnc}|w0kwr|33R(x4&}MhYtl0 z9U^(d8f_DD0|NsW?-kZ4>$~2dvw`)6qs)s(Cr-T;J;&C)^tHo-oA(Y?ACw7TE^F-n zv(53X<{p+M1=Y;)_77jb_$DOBT2}De;KsSPN$ZZgySVJQrM)J1@qXhQ#~yPzuDVjr zr^CKbK`ds;>lJpL9YW)j`7JxO;*)9=D< z9FrHn*kQ}Cq_En!!i{&2qj65J)&=>L4>#g2)ifVa?a<$<<|9|_ZIsTX|H$x0Zst{i z<=f-be>P3n^M~g|YOhbn`i&}Yjz0Uydb#4hkZSv?>|A{Xzxmf{47ewMpE&O}e_Dg{ zs;d|5mo6=^nLVwG-+kG-2eKA-r?orTNZ(0GFJ{+27|gen`(UcvEXKn6Vh)!zWo~o% zlXhHQqL)!J$qvH)W(-j&Q890dF7e57l~WtYw!NJ`7S~E z*EQ{&YZBjLqE=cyD8Hhml(!+?UraQ{pXK;L=9`@cg(9mK*HkjfWF}60|E42EEU{*T zlIy(e!_IrmUs;!5m|=c*>tc>ixu$vnUc1A8?^evHh_b8IOTT&K{6Qv;nL0MboHdE{ zQp-Q6I9<$$OFh@?Vfv!f_xHMs9Q+;8ns!(1U!ULfe3JbhhLZw+Z*|GnOgQu=K~LEHn>2SZ6%@c2r}j6Em+~{skQd&KZ9^rRyRV)x8$sVqRgYb7Zz% z*+i2~?Hr$qh3(|drLeBvyu%{<=*y`WrxvWMkajNNy*_t~Ouuj3x?T5j5)D;uth*zZ zbvz<}owi8dey`?}OT_y`XNPh6t9}0Z^t8W9jMv&rtL~ffaY^UOxCiDcY=5scC-unR z=})inaf#oy&}&@$DE(BFN=@%OyNcYBze#^yb`Ay!@10pBS+XwLs(3BK zl$Am2?EXEA4G8*XYiM-AqHMx?#T)0(Ht!8LeS7lSJ&~rw98Rmf79VeBE4mc_|7pA+ zUc&C!3jT9XK2NHeq;UDpvnl0V$@P%}iz9q93wcx-9vqAPa)-+%_{V*H&&90ihg`n2 zPdKxDqQOdSuE`=EkI!_w`L^%#ytJdbCgzlL{o1p~qj~=0QK5e$o lXN_DYP#h9jJZV1@55x63$7_#6C*A;6pq{RNF6*2UngA|Q7$^V$ literal 0 HcmV?d00001 diff --git a/assets/images/icon_2.png b/assets/images/icon_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a00e29be2e9f56e9282b433168da14006e8c742f GIT binary patch literal 1852 zcmaJ?Yfuws6b+!LAU^O_1aS#afHtf!LWE?K%?4rs6>1Ps zQLu=hh=5YWii&7aP_crFNQ+7pv{t7Q6(1FRfDo(Qs9=AT?(FXOm~+m(_q%6jH-#(> zw6U6NMIaDtgaR-OA0184L`(eb<5g3R4|W(o5(`IGVJQ#_6P8GkI2aJhp?Ek9hNNp$ ztuTi`upr9BkyxZCm@Pr%WXOaeYvoFuO(1amv`R>l2xCAT94}LFi7y(?5doQ$ON?NM zyhKWWI6)@Rp>VivsaT>*l(3{kKVN{OW#a;J7=r+%I+NKbJj}R=8 zOZ=2nq$mXNM^G4Gkm;ThFDeyaGRf3M3?`H60nogtG>R8~Gd-z`*bF9{<_&zlhqKb0U?j>;<3pN|PYFp3sZQmAAvQ%NI0k?8-Sa``A)jfKHq z^8HU?wRnvZri8(2M1xB3#;tNTg;KKpQ5eDyRE!`=Bc~XWfMAF^0Z{_};Y@%OAyY_^ z6t(+Dyhy|rD%2RHkibHaOT-n(GMSVO@@RCB!Q%(;Ss<0l_vZ1L4F4re9v$@O(HF72 zN4Ov&(a2#1Ho}#D;RcM!HCaKf#3O?+Doci?0VpB|K9vi&5jl3f%1|ZtG``@mcuSa#RQ|5o>SPE&o<96Po!xJ|*eK z;iGLk;r&_Duh~RdPg)RT?tW-v&X#=L!kkR<>y98ws7pYHzG`Fi{$QuAq>yZ~OH{2B zZ+Wzeek?h(p}t4g{oJRm$Z$`Uob18vQ@t-zuR8nTotj)xe^*h~dM7{4zSB3>Z@YCp z!LMjNZ69YaNh1*a*{|IYjiTu6#lKl>UT^-EbIaJ}a{WMvO_N3JgdJ8lecrCMFuLa3 z0@ea^-ByPrTleQ3p7wzkdD8{F0UaF$8|?wmnkuaW^7!a zaUSXh*BajK*(=tcZYjicE&WWv)H&Dbx(k;R1X!B=%#xb2E=zI0&fh&nQ$z_`5|y}f9J3;U!P;Kvx;(xz;ATs~ zd_KuxMpIOYaTZ|r*m9}s72jDeif;}2ki@%fB|wf{Yc=Wj@7;^fh{{hqDkP=eoz*?L zZKeC|=XKwlZ8UrRVDCalw>}X|<>lAa)$P|_L&_%IypY>omF!x)GS{Vn#61)0p_Etu}p$2)B7DgD|b$GJ7@WzJtU!aMT~IP8lw0NM zf6i4mMC8EM@j3S&?<#Xk1EW^gUf%VhQ&E6En%i_t(SnXY)gM92cZ#)9+E1*~LK|93 zxPj98Jhc?^_L}|9X-nd!WKR7SXyZx+VmCbGJ^iZAakypljGhn8J!=yK5`s6j~8AqxNZH>@e z0@T=O7MLz1R`i^md}dqb@QEkG8(GBkjO-J=F)aa_obq`EnP@dfa(t-rM$aw7x|Z`joxQg|Sa}gD W)O7g+H@MjJKNIqof;GI@%zpp{zUrp{ literal 0 HcmV?d00001 diff --git a/assets/images/icon_26.png b/assets/images/icon_26.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecc9e59a962bacdcccb79d387f68d1d2b73251c GIT binary patch literal 2151 zcmaJ?X;c&E8V*H3Ls=A3K&}#lA|Pae5Fik?1T<&@1{4s1gk*pS$)uBsApr`4idqD> zi_}((g5nC6O_9ZW%hCd}SXr)M^@xH z>t?_mh0??cgG1p^);2016ybSl3_ejLLD(piyJw<=$BzeKY%~xn6w`2H)pv1Np@4=9 zabgi!5;_nk+@gelASFAPuZ-ur3UHntSocIKA|L`_9yU>wAeK@SX}FKNRAjE+Cg89i zA#gkm_g7M(tUxRsgaE7)-qD^fj~rFiam);b)rxmoUxxC z91;x@#85d5zfZA{6%7{$!xAciAeYPWaz{J}#S%!auC8hg2M2ouVJ}sPVP2xWSZcYb zzyPFtNGO4Ypct!GQE9Y9RheT2nB;+!eSKz<3Jdc#(@$nJ&1y} z4iSn4pj>M65zk^#nPMr-6Y~KkgN8#C@Is-0>O%G*J5tDWKVNU8>b}n2&W>bnii6C5V zfbq{ADH=6j=vSHeS8w7x_Z`*J3|nTCS{^!e1DiGUsBgHIQeF`=lewu3-g)iE$9dsH zocoxbEU51%ul=pE7VI*cOA&bXZBqjD6p9*762Fkkt6K(jCK96B$KE}9A@{gDHQz4H z*J*2LSk~s(dhcG=K83MTe;2xup3=EJ&Z0|Lv8%Qvu`MA@BSODScb9q0f5JP(TE*uM zSX*Rz930yEF6=Vqj>g3aqP2$7WYR0?Lr6o~C8qKBh1blldNIJvtk%q#RsOlf7*lDa znOH%jn0Df3*fzh)wEMJ+Dr_Uj^Z*~yRZDHS+D=z%cIC!yvg*-SM@EA%Bvna$jpePQ zjaBlq5AUo?Sy7z&t}7wHaI;?Ly34C3Z8}Cm#)6acxRV#>x=wN3#|`hzC9k1vUTFPL z`U9g(_`2s9Z$;@hVI|&;fg#5XYM=Ywf!FLXBBdIM_DA;5Oy~YEH%4rCvh~cWs)f)0 z4nj%E^PKW%l8LR-t7jtPOC55~w+A0d=M49(&~2i}?fj2w%>Q2F;cWlJ#i01&sCiY5D%Wns=I>A-r*p*FCxWUoa&#w zJM3m%K5bBaxhyu%?)0oM{C?@Z_u)|K5qU3l;=%2%vHG-Zow`)ho0=mBIA`$zD#teW zoY%}F1+R>a2Jx)I(2RWdLuaCfxBP~o%AVTVGu{wrxtv2!<6UT|S7@0BCePxRYoNT- z(o7e1csyKt^#!=FJMN2&sECvPO^WSr!lpM+d$NV5VfDl(PDZZB)w%s#x#$vIk>#OshpY^>IVE4Ziv zE`=WD_4C(vf8>Gx7BWHtQ`*^1_Pz6HvDLN`{x6u@=L}qKne+3#cW@uexNm(*tUa)i zJ~}NuMHoTR>MNyh(bF0O(=6`Q!>`G{bEgB@%Jc<|$OlE?%J;n)YUu^cz8&&?%l;jX$6h?Psm=Cl`7$j(J{lx0Y$s!uy|$^Wnnx%ux1Y> zRx9DzugkyN@v5Wd*5tzx-;3K?Q>sceE(=?nJ=X1|{i6h}IoLNRH9TbinWN?f)K2a= z$(1P~V^G)Y8kH`XOQYAEQL zeQBy6_pIHf>=t5kV&pToE~{gq4>kG$5U(0pk(b$o{EL#M3lhgzUP+w R9HRQ_XZo@k#Xj8hKLH(|ccTCR literal 0 HcmV?d00001 diff --git a/assets/images/icon_30.png b/assets/images/icon_30.png new file mode 100644 index 0000000000000000000000000000000000000000..02aedb5c24eb79f396b8a85986a8c4fff4ec4d07 GIT binary patch literal 1496 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkc?CNG>;A(8>=IRIxbyssIHv>}(M+0+1H!}+} z6DJFpUYGpj(%jU%5}4i;gkB?@dO=Acw*Y9fOKMSOS!#+~QGTuh*vnR#INf68hSNN# z-W1$!F~F%;ALtl;P{bldG)xGXdO%EgvITPB2|qOtnA(eg$y#^Qmo*FwOg^42jv*Dd z-b}mi9h@j}e7MCTue-2Bv<53jVVT=@MUa{#;70kav5?+<7M_&1r`U4PoCeNaY% z@vV-R&GyeTCYxN9ok>T5@i*C}^YPxgMuCY>NqxP9wcRhRfi z=?8k(-)Vk0y}H)=W3!sL(iESSQ>G^`dm1o@ttu6 zKcjy@>Nszg&?)QdCNCHkahta)%3Qv&v#s#Xs@@wx!Ct&q{i1mPFAO^BbS|4UeXrqR zoBfQ*3wYKPr%%?rEYH#68kY7{?X-c*w5*M(tNw3lT=B=xZL>)4roF3+3ceAm;IJ!@mucXbU;g=Tg4sczWAV!rb2$EgKUB{u!SF+WA@82Whi`$( NT2EI$mvv4FO#rksG8q5> literal 0 HcmV?d00001 diff --git a/assets/images/jlt.png b/assets/images/jlt.png new file mode 100644 index 0000000000000000000000000000000000000000..e410edea3183245cec4f697229e18701f339c7d7 GIT binary patch literal 66411 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 H7V+NzFljIk literal 0 HcmV?d00001 diff --git a/assets/images/toux.png b/assets/images/toux.png new file mode 100644 index 0000000000000000000000000000000000000000..33f572d9df7257226184e5a766dd64873aff64fa GIT binary patch literal 31134 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 literal 0 HcmV?d00001 diff --git a/assets/json/china-provinces.geo.json b/assets/json/china-provinces.geo.json new file mode 100644 index 0000000..be70ca7 --- /dev/null +++ b/assets/json/china-provinces.geo.json @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":"65","size":"550","name":"新疆","cp":[84.9023,42.148],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7588],[96.416,42.7148],[95.9766,42.4951],[96.0645,42.3193],[96.2402,42.2314],[95.9766,41.9238],[95.2734,41.6162],[95.1855,41.792],[94.5703,41.4844],[94.043,41.0889],[93.8672,40.6934],[93.0762,40.6494],[92.6367,39.6387],[92.373,39.3311],[92.373,39.1113],[92.373,39.0234],[90.1758,38.4961],[90.3516,38.2324],[90.6152,38.3203],[90.5273,37.8369],[91.0547,37.4414],[91.3184,37.0898],[90.7031,36.7822],[90.791,36.6064],[91.0547,36.5186],[91.0547,36.0791],[90.8789,36.0352],[90,36.2549],[89.9121,36.0791],[89.7363,36.0791],[89.209,36.2988],[88.7695,36.3428],[88.5938,36.4746],[87.3633,36.4307],[86.2207,36.167],[86.1328,35.8594],[85.6055,35.6836],[85.0781,35.7275],[84.1992,35.376],[83.1445,35.4199],[82.8809,35.6836],[82.4414,35.7275],[82.002,35.332],[81.6504,35.2441],[80.4199,35.4199],[80.2441,35.2881],[80.332,35.1563],[80.2441,35.2002],[79.8926,34.8047],[79.8047,34.4971],[79.1016,34.4531],[79.0137,34.3213],[78.2227,34.7168],[78.0469,35.2441],[78.0469,35.5078],[77.4316,35.4639],[76.8164,35.6396],[76.5527,35.8594],[76.2012,35.8154],[75.9375,36.0352],[76.0254,36.4746],[75.8496,36.6943],[75.498,36.7383],[75.4102,36.958],[75.0586,37.002],[74.8828,36.9141],[74.7949,37.0459],[74.5313,37.0898],[74.5313,37.2217],[74.8828,37.2217],[75.1465,37.4414],[74.8828,37.5732],[74.9707,37.749],[74.8828,38.4521],[74.3555,38.6719],[74.1797,38.6719],[74.0918,38.54],[73.8281,38.584],[73.7402,38.8477],[73.8281,38.9795],[73.4766,39.375],[73.916,39.5068],[73.916,39.6826],[73.8281,39.7705],[74.0039,40.0342],[74.8828,40.3418],[74.7949,40.5176],[75.2344,40.4297],[75.5859,40.6494],[75.7617,40.2979],[76.377,40.3857],[76.9043,41.001],[77.6074,41.001],[78.1348,41.2207],[78.1348,41.3965],[80.1563,42.0557],[80.2441,42.2754],[80.1563,42.627],[80.2441,42.8467],[80.5078,42.8906],[80.4199,43.0664],[80.7715,43.1982],[80.4199,44.165],[80.4199,44.6045],[79.9805,44.8242],[79.9805,44.9561],[81.7383,45.3955],[82.0898,45.2197],[82.5293,45.2197],[82.2656,45.6592],[83.0566,47.2412],[83.6719,47.0215],[84.7266,47.0215],[84.9023,46.8896],[85.5176,47.0654],[85.6934,47.2852],[85.5176,48.1201],[85.7813,48.4277],[86.5723,48.5596],[86.8359,48.8232],[86.748,48.9551],[86.8359,49.1309],[87.8027,49.1748],[87.8906,48.999],[87.7148,48.9111],[88.0664,48.7354],[87.9785,48.6035],[88.5059,48.3838],[88.6816,48.1641],[89.1211,47.9883],[89.5605,48.0322],[89.7363,47.8564],[90.0879,47.8564],[90.3516,47.6807],[90.5273,47.2412],[90.8789,46.9775],[91.0547,46.582],[90.8789,46.3184],[91.0547,46.0107],[90.7031,45.7471],[90.7031,45.5273],[90.8789,45.2197],[91.582,45.0879],[93.5156,44.9561],[94.7461,44.3408],[95.3613,44.2969],[95.3613,44.0332],[95.5371,43.9014],[95.8887,43.2422],[96.3281,42.9346],[96.416,42.7588]]]}},{"type":"Feature","properties":{"id":"54","size":"550","name":"西藏","cp":[87.8695,31.6846],"childNum":7},"geometry":{"type":"Polygon","coordinates":[[[79.0137,34.3213],[79.1016,34.4531],[79.8047,34.4971],[79.8926,34.8047],[80.2441,35.2002],[80.332,35.1563],[80.2441,35.2881],[80.4199,35.4199],[81.6504,35.2441],[82.002,35.332],[82.4414,35.7275],[82.8809,35.6836],[83.1445,35.4199],[84.1992,35.376],[85.0781,35.7275],[85.6055,35.6836],[86.1328,35.8594],[86.2207,36.167],[87.3633,36.4307],[88.5938,36.4746],[88.7695,36.3428],[89.209,36.2988],[89.7363,36.0791],[89.3848,36.0352],[89.4727,35.9033],[89.7363,35.7715],[89.7363,35.4199],[89.4727,35.376],[89.4727,35.2441],[89.5605,34.8926],[89.8242,34.8486],[89.7363,34.6729],[89.8242,34.3652],[89.6484,34.0137],[90.0879,33.4863],[90.7031,33.1348],[91.4063,33.1348],[91.9336,32.8271],[92.1973,32.8271],[92.2852,32.7393],[92.9883,32.7393],[93.5156,32.4756],[93.7793,32.5635],[94.1309,32.4316],[94.6582,32.6074],[95.1855,32.4316],[95.0098,32.2998],[95.1855,32.3438],[95.2734,32.2119],[95.3613,32.168],[95.3613,31.9922],[95.4492,31.8164],[95.8008,31.6846],[95.9766,31.8164],[96.1523,31.5967],[96.2402,31.9482],[96.5039,31.7285],[96.8555,31.6846],[96.7676,31.9922],[97.2949,32.0801],[97.3828,32.5635],[97.7344,32.5195],[98.1738,32.3438],[98.4375,31.8604],[98.877,31.4209],[98.6133,31.2012],[98.9648,30.7617],[99.1406,29.2676],[98.9648,29.1357],[98.9648,28.8281],[98.7891,28.8721],[98.7891,29.0039],[98.7012,28.916],[98.6133,28.5205],[98.7891,28.3447],[98.7012,28.2129],[98.3496,28.125],[98.2617,28.3887],[98.1738,28.125],[97.5586,28.5205],[97.2949,28.0811],[97.3828,27.9053],[97.0313,27.7295],[96.5039,28.125],[95.7129,28.2568],[95.3613,28.125],[95.2734,27.9492],[94.2188,27.5537],[93.8672,27.0264],[93.6035,26.9385],[92.1094,26.8506],[92.0215,27.4658],[91.582,27.5537],[91.582,27.9053],[91.4063,28.0371],[91.0547,27.8613],[90.7031,28.0811],[89.8242,28.2129],[89.6484,28.1689],[89.1211,27.5977],[89.1211,27.334],[89.0332,27.2021],[88.7695,27.4219],[88.8574,27.9932],[88.6816,28.125],[88.1543,27.9053],[87.8906,27.9492],[87.7148,27.8174],[87.0996,27.8174],[86.748,28.125],[86.5723,28.125],[86.4844,27.9053],[86.1328,28.125],[86.0449,27.9053],[85.6934,28.3447],[85.6055,28.2568],[85.166,28.3447],[85.166,28.6523],[84.9023,28.5645],[84.4629,28.7402],[84.2871,28.8721],[84.1992,29.2236],[84.1113,29.2676],[83.584,29.1797],[83.2324,29.5752],[82.1777,30.0586],[82.0898,30.3223],[81.3867,30.3662],[81.2109,30.0146],[81.0352,30.2344],[80.0684,30.5859],[79.7168,30.9375],[79.0137,31.0693],[78.75,31.333],[78.8379,31.5967],[78.6621,31.8164],[78.75,31.9043],[78.4863,32.124],[78.3984,32.5195],[78.75,32.6953],[78.9258,32.3438],[79.2773,32.5635],[79.1016,33.1787],[78.6621,33.6621],[78.6621,34.1016],[78.9258,34.1455],[79.0137,34.3213]]]}},{"type":"Feature","properties":{"id":"15","size":"450","name":"内蒙古","cp":[111.670801,41.818311],"childNum":12},"geometry":{"type":"Polygon","coordinates":[[[97.207,42.8027],[99.4922,42.583],[100.8105,42.6709],[101.7773,42.4951],[102.041,42.2314],[102.7441,42.1436],[103.3594,41.8799],[103.8867,41.792],[104.502,41.8799],[104.502,41.6602],[105.0293,41.5723],[105.7324,41.9238],[107.4023,42.4512],[109.4238,42.4512],[110.3906,42.7588],[111.0059,43.3301],[111.9727,43.6816],[111.9727,43.8135],[111.4453,44.3848],[111.7969,45],[111.9727,45.0879],[113.6426,44.7363],[114.1699,44.9561],[114.5215,45.3955],[115.6641,45.4395],[116.1914,45.7031],[116.2793,45.9668],[116.543,46.2744],[117.334,46.3623],[117.4219,46.582],[117.7734,46.5381],[118.3008,46.7578],[118.7402,46.7139],[118.916,46.7578],[119.0918,46.6699],[119.707,46.626],[119.9707,46.7139],[119.707,47.1973],[118.4766,47.9883],[117.8613,48.0322],[117.334,47.6807],[116.8066,47.9004],[116.1914,47.8564],[115.9277,47.6807],[115.5762,47.9004],[115.4883,48.1641],[115.8398,48.252],[115.8398,48.5596],[116.7188,49.834],[117.7734,49.5264],[118.5645,49.9219],[119.2676,50.0977],[119.3555,50.3174],[119.1797,50.3613],[119.5313,50.7568],[119.5313,50.8887],[119.707,51.0645],[120.1465,51.6797],[120.6738,51.9434],[120.7617,52.1191],[120.7617,52.251],[120.5859,52.3389],[120.6738,52.5146],[120.4102,52.6465],[120.0586,52.6025],[120.0586,52.7344],[120.8496,53.2617],[121.4648,53.3496],[121.8164,53.042],[121.2012,52.5586],[121.6406,52.4268],[121.7285,52.2949],[121.9922,52.2949],[122.168,52.5146],[122.6953,52.251],[122.6074,52.0752],[122.959,51.3281],[123.3105,51.2402],[123.6621,51.3721],[124.3652,51.2842],[124.541,51.3721],[124.8926,51.3721],[125.0684,51.6357],[125.332,51.6357],[126.0352,51.0205],[125.7715,50.7568],[125.7715,50.5371],[125.332,50.1416],[125.1563,49.834],[125.2441,49.1748],[124.8047,49.1309],[124.4531,48.1201],[124.2773,48.5156],[122.4316,47.373],[123.0469,46.7139],[123.3984,46.8896],[123.3984,46.9775],[123.4863,46.9775],[123.5742,46.8457],[123.5742,46.8896],[123.5742,46.6699],[123.0469,46.582],[123.2227,46.2305],[122.7832,46.0107],[122.6953,45.7031],[122.4316,45.8789],[122.2559,45.791],[121.8164,46.0107],[121.7285,45.7471],[121.9043,45.7031],[122.2559,45.2637],[122.0801,44.8682],[122.3438,44.2529],[123.1348,44.4727],[123.4863,43.7256],[123.3105,43.5059],[123.6621,43.374],[123.5742,43.0225],[123.3105,42.9785],[123.1348,42.8027],[122.7832,42.7148],[122.3438,42.8467],[122.3438,42.6709],[121.9922,42.7148],[121.7285,42.4512],[121.4648,42.4951],[120.498,42.0996],[120.1465,41.7041],[119.8828,42.1875],[119.5313,42.3633],[119.3555,42.2754],[119.2676,41.7041],[119.4434,41.6162],[119.2676,41.3086],[118.3887,41.3086],[118.125,41.748],[118.3008,41.792],[118.3008,42.0996],[118.125,42.0557],[117.9492,42.2314],[118.0371,42.4072],[117.7734,42.627],[117.5098,42.583],[117.334,42.4512],[116.8945,42.4072],[116.8066,42.0117],[116.2793,42.0117],[116.0156,41.792],[115.9277,41.9238],[115.2246,41.5723],[114.9609,41.6162],[114.873,42.0996],[114.5215,42.1436],[114.1699,41.792],[114.2578,41.5723],[113.9063,41.4404],[113.9941,41.2207],[113.9063,41.1328],[114.082,40.7373],[114.082,40.5176],[113.8184,40.5176],[113.5547,40.3418],[113.2031,40.3857],[112.7637,40.166],[112.3242,40.2539],[111.9727,39.5947],[111.4453,39.6387],[111.3574,39.4189],[111.0938,39.375],[111.0938,39.5947],[110.6543,39.2871],[110.127,39.4629],[110.2148,39.2871],[109.8633,39.2432],[109.9512,39.1553],[108.9844,38.3203],[109.0723,38.0127],[108.8965,37.9688],[108.8086,38.0127],[108.7207,37.7051],[108.1934,37.6172],[107.666,37.8809],[107.3145,38.1006],[106.7871,38.1885],[106.5234,38.3203],[106.9629,38.9795],[106.7871,39.375],[106.3477,39.2871],[105.9082,38.7158],[105.8203,37.793],[104.3262,37.4414],[103.4473,37.8369],[103.3594,38.0127],[103.5352,38.1445],[103.4473,38.3643],[104.2383,38.9795],[104.0625,39.4189],[103.3594,39.3311],[103.0078,39.1113],[102.4805,39.2432],[101.8652,39.1113],[102.041,38.8916],[101.7773,38.6719],[101.3379,38.7598],[101.25,39.0234],[100.9863,38.9355],[100.8105,39.4189],[100.5469,39.4189],[100.0195,39.7705],[99.4922,39.8584],[100.1074,40.2539],[100.1953,40.6494],[99.9316,41.001],[99.2285,40.8691],[99.0527,40.6934],[98.9648,40.7813],[98.7891,40.6055],[98.5254,40.7373],[98.6133,40.6494],[98.3496,40.5615],[98.3496,40.9131],[97.4707,41.4844],[97.8223,41.6162],[97.8223,41.748],[97.207,42.8027]]]}},{"type":"Feature","properties":{"id":"63","size":"800","name":"青海","cp":[95.2402,35.4199],"childNum":8},"geometry":{"type":"Polygon","coordinates":[[[89.7363,36.0791],[89.9121,36.0791],[90,36.2549],[90.8789,36.0352],[91.0547,36.0791],[91.0547,36.5186],[90.791,36.6064],[90.7031,36.7822],[91.3184,37.0898],[91.0547,37.4414],[90.5273,37.8369],[90.6152,38.3203],[90.3516,38.2324],[90.1758,38.4961],[92.373,39.0234],[92.373,39.1113],[93.1641,39.1992],[93.1641,38.9795],[93.6914,38.9355],[93.8672,38.7158],[94.3066,38.7598],[94.5703,38.3643],[95.0098,38.4082],[95.4492,38.2764],[95.7129,38.3643],[96.2402,38.1006],[96.416,38.2324],[96.6797,38.1885],[96.6797,38.4521],[97.1191,38.584],[97.0313,39.1992],[98.1738,38.8037],[98.3496,39.0234],[98.6133,38.9355],[98.7891,39.0674],[99.1406,38.9355],[99.8438,38.3643],[100.1953,38.2764],[100.0195,38.4521],[100.1074,38.4961],[100.459,38.2764],[100.7227,38.2324],[101.1621,37.8369],[101.5137,37.8809],[101.7773,37.6172],[101.9531,37.7051],[102.1289,37.4414],[102.5684,37.1777],[102.4805,36.958],[102.6563,36.8262],[102.5684,36.7383],[102.832,36.3428],[103.0078,36.2549],[102.9199,36.0791],[102.9199,35.9033],[102.6563,35.7715],[102.832,35.5957],[102.4805,35.5957],[102.3047,35.4199],[102.3926,35.2002],[101.9531,34.8486],[101.9531,34.6289],[102.2168,34.4092],[102.1289,34.2773],[101.6895,34.1016],[100.9863,34.3652],[100.8105,34.2773],[101.25,33.6621],[101.5137,33.7061],[101.6016,33.5303],[101.7773,33.5303],[101.6895,33.3105],[101.7773,33.2227],[101.6016,33.1348],[101.1621,33.2227],[101.25,32.6953],[100.7227,32.6514],[100.7227,32.5195],[100.3711,32.7393],[100.1074,32.6514],[100.1074,32.8711],[99.8438,33.0029],[99.7559,32.7393],[99.2285,32.915],[99.2285,33.0469],[98.877,33.1787],[98.4375,34.0576],[97.8223,34.1895],[97.6465,34.1016],[97.7344,33.9258],[97.3828,33.8818],[97.4707,33.5742],[97.7344,33.3984],[97.3828,32.8711],[97.4707,32.6953],[97.7344,32.5195],[97.3828,32.5635],[97.2949,32.0801],[96.7676,31.9922],[96.8555,31.6846],[96.5039,31.7285],[96.2402,31.9482],[96.1523,31.5967],[95.9766,31.8164],[95.8008,31.6846],[95.4492,31.8164],[95.3613,31.9922],[95.3613,32.168],[95.2734,32.2119],[95.1855,32.3438],[95.0098,32.2998],[95.1855,32.4316],[94.6582,32.6074],[94.1309,32.4316],[93.7793,32.5635],[93.5156,32.4756],[92.9883,32.7393],[92.2852,32.7393],[92.1973,32.8271],[91.9336,32.8271],[91.4063,33.1348],[90.7031,33.1348],[90.0879,33.4863],[89.6484,34.0137],[89.8242,34.3652],[89.7363,34.6729],[89.8242,34.8486],[89.5605,34.8926],[89.4727,35.2441],[89.4727,35.376],[89.7363,35.4199],[89.7363,35.7715],[89.4727,35.9033],[89.3848,36.0352],[89.7363,36.0791]]]}},{"type":"Feature","properties":{"id":"51","size":"900","name":"四川","cp":[101.9199,30.1904],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[101.7773,33.5303],[101.8652,33.5742],[101.9531,33.4424],[101.8652,33.0908],[102.4805,33.4424],[102.2168,33.9258],[102.9199,34.3213],[103.0957,34.1895],[103.1836,33.7939],[104.1504,33.6182],[104.2383,33.3984],[104.4141,33.3105],[104.3262,33.2227],[104.4141,33.0469],[104.3262,32.8711],[104.4141,32.7393],[105.2051,32.6074],[105.3809,32.7393],[105.3809,32.8711],[105.4688,32.915],[105.5566,32.7393],[106.084,32.8711],[106.084,32.7393],[106.3477,32.6514],[107.0508,32.6953],[107.1387,32.4756],[107.2266,32.4316],[107.4023,32.5195],[108.0176,32.168],[108.2813,32.2559],[108.5449,32.2119],[108.3691,32.168],[108.2813,31.9043],[108.5449,31.6846],[108.1934,31.5088],[107.9297,30.8496],[107.4902,30.8496],[107.4023,30.7617],[107.4902,30.6299],[107.0508,30.0146],[106.7871,30.0146],[106.6113,30.3223],[106.2598,30.1904],[105.8203,30.4541],[105.6445,30.2783],[105.5566,30.1025],[105.7324,29.8828],[105.293,29.5313],[105.4688,29.3115],[105.7324,29.2676],[105.8203,28.96],[106.2598,28.8721],[106.3477,28.5205],[105.9961,28.7402],[105.6445,28.4326],[105.9082,28.125],[106.1719,28.125],[106.3477,27.8174],[105.6445,27.6416],[105.5566,27.7734],[105.293,27.7295],[105.2051,27.9932],[105.0293,28.0811],[104.8535,27.9053],[104.4141,27.9492],[104.3262,28.0371],[104.4141,28.125],[104.4141,28.2568],[104.2383,28.4326],[104.4141,28.6084],[103.8867,28.6523],[103.7988,28.3008],[103.4473,28.125],[103.4473,27.7734],[102.9199,27.29],[103.0078,26.3672],[102.6563,26.1914],[102.5684,26.3672],[102.1289,26.1035],[101.8652,26.0596],[101.6016,26.2354],[101.6895,26.3672],[101.4258,26.5869],[101.4258,26.8066],[101.4258,26.7188],[101.1621,27.0264],[101.1621,27.1582],[100.7227,27.8613],[100.3711,27.8174],[100.2832,27.7295],[100.0195,28.125],[100.1953,28.3447],[99.668,28.8281],[99.4043,28.5205],[99.4043,28.1689],[99.2285,28.3008],[99.1406,29.2676],[98.9648,30.7617],[98.6133,31.2012],[98.877,31.4209],[98.4375,31.8604],[98.1738,32.3438],[97.7344,32.5195],[97.4707,32.6953],[97.3828,32.8711],[97.7344,33.3984],[97.4707,33.5742],[97.3828,33.8818],[97.7344,33.9258],[97.6465,34.1016],[97.8223,34.1895],[98.4375,34.0576],[98.877,33.1787],[99.2285,33.0469],[99.2285,32.915],[99.7559,32.7393],[99.8438,33.0029],[100.1074,32.8711],[100.1074,32.6514],[100.3711,32.7393],[100.7227,32.5195],[100.7227,32.6514],[101.25,32.6953],[101.1621,33.2227],[101.6016,33.1348],[101.7773,33.2227],[101.6895,33.3105],[101.7773,33.5303]]]}},{"type":"Feature","properties":{"id":"23","size":"700","name":"黑龙江","cp":[128.642464,46.756967],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[121.4648,53.3496],[123.6621,53.5693],[124.8926,53.0859],[125.0684,53.2178],[125.5957,53.0859],[125.6836,52.9102],[126.123,52.7783],[126.0352,52.6025],[126.2109,52.5146],[126.3867,52.2949],[126.3867,52.207],[126.5625,52.1631],[126.4746,51.9434],[126.9141,51.3721],[126.8262,51.2842],[127.002,51.3281],[126.9141,51.1084],[127.2656,50.7568],[127.3535,50.2734],[127.6172,50.2295],[127.5293,49.8779],[127.793,49.6143],[128.7598,49.5703],[129.1113,49.3506],[129.4629,49.4385],[130.2539,48.8672],[130.6934,48.8672],[130.5176,48.6475],[130.8691,48.2959],[130.6934,48.1201],[131.0449,47.6807],[132.5391,47.7246],[132.627,47.9443],[133.0664,48.1201],[133.5059,48.1201],[134.209,48.3838],[135.0879,48.4277],[134.7363,48.252],[134.5605,47.9883],[134.7363,47.6807],[134.5605,47.4609],[134.3848,47.4609],[134.209,47.2852],[134.209,47.1533],[133.8574,46.5381],[133.9453,46.2744],[133.5059,45.835],[133.418,45.5713],[133.2422,45.5273],[133.0664,45.1318],[132.8906,45.0439],[131.9238,45.3516],[131.5723,45.0439],[131.0449,44.8682],[131.3086,44.0771],[131.2207,43.7256],[131.3086,43.4619],[130.8691,43.418],[130.5176,43.6377],[130.3418,43.9893],[129.9902,43.8574],[129.9023,44.0332],[129.8145,43.9014],[129.2871,43.8135],[129.1992,43.5938],[128.8477,43.5498],[128.4961,44.165],[128.4082,44.4727],[128.0566,44.3408],[128.0566,44.1211],[127.7051,44.1211],[127.5293,44.6045],[127.0898,44.6045],[127.002,44.7803],[127.0898,45],[126.9141,45.1318],[126.5625,45.2637],[126.0352,45.1758],[125.7715,45.3076],[125.6836,45.5273],[125.0684,45.3955],[124.8926,45.5273],[124.3652,45.4395],[124.0137,45.7471],[123.9258,46.2305],[123.2227,46.2305],[123.0469,46.582],[123.5742,46.6699],[123.5742,46.8896],[123.5742,46.8457],[123.4863,46.9775],[123.3984,46.9775],[123.3984,46.8896],[123.0469,46.7139],[122.4316,47.373],[124.2773,48.5156],[124.4531,48.1201],[124.8047,49.1309],[125.2441,49.1748],[125.1563,49.834],[125.332,50.1416],[125.7715,50.5371],[125.7715,50.7568],[126.0352,51.0205],[125.332,51.6357],[125.0684,51.6357],[124.8926,51.3721],[124.541,51.3721],[124.3652,51.2842],[123.6621,51.3721],[123.3105,51.2402],[122.959,51.3281],[122.6074,52.0752],[122.6953,52.251],[122.168,52.5146],[121.9922,52.2949],[121.7285,52.2949],[121.6406,52.4268],[121.2012,52.5586],[121.8164,53.042],[121.4648,53.3496]]]}},{"type":"Feature","properties":{"id":"62","size":"690","name":"甘肃","cp":[103.823557,36.058039],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7148],[97.207,42.8027],[97.8223,41.748],[97.8223,41.6162],[97.4707,41.4844],[98.3496,40.9131],[98.3496,40.5615],[98.6133,40.6494],[98.5254,40.7373],[98.7891,40.6055],[98.9648,40.7813],[99.0527,40.6934],[99.2285,40.8691],[99.9316,41.001],[100.1953,40.6494],[100.1074,40.2539],[99.4922,39.8584],[100.0195,39.7705],[100.5469,39.4189],[100.8105,39.4189],[100.9863,38.9355],[101.25,39.0234],[101.3379,38.7598],[101.7773,38.6719],[102.041,38.8916],[101.8652,39.1113],[102.4805,39.2432],[103.0078,39.1113],[103.3594,39.3311],[104.0625,39.4189],[104.2383,38.9795],[103.4473,38.3643],[103.5352,38.1445],[103.3594,38.0127],[103.4473,37.8369],[104.3262,37.4414],[104.5898,37.4414],[104.5898,37.2217],[104.8535,37.2217],[105.293,36.8262],[105.2051,36.6943],[105.4688,36.123],[105.293,35.9912],[105.3809,35.7715],[105.7324,35.7275],[105.8203,35.5518],[105.9961,35.4639],[105.9082,35.4199],[105.9961,35.4199],[106.084,35.376],[106.2598,35.4199],[106.3477,35.2441],[106.5234,35.332],[106.4355,35.6836],[106.6992,35.6836],[106.9629,35.8154],[106.875,36.123],[106.5234,36.2549],[106.5234,36.4746],[106.4355,36.5625],[106.6113,36.7822],[106.6113,37.0898],[107.3145,37.0898],[107.3145,36.9141],[108.7207,36.3428],[108.6328,35.9912],[108.5449,35.8594],[108.6328,35.5518],[108.5449,35.2881],[107.7539,35.2881],[107.7539,35.1123],[107.8418,35.0244],[107.666,34.9365],[107.2266,34.8926],[106.9629,35.0684],[106.6113,35.0684],[106.5234,34.7607],[106.3477,34.585],[106.6992,34.3213],[106.5234,34.2773],[106.6113,34.1455],[106.4355,33.9258],[106.5234,33.5303],[105.9961,33.6182],[105.7324,33.3984],[105.9961,33.1787],[105.9082,33.0029],[105.4688,32.915],[105.3809,32.8711],[105.3809,32.7393],[105.2051,32.6074],[104.4141,32.7393],[104.3262,32.8711],[104.4141,33.0469],[104.3262,33.2227],[104.4141,33.3105],[104.2383,33.3984],[104.1504,33.6182],[103.1836,33.7939],[103.0957,34.1895],[102.9199,34.3213],[102.2168,33.9258],[102.4805,33.4424],[101.8652,33.0908],[101.9531,33.4424],[101.8652,33.5742],[101.7773,33.5303],[101.6016,33.5303],[101.5137,33.7061],[101.25,33.6621],[100.8105,34.2773],[100.9863,34.3652],[101.6895,34.1016],[102.1289,34.2773],[102.2168,34.4092],[101.9531,34.6289],[101.9531,34.8486],[102.3926,35.2002],[102.3047,35.4199],[102.4805,35.5957],[102.832,35.5957],[102.6563,35.7715],[102.9199,35.9033],[102.9199,36.0791],[103.0078,36.2549],[102.832,36.3428],[102.5684,36.7383],[102.6563,36.8262],[102.4805,36.958],[102.5684,37.1777],[102.1289,37.4414],[101.9531,37.7051],[101.7773,37.6172],[101.5137,37.8809],[101.1621,37.8369],[100.7227,38.2324],[100.459,38.2764],[100.1074,38.4961],[100.0195,38.4521],[100.1953,38.2764],[99.8438,38.3643],[99.1406,38.9355],[98.7891,39.0674],[98.6133,38.9355],[98.3496,39.0234],[98.1738,38.8037],[97.0313,39.1992],[97.1191,38.584],[96.6797,38.4521],[96.6797,38.1885],[96.416,38.2324],[96.2402,38.1006],[95.7129,38.3643],[95.4492,38.2764],[95.0098,38.4082],[94.5703,38.3643],[94.3066,38.7598],[93.8672,38.7158],[93.6914,38.9355],[93.1641,38.9795],[93.1641,39.1992],[92.373,39.1113],[92.373,39.3311],[92.6367,39.6387],[93.0762,40.6494],[93.8672,40.6934],[94.043,41.0889],[94.5703,41.4844],[95.1855,41.792],[95.2734,41.6162],[95.9766,41.9238],[96.2402,42.2314],[96.0645,42.3193],[95.9766,42.4951],[96.416,42.7148]]]}},{"type":"Feature","properties":{"id":"53","size":"1200","name":"云南","cp":[101.512251,24.740609],"childNum":16},"geometry":{"type":"Polygon","coordinates":[[[98.1738,28.125],[98.2617,28.3887],[98.3496,28.125],[98.7012,28.2129],[98.7891,28.3447],[98.6133,28.5205],[98.7012,28.916],[98.7891,29.0039],[98.7891,28.8721],[98.9648,28.8281],[98.9648,29.1357],[99.1406,29.2676],[99.2285,28.3008],[99.4043,28.1689],[99.4043,28.5205],[99.668,28.8281],[100.1953,28.3447],[100.0195,28.125],[100.2832,27.7295],[100.3711,27.8174],[100.7227,27.8613],[101.1621,27.1582],[101.1621,27.0264],[101.4258,26.7188],[101.4258,26.8066],[101.4258,26.5869],[101.6895,26.3672],[101.6016,26.2354],[101.8652,26.0596],[102.1289,26.1035],[102.5684,26.3672],[102.6563,26.1914],[103.0078,26.3672],[102.9199,27.29],[103.4473,27.7734],[103.4473,28.125],[103.7988,28.3008],[103.8867,28.6523],[104.4141,28.6084],[104.2383,28.4326],[104.4141,28.2568],[104.4141,28.125],[104.3262,28.0371],[104.4141,27.9492],[104.8535,27.9053],[105.0293,28.0811],[105.2051,27.9932],[105.293,27.7295],[105.2051,27.3779],[104.5898,27.334],[104.4141,27.4658],[104.1504,27.2461],[103.8867,27.4219],[103.623,27.0264],[103.7109,26.9824],[103.7109,26.7627],[103.8867,26.543],[104.4141,26.6748],[104.6777,26.4111],[104.3262,25.708],[104.8535,25.2246],[104.5898,25.0488],[104.6777,24.9609],[104.502,24.7412],[104.6777,24.3457],[104.7656,24.4775],[105.0293,24.4336],[105.2051,24.082],[105.4688,24.0381],[105.5566,24.126],[105.9961,24.126],[106.1719,23.8184],[106.1719,23.5547],[105.6445,23.4229],[105.5566,23.2031],[105.293,23.3789],[104.8535,23.1592],[104.7656,22.8516],[104.3262,22.6758],[104.1504,22.8076],[103.9746,22.5439],[103.623,22.7637],[103.5352,22.5879],[103.3594,22.8076],[103.0957,22.4561],[102.4805,22.7637],[102.3047,22.4121],[101.8652,22.3682],[101.7773,22.5],[101.6016,22.1924],[101.8652,21.6211],[101.7773,21.1377],[101.6016,21.2256],[101.25,21.1816],[101.1621,21.7529],[100.6348,21.4453],[100.1074,21.4893],[99.9316,22.0605],[99.2285,22.1484],[99.4043,22.5879],[99.3164,22.7197],[99.4922,23.0713],[98.877,23.2031],[98.7012,23.9502],[98.877,24.126],[98.1738,24.082],[97.7344,23.8623],[97.5586,23.9063],[97.7344,24.126],[97.6465,24.4336],[97.5586,24.4336],[97.5586,24.7412],[97.7344,24.8291],[97.8223,25.2686],[98.1738,25.4004],[98.1738,25.6201],[98.3496,25.5762],[98.5254,25.8398],[98.7012,25.8838],[98.6133,26.0596],[98.7012,26.1475],[98.7891,26.5869],[98.7012,27.5098],[98.5254,27.6416],[98.3496,27.5098],[98.1738,28.125]]]}},{"type":"Feature","properties":{"id":"45","size":"1450","name":"广西","cp":[107.7813,23.6426],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[104.502,24.7412],[104.6777,24.6094],[105.2051,24.9609],[105.9961,24.6533],[106.1719,24.7852],[106.1719,24.9609],[106.875,25.1807],[107.0508,25.2686],[106.9629,25.4883],[107.2266,25.6201],[107.4902,25.2246],[107.7539,25.2246],[107.8418,25.1367],[108.1055,25.2246],[108.1934,25.4443],[108.3691,25.5322],[108.6328,25.3125],[108.6328,25.5762],[109.0723,25.5322],[108.9844,25.752],[109.3359,25.708],[109.5117,26.0156],[109.7754,25.8838],[109.9512,26.1914],[110.2148,25.9717],[110.5664,26.3232],[111.1816,26.3232],[111.2695,26.2354],[111.2695,25.8838],[111.4453,25.8398],[111.0059,25.0049],[111.0938,24.9609],[111.3574,25.1367],[111.5332,24.6533],[111.709,24.7852],[112.0605,24.7412],[111.8848,24.6533],[112.0605,24.3457],[111.8848,24.2139],[111.8848,23.9941],[111.7969,23.8184],[111.6211,23.8184],[111.6211,23.6865],[111.3574,23.4668],[111.4453,23.0273],[111.2695,22.8076],[110.7422,22.5439],[110.7422,22.2803],[110.6543,22.1484],[110.3027,22.1484],[110.3027,21.8848],[109.9512,21.8408],[109.8633,21.665],[109.7754,21.6211],[109.7754,21.4014],[109.5996,21.4453],[109.1602,21.3574],[109.248,20.874],[109.0723,20.9619],[109.0723,21.5332],[108.7207,21.5332],[108.6328,21.665],[108.2813,21.4893],[107.8418,21.6211],[107.4023,21.6211],[107.0508,21.7969],[107.0508,21.9287],[106.6992,22.0166],[106.6113,22.4121],[106.7871,22.7637],[106.6992,22.8955],[105.9082,22.9395],[105.5566,23.0713],[105.5566,23.2031],[105.6445,23.4229],[106.1719,23.5547],[106.1719,23.8184],[105.9961,24.126],[105.5566,24.126],[105.4688,24.0381],[105.2051,24.082],[105.0293,24.4336],[104.7656,24.4775],[104.6777,24.3457],[104.502,24.7412]]]}},{"type":"Feature","properties":{"id":"43","size":"1700","name":"湖南","cp":[111.782279,28.09409],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[109.248,28.4766],[109.248,29.1357],[109.5117,29.6191],[109.6875,29.6191],[109.7754,29.751],[110.4785,29.6631],[110.6543,29.751],[110.4785,30.0146],[110.8301,30.1465],[111.7969,29.9268],[112.2363,29.5313],[112.5,29.6191],[112.6758,29.5752],[112.9395,29.7949],[113.0273,29.751],[112.9395,29.4873],[113.0273,29.4434],[113.5547,29.8389],[113.5547,29.707],[113.7305,29.5752],[113.6426,29.3115],[113.7305,29.0918],[113.9063,29.0479],[114.1699,28.8281],[114.082,28.5645],[114.2578,28.3447],[113.7305,27.9492],[113.6426,27.5977],[113.6426,27.3779],[113.8184,27.29],[113.7305,27.1143],[113.9063,26.9385],[113.9063,26.6309],[114.082,26.5869],[113.9941,26.1914],[114.2578,26.1475],[113.9941,26.0596],[113.9063,25.4443],[113.6426,25.3125],[113.2031,25.5322],[112.8516,25.3564],[113.0273,25.2246],[113.0273,24.9609],[112.8516,24.917],[112.5879,25.1367],[112.2363,25.1807],[112.1484,24.873],[112.0605,24.7412],[111.709,24.7852],[111.5332,24.6533],[111.3574,25.1367],[111.0938,24.9609],[111.0059,25.0049],[111.4453,25.8398],[111.2695,25.8838],[111.2695,26.2354],[111.1816,26.3232],[110.5664,26.3232],[110.2148,25.9717],[109.9512,26.1914],[109.7754,25.8838],[109.5117,26.0156],[109.4238,26.2793],[109.248,26.3232],[109.4238,26.5869],[109.3359,26.7188],[109.5117,26.8066],[109.5117,27.0264],[109.3359,27.1582],[108.8965,27.0264],[108.8086,27.1143],[109.4238,27.5977],[109.3359,27.9053],[109.3359,28.2568],[109.248,28.4766]]]}},{"type":"Feature","properties":{"id":"61","size":"1150","name":"陕西","cp":[108.948024,34.263161],"childNum":10},"geometry":{"type":"Polygon","coordinates":[[[105.4688,32.915],[105.9082,33.0029],[105.9961,33.1787],[105.7324,33.3984],[105.9961,33.6182],[106.5234,33.5303],[106.4355,33.9258],[106.6113,34.1455],[106.5234,34.2773],[106.6992,34.3213],[106.3477,34.585],[106.5234,34.7607],[106.6113,35.0684],[106.9629,35.0684],[107.2266,34.8926],[107.666,34.9365],[107.8418,35.0244],[107.7539,35.1123],[107.7539,35.2881],[108.5449,35.2881],[108.6328,35.5518],[108.5449,35.8594],[108.6328,35.9912],[108.7207,36.3428],[107.3145,36.9141],[107.3145,37.0898],[107.3145,37.6172],[107.666,37.8809],[108.1934,37.6172],[108.7207,37.7051],[108.8086,38.0127],[108.8965,37.9688],[109.0723,38.0127],[108.9844,38.3203],[109.9512,39.1553],[109.8633,39.2432],[110.2148,39.2871],[110.127,39.4629],[110.6543,39.2871],[111.0938,39.5947],[111.0938,39.375],[111.1816,39.2432],[110.918,38.7158],[110.8301,38.4961],[110.4785,38.1885],[110.4785,37.9688],[110.8301,37.6611],[110.3906,37.002],[110.4785,36.123],[110.5664,35.6396],[110.2148,34.8926],[110.2148,34.6729],[110.3906,34.585],[110.4785,34.2334],[110.6543,34.1455],[110.6543,33.8379],[111.0059,33.5303],[111.0059,33.2666],[110.7422,33.1348],[110.5664,33.2666],[110.3027,33.1787],[109.5996,33.2666],[109.4238,33.1348],[109.7754,33.0469],[109.7754,32.915],[110.127,32.7393],[110.127,32.6074],[109.6875,32.6074],[109.5117,32.4316],[109.5996,31.7285],[109.248,31.7285],[109.0723,31.9482],[108.5449,32.2119],[108.2813,32.2559],[108.0176,32.168],[107.4023,32.5195],[107.2266,32.4316],[107.1387,32.4756],[107.0508,32.6953],[106.3477,32.6514],[106.084,32.7393],[106.084,32.8711],[105.5566,32.7393],[105.4688,32.915]]]}},{"type":"Feature","properties":{"id":"44","size":"1600","name":"广东","cp":[113.280637,23.125178],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[109.7754,21.4014],[109.7754,21.6211],[109.8633,21.665],[109.9512,21.8408],[110.3027,21.8848],[110.3027,22.1484],[110.6543,22.1484],[110.7422,22.2803],[110.7422,22.5439],[111.2695,22.8076],[111.4453,23.0273],[111.3574,23.4668],[111.6211,23.6865],[111.6211,23.8184],[111.7969,23.8184],[111.8848,23.9941],[111.8848,24.2139],[112.0605,24.3457],[111.8848,24.6533],[112.0605,24.7412],[112.1484,24.873],[112.2363,25.1807],[112.5879,25.1367],[112.8516,24.917],[113.0273,24.9609],[113.0273,25.2246],[112.8516,25.3564],[113.2031,25.5322],[113.6426,25.3125],[113.9063,25.4443],[113.9941,25.2686],[114.6094,25.4004],[114.7852,25.2686],[114.6973,25.1367],[114.4336,24.9609],[114.1699,24.6973],[114.4336,24.5215],[115.4004,24.7852],[115.8398,24.5654],[115.752,24.7852],[115.9277,24.917],[116.2793,24.7852],[116.3672,24.873],[116.543,24.6094],[116.7188,24.6533],[116.9824,24.1699],[116.9824,23.9063],[117.1582,23.5547],[117.334,23.2471],[116.8945,23.3789],[116.6309,23.1152],[116.543,22.8516],[115.9277,22.7197],[115.6641,22.7637],[115.5762,22.6318],[115.0488,22.6758],[114.6094,22.3682],[114.3457,22.5439],[113.9941,22.5],[113.8184,22.1924],[114.3457,22.1484],[114.4336,22.0166],[114.082,21.9287],[113.9941,21.7969],[113.5547,22.0166],[113.1152,21.8408],[112.9395,21.5771],[112.4121,21.4453],[112.2363,21.5332],[111.5332,21.4893],[111.2695,21.3574],[110.7422,21.3574],[110.6543,21.2256],[110.7422,20.918],[110.4785,20.874],[110.6543,20.2588],[110.5664,20.2588],[110.3906,20.127],[110.0391,20.127],[109.8633,20.127],[109.8633,20.3027],[109.5996,20.918],[109.7754,21.4014],[109.7754,21.4014]],[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}},{"type":"Feature","properties":{"id":"22","size":"1120","name":"吉林","cp":[125.7746,43.5938],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[123.2227,46.2305],[123.9258,46.2305],[124.0137,45.7471],[124.3652,45.4395],[124.8926,45.5273],[125.0684,45.3955],[125.6836,45.5273],[125.7715,45.3076],[126.0352,45.1758],[126.5625,45.2637],[126.9141,45.1318],[127.0898,45],[127.002,44.7803],[127.0898,44.6045],[127.5293,44.6045],[127.7051,44.1211],[128.0566,44.1211],[128.0566,44.3408],[128.4082,44.4727],[128.4961,44.165],[128.8477,43.5498],[129.1992,43.5938],[129.2871,43.8135],[129.8145,43.9014],[129.9023,44.0332],[129.9902,43.8574],[130.3418,43.9893],[130.5176,43.6377],[130.8691,43.418],[131.3086,43.4619],[131.3086,43.3301],[131.1328,42.9346],[130.4297,42.7148],[130.6055,42.6709],[130.6055,42.4512],[130.2539,42.7588],[130.2539,42.8906],[130.166,42.9785],[129.9023,43.0225],[129.7266,42.4951],[129.375,42.4512],[128.9355,42.0117],[128.0566,42.0117],[128.3203,41.5723],[128.1445,41.3525],[127.0898,41.5283],[127.1777,41.5723],[126.9141,41.792],[126.6504,41.6602],[126.4746,41.3965],[126.123,40.957],[125.6836,40.8691],[125.5957,40.9131],[125.7715,41.2207],[125.332,41.6602],[125.332,41.9678],[125.4199,42.0996],[125.332,42.1436],[124.8926,42.8027],[124.8926,43.0664],[124.7168,43.0664],[124.4531,42.8467],[124.2773,43.2422],[123.8379,43.4619],[123.6621,43.374],[123.3105,43.5059],[123.4863,43.7256],[123.1348,44.4727],[122.3438,44.2529],[122.0801,44.8682],[122.2559,45.2637],[121.9043,45.7031],[121.7285,45.7471],[121.8164,46.0107],[122.2559,45.791],[122.4316,45.8789],[122.6953,45.7031],[122.7832,46.0107],[123.2227,46.2305]]]}},{"type":"Feature","properties":{"id":"13","size":"1300","name":"河北","cp":[114.502461,38.045474],"childNum":11},"geometry":{"type":"MultiPolygon","coordinates":[[[[114.5215,39.5068],[114.3457,39.8584],[113.9941,39.9902],[114.5215,40.3418],[114.3457,40.3857],[114.2578,40.6055],[114.082,40.7373],[113.9063,41.1328],[113.9941,41.2207],[113.9063,41.4404],[114.2578,41.5723],[114.1699,41.792],[114.5215,42.1436],[114.873,42.0996],[114.9609,41.6162],[115.2246,41.5723],[115.9277,41.9238],[116.0156,41.792],[116.2793,42.0117],[116.8066,42.0117],[116.8945,42.4072],[117.334,42.4512],[117.5098,42.583],[117.7734,42.627],[118.0371,42.4072],[117.9492,42.2314],[118.125,42.0557],[118.3008,42.0996],[118.3008,41.792],[118.125,41.748],[118.3887,41.3086],[119.2676,41.3086],[118.8281,40.8252],[119.2676,40.5176],[119.5313,40.5615],[119.707,40.1221],[119.8828,39.9463],[119.5313,39.6826],[119.4434,39.4189],[118.916,39.0674],[118.4766,38.9355],[118.125,39.0234],[118.0371,39.1992],[118.0371,39.2432],[117.8613,39.4189],[117.9492,39.5947],[117.6855,39.5947],[117.5098,39.7705],[117.5098,39.9902],[117.6855,39.9902],[117.6855,40.0781],[117.4219,40.21],[117.2461,40.5176],[117.4219,40.6494],[116.9824,40.6934],[116.6309,41.0449],[116.3672,40.9131],[116.4551,40.7813],[116.1914,40.7813],[116.1035,40.6055],[115.752,40.5615],[115.9277,40.2539],[115.4004,39.9463],[115.4883,39.6387],[115.752,39.5068],[116.1914,39.5947],[116.3672,39.4629],[116.543,39.5947],[116.8066,39.5947],[116.8945,39.1113],[116.7188,38.9355],[116.7188,38.8037],[117.2461,38.54],[117.5977,38.6279],[117.9492,38.3203],[117.4219,37.8369],[116.8066,37.8369],[116.4551,37.4854],[116.2793,37.5732],[116.2793,37.3535],[116.0156,37.3535],[115.752,36.9141],[115.3125,36.5186],[115.4883,36.167],[115.3125,36.0791],[115.1367,36.2109],[114.9609,36.0791],[114.873,36.123],[113.7305,36.3428],[113.4668,36.6504],[113.7305,36.8701],[113.7305,37.1338],[114.1699,37.6611],[113.9941,37.7051],[113.8184,38.1445],[113.5547,38.2764],[113.5547,38.54],[113.8184,38.8037],[113.8184,38.9355],[113.9063,39.0234],[114.3457,39.0674],[114.5215,39.5068]]],[[[117.2461,40.0781],[117.1582,39.8145],[117.1582,39.6387],[116.8945,39.6826],[116.8945,39.8145],[116.8066,39.9902],[117.2461,40.0781]]]]}},{"type":"Feature","properties":{"id":"42","size":"1500","name":"湖北","cp":[113.298572,30.684355],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.2148,31.1572],[110.127,31.377],[109.6875,31.5527],[109.7754,31.6846],[109.5996,31.7285],[109.5117,32.4316],[109.6875,32.6074],[110.127,32.6074],[110.127,32.7393],[109.7754,32.915],[109.7754,33.0469],[109.4238,33.1348],[109.5996,33.2666],[110.3027,33.1787],[110.5664,33.2666],[110.7422,33.1348],[111.0059,33.2666],[111.5332,32.6074],[112.3242,32.3438],[113.2031,32.4316],[113.4668,32.2998],[113.7305,32.4316],[113.8184,31.8604],[113.9941,31.7725],[114.1699,31.8604],[114.5215,31.7725],[114.6094,31.5527],[114.7852,31.4648],[115.1367,31.5967],[115.2246,31.4209],[115.4004,31.4209],[115.5762,31.2012],[116.0156,31.0254],[115.752,30.6738],[116.1035,30.1904],[116.1035,29.8389],[115.9277,29.707],[115.4883,29.7949],[114.873,29.3994],[114.2578,29.3555],[113.9063,29.0479],[113.7305,29.0918],[113.6426,29.3115],[113.7305,29.5752],[113.5547,29.707],[113.5547,29.8389],[113.0273,29.4434],[112.9395,29.4873],[113.0273,29.751],[112.9395,29.7949],[112.6758,29.5752],[112.5,29.6191],[112.2363,29.5313],[111.7969,29.9268],[110.8301,30.1465],[110.4785,30.0146],[110.6543,29.751],[110.4785,29.6631],[109.7754,29.751],[109.6875,29.6191],[109.5117,29.6191],[109.248,29.1357],[109.0723,29.3555],[108.9844,29.3115],[108.6328,29.8389],[108.457,29.7949],[108.5449,30.2344],[108.457,30.4102],[108.6328,30.5859],[108.8086,30.498],[109.0723,30.6299],[109.1602,30.542],[109.248,30.6299],[109.4238,30.542],[109.8633,30.8936],[110.0391,30.8057],[110.2148,31.1572]]]}},{"type":"Feature","properties":{"id":"52","size":"2000","name":"贵州","cp":[106.6113,26.9385],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[104.1504,27.2461],[104.4141,27.4658],[104.5898,27.334],[105.2051,27.3779],[105.293,27.7295],[105.5566,27.7734],[105.6445,27.6416],[106.3477,27.8174],[106.1719,28.125],[105.9082,28.125],[105.6445,28.4326],[105.9961,28.7402],[106.3477,28.5205],[106.5234,28.5645],[106.4355,28.7842],[106.5234,28.7842],[106.6113,28.6523],[106.6113,28.5205],[106.6992,28.4766],[106.875,28.7842],[107.4023,28.8721],[107.4023,29.1797],[107.5781,29.2236],[107.8418,29.1357],[107.8418,29.0039],[108.2813,29.0918],[108.3691,28.6523],[108.5449,28.6523],[108.5449,28.3887],[108.7207,28.4766],[108.7207,28.2129],[109.0723,28.2129],[109.248,28.4766],[109.3359,28.2568],[109.3359,27.9053],[109.4238,27.5977],[108.8086,27.1143],[108.8965,27.0264],[109.3359,27.1582],[109.5117,27.0264],[109.5117,26.8066],[109.3359,26.7188],[109.4238,26.5869],[109.248,26.3232],[109.4238,26.2793],[109.5117,26.0156],[109.3359,25.708],[108.9844,25.752],[109.0723,25.5322],[108.6328,25.5762],[108.6328,25.3125],[108.3691,25.5322],[108.1934,25.4443],[108.1055,25.2246],[107.8418,25.1367],[107.7539,25.2246],[107.4902,25.2246],[107.2266,25.6201],[106.9629,25.4883],[107.0508,25.2686],[106.875,25.1807],[106.1719,24.9609],[106.1719,24.7852],[105.9961,24.6533],[105.2051,24.9609],[104.6777,24.6094],[104.502,24.7412],[104.6777,24.9609],[104.5898,25.0488],[104.8535,25.2246],[104.3262,25.708],[104.6777,26.4111],[104.4141,26.6748],[103.8867,26.543],[103.7109,26.7627],[103.7109,26.9824],[103.623,27.0264],[103.8867,27.4219],[104.1504,27.2461]]]}},{"type":"Feature","properties":{"id":"37","size":"1500","name":"山东","cp":[118.7402,36.4307],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[115.4883,36.167],[115.3125,36.5186],[115.752,36.9141],[116.0156,37.3535],[116.2793,37.3535],[116.2793,37.5732],[116.4551,37.4854],[116.8066,37.8369],[117.4219,37.8369],[117.9492,38.3203],[118.125,38.1445],[118.916,38.1445],[119.3555,37.6611],[119.0039,37.5293],[119.0039,37.3535],[119.3555,37.1338],[119.707,37.1338],[119.8828,37.3975],[120.498,37.8369],[120.5859,38.1445],[120.9375,38.4521],[121.0254,37.8369],[121.2012,37.6611],[121.9043,37.4854],[122.168,37.6172],[122.2559,37.4854],[122.6074,37.4854],[122.6953,37.3535],[122.6074,36.9141],[122.4316,36.7822],[121.8164,36.8701],[121.7285,36.6943],[121.1133,36.6064],[121.1133,36.4307],[121.377,36.2549],[120.7617,36.167],[120.9375,35.8594],[120.6738,36.0352],[119.707,35.4639],[119.9707,34.9805],[119.3555,35.0244],[119.2676,35.1123],[118.916,35.0244],[118.7402,34.7168],[118.4766,34.6729],[118.3887,34.4092],[118.2129,34.4092],[118.125,34.6289],[117.9492,34.6729],[117.5977,34.4531],[117.334,34.585],[117.2461,34.4531],[116.8066,34.9365],[116.4551,34.8926],[116.3672,34.6289],[116.1914,34.585],[115.5762,34.585],[115.4004,34.8486],[114.7852,35.0684],[115.0488,35.376],[115.2246,35.4199],[115.4883,35.7275],[116.1035,36.0791],[115.3125,35.8154],[115.4883,36.167]]]}},{"type":"Feature","properties":{"id":"36","size":"1700","name":"江西","cp":[115.592151,27.676493],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[114.2578,28.3447],[114.082,28.5645],[114.1699,28.8281],[113.9063,29.0479],[114.2578,29.3555],[114.873,29.3994],[115.4883,29.7949],[115.9277,29.707],[116.1035,29.8389],[116.2793,29.7949],[116.7188,30.0586],[116.8945,29.9268],[116.7188,29.751],[116.7188,29.6191],[117.1582,29.707],[117.0703,29.8389],[117.1582,29.9268],[117.5098,29.6191],[118.0371,29.5752],[118.2129,29.3994],[118.0371,29.1797],[118.0371,29.0479],[118.3887,28.7842],[118.4766,28.3447],[118.4766,28.3008],[118.3008,28.0811],[117.7734,27.8174],[117.5098,27.9932],[116.9824,27.6416],[117.1582,27.29],[117.0703,27.1143],[116.543,26.8066],[116.6309,26.4551],[116.3672,26.2354],[116.4551,26.1035],[116.1914,25.8838],[116.0156,25.2686],[115.8398,25.2246],[115.9277,24.917],[115.752,24.7852],[115.8398,24.5654],[115.4004,24.7852],[114.4336,24.5215],[114.1699,24.6973],[114.4336,24.9609],[114.6973,25.1367],[114.7852,25.2686],[114.6094,25.4004],[113.9941,25.2686],[113.9063,25.4443],[113.9941,26.0596],[114.2578,26.1475],[113.9941,26.1914],[114.082,26.5869],[113.9063,26.6309],[113.9063,26.9385],[113.7305,27.1143],[113.8184,27.29],[113.6426,27.3779],[113.6426,27.5977],[113.7305,27.9492],[114.2578,28.3447]]]}},{"type":"Feature","properties":{"id":"41","size":"1700","name":"河南","cp":[113.0668,33.8818],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.3906,34.585],[110.8301,34.6289],[111.1816,34.8047],[111.5332,34.8486],[111.7969,35.0684],[112.0605,35.0684],[112.0605,35.2881],[112.7637,35.2002],[113.1152,35.332],[113.6426,35.6836],[113.7305,36.3428],[114.873,36.123],[114.9609,36.0791],[115.1367,36.2109],[115.3125,36.0791],[115.4883,36.167],[115.3125,35.8154],[116.1035,36.0791],[115.4883,35.7275],[115.2246,35.4199],[115.0488,35.376],[114.7852,35.0684],[115.4004,34.8486],[115.5762,34.585],[116.1914,34.585],[116.1914,34.4092],[116.543,34.2773],[116.6309,33.9258],[116.1914,33.7061],[116.0156,33.9697],[115.6641,34.0576],[115.5762,33.9258],[115.5762,33.6621],[115.4004,33.5303],[115.3125,33.1787],[114.873,33.1348],[114.873,33.0029],[115.1367,32.8711],[115.2246,32.6074],[115.5762,32.4316],[115.8398,32.5195],[115.9277,31.7725],[115.4883,31.6846],[115.4004,31.4209],[115.2246,31.4209],[115.1367,31.5967],[114.7852,31.4648],[114.6094,31.5527],[114.5215,31.7725],[114.1699,31.8604],[113.9941,31.7725],[113.8184,31.8604],[113.7305,32.4316],[113.4668,32.2998],[113.2031,32.4316],[112.3242,32.3438],[111.5332,32.6074],[111.0059,33.2666],[111.0059,33.5303],[110.6543,33.8379],[110.6543,34.1455],[110.4785,34.2334],[110.3906,34.585]]]}},{"type":"Feature","properties":{"id":"21","size":"1500","name":"辽宁","cp":[122.0438,41.0889],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[119.2676,41.3086],[119.4434,41.6162],[119.2676,41.7041],[119.3555,42.2754],[119.5313,42.3633],[119.8828,42.1875],[120.1465,41.7041],[120.498,42.0996],[121.4648,42.4951],[121.7285,42.4512],[121.9922,42.7148],[122.3438,42.6709],[122.3438,42.8467],[122.7832,42.7148],[123.1348,42.8027],[123.3105,42.9785],[123.5742,43.0225],[123.6621,43.374],[123.8379,43.4619],[124.2773,43.2422],[124.4531,42.8467],[124.7168,43.0664],[124.8926,43.0664],[124.8926,42.8027],[125.332,42.1436],[125.4199,42.0996],[125.332,41.9678],[125.332,41.6602],[125.7715,41.2207],[125.5957,40.9131],[125.6836,40.8691],[124.541,40.21],[124.1016,39.6826],[123.3984,39.6826],[123.1348,39.4189],[123.1348,39.0234],[122.0801,39.0234],[121.5527,38.7158],[121.1133,38.6719],[120.9375,38.9795],[121.377,39.1992],[121.2012,39.5508],[122.0801,40.3857],[121.9922,40.6934],[121.7285,40.8252],[121.2012,40.8252],[120.5859,40.21],[119.8828,39.9463],[119.707,40.1221],[119.5313,40.5615],[119.2676,40.5176],[118.8281,40.8252],[119.2676,41.3086]]]}},{"type":"Feature","properties":{"id":"14","size":"1450","name":"山西","cp":[111.849248,36.857014],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[110.918,38.7158],[111.1816,39.2432],[111.0938,39.375],[111.3574,39.4189],[111.4453,39.6387],[111.9727,39.5947],[112.3242,40.2539],[112.7637,40.166],[113.2031,40.3857],[113.5547,40.3418],[113.8184,40.5176],[114.082,40.5176],[114.082,40.7373],[114.2578,40.6055],[114.3457,40.3857],[114.5215,40.3418],[113.9941,39.9902],[114.3457,39.8584],[114.5215,39.5068],[114.3457,39.0674],[113.9063,39.0234],[113.8184,38.9355],[113.8184,38.8037],[113.5547,38.54],[113.5547,38.2764],[113.8184,38.1445],[113.9941,37.7051],[114.1699,37.6611],[113.7305,37.1338],[113.7305,36.8701],[113.4668,36.6504],[113.7305,36.3428],[113.6426,35.6836],[113.1152,35.332],[112.7637,35.2002],[112.0605,35.2881],[112.0605,35.0684],[111.7969,35.0684],[111.5332,34.8486],[111.1816,34.8047],[110.8301,34.6289],[110.3906,34.585],[110.2148,34.6729],[110.2148,34.8926],[110.5664,35.6396],[110.4785,36.123],[110.3906,37.002],[110.8301,37.6611],[110.4785,37.9688],[110.4785,38.1885],[110.8301,38.4961],[110.918,38.7158]]]}},{"type":"Feature","properties":{"id":"34","size":"1700","name":"安徽","cp":[117.283042,31.26119],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[116.6309,33.9258],[116.543,34.2773],[116.1914,34.4092],[116.1914,34.585],[116.3672,34.6289],[116.8945,34.4092],[117.1582,34.0576],[117.5977,34.0137],[117.7734,33.7061],[118.125,33.75],[117.9492,33.2227],[118.0371,33.1348],[118.2129,33.2227],[118.3008,32.7832],[118.7402,32.7393],[118.916,32.959],[119.1797,32.8271],[119.1797,32.4756],[118.5645,32.5635],[118.6523,32.2119],[118.4766,32.168],[118.3887,31.9482],[118.916,31.5527],[118.7402,31.377],[118.8281,31.2451],[119.3555,31.2891],[119.4434,31.1572],[119.6191,31.1133],[119.6191,31.0693],[119.4434,30.6738],[119.2676,30.6299],[119.3555,30.4102],[118.916,30.3223],[118.916,29.9707],[118.7402,29.707],[118.2129,29.3994],[118.0371,29.5752],[117.5098,29.6191],[117.1582,29.9268],[117.0703,29.8389],[117.1582,29.707],[116.7188,29.6191],[116.7188,29.751],[116.8945,29.9268],[116.7188,30.0586],[116.2793,29.7949],[116.1035,29.8389],[116.1035,30.1904],[115.752,30.6738],[116.0156,31.0254],[115.5762,31.2012],[115.4004,31.4209],[115.4883,31.6846],[115.9277,31.7725],[115.8398,32.5195],[115.5762,32.4316],[115.2246,32.6074],[115.1367,32.8711],[114.873,33.0029],[114.873,33.1348],[115.3125,33.1787],[115.4004,33.5303],[115.5762,33.6621],[115.5762,33.9258],[115.6641,34.0576],[116.0156,33.9697],[116.1914,33.7061],[116.6309,33.9258]]]}},{"type":"Feature","properties":{"id":"35","size":"2000","name":"福建","cp":[118.306239,26.075302],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[118.4766,28.3008],[118.8281,28.2568],[118.7402,28.0371],[118.916,27.4658],[119.2676,27.4219],[119.6191,27.6855],[119.7949,27.29],[120.2344,27.4219],[120.4102,27.1582],[120.7617,27.0264],[120.6738,26.8945],[120.2344,26.8506],[120.2344,26.7188],[120.4102,26.6748],[120.498,26.3672],[120.2344,26.2793],[120.4102,26.1475],[120.0586,26.1914],[119.9707,25.9277],[119.7949,25.9277],[119.9707,25.4004],[119.7949,25.2686],[119.5313,25.1367],[119.4434,25.0049],[119.2676,25.0928],[118.916,24.8291],[118.6523,24.5215],[118.4766,24.5215],[118.4766,24.4336],[118.2129,24.3457],[118.2129,24.1699],[117.8613,23.9941],[117.7734,23.7744],[117.5098,23.5986],[117.1582,23.5547],[116.9824,23.9063],[116.9824,24.1699],[116.7188,24.6533],[116.543,24.6094],[116.3672,24.873],[116.2793,24.7852],[115.9277,24.917],[115.8398,25.2246],[116.0156,25.2686],[116.1914,25.8838],[116.4551,26.1035],[116.3672,26.2354],[116.6309,26.4551],[116.543,26.8066],[117.0703,27.1143],[117.1582,27.29],[116.9824,27.6416],[117.5098,27.9932],[117.7734,27.8174],[118.3008,28.0811],[118.4766,28.3008]]]}},{"type":"Feature","properties":{"id":"33","size":"2100","name":"浙江","cp":[120.498,29.0918],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[118.2129,29.3994],[118.7402,29.707],[118.916,29.9707],[118.916,30.3223],[119.3555,30.4102],[119.2676,30.6299],[119.4434,30.6738],[119.6191,31.0693],[119.6191,31.1133],[119.9707,31.1572],[120.498,30.8057],[120.9375,31.0254],[121.2891,30.6738],[121.9922,30.8057],[122.6953,30.8936],[122.8711,30.7178],[122.959,30.1465],[122.6074,30.1025],[122.6074,29.9268],[122.168,29.5313],[122.3438,28.8721],[121.9922,28.8721],[121.9922,28.4326],[121.7285,28.3447],[121.7285,28.2129],[121.4648,28.2129],[121.5527,28.0371],[121.2891,27.9492],[121.1133,27.4219],[120.6738,27.334],[120.6738,27.1582],[120.9375,27.0264],[120.7617,27.0264],[120.4102,27.1582],[120.2344,27.4219],[119.7949,27.29],[119.6191,27.6855],[119.2676,27.4219],[118.916,27.4658],[118.7402,28.0371],[118.8281,28.2568],[118.4766,28.3008],[118.4766,28.3447],[118.3887,28.7842],[118.0371,29.0479],[118.0371,29.1797],[118.2129,29.3994]]]}},{"type":"Feature","properties":{"id":"32","size":"1950","name":"江苏","cp":[119.767413,33.041544],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[116.3672,34.6289],[116.4551,34.8926],[116.8066,34.9365],[117.2461,34.4531],[117.334,34.585],[117.5977,34.4531],[117.9492,34.6729],[118.125,34.6289],[118.2129,34.4092],[118.3887,34.4092],[118.4766,34.6729],[118.7402,34.7168],[118.916,35.0244],[119.2676,35.1123],[119.3555,35.0244],[119.3555,34.8486],[119.707,34.585],[120.3223,34.3652],[120.9375,33.0469],[121.0254,32.6514],[121.377,32.4756],[121.4648,32.168],[121.9043,31.9922],[121.9922,31.6846],[121.9922,31.5967],[121.2012,31.8604],[121.1133,31.7285],[121.377,31.5088],[121.2012,31.4648],[120.9375,31.0254],[120.498,30.8057],[119.9707,31.1572],[119.6191,31.1133],[119.4434,31.1572],[119.3555,31.2891],[118.8281,31.2451],[118.7402,31.377],[118.916,31.5527],[118.3887,31.9482],[118.4766,32.168],[118.6523,32.2119],[118.5645,32.5635],[119.1797,32.4756],[119.1797,32.8271],[118.916,32.959],[118.7402,32.7393],[118.3008,32.7832],[118.2129,33.2227],[118.0371,33.1348],[117.9492,33.2227],[118.125,33.75],[117.7734,33.7061],[117.5977,34.0137],[117.1582,34.0576],[116.8945,34.4092],[116.3672,34.6289]]]}},{"type":"Feature","properties":{"id":"50","size":"2380","name":"重庆","cp":[107.304962,29.533155],"childNum":40},"geometry":{"type":"Polygon","coordinates":[[[108.5449,31.6846],[108.2813,31.9043],[108.3691,32.168],[108.5449,32.2119],[109.0723,31.9482],[109.248,31.7285],[109.5996,31.7285],[109.7754,31.6846],[109.6875,31.5527],[110.127,31.377],[110.2148,31.1572],[110.0391,30.8057],[109.8633,30.8936],[109.4238,30.542],[109.248,30.6299],[109.1602,30.542],[109.0723,30.6299],[108.8086,30.498],[108.6328,30.5859],[108.457,30.4102],[108.5449,30.2344],[108.457,29.7949],[108.6328,29.8389],[108.9844,29.3115],[109.0723,29.3555],[109.248,29.1357],[109.248,28.4766],[109.0723,28.2129],[108.7207,28.2129],[108.7207,28.4766],[108.5449,28.3887],[108.5449,28.6523],[108.3691,28.6523],[108.2813,29.0918],[107.8418,29.0039],[107.8418,29.1357],[107.5781,29.2236],[107.4023,29.1797],[107.4023,28.8721],[106.875,28.7842],[106.6992,28.4766],[106.6113,28.5205],[106.6113,28.6523],[106.5234,28.7842],[106.4355,28.7842],[106.5234,28.5645],[106.3477,28.5205],[106.2598,28.8721],[105.8203,28.96],[105.7324,29.2676],[105.4688,29.3115],[105.293,29.5313],[105.7324,29.8828],[105.5566,30.1025],[105.6445,30.2783],[105.8203,30.4541],[106.2598,30.1904],[106.6113,30.3223],[106.7871,30.0146],[107.0508,30.0146],[107.4902,30.6299],[107.4023,30.7617],[107.4902,30.8496],[107.9297,30.8496],[108.1934,31.5088],[108.5449,31.6846]]]}},{"type":"Feature","properties":{"id":"64","size":"2100","name":"宁夏","cp":[105.9961,37.3096],"childNum":5},"geometry":{"type":"Polygon","coordinates":[[[104.3262,37.4414],[105.8203,37.793],[105.9082,38.7158],[106.3477,39.2871],[106.7871,39.375],[106.9629,38.9795],[106.5234,38.3203],[106.7871,38.1885],[107.3145,38.1006],[107.666,37.8809],[107.3145,37.6172],[107.3145,37.0898],[106.6113,37.0898],[106.6113,36.7822],[106.4355,36.5625],[106.5234,36.4746],[106.5234,36.2549],[106.875,36.123],[106.9629,35.8154],[106.6992,35.6836],[106.4355,35.6836],[106.5234,35.332],[106.3477,35.2441],[106.2598,35.4199],[106.084,35.376],[105.9961,35.4199],[106.084,35.4639],[105.9961,35.4639],[105.8203,35.5518],[105.7324,35.7275],[105.3809,35.7715],[105.293,35.9912],[105.4688,36.123],[105.2051,36.6943],[105.293,36.8262],[104.8535,37.2217],[104.5898,37.2217],[104.5898,37.4414],[104.3262,37.4414]]]}},{"type":"Feature","properties":{"id":"46","size":"4500","name":"海南","cp":[109.9512,19.2041],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[108.6328,19.3799],[109.0723,19.6436],[109.248,19.9512],[109.5996,20.0391],[110.0391,20.127],[110.3906,20.127],[110.5664,20.2588],[110.6543,20.2588],[111.0938,19.9512],[111.2695,19.9951],[110.6543,19.1602],[110.5664,18.6768],[110.2148,18.5889],[110.0391,18.3691],[109.8633,18.3691],[109.6875,18.1055],[108.9844,18.2813],[108.6328,18.457],[108.6328,19.3799]]]}},{"type":"Feature","properties":{"id":"71","size":"3000","name":"台湾","cp":[120.0254,23.5986],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[121.9043,25.0488],[121.9922,25.0049],[121.8164,24.7412],[121.9043,24.5654],[121.6406,24.0381],[121.377,23.1152],[121.0254,22.6758],[120.8496,22.0605],[120.7617,21.9287],[120.6738,22.3242],[120.2344,22.5879],[120.0586,23.0713],[120.1465,23.6865],[121.0254,25.0488],[121.5527,25.3125],[121.9043,25.0488]]]}},{"type":"Feature","properties":{"id":"11","size":"5000","name":"北京","cp":[116.4551,40.2539],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[117.4219,40.21],[117.334,40.1221],[117.2461,40.0781],[116.8066,39.9902],[116.8945,39.8145],[116.8945,39.6826],[116.8066,39.5947],[116.543,39.5947],[116.3672,39.4629],[116.1914,39.5947],[115.752,39.5068],[115.4883,39.6387],[115.4004,39.9463],[115.9277,40.2539],[115.752,40.5615],[116.1035,40.6055],[116.1914,40.7813],[116.4551,40.7813],[116.3672,40.9131],[116.6309,41.0449],[116.9824,40.6934],[117.4219,40.6494],[117.2461,40.5176],[117.4219,40.21]]]}},{"type":"Feature","properties":{"id":"12","size":"5000","name":"天津","cp":[117.4219,39.4189],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[116.8066,39.5947],[116.8945,39.6826],[117.1582,39.6387],[117.1582,39.8145],[117.2461,40.0781],[117.334,40.1221],[117.4219,40.21],[117.6855,40.0781],[117.6855,39.9902],[117.5098,39.9902],[117.5098,39.7705],[117.6855,39.5947],[117.9492,39.5947],[117.8613,39.4189],[118.0371,39.2432],[118.0371,39.1992],[117.8613,39.1113],[117.5977,38.6279],[117.2461,38.54],[116.7188,38.8037],[116.7188,38.9355],[116.8945,39.1113],[116.8066,39.5947]]]}},{"type":"Feature","properties":{"id":"31","size":"7500","name":"上海","cp":[121.4648,31.2891],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[120.9375,31.0254],[121.2012,31.4648],[121.377,31.5088],[121.1133,31.7285],[121.2012,31.8604],[121.9922,31.5967],[121.9043,31.1572],[121.9922,30.8057],[121.2891,30.6738],[120.9375,31.0254]]]}},{"type":"Feature","properties":{"id":"81","size":"18000","name":"香港","cp":[114.1178,22.3242],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[114.6094,22.4121],[114.5215,22.1484],[114.3457,22.1484],[113.9063,22.1484],[113.8184,22.1924],[113.9063,22.4121],[114.1699,22.5439],[114.3457,22.5439],[114.4336,22.5439],[114.4336,22.4121],[114.6094,22.4121]]]}},{"type":"Feature","properties":{"id":"82","size":"27","name":"澳门","cp":[111.5547,22.1484],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}}]} diff --git a/assets/json/industry-data.json b/assets/json/industry-data.json new file mode 100644 index 0000000..0d8baa8 --- /dev/null +++ b/assets/json/industry-data.json @@ -0,0 +1 @@ +[{"value":1001,"label":"IT服务","children":[{"value":1001000,"label":"计算机软件/硬件/信息服务","children":[]},{"value":1001001,"label":"互联网和相关服务","children":[]},{"value":1001002,"label":"其他","children":[]}],"icon":""},{"value":1002,"label":"制造业","children":[{"value":1002000,"label":"机械/电子","children":[]},{"value":1003000,"label":"服装/纺织","children":[]},{"value":1002002,"label":"汽车","children":[]},{"value":1002005,"label":"金属制品","children":[]},{"value":1003002,"label":"食品/饮料","children":[]},{"value":1003003,"label":"家具/家纺","children":[]},{"value":1002001,"label":"重工制造","children":[]},{"value":1003005,"label":"家电/数码","children":[]},{"value":1002004,"label":"橡胶/塑料","children":[]},{"value":1003004,"label":"日用品/化妆品","children":[]},{"value":1002006,"label":"化学原料制品","children":[]},{"value":1003007,"label":"文教/工美/体育/娱乐用品","children":[]},{"value":1003006,"label":"烟酒/茶","children":[]},{"value":1002007,"label":"非金属矿物","children":[]},{"value":1002003,"label":"其他","children":[]}],"icon":""},{"value":1003,"label":"批发/零售","children":[{"value":1003008,"label":"批发","children":[]},{"value":1003010,"label":"零售","children":[]},{"value":1003001,"label":"超市/便利店/百货商场","children":[]},{"value":1003011,"label":"进出口","children":[]},{"value":1003009,"label":"其他","children":[]}],"icon":""},{"value":1004,"label":"生活服务","children":[{"value":1004001,"label":"餐饮","children":[]},{"value":1004004,"label":"居民服务","children":[]},{"value":1004002,"label":"租赁和商务服务","children":[]},{"value":1004000,"label":"酒店/住宿","children":[]},{"value":1004003,"label":"其他","children":[]}],"icon":""},{"value":1005,"label":"文化/体育/娱乐业","children":[{"value":1005001,"label":"文化/体育","children":[]},{"value":1005002,"label":"娱乐/旅游","children":[]},{"value":1005000,"label":"新闻传媒","children":[]},{"value":1005003,"label":"其他","children":[]}],"icon":""},{"value":1006,"label":"建筑/房地产","children":[{"value":1006001,"label":"建筑业","children":[]},{"value":1006002,"label":"建材装修","children":[]},{"value":1006000,"label":"房地产","children":[]},{"value":1006003,"label":"其他","children":[]}],"icon":""},{"value":1007,"label":"教育","children":[{"value":1007000,"label":"学前教育","children":[],"desc":"如:托儿所、幼儿园"},{"value":1007001,"label":"初中等教育","children":[],"desc":"如:小学、初中、高中、职高"},{"value":1007002,"label":"高等教育","children":[],"desc":"如:大学、高职、高专"},{"value":1007003,"label":"培训机构","children":[]},{"value":1007004,"label":"其他","children":[]}],"icon":""},{"value":1008,"label":"运输/物流/仓储","children":[{"value":1008003,"label":"物流/仓储","children":[]},{"value":1008000,"label":"道路/铁路运输","children":[]},{"value":1008004,"label":"邮政/快递","children":[]},{"value":1008001,"label":"航空运输","children":[]},{"value":1008002,"label":"水上运输","children":[]},{"value":1008005,"label":"其他","children":[]}],"icon":""},{"value":1009,"label":"医疗","children":[{"value":1009000,"label":"医院/医疗机构","children":[]},{"value":1009003,"label":"医疗器械","children":[]},{"value":1009001,"label":"医药制造","children":[]},{"value":1009002,"label":"医药流通","children":[]},{"value":1009004,"label":"其他","children":[]}],"icon":""},{"value":1010,"label":"政府","children":[{"value":1010000,"label":"党政机关","children":[]},{"value":1010001,"label":"国家权力/行政机构","children":[]},{"value":1010002,"label":"检察院/法院/公安","children":[]},{"value":1010003,"label":"民政/人社/交通/卫生","children":[]},{"value":1010004,"label":"发改委/经信委/商务局/统计局","children":[]},{"value":1010005,"label":"国土/规划","children":[]},{"value":1010006,"label":"税务/海关/工商/环保/物价/药品","children":[]},{"value":1010007,"label":"政协/民主党派","children":[]},{"value":1010008,"label":"地方政府","children":[]},{"value":1010009,"label":"其他","children":[]}],"icon":""},{"value":1011,"label":"金融","children":[{"value":1011000,"label":"保险","children":[]},{"value":1011001,"label":"银行","children":[]},{"value":1011002,"label":"证券/投资/基金","children":[]},{"value":1011003,"label":"其他","children":[]}],"icon":""},{"value":1012,"label":"能源/采矿","children":[{"value":1014003,"label":"电力/热力/燃气/水供应业","children":[]},{"value":1012003,"label":"石油/天然气","children":[]},{"value":1012002,"label":"煤炭","children":[]},{"value":1012001,"label":"有色金属","children":[]},{"value":1012000,"label":"钢铁","children":[]},{"value":1012004,"label":"其他","children":[]}],"icon":""},{"value":1013,"label":"农林渔牧","children":[{"value":1013000,"label":"农林渔牧","children":[]}],"icon":""},{"value":1014,"label":"其他行业","children":[{"value":1014000,"label":"科学研究和技术服务业","children":[]},{"value":1014002,"label":"社会组织","children":[]},{"value":1014001,"label":"水利和环境管理","children":[]},{"value":1014004,"label":"国际组织","children":[]},{"value":1014005,"label":"其他","children":[]}],"icon":""}] diff --git a/assets/json/regions-data.json b/assets/json/regions-data.json new file mode 100644 index 0000000..4cbd130 --- /dev/null +++ b/assets/json/regions-data.json @@ -0,0 +1 @@ +[{"label":"北京","value":"110000","children":[{"value":"110100","label":"北京市","children":[{"value":"110101","label":"东城区"},{"value":"110102","label":"西城区"},{"value":"110103","label":"崇文区"},{"value":"110104","label":"宣武区"},{"value":"110105","label":"朝阳区"},{"value":"110106","label":"丰台区"},{"value":"110107","label":"石景山区"},{"value":"110108","label":"海淀区"},{"value":"110109","label":"门头沟区"},{"value":"110111","label":"房山区"},{"value":"110112","label":"通州区"},{"value":"110113","label":"顺义区"},{"value":"110114","label":"昌平区"},{"value":"110115","label":"大兴区"},{"value":"110116","label":"怀柔区"},{"value":"110117","label":"平谷区"},{"value":"110228","label":"密云县"},{"value":"110229","label":"延庆县"}]}]},{"label":"天津","value":"120000","children":[{"value":"120100","label":"天津市","children":[{"value":"120101","label":"和平区"},{"value":"120102","label":"河东区"},{"value":"120103","label":"河西区"},{"value":"120104","label":"南开区"},{"value":"120105","label":"河北区"},{"value":"120106","label":"红桥区"},{"value":"120107","label":"塘沽区"},{"value":"120108","label":"汉沽区"},{"value":"120109","label":"大港区"},{"value":"120110","label":"东丽区"},{"value":"120111","label":"西青区"},{"value":"120112","label":"津南区"},{"value":"120113","label":"北辰区"},{"value":"120114","label":"武清区"},{"value":"120115","label":"宝坻区"},{"value":"120116","label":"滨海新区"},{"value":"120221","label":"宁河县"},{"value":"120223","label":"静海县"},{"value":"120225","label":"蓟县"}]}]},{"label":"河北省","value":"130000","children":[{"value":"130100","label":"石家庄市","children":[{"value":"130102","label":"长安区"},{"value":"130103","label":"桥东区"},{"value":"130104","label":"桥西区"},{"value":"130105","label":"新华区"},{"value":"130107","label":"井陉矿区"},{"value":"130108","label":"裕华区"},{"value":"130121","label":"井陉县"},{"value":"130123","label":"正定县"},{"value":"130124","label":"栾城县"},{"value":"130125","label":"行唐县"},{"value":"130126","label":"灵寿县"},{"value":"130127","label":"高邑县"},{"value":"130128","label":"深泽县"},{"value":"130129","label":"赞皇县"},{"value":"130130","label":"无极县"},{"value":"130131","label":"平山县"},{"value":"130132","label":"元氏县"},{"value":"130133","label":"赵县"},{"value":"130181","label":"辛集市"},{"value":"130182","label":"藁城市"},{"value":"130183","label":"晋州市"},{"value":"130184","label":"新乐市"},{"value":"130185","label":"鹿泉市"}]},{"value":"130200","label":"唐山市","children":[{"value":"130202","label":"路南区"},{"value":"130203","label":"路北区"},{"value":"130204","label":"古冶区"},{"value":"130205","label":"开平区"},{"value":"130207","label":"丰南区"},{"value":"130208","label":"丰润区"},{"value":"130223","label":"滦县"},{"value":"130224","label":"滦南县"},{"value":"130225","label":"乐亭县"},{"value":"130227","label":"迁西县"},{"value":"130229","label":"玉田县"},{"value":"130230","label":"唐海县"},{"value":"130281","label":"遵化市"},{"value":"130283","label":"迁安市"}]},{"value":"130300","label":"秦皇岛市","children":[{"value":"130302","label":"海港区"},{"value":"130303","label":"山海关区"},{"value":"130304","label":"北戴河区"},{"value":"130321","label":"青龙满族自治县"},{"value":"130322","label":"昌黎县"},{"value":"130323","label":"抚宁县"},{"value":"130324","label":"卢龙县"},{"value":"130399","label":"经济技术开发区"}]},{"value":"130400","label":"邯郸市","children":[{"value":"130402","label":"邯山区"},{"value":"130403","label":"丛台区"},{"value":"130404","label":"复兴区"},{"value":"130406","label":"峰峰矿区"},{"value":"130421","label":"邯郸县"},{"value":"130423","label":"临漳县"},{"value":"130424","label":"成安县"},{"value":"130425","label":"大名县"},{"value":"130426","label":"涉县"},{"value":"130427","label":"磁县"},{"value":"130428","label":"肥乡县"},{"value":"130429","label":"永年县"},{"value":"130430","label":"邱县"},{"value":"130431","label":"鸡泽县"},{"value":"130432","label":"广平县"},{"value":"130433","label":"馆陶县"},{"value":"130434","label":"魏县"},{"value":"130435","label":"曲周县"},{"value":"130481","label":"武安市"}]},{"value":"130500","label":"邢台市","children":[{"value":"130502","label":"桥东区"},{"value":"130503","label":"桥西区"},{"value":"130521","label":"邢台县"},{"value":"130522","label":"临城县"},{"value":"130523","label":"内丘县"},{"value":"130524","label":"柏乡县"},{"value":"130525","label":"隆尧县"},{"value":"130526","label":"任县"},{"value":"130527","label":"南和县"},{"value":"130528","label":"宁晋县"},{"value":"130529","label":"巨鹿县"},{"value":"130530","label":"新河县"},{"value":"130531","label":"广宗县"},{"value":"130532","label":"平乡县"},{"value":"130533","label":"威县"},{"value":"130534","label":"清河县"},{"value":"130535","label":"临西县"},{"value":"130581","label":"南宫市"},{"value":"130582","label":"沙河市"}]},{"value":"130600","label":"保定市","children":[{"value":"130602","label":"新市区"},{"value":"130603","label":"北市区"},{"value":"130604","label":"南市区"},{"value":"130621","label":"满城县"},{"value":"130622","label":"清苑县"},{"value":"130623","label":"涞水县"},{"value":"130624","label":"阜平县"},{"value":"130625","label":"徐水县"},{"value":"130626","label":"定兴县"},{"value":"130627","label":"唐县"},{"value":"130628","label":"高阳县"},{"value":"130629","label":"容城县"},{"value":"130630","label":"涞源县"},{"value":"130631","label":"望都县"},{"value":"130632","label":"安新县"},{"value":"130633","label":"易县"},{"value":"130634","label":"曲阳县"},{"value":"130635","label":"蠡县"},{"value":"130636","label":"顺平县"},{"value":"130637","label":"博野县"},{"value":"130638","label":"雄县"},{"value":"130681","label":"涿州市"},{"value":"130682","label":"定州市"},{"value":"130683","label":"安国市"},{"value":"130684","label":"高碑店市"},{"value":"130698","label":"高开区"}]},{"value":"130700","label":"张家口市","children":[{"value":"130702","label":"桥东区"},{"value":"130703","label":"桥西区"},{"value":"130705","label":"宣化区"},{"value":"130706","label":"下花园区"},{"value":"130721","label":"宣化县"},{"value":"130722","label":"张北县"},{"value":"130723","label":"康保县"},{"value":"130724","label":"沽源县"},{"value":"130725","label":"尚义县"},{"value":"130726","label":"蔚县"},{"value":"130727","label":"阳原县"},{"value":"130728","label":"怀安县"},{"value":"130729","label":"万全县"},{"value":"130730","label":"怀来县"},{"value":"130731","label":"涿鹿县"},{"value":"130732","label":"赤城县"},{"value":"130733","label":"崇礼县"}]},{"value":"130800","label":"承德市","children":[{"value":"130802","label":"双桥区"},{"value":"130803","label":"双滦区"},{"value":"130804","label":"鹰手营子矿区"},{"value":"130821","label":"承德县"},{"value":"130822","label":"兴隆县"},{"value":"130823","label":"平泉县"},{"value":"130824","label":"滦平县"},{"value":"130825","label":"隆化县"},{"value":"130826","label":"丰宁满族自治县"},{"value":"130827","label":"宽城满族自治县"},{"value":"130828","label":"围场满族蒙古族自治县"}]},{"value":"130900","label":"沧州市","children":[{"value":"130902","label":"新华区"},{"value":"130903","label":"运河区"},{"value":"130921","label":"沧县"},{"value":"130922","label":"青县"},{"value":"130923","label":"东光县"},{"value":"130924","label":"海兴县"},{"value":"130925","label":"盐山县"},{"value":"130926","label":"肃宁县"},{"value":"130927","label":"南皮县"},{"value":"130928","label":"吴桥县"},{"value":"130929","label":"献县"},{"value":"130930","label":"孟村回族自治县"},{"value":"130981","label":"泊头市"},{"value":"130982","label":"任丘市"},{"value":"130983","label":"黄骅市"},{"value":"130984","label":"河间市"}]},{"value":"131000","label":"廊坊市","children":[{"value":"131002","label":"安次区"},{"value":"131003","label":"广阳区"},{"value":"131022","label":"固安县"},{"value":"131023","label":"永清县"},{"value":"131024","label":"香河县"},{"value":"131025","label":"大城县"},{"value":"131026","label":"文安县"},{"value":"131028","label":"大厂回族自治县"},{"value":"131051","label":"开发区"},{"value":"131052","label":"燕郊经济技术开发区"},{"value":"131081","label":"霸州市"},{"value":"131082","label":"三河市"}]},{"value":"131100","label":"衡水市","children":[{"value":"131102","label":"桃城区"},{"value":"131121","label":"枣强县"},{"value":"131122","label":"武邑县"},{"value":"131123","label":"武强县"},{"value":"131124","label":"饶阳县"},{"value":"131125","label":"安平县"},{"value":"131126","label":"故城县"},{"value":"131127","label":"景县"},{"value":"131128","label":"阜城县"},{"value":"131181","label":"冀州市"},{"value":"131182","label":"深州市"}]}]},{"label":"山西省","value":"140000","children":[{"value":"140100","label":"太原市","children":[{"value":"140105","label":"小店区"},{"value":"140106","label":"迎泽区"},{"value":"140107","label":"杏花岭区"},{"value":"140108","label":"尖草坪区"},{"value":"140109","label":"万柏林区"},{"value":"140110","label":"晋源区"},{"value":"140121","label":"清徐县"},{"value":"140122","label":"阳曲县"},{"value":"140123","label":"娄烦县"},{"value":"140181","label":"古交市"}]},{"value":"140200","label":"大同市","children":[{"value":"140202","label":"城区"},{"value":"140203","label":"矿区"},{"value":"140211","label":"南郊区"},{"value":"140212","label":"新荣区"},{"value":"140221","label":"阳高县"},{"value":"140222","label":"天镇县"},{"value":"140223","label":"广灵县"},{"value":"140224","label":"灵丘县"},{"value":"140225","label":"浑源县"},{"value":"140226","label":"左云县"},{"value":"140227","label":"大同县"}]},{"value":"140300","label":"阳泉市","children":[{"value":"140302","label":"城区"},{"value":"140303","label":"矿区"},{"value":"140311","label":"郊区"},{"value":"140321","label":"平定县"},{"value":"140322","label":"盂县"}]},{"value":"140400","label":"长治市","children":[{"value":"140421","label":"长治县"},{"value":"140423","label":"襄垣县"},{"value":"140424","label":"屯留县"},{"value":"140425","label":"平顺县"},{"value":"140426","label":"黎城县"},{"value":"140427","label":"壶关县"},{"value":"140428","label":"长子县"},{"value":"140429","label":"武乡县"},{"value":"140430","label":"沁县"},{"value":"140431","label":"沁源县"},{"value":"140481","label":"潞城市"},{"value":"140482","label":"城区"},{"value":"140483","label":"郊区"},{"value":"140484","label":"高新区"}]},{"value":"140500","label":"晋城市","children":[{"value":"140502","label":"城区"},{"value":"140521","label":"沁水县"},{"value":"140522","label":"阳城县"},{"value":"140524","label":"陵川县"},{"value":"140525","label":"泽州县"},{"value":"140581","label":"高平市"}]},{"value":"140600","label":"朔州市","children":[{"value":"140602","label":"朔城区"},{"value":"140603","label":"平鲁区"},{"value":"140621","label":"山阴县"},{"value":"140622","label":"应县"},{"value":"140623","label":"右玉县"},{"value":"140624","label":"怀仁县"}]},{"value":"140700","label":"晋中市","children":[{"value":"140702","label":"榆次区"},{"value":"140721","label":"榆社县"},{"value":"140722","label":"左权县"},{"value":"140723","label":"和顺县"},{"value":"140724","label":"昔阳县"},{"value":"140725","label":"寿阳县"},{"value":"140726","label":"太谷县"},{"value":"140727","label":"祁县"},{"value":"140728","label":"平遥县"},{"value":"140729","label":"灵石县"},{"value":"140781","label":"介休市"}]},{"value":"140800","label":"运城市","children":[{"value":"140802","label":"盐湖区"},{"value":"140821","label":"临猗县"},{"value":"140822","label":"万荣县"},{"value":"140823","label":"闻喜县"},{"value":"140824","label":"稷山县"},{"value":"140825","label":"新绛县"},{"value":"140826","label":"绛县"},{"value":"140827","label":"垣曲县"},{"value":"140828","label":"夏县"},{"value":"140829","label":"平陆县"},{"value":"140830","label":"芮城县"},{"value":"140881","label":"永济市"},{"value":"140882","label":"河津市"}]},{"value":"140900","label":"忻州市","children":[{"value":"140902","label":"忻府区"},{"value":"140921","label":"定襄县"},{"value":"140922","label":"五台县"},{"value":"140923","label":"代县"},{"value":"140924","label":"繁峙县"},{"value":"140925","label":"宁武县"},{"value":"140926","label":"静乐县"},{"value":"140927","label":"神池县"},{"value":"140928","label":"五寨县"},{"value":"140929","label":"岢岚县"},{"value":"140930","label":"河曲县"},{"value":"140931","label":"保德县"},{"value":"140932","label":"偏关县"},{"value":"140981","label":"原平市"}]},{"value":"141000","label":"临汾市","children":[{"value":"141002","label":"尧都区"},{"value":"141021","label":"曲沃县"},{"value":"141022","label":"翼城县"},{"value":"141023","label":"襄汾县"},{"value":"141024","label":"洪洞县"},{"value":"141025","label":"古县"},{"value":"141026","label":"安泽县"},{"value":"141027","label":"浮山县"},{"value":"141028","label":"吉县"},{"value":"141029","label":"乡宁县"},{"value":"141030","label":"大宁县"},{"value":"141031","label":"隰县"},{"value":"141032","label":"永和县"},{"value":"141033","label":"蒲县"},{"value":"141034","label":"汾西县"},{"value":"141081","label":"侯马市"},{"value":"141082","label":"霍州市"}]},{"value":"141100","label":"吕梁市","children":[{"value":"141102","label":"离石区"},{"value":"141121","label":"文水县"},{"value":"141122","label":"交城县"},{"value":"141123","label":"兴县"},{"value":"141124","label":"临县"},{"value":"141125","label":"柳林县"},{"value":"141126","label":"石楼县"},{"value":"141127","label":"岚县"},{"value":"141128","label":"方山县"},{"value":"141129","label":"中阳县"},{"value":"141130","label":"交口县"},{"value":"141181","label":"孝义市"},{"value":"141182","label":"汾阳市"}]}]},{"label":"内蒙古自治区","value":"150000","children":[{"value":"150100","label":"呼和浩特市","children":[{"value":"150102","label":"新城区"},{"value":"150103","label":"回民区"},{"value":"150104","label":"玉泉区"},{"value":"150105","label":"赛罕区"},{"value":"150121","label":"土默特左旗"},{"value":"150122","label":"托克托县"},{"value":"150123","label":"和林格尔县"},{"value":"150124","label":"清水河县"},{"value":"150125","label":"武川县"}]},{"value":"150200","label":"包头市","children":[{"value":"150202","label":"东河区"},{"value":"150203","label":"昆都仑区"},{"value":"150204","label":"青山区"},{"value":"150205","label":"石拐区"},{"value":"150206","label":"白云矿区"},{"value":"150207","label":"九原区"},{"value":"150221","label":"土默特右旗"},{"value":"150222","label":"固阳县"},{"value":"150223","label":"达尔罕茂明安联合旗"}]},{"value":"150300","label":"乌海市","children":[{"value":"150302","label":"海勃湾区"},{"value":"150303","label":"海南区"},{"value":"150304","label":"乌达区"}]},{"value":"150400","label":"赤峰市","children":[{"value":"150402","label":"红山区"},{"value":"150403","label":"元宝山区"},{"value":"150404","label":"松山区"},{"value":"150421","label":"阿鲁科尔沁旗"},{"value":"150422","label":"巴林左旗"},{"value":"150423","label":"巴林右旗"},{"value":"150424","label":"林西县"},{"value":"150425","label":"克什克腾旗"},{"value":"150426","label":"翁牛特旗"},{"value":"150428","label":"喀喇沁旗"},{"value":"150429","label":"宁城县"},{"value":"150430","label":"敖汉旗"}]},{"value":"150500","label":"通辽市","children":[{"value":"150502","label":"科尔沁区"},{"value":"150521","label":"科尔沁左翼中旗"},{"value":"150522","label":"科尔沁左翼后旗"},{"value":"150523","label":"开鲁县"},{"value":"150524","label":"库伦旗"},{"value":"150525","label":"奈曼旗"},{"value":"150526","label":"扎鲁特旗"},{"value":"150581","label":"霍林郭勒市"}]},{"value":"150600","label":"鄂尔多斯市","children":[{"value":"150602","label":"东胜区"},{"value":"150621","label":"达拉特旗"},{"value":"150622","label":"准格尔旗"},{"value":"150623","label":"鄂托克前旗"},{"value":"150624","label":"鄂托克旗"},{"value":"150625","label":"杭锦旗"},{"value":"150626","label":"乌审旗"},{"value":"150627","label":"伊金霍洛旗"}]},{"value":"150700","label":"呼伦贝尔市","children":[{"value":"150702","label":"海拉尔区"},{"value":"150721","label":"阿荣旗"},{"value":"150722","label":"莫力达瓦达斡尔族自治旗"},{"value":"150723","label":"鄂伦春自治旗"},{"value":"150724","label":"鄂温克族自治旗"},{"value":"150725","label":"陈巴尔虎旗"},{"value":"150726","label":"新巴尔虎左旗"},{"value":"150727","label":"新巴尔虎右旗"},{"value":"150781","label":"满洲里市"},{"value":"150782","label":"牙克石市"},{"value":"150783","label":"扎兰屯市"},{"value":"150784","label":"额尔古纳市"},{"value":"150785","label":"根河市"}]},{"value":"150800","label":"巴彦淖尔市","children":[{"value":"150802","label":"临河区"},{"value":"150821","label":"五原县"},{"value":"150822","label":"磴口县"},{"value":"150823","label":"乌拉特前旗"},{"value":"150824","label":"乌拉特中旗"},{"value":"150825","label":"乌拉特后旗"},{"value":"150826","label":"杭锦后旗"}]},{"value":"150900","label":"乌兰察布市","children":[{"value":"150902","label":"集宁区"},{"value":"150921","label":"卓资县"},{"value":"150922","label":"化德县"},{"value":"150923","label":"商都县"},{"value":"150924","label":"兴和县"},{"value":"150925","label":"凉城县"},{"value":"150926","label":"察哈尔右翼前旗"},{"value":"150927","label":"察哈尔右翼中旗"},{"value":"150928","label":"察哈尔右翼后旗"},{"value":"150929","label":"四子王旗"},{"value":"150981","label":"丰镇市"}]},{"value":"152200","label":"兴安盟","children":[{"value":"152201","label":"乌兰浩特市"},{"value":"152202","label":"阿尔山市"},{"value":"152221","label":"科尔沁右翼前旗"},{"value":"152222","label":"科尔沁右翼中旗"},{"value":"152223","label":"扎赉特旗"},{"value":"152224","label":"突泉县"}]},{"value":"152500","label":"锡林郭勒盟","children":[{"value":"152501","label":"二连浩特市"},{"value":"152502","label":"锡林浩特市"},{"value":"152522","label":"阿巴嘎旗"},{"value":"152523","label":"苏尼特左旗"},{"value":"152524","label":"苏尼特右旗"},{"value":"152525","label":"东乌珠穆沁旗"},{"value":"152526","label":"西乌珠穆沁旗"},{"value":"152527","label":"太仆寺旗"},{"value":"152528","label":"镶黄旗"},{"value":"152529","label":"正镶白旗"},{"value":"152530","label":"正蓝旗"},{"value":"152531","label":"多伦县"}]},{"value":"152900","label":"阿拉善盟","children":[{"value":"152921","label":"阿拉善左旗"},{"value":"152922","label":"阿拉善右旗"},{"value":"152923","label":"额济纳旗"}]}]},{"label":"辽宁省","value":"210000","children":[{"value":"210100","label":"沈阳市","children":[{"value":"210102","label":"和平区"},{"value":"210103","label":"沈河区"},{"value":"210104","label":"大东区"},{"value":"210105","label":"皇姑区"},{"value":"210106","label":"铁西区"},{"value":"210111","label":"苏家屯区"},{"value":"210112","label":"东陵区"},{"value":"210113","label":"新城子区"},{"value":"210114","label":"于洪区"},{"value":"210122","label":"辽中县"},{"value":"210123","label":"康平县"},{"value":"210124","label":"法库县"},{"value":"210181","label":"新民市"},{"value":"210182","label":"浑南新区"},{"value":"210183","label":"张士开发区"},{"value":"210184","label":"沈北新区"}]},{"value":"210200","label":"大连市","children":[{"value":"210202","label":"中山区"},{"value":"210203","label":"西岗区"},{"value":"210204","label":"沙河口区"},{"value":"210211","label":"甘井子区"},{"value":"210212","label":"旅顺口区"},{"value":"210213","label":"金州区"},{"value":"210224","label":"长海县"},{"value":"210251","label":"开发区"},{"value":"210281","label":"瓦房店市"},{"value":"210282","label":"普兰店市"},{"value":"210283","label":"庄河市"},{"value":"210297","label":"岭前区"}]},{"value":"210300","label":"鞍山市","children":[{"value":"210302","label":"铁东区"},{"value":"210303","label":"铁西区"},{"value":"210304","label":"立山区"},{"value":"210311","label":"千山区"},{"value":"210321","label":"台安县"},{"value":"210323","label":"岫岩满族自治县"},{"value":"210351","label":"高新区"},{"value":"210381","label":"海城市"}]},{"value":"210400","label":"抚顺市","children":[{"value":"210402","label":"新抚区"},{"value":"210403","label":"东洲区"},{"value":"210404","label":"望花区"},{"value":"210411","label":"顺城区"},{"value":"210421","label":"抚顺县"},{"value":"210422","label":"新宾满族自治县"},{"value":"210423","label":"清原满族自治县"}]},{"value":"210500","label":"本溪市","children":[{"value":"210502","label":"平山区"},{"value":"210503","label":"溪湖区"},{"value":"210504","label":"明山区"},{"value":"210505","label":"南芬区"},{"value":"210521","label":"本溪满族自治县"},{"value":"210522","label":"桓仁满族自治县"}]},{"value":"210600","label":"丹东市","children":[{"value":"210602","label":"元宝区"},{"value":"210603","label":"振兴区"},{"value":"210604","label":"振安区"},{"value":"210624","label":"宽甸满族自治县"},{"value":"210681","label":"东港市"},{"value":"210682","label":"凤城市"}]},{"value":"210700","label":"锦州市","children":[{"value":"210702","label":"古塔区"},{"value":"210703","label":"凌河区"},{"value":"210711","label":"太和区"},{"value":"210726","label":"黑山县"},{"value":"210727","label":"义县"},{"value":"210781","label":"凌海市"},{"value":"210782","label":"北镇市"}]},{"value":"210800","label":"营口市","children":[{"value":"210802","label":"站前区"},{"value":"210803","label":"西市区"},{"value":"210804","label":"鲅鱼圈区"},{"value":"210811","label":"老边区"},{"value":"210881","label":"盖州市"},{"value":"210882","label":"大石桥市"}]},{"value":"210900","label":"阜新市","children":[{"value":"210902","label":"海州区"},{"value":"210903","label":"新邱区"},{"value":"210904","label":"太平区"},{"value":"210905","label":"清河门区"},{"value":"210911","label":"细河区"},{"value":"210921","label":"阜新蒙古族自治县"},{"value":"210922","label":"彰武县"}]},{"value":"211000","label":"辽阳市","children":[{"value":"211002","label":"白塔区"},{"value":"211003","label":"文圣区"},{"value":"211004","label":"宏伟区"},{"value":"211005","label":"弓长岭区"},{"value":"211011","label":"太子河区"},{"value":"211021","label":"辽阳县"},{"value":"211081","label":"灯塔市"}]},{"value":"211100","label":"盘锦市","children":[{"value":"211102","label":"双台子区"},{"value":"211103","label":"兴隆台区"},{"value":"211121","label":"大洼县"},{"value":"211122","label":"盘山县"}]},{"value":"211200","label":"铁岭市","children":[{"value":"211202","label":"银州区"},{"value":"211204","label":"清河区"},{"value":"211221","label":"铁岭县"},{"value":"211223","label":"西丰县"},{"value":"211224","label":"昌图县"},{"value":"211281","label":"调兵山市"},{"value":"211282","label":"开原市"}]},{"value":"211300","label":"朝阳市","children":[{"value":"211302","label":"双塔区"},{"value":"211303","label":"龙城区"},{"value":"211321","label":"朝阳县"},{"value":"211322","label":"建平县"},{"value":"211324","label":"喀喇沁左翼蒙古族自治县"},{"value":"211381","label":"北票市"},{"value":"211382","label":"凌源市"}]},{"value":"211400","label":"葫芦岛市","children":[{"value":"211402","label":"连山区"},{"value":"211403","label":"龙港区"},{"value":"211404","label":"南票区"},{"value":"211421","label":"绥中县"},{"value":"211422","label":"建昌县"},{"value":"211481","label":"兴城市"}]}]},{"label":"吉林省","value":"220000","children":[{"value":"220100","label":"长春市","children":[{"value":"220102","label":"南关区"},{"value":"220103","label":"宽城区"},{"value":"220104","label":"朝阳区"},{"value":"220105","label":"二道区"},{"value":"220106","label":"绿园区"},{"value":"220112","label":"双阳区"},{"value":"220122","label":"农安县"},{"value":"220181","label":"九台市"},{"value":"220182","label":"榆树市"},{"value":"220183","label":"德惠市"},{"value":"220184","label":"高新技术产业开发区"},{"value":"220185","label":"汽车产业开发区"},{"value":"220186","label":"经济技术开发区"},{"value":"220187","label":"净月旅游开发区"}]},{"value":"220200","label":"吉林市","children":[{"value":"220202","label":"昌邑区"},{"value":"220203","label":"龙潭区"},{"value":"220204","label":"船营区"},{"value":"220211","label":"丰满区"},{"value":"220221","label":"永吉县"},{"value":"220281","label":"蛟河市"},{"value":"220282","label":"桦甸市"},{"value":"220283","label":"舒兰市"},{"value":"220284","label":"磐石市"}]},{"value":"220300","label":"四平市","children":[{"value":"220302","label":"铁西区"},{"value":"220303","label":"铁东区"},{"value":"220322","label":"梨树县"},{"value":"220323","label":"伊通满族自治县"},{"value":"220381","label":"公主岭市"},{"value":"220382","label":"双辽市"}]},{"value":"220400","label":"辽源市","children":[{"value":"220402","label":"龙山区"},{"value":"220403","label":"西安区"},{"value":"220421","label":"东丰县"},{"value":"220422","label":"东辽县"}]},{"value":"220500","label":"通化市","children":[{"value":"220502","label":"东昌区"},{"value":"220503","label":"二道江区"},{"value":"220521","label":"通化县"},{"value":"220523","label":"辉南县"},{"value":"220524","label":"柳河县"},{"value":"220581","label":"梅河口市"},{"value":"220582","label":"集安市"}]},{"value":"220600","label":"白山市","children":[{"value":"220602","label":"八道江区"},{"value":"220621","label":"抚松县"},{"value":"220622","label":"靖宇县"},{"value":"220623","label":"长白朝鲜族自治县"},{"value":"220625","label":"江源市"},{"value":"220681","label":"临江市"}]},{"value":"220700","label":"松原市","children":[{"value":"220702","label":"宁江区"},{"value":"220721","label":"前郭尔罗斯蒙古族自治县"},{"value":"220722","label":"长岭县"},{"value":"220723","label":"乾安县"},{"value":"220724","label":"扶余县"}]},{"value":"220800","label":"白城市","children":[{"value":"220802","label":"洮北区"},{"value":"220821","label":"镇赉县"},{"value":"220822","label":"通榆县"},{"value":"220881","label":"洮南市"},{"value":"220882","label":"大安市"}]},{"value":"222400","label":"延边朝鲜族自治州","children":[{"value":"222401","label":"延吉市"},{"value":"222402","label":"图们市"},{"value":"222403","label":"敦化市"},{"value":"222404","label":"珲春市"},{"value":"222405","label":"龙井市"},{"value":"222406","label":"和龙市"},{"value":"222424","label":"汪清县"},{"value":"222426","label":"安图县"}]}]},{"label":"黑龙江省","value":"230000","children":[{"value":"230100","label":"哈尔滨市","children":[{"value":"230102","label":"道里区"},{"value":"230103","label":"南岗区"},{"value":"230104","label":"道外区"},{"value":"230106","label":"香坊区"},{"value":"230107","label":"动力区"},{"value":"230108","label":"平房区"},{"value":"230109","label":"松北区"},{"value":"230111","label":"呼兰区"},{"value":"230123","label":"依兰县"},{"value":"230124","label":"方正县"},{"value":"230125","label":"宾县"},{"value":"230126","label":"巴彦县"},{"value":"230127","label":"木兰县"},{"value":"230128","label":"通河县"},{"value":"230129","label":"延寿县"},{"value":"230181","label":"阿城市"},{"value":"230182","label":"双城市"},{"value":"230183","label":"尚志市"},{"value":"230184","label":"五常市"},{"value":"230185","label":"阿城市"}]},{"value":"230200","label":"齐齐哈尔市","children":[{"value":"230202","label":"龙沙区"},{"value":"230203","label":"建华区"},{"value":"230204","label":"铁锋区"},{"value":"230205","label":"昂昂溪区"},{"value":"230206","label":"富拉尔基区"},{"value":"230207","label":"碾子山区"},{"value":"230208","label":"梅里斯达斡尔族区"},{"value":"230221","label":"龙江县"},{"value":"230223","label":"依安县"},{"value":"230224","label":"泰来县"},{"value":"230225","label":"甘南县"},{"value":"230227","label":"富裕县"},{"value":"230229","label":"克山县"},{"value":"230230","label":"克东县"},{"value":"230231","label":"拜泉县"},{"value":"230281","label":"讷河市"}]},{"value":"230300","label":"鸡西市","children":[{"value":"230302","label":"鸡冠区"},{"value":"230303","label":"恒山区"},{"value":"230304","label":"滴道区"},{"value":"230305","label":"梨树区"},{"value":"230306","label":"城子河区"},{"value":"230307","label":"麻山区"},{"value":"230321","label":"鸡东县"},{"value":"230381","label":"虎林市"},{"value":"230382","label":"密山市"}]},{"value":"230400","label":"鹤岗市","children":[{"value":"230402","label":"向阳区"},{"value":"230403","label":"工农区"},{"value":"230404","label":"南山区"},{"value":"230405","label":"兴安区"},{"value":"230406","label":"东山区"},{"value":"230407","label":"兴山区"},{"value":"230421","label":"萝北县"},{"value":"230422","label":"绥滨县"}]},{"value":"230500","label":"双鸭山市","children":[{"value":"230502","label":"尖山区"},{"value":"230503","label":"岭东区"},{"value":"230505","label":"四方台区"},{"value":"230506","label":"宝山区"},{"value":"230521","label":"集贤县"},{"value":"230522","label":"友谊县"},{"value":"230523","label":"宝清县"},{"value":"230524","label":"饶河县"}]},{"value":"230600","label":"大庆市","children":[{"value":"230602","label":"萨尔图区"},{"value":"230603","label":"龙凤区"},{"value":"230604","label":"让胡路区"},{"value":"230605","label":"红岗区"},{"value":"230606","label":"大同区"},{"value":"230621","label":"肇州县"},{"value":"230622","label":"肇源县"},{"value":"230623","label":"林甸县"},{"value":"230624","label":"杜尔伯特蒙古族自治县"}]},{"value":"230700","label":"伊春市","children":[{"value":"230702","label":"伊春区"},{"value":"230703","label":"南岔区"},{"value":"230704","label":"友好区"},{"value":"230705","label":"西林区"},{"value":"230706","label":"翠峦区"},{"value":"230707","label":"新青区"},{"value":"230708","label":"美溪区"},{"value":"230709","label":"金山屯区"},{"value":"230710","label":"五营区"},{"value":"230711","label":"乌马河区"},{"value":"230712","label":"汤旺河区"},{"value":"230713","label":"带岭区"},{"value":"230714","label":"乌伊岭区"},{"value":"230715","label":"红星区"},{"value":"230716","label":"上甘岭区"},{"value":"230722","label":"嘉荫县"},{"value":"230781","label":"铁力市"}]},{"value":"230800","label":"佳木斯市","children":[{"value":"230802","label":"永红区"},{"value":"230803","label":"向阳区"},{"value":"230804","label":"前进区"},{"value":"230805","label":"东风区"},{"value":"230811","label":"郊区"},{"value":"230822","label":"桦南县"},{"value":"230826","label":"桦川县"},{"value":"230828","label":"汤原县"},{"value":"230833","label":"抚远县"},{"value":"230881","label":"同江市"},{"value":"230882","label":"富锦市"}]},{"value":"230900","label":"七台河市","children":[{"value":"230902","label":"新兴区"},{"value":"230903","label":"桃山区"},{"value":"230904","label":"茄子河区"},{"value":"230921","label":"勃利县"}]},{"value":"231000","label":"牡丹江市","children":[{"value":"231002","label":"东安区"},{"value":"231003","label":"阳明区"},{"value":"231004","label":"爱民区"},{"value":"231005","label":"西安区"},{"value":"231024","label":"东宁县"},{"value":"231025","label":"林口县"},{"value":"231081","label":"绥芬河市"},{"value":"231083","label":"海林市"},{"value":"231084","label":"宁安市"},{"value":"231085","label":"穆棱市"}]},{"value":"231100","label":"黑河市","children":[{"value":"231102","label":"爱辉区"},{"value":"231121","label":"嫩江县"},{"value":"231123","label":"逊克县"},{"value":"231124","label":"孙吴县"},{"value":"231181","label":"北安市"},{"value":"231182","label":"五大连池市"}]},{"value":"231200","label":"绥化市","children":[{"value":"231202","label":"北林区"},{"value":"231221","label":"望奎县"},{"value":"231222","label":"兰西县"},{"value":"231223","label":"青冈县"},{"value":"231224","label":"庆安县"},{"value":"231225","label":"明水县"},{"value":"231226","label":"绥棱县"},{"value":"231281","label":"安达市"},{"value":"231282","label":"肇东市"},{"value":"231283","label":"海伦市"}]},{"value":"232700","label":"大兴安岭地区","children":[{"value":"232721","label":"呼玛县"},{"value":"232722","label":"塔河县"},{"value":"232723","label":"漠河县"},{"value":"232724","label":"加格达奇区"}]}]},{"label":"上海","value":"310000","children":[{"value":"310100","label":"上海市","children":[{"value":"310101","label":"黄浦区"},{"value":"310103","label":"卢湾区"},{"value":"310104","label":"徐汇区"},{"value":"310105","label":"长宁区"},{"value":"310106","label":"静安区"},{"value":"310107","label":"普陀区"},{"value":"310108","label":"闸北区"},{"value":"310109","label":"虹口区"},{"value":"310110","label":"杨浦区"},{"value":"310112","label":"闵行区"},{"value":"310113","label":"宝山区"},{"value":"310114","label":"嘉定区"},{"value":"310115","label":"浦东新区"},{"value":"310116","label":"金山区"},{"value":"310117","label":"松江区"},{"value":"310118","label":"青浦区"},{"value":"310119","label":"南汇区"},{"value":"310120","label":"奉贤区"},{"value":"310152","label":"川沙区"},{"value":"310230","label":"崇明县"}]}]},{"label":"江苏省","value":"320000","children":[{"value":"320100","label":"南京市","children":[{"value":"320102","label":"玄武区"},{"value":"320103","label":"白下区"},{"value":"320104","label":"秦淮区"},{"value":"320105","label":"建邺区"},{"value":"320106","label":"鼓楼区"},{"value":"320107","label":"下关区"},{"value":"320111","label":"浦口区"},{"value":"320113","label":"栖霞区"},{"value":"320114","label":"雨花台区"},{"value":"320115","label":"江宁区"},{"value":"320116","label":"六合区"},{"value":"320124","label":"溧水县"},{"value":"320125","label":"高淳县"}]},{"value":"320200","label":"无锡市","children":[{"value":"320202","label":"崇安区"},{"value":"320203","label":"南长区"},{"value":"320204","label":"北塘区"},{"value":"320205","label":"锡山区"},{"value":"320206","label":"惠山区"},{"value":"320211","label":"滨湖区"},{"value":"320281","label":"江阴市"},{"value":"320282","label":"宜兴市"},{"value":"320296","label":"新区"}]},{"value":"320300","label":"徐州市","children":[{"value":"320302","label":"鼓楼区"},{"value":"320303","label":"云龙区"},{"value":"320304","label":"九里区"},{"value":"320305","label":"贾汪区"},{"value":"320311","label":"泉山区"},{"value":"320321","label":"丰县"},{"value":"320322","label":"沛县"},{"value":"320323","label":"铜山县"},{"value":"320324","label":"睢宁县"},{"value":"320381","label":"新沂市"},{"value":"320382","label":"邳州市"}]},{"value":"320400","label":"常州市","children":[{"value":"320402","label":"天宁区"},{"value":"320404","label":"钟楼区"},{"value":"320405","label":"戚墅堰区"},{"value":"320411","label":"新北区"},{"value":"320412","label":"武进区"},{"value":"320481","label":"溧阳市"},{"value":"320482","label":"金坛市"}]},{"value":"320500","label":"苏州市","children":[{"value":"320502","label":"沧浪区"},{"value":"320503","label":"平江区"},{"value":"320504","label":"金阊区"},{"value":"320505","label":"虎丘区"},{"value":"320506","label":"吴中区"},{"value":"320507","label":"相城区"},{"value":"320581","label":"常熟市"},{"value":"320582","label":"张家港市"},{"value":"320583","label":"昆山市"},{"value":"320584","label":"吴江市"},{"value":"320585","label":"太仓市"},{"value":"320594","label":"新区"},{"value":"320595","label":"园区"}]},{"value":"320600","label":"南通市","children":[{"value":"320602","label":"崇川区"},{"value":"320611","label":"港闸区"},{"value":"320612","label":"通州区"},{"value":"320621","label":"海安县"},{"value":"320623","label":"如东县"},{"value":"320681","label":"启东市"},{"value":"320682","label":"如皋市"},{"value":"320683","label":"通州市"},{"value":"320684","label":"海门市"},{"value":"320693","label":"开发区"}]},{"value":"320700","label":"连云港市","children":[{"value":"320703","label":"连云区"},{"value":"320705","label":"新浦区"},{"value":"320706","label":"海州区"},{"value":"320721","label":"赣榆县"},{"value":"320722","label":"东海县"},{"value":"320723","label":"灌云县"},{"value":"320724","label":"灌南县"}]},{"value":"320800","label":"淮安市","children":[{"value":"320802","label":"清河区"},{"value":"320803","label":"楚州区"},{"value":"320804","label":"淮阴区"},{"value":"320811","label":"清浦区"},{"value":"320826","label":"涟水县"},{"value":"320829","label":"洪泽县"},{"value":"320830","label":"盱眙县"},{"value":"320831","label":"金湖县"}]},{"value":"320900","label":"盐城市","children":[{"value":"320902","label":"亭湖区"},{"value":"320903","label":"盐都区"},{"value":"320921","label":"响水县"},{"value":"320922","label":"滨海县"},{"value":"320923","label":"阜宁县"},{"value":"320924","label":"射阳县"},{"value":"320925","label":"建湖县"},{"value":"320981","label":"东台市"},{"value":"320982","label":"大丰市"}]},{"value":"321000","label":"扬州市","children":[{"value":"321002","label":"广陵区"},{"value":"321003","label":"邗江区"},{"value":"321011","label":"维扬区"},{"value":"321023","label":"宝应县"},{"value":"321081","label":"仪征市"},{"value":"321084","label":"高邮市"},{"value":"321088","label":"江都市"},{"value":"321092","label":"经济开发区"}]},{"value":"321100","label":"镇江市","children":[{"value":"321102","label":"京口区"},{"value":"321111","label":"润州区"},{"value":"321112","label":"丹徒区"},{"value":"321181","label":"丹阳市"},{"value":"321182","label":"扬中市"},{"value":"321183","label":"句容市"}]},{"value":"321200","label":"泰州市","children":[{"value":"321202","label":"海陵区"},{"value":"321203","label":"高港区"},{"value":"321281","label":"兴化市"},{"value":"321282","label":"靖江市"},{"value":"321283","label":"泰兴市"},{"value":"321284","label":"姜堰市"}]},{"value":"321300","label":"宿迁市","children":[{"value":"321302","label":"宿城区"},{"value":"321311","label":"宿豫区"},{"value":"321322","label":"沭阳县"},{"value":"321323","label":"泗阳县"},{"value":"321324","label":"泗洪县"}]}]},{"label":"浙江省","value":"330000","children":[{"value":"330100","label":"杭州市","children":[{"value":"330102","label":"上城区"},{"value":"330103","label":"下城区"},{"value":"330104","label":"江干区"},{"value":"330105","label":"拱墅区"},{"value":"330106","label":"西湖区"},{"value":"330108","label":"滨江区"},{"value":"330109","label":"萧山区"},{"value":"330110","label":"余杭区"},{"value":"330122","label":"桐庐县"},{"value":"330127","label":"淳安县"},{"value":"330182","label":"建德市"},{"value":"330183","label":"富阳市"},{"value":"330185","label":"临安市"}]},{"value":"330200","label":"宁波市","children":[{"value":"330203","label":"海曙区"},{"value":"330204","label":"江东区"},{"value":"330205","label":"江北区"},{"value":"330206","label":"北仑区"},{"value":"330211","label":"镇海区"},{"value":"330212","label":"鄞州区"},{"value":"330225","label":"象山县"},{"value":"330226","label":"宁海县"},{"value":"330281","label":"余姚市"},{"value":"330282","label":"慈溪市"},{"value":"330283","label":"奉化市"}]},{"value":"330300","label":"温州市","children":[{"value":"330302","label":"鹿城区"},{"value":"330303","label":"龙湾区"},{"value":"330304","label":"瓯海区"},{"value":"330322","label":"洞头县"},{"value":"330324","label":"永嘉县"},{"value":"330326","label":"平阳县"},{"value":"330327","label":"苍南县"},{"value":"330328","label":"文成县"},{"value":"330329","label":"泰顺县"},{"value":"330381","label":"瑞安市"},{"value":"330382","label":"乐清市"}]},{"value":"330400","label":"嘉兴市","children":[{"value":"330402","label":"南湖区"},{"value":"330411","label":"秀洲区"},{"value":"330421","label":"嘉善县"},{"value":"330424","label":"海盐县"},{"value":"330481","label":"海宁市"},{"value":"330482","label":"平湖市"},{"value":"330483","label":"桐乡市"}]},{"value":"330500","label":"湖州市","children":[{"value":"330502","label":"吴兴区"},{"value":"330503","label":"南浔区"},{"value":"330521","label":"德清县"},{"value":"330522","label":"长兴县"},{"value":"330523","label":"安吉县"}]},{"value":"330600","label":"绍兴市","children":[{"value":"330602","label":"越城区"},{"value":"330621","label":"绍兴县"},{"value":"330624","label":"新昌县"},{"value":"330681","label":"诸暨市"},{"value":"330682","label":"上虞市"},{"value":"330683","label":"嵊州市"}]},{"value":"330700","label":"金华市","children":[{"value":"330702","label":"婺城区"},{"value":"330703","label":"金东区"},{"value":"330723","label":"武义县"},{"value":"330726","label":"浦江县"},{"value":"330727","label":"磐安县"},{"value":"330781","label":"兰溪市"},{"value":"330782","label":"义乌市"},{"value":"330783","label":"东阳市"},{"value":"330784","label":"永康市"}]},{"value":"330800","label":"衢州市","children":[{"value":"330802","label":"柯城区"},{"value":"330803","label":"衢江区"},{"value":"330822","label":"常山县"},{"value":"330824","label":"开化县"},{"value":"330825","label":"龙游县"},{"value":"330881","label":"江山市"}]},{"value":"330900","label":"舟山市","children":[{"value":"330902","label":"定海区"},{"value":"330903","label":"普陀区"},{"value":"330921","label":"岱山县"},{"value":"330922","label":"嵊泗县"}]},{"value":"331000","label":"台州市","children":[{"value":"331002","label":"椒江区"},{"value":"331003","label":"黄岩区"},{"value":"331004","label":"路桥区"},{"value":"331021","label":"玉环县"},{"value":"331022","label":"三门县"},{"value":"331023","label":"天台县"},{"value":"331024","label":"仙居县"},{"value":"331081","label":"温岭市"},{"value":"331082","label":"临海市"}]},{"value":"331100","label":"丽水市","children":[{"value":"331102","label":"莲都区"},{"value":"331121","label":"青田县"},{"value":"331122","label":"缙云县"},{"value":"331123","label":"遂昌县"},{"value":"331124","label":"松阳县"},{"value":"331125","label":"云和县"},{"value":"331126","label":"庆元县"},{"value":"331127","label":"景宁畲族自治县"},{"value":"331181","label":"龙泉市"}]}]},{"label":"安徽省","value":"340000","children":[{"value":"340100","label":"合肥市","children":[{"value":"340102","label":"瑶海区"},{"value":"340103","label":"庐阳区"},{"value":"340104","label":"蜀山区"},{"value":"340111","label":"包河区"},{"value":"340121","label":"长丰县"},{"value":"340122","label":"肥东县"},{"value":"340123","label":"肥西县"},{"value":"340151","label":"高新区"},{"value":"340191","label":"中区"},{"value":"341400","label":"巢湖市"},{"value":"341402","label":"居巢区"},{"value":"341421","label":"庐江县"}]},{"value":"340200","label":"芜湖市","children":[{"value":"340202","label":"镜湖区"},{"value":"340203","label":"弋江区"},{"value":"340207","label":"鸠江区"},{"value":"340208","label":"三山区"},{"value":"340221","label":"芜湖县"},{"value":"340222","label":"繁昌县"},{"value":"340223","label":"南陵县"},{"value":"341422","label":"无为县"}]},{"value":"340300","label":"蚌埠市","children":[{"value":"340302","label":"龙子湖区"},{"value":"340303","label":"蚌山区"},{"value":"340304","label":"禹会区"},{"value":"340311","label":"淮上区"},{"value":"340321","label":"怀远县"},{"value":"340322","label":"五河县"},{"value":"340323","label":"固镇县"}]},{"value":"340400","label":"淮南市","children":[{"value":"340402","label":"大通区"},{"value":"340403","label":"田家庵区"},{"value":"340404","label":"谢家集区"},{"value":"340405","label":"八公山区"},{"value":"340406","label":"潘集区"},{"value":"340421","label":"凤台县"}]},{"value":"340500","label":"马鞍山市","children":[{"value":"340502","label":"金家庄区"},{"value":"340503","label":"花山区"},{"value":"340504","label":"雨山区"},{"value":"340521","label":"当涂县"},{"value":"341423","label":"含山县"},{"value":"341424","label":"和县"}]},{"value":"340600","label":"淮北市","children":[{"value":"340602","label":"杜集区"},{"value":"340603","label":"相山区"},{"value":"340604","label":"烈山区"},{"value":"340621","label":"濉溪县"}]},{"value":"340700","label":"铜陵市","children":[{"value":"340702","label":"铜官山区"},{"value":"340703","label":"狮子山区"},{"value":"340711","label":"郊区"},{"value":"340721","label":"铜陵县"}]},{"value":"340800","label":"安庆市","children":[{"value":"340802","label":"迎江区"},{"value":"340803","label":"大观区"},{"value":"340811","label":"宜秀区"},{"value":"340822","label":"怀宁县"},{"value":"340823","label":"枞阳县"},{"value":"340824","label":"潜山县"},{"value":"340825","label":"太湖县"},{"value":"340826","label":"宿松县"},{"value":"340827","label":"望江县"},{"value":"340828","label":"岳西县"},{"value":"340881","label":"桐城市"}]},{"value":"341000","label":"黄山市","children":[{"value":"341002","label":"屯溪区"},{"value":"341003","label":"黄山区"},{"value":"341004","label":"徽州区"},{"value":"341021","label":"歙县"},{"value":"341022","label":"休宁县"},{"value":"341023","label":"黟县"},{"value":"341024","label":"祁门县"}]},{"value":"341100","label":"滁州市","children":[{"value":"341102","label":"琅琊区"},{"value":"341103","label":"南谯区"},{"value":"341122","label":"来安县"},{"value":"341124","label":"全椒县"},{"value":"341125","label":"定远县"},{"value":"341126","label":"凤阳县"},{"value":"341181","label":"天长市"},{"value":"341182","label":"明光市"}]},{"value":"341200","label":"阜阳市","children":[{"value":"341202","label":"颍州区"},{"value":"341203","label":"颍东区"},{"value":"341204","label":"颍泉区"},{"value":"341221","label":"临泉县"},{"value":"341222","label":"太和县"},{"value":"341225","label":"阜南县"},{"value":"341226","label":"颍上县"},{"value":"341282","label":"界首市"}]},{"value":"341300","label":"宿州市","children":[{"value":"341302","label":"埇桥区"},{"value":"341321","label":"砀山县"},{"value":"341322","label":"萧县"},{"value":"341323","label":"灵璧县"},{"value":"341324","label":"泗县"}]},{"value":"341500","label":"六安市","children":[{"value":"341502","label":"金安区"},{"value":"341503","label":"裕安区"},{"value":"341521","label":"寿县"},{"value":"341522","label":"霍邱县"},{"value":"341523","label":"舒城县"},{"value":"341524","label":"金寨县"},{"value":"341525","label":"霍山县"}]},{"value":"341600","label":"亳州市","children":[{"value":"341602","label":"谯城区"},{"value":"341621","label":"涡阳县"},{"value":"341622","label":"蒙城县"},{"value":"341623","label":"利辛县"}]},{"value":"341700","label":"池州市","children":[{"value":"341702","label":"贵池区"},{"value":"341721","label":"东至县"},{"value":"341722","label":"石台县"},{"value":"341723","label":"青阳县"}]},{"value":"341800","label":"宣城市","children":[{"value":"341802","label":"宣州区"},{"value":"341821","label":"郎溪县"},{"value":"341822","label":"广德县"},{"value":"341823","label":"泾县"},{"value":"341824","label":"绩溪县"},{"value":"341825","label":"旌德县"},{"value":"341881","label":"宁国市"}]}]},{"label":"福建省","value":"350000","children":[{"value":"350100","label":"福州市","children":[{"value":"350102","label":"鼓楼区"},{"value":"350103","label":"台江区"},{"value":"350104","label":"仓山区"},{"value":"350105","label":"马尾区"},{"value":"350111","label":"晋安区"},{"value":"350121","label":"闽侯县"},{"value":"350122","label":"连江县"},{"value":"350123","label":"罗源县"},{"value":"350124","label":"闽清县"},{"value":"350125","label":"永泰县"},{"value":"350128","label":"平潭县"},{"value":"350181","label":"福清市"},{"value":"350182","label":"长乐市"}]},{"value":"350200","label":"厦门市","children":[{"value":"350203","label":"思明区"},{"value":"350205","label":"海沧区"},{"value":"350206","label":"湖里区"},{"value":"350211","label":"集美区"},{"value":"350212","label":"同安区"},{"value":"350213","label":"翔安区"}]},{"value":"350300","label":"莆田市","children":[{"value":"350302","label":"城厢区"},{"value":"350303","label":"涵江区"},{"value":"350304","label":"荔城区"},{"value":"350305","label":"秀屿区"},{"value":"350322","label":"仙游县"}]},{"value":"350400","label":"三明市","children":[{"value":"350402","label":"梅列区"},{"value":"350403","label":"三元区"},{"value":"350421","label":"明溪县"},{"value":"350423","label":"清流县"},{"value":"350424","label":"宁化县"},{"value":"350425","label":"大田县"},{"value":"350426","label":"尤溪县"},{"value":"350427","label":"沙县"},{"value":"350428","label":"将乐县"},{"value":"350429","label":"泰宁县"},{"value":"350430","label":"建宁县"},{"value":"350481","label":"永安市"}]},{"value":"350500","label":"泉州市","children":[{"value":"350502","label":"鲤城区"},{"value":"350503","label":"丰泽区"},{"value":"350504","label":"洛江区"},{"value":"350505","label":"泉港区"},{"value":"350521","label":"惠安县"},{"value":"350524","label":"安溪县"},{"value":"350525","label":"永春县"},{"value":"350526","label":"德化县"},{"value":"350527","label":"金门县"},{"value":"350581","label":"石狮市"},{"value":"350582","label":"晋江市"},{"value":"350583","label":"南安市"}]},{"value":"350600","label":"漳州市","children":[{"value":"350602","label":"芗城区"},{"value":"350603","label":"龙文区"},{"value":"350622","label":"云霄县"},{"value":"350623","label":"漳浦县"},{"value":"350624","label":"诏安县"},{"value":"350625","label":"长泰县"},{"value":"350626","label":"东山县"},{"value":"350627","label":"南靖县"},{"value":"350628","label":"平和县"},{"value":"350629","label":"华安县"},{"value":"350681","label":"龙海市"}]},{"value":"350700","label":"南平市","children":[{"value":"350702","label":"延平区"},{"value":"350721","label":"顺昌县"},{"value":"350722","label":"浦城县"},{"value":"350723","label":"光泽县"},{"value":"350724","label":"松溪县"},{"value":"350725","label":"政和县"},{"value":"350781","label":"邵武市"},{"value":"350782","label":"武夷山市"},{"value":"350783","label":"建瓯市"},{"value":"350784","label":"建阳市"}]},{"value":"350800","label":"龙岩市","children":[{"value":"350802","label":"新罗区"},{"value":"350821","label":"长汀县"},{"value":"350822","label":"永定县"},{"value":"350823","label":"上杭县"},{"value":"350824","label":"武平县"},{"value":"350825","label":"连城县"},{"value":"350881","label":"漳平市"}]},{"value":"350900","label":"宁德市","children":[{"value":"350902","label":"蕉城区"},{"value":"350921","label":"霞浦县"},{"value":"350922","label":"古田县"},{"value":"350923","label":"屏南县"},{"value":"350924","label":"寿宁县"},{"value":"350925","label":"周宁县"},{"value":"350926","label":"柘荣县"},{"value":"350981","label":"福安市"},{"value":"350982","label":"福鼎市"}]}]},{"label":"江西省","value":"360000","children":[{"value":"360100","label":"南昌市","children":[{"value":"360102","label":"东湖区"},{"value":"360103","label":"西湖区"},{"value":"360104","label":"青云谱区"},{"value":"360105","label":"湾里区"},{"value":"360111","label":"青山湖区"},{"value":"360121","label":"南昌县"},{"value":"360122","label":"新建县"},{"value":"360123","label":"安义县"},{"value":"360124","label":"进贤县"},{"value":"360125","label":"红谷滩新区"},{"value":"360126","label":"经济技术开发区"},{"value":"360127","label":"昌北区"}]},{"value":"360200","label":"景德镇市","children":[{"value":"360202","label":"昌江区"},{"value":"360203","label":"珠山区"},{"value":"360222","label":"浮梁县"},{"value":"360281","label":"乐平市"}]},{"value":"360300","label":"萍乡市","children":[{"value":"360302","label":"安源区"},{"value":"360313","label":"湘东区"},{"value":"360321","label":"莲花县"},{"value":"360322","label":"上栗县"},{"value":"360323","label":"芦溪县"}]},{"value":"360400","label":"九江市","children":[{"value":"360402","label":"庐山区"},{"value":"360403","label":"浔阳区"},{"value":"360421","label":"九江县"},{"value":"360423","label":"武宁县"},{"value":"360424","label":"修水县"},{"value":"360425","label":"永修县"},{"value":"360426","label":"德安县"},{"value":"360427","label":"星子县"},{"value":"360428","label":"都昌县"},{"value":"360429","label":"湖口县"},{"value":"360430","label":"彭泽县"},{"value":"360481","label":"瑞昌市"}]},{"value":"360500","label":"新余市","children":[{"value":"360502","label":"渝水区"},{"value":"360521","label":"分宜县"}]},{"value":"360600","label":"鹰潭市","children":[{"value":"360602","label":"月湖区"},{"value":"360622","label":"余江县"},{"value":"360681","label":"贵溪市"}]},{"value":"360700","label":"赣州市","children":[{"value":"360702","label":"章贡区"},{"value":"360721","label":"赣县"},{"value":"360722","label":"信丰县"},{"value":"360723","label":"大余县"},{"value":"360724","label":"上犹县"},{"value":"360725","label":"崇义县"},{"value":"360726","label":"安远县"},{"value":"360727","label":"龙南县"},{"value":"360728","label":"定南县"},{"value":"360729","label":"全南县"},{"value":"360730","label":"宁都县"},{"value":"360731","label":"于都县"},{"value":"360732","label":"兴国县"},{"value":"360733","label":"会昌县"},{"value":"360734","label":"寻乌县"},{"value":"360735","label":"石城县"},{"value":"360751","label":"黄金区"},{"value":"360781","label":"瑞金市"},{"value":"360782","label":"南康市"}]},{"value":"360800","label":"吉安市","children":[{"value":"360802","label":"吉州区"},{"value":"360803","label":"青原区"},{"value":"360821","label":"吉安县"},{"value":"360822","label":"吉水县"},{"value":"360823","label":"峡江县"},{"value":"360824","label":"新干县"},{"value":"360825","label":"永丰县"},{"value":"360826","label":"泰和县"},{"value":"360827","label":"遂川县"},{"value":"360828","label":"万安县"},{"value":"360829","label":"安福县"},{"value":"360830","label":"永新县"},{"value":"360881","label":"井冈山市"}]},{"value":"360900","label":"宜春市","children":[{"value":"360902","label":"袁州区"},{"value":"360921","label":"奉新县"},{"value":"360922","label":"万载县"},{"value":"360923","label":"上高县"},{"value":"360924","label":"宜丰县"},{"value":"360925","label":"靖安县"},{"value":"360926","label":"铜鼓县"},{"value":"360981","label":"丰城市"},{"value":"360982","label":"樟树市"},{"value":"360983","label":"高安市"}]},{"value":"361000","label":"抚州市","children":[{"value":"361002","label":"临川区"},{"value":"361021","label":"南城县"},{"value":"361022","label":"黎川县"},{"value":"361023","label":"南丰县"},{"value":"361024","label":"崇仁县"},{"value":"361025","label":"乐安县"},{"value":"361026","label":"宜黄县"},{"value":"361027","label":"金溪县"},{"value":"361028","label":"资溪县"},{"value":"361029","label":"东乡县"},{"value":"361030","label":"广昌县"}]},{"value":"361100","label":"上饶市","children":[{"value":"361102","label":"信州区"},{"value":"361121","label":"上饶县"},{"value":"361122","label":"广丰县"},{"value":"361123","label":"玉山县"},{"value":"361124","label":"铅山县"},{"value":"361125","label":"横峰县"},{"value":"361126","label":"弋阳县"},{"value":"361127","label":"余干县"},{"value":"361128","label":"鄱阳县"},{"value":"361129","label":"万年县"},{"value":"361130","label":"婺源县"},{"value":"361181","label":"德兴市"}]}]},{"label":"山东省","value":"370000","children":[{"value":"370100","label":"济南市","children":[{"value":"370102","label":"历下区"},{"value":"370103","label":"市中区"},{"value":"370104","label":"槐荫区"},{"value":"370105","label":"天桥区"},{"value":"370112","label":"历城区"},{"value":"370113","label":"长清区"},{"value":"370124","label":"平阴县"},{"value":"370125","label":"济阳县"},{"value":"370126","label":"商河县"},{"value":"370181","label":"章丘市"}]},{"value":"370200","label":"青岛市","children":[{"value":"370202","label":"市南区"},{"value":"370203","label":"市北区"},{"value":"370205","label":"四方区"},{"value":"370211","label":"黄岛区"},{"value":"370212","label":"崂山区"},{"value":"370213","label":"李沧区"},{"value":"370214","label":"城阳区"},{"value":"370251","label":"开发区"},{"value":"370281","label":"胶州市"},{"value":"370282","label":"即墨市"},{"value":"370283","label":"平度市"},{"value":"370284","label":"胶南市"},{"value":"370285","label":"莱西市"}]},{"value":"370300","label":"淄博市","children":[{"value":"370302","label":"淄川区"},{"value":"370303","label":"张店区"},{"value":"370304","label":"博山区"},{"value":"370305","label":"临淄区"},{"value":"370306","label":"周村区"},{"value":"370321","label":"桓台县"},{"value":"370322","label":"高青县"},{"value":"370323","label":"沂源县"}]},{"value":"370400","label":"枣庄市","children":[{"value":"370402","label":"市中区"},{"value":"370403","label":"薛城区"},{"value":"370404","label":"峄城区"},{"value":"370405","label":"台儿庄区"},{"value":"370406","label":"山亭区"},{"value":"370481","label":"滕州市"}]},{"value":"370500","label":"东营市","children":[{"value":"370502","label":"东营区"},{"value":"370503","label":"河口区"},{"value":"370521","label":"垦利县"},{"value":"370522","label":"利津县"},{"value":"370523","label":"广饶县"},{"value":"370589","label":"西城区"},{"value":"370590","label":"东城区"}]},{"value":"370600","label":"烟台市","children":[{"value":"370602","label":"芝罘区"},{"value":"370611","label":"福山区"},{"value":"370612","label":"牟平区"},{"value":"370613","label":"莱山区"},{"value":"370634","label":"长岛县"},{"value":"370681","label":"龙口市"},{"value":"370682","label":"莱阳市"},{"value":"370683","label":"莱州市"},{"value":"370684","label":"蓬莱市"},{"value":"370685","label":"招远市"},{"value":"370686","label":"栖霞市"},{"value":"370687","label":"海阳市"}]},{"value":"370700","label":"潍坊市","children":[{"value":"370702","label":"潍城区"},{"value":"370703","label":"寒亭区"},{"value":"370704","label":"坊子区"},{"value":"370705","label":"奎文区"},{"value":"370724","label":"临朐县"},{"value":"370725","label":"昌乐县"},{"value":"370751","label":"开发区"},{"value":"370781","label":"青州市"},{"value":"370782","label":"诸城市"},{"value":"370783","label":"寿光市"},{"value":"370784","label":"安丘市"},{"value":"370785","label":"高密市"},{"value":"370786","label":"昌邑市"}]},{"value":"370800","label":"济宁市","children":[{"value":"370802","label":"市中区"},{"value":"370811","label":"任城区"},{"value":"370826","label":"微山县"},{"value":"370827","label":"鱼台县"},{"value":"370828","label":"金乡县"},{"value":"370829","label":"嘉祥县"},{"value":"370830","label":"汶上县"},{"value":"370831","label":"泗水县"},{"value":"370832","label":"梁山县"},{"value":"370881","label":"曲阜市"},{"value":"370882","label":"兖州市"},{"value":"370883","label":"邹城市"}]},{"value":"370900","label":"泰安市","children":[{"value":"370902","label":"泰山区"},{"value":"370903","label":"岱岳区"},{"value":"370921","label":"宁阳县"},{"value":"370923","label":"东平县"},{"value":"370982","label":"新泰市"},{"value":"370983","label":"肥城市"}]},{"value":"371000","label":"威海市","children":[{"value":"371002","label":"环翠区"},{"value":"371081","label":"文登市"},{"value":"371082","label":"荣成市"},{"value":"371083","label":"乳山市"}]},{"value":"371100","label":"日照市","children":[{"value":"371102","label":"东港区"},{"value":"371103","label":"岚山区"},{"value":"371121","label":"五莲县"},{"value":"371122","label":"莒县"}]},{"value":"371200","label":"莱芜市","children":[{"value":"371202","label":"莱城区"},{"value":"371203","label":"钢城区"}]},{"value":"371300","label":"临沂市","children":[{"value":"371302","label":"兰山区"},{"value":"371311","label":"罗庄区"},{"value":"371312","label":"河东区"},{"value":"371321","label":"沂南县"},{"value":"371322","label":"郯城县"},{"value":"371323","label":"沂水县"},{"value":"371324","label":"苍山县"},{"value":"371325","label":"费县"},{"value":"371326","label":"平邑县"},{"value":"371327","label":"莒南县"},{"value":"371328","label":"蒙阴县"},{"value":"371329","label":"临沭县"}]},{"value":"371400","label":"德州市","children":[{"value":"371402","label":"德城区"},{"value":"371421","label":"陵县"},{"value":"371422","label":"宁津县"},{"value":"371423","label":"庆云县"},{"value":"371424","label":"临邑县"},{"value":"371425","label":"齐河县"},{"value":"371426","label":"平原县"},{"value":"371427","label":"夏津县"},{"value":"371428","label":"武城县"},{"value":"371451","label":"开发区"},{"value":"371481","label":"乐陵市"},{"value":"371482","label":"禹城市"}]},{"value":"371500","label":"聊城市","children":[{"value":"371502","label":"东昌府区"},{"value":"371521","label":"阳谷县"},{"value":"371522","label":"莘县"},{"value":"371523","label":"茌平县"},{"value":"371524","label":"东阿县"},{"value":"371525","label":"冠县"},{"value":"371526","label":"高唐县"},{"value":"371581","label":"临清市"}]},{"value":"371600","label":"滨州市","children":[{"value":"371602","label":"滨城区"},{"value":"371621","label":"惠民县"},{"value":"371622","label":"阳信县"},{"value":"371623","label":"无棣县"},{"value":"371624","label":"沾化县"},{"value":"371625","label":"博兴县"},{"value":"371626","label":"邹平县"}]},{"value":"371700","label":"菏泽市","children":[{"value":"371702","label":"牡丹区"},{"value":"371721","label":"曹县"},{"value":"371722","label":"单县"},{"value":"371723","label":"成武县"},{"value":"371724","label":"巨野县"},{"value":"371725","label":"郓城县"},{"value":"371726","label":"鄄城县"},{"value":"371727","label":"定陶县"},{"value":"371728","label":"东明县"}]}]},{"label":"河南省","value":"410000","children":[{"value":"410100","label":"郑州市","children":[{"value":"410102","label":"中原区"},{"value":"410103","label":"二七区"},{"value":"410104","label":"管城回族区"},{"value":"410105","label":"金水区"},{"value":"410106","label":"上街区"},{"value":"410108","label":"惠济区"},{"value":"410122","label":"中牟县"},{"value":"410181","label":"巩义市"},{"value":"410182","label":"荥阳市"},{"value":"410183","label":"新密市"},{"value":"410184","label":"新郑市"},{"value":"410185","label":"登封市"},{"value":"410186","label":"郑东新区"},{"value":"410187","label":"高新区"}]},{"value":"410200","label":"开封市","children":[{"value":"410202","label":"龙亭区"},{"value":"410203","label":"顺河回族区"},{"value":"410204","label":"鼓楼区"},{"value":"410205","label":"禹王台区"},{"value":"410211","label":"金明区"},{"value":"410221","label":"杞县"},{"value":"410222","label":"通许县"},{"value":"410223","label":"尉氏县"},{"value":"410224","label":"开封县"},{"value":"410225","label":"兰考县"}]},{"value":"410300","label":"洛阳市","children":[{"value":"410302","label":"老城区"},{"value":"410303","label":"西工区"},{"value":"410304","label":"廛河回族区"},{"value":"410305","label":"涧西区"},{"value":"410306","label":"吉利区"},{"value":"410307","label":"洛龙区"},{"value":"410322","label":"孟津县"},{"value":"410323","label":"新安县"},{"value":"410324","label":"栾川县"},{"value":"410325","label":"嵩县"},{"value":"410326","label":"汝阳县"},{"value":"410327","label":"宜阳县"},{"value":"410328","label":"洛宁县"},{"value":"410329","label":"伊川县"},{"value":"410381","label":"偃师市"},{"value":"471004","label":"高新区"}]},{"value":"410400","label":"平顶山市","children":[{"value":"410402","label":"新华区"},{"value":"410403","label":"卫东区"},{"value":"410404","label":"石龙区"},{"value":"410411","label":"湛河区"},{"value":"410421","label":"宝丰县"},{"value":"410422","label":"叶县"},{"value":"410423","label":"鲁山县"},{"value":"410425","label":"郏县"},{"value":"410481","label":"舞钢市"},{"value":"410482","label":"汝州市"}]},{"value":"410500","label":"安阳市","children":[{"value":"410502","label":"文峰区"},{"value":"410503","label":"北关区"},{"value":"410505","label":"殷都区"},{"value":"410506","label":"龙安区"},{"value":"410522","label":"安阳县"},{"value":"410523","label":"汤阴县"},{"value":"410526","label":"滑县"},{"value":"410527","label":"内黄县"},{"value":"410581","label":"林州市"}]},{"value":"410600","label":"鹤壁市","children":[{"value":"410602","label":"鹤山区"},{"value":"410603","label":"山城区"},{"value":"410611","label":"淇滨区"},{"value":"410621","label":"浚县"},{"value":"410622","label":"淇县"}]},{"value":"410700","label":"新乡市","children":[{"value":"410702","label":"红旗区"},{"value":"410703","label":"卫滨区"},{"value":"410704","label":"凤泉区"},{"value":"410711","label":"牧野区"},{"value":"410721","label":"新乡县"},{"value":"410724","label":"获嘉县"},{"value":"410725","label":"原阳县"},{"value":"410726","label":"延津县"},{"value":"410727","label":"封丘县"},{"value":"410728","label":"长垣县"},{"value":"410781","label":"卫辉市"},{"value":"410782","label":"辉县市"}]},{"value":"410800","label":"焦作市","children":[{"value":"410802","label":"解放区"},{"value":"410803","label":"中站区"},{"value":"410804","label":"马村区"},{"value":"410811","label":"山阳区"},{"value":"410821","label":"修武县"},{"value":"410822","label":"博爱县"},{"value":"410823","label":"武陟县"},{"value":"410825","label":"温县"},{"value":"410882","label":"沁阳市"},{"value":"410883","label":"孟州市"}]},{"value":"410881","label":"济源市"},{"value":"410900","label":"濮阳市","children":[{"value":"410902","label":"华龙区"},{"value":"410922","label":"清丰县"},{"value":"410923","label":"南乐县"},{"value":"410926","label":"范县"},{"value":"410927","label":"台前县"},{"value":"410928","label":"濮阳县"}]},{"value":"411000","label":"许昌市","children":[{"value":"411002","label":"魏都区"},{"value":"411023","label":"许昌县"},{"value":"411024","label":"鄢陵县"},{"value":"411025","label":"襄城县"},{"value":"411081","label":"禹州市"},{"value":"411082","label":"长葛市"}]},{"value":"411100","label":"漯河市","children":[{"value":"411102","label":"源汇区"},{"value":"411103","label":"郾城区"},{"value":"411104","label":"召陵区"},{"value":"411121","label":"舞阳县"},{"value":"411122","label":"临颍县"}]},{"value":"411200","label":"三门峡市","children":[{"value":"411202","label":"湖滨区"},{"value":"411221","label":"渑池县"},{"value":"411222","label":"陕县"},{"value":"411224","label":"卢氏县"},{"value":"411281","label":"义马市"},{"value":"411282","label":"灵宝市"}]},{"value":"411300","label":"南阳市","children":[{"value":"411302","label":"宛城区"},{"value":"411303","label":"卧龙区"},{"value":"411321","label":"南召县"},{"value":"411322","label":"方城县"},{"value":"411323","label":"西峡县"},{"value":"411324","label":"镇平县"},{"value":"411325","label":"内乡县"},{"value":"411326","label":"淅川县"},{"value":"411327","label":"社旗县"},{"value":"411328","label":"唐河县"},{"value":"411329","label":"新野县"},{"value":"411330","label":"桐柏县"},{"value":"411381","label":"邓州市"}]},{"value":"411400","label":"商丘市","children":[{"value":"411402","label":"梁园区"},{"value":"411403","label":"睢阳区"},{"value":"411421","label":"民权县"},{"value":"411422","label":"睢县"},{"value":"411423","label":"宁陵县"},{"value":"411424","label":"柘城县"},{"value":"411425","label":"虞城县"},{"value":"411426","label":"夏邑县"},{"value":"411481","label":"永城市"}]},{"value":"411500","label":"信阳市","children":[{"value":"411502","label":"浉河区"},{"value":"411503","label":"平桥区"},{"value":"411521","label":"罗山县"},{"value":"411522","label":"光山县"},{"value":"411523","label":"新县"},{"value":"411524","label":"商城县"},{"value":"411525","label":"固始县"},{"value":"411526","label":"潢川县"},{"value":"411527","label":"淮滨县"},{"value":"411528","label":"息县"}]},{"value":"411600","label":"周口市","children":[{"value":"411602","label":"川汇区"},{"value":"411621","label":"扶沟县"},{"value":"411622","label":"西华县"},{"value":"411623","label":"商水县"},{"value":"411624","label":"沈丘县"},{"value":"411625","label":"郸城县"},{"value":"411626","label":"淮阳县"},{"value":"411627","label":"太康县"},{"value":"411628","label":"鹿邑县"},{"value":"411681","label":"项城市"}]},{"value":"411700","label":"驻马店市","children":[{"value":"411702","label":"驿城区"},{"value":"411721","label":"西平县"},{"value":"411722","label":"上蔡县"},{"value":"411723","label":"平舆县"},{"value":"411724","label":"正阳县"},{"value":"411725","label":"确山县"},{"value":"411726","label":"泌阳县"},{"value":"411727","label":"汝南县"},{"value":"411728","label":"遂平县"},{"value":"411729","label":"新蔡县"}]}]},{"label":"湖北省","value":"420000","children":[{"value":"420100","label":"武汉市","children":[{"value":"420102","label":"江岸区"},{"value":"420103","label":"江汉区"},{"value":"420104","label":"硚口区"},{"value":"420105","label":"汉阳区"},{"value":"420106","label":"武昌区"},{"value":"420107","label":"青山区"},{"value":"420111","label":"洪山区"},{"value":"420112","label":"东西湖区"},{"value":"420113","label":"汉南区"},{"value":"420114","label":"蔡甸区"},{"value":"420115","label":"江夏区"},{"value":"420116","label":"黄陂区"},{"value":"420117","label":"新洲区"}]},{"value":"420200","label":"黄石市","children":[{"value":"420202","label":"黄石港区"},{"value":"420203","label":"西塞山区"},{"value":"420204","label":"下陆区"},{"value":"420205","label":"铁山区"},{"value":"420222","label":"阳新县"},{"value":"420281","label":"大冶市"}]},{"value":"420300","label":"十堰市","children":[{"value":"420302","label":"茅箭区"},{"value":"420303","label":"张湾区"},{"value":"420321","label":"郧县"},{"value":"420322","label":"郧西县"},{"value":"420323","label":"竹山县"},{"value":"420324","label":"竹溪县"},{"value":"420325","label":"房县"},{"value":"420381","label":"丹江口市"},{"value":"420382","label":"城区"}]},{"value":"420500","label":"宜昌市","children":[{"value":"420502","label":"西陵区"},{"value":"420503","label":"伍家岗区"},{"value":"420504","label":"点军区"},{"value":"420505","label":"猇亭区"},{"value":"420506","label":"夷陵区"},{"value":"420525","label":"远安县"},{"value":"420526","label":"兴山县"},{"value":"420527","label":"秭归县"},{"value":"420528","label":"长阳土家族自治县"},{"value":"420529","label":"五峰土家族自治县"},{"value":"420551","label":"葛洲坝区"},{"value":"420552","label":"开发区"},{"value":"420581","label":"宜都市"},{"value":"420582","label":"当阳市"},{"value":"420583","label":"枝江市"}]},{"value":"420600","label":"襄阳市","children":[{"value":"420602","label":"襄城区"},{"value":"420606","label":"樊城区"},{"value":"420607","label":"襄州区"},{"value":"420624","label":"南漳县"},{"value":"420625","label":"谷城县"},{"value":"420626","label":"保康县"},{"value":"420682","label":"老河口市"},{"value":"420683","label":"枣阳市"},{"value":"420684","label":"宜城市"}]},{"value":"420700","label":"鄂州市","children":[{"value":"420702","label":"梁子湖区"},{"value":"420703","label":"华容区"},{"value":"420704","label":"鄂城区"}]},{"value":"420800","label":"荆门市","children":[{"value":"420802","label":"东宝区"},{"value":"420804","label":"掇刀区"},{"value":"420821","label":"京山县"},{"value":"420822","label":"沙洋县"},{"value":"420881","label":"钟祥市"}]},{"value":"420900","label":"孝感市","children":[{"value":"420902","label":"孝南区"},{"value":"420921","label":"孝昌县"},{"value":"420922","label":"大悟县"},{"value":"420923","label":"云梦县"},{"value":"420981","label":"应城市"},{"value":"420982","label":"安陆市"},{"value":"420984","label":"汉川市"}]},{"value":"421000","label":"荆州市","children":[{"value":"421002","label":"沙市区"},{"value":"421003","label":"荆州区"},{"value":"421022","label":"公安县"},{"value":"421023","label":"监利县"},{"value":"421024","label":"江陵县"},{"value":"421081","label":"石首市"},{"value":"421083","label":"洪湖市"},{"value":"421087","label":"松滋市"}]},{"value":"421100","label":"黄冈市","children":[{"value":"421102","label":"黄州区"},{"value":"421121","label":"团风县"},{"value":"421122","label":"红安县"},{"value":"421123","label":"罗田县"},{"value":"421124","label":"英山县"},{"value":"421125","label":"浠水县"},{"value":"421126","label":"蕲春县"},{"value":"421127","label":"黄梅县"},{"value":"421181","label":"麻城市"},{"value":"421182","label":"武穴市"}]},{"value":"421200","label":"咸宁市","children":[{"value":"421202","label":"咸安区"},{"value":"421221","label":"嘉鱼县"},{"value":"421222","label":"通城县"},{"value":"421223","label":"崇阳县"},{"value":"421224","label":"通山县"},{"value":"421281","label":"赤壁市"},{"value":"421282","label":"温泉城区"}]},{"value":"421300","label":"随州市","children":[{"value":"421302","label":"曾都区"},{"value":"421321","label":"随县"},{"value":"421381","label":"广水市"}]},{"value":"422800","label":"恩施土家族苗族自治州","children":[{"value":"422801","label":"恩施市"},{"value":"422802","label":"利川市"},{"value":"422822","label":"建始县"},{"value":"422823","label":"巴东县"},{"value":"422825","label":"宣恩县"},{"value":"422826","label":"咸丰县"},{"value":"422827","label":"来凤县"},{"value":"422828","label":"鹤峰县"}]},{"value":"429004","label":"仙桃市"},{"value":"429005","label":"潜江市"},{"value":"429006","label":"天门市"},{"value":"429021","label":"神农架林区"}]},{"label":"湖南省","value":"430000","children":[{"value":"430100","label":"长沙市","children":[{"value":"430102","label":"芙蓉区"},{"value":"430103","label":"天心区"},{"value":"430104","label":"岳麓区"},{"value":"430105","label":"开福区"},{"value":"430111","label":"雨花区"},{"value":"430121","label":"长沙县"},{"value":"430122","label":"望城县"},{"value":"430124","label":"宁乡县"},{"value":"430181","label":"浏阳市"}]},{"value":"430200","label":"株洲市","children":[{"value":"430202","label":"荷塘区"},{"value":"430203","label":"芦淞区"},{"value":"430204","label":"石峰区"},{"value":"430211","label":"天元区"},{"value":"430221","label":"株洲县"},{"value":"430223","label":"攸县"},{"value":"430224","label":"茶陵县"},{"value":"430225","label":"炎陵县"},{"value":"430281","label":"醴陵市"}]},{"value":"430300","label":"湘潭市","children":[{"value":"430302","label":"雨湖区"},{"value":"430304","label":"岳塘区"},{"value":"430321","label":"湘潭县"},{"value":"430381","label":"湘乡市"},{"value":"430382","label":"韶山市"}]},{"value":"430400","label":"衡阳市","children":[{"value":"430405","label":"珠晖区"},{"value":"430406","label":"雁峰区"},{"value":"430407","label":"石鼓区"},{"value":"430408","label":"蒸湘区"},{"value":"430412","label":"南岳区"},{"value":"430421","label":"衡阳县"},{"value":"430422","label":"衡南县"},{"value":"430423","label":"衡山县"},{"value":"430424","label":"衡东县"},{"value":"430426","label":"祁东县"},{"value":"430481","label":"耒阳市"},{"value":"430482","label":"常宁市"}]},{"value":"430500","label":"邵阳市","children":[{"value":"430502","label":"双清区"},{"value":"430503","label":"大祥区"},{"value":"430511","label":"北塔区"},{"value":"430521","label":"邵东县"},{"value":"430522","label":"新邵县"},{"value":"430523","label":"邵阳县"},{"value":"430524","label":"隆回县"},{"value":"430525","label":"洞口县"},{"value":"430527","label":"绥宁县"},{"value":"430528","label":"新宁县"},{"value":"430529","label":"城步苗族自治县"},{"value":"430581","label":"武冈市"}]},{"value":"430600","label":"岳阳市","children":[{"value":"430602","label":"岳阳楼区"},{"value":"430603","label":"云溪区"},{"value":"430611","label":"君山区"},{"value":"430621","label":"岳阳县"},{"value":"430623","label":"华容县"},{"value":"430624","label":"湘阴县"},{"value":"430626","label":"平江县"},{"value":"430681","label":"汨罗市"},{"value":"430682","label":"临湘市"}]},{"value":"430700","label":"常德市","children":[{"value":"430702","label":"武陵区"},{"value":"430703","label":"鼎城区"},{"value":"430721","label":"安乡县"},{"value":"430722","label":"汉寿县"},{"value":"430723","label":"澧县"},{"value":"430724","label":"临澧县"},{"value":"430725","label":"桃源县"},{"value":"430726","label":"石门县"},{"value":"430781","label":"津市市"}]},{"value":"430800","label":"张家界市","children":[{"value":"430802","label":"永定区"},{"value":"430811","label":"武陵源区"},{"value":"430821","label":"慈利县"},{"value":"430822","label":"桑植县"}]},{"value":"430900","label":"益阳市","children":[{"value":"430902","label":"资阳区"},{"value":"430903","label":"赫山区"},{"value":"430921","label":"南县"},{"value":"430922","label":"桃江县"},{"value":"430923","label":"安化县"},{"value":"430981","label":"沅江市"}]},{"value":"431000","label":"郴州市","children":[{"value":"431002","label":"北湖区"},{"value":"431003","label":"苏仙区"},{"value":"431021","label":"桂阳县"},{"value":"431022","label":"宜章县"},{"value":"431023","label":"永兴县"},{"value":"431024","label":"嘉禾县"},{"value":"431025","label":"临武县"},{"value":"431026","label":"汝城县"},{"value":"431027","label":"桂东县"},{"value":"431028","label":"安仁县"},{"value":"431081","label":"资兴市"}]},{"value":"431100","label":"永州市","children":[{"value":"431102","label":"零陵区"},{"value":"431103","label":"冷水滩区"},{"value":"431121","label":"祁阳县"},{"value":"431122","label":"东安县"},{"value":"431123","label":"双牌县"},{"value":"431124","label":"道县"},{"value":"431125","label":"江永县"},{"value":"431126","label":"宁远县"},{"value":"431127","label":"蓝山县"},{"value":"431128","label":"新田县"},{"value":"431129","label":"江华瑶族自治县"}]},{"value":"431200","label":"怀化市","children":[{"value":"431202","label":"鹤城区"},{"value":"431221","label":"中方县"},{"value":"431222","label":"沅陵县"},{"value":"431223","label":"辰溪县"},{"value":"431224","label":"溆浦县"},{"value":"431225","label":"会同县"},{"value":"431226","label":"麻阳苗族自治县"},{"value":"431227","label":"新晃侗族自治县"},{"value":"431228","label":"芷江侗族自治县"},{"value":"431229","label":"靖州苗族侗族自治县"},{"value":"431230","label":"通道侗族自治县"},{"value":"431281","label":"洪江市"}]},{"value":"431300","label":"娄底市","children":[{"value":"431302","label":"娄星区"},{"value":"431321","label":"双峰县"},{"value":"431322","label":"新化县"},{"value":"431381","label":"冷水江市"},{"value":"431382","label":"涟源市"}]},{"value":"433100","label":"湘西土家族苗族自治州","children":[{"value":"433101","label":"吉首市"},{"value":"433122","label":"泸溪县"},{"value":"433123","label":"凤凰县"},{"value":"433124","label":"花垣县"},{"value":"433125","label":"保靖县"},{"value":"433126","label":"古丈县"},{"value":"433127","label":"永顺县"},{"value":"433130","label":"龙山县"}]}]},{"label":"广东省","value":"440000","children":[{"value":"440100","label":"广州市","children":[{"value":"440103","label":"荔湾区"},{"value":"440104","label":"越秀区"},{"value":"440105","label":"海珠区"},{"value":"440106","label":"天河区"},{"value":"440111","label":"白云区"},{"value":"440112","label":"黄埔区"},{"value":"440113","label":"番禺区"},{"value":"440114","label":"花都区"},{"value":"440115","label":"南沙区"},{"value":"440116","label":"萝岗区"},{"value":"440183","label":"增城市"},{"value":"440184","label":"从化市"},{"value":"440188","label":"东山区"}]},{"value":"440200","label":"韶关市","children":[{"value":"440203","label":"武江区"},{"value":"440204","label":"浈江区"},{"value":"440205","label":"曲江区"},{"value":"440222","label":"始兴县"},{"value":"440224","label":"仁化县"},{"value":"440229","label":"翁源县"},{"value":"440232","label":"乳源瑶族自治县"},{"value":"440233","label":"新丰县"},{"value":"440281","label":"乐昌市"},{"value":"440282","label":"南雄市"}]},{"value":"440300","label":"深圳市","children":[{"value":"440303","label":"罗湖区"},{"value":"440304","label":"福田区"},{"value":"440305","label":"南山区"},{"value":"440306","label":"宝安区"},{"value":"440307","label":"龙岗区"},{"value":"440308","label":"盐田区"},{"value":"1032697","label":"光明新区"},{"value":"1032698","label":"坪山新区"},{"value":"1032699","label":"大鹏新区"},{"value":"1032700","label":"龙华新区"}]},{"value":"440400","label":"珠海市","children":[{"value":"440402","label":"香洲区"},{"value":"440403","label":"斗门区"},{"value":"440404","label":"金湾区"},{"value":"440486","label":"金唐区"},{"value":"440487","label":"南湾区"}]},{"value":"440500","label":"汕头市","children":[{"value":"440507","label":"龙湖区"},{"value":"440511","label":"金平区"},{"value":"440512","label":"濠江区"},{"value":"440513","label":"潮阳区"},{"value":"440514","label":"潮南区"},{"value":"440515","label":"澄海区"},{"value":"440523","label":"南澳县"}]},{"value":"440600","label":"佛山市","children":[{"value":"440604","label":"禅城区"},{"value":"440605","label":"南海区"},{"value":"440606","label":"顺德区"},{"value":"440607","label":"三水区"},{"value":"440608","label":"高明区"}]},{"value":"440700","label":"江门市","children":[{"value":"440703","label":"蓬江区"},{"value":"440704","label":"江海区"},{"value":"440705","label":"新会区"},{"value":"440781","label":"台山市"},{"value":"440783","label":"开平市"},{"value":"440784","label":"鹤山市"},{"value":"440785","label":"恩平市"}]},{"value":"440800","label":"湛江市","children":[{"value":"440802","label":"赤坎区"},{"value":"440803","label":"霞山区"},{"value":"440804","label":"坡头区"},{"value":"440811","label":"麻章区"},{"value":"440823","label":"遂溪县"},{"value":"440825","label":"徐闻县"},{"value":"440881","label":"廉江市"},{"value":"440882","label":"雷州市"},{"value":"440883","label":"吴川市"}]},{"value":"440900","label":"茂名市","children":[{"value":"440902","label":"茂南区"},{"value":"440903","label":"茂港区"},{"value":"440923","label":"电白县"},{"value":"440981","label":"高州市"},{"value":"440982","label":"化州市"},{"value":"440983","label":"信宜市"}]},{"value":"441200","label":"肇庆市","children":[{"value":"441202","label":"端州区"},{"value":"441203","label":"鼎湖区"},{"value":"441223","label":"广宁县"},{"value":"441224","label":"怀集县"},{"value":"441225","label":"封开县"},{"value":"441226","label":"德庆县"},{"value":"441283","label":"高要市"},{"value":"441284","label":"四会市"}]},{"value":"441300","label":"惠州市","children":[{"value":"441302","label":"惠城区"},{"value":"441303","label":"惠阳区"},{"value":"441322","label":"博罗县"},{"value":"441323","label":"惠东县"},{"value":"441324","label":"龙门县"}]},{"value":"441400","label":"梅州市","children":[{"value":"441402","label":"梅江区"},{"value":"441421","label":"梅县"},{"value":"441422","label":"大埔县"},{"value":"441423","label":"丰顺县"},{"value":"441424","label":"五华县"},{"value":"441426","label":"平远县"},{"value":"441427","label":"蕉岭县"},{"value":"441481","label":"兴宁市"}]},{"value":"441500","label":"汕尾市","children":[{"value":"441502","label":"城区"},{"value":"441521","label":"海丰县"},{"value":"441523","label":"陆河县"},{"value":"441581","label":"陆丰市"}]},{"value":"441600","label":"河源市","children":[{"value":"441602","label":"源城区"},{"value":"441621","label":"紫金县"},{"value":"441622","label":"龙川县"},{"value":"441623","label":"连平县"},{"value":"441624","label":"和平县"},{"value":"441625","label":"东源县"}]},{"value":"441700","label":"阳江市","children":[{"value":"441702","label":"江城区"},{"value":"441721","label":"阳西县"},{"value":"441723","label":"阳东县"},{"value":"441781","label":"阳春市"}]},{"value":"441800","label":"清远市","children":[{"value":"441802","label":"清城区"},{"value":"441821","label":"佛冈县"},{"value":"441823","label":"阳山县"},{"value":"441825","label":"连山壮族瑶族自治县"},{"value":"441826","label":"连南瑶族自治县"},{"value":"441827","label":"清新县"},{"value":"441881","label":"英德市"},{"value":"441882","label":"连州市"}]},{"value":"441900","label":"东莞市"},{"value":"442000","label":"中山市"},{"value":"445100","label":"潮州市","children":[{"value":"445102","label":"湘桥区"},{"value":"445121","label":"潮安县"},{"value":"445122","label":"饶平县"},{"value":"445185","label":"枫溪区"}]},{"value":"445200","label":"揭阳市","children":[{"value":"445202","label":"榕城区"},{"value":"445221","label":"揭东县"},{"value":"445222","label":"揭西县"},{"value":"445224","label":"惠来县"},{"value":"445281","label":"普宁市"},{"value":"445284","label":"东山区"}]},{"value":"445300","label":"云浮市","children":[{"value":"445302","label":"云城区"},{"value":"445321","label":"新兴县"},{"value":"445322","label":"郁南县"},{"value":"445323","label":"云安县"},{"value":"445381","label":"罗定市"}]}]},{"label":"广西壮族自治区","value":"450000","children":[{"value":"450100","label":"南宁市","children":[{"value":"450102","label":"兴宁区"},{"value":"450103","label":"青秀区"},{"value":"450105","label":"江南区"},{"value":"450107","label":"西乡塘区"},{"value":"450108","label":"良庆区"},{"value":"450109","label":"邕宁区"},{"value":"450122","label":"武鸣县"},{"value":"450123","label":"隆安县"},{"value":"450124","label":"马山县"},{"value":"450125","label":"上林县"},{"value":"450126","label":"宾阳县"},{"value":"450127","label":"横县"}]},{"value":"450200","label":"柳州市","children":[{"value":"450202","label":"城中区"},{"value":"450203","label":"鱼峰区"},{"value":"450204","label":"柳南区"},{"value":"450205","label":"柳北区"},{"value":"450221","label":"柳江县"},{"value":"450222","label":"柳城县"},{"value":"450223","label":"鹿寨县"},{"value":"450224","label":"融安县"},{"value":"450225","label":"融水苗族自治县"},{"value":"450226","label":"三江侗族自治县"}]},{"value":"450300","label":"桂林市","children":[{"value":"450302","label":"秀峰区"},{"value":"450303","label":"叠彩区"},{"value":"450304","label":"象山区"},{"value":"450305","label":"七星区"},{"value":"450311","label":"雁山区"},{"value":"450321","label":"阳朔县"},{"value":"450322","label":"临桂县"},{"value":"450323","label":"灵川县"},{"value":"450324","label":"全州县"},{"value":"450325","label":"兴安县"},{"value":"450326","label":"永福县"},{"value":"450327","label":"灌阳县"},{"value":"450328","label":"龙胜各族自治县"},{"value":"450329","label":"资源县"},{"value":"450330","label":"平乐县"},{"value":"450331","label":"荔浦县"},{"value":"450332","label":"恭城瑶族自治县"}]},{"value":"450400","label":"梧州市","children":[{"value":"450403","label":"万秀区"},{"value":"450404","label":"蝶山区"},{"value":"450405","label":"长洲区"},{"value":"450421","label":"苍梧县"},{"value":"450422","label":"藤县"},{"value":"450423","label":"蒙山县"},{"value":"450481","label":"岑溪市"}]},{"value":"450500","label":"北海市","children":[{"value":"450502","label":"海城区"},{"value":"450503","label":"银海区"},{"value":"450512","label":"铁山港区"},{"value":"450521","label":"合浦县"}]},{"value":"450600","label":"防城港市","children":[{"value":"450602","label":"港口区"},{"value":"450603","label":"防城区"},{"value":"450621","label":"上思县"},{"value":"450681","label":"东兴市"}]},{"value":"450700","label":"钦州市","children":[{"value":"450702","label":"钦南区"},{"value":"450703","label":"钦北区"},{"value":"450721","label":"灵山县"},{"value":"450722","label":"浦北县"}]},{"value":"450800","label":"贵港市","children":[{"value":"450802","label":"港北区"},{"value":"450803","label":"港南区"},{"value":"450804","label":"覃塘区"},{"value":"450821","label":"平南县"},{"value":"450881","label":"桂平市"}]},{"value":"450900","label":"玉林市","children":[{"value":"450902","label":"玉州区"},{"value":"450921","label":"容县"},{"value":"450922","label":"陆川县"},{"value":"450923","label":"博白县"},{"value":"450924","label":"兴业县"},{"value":"450981","label":"北流市"}]},{"value":"451000","label":"百色市","children":[{"value":"451002","label":"右江区"},{"value":"451021","label":"田阳县"},{"value":"451022","label":"田东县"},{"value":"451023","label":"平果县"},{"value":"451024","label":"德保县"},{"value":"451025","label":"靖西县"},{"value":"451026","label":"那坡县"},{"value":"451027","label":"凌云县"},{"value":"451028","label":"乐业县"},{"value":"451029","label":"田林县"},{"value":"451030","label":"西林县"},{"value":"451031","label":"隆林各族自治县"}]},{"value":"451100","label":"贺州市","children":[{"value":"451102","label":"八步区"},{"value":"451121","label":"昭平县"},{"value":"451122","label":"钟山县"},{"value":"451123","label":"富川瑶族自治县"}]},{"value":"451200","label":"河池市","children":[{"value":"451202","label":"金城江区"},{"value":"451221","label":"南丹县"},{"value":"451222","label":"天峨县"},{"value":"451223","label":"凤山县"},{"value":"451224","label":"东兰县"},{"value":"451225","label":"罗城仫佬族自治县"},{"value":"451226","label":"环江毛南族自治县"},{"value":"451227","label":"巴马瑶族自治县"},{"value":"451228","label":"都安瑶族自治县"},{"value":"451229","label":"大化瑶族自治县"},{"value":"451281","label":"宜州市"}]},{"value":"451300","label":"来宾市","children":[{"value":"451302","label":"兴宾区"},{"value":"451321","label":"忻城县"},{"value":"451322","label":"象州县"},{"value":"451323","label":"武宣县"},{"value":"451324","label":"金秀瑶族自治县"},{"value":"451381","label":"合山市"}]},{"value":"451400","label":"崇左市","children":[{"value":"451402","label":"江洲区"},{"value":"451421","label":"扶绥县"},{"value":"451422","label":"宁明县"},{"value":"451423","label":"龙州县"},{"value":"451424","label":"大新县"},{"value":"451425","label":"天等县"},{"value":"451481","label":"凭祥市"}]}]},{"label":"海南省","value":"460000","children":[{"value":"460100","label":"海口市","children":[{"value":"460105","label":"秀英区"},{"value":"460106","label":"龙华区"},{"value":"460107","label":"琼山区"},{"value":"460108","label":"美兰区"}]},{"value":"460200","label":"三亚市"},{"value":"469001","label":"五指山市"},{"value":"469002","label":"琼海市"},{"value":"469003","label":"儋州市"},{"value":"469005","label":"文昌市"},{"value":"469006","label":"万宁市"},{"value":"469007","label":"东方市"},{"value":"469025","label":"定安县"},{"value":"469026","label":"屯昌县"},{"value":"469027","label":"澄迈县"},{"value":"469028","label":"临高县"},{"value":"469030","label":"白沙黎族自治县"},{"value":"469031","label":"昌江黎族自治县"},{"value":"469033","label":"乐东黎族自治县"},{"value":"469034","label":"陵水黎族自治县"},{"value":"469035","label":"保亭黎族苗族自治县"},{"value":"469036","label":"琼中黎族苗族自治县"},{"value":"469037","label":"西沙群岛"},{"value":"469038","label":"南沙群岛"},{"value":"469039","label":"中沙群岛的岛礁及其海域"}]},{"label":"重庆","value":"500000","children":[{"value":"500100","label":"重庆市","children":[{"value":"500101","label":"万州区"},{"value":"500102","label":"涪陵区"},{"value":"500103","label":"渝中区"},{"value":"500104","label":"大渡口区"},{"value":"500105","label":"江北区"},{"value":"500106","label":"沙坪坝区"},{"value":"500107","label":"九龙坡区"},{"value":"500108","label":"南岸区"},{"value":"500109","label":"北碚区"},{"value":"500110","label":"万盛区"},{"value":"500111","label":"双桥区"},{"value":"500112","label":"渝北区"},{"value":"500113","label":"巴南区"},{"value":"500114","label":"黔江区"},{"value":"500115","label":"长寿区"},{"value":"500222","label":"綦江县"},{"value":"500223","label":"潼南县"},{"value":"500224","label":"铜梁县"},{"value":"500225","label":"大足县"},{"value":"500226","label":"荣昌县"},{"value":"500227","label":"璧山县"},{"value":"500228","label":"梁平县"},{"value":"500229","label":"城口县"},{"value":"500230","label":"丰都县"},{"value":"500231","label":"垫江县"},{"value":"500232","label":"武隆县"},{"value":"500233","label":"忠县"},{"value":"500234","label":"开县"},{"value":"500235","label":"云阳县"},{"value":"500236","label":"奉节县"},{"value":"500237","label":"巫山县"},{"value":"500238","label":"巫溪县"},{"value":"500240","label":"石柱土家族自治县"},{"value":"500241","label":"秀山土家族苗族自治县"},{"value":"500242","label":"酉阳土家族苗族自治县"},{"value":"500243","label":"彭水苗族土家族自治县"},{"value":"500381","label":"江津区"},{"value":"500382","label":"合川区"},{"value":"500383","label":"永川区"},{"value":"500384","label":"南川区"}]}]},{"label":"四川省","value":"510000","children":[{"value":"510100","label":"成都市","children":[{"value":"510104","label":"锦江区"},{"value":"510105","label":"青羊区"},{"value":"510106","label":"金牛区"},{"value":"510107","label":"武侯区"},{"value":"510108","label":"成华区"},{"value":"510112","label":"龙泉驿区"},{"value":"510113","label":"青白江区"},{"value":"510114","label":"新都区"},{"value":"510115","label":"温江区"},{"value":"510121","label":"金堂县"},{"value":"510122","label":"双流县"},{"value":"510124","label":"郫县"},{"value":"510129","label":"大邑县"},{"value":"510131","label":"蒲江县"},{"value":"510132","label":"新津县"},{"value":"510181","label":"都江堰市"},{"value":"510182","label":"彭州市"},{"value":"510183","label":"邛崃市"},{"value":"510184","label":"崇州市"}]},{"value":"510300","label":"自贡市","children":[{"value":"510302","label":"自流井区"},{"value":"510303","label":"贡井区"},{"value":"510304","label":"大安区"},{"value":"510311","label":"沿滩区"},{"value":"510321","label":"荣县"},{"value":"510322","label":"富顺县"}]},{"value":"510400","label":"攀枝花市","children":[{"value":"510402","label":"东区"},{"value":"510403","label":"西区"},{"value":"510411","label":"仁和区"},{"value":"510421","label":"米易县"},{"value":"510422","label":"盐边县"}]},{"value":"510500","label":"泸州市","children":[{"value":"510502","label":"江阳区"},{"value":"510503","label":"纳溪区"},{"value":"510504","label":"龙马潭区"},{"value":"510521","label":"泸县"},{"value":"510522","label":"合江县"},{"value":"510524","label":"叙永县"},{"value":"510525","label":"古蔺县"}]},{"value":"510600","label":"德阳市","children":[{"value":"510603","label":"旌阳区"},{"value":"510623","label":"中江县"},{"value":"510626","label":"罗江县"},{"value":"510681","label":"广汉市"},{"value":"510682","label":"什邡市"},{"value":"510683","label":"绵竹市"}]},{"value":"510700","label":"绵阳市","children":[{"value":"510703","label":"涪城区"},{"value":"510704","label":"游仙区"},{"value":"510722","label":"三台县"},{"value":"510723","label":"盐亭县"},{"value":"510724","label":"安县"},{"value":"510725","label":"梓潼县"},{"value":"510726","label":"北川羌族自治县"},{"value":"510727","label":"平武县"},{"value":"510751","label":"高新区"},{"value":"510781","label":"江油市"}]},{"value":"510800","label":"广元市","children":[{"value":"510802","label":"利州区"},{"value":"510811","label":"元坝区"},{"value":"510812","label":"朝天区"},{"value":"510821","label":"旺苍县"},{"value":"510822","label":"青川县"},{"value":"510823","label":"剑阁县"},{"value":"510824","label":"苍溪县"}]},{"value":"510900","label":"遂宁市","children":[{"value":"510903","label":"船山区"},{"value":"510904","label":"安居区"},{"value":"510921","label":"蓬溪县"},{"value":"510922","label":"射洪县"},{"value":"510923","label":"大英县"}]},{"value":"511000","label":"内江市","children":[{"value":"511002","label":"市中区"},{"value":"511011","label":"东兴区"},{"value":"511024","label":"威远县"},{"value":"511025","label":"资中县"},{"value":"511028","label":"隆昌县"}]},{"value":"511100","label":"乐山市","children":[{"value":"511102","label":"市中区"},{"value":"511111","label":"沙湾区"},{"value":"511112","label":"五通桥区"},{"value":"511113","label":"金口河区"},{"value":"511123","label":"犍为县"},{"value":"511124","label":"井研县"},{"value":"511126","label":"夹江县"},{"value":"511129","label":"沐川县"},{"value":"511132","label":"峨边彝族自治县"},{"value":"511133","label":"马边彝族自治县"},{"value":"511181","label":"峨眉山市"}]},{"value":"511300","label":"南充市","children":[{"value":"511302","label":"顺庆区"},{"value":"511303","label":"高坪区"},{"value":"511304","label":"嘉陵区"},{"value":"511321","label":"南部县"},{"value":"511322","label":"营山县"},{"value":"511323","label":"蓬安县"},{"value":"511324","label":"仪陇县"},{"value":"511325","label":"西充县"},{"value":"511381","label":"阆中市"}]},{"value":"511400","label":"眉山市","children":[{"value":"511402","label":"东坡区"},{"value":"511421","label":"仁寿县"},{"value":"511422","label":"彭山县"},{"value":"511423","label":"洪雅县"},{"value":"511424","label":"丹棱县"},{"value":"511425","label":"青神县"}]},{"value":"511500","label":"宜宾市","children":[{"value":"511502","label":"翠屏区"},{"value":"511521","label":"宜宾县"},{"value":"511522","label":"南溪县"},{"value":"511523","label":"江安县"},{"value":"511524","label":"长宁县"},{"value":"511525","label":"高县"},{"value":"511526","label":"珙县"},{"value":"511527","label":"筠连县"},{"value":"511528","label":"兴文县"},{"value":"511529","label":"屏山县"}]},{"value":"511600","label":"广安市","children":[{"value":"511602","label":"广安区"},{"value":"511621","label":"岳池县"},{"value":"511622","label":"武胜县"},{"value":"511623","label":"邻水县"},{"value":"511681","label":"华蓥市"},{"value":"511682","label":"市辖区"}]},{"value":"511700","label":"达州市","children":[{"value":"511702","label":"通川区"},{"value":"511721","label":"达县"},{"value":"511722","label":"宣汉县"},{"value":"511723","label":"开江县"},{"value":"511724","label":"大竹县"},{"value":"511725","label":"渠县"},{"value":"511781","label":"万源市"}]},{"value":"511800","label":"雅安市","children":[{"value":"511802","label":"雨城区"},{"value":"511821","label":"名山县"},{"value":"511822","label":"荥经县"},{"value":"511823","label":"汉源县"},{"value":"511824","label":"石棉县"},{"value":"511825","label":"天全县"},{"value":"511826","label":"芦山县"},{"value":"511827","label":"宝兴县"}]},{"value":"511900","label":"巴中市","children":[{"value":"511902","label":"巴州区"},{"value":"511921","label":"通江县"},{"value":"511922","label":"南江县"},{"value":"511923","label":"平昌县"}]},{"value":"512000","label":"资阳市","children":[{"value":"512002","label":"雁江区"},{"value":"512021","label":"安岳县"},{"value":"512022","label":"乐至县"},{"value":"512081","label":"简阳市"}]},{"value":"513200","label":"阿坝藏族羌族自治州","children":[{"value":"513221","label":"汶川县"},{"value":"513222","label":"理县"},{"value":"513223","label":"茂县"},{"value":"513224","label":"松潘县"},{"value":"513225","label":"九寨沟县"},{"value":"513226","label":"金川县"},{"value":"513227","label":"小金县"},{"value":"513228","label":"黑水县"},{"value":"513229","label":"马尔康县"},{"value":"513230","label":"壤塘县"},{"value":"513231","label":"阿坝县"},{"value":"513232","label":"若尔盖县"},{"value":"513233","label":"红原县"}]},{"value":"513300","label":"甘孜藏族自治州","children":[{"value":"513321","label":"康定县"},{"value":"513322","label":"泸定县"},{"value":"513323","label":"丹巴县"},{"value":"513324","label":"九龙县"},{"value":"513325","label":"雅江县"},{"value":"513326","label":"道孚县"},{"value":"513327","label":"炉霍县"},{"value":"513328","label":"甘孜县"},{"value":"513329","label":"新龙县"},{"value":"513330","label":"德格县"},{"value":"513331","label":"白玉县"},{"value":"513332","label":"石渠县"},{"value":"513333","label":"色达县"},{"value":"513334","label":"理塘县"},{"value":"513335","label":"巴塘县"},{"value":"513336","label":"乡城县"},{"value":"513337","label":"稻城县"},{"value":"513338","label":"得荣县"}]},{"value":"513400","label":"凉山彝族自治州","children":[{"value":"513401","label":"西昌市"},{"value":"513422","label":"木里藏族自治县"},{"value":"513423","label":"盐源县"},{"value":"513424","label":"德昌县"},{"value":"513425","label":"会理县"},{"value":"513426","label":"会东县"},{"value":"513427","label":"宁南县"},{"value":"513428","label":"普格县"},{"value":"513429","label":"布拖县"},{"value":"513430","label":"金阳县"},{"value":"513431","label":"昭觉县"},{"value":"513432","label":"喜德县"},{"value":"513433","label":"冕宁县"},{"value":"513434","label":"越西县"},{"value":"513435","label":"甘洛县"},{"value":"513436","label":"美姑县"},{"value":"513437","label":"雷波县"}]}]},{"label":"贵州省","value":"520000","children":[{"value":"520100","label":"贵阳市","children":[{"value":"520102","label":"南明区"},{"value":"520103","label":"云岩区"},{"value":"520111","label":"花溪区"},{"value":"520112","label":"乌当区"},{"value":"520113","label":"白云区"},{"value":"520114","label":"小河区"},{"value":"520121","label":"开阳县"},{"value":"520122","label":"息烽县"},{"value":"520123","label":"修文县"},{"value":"520151","label":"金阳开发区"},{"value":"520181","label":"清镇市"}]},{"value":"520200","label":"六盘水市","children":[{"value":"520201","label":"钟山区"},{"value":"520203","label":"六枝特区"},{"value":"520221","label":"水城县"},{"value":"520222","label":"盘县"}]},{"value":"520300","label":"遵义市","children":[{"value":"520302","label":"红花岗区"},{"value":"520303","label":"汇川区"},{"value":"520321","label":"遵义县"},{"value":"520322","label":"桐梓县"},{"value":"520323","label":"绥阳县"},{"value":"520324","label":"正安县"},{"value":"520325","label":"道真仡佬族苗族自治县"},{"value":"520326","label":"务川仡佬族苗族自治县"},{"value":"520327","label":"凤冈县"},{"value":"520328","label":"湄潭县"},{"value":"520329","label":"余庆县"},{"value":"520330","label":"习水县"},{"value":"520381","label":"赤水市"},{"value":"520382","label":"仁怀市"}]},{"value":"520400","label":"安顺市","children":[{"value":"520402","label":"西秀区"},{"value":"520421","label":"平坝县"},{"value":"520422","label":"普定县"},{"value":"520423","label":"镇宁布依族苗族自治县"},{"value":"520424","label":"关岭布依族苗族自治县"},{"value":"520425","label":"紫云苗族布依族自治县"}]},{"value":"522200","label":"铜仁地区","children":[{"value":"522201","label":"铜仁市"},{"value":"522222","label":"江口县"},{"value":"522223","label":"玉屏侗族自治县"},{"value":"522224","label":"石阡县"},{"value":"522225","label":"思南县"},{"value":"522226","label":"印江土家族苗族自治县"},{"value":"522227","label":"德江县"},{"value":"522228","label":"沿河土家族自治县"},{"value":"522229","label":"松桃苗族自治县"},{"value":"522230","label":"万山特区"}]},{"value":"522300","label":"黔西南布依族苗族自治州","children":[{"value":"522301","label":"兴义市"},{"value":"522322","label":"兴仁县"},{"value":"522323","label":"普安县"},{"value":"522324","label":"晴隆县"},{"value":"522325","label":"贞丰县"},{"value":"522326","label":"望谟县"},{"value":"522327","label":"册亨县"},{"value":"522328","label":"安龙县"}]},{"value":"522400","label":"毕节地区","children":[{"value":"522401","label":"毕节市"},{"value":"522422","label":"大方县"},{"value":"522423","label":"黔西县"},{"value":"522424","label":"金沙县"},{"value":"522425","label":"织金县"},{"value":"522426","label":"纳雍县"},{"value":"522427","label":"威宁彝族回族苗族自治县"},{"value":"522428","label":"赫章县"}]},{"value":"522600","label":"黔东南苗族侗族自治州","children":[{"value":"522601","label":"凯里市"},{"value":"522622","label":"黄平县"},{"value":"522623","label":"施秉县"},{"value":"522624","label":"三穗县"},{"value":"522625","label":"镇远县"},{"value":"522626","label":"岑巩县"},{"value":"522627","label":"天柱县"},{"value":"522628","label":"锦屏县"},{"value":"522629","label":"剑河县"},{"value":"522630","label":"台江县"},{"value":"522631","label":"黎平县"},{"value":"522632","label":"榕江县"},{"value":"522633","label":"从江县"},{"value":"522634","label":"雷山县"},{"value":"522635","label":"麻江县"},{"value":"522636","label":"丹寨县"}]},{"value":"522700","label":"黔南布依族苗族自治州","children":[{"value":"522701","label":"都匀市"},{"value":"522702","label":"福泉市"},{"value":"522722","label":"荔波县"},{"value":"522723","label":"贵定县"},{"value":"522725","label":"瓮安县"},{"value":"522726","label":"独山县"},{"value":"522727","label":"平塘县"},{"value":"522728","label":"罗甸县"},{"value":"522729","label":"长顺县"},{"value":"522730","label":"龙里县"},{"value":"522731","label":"惠水县"},{"value":"522732","label":"三都水族自治县"}]}]},{"label":"云南省","value":"530000","children":[{"value":"530100","label":"昆明市","children":[{"value":"530102","label":"五华区"},{"value":"530103","label":"盘龙区"},{"value":"530111","label":"官渡区"},{"value":"530112","label":"西山区"},{"value":"530113","label":"东川区"},{"value":"530121","label":"呈贡县"},{"value":"530122","label":"晋宁县"},{"value":"530124","label":"富民县"},{"value":"530125","label":"宜良县"},{"value":"530126","label":"石林彝族自治县"},{"value":"530127","label":"嵩明县"},{"value":"530128","label":"禄劝彝族苗族自治县"},{"value":"530129","label":"寻甸回族彝族自治县"},{"value":"530181","label":"安宁市"}]},{"value":"530300","label":"曲靖市","children":[{"value":"530302","label":"麒麟区"},{"value":"530321","label":"马龙县"},{"value":"530322","label":"陆良县"},{"value":"530323","label":"师宗县"},{"value":"530324","label":"罗平县"},{"value":"530325","label":"富源县"},{"value":"530326","label":"会泽县"},{"value":"530328","label":"沾益县"},{"value":"530381","label":"宣威市"}]},{"value":"530400","label":"玉溪市","children":[{"value":"530402","label":"红塔区"},{"value":"530421","label":"江川县"},{"value":"530422","label":"澄江县"},{"value":"530423","label":"通海县"},{"value":"530424","label":"华宁县"},{"value":"530425","label":"易门县"},{"value":"530426","label":"峨山彝族自治县"},{"value":"530427","label":"新平彝族傣族自治县"},{"value":"530428","label":"元江哈尼族彝族傣族自治县"}]},{"value":"530500","label":"保山市","children":[{"value":"530502","label":"隆阳区"},{"value":"530521","label":"施甸县"},{"value":"530522","label":"腾冲县"},{"value":"530523","label":"龙陵县"},{"value":"530524","label":"昌宁县"}]},{"value":"530600","label":"昭通市","children":[{"value":"530602","label":"昭阳区"},{"value":"530621","label":"鲁甸县"},{"value":"530622","label":"巧家县"},{"value":"530623","label":"盐津县"},{"value":"530624","label":"大关县"},{"value":"530625","label":"永善县"},{"value":"530626","label":"绥江县"},{"value":"530627","label":"镇雄县"},{"value":"530628","label":"彝良县"},{"value":"530629","label":"威信县"},{"value":"530630","label":"水富县"}]},{"value":"530700","label":"丽江市","children":[{"value":"530702","label":"古城区"},{"value":"530721","label":"玉龙纳西族自治县"},{"value":"530722","label":"永胜县"},{"value":"530723","label":"华坪县"},{"value":"530724","label":"宁蒗彝族自治县"}]},{"value":"530800","label":"普洱市","children":[{"value":"530802","label":"思茅区"},{"value":"530821","label":"宁洱哈尼族彝族自治县"},{"value":"530822","label":"墨江哈尼族自治县"},{"value":"530823","label":"景东彝族自治县"},{"value":"530824","label":"景谷傣族彝族自治县"},{"value":"530825","label":"镇沅彝族哈尼族拉祜族自治县"},{"value":"530826","label":"江城哈尼族彝族自治县"},{"value":"530827","label":"孟连傣族拉祜族佤族自治县"},{"value":"530828","label":"澜沧拉祜族自治县"},{"value":"530829","label":"西盟佤族自治县"}]},{"value":"530900","label":"临沧市","children":[{"value":"530902","label":"临翔区"},{"value":"530921","label":"凤庆县"},{"value":"530922","label":"云县"},{"value":"530923","label":"永德县"},{"value":"530924","label":"镇康县"},{"value":"530925","label":"双江拉祜族佤族布朗族傣族自治县"},{"value":"530926","label":"耿马傣族佤族自治县"},{"value":"530927","label":"沧源佤族自治县"}]},{"value":"532300","label":"楚雄彝族自治州","children":[{"value":"532301","label":"楚雄市"},{"value":"532322","label":"双柏县"},{"value":"532323","label":"牟定县"},{"value":"532324","label":"南华县"},{"value":"532325","label":"姚安县"},{"value":"532326","label":"大姚县"},{"value":"532327","label":"永仁县"},{"value":"532328","label":"元谋县"},{"value":"532329","label":"武定县"},{"value":"532331","label":"禄丰县"}]},{"value":"532500","label":"红河哈尼族彝族自治州","children":[{"value":"532501","label":"个旧市"},{"value":"532502","label":"开远市"},{"value":"532522","label":"蒙自县"},{"value":"532523","label":"屏边苗族自治县"},{"value":"532524","label":"建水县"},{"value":"532525","label":"石屏县"},{"value":"532526","label":"弥勒县"},{"value":"532527","label":"泸西县"},{"value":"532528","label":"元阳县"},{"value":"532529","label":"红河县"},{"value":"532530","label":"金平苗族瑶族傣族自治县"},{"value":"532531","label":"绿春县"},{"value":"532532","label":"河口瑶族自治县"}]},{"value":"532600","label":"文山壮族苗族自治州","children":[{"value":"532621","label":"文山县"},{"value":"532622","label":"砚山县"},{"value":"532623","label":"西畴县"},{"value":"532624","label":"麻栗坡县"},{"value":"532625","label":"马关县"},{"value":"532626","label":"丘北县"},{"value":"532627","label":"广南县"},{"value":"532628","label":"富宁县"}]},{"value":"532800","label":"西双版纳傣族自治州","children":[{"value":"532801","label":"景洪市"},{"value":"532822","label":"勐海县"},{"value":"532823","label":"勐腊县"}]},{"value":"532900","label":"大理白族自治州","children":[{"value":"532901","label":"大理市"},{"value":"532922","label":"漾濞彝族自治县"},{"value":"532923","label":"祥云县"},{"value":"532924","label":"宾川县"},{"value":"532925","label":"弥渡县"},{"value":"532926","label":"南涧彝族自治县"},{"value":"532927","label":"巍山彝族回族自治县"},{"value":"532928","label":"永平县"},{"value":"532929","label":"云龙县"},{"value":"532930","label":"洱源县"},{"value":"532931","label":"剑川县"},{"value":"532932","label":"鹤庆县"}]},{"value":"533100","label":"德宏傣族景颇族自治州","children":[{"value":"533102","label":"瑞丽市"},{"value":"533103","label":"潞西市"},{"value":"533122","label":"梁河县"},{"value":"533123","label":"盈江县"},{"value":"533124","label":"陇川县"}]},{"value":"533300","label":"怒江傈僳族自治州","children":[{"value":"533321","label":"泸水县"},{"value":"533323","label":"福贡县"},{"value":"533324","label":"贡山独龙族怒族自治县"},{"value":"533325","label":"兰坪白族普米族自治县"}]},{"value":"533400","label":"迪庆藏族自治州","children":[{"value":"533421","label":"香格里拉县"},{"value":"533422","label":"德钦县"},{"value":"533423","label":"维西傈僳族自治县"}]}]},{"label":"西藏自治区","value":"540000","children":[{"value":"540100","label":"拉萨市","children":[{"value":"540102","label":"城关区"},{"value":"540121","label":"林周县"},{"value":"540122","label":"当雄县"},{"value":"540123","label":"尼木县"},{"value":"540124","label":"曲水县"},{"value":"540125","label":"堆龙德庆县"},{"value":"540126","label":"达孜县"},{"value":"540127","label":"墨竹工卡县"}]},{"value":"542100","label":"昌都地区","children":[{"value":"542121","label":"昌都县"},{"value":"542122","label":"江达县"},{"value":"542123","label":"贡觉县"},{"value":"542124","label":"类乌齐县"},{"value":"542125","label":"丁青县"},{"value":"542126","label":"察雅县"},{"value":"542127","label":"八宿县"},{"value":"542128","label":"左贡县"},{"value":"542129","label":"芒康县"},{"value":"542132","label":"洛隆县"},{"value":"542133","label":"边坝县"}]},{"value":"542200","label":"山南地区","children":[{"value":"542221","label":"乃东县"},{"value":"542222","label":"扎囊县"},{"value":"542223","label":"贡嘎县"},{"value":"542224","label":"桑日县"},{"value":"542225","label":"琼结县"},{"value":"542226","label":"曲松县"},{"value":"542227","label":"措美县"},{"value":"542228","label":"洛扎县"},{"value":"542229","label":"加查县"},{"value":"542231","label":"隆子县"},{"value":"542232","label":"错那县"},{"value":"542233","label":"浪卡子县"}]},{"value":"542300","label":"日喀则地区","children":[{"value":"542301","label":"日喀则市"},{"value":"542322","label":"南木林县"},{"value":"542323","label":"江孜县"},{"value":"542324","label":"定日县"},{"value":"542325","label":"萨迦县"},{"value":"542326","label":"拉孜县"},{"value":"542327","label":"昂仁县"},{"value":"542328","label":"谢通门县"},{"value":"542329","label":"白朗县"},{"value":"542330","label":"仁布县"},{"value":"542331","label":"康马县"},{"value":"542332","label":"定结县"},{"value":"542333","label":"仲巴县"},{"value":"542334","label":"亚东县"},{"value":"542335","label":"吉隆县"},{"value":"542336","label":"聂拉木县"},{"value":"542337","label":"萨嘎县"},{"value":"542338","label":"岗巴县"}]},{"value":"542400","label":"那曲地区","children":[{"value":"542421","label":"那曲县"},{"value":"542422","label":"嘉黎县"},{"value":"542423","label":"比如县"},{"value":"542424","label":"聂荣县"},{"value":"542425","label":"安多县"},{"value":"542426","label":"申扎县"},{"value":"542427","label":"索县"},{"value":"542428","label":"班戈县"},{"value":"542429","label":"巴青县"},{"value":"542430","label":"尼玛县"}]},{"value":"542500","label":"阿里地区","children":[{"value":"542521","label":"普兰县"},{"value":"542522","label":"札达县"},{"value":"542523","label":"噶尔县"},{"value":"542524","label":"日土县"},{"value":"542525","label":"革吉县"},{"value":"542526","label":"改则县"},{"value":"542527","label":"措勤县"}]},{"value":"542600","label":"林芝地区","children":[{"value":"542621","label":"林芝县"},{"value":"542622","label":"工布江达县"},{"value":"542623","label":"米林县"},{"value":"542624","label":"墨脱县"},{"value":"542625","label":"波密县"},{"value":"542626","label":"察隅县"},{"value":"542627","label":"朗县"}]}]},{"label":"陕西省","value":"610000","children":[{"value":"610100","label":"西安市","children":[{"value":"610102","label":"新城区"},{"value":"610103","label":"碑林区"},{"value":"610104","label":"莲湖区"},{"value":"610111","label":"灞桥区"},{"value":"610112","label":"未央区"},{"value":"610113","label":"雁塔区"},{"value":"610114","label":"阎良区"},{"value":"610115","label":"临潼区"},{"value":"610116","label":"长安区"},{"value":"610122","label":"蓝田县"},{"value":"610124","label":"周至县"},{"value":"610125","label":"户县"},{"value":"610126","label":"高陵县"}]},{"value":"610200","label":"铜川市","children":[{"value":"610202","label":"王益区"},{"value":"610203","label":"印台区"},{"value":"610204","label":"耀州区"},{"value":"610222","label":"宜君县"}]},{"value":"610300","label":"宝鸡市","children":[{"value":"610302","label":"渭滨区"},{"value":"610303","label":"金台区"},{"value":"610304","label":"陈仓区"},{"value":"610322","label":"凤翔县"},{"value":"610323","label":"岐山县"},{"value":"610324","label":"扶风县"},{"value":"610326","label":"眉县"},{"value":"610327","label":"陇县"},{"value":"610328","label":"千阳县"},{"value":"610329","label":"麟游县"},{"value":"610330","label":"凤县"},{"value":"610331","label":"太白县"}]},{"value":"610400","label":"咸阳市","children":[{"value":"610402","label":"秦都区"},{"value":"610403","label":"杨陵区"},{"value":"610404","label":"渭城区"},{"value":"610422","label":"三原县"},{"value":"610423","label":"泾阳县"},{"value":"610424","label":"乾县"},{"value":"610425","label":"礼泉县"},{"value":"610426","label":"永寿县"},{"value":"610427","label":"彬县"},{"value":"610428","label":"长武县"},{"value":"610429","label":"旬邑县"},{"value":"610430","label":"淳化县"},{"value":"610431","label":"武功县"},{"value":"610481","label":"兴平市"}]},{"value":"610500","label":"渭南市","children":[{"value":"610502","label":"临渭区"},{"value":"610521","label":"华县"},{"value":"610522","label":"潼关县"},{"value":"610523","label":"大荔县"},{"value":"610524","label":"合阳县"},{"value":"610525","label":"澄城县"},{"value":"610526","label":"蒲城县"},{"value":"610527","label":"白水县"},{"value":"610528","label":"富平县"},{"value":"610581","label":"韩城市"},{"value":"610582","label":"华阴市"}]},{"value":"610600","label":"延安市","children":[{"value":"610602","label":"宝塔区"},{"value":"610621","label":"延长县"},{"value":"610622","label":"延川县"},{"value":"610623","label":"子长县"},{"value":"610624","label":"安塞县"},{"value":"610625","label":"志丹县"},{"value":"610626","label":"吴起县"},{"value":"610627","label":"甘泉县"},{"value":"610628","label":"富县"},{"value":"610629","label":"洛川县"},{"value":"610630","label":"宜川县"},{"value":"610631","label":"黄龙县"},{"value":"610632","label":"黄陵县"}]},{"value":"610700","label":"汉中市","children":[{"value":"610702","label":"汉台区"},{"value":"610721","label":"南郑县"},{"value":"610722","label":"城固县"},{"value":"610723","label":"洋县"},{"value":"610724","label":"西乡县"},{"value":"610725","label":"勉县"},{"value":"610726","label":"宁强县"},{"value":"610727","label":"略阳县"},{"value":"610728","label":"镇巴县"},{"value":"610729","label":"留坝县"},{"value":"610730","label":"佛坪县"}]},{"value":"610800","label":"榆林市","children":[{"value":"610802","label":"榆阳区"},{"value":"610821","label":"神木县"},{"value":"610822","label":"府谷县"},{"value":"610823","label":"横山县"},{"value":"610824","label":"靖边县"},{"value":"610825","label":"定边县"},{"value":"610826","label":"绥德县"},{"value":"610827","label":"米脂县"},{"value":"610828","label":"佳县"},{"value":"610829","label":"吴堡县"},{"value":"610830","label":"清涧县"},{"value":"610831","label":"子洲县"}]},{"value":"610900","label":"安康市","children":[{"value":"610902","label":"汉滨区"},{"value":"610921","label":"汉阴县"},{"value":"610922","label":"石泉县"},{"value":"610923","label":"宁陕县"},{"value":"610924","label":"紫阳县"},{"value":"610925","label":"岚皋县"},{"value":"610926","label":"平利县"},{"value":"610927","label":"镇坪县"},{"value":"610928","label":"旬阳县"},{"value":"610929","label":"白河县"}]},{"value":"611000","label":"商洛市","children":[{"value":"611002","label":"商州区"},{"value":"611021","label":"洛南县"},{"value":"611022","label":"丹凤县"},{"value":"611023","label":"商南县"},{"value":"611024","label":"山阳县"},{"value":"611025","label":"镇安县"},{"value":"611026","label":"柞水县"}]}]},{"label":"甘肃省","value":"620000","children":[{"value":"620100","label":"兰州市","children":[{"value":"620102","label":"城关区"},{"value":"620103","label":"七里河区"},{"value":"620104","label":"西固区"},{"value":"620105","label":"安宁区"},{"value":"620111","label":"红古区"},{"value":"620121","label":"永登县"},{"value":"620122","label":"皋兰县"},{"value":"620123","label":"榆中县"}]},{"value":"620200","label":"嘉峪关市"},{"value":"620300","label":"金昌市","children":[{"value":"620302","label":"金川区"},{"value":"620321","label":"永昌县"}]},{"value":"620400","label":"白银市","children":[{"value":"620402","label":"白银区"},{"value":"620403","label":"平川区"},{"value":"620421","label":"靖远县"},{"value":"620422","label":"会宁县"},{"value":"620423","label":"景泰县"}]},{"value":"620500","label":"天水市","children":[{"value":"620502","label":"秦州区"},{"value":"620503","label":"麦积区"},{"value":"620521","label":"清水县"},{"value":"620522","label":"秦安县"},{"value":"620523","label":"甘谷县"},{"value":"620524","label":"武山县"},{"value":"620525","label":"张家川回族自治县"}]},{"value":"620600","label":"武威市","children":[{"value":"620602","label":"凉州区"},{"value":"620621","label":"民勤县"},{"value":"620622","label":"古浪县"},{"value":"620623","label":"天祝藏族自治县"}]},{"value":"620700","label":"张掖市","children":[{"value":"620702","label":"甘州区"},{"value":"620721","label":"肃南裕固族自治县"},{"value":"620722","label":"民乐县"},{"value":"620723","label":"临泽县"},{"value":"620724","label":"高台县"},{"value":"620725","label":"山丹县"}]},{"value":"620800","label":"平凉市","children":[{"value":"620802","label":"崆峒区"},{"value":"620821","label":"泾川县"},{"value":"620822","label":"灵台县"},{"value":"620823","label":"崇信县"},{"value":"620824","label":"华亭县"},{"value":"620825","label":"庄浪县"},{"value":"620826","label":"静宁县"}]},{"value":"620900","label":"酒泉市","children":[{"value":"620902","label":"肃州区"},{"value":"620921","label":"金塔县"},{"value":"620922","label":"安西县"},{"value":"620923","label":"肃北蒙古族自治县"},{"value":"620924","label":"阿克塞哈萨克族自治县"},{"value":"620981","label":"玉门市"},{"value":"620982","label":"敦煌市"}]},{"value":"621000","label":"庆阳市","children":[{"value":"621002","label":"西峰区"},{"value":"621021","label":"庆城县"},{"value":"621022","label":"环县"},{"value":"621023","label":"华池县"},{"value":"621024","label":"合水县"},{"value":"621025","label":"正宁县"},{"value":"621026","label":"宁县"},{"value":"621027","label":"镇原县"}]},{"value":"621100","label":"定西市","children":[{"value":"621102","label":"安定区"},{"value":"621121","label":"通渭县"},{"value":"621122","label":"陇西县"},{"value":"621123","label":"渭源县"},{"value":"621124","label":"临洮县"},{"value":"621125","label":"漳县"},{"value":"621126","label":"岷县"}]},{"value":"621200","label":"陇南市","children":[{"value":"621202","label":"武都区"},{"value":"621221","label":"成县"},{"value":"621222","label":"文县"},{"value":"621223","label":"宕昌县"},{"value":"621224","label":"康县"},{"value":"621225","label":"西和县"},{"value":"621226","label":"礼县"},{"value":"621227","label":"徽县"},{"value":"621228","label":"两当县"}]},{"value":"622900","label":"临夏回族自治州","children":[{"value":"622901","label":"临夏市"},{"value":"622921","label":"临夏县"},{"value":"622922","label":"康乐县"},{"value":"622923","label":"永靖县"},{"value":"622924","label":"广河县"},{"value":"622925","label":"和政县"},{"value":"622926","label":"东乡族自治县"},{"value":"622927","label":"积石山保安族东乡族撒拉族自治县"}]},{"value":"623000","label":"甘南藏族自治州","children":[{"value":"623001","label":"合作市"},{"value":"623021","label":"临潭县"},{"value":"623022","label":"卓尼县"},{"value":"623023","label":"舟曲县"},{"value":"623024","label":"迭部县"},{"value":"623025","label":"玛曲县"},{"value":"623026","label":"碌曲县"},{"value":"623027","label":"夏河县"}]}]},{"label":"青海省","value":"630000","children":[{"value":"630100","label":"西宁市","children":[{"value":"630102","label":"城东区"},{"value":"630103","label":"城中区"},{"value":"630104","label":"城西区"},{"value":"630105","label":"城北区"},{"value":"630121","label":"大通回族土族自治县"},{"value":"630122","label":"湟中县"},{"value":"630123","label":"湟源县"}]},{"value":"632100","label":"海东地区","children":[{"value":"632121","label":"平安县"},{"value":"632122","label":"民和回族土族自治县"},{"value":"632123","label":"乐都县"},{"value":"632126","label":"互助土族自治县"},{"value":"632127","label":"化隆回族自治县"},{"value":"632128","label":"循化撒拉族自治县"}]},{"value":"632200","label":"海北藏族自治州","children":[{"value":"632221","label":"门源回族自治县"},{"value":"632222","label":"祁连县"},{"value":"632223","label":"海晏县"},{"value":"632224","label":"刚察县"}]},{"value":"632300","label":"黄南藏族自治州","children":[{"value":"632321","label":"同仁县"},{"value":"632322","label":"尖扎县"},{"value":"632323","label":"泽库县"},{"value":"632324","label":"河南蒙古族自治县"}]},{"value":"632500","label":"海南藏族自治州","children":[{"value":"632521","label":"共和县"},{"value":"632522","label":"同德县"},{"value":"632523","label":"贵德县"},{"value":"632524","label":"兴海县"},{"value":"632525","label":"贵南县"}]},{"value":"632600","label":"果洛藏族自治州","children":[{"value":"632621","label":"玛沁县"},{"value":"632622","label":"班玛县"},{"value":"632623","label":"甘德县"},{"value":"632624","label":"达日县"},{"value":"632625","label":"久治县"},{"value":"632626","label":"玛多县"}]},{"value":"632700","label":"玉树藏族自治州","children":[{"value":"632721","label":"玉树县"},{"value":"632722","label":"杂多县"},{"value":"632723","label":"称多县"},{"value":"632724","label":"治多县"},{"value":"632725","label":"囊谦县"},{"value":"632726","label":"曲麻莱县"}]},{"value":"632800","label":"海西蒙古族藏族自治州","children":[{"value":"632801","label":"格尔木市"},{"value":"632802","label":"德令哈市"},{"value":"632821","label":"乌兰县"},{"value":"632822","label":"都兰县"},{"value":"632823","label":"天峻县"}]}]},{"label":"宁夏回族自治区","value":"640000","children":[{"value":"640100","label":"银川市","children":[{"value":"640104","label":"兴庆区"},{"value":"640105","label":"西夏区"},{"value":"640106","label":"金凤区"},{"value":"640121","label":"永宁县"},{"value":"640122","label":"贺兰县"},{"value":"640181","label":"灵武市"}]},{"value":"640200","label":"石嘴山市","children":[{"value":"640202","label":"大武口区"},{"value":"640205","label":"惠农区"},{"value":"640221","label":"平罗县"}]},{"value":"640300","label":"吴忠市","children":[{"value":"640302","label":"利通区"},{"value":"640303","label":"红寺堡区"},{"value":"640323","label":"盐池县"},{"value":"640324","label":"同心县"},{"value":"640381","label":"青铜峡市"}]},{"value":"640400","label":"固原市","children":[{"value":"640402","label":"原州区"},{"value":"640422","label":"西吉县"},{"value":"640423","label":"隆德县"},{"value":"640424","label":"泾源县"},{"value":"640425","label":"彭阳县"}]},{"value":"640500","label":"中卫市","children":[{"value":"640502","label":"沙坡头区"},{"value":"640521","label":"中宁县"},{"value":"640522","label":"海原县"}]}]},{"label":"新疆维吾尔自治区","value":"650000","children":[{"value":"650100","label":"乌鲁木齐市","children":[{"value":"650102","label":"天山区"},{"value":"650103","label":"沙依巴克区"},{"value":"650104","label":"新市区"},{"value":"650105","label":"水磨沟区"},{"value":"650106","label":"头屯河区"},{"value":"650107","label":"达坂城区"},{"value":"650108","label":"东山区"},{"value":"650109","label":"米东区"},{"value":"650121","label":"乌鲁木齐县"}]},{"value":"650200","label":"克拉玛依市","children":[{"value":"650202","label":"独山子区"},{"value":"650203","label":"克拉玛依区"},{"value":"650204","label":"白碱滩区"},{"value":"650205","label":"乌尔禾区"}]},{"value":"652100","label":"吐鲁番地区","children":[{"value":"652101","label":"吐鲁番市"},{"value":"652122","label":"鄯善县"},{"value":"652123","label":"托克逊县"}]},{"value":"652200","label":"哈密地区","children":[{"value":"652201","label":"哈密市"},{"value":"652222","label":"巴里坤哈萨克自治县"},{"value":"652223","label":"伊吾县"}]},{"value":"652300","label":"昌吉回族自治州","children":[{"value":"652301","label":"昌吉市"},{"value":"652302","label":"阜康市"},{"value":"652303","label":"米泉市"},{"value":"652323","label":"呼图壁县"},{"value":"652324","label":"玛纳斯县"},{"value":"652325","label":"奇台县"},{"value":"652327","label":"吉木萨尔县"},{"value":"652328","label":"木垒哈萨克自治县"}]},{"value":"652700","label":"博尔塔拉蒙古自治州","children":[{"value":"652701","label":"博乐市"},{"value":"652722","label":"精河县"},{"value":"652723","label":"温泉县"}]},{"value":"652800","label":"巴音郭楞蒙古自治州","children":[{"value":"652801","label":"库尔勒市"},{"value":"652822","label":"轮台县"},{"value":"652823","label":"尉犁县"},{"value":"652824","label":"若羌县"},{"value":"652825","label":"且末县"},{"value":"652826","label":"焉耆回族自治县"},{"value":"652827","label":"和静县"},{"value":"652828","label":"和硕县"},{"value":"652829","label":"博湖县"}]},{"value":"652900","label":"阿克苏地区","children":[{"value":"652901","label":"阿克苏市"},{"value":"652922","label":"温宿县"},{"value":"652923","label":"库车县"},{"value":"652924","label":"沙雅县"},{"value":"652925","label":"新和县"},{"value":"652926","label":"拜城县"},{"value":"652927","label":"乌什县"},{"value":"652928","label":"阿瓦提县"},{"value":"652929","label":"柯坪县"}]},{"value":"653000","label":"克孜勒苏柯尔克孜自治州","children":[{"value":"653001","label":"阿图什市"},{"value":"653022","label":"阿克陶县"},{"value":"653023","label":"阿合奇县"},{"value":"653024","label":"乌恰县"}]},{"value":"653100","label":"喀什地区","children":[{"value":"653101","label":"喀什市"},{"value":"653121","label":"疏附县"},{"value":"653122","label":"疏勒县"},{"value":"653123","label":"英吉沙县"},{"value":"653124","label":"泽普县"},{"value":"653125","label":"莎车县"},{"value":"653126","label":"叶城县"},{"value":"653127","label":"麦盖提县"},{"value":"653128","label":"岳普湖县"},{"value":"653129","label":"伽师县"},{"value":"653130","label":"巴楚县"},{"value":"653131","label":"塔什库尔干塔吉克自治县"}]},{"value":"653200","label":"和田地区","children":[{"value":"653201","label":"和田市"},{"value":"653221","label":"和田县"},{"value":"653222","label":"墨玉县"},{"value":"653223","label":"皮山县"},{"value":"653224","label":"洛浦县"},{"value":"653225","label":"策勒县"},{"value":"653226","label":"于田县"},{"value":"653227","label":"民丰县"}]},{"value":"654000","label":"伊犁哈萨克自治州","children":[{"value":"654002","label":"伊宁市"},{"value":"654003","label":"奎屯市"},{"value":"654021","label":"伊宁县"},{"value":"654022","label":"察布查尔锡伯自治县"},{"value":"654023","label":"霍城县"},{"value":"654024","label":"巩留县"},{"value":"654025","label":"新源县"},{"value":"654026","label":"昭苏县"},{"value":"654027","label":"特克斯县"},{"value":"654028","label":"尼勒克县"}]},{"value":"654200","label":"塔城地区","children":[{"value":"654201","label":"塔城市"},{"value":"654202","label":"乌苏市"},{"value":"654221","label":"额敏县"},{"value":"654223","label":"沙湾县"},{"value":"654224","label":"托里县"},{"value":"654225","label":"裕民县"},{"value":"654226","label":"和布克赛尔蒙古自治县"}]},{"value":"654300","label":"阿勒泰地区","children":[{"value":"654301","label":"阿勒泰市"},{"value":"654321","label":"布尔津县"},{"value":"654322","label":"富蕴县"},{"value":"654323","label":"福海县"},{"value":"654324","label":"哈巴河县"},{"value":"654325","label":"青河县"},{"value":"654326","label":"吉木乃县"}]},{"value":"659001","label":"石河子市"},{"value":"659002","label":"阿拉尔市"},{"value":"659003","label":"图木舒克市"},{"value":"659004","label":"五家渠市"}]},{"label":"台湾省","value":"710000","children":[{"value":"710100","label":"台北市","children":[{"value":"710101","label":"中正区"},{"value":"710102","label":"大同区"},{"value":"710103","label":"中山区"},{"value":"710104","label":"松山区"},{"value":"710105","label":"大安区"},{"value":"710106","label":"万华区"},{"value":"710107","label":"信义区"},{"value":"710108","label":"士林区"},{"value":"710109","label":"北投区"},{"value":"710110","label":"内湖区"},{"value":"710111","label":"南港区"},{"value":"710112","label":"文山区"}]},{"value":"710200","label":"高雄市","children":[{"value":"710201","label":"新兴区"},{"value":"710202","label":"前金区"},{"value":"710203","label":"芩雅区"},{"value":"710204","label":"盐埕区"},{"value":"710205","label":"鼓山区"},{"value":"710206","label":"旗津区"},{"value":"710207","label":"前镇区"},{"value":"710208","label":"三民区"},{"value":"710209","label":"左营区"},{"value":"710210","label":"楠梓区"},{"value":"710211","label":"小港区"}]},{"value":"710300","label":"台南市","children":[{"value":"710301","label":"中西区"},{"value":"710302","label":"东区"},{"value":"710303","label":"南区"},{"value":"710304","label":"北区"},{"value":"710305","label":"安平区"},{"value":"710306","label":"安南区"}]},{"value":"710400","label":"台中市","children":[{"value":"710401","label":"中区"},{"value":"710402","label":"东区"},{"value":"710403","label":"南区"},{"value":"710404","label":"西区"},{"value":"710405","label":"北区"},{"value":"710406","label":"北屯区"},{"value":"710407","label":"西屯区"},{"value":"710408","label":"南屯区"}]},{"value":"710500","label":"金门县"},{"value":"710600","label":"南投县"},{"value":"710700","label":"基隆市","children":[{"value":"710701","label":"仁爱区"},{"value":"710702","label":"信义区"},{"value":"710703","label":"中正区"},{"value":"710704","label":"中山区"},{"value":"710705","label":"安乐区"},{"value":"710706","label":"暖暖区"},{"value":"710707","label":"七堵区"}]},{"value":"710800","label":"新竹市","children":[{"value":"710801","label":"东区"},{"value":"710802","label":"北区"},{"value":"710803","label":"香山区"}]},{"value":"710900","label":"嘉义市","children":[{"value":"710901","label":"东区"},{"value":"710902","label":"西区"}]},{"value":"711100","label":"新北市"},{"value":"711200","label":"宜兰县"},{"value":"711300","label":"新竹县"},{"value":"711400","label":"桃园县"},{"value":"711500","label":"苗栗县"},{"value":"711700","label":"彰化县"},{"value":"711900","label":"嘉义县"},{"value":"712100","label":"云林县"},{"value":"712400","label":"屏东县"},{"value":"712500","label":"台东县"},{"value":"712600","label":"花莲县"},{"value":"712700","label":"澎湖县"}]},{"label":"香港特别行政区","value":"810000","children":[{"value":"810100","label":"香港岛","children":[{"value":"810101","label":"中西区"},{"value":"810102","label":"湾仔"},{"value":"810103","label":"东区"},{"value":"810104","label":"南区"}]},{"value":"810200","label":"九龙","children":[{"value":"810201","label":"九龙城区"},{"value":"810202","label":"油尖旺区"},{"value":"810203","label":"深水埗区"},{"value":"810204","label":"黄大仙区"},{"value":"810205","label":"观塘区"}]},{"value":"810300","label":"新界","children":[{"value":"810301","label":"北区"},{"value":"810302","label":"大埔区"},{"value":"810303","label":"沙田区"},{"value":"810304","label":"西贡区"},{"value":"810305","label":"元朗区"},{"value":"810306","label":"屯门区"},{"value":"810307","label":"荃湾区"},{"value":"810308","label":"葵青区"},{"value":"810309","label":"离岛区"}]}]},{"label":"澳门特别行政区","value":"820000","children":[{"value":"820100","label":"澳门半岛"},{"value":"820200","label":"离岛"}]},{"label":"海外","value":"990000","children":[{"value":"990100","label":"海外"}]}] diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac6c2d43c13d098d591340e0ad11408fcbb7626 GIT binary patch literal 37459 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ξ-=sR6VE#=ATkWCX~qzUkke4fn_ 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 literal 0 HcmV?d00001 diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..e37dea1 --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,18 @@ + + + Created with Pixso. + + + + + + + + + + + + + + + diff --git a/assets/scss/var.scss b/assets/scss/var.scss new file mode 100644 index 0000000..ebb54c2 --- /dev/null +++ b/assets/scss/var.scss @@ -0,0 +1,3 @@ +$drak-blue: #292838; + +$light-gray: #666; diff --git a/assets/svg/O1CN01yz6fEl1MwaRtkJyvf_!!6000000001499-55-tps-70-70 (1).svg b/assets/svg/O1CN01yz6fEl1MwaRtkJyvf_!!6000000001499-55-tps-70-70 (1).svg new file mode 100644 index 0000000..a7b3b75 --- /dev/null +++ b/assets/svg/O1CN01yz6fEl1MwaRtkJyvf_!!6000000001499-55-tps-70-70 (1).svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/github-mark-white.svg b/assets/svg/github-mark-white.svg new file mode 100644 index 0000000..d5e6491 --- /dev/null +++ b/assets/svg/github-mark-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/github-mark.svg b/assets/svg/github-mark.svg new file mode 100644 index 0000000..37fa923 --- /dev/null +++ b/assets/svg/github-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/search.svg b/assets/svg/search.svg new file mode 100644 index 0000000..12e0a5c --- /dev/null +++ b/assets/svg/search.svg @@ -0,0 +1 @@ + diff --git a/assets/svg/websoft-mark-white.svg b/assets/svg/websoft-mark-white.svg new file mode 100644 index 0000000..fb8e867 --- /dev/null +++ b/assets/svg/websoft-mark-white.svg @@ -0,0 +1,15 @@ + + + + + background + + + + + + + Layer 1 + + + \ No newline at end of file diff --git a/components/AppFooter.vue b/components/AppFooter.vue new file mode 100644 index 0000000..30f6ada --- /dev/null +++ b/components/AppFooter.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/components/AppHeader.vue b/components/AppHeader.vue new file mode 100644 index 0000000..25964a0 --- /dev/null +++ b/components/AppHeader.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/components/Banner.vue b/components/Banner.vue new file mode 100644 index 0000000..592c7d9 --- /dev/null +++ b/components/Banner.vue @@ -0,0 +1,38 @@ + + + diff --git a/components/Breadcrumb.vue b/components/Breadcrumb.vue new file mode 100644 index 0000000..7c07511 --- /dev/null +++ b/components/Breadcrumb.vue @@ -0,0 +1,29 @@ + + + diff --git a/components/CardList.vue b/components/CardList.vue new file mode 100644 index 0000000..09c2a97 --- /dev/null +++ b/components/CardList.vue @@ -0,0 +1,44 @@ + + + diff --git a/components/CompanyList.vue b/components/CompanyList.vue new file mode 100644 index 0000000..519d089 --- /dev/null +++ b/components/CompanyList.vue @@ -0,0 +1,102 @@ + + + diff --git a/components/PageBanner.vue b/components/PageBanner.vue new file mode 100644 index 0000000..cab2a43 --- /dev/null +++ b/components/PageBanner.vue @@ -0,0 +1,180 @@ + + + diff --git a/components/PageContainer.vue b/components/PageContainer.vue new file mode 100644 index 0000000..48fcd03 --- /dev/null +++ b/components/PageContainer.vue @@ -0,0 +1,30 @@ + + + diff --git a/components/Passport.vue b/components/Passport.vue new file mode 100644 index 0000000..a481bc0 --- /dev/null +++ b/components/Passport.vue @@ -0,0 +1,51 @@ + + diff --git a/components/ProductList.vue b/components/ProductList.vue new file mode 100644 index 0000000..f5f32bd --- /dev/null +++ b/components/ProductList.vue @@ -0,0 +1,94 @@ + + + diff --git a/components/ProductShopInfo.vue b/components/ProductShopInfo.vue new file mode 100644 index 0000000..d0b03a1 --- /dev/null +++ b/components/ProductShopInfo.vue @@ -0,0 +1,42 @@ + + + + diff --git a/components/UnderMaintenance.vue b/components/UnderMaintenance.vue new file mode 100644 index 0000000..bb04401 --- /dev/null +++ b/components/UnderMaintenance.vue @@ -0,0 +1,24 @@ + + diff --git a/components/Upload.vue b/components/Upload.vue new file mode 100644 index 0000000..6b09670 --- /dev/null +++ b/components/Upload.vue @@ -0,0 +1,61 @@ + + + diff --git a/components/UserCard.vue b/components/UserCard.vue new file mode 100644 index 0000000..c10e09f --- /dev/null +++ b/components/UserCard.vue @@ -0,0 +1,225 @@ + + + diff --git a/composables/configState.ts b/composables/configState.ts new file mode 100644 index 0000000..d330be7 --- /dev/null +++ b/composables/configState.ts @@ -0,0 +1,91 @@ +import { useState } from '#imports'; +import type { Config } from '~/types/global'; +import type {Website} from "~/api/cms/website/model"; +import type {Navigation} from "~/api/cms/navigation/model"; +import type {User} from "~/api/system/user/model"; +import type {Company} from "~/api/system/company/model"; +import type {MyCart, ShopCart} from "~/api/shop/shopCart/model"; + +// 网站信息 +export const useWebsite = () => + useState('website', () => { + return {}; + }); + +// 参数配置 +export const useConfigInfo = () => + useState('config', () => { + return {}; + }); + +// 主导航 +export const useMenu = () => + useState('menu', () => { + return []; + }); + +// 副导航 +export const useSubMenu = () => + useState('subMenu', () => { + return []; + }); + +// 页面元素 +export const useForm = () => useState('form', () => { + return {}; +}); + +// 固钉 +export const useProductAffix = () => + useState('affixTop', () => { + return false; + }); +// 后台管理域名 +export const useSysDomain = () => useState('useSysDomain', () => ''); + +// 登录凭证 +export const useToken = () => useState('token', () => ''); + +// 用户信息 +export const useUser = () => + useState('user', () => { + return { + userId: 0, + avatar: '', + phone: '', + balance: 0, + nickname: '', + gradeId: 0, + gradeName: '', + certification: false, + tenantId: 0, + tenantName: '', + }; + }); + +// 企业信息 +export const useCompany = () => + useState('company', () => { + return {}; + }); + +// 是否显示登录弹窗 +export const useShowLogin = () => useState('showLogin',() => false) + +// 购物车状态 +export const useCart = () => useState('cart', () => { + return { + appName: '', + domain: '', + adminUrl: '', + menuId: undefined, + num: 1, + type: 1, + payType: 102, + payPrice: 0, + month: 1, + comments: '', + list: [], + totalPrice: 0 + }; +}); diff --git a/composables/useClientRequest.ts b/composables/useClientRequest.ts new file mode 100644 index 0000000..9690ec5 --- /dev/null +++ b/composables/useClientRequest.ts @@ -0,0 +1,43 @@ +import {getBaseUrl, isArray} from '~/utils/tool'; +import {MODULES_API_URL, TENANT_ID} from "~/config"; + +type FetchType = typeof $fetch; +export type FetchOptions = Parameters[1]; + +export const useClientRequest = (url: string, opts?: FetchOptions) => { + // 配置信息 + const runtimeConfig = useRuntimeConfig(); + // 请求接口 + const baseUrl = ref(''); + baseUrl.value = runtimeConfig.public.apiServer; + // 开发环境 + if(process.env.NODE_ENV === 'development'){ + baseUrl.value = `http://127.0.0.1:9002/api` + } + // 登录凭证token + const token = useToken(); + const _token = localStorage.getItem('token'); + if(_token){ + token.value = _token + } + + const defaultOptions: FetchOptions = { + baseURL: baseUrl.value, + onRequest({ options }) { + options.headers = (options.headers || {}) as { [key: string]: string }; + if (token.value) { + options.headers.Authorization = token.value; + } + }, + onResponse({ response }) { + if (+response.status === 0 && +response._data.code !== 0) { + ElMessage.error(response._data.message); + } + }, + onResponseError({ response }) { + ElMessage.error(isArray(response._data.data.message) ? response._data.data.message[0] : response._data.data.message); + } + }; + + return $fetch(runtimeConfig.public.apiServer + url, { ...defaultOptions, ...opts }); +}; diff --git a/composables/useServerRequest.ts b/composables/useServerRequest.ts new file mode 100644 index 0000000..c3458b1 --- /dev/null +++ b/composables/useServerRequest.ts @@ -0,0 +1,63 @@ +/** + * 参考文档 + * https://blog.csdn.net/m0_63281537/article/details/126699761 + */ + +import { useFetch } from '#app'; +import type { UseFetchOptions } from '#app'; +import {isArray} from '~/utils/tool'; +import {isInteger} from "~/utils/common"; + +export const useServerRequest = (url: string, opts?: UseFetchOptions) => { + // 配置信息 + const runtimeConfig = useRuntimeConfig(); + // 请求接口 + const baseUrl = ref(''); + baseUrl.value = runtimeConfig.public.apiServer; + // 开发环境 + if(process.env.NODE_ENV === 'development'){ + // baseUrl.value = `http://127.0.0.1:9002/api` + } + // 登录凭证token + const token = useToken(); + const _token = localStorage.getItem('token'); + if(_token){ + token.value = _token + } + const defaultOptions: UseFetchOptions = { + baseURL: baseUrl.value, + onRequest({ options }) { + options.headers = (options.headers || {}) as { [key: string]: string }; + // options.headers.tenantid = runtimeConfig.public.tenantId; + if (token.value) { + options.headers.Authorization = token.value; + } + // TODO 1 从二级域名解构租户ID + const domain = window.location.hostname; + const parts = domain.split('.'); + const subDomain = parts[0]; + if (isInteger(subDomain)) { + // options.headers.tenantid = `${subDomain}`; + } + // TODO 2 从绑定域名解构的租户ID + if(localStorage.getItem('TID_ADMIN')){ + options.headers.TenantId = `5`; + } + }, + onResponse({ response }) { + if (+response.status === 0 && +response._data.code !== 0) { + process.client && ElMessage.error(response._data.message); + } + if(+response.status === 500){ + ElMessage.error('网络请求错误') + } + return response._data.data; + }, + onResponseError({ response }) { + process.client && + ElMessage.error(isArray(response._data.data.message) ? response._data.data.message[0] : response._data.data.message); + } + }; + // console.log('请求接口:', baseUrl.value+url) + return useFetch(url, { ...defaultOptions, ...opts } as any); +}; diff --git a/config/index.ts b/config/index.ts new file mode 100644 index 0000000..9eaf775 --- /dev/null +++ b/config/index.ts @@ -0,0 +1,75 @@ +// 租户ID +export const TENANT_ID = import.meta.env.VITE_TENANT_ID; +// appSecret +export const APP_SECRET = 'ffd6eee985af45e4a75098422d1decbb'; + +export const domain = 'https://websoft.top'; +// 主节点 +export const SERVER_API_URL = import.meta.env.VITE_SERVER_URL || 'https://modules.gxwebsoft.com/api'; +// 模块节点 +export const MODULES_API_URL = import.meta.env.VITE_API_URL || 'https://server.gxwebsoft.com/api'; +export const THINK_API_URL = import.meta.env.VITE_THINK_URL || 'https://gxtyzx-api.gxwebsoft.com/api'; +// 文件服务器地址 +export const FILE_SERVER = 'https://file.wsdns.cn'; +// 图片前缀 +export const IMG_URL = 'https://gxtyzx.gxsportscenter.com/uploads/images/'; + +/** + * 以下配置一般不需要修改 + */ +// 接口地址 +export const API_BASE_URL: string = import.meta.env.VITE_API_URL; +export const PROJECT_NAME: string = import.meta.env.VITE_APP_NAME || '网宿软件 https://websoft.top'; +// 不显示侧栏的路由 +export const HIDE_SIDEBARS: string[] = ['/home']; +// 不显示页脚的路由 +export const HIDE_FOOTERS: string[] = [ + '/system/dictionary', + '/system/organization', + '/form/advanced' +]; +// 页签同路由不同参数可重复打开的路由 +export const REPEATABLE_TABS: string[] = []; +// 不需要登录的路由 +export const WHITE_LIST: string[] = [ + '/login', + '/register', + '/forget', + '/wx-work-login', + '/token-login', + '/home' +]; +// 开启 KeepAlive 后仍然不需要缓存的路由地址 +export const KEEP_ALIVE_EXCLUDES: string[] = []; +// 直接指定菜单数据 +// export const USER_MENUS = menu; +export const USER_MENUS: Array | undefined = undefined; +// 首页名称, 为空则取第一个菜单的名称 +export const HOME_TITLE: string | undefined = undefined; +// 首页路径, 为空则取第一个菜单的地址 +export const HOME_PATH: string | undefined = undefined; +// 外层布局的路由地址 +export const LAYOUT_PATH = '/'; +// 刷新路由的路由地址 +export const REDIRECT_PATH = '/redirect'; +// 开启页签栏是否缓存组件 +//export const TAB_KEEP_ALIVE = !import.meta.env.DEV; +export const TAB_KEEP_ALIVE = true; +// token 传递的 header 名称 +export const TOKEN_HEADER_NAME = 'Authorization'; +// token 存储的名称 +export const TOKEN_STORE_NAME = 'token'; +// 主题配置存储的名称 +export const THEME_STORE_NAME = 'theme:'; +// i18n 缓存的名称 +export const I18N_CACHE_NAME = 'i18n-lang'; +// 是否开启国际化功能 +export const I18N_ENABLE = true; +// 高德地图 key , 自带的只能用于测试, 正式项目请自行到高德地图官网申请 key +export const MAP_KEY = '8191620da39a742c6f18f010c084c772'; +// 高德地图 安全密钥 +export const MAP_CODE = '7225174a116c1c44e1bd7a177d1787d5'; +// 缩略图前缀 +export const FILE_THUMBNAIL = FILE_SERVER + '/thumbnail'; +// 文件下载前缀 +export const FILE_DOWNLOAD = FILE_SERVER + '/download'; diff --git a/layouts/default.vue b/layouts/default.vue new file mode 100644 index 0000000..8b39a64 --- /dev/null +++ b/layouts/default.vue @@ -0,0 +1,180 @@ + + diff --git a/pages/[custom].vue b/pages/[custom].vue new file mode 100644 index 0000000..a96438f --- /dev/null +++ b/pages/[custom].vue @@ -0,0 +1,76 @@ + + diff --git a/pages/article/[categoryId].vue b/pages/article/[categoryId].vue new file mode 100644 index 0000000..f3f8b43 --- /dev/null +++ b/pages/article/[categoryId].vue @@ -0,0 +1,89 @@ + + diff --git a/pages/article/components/CardList.vue b/pages/article/components/CardList.vue new file mode 100644 index 0000000..e263a32 --- /dev/null +++ b/pages/article/components/CardList.vue @@ -0,0 +1,52 @@ + + + diff --git a/pages/ask/[userId].vue b/pages/ask/[userId].vue new file mode 100644 index 0000000..c01b884 --- /dev/null +++ b/pages/ask/[userId].vue @@ -0,0 +1,211 @@ + + + + diff --git a/pages/ask/components/CardList.vue b/pages/ask/components/CardList.vue new file mode 100644 index 0000000..16fdc56 --- /dev/null +++ b/pages/ask/components/CardList.vue @@ -0,0 +1,55 @@ + + + diff --git a/pages/ask/index.vue b/pages/ask/index.vue new file mode 100644 index 0000000..bd5acee --- /dev/null +++ b/pages/ask/index.vue @@ -0,0 +1,103 @@ + + diff --git a/pages/case/components/CardList.vue b/pages/case/components/CardList.vue new file mode 100644 index 0000000..3f5ad87 --- /dev/null +++ b/pages/case/components/CardList.vue @@ -0,0 +1,63 @@ + + + diff --git a/pages/case/components/PageBanner.vue b/pages/case/components/PageBanner.vue new file mode 100644 index 0000000..df21871 --- /dev/null +++ b/pages/case/components/PageBanner.vue @@ -0,0 +1,115 @@ + + + diff --git a/pages/case/index.vue b/pages/case/index.vue new file mode 100644 index 0000000..2b1fef2 --- /dev/null +++ b/pages/case/index.vue @@ -0,0 +1,84 @@ + + diff --git a/pages/category/components/CardList.vue b/pages/category/components/CardList.vue new file mode 100644 index 0000000..0e26051 --- /dev/null +++ b/pages/category/components/CardList.vue @@ -0,0 +1,47 @@ + + + diff --git a/pages/category/index.vue b/pages/category/index.vue new file mode 100644 index 0000000..259e6f4 --- /dev/null +++ b/pages/category/index.vue @@ -0,0 +1,91 @@ + + diff --git a/pages/components/ArticleList.vue b/pages/components/ArticleList.vue new file mode 100644 index 0000000..96e5579 --- /dev/null +++ b/pages/components/ArticleList.vue @@ -0,0 +1,104 @@ + + + diff --git a/pages/components/Banner.vue b/pages/components/Banner.vue new file mode 100644 index 0000000..11d6d93 --- /dev/null +++ b/pages/components/Banner.vue @@ -0,0 +1,96 @@ + + + diff --git a/pages/components/CardList.vue b/pages/components/CardList.vue new file mode 100644 index 0000000..941262f --- /dev/null +++ b/pages/components/CardList.vue @@ -0,0 +1,87 @@ + + + diff --git a/pages/components/Flash.vue b/pages/components/Flash.vue new file mode 100644 index 0000000..a0db57f --- /dev/null +++ b/pages/components/Flash.vue @@ -0,0 +1,121 @@ + + + + diff --git a/pages/components/PlugList.vue b/pages/components/PlugList.vue new file mode 100644 index 0000000..d6d92d1 --- /dev/null +++ b/pages/components/PlugList.vue @@ -0,0 +1,83 @@ + + + diff --git a/pages/components/ProductList.vue b/pages/components/ProductList.vue new file mode 100644 index 0000000..13a09c0 --- /dev/null +++ b/pages/components/ProductList.vue @@ -0,0 +1,92 @@ + + + diff --git a/pages/detail/components/LikeArticle.vue b/pages/detail/components/LikeArticle.vue new file mode 100644 index 0000000..70cbbf5 --- /dev/null +++ b/pages/detail/components/LikeArticle.vue @@ -0,0 +1,64 @@ + + + + diff --git a/pages/detail/components/PageBanner.vue b/pages/detail/components/PageBanner.vue new file mode 100644 index 0000000..b3b03da --- /dev/null +++ b/pages/detail/components/PageBanner.vue @@ -0,0 +1,94 @@ + + + diff --git a/pages/detail/index.vue b/pages/detail/index.vue new file mode 100644 index 0000000..9472092 --- /dev/null +++ b/pages/detail/index.vue @@ -0,0 +1,232 @@ + + + + + diff --git a/pages/developer/components/CardList.vue b/pages/developer/components/CardList.vue new file mode 100644 index 0000000..1bad488 --- /dev/null +++ b/pages/developer/components/CardList.vue @@ -0,0 +1,47 @@ + + + diff --git a/pages/developer/index.vue b/pages/developer/index.vue new file mode 100644 index 0000000..e45f4b7 --- /dev/null +++ b/pages/developer/index.vue @@ -0,0 +1,154 @@ + + diff --git a/pages/developer/join-in.vue b/pages/developer/join-in.vue new file mode 100644 index 0000000..701ed25 --- /dev/null +++ b/pages/developer/join-in.vue @@ -0,0 +1,149 @@ + + diff --git a/pages/docs/components/CardList.vue b/pages/docs/components/CardList.vue new file mode 100644 index 0000000..1bad488 --- /dev/null +++ b/pages/docs/components/CardList.vue @@ -0,0 +1,47 @@ + + + diff --git a/pages/docs/index.vue b/pages/docs/index.vue new file mode 100644 index 0000000..0eaa8bc --- /dev/null +++ b/pages/docs/index.vue @@ -0,0 +1,103 @@ + + diff --git a/pages/down/components/CardList.vue b/pages/down/components/CardList.vue new file mode 100644 index 0000000..53a343e --- /dev/null +++ b/pages/down/components/CardList.vue @@ -0,0 +1,52 @@ + + + diff --git a/pages/down/index.vue b/pages/down/index.vue new file mode 100644 index 0000000..482aa34 --- /dev/null +++ b/pages/down/index.vue @@ -0,0 +1,96 @@ + + diff --git a/pages/index.vue b/pages/index.vue new file mode 100644 index 0000000..3f4d29d --- /dev/null +++ b/pages/index.vue @@ -0,0 +1,68 @@ + + diff --git a/pages/item/components/Comments.vue b/pages/item/components/Comments.vue new file mode 100644 index 0000000..e75dd0f --- /dev/null +++ b/pages/item/components/Comments.vue @@ -0,0 +1,201 @@ + + + diff --git a/pages/item/components/PageBanner.vue b/pages/item/components/PageBanner.vue new file mode 100644 index 0000000..3c4aa62 --- /dev/null +++ b/pages/item/components/PageBanner.vue @@ -0,0 +1,168 @@ + + + + diff --git a/pages/item/index.vue b/pages/item/index.vue new file mode 100644 index 0000000..2ba9624 --- /dev/null +++ b/pages/item/index.vue @@ -0,0 +1,293 @@ + + + + + diff --git a/pages/manage/cms/index.vue b/pages/manage/cms/index.vue new file mode 100644 index 0000000..592ed78 --- /dev/null +++ b/pages/manage/cms/index.vue @@ -0,0 +1,358 @@ + + + diff --git a/pages/manage/index.vue b/pages/manage/index.vue new file mode 100644 index 0000000..aeb88e9 --- /dev/null +++ b/pages/manage/index.vue @@ -0,0 +1,373 @@ + + + diff --git a/pages/manage/shop/index.vue b/pages/manage/shop/index.vue new file mode 100644 index 0000000..174344d --- /dev/null +++ b/pages/manage/shop/index.vue @@ -0,0 +1,358 @@ + + + diff --git a/pages/market/components/CardList.vue b/pages/market/components/CardList.vue new file mode 100644 index 0000000..aaad17a --- /dev/null +++ b/pages/market/components/CardList.vue @@ -0,0 +1,86 @@ + + + diff --git a/pages/market/index.vue b/pages/market/index.vue new file mode 100644 index 0000000..ebb87a5 --- /dev/null +++ b/pages/market/index.vue @@ -0,0 +1,75 @@ + + diff --git a/pages/merchant/index.vue b/pages/merchant/index.vue new file mode 100644 index 0000000..a9785c0 --- /dev/null +++ b/pages/merchant/index.vue @@ -0,0 +1,82 @@ + + diff --git a/pages/page/index.vue b/pages/page/index.vue new file mode 100644 index 0000000..a96438f --- /dev/null +++ b/pages/page/index.vue @@ -0,0 +1,76 @@ + + diff --git a/pages/passport/components/Auth.vue b/pages/passport/components/Auth.vue new file mode 100644 index 0000000..a8b6432 --- /dev/null +++ b/pages/passport/components/Auth.vue @@ -0,0 +1,312 @@ + + + diff --git a/pages/passport/login.vue b/pages/passport/login.vue new file mode 100644 index 0000000..f476a55 --- /dev/null +++ b/pages/passport/login.vue @@ -0,0 +1,491 @@ + + + diff --git a/pages/passport/register.vue b/pages/passport/register.vue new file mode 100644 index 0000000..281f859 --- /dev/null +++ b/pages/passport/register.vue @@ -0,0 +1,49 @@ + + diff --git a/pages/product/checkout/components/PageBanner.vue b/pages/product/checkout/components/PageBanner.vue new file mode 100644 index 0000000..1004238 --- /dev/null +++ b/pages/product/checkout/components/PageBanner.vue @@ -0,0 +1,67 @@ + + + diff --git a/pages/product/checkout/index.vue b/pages/product/checkout/index.vue new file mode 100644 index 0000000..ca0884b --- /dev/null +++ b/pages/product/checkout/index.vue @@ -0,0 +1,226 @@ + + + + diff --git a/pages/product/components/CardList.vue b/pages/product/components/CardList.vue new file mode 100644 index 0000000..d75a655 --- /dev/null +++ b/pages/product/components/CardList.vue @@ -0,0 +1,81 @@ + + + diff --git a/pages/product/create/components/PageBanner.vue b/pages/product/create/components/PageBanner.vue new file mode 100644 index 0000000..5921c97 --- /dev/null +++ b/pages/product/create/components/PageBanner.vue @@ -0,0 +1,67 @@ + + + diff --git a/pages/product/create/index.vue b/pages/product/create/index.vue new file mode 100644 index 0000000..9c1f4ef --- /dev/null +++ b/pages/product/create/index.vue @@ -0,0 +1,439 @@ + + + + diff --git a/pages/product/create/product.vue b/pages/product/create/product.vue new file mode 100644 index 0000000..d05ed0b --- /dev/null +++ b/pages/product/create/product.vue @@ -0,0 +1,389 @@ + + + + diff --git a/pages/product/createWebsite/index.vue b/pages/product/createWebsite/index.vue new file mode 100644 index 0000000..8b27bfb --- /dev/null +++ b/pages/product/createWebsite/index.vue @@ -0,0 +1,25 @@ + + + + diff --git a/pages/product/createWebsite/index2.vue b/pages/product/createWebsite/index2.vue new file mode 100644 index 0000000..8b27bfb --- /dev/null +++ b/pages/product/createWebsite/index2.vue @@ -0,0 +1,25 @@ + + + + diff --git a/pages/product/detail/[id].vue b/pages/product/detail/[id].vue new file mode 100644 index 0000000..46040ff --- /dev/null +++ b/pages/product/detail/[id].vue @@ -0,0 +1,168 @@ + + diff --git a/pages/product/index.vue b/pages/product/index.vue new file mode 100644 index 0000000..6cb50b4 --- /dev/null +++ b/pages/product/index.vue @@ -0,0 +1,75 @@ + + diff --git a/pages/search/index.vue b/pages/search/index.vue new file mode 100644 index 0000000..0f38b2a --- /dev/null +++ b/pages/search/index.vue @@ -0,0 +1,138 @@ + + diff --git a/pages/templates/components/CardList.vue b/pages/templates/components/CardList.vue new file mode 100644 index 0000000..56f5311 --- /dev/null +++ b/pages/templates/components/CardList.vue @@ -0,0 +1,57 @@ + + + diff --git a/pages/templates/components/PageBanner.vue b/pages/templates/components/PageBanner.vue new file mode 100644 index 0000000..df21871 --- /dev/null +++ b/pages/templates/components/PageBanner.vue @@ -0,0 +1,115 @@ + + + diff --git a/pages/templates/index.vue b/pages/templates/index.vue new file mode 100644 index 0000000..2b1fef2 --- /dev/null +++ b/pages/templates/index.vue @@ -0,0 +1,84 @@ + + diff --git a/pages/user/auth.vue b/pages/user/auth.vue new file mode 100644 index 0000000..7a49479 --- /dev/null +++ b/pages/user/auth.vue @@ -0,0 +1,58 @@ + + diff --git a/pages/user/components/Auth.vue b/pages/user/components/Auth.vue new file mode 100644 index 0000000..040f14a --- /dev/null +++ b/pages/user/components/Auth.vue @@ -0,0 +1,460 @@ + + + + diff --git a/pages/user/components/Base.vue b/pages/user/components/Base.vue new file mode 100644 index 0000000..fb74ab7 --- /dev/null +++ b/pages/user/components/Base.vue @@ -0,0 +1,46 @@ + + + + diff --git a/pages/user/components/Order.vue b/pages/user/components/Order.vue new file mode 100644 index 0000000..f5289e6 --- /dev/null +++ b/pages/user/components/Order.vue @@ -0,0 +1,45 @@ + + + + diff --git a/pages/user/components/Password.vue b/pages/user/components/Password.vue new file mode 100644 index 0000000..2fbb62f --- /dev/null +++ b/pages/user/components/Password.vue @@ -0,0 +1,31 @@ + + + + diff --git a/pages/user/components/UserMenu.vue b/pages/user/components/UserMenu.vue new file mode 100644 index 0000000..8546f2e --- /dev/null +++ b/pages/user/components/UserMenu.vue @@ -0,0 +1,60 @@ + + + + diff --git a/pages/user/index.vue b/pages/user/index.vue new file mode 100644 index 0000000..6b460aa --- /dev/null +++ b/pages/user/index.vue @@ -0,0 +1,96 @@ + + diff --git a/pages/user/logout.vue b/pages/user/logout.vue new file mode 100644 index 0000000..cca3931 --- /dev/null +++ b/pages/user/logout.vue @@ -0,0 +1,13 @@ + + diff --git a/pages/user/order.vue b/pages/user/order.vue new file mode 100644 index 0000000..943abeb --- /dev/null +++ b/pages/user/order.vue @@ -0,0 +1,94 @@ + + diff --git a/pages/user/password.vue b/pages/user/password.vue new file mode 100644 index 0000000..654f2d3 --- /dev/null +++ b/pages/user/password.vue @@ -0,0 +1,139 @@ + + diff --git a/plugins/element-ui.js b/plugins/element-ui.js new file mode 100644 index 0000000..6d94d4c --- /dev/null +++ b/plugins/element-ui.js @@ -0,0 +1,6 @@ +import Vue from 'vue' +import ElementUI from 'element-ui' +import 'element-ui/lib/theme-chalk/index.css' +import locale from 'element-ui/lib/locale/lang/zh-CN' + +Vue.use(ElementUI, { locale }) diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..56625ef95ad31c01c1f367b3ea5fba691597cb8a GIT binary patch literal 4286 zcmeI#dyG_f6$kJ$yC{|xmLL&vcV~8IcOG|MJG09o5EN{bYE6iJ5L>J3BYj9wY&2=n zSQ%SmjhZ%ZFk+hm7(v-GKH`c_~B1Lz3_9frmK z<&w|-&hMPFzw?{BWCKJl{HdxU>no*J5`BV*f`All1uLI$Nvf{0(r2 zLY#_}ac9T_?i>$yhgb9PI^y0s`y1th<&?7;s|VaUR=f)A-v1@QT;j=1CEVhBoDbE^ z!EDak+*~`!U7M_`}%$89CXV_uSv zx*x^)yoht?al_T;cPV6chi=6D56l+KxsrDOn`Td>R{p|WDSzoX3%m${+74KBzA=~} z^XW=5x|LrUZ9X>IY8?vp?bxT3ABtaBeHRR12h$Pf^UwU}89#~NR9*27Mn8V`N9)Rr z?%-*o1Lx;;`c>p!Hah&eowI6Pfmg+o-j~JW)m-2V_7@9se-TequYoJi?+ugD8`*4h z2QC_2ew?3^3chOeMQ=v_Z+0$I3$Q%kGsW+`?C?JBv;+Gyj+|A$B=&i~fVJp+eYAm$ zmMYSF!w(y&0N$-bPpHKhZ(L^dga#Mn(W7+)Sv*z4;`g?bVt>tY?4NMtvh}BGev3Ph zI8b}p9rU3%=_85jG5@4~B*^m=P4AEF(0fCq_eby1k0|ySynw8J@SS!9qbOl(n``bmUuT-@8NqyGm!v1N|fp@deBj_RY+jr2$8%Ud4 zzf>EFj%Y_QKW`vnXv1|)+F&%(iL_)XeChVW=%O@U0ZIv;Jd+mapCWGbtFXaRnUMP zCe+dJ$AIKCKGXC%ubha_%5lukn~2Y$7LfSN&gYh`7YNE=Gkhjz^R1t|uo9fDq>hIz zUUedT4%p!x#4#W_nXvBgEzH;DL>=3v5`9{F<5KPT`UPj+vF#rOo;$zz-Ya*0={*4| zymrS;?*?E&uR0mA=9j3`krvlLV*Y*pv z>pq>DZoT;6H*f#I1a7+R;$!h;f1|$EpE4^sDLUQh9Q{R~)N< zLri17E%A48qA@CtH(qw0mALyGA6nMl`)%BdeL6>6y~3bE>Ta% z_QM>^=DdmZHu?O9<(T8aJ=|H19_&~BtMvvlUi@s)Gp*$AAF!naO09UYM|~kiuo67r z&aq_|NI8H;4w?nd-c-vmJC;Ni|$H#RI-qz48P%QZ&fW>nwNfHMQO&K6{Shl YW#Y2-C#JFt^cFX34bnFyZ{NM9 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ξ-=sR6VE#=ATkWCX~qzUkke4fn_ z1`ix^a+*(^xG5_IG7JGlBX}VX$x6FsPW=7|zPAdJaq|s|Alzk39Bp`l8JEpc zmD2TAS&s8rd16ub`^$NbfX9+#(alh1X1gU*)Ie^+pp5o=UOb?)l0yHds?O^`vXb~8 zH2j_pv6q2FUNojGOr-!g@IMEu-9|3`LFMDAoY$wz_3NsJT<^2dlJPWkHI3y#V@1}| zII^;9I5h%(JY{Eb0%DGH>+`W6<4__r(s6>jA^RQf*Go)1tRajn4Gj(XL{taY>I{~v za`P`5P=J4RFxq@VN#=&s=xh9B_8rs0T|UpkcOxRfReb(nV7$ny>l^0zpGBOJP|rW) z%_&%R_sJ)?L~>mE2CAw$>iThhP+o>Y$AbFr{hatbpW+SDcgIp4O zN2kl>gzu=wM@ROn_4sU1U9m*yO{Cw*f6~NqBnh6LS5($gBMS{!36)2~5y)hzYaAZa zMsHTVb-#*lL)BdEey@n99WWeb?E&A7W03PBnUJ7x`U7bt`x0|=F?h^O&2wGnWKD)* z-j1>|20ssWs!A5j)e#xz>IVbkE9G>Y@l|k?dN(qfuPH27+gy&_FV_}LjhD#AU~O?) z`(lEEJiExI@C)%nhHf0jjq?0|ima?9*Q2ZyrzF85vk&k-{XC0MP8vHqE0Oyx{IX&) zOy;4hZcY~?O0et`ysp9P!M+w&)) zo~wIV6r^?z`3}BGjFFS<1PDEExJ+gq?>b8zB}#!GM$H_hNQAAf2-u(1tJkxg&;Ari z$G?CZrd#aRf812sSQ|gGE6TB1)8U1I3Yy{>sBQ@vaPq0ODJ%DtoVZdn)L9I=!H2&M z+HOm;yvY`lvCt%8yjB;QW`!;c-f0HPK8f|o6nUFjSmeDw&r8RVv73#hEZV4RsA)hm zmcdAyuw6-Xoh7R8JLzBy1qJd%3U9vkTWJ7A0j$i-k;4G**Kbk~kzoH$L_->NU0vT^ z_+wIW*{04V8h)s1i)<$ZY05YhT2=uh<->p2Ma?YyerpdK8)S?2KOAt0{W;YG+J-87 zbA0bcp(tsW&N8(ZakGEIaW)Rqei^h1k55< z{%{GAW`W3!*arN#;np~QT6-Wjh5M_d`hV~uPD5MWYxC*nBv~Z z!`KEr{g6UWGk6#GE+yf>#s!BSrmD>t{ASi!YH={wSy<)c>%AN&no`T(u+VDbYlE%r z@gI)MQHfKVx(mRC>QEg+x_jnLoghHr_zi7lVB-vWh7%FxrA6(ZhUBtApHa80S%nA( z9`Fg<;8U%u=2HfJ(%5t603MID}7Z#*Snn`|-S?R|0 z>Sja?l}m{u)Z=#g6*2TlbhEKyons|oMe4`ZWXT|n$NUT^InmY9gSXubE-=V`2YmG{ z2TtV(u(s~NWI7=u&$kmBK7|SBd%lORwQK)6tk|pw@`g{K<8t@Yk^}`XBC_Q*O$08d zD-7M+>fd(;1)V}s!l8rKKJop~a7=*Xv0Z@*p^z<-{l-ZQHZ_~QmPHMRM*he!`c2-c z#aJpfU!GBtV9f)?m0ib|n3;8&5Zs_c7zQ%6+3+ainP$8&4G=S2c~O_j4lNQ7Q({oTz=znDJKaz(Aqm>3Nd z^34hRy?hjGoa@bY!NM^3RbutKI6P}9Cru-VXOhs^EuVT&w8YXB)btZFNU2Q!Q8mTi zU?Q%$pZ#Xmb07WuyU}v>uI!O@IX)fvY`-X8SX*CRT~7x#9hy(*E2&VJ9$JRur}xi1 zNa}xJ`Tj)b@Wsa9!}|txelGSP_h-v5?OWzpSk@1~Z2ii}+yN|%R_362txf;qxSN;F zECv<+Bthel%^QbWOoSqd>GzUhA^LZbbQ*81Yu;A-^{ZUDOQ1O}E`9Gx-aGiXuPL;1 zKv$@0dA8{E8d_RSVKQGV*bzqgmjb{7tB!rT>1*t0Z2Hh3p`Na;Zk6K|u}UNa1v=q* z+Con)#g}}upfwsb0+O)o)Dx%LldcV2Zz0b1%|U0?8fPT+y0@n%k#sPAEL*_A{@H$W z6ew=4-M9R3I$!eV&Z75Om#Ym-;?juw^6(X#RD;auZ@iR7jW)a`?Qo>B3=rF_xGcGn zXrC@f+1>rgrnVbpgNiD&5sstQpdPF+i0O>w5C4#y2eDOGPfI_ZYe(VBP9IxGR8VpZ zDEGf=J7&@8hH0k{$0Fpg=oDr-9oF#I*^k(0)xHL$1`HG{NHipmF8!<3)Xg%g#~mE( zFz~r-ig`dg>oIgbfdL?1zY{q zRck5%opyw7H`y&?NX|NvJTKwogV7dQ$<<0*EK&PgrIu)SbwBWjUJVytR zhYq>CCh`VP|D?)C@j zcJ6V?Re9-CEVx46Fg4q4GdOjJ`I7H6(*NW6p`wtTVT&~y#N6q`dR zP0t@Ai!pid-&ue8TW+`W*DOIb_k0wyRaFx*3^7vf!sa-8pb#-QO@ouAb^G;ZzgK`7 z=+S1bJD@taF*h}*`ea)&vQ-8iuCyvfp2bGXoR+NZ?5wiIVOw2a+)2+0#Rkr`Fx$l;y@J}zzg2jj9Mm2Kj(4X85 zrwkK**-*&!LFBmlNB{40pc1`NfKNbb?4@C}D>QAI+x*;b1KXr=3f zaEJbQy8hgtBobZJ@iWCIb>{a;T9&o^X|GwXM-*T1DijPEDZ)*rzW zK2GqJa|eQRNS~2{<5tHY!@#rYY2vNTpPEO&D9Vrirtc4V-LBSZkiyl4K*p~Fl~9Ni zJl=s|TbAl*v&bmdRu>`fZI^8Xtn|Kun28BF);8DU8ggU-s_ZY37r4$G?5$u+L-!&M zDtH~8$%M5&SWF8NZs|&d+kSdv+n_B3(ogyk}@4geg_ntWa1!!4{cl=CNO) ztwuB)@(HlS^xoKx6OM}4EZwMBEaUK$nesu*uw<^3`^_TYVM};#<-}9N9_n9uqD~nf zPb?r+?K`_0?1>*&Y*uP|uw_4)Y)!rFr< z%;zbdH$gbZull4cDROFs?aV71UtAJO6O4$tRc|IoMi{-~Ou!}9i6lnP*n@KvnS=W~ zP#7MFjiIi~A88ZARG=Wv6+-C^M{-zM+kLj-1;HXQ%AD(Q96)KZo!x7g79Ktg)P_&> zZGGqi;{Y+udw4h0HInT%-)jpYrZ>;WI$7@))*;ZTJRE&HgyAIW5i4f?vK9MNlqo8g4SC^Fx5+8q z;A^lT%y1lebePPzQ{|$?=Hu>Q*;55=d`M0 z$7{+r^qz==_yT)$L8D~Ss$=;y`u?CpG>x+)WyAdC{kmZ?1yml}hfm4j&C-fR1-V|F8q}=L7$AJa z?T9>JbY&a8{2vWH5anwA($L);kp8r*M$|DL#=rKOd@+I=Jbi*S3xL?MPw zvl!?#LKV&yW&i0nj1RA8!XG_rbLzWTx3|aT)eW2Q`5!U5EgL}+utg+_uM4aO-Ap;Z zoLlZaIS6VzdrIj@*#0>NN7^AqF+Z^2k%GA9JKJ2u8ZkpKk)}pRyU!{raYmA|C52b& zM$cKiLN^{2_?PJ0L_q9-txgIdZ=%+iv?HqW28ClOA`6mz`hH007$r?&5@+dmNwd#8 z^@iSJ5wA?M{O&s!1)b)TqRw#DNdDCoe?T8gd;ab2=}&z8^mKTjL3=SDr=G966ic^d z&vo~FsY30aKXrBUiIKWllqp-%V$vG~sN`~TKbEVs1RSr zfnRUit?YzFrAHdEtuuseEp|dx__x}N)ZNm=U))&dkWKV zN=Tl4T9{3T$^S63lR~%i{I5;3{M5$IM@6@DX$`N%Zq5J>VkYP*-=UQwircIf+pxIj z54g$iW5@G8TGe%j9`vNCfn|Edfd+7HL`Lm-MhZQv7YUo7^F#R)IX@Ba7wIQn5<^tr zSJmGw!QlZBfeVFOw?m{3oqV#8tOq*(`vKY?JBScTm}G~p$0q@Yp8KtiYjMdm7QJ>K z52qM`ahK`{y05lh0Q`k<#az3g;fK&@(67RK5hBFmZwFu3zR>4&n!I9cakUQ61;|_K z%j>w6tD5R}R11 z`?&$cdsmV$j)MDaoV5qe9+g@Ko#$~Nby%@p|I@^6>xR=uS74FrMF;Bl)R^F4HwqA% zy4d)`X_%h&(QPkDCie~#>?1&H|4oxY0%&?$f1qRMOVv8-|67*PorP5^R|C&gX1Y()A;t3HrTD^iV5|7v0s=d zl_g0*VY)gGzM^XtYL)rYqS%=$fL%`o-+Non)B9;9;J6B4zae>G)^9wOJgHDwV6($x zz0<3K+(U_o?)LEmS#qdva2bIPP4}UZBBH876`}W}WvyKeizVHAoC{ncc<+Zn4Xj<9 z8{pa{@_c*zZz#+Q`IMDN}d^ z6B8ng0$QJ#{v2Zu#D64#%I{+{CvG9PzlL?JbKl_(LChs5sutEuGwOem4o#`njVVT&iFk*V|MZAXXv0twt zpRthgChr8ycSAETOuo?JK%B5TF#f_K;m@cMS54jx5Jbl zwQ6qZ>cJdazw0uasn#dfwBH&~y~%L6%8UZNb`V|va{9YUcyuQ0@WlO1k1b*@&l_3# zoP`dL+NoEMtC<3c4)<5lI-Mr_&tGE8*&X6faMwQ9N`7!2t+$URbq;3z_GqCZUX%MB zFr@YG7c13a-~BFWKxMyb0>HU>Y|s^=ehpvVeov*uLcp;n9HOKiv=;5o1t={V{x7Fx zV&6?)opCB&s<>jjOFNQMa$F6U+pnZJY}8l0av9@=g+q7M45ZK3Y)|z;g)-8;ob@?^2|@rMQ9(rLdchEn^G^K)=b?E(QO=< zVG$&_{_yQCeDci@U30l*q0u!VpmfSot!@)avEI+NwI&+~XyK2egI#0T6-{MbxV4oT z-)-Ebfcpjj@}`xMaUx7KH8PUFgDcM{LZH^@a0eo)4LOiMk>Md!&Fq|;?@PP+lHbhz z_8<#d&Ct3A+;m@-JQ%(xjhyf=axdyM+Y<9SehQV`hbAASc63(y`wNNWs4;?pqIx#; z*f9Im=`FsIH#ppAmOSV4`#zEOFx|ArL`C%Al<=!9qv_Arq-C0lDfvXGzlAMZ{?V-8 z%m2h$?aFq($yLQD;1LpPsB5r-uR2_&`5Y)ITp~*>ij9i0s9)fJR4}Bel#^YV^ylc` zq8`6~$8g7usvWxrq3S%z=3B$eM0?Ck2s;lfV~%|JQ)B=lJ2SE5906t)=?8 zIh&fUIPt@_rK{H+xj2?2qzp{?54Z9Zu%({2nt1 zckvKoObS&dA&gG2ow1CSs*M%Fp~c&Hj_X z6`U4nHR6IX!WSTeroKw|wg0P16XYg*``$~kJ4rMI#tAoqmm!8EkF2tqT;x3? zty%~AcYcy_xilF~e>V1s=|u5oF_OsJ@n3e-ux0GW3Cy^n5P7bAs=Z3!8k*kS>b4T( zwI-)yueWnr4&vE+3b@_-OrPUipDj!Gpl!K`JUTL+lxYeIeJ0_Y@6(+rRe|h9v+6h7 ze!*l_)gfGl!2tRMYmSB31Rqc5{m#j;iOM&u0F15#h0S(&Tr=ym+(ocZ>q>N8qGM3M z5Qbq!{!UFrrxYejfhwfDVrPP>x(oYxSoVqNuFG1U+w=<>-@}h#gi={9`NrA{gO}ed zWh3KZJNJhIj2hL&tugktqj6?(8A3)Pw?N#FksP+R=PWI-=1$r%u_ziPHLFUe2IpLY zMi9r7myy$kr@GM+gcedgR*bNS`U)s zBJ!}cz2vQTF3LmnU1ueK<%G-_?W<^G?lJbb7RB@c=j1-B0yHBLdM{|nGPY47OU}e` z_2T;wtBT}St`d6%*sk_i|1yg4{ZG{U%6PVp&B8RL)ta}B4tVG!PFd?oW8>rV^K+@c z7*A9RHJwEU7qb<`d5;BpLnPVf5?KC#*|>sA2PX}jsA}m`GB$$&vMw{nn2`BAq&us! z9Bn;42`c9=?lx7zHA06onAN_k?QU}0!hSL<;a9yrNQKMwOsad!j&Nt9FNrNDZ~7#_ zq}}i*6}If&$);W*@&J?>s=NDple+TaOR1B*Bvb+>-iHJUd9+{U#{K)3pi^-z(YonglVYeKpI6G5S65^((M?5z!yl1Bj z_(-N-{A*o`s4;&~V))CwhssHpG6unic`1xFphd(MR0r!gtA{S#s&s|b+N#(9!G{<2I zpNpqUfsn;Go`%MQ7u&9G!f_|bIMAo-O@Sl*%=U$?!#S7F5cUD;uXO4g;ufBk8?9@W z57Vh7EvX$R_r1!w5kh+*wVzkhWzZ57fmaE32NhNM8lzYyGC?^CQu%>BW zlFRb3{|zL}WB8jII!(s)M(Q|WUY3c@Sz>h)>b)iX&OxL}mW#a?|i@*E%c}c>% za~4b#`j4w=&pE1q@K;Ugs2_j-%toMmSTAhgMO+9KO z46jlaweCUj%JQ(3zaz!mVT2D(rs^}g$5TW|3Vltq@NU~j!}d|Zr`X_gH`RGd7b{3X zZhG9#oA={{(q8c3*-K?OBOre{*M16`4|m!dTkKvRngp2LYUyTzEo=`)un$vHo2Ow| z+Dobj6?=b~xjp{o?6zHE8cukk&z$7^?x^rI)p30XPxko8n~~C}v$E0E`qXYyJ32P{ z?O=}Y69ujo(VY|f`ZU}Svo=nX^usm-U}gV(uzy=RtyWV^)eJeu(GSc?5-apRu>Xnb z5*mDPC~dLLHlOy&(PfY3L0D)Lt!0tp=Fat%kXY_mFz?4iSs!C%MI7IYB@SDvCFQYtymoLp&3Q_( zV}nbXA|(Lq1cMJwcNP8B7ZC44Op5?Mu!)0*psE4(d>^^E z=p>YA6o@BqSFkTEI}M8?Z0vdYcwPA;3S*zAdt zjRE!zN$}3^)ZeOpS##YrI3$WT2~PjMzmhJJlwalN3Tf2pS6dlQRka~P7A}k2>Tnf# z6Q3f;xUKQnqASiwIPRkS4^6`G+~Bm`XLfphS+Gmo%rkzrI4%a=n9x<`R>k~^=ALi; zRT6yDkN3{JK`$sdDDk#gf+-^(tL?D?*D?_6!LW&010lJbXJjSrqxS^io!F? zGz~ESX;tiAn;|S%f=(DdxZm!Ep>dbgLr<;)8|RE%Upqp zZX?~%D%j*y6+!qaRF9IB|H7W`;teMvoQA1zNA2q6Ez3@F7#t}JQ@29pp zVYM8=+`qIlvcF*z&aj_I_+^4`sKYcVGW$Q}q~*GwP-3n(dL=_0emnIh{dl-09*}J@ zLQGZ98m=5QH8w%=e8Zcm_dq0?BUcS(Ba0*B<48v2Lk8XM+sJ5unrzD=bLu*gff~aP zL8r~>JqkcnCUXU+tk9^a9~X^rLyVSPV!*<-4EOw*k;6l*ZGTog47alduU!vR+|gl& zYD2cU1?Z%BzAH`G-^RkX2gzT{-F4^UDIs{m*bHp|2r6H77?Ya6S)wJ%yBa8xifGSE z7%qZJ{D2D|;_Xh$e0R|>y@vN)<9_h&BR#wxumAX7q|;)5x$%eQkL29Rr?Ed$6weXc z%Ai}Zg1qdH+B}QLfdKxmBp1wd{ZfdlYqJyi1-ZwDSVxZNbRn@!rp#)s>hakc3FaFj z#Xs~gOv;+28br=!(HD<>gEA%6;ec=LZ*X8NaKL*gR#a3}r_Ux_9nJ_<|D*nCPvB}` z@kDLb;gMoCkRL(%^YCtKhv6RS(COOR*#~2R9Le@jBwM~pPQN0R*z~h4I;;W42O(AkJZLg}*$kasVMg2HZRRVR2 z?Vd3PSQFC!Vz1}5;Ec;W=*{VIv2vT`(0#iz>~_imDOJeA;QfmlFg7u9voCEk8*s-n zQ>ZY|10(3?9k?Rbd+kg6yWFM0kV#!dOLk-CSE<4oM~!f=uB!9dc!?~M3Tm)N!^Fdb z-&#u^kB5EI6Z#2(*`ZlDnJ*jEn2ZttRHCtfAsY3;MrmF)8ov?Dv=FUC8mA1?(m1Ob;93N_))3`p${j`u=cy8ACesLS6XVa(o`G za^$Vn(#PcNDHT(Mmu zw+y-`qzzhI4(Gd?|KKZ)3yBdEV(0_j+zOTcEOo4gr~Ru=y!e2KQmFNT#kCw2Z zzW(Gg?8G3GHVdwzA*0bRcr6JsQ1aMXjc({}Xa}AALDgY3KktfWHxPFD z9QQ#Pi_Q90Xd@=CWhfYHBscz?-y2MH#bQb{*O)^ltRS@M|9bg>0U}FHR5M=XCS-2T zmB_7mtUUK3Qet%<*kemEEex1B+-Nm=vQI%G+LXzxTt7>pU(#0Gg9xzFT5LDzwA${3 zkrHrhtZnSuPtBvmr8&PbD5rBt@|uodxxzivDmOiTQ$%WzdXps7lgVum_k7qju%R;m zbxlq-UJu>Y!ZI*0V8NshI~R~3D5!plOV#*g_<;HI5&hI4{}E618mcf_rl`hIk?mkQ z5evmt^Nj-Wajng!%+BXEsEp|WldHj~Kde!PgnNKVP3ZB!4%+51V*@&oE=ULnKy(rY7${khn_!{)fgBu)ThbF@E1SsMm4Be74SY~-eF zAfIJkz|)S`lJx^Z0fzX#*yj7ay?u~N3f&}~$NHlw-$;Z%RR<@vYrHrF43I!+bc~FT zzwSk!BA+c~DkwORn!fmwX2RbSnp#+71hNPS1F0G-{e|7WjzBxlqw$&ixDbrXUOUQ# zs_lOH`sx0I`8lgmYPCkD5Nh;G(*C3tvQG&a`7Y3)%#dV?b$~dPp_PxqtGJ%&XJCQi zYP;2VS_^oq418tS-6z_a!0WK_zdNOGZHd0($@xVXT#?T`Na$!e<*v}CuAgIqVB)30R5eLeU%Q*oC0PN*Ajjy>lHBfSDA zs9B`h?TSYFjp=(IOmm)df!iXMOY3b;2BjYte36n2t6RzBIeO49K8qD9E4mh zN8ds>;}2kGy~VDq?NAi#8JDyHB z>B=dwF4ICh1o0n}yEuThlCrwC_i4#*XC)%5pQ%DRY9&-)Mht479-1T0FP2ukvRgfH z`q``r9UqiCDQMySDRA*`f7`la>Sr6li@*Is=1P50Ujq+fC%!bN*!qbV$jqQS54*d6 zj0`lE7aTF!QATmxd`F{Y7nLG|PUqhn{CQsqvw=j0jaZ)~#mkbU%=gj)g zE52>sw{v$KOuq`TAS;ot@1mqX`RcubfksRLY`1LJQG0XPNz6B&`EmtIypc#;{8W4mJvaROiy11+J2rgu0Nb}b2$O*~Nt5s(gdnk`pZs94b>86$uBotM;fV`g-_mg3NDzncZf!Wqw|8 zV%>#NoCA0D&e2Q4mN$u7I@U%_nm!d|or^)}r-ze%v^N-c)(*MLU<1etVR$^_>t>E9 z1EdkrDJKF+PvrhQqmiJ0;FF*33RN9PzFXV*sIrm>Ai6WcZ#H%=Pcwr$&NY&N!SJB^bDjqUGw zzqMw~&-w9S&VBa2_C6-2LZ2kJrP_A-=hVJGvA*mnmvk?k*kZtn#$e|#$%b5ZkW0Pt z6h^Ch#>trN876Tzm?_R)`qTfISjM=v0`OP^$!>1bLW7d^4i|c zgFsk>6J=a7x+D1MZ3*$~T)6&YV>@=w;PdJItu&oBxoltMr?%33r5fV^3Q}yU8Jb#5 z3)NA!%fs4Iw$qxXzLG&fG~{40`}s!ZV{IiNzJ0F&TK2|{=@8J(UITuSrN4qv@|r6d&;eyM6F+9 z>~>n*$Iy`9U)^)f8#ZjaWXr3mj8=< zO=Hl(^_Qn5{bGH_Q62ES?wGsD!vK%ov|2M%0{a>X2L9B~cW3mc#b_i3kCWyDZ>5=K zPQ${&;$%rp&jfbMpp1Fl{{0rc@q{!^z;d5xH%48`q)zJkAixl~qQ%xQKWdWJv$zcp zMj_Voz^~931p$u}b|jFvoYmr$oVq8!2>HE+=#BJf08kc*M?@6y9iuEamd9zTu-H;? zTWD!%EJRW#@0??N^3z5B3@HWZ%Sc$SFd%H+VzF7Z!jy{D*EjIE{Cnz;Vw{aCaKV8c zjA6yyK6{$q4qhc1Yc`vCas32G8trA0`WgQ3-@m^(ubjy-*5ZRiZ%>qG!VV71o8WL% z0g%_HYi76de9s2}(Fyol2DwNC>wvx032>xSS+^)2^qTtS-A5iC_G5+eH$QcCSwCpW zZ;nGZv+?zHy%Q*rD=UxoW^*BG=MUe~x4OS8qI8BLcKYfQ=-tiYys!2nJufE7&#ik7 zD3G?JeSM&K_x^kzKV8?vTu|Je*%Vo!DqiBSn#&HRrjeb%q6bi+?+s)g8aZ3KfQLb^ zeMPVAbitg$4k*b|^;<>%tSeoj@-@?yZt8XQL7cn9tQ80*1)rya-ar+c zs+Jn3L4R;`qw_AG70o1XI&o}|{ObczB@{&a{FmV~i=c-WE!!@YJh7Vbr0OvzO4-b! z@ypBLj}O?)DGUD)WjX$nq9l2~-9bRddPv{jfq?eD#t_^WGzCcr_QKi~TDR+MdeD6r z;(9B*D9w`R`gj^Z79^phOoP$gzINgHW`M7UQyT9W)$JK+-C%OI45o(A+V7+7%k9n3 z^Hx8>Fo5p+|KEFeJ@luoZGWi%zASeTIsJn_PAh8z69>EQ44J#>MF6$Wq!`%650M)v zFDAH4IgBB4Zc6sSAw;A1GyR(j!PafG0-n3Q@uetD{`i(EbiJ%`l~{K%Ols&(CB8`! zemyDpkhNx;jhjPSEQUARqsa_NNXUiKYji>YhzRn_NSCvC0+e6xhZ8gO?ewR`1^GB! ze$QE(7Mc34$%cl2)EI@-z(9fRl1eI=3k#`R|M77%cop5eK;rc(k+0cOeI?l1&7wB8Q zSUjA%#M=g2@c16Qg^ZQTU`pIX`(z^6Z5+Vv|M4mUdrF?27Po(eTC;0pCRA>mur zLP4B2Mgzl$Z#&dnw}J`DX7>Y7Zp|O7;_q^SFo(H(9zOt-v@FJ?_nR+FbB*>28{e#Z zjH*gUeS3RJO>;p(K}88v=9ed;>{TbkHwc;bW~}L_@=D0(*iZkBrfb$Wb!>70 zxl|PG3zVo`cK-_H1e(pV{mLkt=nfl7fwvuSlo;60L9Tur;Rd6TSO7vR-vjIUM-xXN zvd`bU_zdOPC<}LFxTBHXSUQzCrURvg%1IWvF}==aGp~vhBE}IyR`g8S?PjmRz2gh; zS|H!2zFs`2i;ivIvU2s0k0FGTLjd8iJ3PK%UnN@kTA%4n2{|sXFfL-q) zXF#=szJ=C$o+;OdV`1HGU0$QXh}ch0h==OnI-lzY@BIZ#AarZ9D@48sed|*$>om%O zz6YFsUfqq=oT%O2QuPl`X(`XbR3TrG7sIN6cp1f$sag}P9=FXVS`Oe;ndR`@!$U{H z3n)ir3Agz~O*9`Une9WtG*=sFlL!dBY|Y`gOWql{KV&z|0PmPpU|^u9ni{V=xG7>{ zMNf$)WZO^HopG?nEEyq%&tTR^So(Xw-JNoDa$s((amm2o$9KL=Ohns2ms%WK+9N?GVXQ?vc}id}_SLq91gUkc+8nA!?TNDl)LL>%bfL0|f2|34^u8k-o0w&Rv9Q@@1~g`1 z#dhB9MY+~<+&9W>GB7Yeori_VvLj?7tC4u2;YFu?@P|0iUdw$#x&tpVx?Ucwx4yS5 z`AJg0>7w|V5Jf6_yf*5|a^Y*c%bB-uD7c3%Nj}Mb;R?&Ppq1UMAIl5b_t4u|0$#vr z{>MhSsjGZl_=H!eQqnBXb)B+(l*9Dg53}&|sYb68nzeHv8dQeE{bb0>Ea*KiMQO9% zsgaxK=JHho*}QH1v|`z2eJ46Q@;U~Mr)D!B#UYH)aWoQh+ei&1pD{T>=Ss=gvBT|r zFJItLJ1oG^_wPIJOcp0&z(xzHgu=BKLH0HEruu&v&6ubH>w^6f(wU`W*HcQGUX6qy z;$~$C892&?e_j|O0bHUYR0|!iDeq=fM8|0WjFdw(_;pfrUZdSc7NdIc01LnKHTup> zCV!=Li*4vnCYf(7Mf#p#;vdg#SAM?F``=w7_jLsoEhV1XD%vfl|8espol2qK`0jPysTi|0CoRZ?2h&x?JZmOhpd+?9EAn$5Gc z-fn(>30O&jg6;aU3Oz>qGv-cG)6{jjNXm|8CLZcao?~F|PX}ZBF$uzK*^D!e@0&Z< zPleA%N5pqr^;<~nZ28z4Z|TlfP5XTtJpVS-^37U9m@9oU!_ z+}}H*I@uTYBi3Gv$&dv8f|qsgGg>q;`@9c8h(+;Fyk?0F+X29d#&h5m+&cc2DOGPG@_g4Mm&)#bh zXo?Cepyx}grOulR_cx~Zj$0poy9&9CPtXElWOa>BN5F$DF&UzTZd|Yk_Zs(Q*Q2iT zmArClhwFKJo}b^zukyzo|L%*@PkpT3%`}oJUOJ1PF6IWv2StVf;CqyUg4+r%1Bh(P z?+ORyBZMHqtdFF=VoKn(oC6Y)tuU>nPs|vVz(9SusVVeqv%8Z%=lt|hNp>zxkM-02 z+-zMieCFv5K+xc38Jq`4L4RkmC=KR{tR%q(hj^D)>x}pf+$}C4ZbFEd@pt^MQj(I; z(H3${A7V^+k2H1L ze14``Fy|}(b|9$z!DY*e7~R#_h|$W6P>D{#hdhoFJqt{=zw>l3W#>EXXS<$LwPq+brNY7bsS1CLBS+6(I8#Ipc2rtxwX48j#Io8%?J63vjyWDMx;Pr#tr z6SyYJ<(*b+Oh(k5>-KqNF+7vv;D@n3ItUa4zl%Qz8{Tzl-fFT^)G&w%$d2~|RwgB(wRR4GU z;az@T@1N}VKJ!_1?VzkzdhOp|aKAqOwJ+fW7`W>>3FS;AKOnJdmg^L|8~1%Hoj`T2 zr``B8`QTwejz7j5u85xYi(n%uW;H`L%OR=A3ubSd{H1`{neWrgevi}@xv2gb@LVli z)k8lq2N#J3c-VkQuTw$O@_+v(QOcn2a(4OfKVP8ca-xC2Q#U_?D)HPPEUrEh%tK&fTEj<|r;G_j5IL1H0 z(i=>Dvht{|grUc7zTDQ05V8*a07ZCa*sc|rI9%IqO&KZ@dO%&&KE_vB!|*z+TllFF z!cPY(SQv%X`aFO&>x#<{+WcuPX|iP+uscvdUd!p^4-@oypkt^mypNB7bP0`LHo9*< z4|~XE5M=NvU}w}mrlq6vzKNjpd_4VyC1o@}Ghk0as4}v@+|OqFJJz_U81M$b1N0Y$ zWpQ$2u}X#;H7Y+*K5V8ef|1Hl&y%&3m0!mzYa6YXaNPQ{q5 zemI}9A$I%dtybKUXC-O^Kw1!{C7Z)yd{Ir+?s+%$dS+BXPc~?K@L|bT-qQdkKrXZa z#Cc&LI8U$<;>Zy_vh8k!rV(p@=~~QnEA|aL+b`fsasFQ-Y_ZQDp4auxT24!-+DH#U{^U+6YjNMUBCPbI^F$5f-v%SUlc`kGPCUN~bx!&=xv! z8HOT2rHwZpqQT;e#?|BZXDOz#nwk>H-?I#dm??li*|`@<3y5@lMYypNAF&eEUkZ2z zbov7x7`l%ORA|*A{uuh)#(#pnDL>mB961(4w%jiy)0IW2>AGNs{LCwRC#v>)+C2~= zW<&Y7_yeTJU#+)F=ljQAYJ)(aw5y4*@A0=9RtCr1z)sPcTf^T94g5;v){^5why8hA zjJQr7-7kuz|E*`F-1{0~pvwerAW3;Of3?S`k(Rn~g9 z6uuTeV(l{LZM8M8+l4m#sSUr_g2eWG-mkgcbpEg`2iZ23EvDcpII_VR!O!T+6Y`** zo!;JS{4_j~mBnj%{M+0qiEYLKbdsd;7WuFTfcWb!$78R`6A14>!S`G>_&(eMK}Lmq zeDnG7=tNFF1bf10KwIyk41>S~#L4TWP-%+De~uu(iL3x37cDI=UO&7L-eC;|aeDY;zjvJ}C9>C1Uj zY_*yUno$Vu?~9OP>v>rx^jEG_>T;%7DIko!&CP58Vqb~cAiD$iK`DDolx9$Tr`7nB zwT(?Fa8LAd{;=N-!QOK$;<~=;eIS4IxdHbBsBxF33cKy@GrzYvSt_ZMuquAo__ak}7Uu;?0l%6}y?)0yK*n@LIg5c@;SE}$0$yMXcJnPE(` zqoMa~!oE2GsSFNt@k0R6{-x}i=O?T;l z^(kBGJm=*7FF{U|bD?)!%w$fb)usM1rY0s+LsQP35G1eZ!5|QyxqYy!I_5syir3>G zyB@pl=S)J3s&V!zUg+ZqpcsYm2aOrj?M|3Naz;X1hr8Qkm#9J#fwer63;0XKzflLX zBy(=A(Q@iTlcI7`*cilhx##oX>TPr0C$KB0zfcD%w1_ zi|;MZjC`Zf8;(kv?y^y~;vR-Uo9MnoZUzp&d-hoQY>gfD;y$ z2bLIA@;T7whr?n#x?$I)qpq&5p(4AxyH|#~EN0}u{S9q|O20l6=>yZJg4*|mJCryN z{rivV(rWrIL~%L6SMTn5p^9_ggdKbCQ?=~-{i8O%efwr7<4uZ^M)*RU-K*dRc&dq& z8sP7o;mq#WCR_;p1{kpfy=>43I6|+<$5vl_NK)=7qc&#b-F2b=l*;EKp84GgqDcxi zt1lVT%6it$_EckP+HJQ+zqh$;H2a!87$Nmo(fHyIX7MrA(#ZOcmL~)@@G2?qayI!S zwKVR^%q<`{;=mjPDi%tN6yM>XLuqI+a_6I%y8#xMe>JUGv~gs^3^%m6k@iM`3x1m@ zc>o_$j?Uu%PxqB3av8PHP(W#zgWs#e{_yVCQBTkoe$`i}&z<+j=jevsa2POWpn;}F zuO|mTyD28VQyX!IQKy+rR(9bes&n%x01XopQ;fRbzTY+IW)~V+pBc7}np{q15Hn!y zD`UZr>0-1k>w7d_11q;v+$poG}YiA-(I)T&4YxTXZG++S#)k@ zVYd3ITrf!B1`_~IdZASQ5?!8aH#N&Hz2!DB3kOEpBppgk>1R!G` z^aOo7y9C;Bk%u~bX3ql!&?|g`u7mcC@n1@idgODvy(xQy%KLn5oK~JJzj?vsL)z(W zx_|zF+Fs~BX6_rnC{R43BS@1SjB7_f{yp23Rt^%Zr)uVO7ee3RtoCX0(kTphWoSoS zdB5#hkmI#^tkL<|tji-`n%F7p1<*dR^wG#OPabW+@%%2F@Zq zF&^o5Nkb282>15(5)Jvz8A3r(hwMlC%NKu0z%QuQVtV$b;!of7LlutB}!YM0$cz{JhxHu@C$-^zBE;=xv-_ZIafxHG3kT zp{Av$r>*rD^bchQHw<`E3|0|26>O%s+QYMJMK!0Pq?E|p#*ilCgOI@!1_S~V6Vrqd zc^m>8k1P7@cFHdJ#qQ?wb%Ni1e}j;Cj(0?mJ_zuA{8m~nFQ5GMd=-##m;qr|kicOu z!|dT~`!lew1v!(sFt4bnv8a_Smat$kKVO$5yt;#R*wv97R5KP<5BGQ5^NI72@L1EpfbhZRONTMy22YIrflc=$cR;89MBsf~8p1dA z`4m>l93V)iT}IAC&&t&sa*I8wclU>c%XBi`0dO-b)hlF2;#w2R4<%i}pArJ`B+q7w z%!)V(e3LfRgzjSYBSkkIK8{-m|9DMiux2eHP?p8K68W|}txVVGwA0YS@om?uoB=!J zACg)1M%VM3T?TnIHP!8VkzlG+);O7Ft<(h#8YC!Hkbi8S>kpeR-fN4NT3HpFO(vEX zX1E4WvalR~@l#U10s`=kNgR9wGGya52$+G*?s+GQsDg18g3>#%>(u*zKw);f6%+O& z!T#;YOGql~dW1C6lS&uu!@twtH!FHSIqcShvogNX6y#7hYoW-6 zW@l&X3@j$Ipp%l&Xq~UO@Sc_xGISrzhY@<4Uu3tL9A@`OIHb*eX@lBmfx^a8;H$SY zoeJi`rP_)d1rugtG-AutQ2Jl+&Vce1)y(B3I?0#X4{CGE>oQ$Nn+JY=IG$L98Af9NE+}CC>=qb}rY8%= zq3-k^clTi@ZyUUtr-fni_9|<8h7UX1Lk4t&t5749XC*0fy;&9vO@Vmxh>_N#Kuxi2 z>owG7W(vGLk>YN5sJE3!4qV6ppLS13249R6Uq3Md%xD~pA4#+tUweJ{*-Y+!ocdjK zD<=l5g!vv1D?h=D7?4@d*^}r16Y)85$mhpQKDWG8DS7^8Yte=JBx|?5BZ5atCe2>- z7?zQea1A&{1yVoh@9drZN>@j#U+>StF1EB40{_Mdyc{D6+Ljd)A(KppHfrr{k{4N8 zSp|HJ<=TUZuP4)x>L!+NwE0oFTwN-Yfz~-6Oxu1>_9`Oyjn5qgQiVc%**4c_xkf|U zvCN)oIQc4bws$hO=SypTpAHRu0W0G3w0)#N_K_^-miYuR{Vq)svY>nC)f;>$vG=o7 zJX`X+ZgYKA6S3^eJT&F%713H;r8CkHN~uxm9eNSwAQUZCI$=W-PO9zK!KX|`?WvhZ z7IqP0ex(XrplYK8-&Z!H(zgJMNb^vJdC)8$tm|>x4>WoiiTToK<-4aC#MB94?x@1P z#JOoNBIk+(wa?+9fN_Lov-tBDj;nF2lci|)6vcFFg%p}c?QPyxcfb?pA=Fov;nX>R z2t*|nPfbaYI6HILN9EnMav4ty#bdsIT-LHXY#QDF(2NEe(hk|>R*OTAOOZsFWHawn zZ?WhRPM+{){Z!;od=s7hYEi$0&e&+RTvIE1H?ib-;QQ_TR2eY3S`shh_q>}uX|T%` z5d5kozt!z|0hGhp-XPldlfmg*+lxeX(GutkT}TLg5P{cJnkoxYuZcu2m8eV3RKw!H zbKysfB4Rvz5riw3sbaxomatKSr_g?fFS>s-+w{ud_^Q{@Ck4@B$AXk=?BAO_#?by` zsO^Xq2YF8S13IMs6)=OIOkE5FB)`_zc3kijY4Ymo)vhS;M>ku%0&(iIRy~O}zdEt* zu8M8cLdk)vGg9$b6oXy90n%+L${%RvK5P#+6SYdKf=ZL0u6J|&ttU9)4*ChC!8kS6 zUj4zac~q#_vkn)1@?;nRJcPbayGu>%B>36#qc_qzPJbtv51>fd{&~36gl3NJuC?R- z&HZKf<5ez;Lr1f>^HroRE8MFnULxM`crxSO-h@{(HQzH4H+GasZh_uAei$|jN(B$w zVu?|wUeqQ|XnvS6GPh(0RP1-#ykRTmhbNpQ^~SG#$7J^K&-PFI?K9qRtiVgz{0&Q_ zHLg?b*wr{aRrq8EZ;SF@IkLmI$(yq$Q~{)em!ar)UbkWMj^kRf2Gr*BlO9n)44>M@ z#zqZWR@l_f$7_#%HhTm@J}xpB!*bg9`nw*r9dw<2$D&s0!t06Cr(DM7xu@dsTD5$K z_+De)e;syGQW2RIs=?wz;sVsmI5umY#kU`?;8S6wyFk%EX^t=MRP6nQnf4(3;_c+Z zj6W8XQaU+FjFcMR+G1lJl5^319B+4f^D=dyHeGBKrcGa#jn{rj3<0kznWVx8fSBO> z+$W=sx+1(6ym`CAi|19=9C$f!X^TW=5x&Li$7f~Xp>G(!1_`%ciAad4U@oK5lO!-n zrNrzBswLM z=ju`ttmE?knD~LreV{(cBOK+`{lZ z!vn?#0hd8R6)0sPeMm2=IVc4kil``Q-*jxh%Msn1rERwr?W$kgIBa=*3Z1VH>kk2w z3+>n42brQzcB^H{vaj~r-9CQWJzFB5V@UdEt-&a{>|K2CpLITX0daToSz9MLTw|Hr z*THL*hju#(1MH_2oD1bN+CGf>thTyZ0{t$T2U)8rVIOYQeSV%(u*w1@3y zJRKkO%?%jw4`+!gz_`Lp4&_eJQ`A8HP8zMnHng6dimGcr>rid!2UYO4nOJi%!Lk4*gLm%;Y)@uTb3dO_Wob~zi#b&pnUeTu;$ zd?TCH&Cbn@8&Di-p6{qd#jINZ&9?6m>OFcLhRlX;;V{ z>TsVw*I&`7$|LFKqSI6|G*lLKG2p`U{J(SNtrk$Z23fCzQoeCuzvNyztTRSM^IPXA z_S!Vc^ZqG)x7qz%kD0L3gqV>qw;9F)Gbx9J6y&j)35TJo)W=**)kwKK6y3x_W!$6J z(2&C9G21E}_14;Q+l~pxd)#V`N@WX+y3XXs$U?<|HtsA?E6?-1+96I6@NFP=8Z)>1 zwEpxZ`W23PCii0e71RN@)LzrN7da4yB>YvYrO|eyrHCud-0F3s=NFct%Sr(ThKhQiR{5EhLYuta(X*D;9h53yZdDF7pP0&B`F;nES&?cJZ*h2PH%_^T>16=I@`{|hJ z2?Kk+qK0cVJzsJH4FbHEyOQ4OL!ia8`)TjvF8}suDyrcMnb31zm)D}ud$qCIZksSl zG-1JD5%vnEW0@{7piQXv$G>2yB>VD)UzOFH3v0{Yglf1w@66)}`OV#YfTXU*FV>tb zX?6XwkGspFC^gTQydDKIPP3y)ji1=NmAW76CCBT_rGC$i1pqA43TIsl z{_@IJwZbAjd=5X)!{A8kGb4S-1>fu<(8Gc$!df5P3Q+@hwJyLp4l^95;p%XHP~Vqk zvsORkT*c-&8zbBCv)IbQhMJxp(cs0rV_vysR-)%0BuJNr5vx#Es;E{8D>|iI(XG#q^cxxExi~FDqH!LVgX4t$ev--NWd4teQ`nB<97#OW%_qD# zkRZc(67`1c0=F-7W>s-<3XLvvbS?(PzQI5kNVVwx?!3eNnq=36D!Frdr&jm4{$UD6 z;A|xq^t2f#5X+c~PQh54btTWrN%ctcnCB_x26TcHbJzwX48-_3F@H<^N+{^?28=2B z3m-tXf1QXJ>d4)xhgqC(CW96Fmx%t$4hsx%eLR;J{eWD7IR+-Cug?vcVgEa>EL*94 zD$-fIOe%===w-gX9w>FW*+U@lYYr!1t3yGy!QgrH2AUg84i5)wL}Q$Za_-Q|A-@*_ zWAoMSfM+T%^2?4ms+BpH(~6GUwb&rr_^&OGJG&VWm7B?IH%hE=dq0)++jFOxModi1 zBumMx9&4(XjdmrrRdM9242<{OYyf?W{I)=6SyeH=?ntoT2zo@x5f%+LdY~90|C>;I zyui2F+%6p))tmCK*J<*ffdM6{hao-nyGpbF)*2ED?)(fCi7|!sGr&~j7ykG$-9=y` z%hYRbz+d!yW?!$Ei)_Fj9;&lF94N~-4{LE#d~|=&PHm}@|9m-7QPT;@$U6w?gK?T& zirzYpVpe@{UVDGRdd2)6=WEUg**I?ibP+_Fn z&{oO)aXFlvWk`>Ul$?YCXC0-dU@Wr>jOoKG=~T=aeV-X$Jy;*a4A5nOP4lKI{%U{682^a zF|rl{kL_sjNA-p$%+IaSZsf{9)pWi+{uKWX^>W-LC1qxee4%DgZ>L5_Iln?EJ1t}6 z`Y>&Q!p#gusyKMV6AfLD3;I|a=L^VPDnG}BQKPbgXQk&BW!i5iI? z>qbC!=H}+mjCRvB`Ll6ZKd2R`V+jN~o{zF_Z*NSze*ddymdVx+4#8hHnCO_B?DQ#b ztT7f}h9-CrHKN|gV zRFVp)d=9Ed8bO_B$NLUz@V*#{vv=(~f#A?cjg8GE7y}`ZJ#xBO$4oA#KZB69IDkrg zfnToaB_*aa8emx>HQQu~=Tp_ykAFC!Ma+!i`&xhhW`ciPQjTvAn*7CEOHk_R_qG({ z8VBrN6G`H+8)BGjja)|QV&YH_q?!-VpVfLmd0JR+8yrRcMdK1)Hg>eVXWgMW+yB4Q;AMw<9dCa$HJq}OtT+me1d*p&F}TB2eJE& zWdNn^nx_bP(_i=*sHf$2*n%p2eLW!=r)vHm% z`&k$lqW~-oNU^5lL6x*vEO~N9M(AYPOUH5fBpjEjZ>x%55zEz{`9l>xs8|iR=zyUK zd$|1BBcxm;h(o)x+GcMsLc5hE{I;n*Ss-IJ_XJ--OCMk;N8)nhJ(AvZg?$x$E{0+E z>-IQ~`btFUxyUT1I0ljLNO5iDV#`-TyZQe@<@butIHt;GU1#?yqD)2%--(1Gxym{G@lOf zaZ4;AVd{``bmFi|u>pxQjtTP1T%vdp4?xerS&ON+TWg`Cl1?P}*N z>&0$34g~t@!!fBt*=ejYjU_2rwRzuhT+s6Q=8B(d@``OaDC*}CiA*3yjgsG1(p$Ha z>TVh)rBSI?d!ez$T765?5v5NcVMr8dyDHdnAN`e}nf>6bcwVd+CEXJbL6&>g%2L`QQlH!BR&^JVl zV1j_tmx30)n1GxaiV^{*+`z_$9%`rTE&+U?PEm|$F10nlWcgshyJemd{lzGko`K^U+ z%I-w-oMdCe(*!-EVD9%;p#8WEVXy+ZeY0Jg;2SbsMXTLLGvfT|^?E!S6L1sm{bn8@ zE%?KnTr9%gnm1aEo@VR%(1&j>nsB?S?tIVwhW8-Sa0Neu>X@q?WK^%KvNR5HTV$a|cZ%eJ ze&Ye=ByX^o_?s@B+Usrz{o0+c&V0AuJQ@)}!@Pj>B`@lmNJi`o(BM6dreSMeamCWF zp6=Y;*2WDPVfJ{jCcPA^&PEbM`F?!4U@!W4Ec*IAxxB3IA8r!|Nbzl1<;97jx;7oI zn?a;0L|9yNAi_R2Ry^19Mv959EYP4mq0e$@7(EDD&(-&Mf!G@*X^mz(`WvfUE)U|7 zg!BX0c0OXI!q0@Rw;N)^oCB3!TYR_uh$PDLmp#g>mcX$DDPoEvF0=gVO0`d29>~Lp z-aEQuWyLwCdywjW;YP^zZ_1C%Ra;Hq!C{?XFRGH<<@|j=aG~ebjmy~&BmL->@5352 zv(_$Sb5Im_)12I>!Z+Snd5s*Bd=G|L)NRy)%!&Re8@?4&e~ zF`trk2=#k1)qOMgYd(u9?9!M@rEV~aA9zN~E?YVrS+7Yiiry$CP;Qy?Vt1^46ZG1+0i4n@~>50za`49}Wwdz2w$w!1=nsS(5xv6faPfF;~5|~06 z7*LhPALmPrp2&Wx&N&T7pXB;Hd^_8c%1NEPhpVZv&^Xi8Q&ZK2k~jDjQ;f?It-EePqCTHWb-SA( zJ#LGx1`k$DL9y;QrfK7B&ei0DQ_<^?92UFAUgSj$S1;o|bYtTQ5cgI%PYcV2aFn}2yBBSMH&B(wMrrN!g4 z_5L>}VcT`TEDenmEpFI}n9-->c64j=V`iD0$Q%y^F>m+t;>b;G+)K>>yUiG`F-aUp zhX*-gQkSHX6!ik0$7j|*`W$a6CK{LB^3X{IaQDQmM7+E@4vQJgkJQbX*2BFXy+_}E z81RE1AnZCAy|OyT3S>O`ZT|jLK3XcZ+s={JE%+AgZn9XjA z2FRggtY_cQ{EAI}J3J+lxkikS>)!sIsjaNELNABsJF&~faMW^=J}Xx)Es@O?cXwn6 z>Tn5p>L0g{W?7O50D0FL!%^Xeg5Enie0bqOBjCpN2ecqvY1n3@&U!c&E?4f4^?y5% z{XSaZ@_GM~GN@sw8K`Y7Ox8NqnWiPD$af4)VyWqJ!Y5jbj7H?6@pzZ}>V}RNO({37 zH8Q`zP*YO_CiZKEi+TphA2g~Q;Sz>rtKE1w>WMVQLKc>&=tEtrUxmoF&mJB#Z?$IY z?pRVsVfzy+I+W}B1%)C}axTe-1bk0JM^l$o-WPs=zGwXKZ!LL6K8MeuewCvBJ?l6l z;$QfMOpY^p5AZpocoPJ0d@FIi38frEK_U(Z;3_r9#P9bau;IY-QrehD&LnG<%%&D> zaD6aeNbKw5@jgiG5BDQ^Z%T4DiwK^8__LXO`Gx{cPXsggU;hezKI7qSae3ZR9ZKvB zj~v(H8F-(7r&gwZ-oD-91c?Y~1s-Ht*CllSL$+%T5O71YMyHU?X0x~{l0v8aP1-I3 z8=^)bn={(;?B{z+b}i!RNaEYSYwU4iS0eX|)odDFp6~i~3AkGoaRj`+&DYjecu~al z?rrQae-!%v4D!V8j7q6;2j{$%bo*|uf$-F=ZokN+?h+iein zSa+Trg(;EwcFW~HkUV2H!STLWpj7lSM1^lL9Ey&J0LGHvOcui9j*mF6YpK0o#1NH{ zxLsH0=XnmiwxhoL2GW;{r*-$DYvs8CL`=o?vTw`?DfCIDKO9nM7N9r?witTjW3iTOhMsIX86bS7 z94_mlvAp{OZ?p~-It5i3#g)l-hK)lBuCaMo7DgDC{S;SZ6(K=T-=FXY$}#MI3TP2r zK)TQ-I0T#f8rMAYx=)(IRRU_q=l_TA(k#x z#>RmX(I@_J_F5ixpwh}wj=@73jn5`g9j)rm&*>CaeCRblJoI)+U(2pWle;pRU&UrXZg#?!-ncvhYhm*|Y`7#G z+>>F(EWY%5O!+tC2OTC$98eg7p!E{OTPv5{a5mEqhcahCB-$l8K@&${?6zg)zZAC6 zn{a(Ig$3PKXHAEQGY$`PxUio66(7`WT1L9hkzjp14J~G|y`g zIWaa19{{6Vvia2lRy41GxVq@cIBR+yQKVJEXcJzU?(yFiDT!jSsH?HQ z6#R#8K;LGAV+O;w7-M132MB+r+?Lnu0zc}Ro-F$&meYqV8GY;_Sm~d7n>@^jw`?!F z($B0KlFiG_Hlv-LJ}&B`p#qj%dNSmA+LGxUbK%vWftHV}>e}!q_?x1HX3g-f<=zy+ zGUCM8^|$-cGeH{PWUxdj;Izl4XAM3xc-v^}zq#%MYYi~l!k`7EdkFNuUm7?3OTT2?l<7kgY;=eH<15VFV)Z`7UV zJGyn0|7E?-7u<_mSOO}0;o;yE21%=8z7 zdKG`Z|3$WKPMvz1`YJG*^`D$4*pw(M1pmHlRCm$4El|wc`3h$I81c6Mk06gLR8d#) z`sJ+Fs7EYLd`0W&qR{CvfmBZi0LzG@u|ysC$zpEK61h2xlSJvgc9^3Wk9M z#-Q(-&DOAs%}2kP)pe9vtyk@JQ&syub=dk>cY|?%(9_f3;Gh1f*#rPzIm4jm4?U zsR*y7o49ycYSk|~Cbha465muqU-*)%&=_ha`x59gGIK&EwXfPJ5n?I55GC>SY@6d< z&+h)aF`6i=iRHg+`BNNY^|XH2rBLt{&4nS+>Gx{8+`F4e}ib zMZ|tMK}^x$@-9a(l>>RCm=z(0FJcRTg&DW?&|aA2+1P_xmAmM=HjjKR(v{l-$l*t3O>5*AJS}=`;>k^j z0g~@Yt1naZ^l^gM?!bzp5E}0@p{mf=BkjsoQ7xY(aK6ye2YEBZHnPuXyo zhpxawpJPA1z=1i2;0vQhXF9Jr+EmvZdw*wa@q$Y88@<)jai^P51dHr~AKekG@{siz zS|On5jeg?7%z%zF1K%MTWC78g4`COoafA8;A?I?C)7r=$OlHgBm4HmfdWD~$J2Y*- zsZ|;e%&ubA|Kt4;C|9EUi7m@R9y@b?6Q|+G1ORK`VoGwUC#~ z{n2`qZZ1tGT72ZHA7Vokv=9XxYxCV>2Cn3UHa17}O{>nkO*`>L^=gGdQ=6;!6lnqy zu@luOd|0_aP0^9*?QBMDy@_ zaUKQL@ABT7y?$jPHaWy}adDvz zmtvhND$LI&m6=nhO7^%p81u!x55m9T&bjI;t0X|5jKYJP1N(e~XQYDbMxoU)(oW2{ zS683m^VmB`{^WoZ#&ZAa@Hd6sDED>!JU#a3d&6n5J|fc8yREJ*gZ%Mb*AADs?X!$h>G7+)u^^I-EONTe%oh!`Q)j z@bw@zXQ;JCTHi`PpHD&?%y6^RyOh~F)9DHj&B-YeG2)EIp*~AeO}qOUr=2LNl6YAO zxE&Atw!G|weT8-Da3fe&(gHgPbDrQs@o@#bAtrW?N!hr5YqdL<_a*rxBAg`U2pV(y z0voG4414?JW(wpNt?xZP%@uHXjT6^y?~9+h=gcpE%p-i8PdR@Jq{>jb@OTMy+yiI# z(a|y@VxySye>^@#pmW&1?PoNYZ6xy9ie*yFB4nj%<9<;8P0;$~f|B*)tOFVm zfAHR4d^C253GK#y;Lx^@1L1B%?loq;C_j74Onb9B-z^K znz|r0f;s$c?+RYD7ilhZTP-;l2T*W=q^PTRA7N(ER-~-`S3{S=wHCCuM;dyA4m`$s z;{;@U!4+5{pvk+l@mhM>WpUD=iXUgRx92^!5{AL~#?|Z_swU03S zGZDzY$dw|c{*>$FhuQUD(bbgeFqxDaizA}FUC5?>boi+XGJozZ>m;3sw&o$!Zn7Jf zaG=GLPjej?^os+dTe=Q7hG%#)v8BrhLICk*9+$rFQ$#rk1X4H?UKWO4(7E!K&Jn6E z;Wl9|i-}3W0{CeX?s?DofQ~;oEe-X4{{C;FsTPmk_~J~w;`=_T3~|+bl*y_WxW0&| z{wfH$bWTY@!#$e+f;bekL-5cawwIfu$zCa;j2CA=?%gecsAJq6BC&6z4yVi@!~qFJ zLNzgdlc3((i?^#0Y+qB!8P2=^vPM_A$x!GA5m{oQ`|R_jo$qwH!rwR~N>Ig}cE9Fd zKp)?nslM)J+q0$VOdVVo_b11dE^d^h)oC+W{E9f(g2S(G;L-N#CLEKSyFqJN0klR{ z8~1O@=x}v)%9X8)Iq0;om;im4iZL$eqUbwceR-|0;p}rK0ml@Fn%cG&0C6gc9h{$+ z1kr3_IwLCLEQE9vGj5`daCw18tCrN$EA#77*D(hnI#9E0^NVjEO-Kix+fx=HdJHwMgJ2`Jo$D>dd0WRUFz#N(x|X+Su7i!9$J?)Ir`M7pMM6 zaF%*rpIi3J|Bxkb6Z!iC4!}@{lL?85+#(DHxl&zpWjt&p9lUx1jeq1psL_q;W`kSg zXcg|Vizt75s)z?PLCVQg0ffA?2>zOiAH|r_09!Fu>ygWT@igN{H4&{GrPf`7sHIRm zqu8sXb9|=?ovOvvb|$Ux-y2I?p9O(Cr{6+a9pP{|2(1y=nd4SldN6GOcv;ouE3rqz zi?tA2E%z|rbI&T^$joQGczU;5ziTtJX#8$)kc>sOY#st~fcxKDYAHSUiN{kA{d4R0 z!uug+6!NdMEjGq!RZC0D1ZRWAL{HpkzJ}lSoKABv1V9cdIKD=#E#1kJj{6c~vLh_?k+|nV&Vhh95C7n3D>+xOx~AqPfHY*4Km?LUu-;-~r?&1_ zESC>_u_~$W>FuR8jqMYGz1pq(*`o0Mui<+umw`{n>Nv5H&q|fuYyQNEL)|A2phPsl z+qPrpyJ}&?syj?f=imNvnf|GGT%-{!D3!O!SxCVSbxg_YQgxXngeGTR!`mKmJ|A!0 z{L&GeJ698yG-_|6y8>7XhHcLsHldFdZAX55fsw;j!IsVE1`b>)^c>Q^>X!rrmb`!o zYA-obY2nr?s(i_7iF67Kz;7&*l6;Q@7KO?ZiBDq(-9+Kl7om?sBVErJBZa>NlQ(S4l9EQ7K4i%!4VQvdX$%T&uT?m^RlU$Pn&2@DY692+=Q0NqCb@P1jiRw2J@ zGG~_pfb1UI*4^FS zTxN^!ZQeV@a2fVJT|$V*I5h7sqO}i>vZl2 zKRi5JRnjcSc)Kt^-PHLA#=oHjH8%pM!?fcz6dJ*DI7zCVazzzv_JC(M9_3Hk#kxIQ zH>5hz=>;?0$;iq!;M1b=BAcAsCw(bT;5SY!ncC5e``;}@EvaCVx4)7y*ryJy*wtT= zCYL7TxwvFBmF^R;nvDs@R0pt@42?6zDA8=iy*#KS#05oB4>F3V<54UcnQryRpxrQW z$tkhe)C4Jlr)ZR_Vo*|-S^O2lU~tQQ(U@8@iPA1ea5pxX*;GY32+ND7 zLO}$_Ck_0u6nduv)L$)&?xysuMbJ&^r(P<(Ls8I03R)f6=}GM*c%BcC)ut5akimBP zzlOAgcL_EFV?3x6E%sfhAD}p&KI72BEKckd*_|;a1K}mCPo6roNJa~BV8N<*+eEv| zFiDE{UAiEOAm&Hsmt2))nLze7mw-?Yr$9g3v%;7$L^e)FnXzx@o1FH#XI6a~<$iNH zFS8|<@1^cw2P9Nm5(1awJdg_21wi3sTZSWNNStDvF3w$`t+{X)igu7BnrTM zuM(f~^KWK92<4FSXk4m%fa9?+S>hT?evnk=bJHH;)Nfk~9_71|NMRV_mY#-wa zXoHdZx3^0a-rLBTOD&4@=lv0t7KMFywjOUWME0~X3;dMwzM~jRGhsvD%R?FEPF1Rt z!#IF3VpVl9zTWdTg~zPt3Rp!leS_b?N?+sLIvfi?;sF+gl`UXn+_f|B&EmX2$MX9R z=8PN;Do)>ZoxLDSxsj*SV|<4Td&=vjWNQn;X0Pt9K>4Nf8!;vu+X#y5xmPSd}JofiYQbtfNv@_h*!f;XTnhARvBH~RcWv>yUU;z z%<#%;IxRudi(TtbpwGEvDdq3^xzyUKm8nbv|8=@hXgixf;URtw$tyHpJ@< zsX7yt1w#!SZr0DmQ5Ci4NRCI~ZXp@EB#cXHpU*^kL^8wY#t!#yVeUu#0)m9qw`OK$ zI|FgK*ylnhGD8t9lml_~Eo<4cxi?3%MLSo$SGKXf1hfoNk04V(inF~}=>jI-FpQJO zWl2|7UA{d=hv9fP?dx6Ch}H41S9G^F^tkup2Wp#Sr1k=Slb_7ucD$^TCxxgB zj}f<=fvj;;PAWQgMXal#)IqN!r}avhjVP~4EE=-ClFQygqx^t z^k~7;PY5b04&24M!$|fgYnllK={7p*%QgTqtP?a_FXhQIqX>qbOKTA!bPyoiNdpL7 zfR;0xJur!2-XcoU@JO<+X1C)D9YlZlWu+H-3V-MPceHtWJhBT{*Kb7r9$Q!;`ST>5 zF7odf;2&Y~h@Z?cWh=*#Q9U22^wfVYK!`h2A3?)C>-uM&giG`PQx!dRj}!kO-j;Fw z`qLgxup|T11aT*>2F>+%&HsK_3oG=d#qYeGfH}@KG?x9p=V^!Wwj_AB;gMAF`(r4Q zDMQ}kpZu&leIPP*JiL|#e<&QlLlG%)`(HF#cr=mGUT0-a%2jJE?LP|xB%!s@p|^Nv z!+(Bb|4<#PZSV)jyHvolEAam!neiRGX^g#eR?f5fsO(72|CSLMhMB#?s=~AVeNx}H zz?6afProNFQ4Ov#rwLO2QqP*&H;y;{zdS;$ literal 0 HcmV?d00001 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ + diff --git a/types/global.d.ts b/types/global.d.ts new file mode 100644 index 0000000..6b2fc01 --- /dev/null +++ b/types/global.d.ts @@ -0,0 +1,32 @@ +export interface Config { + tel1?: string; + icpNo?: string; + tel2?: string; + copyright?: string; + qrcode?: string; + domain?: string; + siteName?: string; + siteLogo?: string; + siteLogoStyles?: string; + subpageBanner?: string; + bottomBg?: string; + elMenuMaxNumber?: number; + showSearchTools?: string; + showSearchIcon?: string; + showLoginButton?: string; + showAdminIcon?: string; + loginBgImg?: string; + yyyy_bg?: string; + wxQrcode?: string; + wxQrcodeText?: string; + copyrightForDemoData?: string; + MustLogin?: boolean; +} + +export interface BreadcrumbItem { + parentName?: string; + parentPath?: string; + categoryName?: string; + categoryPath?: string; + title?: string; +} diff --git a/utils/common.ts b/utils/common.ts new file mode 100644 index 0000000..0df87ec --- /dev/null +++ b/utils/common.ts @@ -0,0 +1,217 @@ +import { v4 as uuidv4 } from 'uuid'; +import type {Company} from "~/api/system/company/model"; +const route = useRoute(); + +/**需要进行持久化的数据:把需要持久化的数据放在下面这个对象中,才会持久化,不需要持久化的数据就不用放到这里了。 */ +const enduring: { [key: string]: () => Ref } = { + useToken, useConfigInfo +} + +//下面的俩函数在app.vue的onMounted中统一调用,或者在其它情况挂载后单独调用。 +/**把所有指定数据保存到本地存储 + * @param key 要保存的数据名。不填的话就是保存全部(一般不填,统一在页面关闭时保存。如果是特别重要的数据,就时不时单独保存一下即可。) + */ +export const setLocal = (key?: string) => { + if (key) { + console.log('只保存', key); + const useKey = 'use' + key.slice(0, 1).toUpperCase() + key.slice(1).toLowerCase(); //首字母大写,其它全部转小写 + const func = enduring[useKey]; + if (!func) { + console.log('没有找到', useKey, '对应的函数'); + return; + } + localStorage.setItem(key, JSON.stringify(func().value)); + } else { + console.log('正在保存全部数据'); + for (const key in enduring) { + if (Object.prototype.hasOwnProperty.call(enduring, key)) { + const element = enduring[key]; + const setKey = key.toLowerCase().substring(3); //去掉前面的use ,其它全部转小写 + try { + localStorage.setItem(setKey, JSON.stringify(element().value)); + } catch (error) { + console.log(`在设置${setKey}的数据时出现错误`, error); + } + } + } + } +}; +/**从本地存储获取数据到state中 */ +export const getLoacl = () => { + for (const key in enduring) { + if (Object.prototype.hasOwnProperty.call(enduring, key)) { + const element = enduring[key]; + const setKey = key.toLowerCase().substring(3); //去掉前面的use ,其它全部转小写 + try { + const localData = localStorage.getItem(setKey) || ''; + if (localData) { + element().value = JSON.parse(localData); + console.log(setKey, '的本地存储数据获取成功', element().value); + } + } catch (error) { + console.log(`在获取${setKey}的数据时出现错误`, error); + } + } + } +}; + +/** + * 判断是否为整数 + * @param num + */ +export const isInteger = (num: any) => { + return /^-?\d+$/.test(num); +} + +/** + * 提取传参中的ID + * param 12334.html + * return 1234 + * @param num + */ +export const getIdByParam = () => { + const split = String(route.params.id).split('.') + return split[0]; +} + +/** + * 提取传参中的ID + * param 12334.html + * return 1234 + * @param num + */ +export const getIdBySpm = (index: number) => { + console.log('split',route.query) + const split = String(route.query.spm).split('.') + return split[index]; +} + +/** + * 获取当前网址的Path部分 + */ +export const getPath = () => { + return route.path; +} + +/** + * 跳转页面函数 + * 携带用于统计用户行为的参数 + * @param path /product/detail.html + * @param id 128 + * @param d 项目数据 + * @param isOpen 是否新窗口打开 + * @param isToken 是否登录控制台 + * 拼接规则: {域名}{path}?spm=c.{用户ID}.{租户ID}.{栏目ID}.{商品ID}.{timestamp}&token={token} + * @return https:///websoft.top/product/detail/128.html?spm=c.5.3057.10005.undefined&token=DDkr1PpE9DouIVMjLEMt9733QsgG7oNV + */ +export function openSpmUrl(p: string, d?: any, id = 0, isOpen?: boolean, isToken?: boolean): void { + const config = useWebsite(); + const itemId = ref(0); + const path = ref(''); + const spm = ref(''); + const model = ref('c'); + const tid = d?.tenantId || localStorage.getItem('TID_ADMIN'); + const mid = config.value.loginUser?.merchantId || 0; + const pid = d?.parentId || 0; + const cid = d?.categoryId || 0; + const uid = localStorage.getItem('UserId') || 0; + const timestamp = ref(Date.now() / 1000); + let token = ''; + + // TODO 登录控制台 + if(isToken){ + token = `&token=${localStorage.getItem('token')}`; + } + // TODO 判断模型 + if(d?.articleId){ + model.value = 'a'; + } + if(d?.goodsId){ + model.value = 'g'; + } + if(d?.productId){ + model.value = 'p'; + } + if(d?.appId){ + model.value = 'app'; + } + if(d?.plugId){ + model.value = 'plug'; + } + if(d?.itemId > 0){ + path.value = d.path; + itemId.value = d.itemId; + }else { + path.value = p; + itemId.value = id; + } + if(d?.model === 'links'){ + window.open(d.path,'_blank'); + return; + } + // TODO 封装spm + spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${itemId.value}.${uid}.${timestamp.value}${token}`; + + // TODO 账号密码 + if(d?.account || d?.password){ + spm.value += `&account=${d.account}&password=${d.password}`; + } + + // TODO 新窗口打开 + if(isOpen){ + window.open(`${path.value}${spm.value}`,'_blank'); + return; + }else { + window.open(`${path.value}${spm.value}`, '_top'); + return; + } +} + +// 单点登录控制台 +export function loginAdminByToken(): void { + const user = useUser(); + const uid = user.value?.userId; + const tid = user.value?.tenantId; + openSpmUrl(`https://console.websoft.top/token-login`,undefined, uid, true,true) +} + + +// 单点登录开发者中心 +export function loginDeveloperCenterByToken(item: Company): void { + const user = useUser(); + const tenantId = Number(user.value?.tenantId); + const token = localStorage.getItem('token'); + if(!token){ + window.open(`https://${item.domain}`, '_blank') + return; + } + openSpmUrl(`https://${item.domain}/token-login`,undefined, tenantId, true,true) +} + +// 单点登录应用控制台 +export function loginByToken(item: Company): void { + const user = useUser(); + const tenantId = Number(user.value?.tenantId); + const token = localStorage.getItem('token'); + window.open(`https://${item.domain}`, '_blank') +} + +export function getSpmUrl(path: string, d?: any, id = 0): string { + const config = useWebsite(); + const spm = ref(''); + const model = ref('c'); + const tid = config.value.tenantId || 0; + const mid = config.value.loginUser?.merchantId || 0; + const pid = d?.parentId || 0; + const cid = d?.categoryId || 0; + const uid = config.value.loginUser?.userId || 0; + const timestamp = ref(Date.now() / 1000); + let token = uuidv4(); + // TODO 封装spm + spm.value = `?spm=${model.value}.${tid}.${mid}.${pid}.${cid}.${id}.${uid}.${timestamp.value}&token=${token}`; + return `${path}${spm.value}` +} + +export function openUrl(url: string) { + window.open(url, '_blank') +} diff --git a/utils/domain.ts b/utils/domain.ts new file mode 100644 index 0000000..b3b7054 --- /dev/null +++ b/utils/domain.ts @@ -0,0 +1,104 @@ +// 解析域名结构 +export function getHost(): any { + const host = window.location.host; + return host.split('.'); +} + +// 是否https +export function isHttps() { + const protocol = window.location.protocol; + if (protocol == 'https:') { + return true; + } + return false; +} + +/** + * 获取原始域名 + * @return http://www.domain.com + */ +export function getOriginDomain(): string { + return window.origin; +} + +/** + * 域名的第一部分 + * 获取tenantId + * @return 10140 + */ +export function getDomainPart1(): any { + const split = getHost(); + if (split[0] == '127') { + return undefined; + } + if (typeof (split[0])) { + return split[0]; + } + return undefined; +} + +/** + * 通过解析泛域名获取租户ID + * https://10140.wsdns.cn + * @return 10140 + */ +export function getTenantId() { + return getDomainPart1(); +} + +/** + * 获取根域名 + * hostname + */ +export function getHostname(): string { + return window.location.hostname; +} + +/** + * 获取域名 + * @return https://www.domain.com + */ +export function getDomain(): string { + return window.location.protocol + '//www.' + getRootDomain(); +} + +/** + * 获取根域名 + * abc.com + */ +export function getRootDomain(): string { + const split = getHost(); + return split[split.length - 2] + '.' + split[split.length - 1]; +} + +/** + * 获取二级域名 + * @return abc.com + */ +export function getSubDomainPath(): string { + const split = getHost(); + if (split.length == 2) { + return ''; + } + return split[split.length - 3]; +} + +/** + * 获取产品标识 + * @return 10048 + */ +export function getProductCode(): string | null { + const subDomain = getSubDomainPath(); + if (subDomain == undefined) { + return null; + } + const split = subDomain.split('-'); + return split[0]; +} + +/** + * 控制台域名 + */ +export function navSubDomain(path: string): string { + return `${window.location.protocol}//${path}.${getRootDomain()}`; +} diff --git a/utils/loadScript.ts b/utils/loadScript.ts new file mode 100644 index 0000000..d06bb39 --- /dev/null +++ b/utils/loadScript.ts @@ -0,0 +1,68 @@ +const callbacks: any = {}; + +/** + * 加载一个远程脚本 + * @param {String} src 一个远程脚本 + * @param {Function} callback 回调 + */ +function loadScript(src: string, callback: { (): void; (): void }) { + const existingScript = document.getElementById(src); + const cb = callback || (() => {}); + if (!existingScript) { + callbacks[src] = []; + const $script: HTMLScriptElement = document.createElement('script'); + $script.src = src; + $script.id = src; + $script.async = Boolean(1); + document.body.appendChild($script); + const onEnd = 'onload' in $script ? stdOnEnd.bind($script) : ieOnEnd.bind($script); + // @ts-ignore + onEnd($script); + } + + callbacks[src].push(cb); + + function stdOnEnd(script: { onload?: () => void; onerror: () => void }) { + script.onload = () => { + // @ts-ignore + this.onerror = this.onload = null; + callbacks[src].forEach( + (item: (arg0: null, arg1: { onload?: (() => void) | undefined; onerror: () => void }) => void) => { + item(null, script); + } + ); + delete callbacks[src]; + }; + script.onerror = () => { + // @ts-ignore + this.onerror = this.onload = null; + // @ts-ignore + cb(new Error(`Failed to load ${src}`), script); + }; + } + + function ieOnEnd(script: { onreadystatechange: () => void }) { + script.onreadystatechange = () => { + // @ts-ignore + if (this.readyState !== 'complete' && this.readyState !== 'loaded') return; + // @ts-ignore + this.onreadystatechange = null; + callbacks[src].forEach((item: (arg0: null, arg1: { onreadystatechange: () => void }) => void) => { + item(null, script); + }); + delete callbacks[src]; + }; + } +} + +/** + * 顺序加载一组远程脚本 + * @param {Array} list 一组远程脚本 + * @param {Function} cb 回调 + */ +export function loadScriptQueue(list: any[], cb: { (): void; (): void }) { + const first = list.shift(); + list.length ? loadScript(first, () => loadScriptQueue(list, cb)) : loadScript(first, cb); +} + +export default loadScript; diff --git a/utils/request.ts b/utils/request.ts new file mode 100644 index 0000000..59bca99 --- /dev/null +++ b/utils/request.ts @@ -0,0 +1,88 @@ +/** + * axios 实例 + */ +import axios from 'axios'; +import type { AxiosResponse } from 'axios'; +import {API_BASE_URL, TOKEN_HEADER_NAME, LAYOUT_PATH, TOKEN_STORE_NAME} from '@/config'; +import type { ApiResult } from '@/api'; +import { getHostname, getTenantId } from '@/utils/domain'; + +const service = axios.create({ + baseURL: API_BASE_URL +}); + +/** + * 添加请求拦截器 + */ +service.interceptors.request.use( + (config) => { + const TENANT_ID = localStorage.getItem('TenantId') || 5; + const token = localStorage.getItem(TOKEN_STORE_NAME); + // 添加 token 到 header + if (token && config.headers) { + config.headers.common[TOKEN_HEADER_NAME] = token; + } + // 获取租户ID + if (config.headers) { + // 附加企业ID + const companyId = localStorage.getItem('CompanyId'); + if (companyId) { + config.headers.common['CompanyId'] = companyId; + } + // 通过网站域名获取租户ID + if (getHostname()) { + config.headers.common['Domain'] = getHostname(); + } + // 解析二级域名获取租户ID + if (getTenantId()) { + config.headers.common['TenantId'] = getTenantId(); + return config; + } + if (TENANT_ID) { + config.headers.common['TenantId'] = TENANT_ID; + return config; + } + } + return config; + }, + (error) => { + return Promise.reject(error); + } +); + +/** + * 添加响应拦截器 + */ +service.interceptors.response.use( + (res: AxiosResponse>) => { + // 登录过期处理 + if (res.data?.code === 401) { + // const currentPath = unref(router.currentRoute).path; + // if (currentPath == LAYOUT_PATH) { + // logout(true); + // } else { + // Modal.destroyAll(); + // Modal.info({ + // title: '系统提示', + // content: '登录状态已过期, 请退出重新登录!', + // okText: '重新登录', + // onOk: () => { + // logout(false, currentPath); + // } + // }); + // } + // return Promise.reject(new Error(res.data.message)); + } + // token 自动续期 + const token = res.headers[TOKEN_HEADER_NAME.toLowerCase()]; + if (token) { + localStorage.setItem(TOKEN_STORE_NAME, token); + } + return res; + }, + (error) => { + return Promise.reject(error); + } +); + +export default service; diff --git a/utils/tool.ts b/utils/tool.ts new file mode 100644 index 0000000..4e789f0 --- /dev/null +++ b/utils/tool.ts @@ -0,0 +1,25 @@ +export function escapeHtml(str: string) { + let temp = ''; + if (str.length === 0) return ''; + temp = str.replace(/&/g, '&'); + temp = temp.replace(/</g, '<'); + temp = temp.replace(/>/g, '>'); + temp = temp.replace(/ /g, ' '); + temp = temp.replace(/'/g, "'"); + temp = temp.replace(/"/g, '"'); + return temp; +} + +export function isArray(str: unknown) { + return Object.prototype.toString.call(str) === '[object Array]'; +} + +// 配置服务器接口 +export function getBaseUrl() { + console.log('process:',process.server) + if (process.server) { + return "https://modules.gxwebsoft.com/api" + } else { + return "https://modules.gxwebsoft.com/api" + } +} diff --git a/utils/use-form-data.ts b/utils/use-form-data.ts new file mode 100644 index 0000000..a3e6511 --- /dev/null +++ b/utils/use-form-data.ts @@ -0,0 +1,29 @@ +import { reactive } from 'vue'; + +/** + * 表单数据 hook + * @param initValue 默认值 + */ +export default function (initValue?: T) { + const form = reactive({ ...initValue } as T); + + const resetFields = () => { + Object.keys(form).forEach((key) => { + form[key] = initValue ? initValue[key] : void 0; + }); + }; + + const assignFields = (data: object) => { + Object.keys(form).forEach((key) => { + form[key] = data[key]; + }); + }; + + return { + form, + // 重置为初始值 + resetFields, + // 赋值不改变字段 + assignFields + }; +}