From 87e5261a2a5bccf863855518dad68f6f4ec3adff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Wed, 1 Jul 2026 15:56:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor(store):=20=E9=87=8D=E6=9E=84=E9=97=A8?= =?UTF-8?q?=E5=BA=97=E4=B8=AD=E5=BF=83=E9=A1=B5=E9=9D=A2=E5=8F=8A=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E8=B4=A7=E5=88=B0=E4=BB=98=E6=AC=BE=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修订订单状态字段,支持配送完成及送达凭证照片 - 取消注释门店中心菜单项,调整显示位置 - 重写门店中心页面,修复API分页参数及响应格式 - 新增“确认送达”操作,上传送达照片更新订单状态 - 已完成订单展示送达凭证照片 - 采用 useDidShow 生命周期刷新页面数据 - 使用 loadingRef 防止列表并发加载 - 门店中心访问权限判断由 user.isAdmin 改为通过接口检测 storeInfo - 货到付款模式下简化门店中心页面Tab,仅保留待处理和已完成 - 待处理订单支持确认收款和确认完成两种操作,必需上传送达照片 - 已完成订单只作展示,无操作按钮 - 状态文案调整为适配货到付款流程 - Tab 颜色主题改为绿色 --- .workbuddy/memory/2026-07-01.md | 25 +- src/pages/store/center/index.tsx | 348 ++++++---- src/pages/user/user.tsx | 7 +- src_bak/api/cms/cmsAd/index.ts | 115 ---- src_bak/api/cms/cmsAd/model/index.ts | 60 -- src_bak/api/cms/cmsAdRecord/index.ts | 106 --- src_bak/api/cms/cmsAdRecord/model/index.ts | 35 - src_bak/api/cms/cmsArticle/index.ts | 218 ------ src_bak/api/cms/cmsArticle/model/index.ts | 132 ---- src_bak/api/cms/cmsArticleCategory/index.ts | 108 --- .../api/cms/cmsArticleCategory/model/index.ts | 59 -- src_bak/api/cms/cmsArticleComment/index.ts | 106 --- .../api/cms/cmsArticleComment/model/index.ts | 47 -- src_bak/api/cms/cmsArticleContent/index.ts | 106 --- .../api/cms/cmsArticleContent/model/index.ts | 25 - src_bak/api/cms/cmsArticleCount/index.ts | 106 --- .../api/cms/cmsArticleCount/model/index.ts | 25 - src_bak/api/cms/cmsArticleLike/index.ts | 106 --- src_bak/api/cms/cmsArticleLike/model/index.ts | 25 - src_bak/api/cms/cmsComponents/index.ts | 106 --- src_bak/api/cms/cmsComponents/model/index.ts | 43 -- src_bak/api/cms/cmsDesign/index.ts | 102 --- src_bak/api/cms/cmsDesign/model/index.ts | 60 -- src_bak/api/cms/cmsDesignRecord/index.ts | 106 --- .../api/cms/cmsDesignRecord/model/index.ts | 51 -- src_bak/api/cms/cmsDocs/index.ts | 106 --- src_bak/api/cms/cmsDocs/model/index.ts | 45 -- src_bak/api/cms/cmsDocsBook/index.ts | 106 --- src_bak/api/cms/cmsDocsBook/model/index.ts | 37 -- src_bak/api/cms/cmsDocsContent/index.ts | 106 --- src_bak/api/cms/cmsDocsContent/model/index.ts | 25 - src_bak/api/cms/cmsDomain/index.ts | 151 ----- src_bak/api/cms/cmsDomain/model/index.ts | 44 -- src_bak/api/cms/cmsForm/index.ts | 106 --- src_bak/api/cms/cmsForm/model/index.ts | 53 -- src_bak/api/cms/cmsFormRecord/index.ts | 106 --- src_bak/api/cms/cmsFormRecord/model/index.ts | 41 -- src_bak/api/cms/cmsLang/index.ts | 105 --- src_bak/api/cms/cmsLang/model/index.ts | 39 -- src_bak/api/cms/cmsLangLog/index.ts | 105 --- src_bak/api/cms/cmsLangLog/model/index.ts | 27 - src_bak/api/cms/cmsLink/index.ts | 106 --- src_bak/api/cms/cmsLink/model/index.ts | 43 -- src_bak/api/cms/cmsModel/index.ts | 106 --- src_bak/api/cms/cmsModel/model/index.ts | 57 -- src_bak/api/cms/cmsMp/index.ts | 106 --- src_bak/api/cms/cmsMp/model/index.ts | 61 -- src_bak/api/cms/cmsMpAd/index.ts | 106 --- src_bak/api/cms/cmsMpAd/model/index.ts | 47 -- src_bak/api/cms/cmsMpField/index.ts | 106 --- src_bak/api/cms/cmsMpField/model/index.ts | 35 - src_bak/api/cms/cmsMpMenu/index.ts | 106 --- src_bak/api/cms/cmsMpMenu/model/index.ts | 79 --- src_bak/api/cms/cmsMpPages/index.ts | 106 --- src_bak/api/cms/cmsMpPages/model/index.ts | 47 -- src_bak/api/cms/cmsNavigation/index.ts | 138 ---- src_bak/api/cms/cmsNavigation/model/index.ts | 117 ---- src_bak/api/cms/cmsOrder/index.ts | 106 --- src_bak/api/cms/cmsOrder/model/index.ts | 69 -- src_bak/api/cms/cmsSpec/index.ts | 106 --- src_bak/api/cms/cmsSpec/model/index.ts | 35 - src_bak/api/cms/cmsSpecValue/index.ts | 106 --- src_bak/api/cms/cmsSpecValue/model/index.ts | 29 - src_bak/api/cms/cmsWebsite/index.ts | 147 ---- src_bak/api/cms/cmsWebsite/model/index.ts | 138 ---- src_bak/api/cms/cmsWebsiteField/index.ts | 129 ---- .../api/cms/cmsWebsiteField/model/index.ts | 63 -- src_bak/api/cms/link/index.ts | 113 ---- src_bak/api/cms/link/model/index.ts | 31 - src_bak/api/cms/mpOfficialMenu/index.ts | 106 --- src_bak/api/cms/mpOfficialMenu/model/index.ts | 37 -- src_bak/api/index.ts | 61 -- src_bak/api/json/china-provinces.geo.json | 1 - src_bak/api/json/industry-data.json | 1 - src_bak/api/json/regions-data.json | 1 - src_bak/api/layout/index.ts | 116 ---- src_bak/api/layout/model/index.ts | 29 - src_bak/api/passport/login/index.ts | 68 -- src_bak/api/passport/login/model/index.ts | 52 -- src_bak/api/passport/qr-login/index.ts | 244 ------- src_bak/api/shop/shopActivity/index.ts | 110 --- src_bak/api/shop/shopActivity/model/index.ts | 89 --- src_bak/api/shop/shopAfterSale/index.ts | 154 ----- src_bak/api/shop/shopArticle/index.ts | 101 --- src_bak/api/shop/shopArticle/model/index.ts | 123 ---- src_bak/api/shop/shopBooking/index.ts | 121 ---- src_bak/api/shop/shopBooking/model/index.ts | 53 -- src_bak/api/shop/shopCart/index.ts | 153 ----- src_bak/api/shop/shopCart/model/index.ts | 74 --- .../api/shop/shopChatConversation/index.ts | 101 --- .../shop/shopChatConversation/model/index.ts | 37 -- src_bak/api/shop/shopChatMessage/index.ts | 115 ---- .../api/shop/shopChatMessage/model/index.ts | 63 -- src_bak/api/shop/shopCommissionRecord.ts | 29 - src_bak/api/shop/shopCommissionRole/index.ts | 101 --- .../shop/shopCommissionRole/model/index.ts | 35 - src_bak/api/shop/shopCoupon/index.ts | 115 ---- src_bak/api/shop/shopCoupon/model/index.ts | 97 --- src_bak/api/shop/shopCustomerService/index.ts | 17 - src_bak/api/shop/shopCustomerService/model.ts | 26 - src_bak/api/shop/shopDealerApply/index.ts | 155 ----- .../api/shop/shopDealerApply/model/index.ts | 43 -- src_bak/api/shop/shopDealerCapital/index.ts | 101 --- src_bak/api/shop/shopDealerCapital/model.ts | 109 --- .../api/shop/shopDealerCapital/model/index.ts | 41 -- src_bak/api/shop/shopDealerOrder/index.ts | 101 --- .../api/shop/shopDealerOrder/model/index.ts | 60 -- src_bak/api/shop/shopDealerReferee/index.ts | 101 --- .../api/shop/shopDealerReferee/model/index.ts | 31 - src_bak/api/shop/shopDealerSetting/index.ts | 101 --- .../api/shop/shopDealerSetting/model/index.ts | 25 - src_bak/api/shop/shopDealerUser/index.ts | 103 --- .../api/shop/shopDealerUser/model/index.ts | 53 -- src_bak/api/shop/shopDealerWithdraw/index.ts | 145 ---- .../shop/shopDealerWithdraw/model/index.ts | 48 -- src_bak/api/shop/shopEvaluation/index.ts | 119 ---- .../api/shop/shopEvaluation/model/index.ts | 77 --- src_bak/api/shop/shopEvent/index.ts | 80 --- src_bak/api/shop/shopEvent/model/index.ts | 96 --- src_bak/api/shop/shopExpress/index.ts | 101 --- src_bak/api/shop/shopExpress/model/index.ts | 35 - src_bak/api/shop/shopExpressTemplate/index.ts | 101 --- .../shop/shopExpressTemplate/model/index.ts | 41 -- .../shop/shopExpressTemplateDetail/index.ts | 101 --- .../shopExpressTemplateDetail/model/index.ts | 45 -- src_bak/api/shop/shopGift/index.ts | 260 -------- src_bak/api/shop/shopGift/model/index.ts | 127 ---- src_bak/api/shop/shopGiftCard/index.ts | 21 - src_bak/api/shop/shopGiftCard/model.ts | 29 - src_bak/api/shop/shopGoods/index.ts | 112 ---- src_bak/api/shop/shopGoods/model/index.ts | 158 ----- src_bak/api/shop/shopGoodsCategory/index.ts | 101 --- .../api/shop/shopGoodsCategory/model/index.ts | 64 -- src_bak/api/shop/shopGoodsComment/index.ts | 69 -- src_bak/api/shop/shopGoodsComment/model.ts | 77 --- src_bak/api/shop/shopGoodsEvaluate/index.ts | 22 - src_bak/api/shop/shopGoodsEvaluate/model.ts | 39 -- src_bak/api/shop/shopGoodsFavorite/index.ts | 44 -- src_bak/api/shop/shopGoodsFavorite/model.ts | 15 - .../api/shop/shopGoodsRoleCommission/index.ts | 101 --- .../shopGoodsRoleCommission/model/index.ts | 35 - src_bak/api/shop/shopGoodsSku/index.ts | 113 ---- src_bak/api/shop/shopGoodsSku/model/index.ts | 50 -- src_bak/api/shop/shopGoodsSpec/index.ts | 101 --- src_bak/api/shop/shopGoodsSpec/model/index.ts | 29 - src_bak/api/shop/shopGroupBuy/index.ts | 36 - src_bak/api/shop/shopGroupBuy/model.ts | 61 -- src_bak/api/shop/shopInvite/index.ts | 278 -------- src_bak/api/shop/shopInvite/model/index.ts | 279 -------- src_bak/api/shop/shopInvoiceTitle/index.ts | 166 ----- src_bak/api/shop/shopInvoiceTitle/model.ts | 155 ----- src_bak/api/shop/shopLogistics/index.ts | 258 ------- src_bak/api/shop/shopMemberBenefit.ts | 29 - src_bak/api/shop/shopMemberCenter.ts | 113 ---- src_bak/api/shop/shopMemberRegister.ts | 108 --- src_bak/api/shop/shopMerchant/index.ts | 101 --- src_bak/api/shop/shopMerchant/model/index.ts | 95 --- src_bak/api/shop/shopMerchantAccount/index.ts | 101 --- .../shop/shopMerchantAccount/model/index.ts | 39 -- src_bak/api/shop/shopMerchantApply/index.ts | 115 ---- .../api/shop/shopMerchantApply/model/index.ts | 72 -- src_bak/api/shop/shopMerchantCount/index.ts | 103 --- .../api/shop/shopMerchantCount/model/index.ts | 29 - src_bak/api/shop/shopMerchantType/index.ts | 103 --- .../api/shop/shopMerchantType/model/index.ts | 30 - src_bak/api/shop/shopMessage/index.ts | 37 -- src_bak/api/shop/shopMessage/model/index.ts | 20 - src_bak/api/shop/shopNotification/index.ts | 140 ---- .../api/shop/shopNotification/model/index.ts | 25 - src_bak/api/shop/shopOrder/index.ts | 194 ------ src_bak/api/shop/shopOrder/model/index.ts | 231 ------- src_bak/api/shop/shopOrderGoods/index.ts | 30 - .../api/shop/shopOrderGoods/model/index.ts | 70 -- src_bak/api/shop/shopOrderRefund/index.ts | 52 -- src_bak/api/shop/shopPointsOrder/index.ts | 66 -- .../api/shop/shopPointsOrder/model/index.ts | 62 -- src_bak/api/shop/shopPointsProduct/index.ts | 44 -- .../api/shop/shopPointsProduct/model/index.ts | 51 -- src_bak/api/shop/shopRecharge/index.ts | 35 - src_bak/api/shop/shopRecharge/model/index.ts | 17 - src_bak/api/shop/shopRechargeCode/index.ts | 48 -- .../api/shop/shopRechargeCode/model/index.ts | 28 - src_bak/api/shop/shopRechargeOrder.ts | 40 -- src_bak/api/shop/shopSeckill/index.ts | 31 - src_bak/api/shop/shopSeckill/model.ts | 48 -- src_bak/api/shop/shopSetting/index.ts | 138 ---- src_bak/api/shop/shopSetting/model/index.ts | 43 -- src_bak/api/shop/shopSigninConfig/index.ts | 31 - .../api/shop/shopSigninConfig/model/index.ts | 29 - src_bak/api/shop/shopSigninRecord/index.ts | 58 -- .../api/shop/shopSigninRecord/model/index.ts | 33 - src_bak/api/shop/shopSpec/index.ts | 101 --- src_bak/api/shop/shopSpec/model/index.ts | 38 -- src_bak/api/shop/shopSpecValue/index.ts | 101 --- src_bak/api/shop/shopSpecValue/model/index.ts | 29 - src_bak/api/shop/shopStore/index.ts | 130 ---- src_bak/api/shop/shopStore/model/index.ts | 81 --- src_bak/api/shop/shopStoreFence/index.ts | 101 --- .../api/shop/shopStoreFence/model/index.ts | 43 -- src_bak/api/shop/shopStoreRider/index.ts | 101 --- .../api/shop/shopStoreRider/model/index.ts | 71 -- src_bak/api/shop/shopStoreUser/index.ts | 116 ---- src_bak/api/shop/shopStoreUser/model/index.ts | 36 - src_bak/api/shop/shopStoreWarehouse/index.ts | 101 --- .../shop/shopStoreWarehouse/model/index.ts | 53 -- src_bak/api/shop/shopUserAddress.ts | 75 --- src_bak/api/shop/shopUserAddress/index.ts | 132 ---- .../api/shop/shopUserAddress/model/index.ts | 53 -- src_bak/api/shop/shopUserCard/index.ts | 57 -- src_bak/api/shop/shopUserCard/model/index.ts | 17 - src_bak/api/shop/shopUserCoupon/index.ts | 155 ----- .../api/shop/shopUserCoupon/model/index.ts | 84 --- src_bak/api/shop/shopUserReferee/index.ts | 101 --- .../api/shop/shopUserReferee/model/index.ts | 33 - src_bak/api/shop/shopWithdrawRecord.ts | 50 -- src_bak/api/system/access-key/index.ts | 59 -- src_bak/api/system/access-key/model/index.ts | 20 - src_bak/api/system/appstore/index.ts | 11 - src_bak/api/system/appstore/model/index.ts | 13 - src_bak/api/system/cache/index.ts | 76 --- src_bak/api/system/cache/model/index.ts | 18 - src_bak/api/system/chat/index.ts | 157 ----- src_bak/api/system/chat/model/index.ts | 49 -- src_bak/api/system/chatConversation/index.ts | 106 --- .../system/chatConversation/model/index.ts | 37 -- src_bak/api/system/chatMessage/index.ts | 120 ---- src_bak/api/system/chatMessage/model/index.ts | 49 -- src_bak/api/system/company/index.ts | 161 ----- src_bak/api/system/company/model/index.ts | 120 ---- src_bak/api/system/companyComment/index.ts | 106 --- .../api/system/companyComment/model/index.ts | 43 -- src_bak/api/system/companyContent/index.ts | 106 --- .../api/system/companyContent/model/index.ts | 25 - src_bak/api/system/companyGit/index.ts | 106 --- src_bak/api/system/companyGit/model/index.ts | 41 -- src_bak/api/system/companyParameter/index.ts | 106 --- .../system/companyParameter/model/index.ts | 33 - src_bak/api/system/companyUrl/index.ts | 106 --- src_bak/api/system/companyUrl/model/index.ts | 39 -- src_bak/api/system/dict-data/index.ts | 87 --- src_bak/api/system/dict-data/model/index.ts | 46 -- src_bak/api/system/dict/index.ts | 61 -- src_bak/api/system/dict/model/index.ts | 29 - src_bak/api/system/dictionary-data/index.ts | 87 --- .../api/system/dictionary-data/model/index.ts | 33 - src_bak/api/system/dictionary/index.ts | 61 -- src_bak/api/system/dictionary/model/index.ts | 29 - src_bak/api/system/environment/index.ts | 125 ---- src_bak/api/system/environment/model/index.ts | 25 - src_bak/api/system/file/index.ts | 99 --- src_bak/api/system/file/model/index.ts | 54 -- src_bak/api/system/login-record/index.ts | 32 - .../api/system/login-record/model/index.ts | 38 -- src_bak/api/system/menu/index.ts | 98 --- src_bak/api/system/menu/model/index.ts | 67 -- src_bak/api/system/modules/index.ts | 118 ---- src_bak/api/system/modules/model/index.ts | 22 - src_bak/api/system/operation-record/index.ts | 32 - .../system/operation-record/model/index.ts | 56 -- src_bak/api/system/order/index.ts | 105 --- src_bak/api/system/order/model/index.ts | 93 --- src_bak/api/system/orderGoods/index.ts | 115 ---- src_bak/api/system/orderGoods/model/index.ts | 58 -- src_bak/api/system/organization/index.ts | 86 --- .../api/system/organization/model/index.ts | 42 -- src_bak/api/system/parameter/index.ts | 106 --- src_bak/api/system/parameter/model/index.ts | 31 - src_bak/api/system/payment/index.ts | 144 ---- src_bak/api/system/payment/model/index.ts | 55 -- src_bak/api/system/plug/index.ts | 125 ---- src_bak/api/system/plug/model/index.ts | 67 -- src_bak/api/system/role/index.ts | 119 ---- src_bak/api/system/role/model/index.ts | 27 - src_bak/api/system/setting/index.ts | 126 ---- src_bak/api/system/setting/model/index.ts | 127 ---- src_bak/api/system/tenant/index.ts | 178 ----- src_bak/api/system/tenant/model/index.ts | 46 -- src_bak/api/system/url/index.ts | 106 --- src_bak/api/system/url/model/index.ts | 37 -- src_bak/api/system/user-collection/index.ts | 106 --- .../api/system/user-collection/model/index.ts | 25 - src_bak/api/system/user-file/index.ts | 89 --- src_bak/api/system/user-file/model/index.ts | 39 -- src_bak/api/system/user-group/index.ts | 120 ---- src_bak/api/system/user-group/model/index.ts | 23 - src_bak/api/system/user/balance-log/index.ts | 31 - .../system/user/balance-log/model/index.ts | 23 - src_bak/api/system/user/balance.ts | 23 - src_bak/api/system/user/index.ts | 261 -------- src_bak/api/system/user/model/count.ts | 15 - src_bak/api/system/user/model/index.ts | 35 - src_bak/api/system/user/points/index.ts | 44 -- src_bak/api/system/user/points/model/index.ts | 13 - src_bak/api/system/user/withdraw/index.ts | 18 - .../api/system/user/withdraw/model/index.ts | 19 - src_bak/api/system/userRole/index.ts | 47 -- src_bak/api/system/userRole/model/index.ts | 30 - src_bak/api/system/userVerify/index.ts | 130 ---- src_bak/api/system/userVerify/model/index.ts | 58 -- src_bak/api/system/version/index.ts | 119 ---- src_bak/api/system/version/model/index.ts | 26 - src_bak/api/system/white-domain/index.ts | 146 ---- .../api/system/white-domain/model/index.ts | 27 - src_bak/app.config.ts | 168 ----- src_bak/app.scss | 80 --- src_bak/app.tsx | 56 -- src_bak/assets/logo.png | Bin 158093 -> 0 bytes src_bak/assets/tabbar/README.md | 27 - src_bak/assets/tabbar/category-active.png | Bin 3534 -> 0 bytes src_bak/assets/tabbar/category.png | Bin 3512 -> 0 bytes src_bak/assets/tabbar/home-active.png | Bin 2028 -> 0 bytes src_bak/assets/tabbar/home.png | Bin 1976 -> 0 bytes src_bak/assets/tabbar/order-active.png | Bin 2272 -> 0 bytes src_bak/assets/tabbar/order.png | Bin 2205 -> 0 bytes src_bak/assets/tabbar/points-active.png | Bin 4794 -> 0 bytes src_bak/assets/tabbar/points.png | Bin 4650 -> 0 bytes src_bak/assets/tabbar/user-active.png | Bin 2839 -> 0 bytes src_bak/assets/tabbar/user.png | Bin 2696 -> 0 bytes src_bak/components/ErrorBoundary.scss | 87 --- src_bak/components/ErrorBoundary.tsx | 75 --- src_bak/components/NavBar/index.tsx | 35 - src_bak/components/QRLoginScanner.tsx | 135 ---- .../components/business/AddressCard/index.tsx | 121 ---- .../components/business/CouponCard/index.tsx | 113 ---- .../business/CouponSelect/index.tsx | 185 ------ .../components/business/MemberBadge/index.tsx | 27 - .../components/business/PayModal/index.tsx | 123 ---- .../components/business/SkuSelector/index.tsx | 346 ---------- .../components/common/BottomButton/index.scss | 59 -- .../components/common/BottomButton/index.tsx | 42 -- .../components/common/EmptyState/index.tsx | 48 -- .../components/common/FixedButton/index.tsx | 43 -- src_bak/components/common/LazyImage/index.tsx | 57 -- src_bak/components/common/LoadMore/index.tsx | 29 - src_bak/components/common/Loading/index.tsx | 48 -- src_bak/components/common/OrderCard/index.tsx | 137 ---- src_bak/components/common/Price/index.tsx | 67 -- .../components/common/ProductCard/index.tsx | 59 -- .../components/common/VirtualList/index.tsx | 69 -- src_bak/config/app.ts | 1 - src_bak/contexts/AppContext.tsx | 15 - src_bak/contexts/CartContext.tsx | 233 ------- src_bak/contexts/UserContext.tsx | 135 ---- src_bak/hooks/index.ts | 28 - src_bak/hooks/useAddress.ts | 98 --- src_bak/hooks/useAppContext.ts | 12 - src_bak/hooks/useCountDown.ts | 145 ---- src_bak/hooks/useCountUp.ts | 130 ---- src_bak/hooks/useCoupon.ts | 104 --- src_bak/hooks/usePagination.ts | 110 --- src_bak/hooks/usePayment.ts | 77 --- src_bak/hooks/useRequest.ts | 325 --------- src_bak/hooks/useScrollHeight.ts | 24 - src_bak/hooks/useTheme.ts | 42 -- src_bak/hooks/useUser.ts | 81 --- src_bak/index.html | 12 - src_bak/pages/activity/detail/index.config.ts | 3 - src_bak/pages/activity/detail/index.tsx | 245 ------- src_bak/pages/activity/list/index.config.ts | 3 - src_bak/pages/activity/list/index.tsx | 220 ------ .../pages/after-sale/apply/index.config.ts | 3 - src_bak/pages/after-sale/apply/index.tsx | 251 ------- src_bak/pages/after-sale/list/index.config.ts | 3 - src_bak/pages/after-sale/list/index.tsx | 180 ----- .../pages/after-sale/progress/index.config.ts | 3 - src_bak/pages/after-sale/progress/index.tsx | 175 ----- src_bak/pages/apply.config.ts | 3 - src_bak/pages/apply.tsx | 151 ----- src_bak/pages/balance-log.tsx | 169 ----- src_bak/pages/balance.config.ts | 3 - src_bak/pages/balance.tsx | 187 ------ src_bak/pages/booking.config.ts | 3 - src_bak/pages/booking.tsx | 167 ----- src_bak/pages/booking/detail/index.config.ts | 3 - src_bak/pages/booking/detail/index.tsx | 242 ------- src_bak/pages/booking/list/index.config.ts | 3 - src_bak/pages/booking/list/index.tsx | 226 ------- .../pages/booking/reschedule/index.config.ts | 3 - src_bak/pages/booking/reschedule/index.tsx | 229 ------- src_bak/pages/commission.config.ts | 3 - src_bak/pages/commission.tsx | 92 --- src_bak/pages/customer-service.config.ts | 3 - src_bak/pages/customer-service.tsx | 406 ----------- src_bak/pages/dashboard.tsx | 198 ------ src_bak/pages/detail.config.ts | 3 - src_bak/pages/detail.tsx | 147 ---- src_bak/pages/event/detail/index.config.ts | 3 - src_bak/pages/event/detail/index.tsx | 195 ------ src_bak/pages/event/list/index.config.ts | 3 - src_bak/pages/event/list/index.tsx | 146 ---- src_bak/pages/event/my/index.config.ts | 3 - src_bak/pages/event/my/index.tsx | 170 ----- src_bak/pages/event/register/index.config.ts | 3 - src_bak/pages/event/register/index.tsx | 317 --------- src_bak/pages/exchange.config.ts | 4 - src_bak/pages/exchange.tsx | 226 ------- src_bak/pages/favorite-list.tsx | 96 --- .../pages/gift-card/balance/index.config.ts | 3 - src_bak/pages/gift-card/balance/index.tsx | 187 ------ .../pages/gift-card/exchange/index.config.ts | 3 - src_bak/pages/gift-card/exchange/index.tsx | 205 ------ .../pages/gift-card/purchase/index.config.ts | 3 - src_bak/pages/gift-card/purchase/index.tsx | 143 ---- src_bak/pages/group-buy-detail.config.ts | 3 - src_bak/pages/group-buy-detail.tsx | 323 --------- src_bak/pages/group-buy-list.tsx | 119 ---- src_bak/pages/help-center.tsx | 146 ---- src_bak/pages/help-detail.tsx | 50 -- src_bak/pages/history-list.tsx | 113 ---- src_bak/pages/index/article-detail.tsx | 28 - src_bak/pages/index/article-list.config.ts | 3 - src_bak/pages/index/article-list.tsx | 125 ---- src_bak/pages/index/coupon-center.config.ts | 3 - src_bak/pages/index/coupon-center.tsx | 125 ---- .../pages/index/coupon-center/index.config.ts | 3 - src_bak/pages/index/coupon-center/index.tsx | 164 ----- src_bak/pages/index/index.config.ts | 6 - src_bak/pages/index/index.scss | 9 - src_bak/pages/index/index.tsx | 270 -------- src_bak/pages/index/notification.tsx | 87 --- src_bak/pages/index/search.tsx | 115 ---- src_bak/pages/invite-record.config.ts | 3 - src_bak/pages/invite-record.tsx | 89 --- src_bak/pages/invoice/apply/index.tsx | 153 ----- src_bak/pages/invoice/records/index.tsx | 224 ------- src_bak/pages/invoice/title/index.tsx | 297 --------- src_bak/pages/list.config.ts | 3 - src_bak/pages/list.tsx | 131 ---- src_bak/pages/member.config.ts | 3 - src_bak/pages/member.tsx | 137 ---- src_bak/pages/message/detail/index.config.ts | 3 - src_bak/pages/message/detail/index.tsx | 169 ----- src_bak/pages/message/list/index.config.ts | 3 - src_bak/pages/message/list/index.tsx | 262 -------- src_bak/pages/order-list.tsx | 220 ------ src_bak/pages/order/after-sale-apply.tsx | 340 ---------- src_bak/pages/order/after-sale-detail.tsx | 257 ------- src_bak/pages/order/after-sale-list.tsx | 174 ----- src_bak/pages/order/detail.tsx | 519 --------------- src_bak/pages/order/evaluate-detail.config.ts | 3 - src_bak/pages/order/evaluate-detail.tsx | 186 ------ .../order/evaluate-detail/index.config.ts | 3 - src_bak/pages/order/evaluate-detail/index.tsx | 189 ------ src_bak/pages/order/evaluate-list.config.ts | 3 - src_bak/pages/order/evaluate-list.tsx | 238 ------- .../pages/order/evaluate-list/index.config.ts | 3 - src_bak/pages/order/evaluate-list/index.tsx | 238 ------- src_bak/pages/order/evaluate.config.ts | 3 - src_bak/pages/order/evaluate.tsx | 185 ------ src_bak/pages/order/evaluate/index.config.ts | 3 - src_bak/pages/order/evaluate/index.tsx | 185 ------ src_bak/pages/order/list.tsx | 187 ------ src_bak/pages/order/logistics.tsx | 250 ------- src_bak/pages/order/order.config.ts | 6 - src_bak/pages/order/order.scss | 9 - src_bak/pages/order/order.tsx | 65 -- src_bak/pages/order/refund-detail.tsx | 93 --- src_bak/pages/order/refund.tsx | 113 ---- src_bak/pages/points-rules.tsx | 168 ----- src_bak/pages/points/exchange.tsx | 87 --- src_bak/pages/points/exchange/index.config.ts | 4 - src_bak/pages/points/exchange/index.tsx | 226 ------- src_bak/pages/points/index.config.ts | 3 - src_bak/pages/points/index.tsx | 116 ---- src_bak/pages/points/order-list/index.tsx | 222 ------- src_bak/pages/points/points-rules/index.tsx | 168 ----- src_bak/pages/points/product-detail.tsx | 177 ----- .../pages/points/product-list/index.config.ts | 3 - src_bak/pages/points/product-list/index.tsx | 170 ----- src_bak/pages/points/signin.tsx | 149 ----- src_bak/pages/progress.config.ts | 3 - src_bak/pages/progress.tsx | 170 ----- src_bak/pages/promotion.config.ts | 3 - src_bak/pages/promotion.tsx | 110 --- src_bak/pages/purchase.config.ts | 3 - src_bak/pages/purchase.tsx | 145 ---- src_bak/pages/rebate/records/index.tsx | 259 -------- src_bak/pages/rebate/withdraw/index.tsx | 117 ---- src_bak/pages/records.tsx | 224 ------- src_bak/pages/redeem.config.ts | 3 - src_bak/pages/redeem.tsx | 294 -------- src_bak/pages/reschedule.config.ts | 3 - src_bak/pages/reschedule.tsx | 158 ----- src_bak/pages/sales.tsx | 227 ------- src_bak/pages/seckill-detail.config.ts | 3 - src_bak/pages/seckill-detail.tsx | 294 -------- src_bak/pages/seckill-list.config.ts | 3 - src_bak/pages/seckill-list.tsx | 149 ----- src_bak/pages/share/index.tsx | 119 ---- src_bak/pages/shop/cart.tsx | 275 -------- src_bak/pages/shop/category.tsx | 92 --- src_bak/pages/shop/checkout.tsx | 628 ------------------ .../shop/group-buy-detail/index.config.ts | 3 - src_bak/pages/shop/group-buy-detail/index.tsx | 324 --------- src_bak/pages/shop/group-buy-list/index.tsx | 120 ---- src_bak/pages/shop/index.config.ts | 3 - src_bak/pages/shop/index.tsx | 113 ---- src_bak/pages/shop/product-detail.tsx | 441 ------------ .../pages/shop/seckill-detail/index.config.ts | 3 - src_bak/pages/shop/seckill-detail/index.tsx | 296 --------- .../pages/shop/seckill-list/index.config.ts | 3 - src_bak/pages/shop/seckill-list/index.tsx | 150 ----- src_bak/pages/statistics/dashboard/index.tsx | 197 ------ src_bak/pages/statistics/sales/index.tsx | 226 ------- src_bak/pages/statistics/users/index.tsx | 194 ------ src_bak/pages/store/booking/index.config.ts | 3 - src_bak/pages/store/booking/index.scss | 69 -- src_bak/pages/store/booking/index.tsx | 389 ----------- src_bak/pages/store/list/index.config.ts | 3 - src_bak/pages/store/list/index.tsx | 340 ---------- src_bak/pages/store/login/index.config.ts | 5 - src_bak/pages/store/login/index.scss | 137 ---- src_bak/pages/store/login/index.tsx | 128 ---- src_bak/pages/team.config.ts | 3 - src_bak/pages/team.tsx | 127 ---- src_bak/pages/title.tsx | 297 --------- src_bak/pages/user/address-edit.tsx | 561 ---------------- src_bak/pages/user/address-list.tsx | 116 ---- src_bak/pages/user/balance-log/index.tsx | 169 ----- .../user/benefit-exchange-confirm/index.scss | 200 ------ .../user/benefit-exchange-confirm/index.tsx | 178 ----- .../user/benefit-exchange-list/index.scss | 158 ----- .../user/benefit-exchange-list/index.tsx | 170 ----- .../pages/user/benefit-packages/index.scss | 136 ---- src_bak/pages/user/benefit-packages/index.tsx | 97 --- src_bak/pages/user/commission/index.config.ts | 3 - src_bak/pages/user/commission/index.scss | 159 ----- src_bak/pages/user/commission/index.tsx | 151 ----- src_bak/pages/user/coupon-list.tsx | 259 -------- .../user/customer-service/index.config.ts | 3 - src_bak/pages/user/customer-service/index.tsx | 406 ----------- src_bak/pages/user/favorite-list/index.tsx | 97 --- src_bak/pages/user/help-center/index.tsx | 146 ---- src_bak/pages/user/help-detail/index.tsx | 50 -- src_bak/pages/user/history-list/index.tsx | 113 ---- src_bak/pages/user/index.tsx | 233 ------- .../pages/user/invite-record/index.config.ts | 3 - src_bak/pages/user/invite-record/index.tsx | 89 --- .../user/invite-subordinate/index.config.ts | 4 - .../pages/user/invite-subordinate/index.tsx | 340 ---------- .../pages/user/member-upgrade/index.config.ts | 5 - src_bak/pages/user/member-upgrade/index.tsx | 261 -------- src_bak/pages/user/member/index.config.ts | 3 - src_bak/pages/user/member/index.tsx | 271 -------- src_bak/pages/user/points-record.tsx | 260 -------- src_bak/pages/user/profile.tsx | 203 ------ src_bak/pages/user/promotion/index.config.ts | 3 - src_bak/pages/user/promotion/index.tsx | 123 ---- src_bak/pages/user/recharge-record/index.tsx | 196 ------ src_bak/pages/user/recharge.tsx | 213 ------ src_bak/pages/user/redeem/index.config.ts | 3 - src_bak/pages/user/redeem/index.tsx | 294 -------- .../pages/user/register-pay/index.config.ts | 3 - src_bak/pages/user/register-pay/index.tsx | 240 ------- src_bak/pages/user/setting.tsx | 77 --- src_bak/pages/user/shop-setting/index.tsx | 217 ------ src_bak/pages/user/team/index.config.ts | 3 - src_bak/pages/user/team/index.tsx | 127 ---- src_bak/pages/user/user.config.ts | 6 - src_bak/pages/user/user.scss | 9 - src_bak/pages/user/user.tsx | 210 ------ src_bak/pages/user/wallet.tsx | 88 --- src_bak/pages/user/withdraw-list/index.scss | 139 ---- src_bak/pages/user/withdraw-list/index.tsx | 169 ----- src_bak/pages/user/withdraw/index.scss | 250 ------- src_bak/pages/user/withdraw/index.tsx | 261 -------- src_bak/pages/users.tsx | 195 ------ src_bak/pages/withdraw.tsx | 116 ---- src_bak/passport/agreement.config.ts | 4 - src_bak/passport/agreement.scss | 55 -- src_bak/passport/agreement.tsx | 178 ----- src_bak/passport/auth-flow.ts | 112 ---- src_bak/passport/forget.config.ts | 4 - src_bak/passport/forget.tsx | 37 -- src_bak/passport/login.config.ts | 4 - src_bak/passport/login.scss | 377 ----------- src_bak/passport/login.tsx | 331 --------- src_bak/passport/qr-confirm/index.config.ts | 5 - src_bak/passport/qr-confirm/index.tsx | 239 ------- src_bak/passport/qr-login/index.config.ts | 5 - src_bak/passport/qr-login/index.tsx | 191 ------ src_bak/passport/register.config.ts | 5 - src_bak/passport/register.tsx | 295 -------- src_bak/passport/setting.config.ts | 4 - src_bak/passport/setting.tsx | 82 --- src_bak/passport/sms-login.config.ts | 4 - src_bak/passport/sms-login.tsx | 269 -------- src_bak/passport/unified-qr/index.config.ts | 4 - src_bak/passport/unified-qr/index.tsx | 177 ----- src_bak/styles/global.scss | 36 - src_bak/types/address.ts | 8 - src_bak/types/coupon.ts | 17 - src_bak/types/global.d.ts | 57 -- src_bak/types/index.ts | 5 - src_bak/types/member.ts | 27 - src_bak/types/order.ts | 83 --- src_bak/types/product.ts | 36 - src_bak/utils/auth.ts | 36 - src_bak/utils/common.ts | 35 - src_bak/utils/geofence.ts | 131 ---- src_bak/utils/index.ts | 114 ---- src_bak/utils/invite.ts | 66 -- src_bak/utils/login-guard.ts | 95 --- src_bak/utils/request.ts | 284 -------- src_bak/utils/server.ts | 23 - 605 files changed, 261 insertions(+), 58569 deletions(-) delete mode 100644 src_bak/api/cms/cmsAd/index.ts delete mode 100644 src_bak/api/cms/cmsAd/model/index.ts delete mode 100644 src_bak/api/cms/cmsAdRecord/index.ts delete mode 100644 src_bak/api/cms/cmsAdRecord/model/index.ts delete mode 100644 src_bak/api/cms/cmsArticle/index.ts delete mode 100644 src_bak/api/cms/cmsArticle/model/index.ts delete mode 100644 src_bak/api/cms/cmsArticleCategory/index.ts delete mode 100644 src_bak/api/cms/cmsArticleCategory/model/index.ts delete mode 100644 src_bak/api/cms/cmsArticleComment/index.ts delete mode 100644 src_bak/api/cms/cmsArticleComment/model/index.ts delete mode 100644 src_bak/api/cms/cmsArticleContent/index.ts delete mode 100644 src_bak/api/cms/cmsArticleContent/model/index.ts delete mode 100644 src_bak/api/cms/cmsArticleCount/index.ts delete mode 100644 src_bak/api/cms/cmsArticleCount/model/index.ts delete mode 100644 src_bak/api/cms/cmsArticleLike/index.ts delete mode 100644 src_bak/api/cms/cmsArticleLike/model/index.ts delete mode 100644 src_bak/api/cms/cmsComponents/index.ts delete mode 100644 src_bak/api/cms/cmsComponents/model/index.ts delete mode 100644 src_bak/api/cms/cmsDesign/index.ts delete mode 100644 src_bak/api/cms/cmsDesign/model/index.ts delete mode 100644 src_bak/api/cms/cmsDesignRecord/index.ts delete mode 100644 src_bak/api/cms/cmsDesignRecord/model/index.ts delete mode 100644 src_bak/api/cms/cmsDocs/index.ts delete mode 100644 src_bak/api/cms/cmsDocs/model/index.ts delete mode 100644 src_bak/api/cms/cmsDocsBook/index.ts delete mode 100644 src_bak/api/cms/cmsDocsBook/model/index.ts delete mode 100644 src_bak/api/cms/cmsDocsContent/index.ts delete mode 100644 src_bak/api/cms/cmsDocsContent/model/index.ts delete mode 100644 src_bak/api/cms/cmsDomain/index.ts delete mode 100644 src_bak/api/cms/cmsDomain/model/index.ts delete mode 100644 src_bak/api/cms/cmsForm/index.ts delete mode 100644 src_bak/api/cms/cmsForm/model/index.ts delete mode 100644 src_bak/api/cms/cmsFormRecord/index.ts delete mode 100644 src_bak/api/cms/cmsFormRecord/model/index.ts delete mode 100644 src_bak/api/cms/cmsLang/index.ts delete mode 100644 src_bak/api/cms/cmsLang/model/index.ts delete mode 100644 src_bak/api/cms/cmsLangLog/index.ts delete mode 100644 src_bak/api/cms/cmsLangLog/model/index.ts delete mode 100644 src_bak/api/cms/cmsLink/index.ts delete mode 100644 src_bak/api/cms/cmsLink/model/index.ts delete mode 100644 src_bak/api/cms/cmsModel/index.ts delete mode 100644 src_bak/api/cms/cmsModel/model/index.ts delete mode 100644 src_bak/api/cms/cmsMp/index.ts delete mode 100644 src_bak/api/cms/cmsMp/model/index.ts delete mode 100644 src_bak/api/cms/cmsMpAd/index.ts delete mode 100644 src_bak/api/cms/cmsMpAd/model/index.ts delete mode 100644 src_bak/api/cms/cmsMpField/index.ts delete mode 100644 src_bak/api/cms/cmsMpField/model/index.ts delete mode 100644 src_bak/api/cms/cmsMpMenu/index.ts delete mode 100644 src_bak/api/cms/cmsMpMenu/model/index.ts delete mode 100644 src_bak/api/cms/cmsMpPages/index.ts delete mode 100644 src_bak/api/cms/cmsMpPages/model/index.ts delete mode 100644 src_bak/api/cms/cmsNavigation/index.ts delete mode 100644 src_bak/api/cms/cmsNavigation/model/index.ts delete mode 100644 src_bak/api/cms/cmsOrder/index.ts delete mode 100644 src_bak/api/cms/cmsOrder/model/index.ts delete mode 100644 src_bak/api/cms/cmsSpec/index.ts delete mode 100644 src_bak/api/cms/cmsSpec/model/index.ts delete mode 100644 src_bak/api/cms/cmsSpecValue/index.ts delete mode 100644 src_bak/api/cms/cmsSpecValue/model/index.ts delete mode 100644 src_bak/api/cms/cmsWebsite/index.ts delete mode 100644 src_bak/api/cms/cmsWebsite/model/index.ts delete mode 100644 src_bak/api/cms/cmsWebsiteField/index.ts delete mode 100644 src_bak/api/cms/cmsWebsiteField/model/index.ts delete mode 100644 src_bak/api/cms/link/index.ts delete mode 100644 src_bak/api/cms/link/model/index.ts delete mode 100644 src_bak/api/cms/mpOfficialMenu/index.ts delete mode 100644 src_bak/api/cms/mpOfficialMenu/model/index.ts delete mode 100644 src_bak/api/index.ts delete mode 100644 src_bak/api/json/china-provinces.geo.json delete mode 100644 src_bak/api/json/industry-data.json delete mode 100644 src_bak/api/json/regions-data.json delete mode 100644 src_bak/api/layout/index.ts delete mode 100644 src_bak/api/layout/model/index.ts delete mode 100644 src_bak/api/passport/login/index.ts delete mode 100644 src_bak/api/passport/login/model/index.ts delete mode 100644 src_bak/api/passport/qr-login/index.ts delete mode 100644 src_bak/api/shop/shopActivity/index.ts delete mode 100644 src_bak/api/shop/shopActivity/model/index.ts delete mode 100644 src_bak/api/shop/shopAfterSale/index.ts delete mode 100644 src_bak/api/shop/shopArticle/index.ts delete mode 100644 src_bak/api/shop/shopArticle/model/index.ts delete mode 100644 src_bak/api/shop/shopBooking/index.ts delete mode 100644 src_bak/api/shop/shopBooking/model/index.ts delete mode 100644 src_bak/api/shop/shopCart/index.ts delete mode 100644 src_bak/api/shop/shopCart/model/index.ts delete mode 100644 src_bak/api/shop/shopChatConversation/index.ts delete mode 100644 src_bak/api/shop/shopChatConversation/model/index.ts delete mode 100644 src_bak/api/shop/shopChatMessage/index.ts delete mode 100644 src_bak/api/shop/shopChatMessage/model/index.ts delete mode 100644 src_bak/api/shop/shopCommissionRecord.ts delete mode 100644 src_bak/api/shop/shopCommissionRole/index.ts delete mode 100644 src_bak/api/shop/shopCommissionRole/model/index.ts delete mode 100644 src_bak/api/shop/shopCoupon/index.ts delete mode 100644 src_bak/api/shop/shopCoupon/model/index.ts delete mode 100644 src_bak/api/shop/shopCustomerService/index.ts delete mode 100644 src_bak/api/shop/shopCustomerService/model.ts delete mode 100644 src_bak/api/shop/shopDealerApply/index.ts delete mode 100644 src_bak/api/shop/shopDealerApply/model/index.ts delete mode 100644 src_bak/api/shop/shopDealerCapital/index.ts delete mode 100644 src_bak/api/shop/shopDealerCapital/model.ts delete mode 100644 src_bak/api/shop/shopDealerCapital/model/index.ts delete mode 100644 src_bak/api/shop/shopDealerOrder/index.ts delete mode 100644 src_bak/api/shop/shopDealerOrder/model/index.ts delete mode 100644 src_bak/api/shop/shopDealerReferee/index.ts delete mode 100644 src_bak/api/shop/shopDealerReferee/model/index.ts delete mode 100644 src_bak/api/shop/shopDealerSetting/index.ts delete mode 100644 src_bak/api/shop/shopDealerSetting/model/index.ts delete mode 100644 src_bak/api/shop/shopDealerUser/index.ts delete mode 100644 src_bak/api/shop/shopDealerUser/model/index.ts delete mode 100644 src_bak/api/shop/shopDealerWithdraw/index.ts delete mode 100644 src_bak/api/shop/shopDealerWithdraw/model/index.ts delete mode 100644 src_bak/api/shop/shopEvaluation/index.ts delete mode 100644 src_bak/api/shop/shopEvaluation/model/index.ts delete mode 100644 src_bak/api/shop/shopEvent/index.ts delete mode 100644 src_bak/api/shop/shopEvent/model/index.ts delete mode 100644 src_bak/api/shop/shopExpress/index.ts delete mode 100644 src_bak/api/shop/shopExpress/model/index.ts delete mode 100644 src_bak/api/shop/shopExpressTemplate/index.ts delete mode 100644 src_bak/api/shop/shopExpressTemplate/model/index.ts delete mode 100644 src_bak/api/shop/shopExpressTemplateDetail/index.ts delete mode 100644 src_bak/api/shop/shopExpressTemplateDetail/model/index.ts delete mode 100644 src_bak/api/shop/shopGift/index.ts delete mode 100644 src_bak/api/shop/shopGift/model/index.ts delete mode 100644 src_bak/api/shop/shopGiftCard/index.ts delete mode 100644 src_bak/api/shop/shopGiftCard/model.ts delete mode 100644 src_bak/api/shop/shopGoods/index.ts delete mode 100644 src_bak/api/shop/shopGoods/model/index.ts delete mode 100644 src_bak/api/shop/shopGoodsCategory/index.ts delete mode 100644 src_bak/api/shop/shopGoodsCategory/model/index.ts delete mode 100644 src_bak/api/shop/shopGoodsComment/index.ts delete mode 100644 src_bak/api/shop/shopGoodsComment/model.ts delete mode 100644 src_bak/api/shop/shopGoodsEvaluate/index.ts delete mode 100644 src_bak/api/shop/shopGoodsEvaluate/model.ts delete mode 100644 src_bak/api/shop/shopGoodsFavorite/index.ts delete mode 100644 src_bak/api/shop/shopGoodsFavorite/model.ts delete mode 100644 src_bak/api/shop/shopGoodsRoleCommission/index.ts delete mode 100644 src_bak/api/shop/shopGoodsRoleCommission/model/index.ts delete mode 100644 src_bak/api/shop/shopGoodsSku/index.ts delete mode 100644 src_bak/api/shop/shopGoodsSku/model/index.ts delete mode 100644 src_bak/api/shop/shopGoodsSpec/index.ts delete mode 100644 src_bak/api/shop/shopGoodsSpec/model/index.ts delete mode 100644 src_bak/api/shop/shopGroupBuy/index.ts delete mode 100644 src_bak/api/shop/shopGroupBuy/model.ts delete mode 100644 src_bak/api/shop/shopInvite/index.ts delete mode 100644 src_bak/api/shop/shopInvite/model/index.ts delete mode 100644 src_bak/api/shop/shopInvoiceTitle/index.ts delete mode 100644 src_bak/api/shop/shopInvoiceTitle/model.ts delete mode 100644 src_bak/api/shop/shopLogistics/index.ts delete mode 100644 src_bak/api/shop/shopMemberBenefit.ts delete mode 100644 src_bak/api/shop/shopMemberCenter.ts delete mode 100644 src_bak/api/shop/shopMemberRegister.ts delete mode 100644 src_bak/api/shop/shopMerchant/index.ts delete mode 100644 src_bak/api/shop/shopMerchant/model/index.ts delete mode 100644 src_bak/api/shop/shopMerchantAccount/index.ts delete mode 100644 src_bak/api/shop/shopMerchantAccount/model/index.ts delete mode 100644 src_bak/api/shop/shopMerchantApply/index.ts delete mode 100644 src_bak/api/shop/shopMerchantApply/model/index.ts delete mode 100644 src_bak/api/shop/shopMerchantCount/index.ts delete mode 100644 src_bak/api/shop/shopMerchantCount/model/index.ts delete mode 100644 src_bak/api/shop/shopMerchantType/index.ts delete mode 100644 src_bak/api/shop/shopMerchantType/model/index.ts delete mode 100644 src_bak/api/shop/shopMessage/index.ts delete mode 100644 src_bak/api/shop/shopMessage/model/index.ts delete mode 100644 src_bak/api/shop/shopNotification/index.ts delete mode 100644 src_bak/api/shop/shopNotification/model/index.ts delete mode 100644 src_bak/api/shop/shopOrder/index.ts delete mode 100644 src_bak/api/shop/shopOrder/model/index.ts delete mode 100644 src_bak/api/shop/shopOrderGoods/index.ts delete mode 100644 src_bak/api/shop/shopOrderGoods/model/index.ts delete mode 100644 src_bak/api/shop/shopOrderRefund/index.ts delete mode 100644 src_bak/api/shop/shopPointsOrder/index.ts delete mode 100644 src_bak/api/shop/shopPointsOrder/model/index.ts delete mode 100644 src_bak/api/shop/shopPointsProduct/index.ts delete mode 100644 src_bak/api/shop/shopPointsProduct/model/index.ts delete mode 100644 src_bak/api/shop/shopRecharge/index.ts delete mode 100644 src_bak/api/shop/shopRecharge/model/index.ts delete mode 100644 src_bak/api/shop/shopRechargeCode/index.ts delete mode 100644 src_bak/api/shop/shopRechargeCode/model/index.ts delete mode 100644 src_bak/api/shop/shopRechargeOrder.ts delete mode 100644 src_bak/api/shop/shopSeckill/index.ts delete mode 100644 src_bak/api/shop/shopSeckill/model.ts delete mode 100644 src_bak/api/shop/shopSetting/index.ts delete mode 100644 src_bak/api/shop/shopSetting/model/index.ts delete mode 100644 src_bak/api/shop/shopSigninConfig/index.ts delete mode 100644 src_bak/api/shop/shopSigninConfig/model/index.ts delete mode 100644 src_bak/api/shop/shopSigninRecord/index.ts delete mode 100644 src_bak/api/shop/shopSigninRecord/model/index.ts delete mode 100644 src_bak/api/shop/shopSpec/index.ts delete mode 100644 src_bak/api/shop/shopSpec/model/index.ts delete mode 100644 src_bak/api/shop/shopSpecValue/index.ts delete mode 100644 src_bak/api/shop/shopSpecValue/model/index.ts delete mode 100644 src_bak/api/shop/shopStore/index.ts delete mode 100644 src_bak/api/shop/shopStore/model/index.ts delete mode 100644 src_bak/api/shop/shopStoreFence/index.ts delete mode 100644 src_bak/api/shop/shopStoreFence/model/index.ts delete mode 100644 src_bak/api/shop/shopStoreRider/index.ts delete mode 100644 src_bak/api/shop/shopStoreRider/model/index.ts delete mode 100644 src_bak/api/shop/shopStoreUser/index.ts delete mode 100644 src_bak/api/shop/shopStoreUser/model/index.ts delete mode 100644 src_bak/api/shop/shopStoreWarehouse/index.ts delete mode 100644 src_bak/api/shop/shopStoreWarehouse/model/index.ts delete mode 100644 src_bak/api/shop/shopUserAddress.ts delete mode 100644 src_bak/api/shop/shopUserAddress/index.ts delete mode 100644 src_bak/api/shop/shopUserAddress/model/index.ts delete mode 100644 src_bak/api/shop/shopUserCard/index.ts delete mode 100644 src_bak/api/shop/shopUserCard/model/index.ts delete mode 100644 src_bak/api/shop/shopUserCoupon/index.ts delete mode 100644 src_bak/api/shop/shopUserCoupon/model/index.ts delete mode 100644 src_bak/api/shop/shopUserReferee/index.ts delete mode 100644 src_bak/api/shop/shopUserReferee/model/index.ts delete mode 100644 src_bak/api/shop/shopWithdrawRecord.ts delete mode 100644 src_bak/api/system/access-key/index.ts delete mode 100644 src_bak/api/system/access-key/model/index.ts delete mode 100644 src_bak/api/system/appstore/index.ts delete mode 100644 src_bak/api/system/appstore/model/index.ts delete mode 100644 src_bak/api/system/cache/index.ts delete mode 100644 src_bak/api/system/cache/model/index.ts delete mode 100644 src_bak/api/system/chat/index.ts delete mode 100644 src_bak/api/system/chat/model/index.ts delete mode 100644 src_bak/api/system/chatConversation/index.ts delete mode 100644 src_bak/api/system/chatConversation/model/index.ts delete mode 100644 src_bak/api/system/chatMessage/index.ts delete mode 100644 src_bak/api/system/chatMessage/model/index.ts delete mode 100644 src_bak/api/system/company/index.ts delete mode 100644 src_bak/api/system/company/model/index.ts delete mode 100644 src_bak/api/system/companyComment/index.ts delete mode 100644 src_bak/api/system/companyComment/model/index.ts delete mode 100644 src_bak/api/system/companyContent/index.ts delete mode 100644 src_bak/api/system/companyContent/model/index.ts delete mode 100644 src_bak/api/system/companyGit/index.ts delete mode 100644 src_bak/api/system/companyGit/model/index.ts delete mode 100644 src_bak/api/system/companyParameter/index.ts delete mode 100644 src_bak/api/system/companyParameter/model/index.ts delete mode 100644 src_bak/api/system/companyUrl/index.ts delete mode 100644 src_bak/api/system/companyUrl/model/index.ts delete mode 100644 src_bak/api/system/dict-data/index.ts delete mode 100644 src_bak/api/system/dict-data/model/index.ts delete mode 100644 src_bak/api/system/dict/index.ts delete mode 100644 src_bak/api/system/dict/model/index.ts delete mode 100644 src_bak/api/system/dictionary-data/index.ts delete mode 100644 src_bak/api/system/dictionary-data/model/index.ts delete mode 100644 src_bak/api/system/dictionary/index.ts delete mode 100644 src_bak/api/system/dictionary/model/index.ts delete mode 100644 src_bak/api/system/environment/index.ts delete mode 100644 src_bak/api/system/environment/model/index.ts delete mode 100644 src_bak/api/system/file/index.ts delete mode 100644 src_bak/api/system/file/model/index.ts delete mode 100644 src_bak/api/system/login-record/index.ts delete mode 100644 src_bak/api/system/login-record/model/index.ts delete mode 100644 src_bak/api/system/menu/index.ts delete mode 100644 src_bak/api/system/menu/model/index.ts delete mode 100644 src_bak/api/system/modules/index.ts delete mode 100644 src_bak/api/system/modules/model/index.ts delete mode 100644 src_bak/api/system/operation-record/index.ts delete mode 100644 src_bak/api/system/operation-record/model/index.ts delete mode 100644 src_bak/api/system/order/index.ts delete mode 100644 src_bak/api/system/order/model/index.ts delete mode 100644 src_bak/api/system/orderGoods/index.ts delete mode 100644 src_bak/api/system/orderGoods/model/index.ts delete mode 100644 src_bak/api/system/organization/index.ts delete mode 100644 src_bak/api/system/organization/model/index.ts delete mode 100644 src_bak/api/system/parameter/index.ts delete mode 100644 src_bak/api/system/parameter/model/index.ts delete mode 100644 src_bak/api/system/payment/index.ts delete mode 100644 src_bak/api/system/payment/model/index.ts delete mode 100644 src_bak/api/system/plug/index.ts delete mode 100644 src_bak/api/system/plug/model/index.ts delete mode 100644 src_bak/api/system/role/index.ts delete mode 100644 src_bak/api/system/role/model/index.ts delete mode 100644 src_bak/api/system/setting/index.ts delete mode 100644 src_bak/api/system/setting/model/index.ts delete mode 100644 src_bak/api/system/tenant/index.ts delete mode 100644 src_bak/api/system/tenant/model/index.ts delete mode 100644 src_bak/api/system/url/index.ts delete mode 100644 src_bak/api/system/url/model/index.ts delete mode 100644 src_bak/api/system/user-collection/index.ts delete mode 100644 src_bak/api/system/user-collection/model/index.ts delete mode 100644 src_bak/api/system/user-file/index.ts delete mode 100644 src_bak/api/system/user-file/model/index.ts delete mode 100644 src_bak/api/system/user-group/index.ts delete mode 100644 src_bak/api/system/user-group/model/index.ts delete mode 100644 src_bak/api/system/user/balance-log/index.ts delete mode 100644 src_bak/api/system/user/balance-log/model/index.ts delete mode 100644 src_bak/api/system/user/balance.ts delete mode 100644 src_bak/api/system/user/index.ts delete mode 100644 src_bak/api/system/user/model/count.ts delete mode 100644 src_bak/api/system/user/model/index.ts delete mode 100644 src_bak/api/system/user/points/index.ts delete mode 100644 src_bak/api/system/user/points/model/index.ts delete mode 100644 src_bak/api/system/user/withdraw/index.ts delete mode 100644 src_bak/api/system/user/withdraw/model/index.ts delete mode 100644 src_bak/api/system/userRole/index.ts delete mode 100644 src_bak/api/system/userRole/model/index.ts delete mode 100644 src_bak/api/system/userVerify/index.ts delete mode 100644 src_bak/api/system/userVerify/model/index.ts delete mode 100644 src_bak/api/system/version/index.ts delete mode 100644 src_bak/api/system/version/model/index.ts delete mode 100644 src_bak/api/system/white-domain/index.ts delete mode 100644 src_bak/api/system/white-domain/model/index.ts delete mode 100644 src_bak/app.config.ts delete mode 100644 src_bak/app.scss delete mode 100644 src_bak/app.tsx delete mode 100644 src_bak/assets/logo.png delete mode 100644 src_bak/assets/tabbar/README.md delete mode 100644 src_bak/assets/tabbar/category-active.png delete mode 100644 src_bak/assets/tabbar/category.png delete mode 100644 src_bak/assets/tabbar/home-active.png delete mode 100644 src_bak/assets/tabbar/home.png delete mode 100644 src_bak/assets/tabbar/order-active.png delete mode 100644 src_bak/assets/tabbar/order.png delete mode 100644 src_bak/assets/tabbar/points-active.png delete mode 100644 src_bak/assets/tabbar/points.png delete mode 100644 src_bak/assets/tabbar/user-active.png delete mode 100644 src_bak/assets/tabbar/user.png delete mode 100644 src_bak/components/ErrorBoundary.scss delete mode 100644 src_bak/components/ErrorBoundary.tsx delete mode 100644 src_bak/components/NavBar/index.tsx delete mode 100644 src_bak/components/QRLoginScanner.tsx delete mode 100644 src_bak/components/business/AddressCard/index.tsx delete mode 100644 src_bak/components/business/CouponCard/index.tsx delete mode 100644 src_bak/components/business/CouponSelect/index.tsx delete mode 100644 src_bak/components/business/MemberBadge/index.tsx delete mode 100644 src_bak/components/business/PayModal/index.tsx delete mode 100644 src_bak/components/business/SkuSelector/index.tsx delete mode 100644 src_bak/components/common/BottomButton/index.scss delete mode 100644 src_bak/components/common/BottomButton/index.tsx delete mode 100644 src_bak/components/common/EmptyState/index.tsx delete mode 100644 src_bak/components/common/FixedButton/index.tsx delete mode 100644 src_bak/components/common/LazyImage/index.tsx delete mode 100644 src_bak/components/common/LoadMore/index.tsx delete mode 100644 src_bak/components/common/Loading/index.tsx delete mode 100644 src_bak/components/common/OrderCard/index.tsx delete mode 100644 src_bak/components/common/Price/index.tsx delete mode 100644 src_bak/components/common/ProductCard/index.tsx delete mode 100644 src_bak/components/common/VirtualList/index.tsx delete mode 100644 src_bak/config/app.ts delete mode 100644 src_bak/contexts/AppContext.tsx delete mode 100644 src_bak/contexts/CartContext.tsx delete mode 100644 src_bak/contexts/UserContext.tsx delete mode 100644 src_bak/hooks/index.ts delete mode 100644 src_bak/hooks/useAddress.ts delete mode 100644 src_bak/hooks/useAppContext.ts delete mode 100644 src_bak/hooks/useCountDown.ts delete mode 100644 src_bak/hooks/useCountUp.ts delete mode 100644 src_bak/hooks/useCoupon.ts delete mode 100644 src_bak/hooks/usePagination.ts delete mode 100644 src_bak/hooks/usePayment.ts delete mode 100644 src_bak/hooks/useRequest.ts delete mode 100644 src_bak/hooks/useScrollHeight.ts delete mode 100644 src_bak/hooks/useTheme.ts delete mode 100644 src_bak/hooks/useUser.ts delete mode 100644 src_bak/index.html delete mode 100644 src_bak/pages/activity/detail/index.config.ts delete mode 100644 src_bak/pages/activity/detail/index.tsx delete mode 100644 src_bak/pages/activity/list/index.config.ts delete mode 100644 src_bak/pages/activity/list/index.tsx delete mode 100644 src_bak/pages/after-sale/apply/index.config.ts delete mode 100644 src_bak/pages/after-sale/apply/index.tsx delete mode 100644 src_bak/pages/after-sale/list/index.config.ts delete mode 100644 src_bak/pages/after-sale/list/index.tsx delete mode 100644 src_bak/pages/after-sale/progress/index.config.ts delete mode 100644 src_bak/pages/after-sale/progress/index.tsx delete mode 100644 src_bak/pages/apply.config.ts delete mode 100644 src_bak/pages/apply.tsx delete mode 100644 src_bak/pages/balance-log.tsx delete mode 100644 src_bak/pages/balance.config.ts delete mode 100644 src_bak/pages/balance.tsx delete mode 100644 src_bak/pages/booking.config.ts delete mode 100644 src_bak/pages/booking.tsx delete mode 100644 src_bak/pages/booking/detail/index.config.ts delete mode 100644 src_bak/pages/booking/detail/index.tsx delete mode 100644 src_bak/pages/booking/list/index.config.ts delete mode 100644 src_bak/pages/booking/list/index.tsx delete mode 100644 src_bak/pages/booking/reschedule/index.config.ts delete mode 100644 src_bak/pages/booking/reschedule/index.tsx delete mode 100644 src_bak/pages/commission.config.ts delete mode 100644 src_bak/pages/commission.tsx delete mode 100644 src_bak/pages/customer-service.config.ts delete mode 100644 src_bak/pages/customer-service.tsx delete mode 100644 src_bak/pages/dashboard.tsx delete mode 100644 src_bak/pages/detail.config.ts delete mode 100644 src_bak/pages/detail.tsx delete mode 100644 src_bak/pages/event/detail/index.config.ts delete mode 100644 src_bak/pages/event/detail/index.tsx delete mode 100644 src_bak/pages/event/list/index.config.ts delete mode 100644 src_bak/pages/event/list/index.tsx delete mode 100644 src_bak/pages/event/my/index.config.ts delete mode 100644 src_bak/pages/event/my/index.tsx delete mode 100644 src_bak/pages/event/register/index.config.ts delete mode 100644 src_bak/pages/event/register/index.tsx delete mode 100644 src_bak/pages/exchange.config.ts delete mode 100644 src_bak/pages/exchange.tsx delete mode 100644 src_bak/pages/favorite-list.tsx delete mode 100644 src_bak/pages/gift-card/balance/index.config.ts delete mode 100644 src_bak/pages/gift-card/balance/index.tsx delete mode 100644 src_bak/pages/gift-card/exchange/index.config.ts delete mode 100644 src_bak/pages/gift-card/exchange/index.tsx delete mode 100644 src_bak/pages/gift-card/purchase/index.config.ts delete mode 100644 src_bak/pages/gift-card/purchase/index.tsx delete mode 100644 src_bak/pages/group-buy-detail.config.ts delete mode 100644 src_bak/pages/group-buy-detail.tsx delete mode 100644 src_bak/pages/group-buy-list.tsx delete mode 100644 src_bak/pages/help-center.tsx delete mode 100644 src_bak/pages/help-detail.tsx delete mode 100644 src_bak/pages/history-list.tsx delete mode 100644 src_bak/pages/index/article-detail.tsx delete mode 100644 src_bak/pages/index/article-list.config.ts delete mode 100644 src_bak/pages/index/article-list.tsx delete mode 100644 src_bak/pages/index/coupon-center.config.ts delete mode 100644 src_bak/pages/index/coupon-center.tsx delete mode 100644 src_bak/pages/index/coupon-center/index.config.ts delete mode 100644 src_bak/pages/index/coupon-center/index.tsx delete mode 100644 src_bak/pages/index/index.config.ts delete mode 100644 src_bak/pages/index/index.scss delete mode 100644 src_bak/pages/index/index.tsx delete mode 100644 src_bak/pages/index/notification.tsx delete mode 100644 src_bak/pages/index/search.tsx delete mode 100644 src_bak/pages/invite-record.config.ts delete mode 100644 src_bak/pages/invite-record.tsx delete mode 100644 src_bak/pages/invoice/apply/index.tsx delete mode 100644 src_bak/pages/invoice/records/index.tsx delete mode 100644 src_bak/pages/invoice/title/index.tsx delete mode 100644 src_bak/pages/list.config.ts delete mode 100644 src_bak/pages/list.tsx delete mode 100644 src_bak/pages/member.config.ts delete mode 100644 src_bak/pages/member.tsx delete mode 100644 src_bak/pages/message/detail/index.config.ts delete mode 100644 src_bak/pages/message/detail/index.tsx delete mode 100644 src_bak/pages/message/list/index.config.ts delete mode 100644 src_bak/pages/message/list/index.tsx delete mode 100644 src_bak/pages/order-list.tsx delete mode 100644 src_bak/pages/order/after-sale-apply.tsx delete mode 100644 src_bak/pages/order/after-sale-detail.tsx delete mode 100644 src_bak/pages/order/after-sale-list.tsx delete mode 100644 src_bak/pages/order/detail.tsx delete mode 100644 src_bak/pages/order/evaluate-detail.config.ts delete mode 100644 src_bak/pages/order/evaluate-detail.tsx delete mode 100644 src_bak/pages/order/evaluate-detail/index.config.ts delete mode 100644 src_bak/pages/order/evaluate-detail/index.tsx delete mode 100644 src_bak/pages/order/evaluate-list.config.ts delete mode 100644 src_bak/pages/order/evaluate-list.tsx delete mode 100644 src_bak/pages/order/evaluate-list/index.config.ts delete mode 100644 src_bak/pages/order/evaluate-list/index.tsx delete mode 100644 src_bak/pages/order/evaluate.config.ts delete mode 100644 src_bak/pages/order/evaluate.tsx delete mode 100644 src_bak/pages/order/evaluate/index.config.ts delete mode 100644 src_bak/pages/order/evaluate/index.tsx delete mode 100644 src_bak/pages/order/list.tsx delete mode 100644 src_bak/pages/order/logistics.tsx delete mode 100644 src_bak/pages/order/order.config.ts delete mode 100644 src_bak/pages/order/order.scss delete mode 100644 src_bak/pages/order/order.tsx delete mode 100644 src_bak/pages/order/refund-detail.tsx delete mode 100644 src_bak/pages/order/refund.tsx delete mode 100644 src_bak/pages/points-rules.tsx delete mode 100644 src_bak/pages/points/exchange.tsx delete mode 100644 src_bak/pages/points/exchange/index.config.ts delete mode 100644 src_bak/pages/points/exchange/index.tsx delete mode 100644 src_bak/pages/points/index.config.ts delete mode 100644 src_bak/pages/points/index.tsx delete mode 100644 src_bak/pages/points/order-list/index.tsx delete mode 100644 src_bak/pages/points/points-rules/index.tsx delete mode 100644 src_bak/pages/points/product-detail.tsx delete mode 100644 src_bak/pages/points/product-list/index.config.ts delete mode 100644 src_bak/pages/points/product-list/index.tsx delete mode 100644 src_bak/pages/points/signin.tsx delete mode 100644 src_bak/pages/progress.config.ts delete mode 100644 src_bak/pages/progress.tsx delete mode 100644 src_bak/pages/promotion.config.ts delete mode 100644 src_bak/pages/promotion.tsx delete mode 100644 src_bak/pages/purchase.config.ts delete mode 100644 src_bak/pages/purchase.tsx delete mode 100644 src_bak/pages/rebate/records/index.tsx delete mode 100644 src_bak/pages/rebate/withdraw/index.tsx delete mode 100644 src_bak/pages/records.tsx delete mode 100644 src_bak/pages/redeem.config.ts delete mode 100644 src_bak/pages/redeem.tsx delete mode 100644 src_bak/pages/reschedule.config.ts delete mode 100644 src_bak/pages/reschedule.tsx delete mode 100644 src_bak/pages/sales.tsx delete mode 100644 src_bak/pages/seckill-detail.config.ts delete mode 100644 src_bak/pages/seckill-detail.tsx delete mode 100644 src_bak/pages/seckill-list.config.ts delete mode 100644 src_bak/pages/seckill-list.tsx delete mode 100644 src_bak/pages/share/index.tsx delete mode 100644 src_bak/pages/shop/cart.tsx delete mode 100644 src_bak/pages/shop/category.tsx delete mode 100644 src_bak/pages/shop/checkout.tsx delete mode 100644 src_bak/pages/shop/group-buy-detail/index.config.ts delete mode 100644 src_bak/pages/shop/group-buy-detail/index.tsx delete mode 100644 src_bak/pages/shop/group-buy-list/index.tsx delete mode 100644 src_bak/pages/shop/index.config.ts delete mode 100644 src_bak/pages/shop/index.tsx delete mode 100644 src_bak/pages/shop/product-detail.tsx delete mode 100644 src_bak/pages/shop/seckill-detail/index.config.ts delete mode 100644 src_bak/pages/shop/seckill-detail/index.tsx delete mode 100644 src_bak/pages/shop/seckill-list/index.config.ts delete mode 100644 src_bak/pages/shop/seckill-list/index.tsx delete mode 100644 src_bak/pages/statistics/dashboard/index.tsx delete mode 100644 src_bak/pages/statistics/sales/index.tsx delete mode 100644 src_bak/pages/statistics/users/index.tsx delete mode 100644 src_bak/pages/store/booking/index.config.ts delete mode 100644 src_bak/pages/store/booking/index.scss delete mode 100644 src_bak/pages/store/booking/index.tsx delete mode 100644 src_bak/pages/store/list/index.config.ts delete mode 100644 src_bak/pages/store/list/index.tsx delete mode 100644 src_bak/pages/store/login/index.config.ts delete mode 100644 src_bak/pages/store/login/index.scss delete mode 100644 src_bak/pages/store/login/index.tsx delete mode 100644 src_bak/pages/team.config.ts delete mode 100644 src_bak/pages/team.tsx delete mode 100644 src_bak/pages/title.tsx delete mode 100644 src_bak/pages/user/address-edit.tsx delete mode 100644 src_bak/pages/user/address-list.tsx delete mode 100644 src_bak/pages/user/balance-log/index.tsx delete mode 100644 src_bak/pages/user/benefit-exchange-confirm/index.scss delete mode 100644 src_bak/pages/user/benefit-exchange-confirm/index.tsx delete mode 100644 src_bak/pages/user/benefit-exchange-list/index.scss delete mode 100644 src_bak/pages/user/benefit-exchange-list/index.tsx delete mode 100644 src_bak/pages/user/benefit-packages/index.scss delete mode 100644 src_bak/pages/user/benefit-packages/index.tsx delete mode 100644 src_bak/pages/user/commission/index.config.ts delete mode 100644 src_bak/pages/user/commission/index.scss delete mode 100644 src_bak/pages/user/commission/index.tsx delete mode 100644 src_bak/pages/user/coupon-list.tsx delete mode 100644 src_bak/pages/user/customer-service/index.config.ts delete mode 100644 src_bak/pages/user/customer-service/index.tsx delete mode 100644 src_bak/pages/user/favorite-list/index.tsx delete mode 100644 src_bak/pages/user/help-center/index.tsx delete mode 100644 src_bak/pages/user/help-detail/index.tsx delete mode 100644 src_bak/pages/user/history-list/index.tsx delete mode 100644 src_bak/pages/user/index.tsx delete mode 100644 src_bak/pages/user/invite-record/index.config.ts delete mode 100644 src_bak/pages/user/invite-record/index.tsx delete mode 100644 src_bak/pages/user/invite-subordinate/index.config.ts delete mode 100644 src_bak/pages/user/invite-subordinate/index.tsx delete mode 100644 src_bak/pages/user/member-upgrade/index.config.ts delete mode 100644 src_bak/pages/user/member-upgrade/index.tsx delete mode 100644 src_bak/pages/user/member/index.config.ts delete mode 100644 src_bak/pages/user/member/index.tsx delete mode 100644 src_bak/pages/user/points-record.tsx delete mode 100644 src_bak/pages/user/profile.tsx delete mode 100644 src_bak/pages/user/promotion/index.config.ts delete mode 100644 src_bak/pages/user/promotion/index.tsx delete mode 100644 src_bak/pages/user/recharge-record/index.tsx delete mode 100644 src_bak/pages/user/recharge.tsx delete mode 100644 src_bak/pages/user/redeem/index.config.ts delete mode 100644 src_bak/pages/user/redeem/index.tsx delete mode 100644 src_bak/pages/user/register-pay/index.config.ts delete mode 100644 src_bak/pages/user/register-pay/index.tsx delete mode 100644 src_bak/pages/user/setting.tsx delete mode 100644 src_bak/pages/user/shop-setting/index.tsx delete mode 100644 src_bak/pages/user/team/index.config.ts delete mode 100644 src_bak/pages/user/team/index.tsx delete mode 100644 src_bak/pages/user/user.config.ts delete mode 100644 src_bak/pages/user/user.scss delete mode 100644 src_bak/pages/user/user.tsx delete mode 100644 src_bak/pages/user/wallet.tsx delete mode 100644 src_bak/pages/user/withdraw-list/index.scss delete mode 100644 src_bak/pages/user/withdraw-list/index.tsx delete mode 100644 src_bak/pages/user/withdraw/index.scss delete mode 100644 src_bak/pages/user/withdraw/index.tsx delete mode 100644 src_bak/pages/users.tsx delete mode 100644 src_bak/pages/withdraw.tsx delete mode 100644 src_bak/passport/agreement.config.ts delete mode 100644 src_bak/passport/agreement.scss delete mode 100644 src_bak/passport/agreement.tsx delete mode 100644 src_bak/passport/auth-flow.ts delete mode 100644 src_bak/passport/forget.config.ts delete mode 100644 src_bak/passport/forget.tsx delete mode 100644 src_bak/passport/login.config.ts delete mode 100644 src_bak/passport/login.scss delete mode 100644 src_bak/passport/login.tsx delete mode 100644 src_bak/passport/qr-confirm/index.config.ts delete mode 100644 src_bak/passport/qr-confirm/index.tsx delete mode 100644 src_bak/passport/qr-login/index.config.ts delete mode 100644 src_bak/passport/qr-login/index.tsx delete mode 100644 src_bak/passport/register.config.ts delete mode 100644 src_bak/passport/register.tsx delete mode 100644 src_bak/passport/setting.config.ts delete mode 100644 src_bak/passport/setting.tsx delete mode 100644 src_bak/passport/sms-login.config.ts delete mode 100644 src_bak/passport/sms-login.tsx delete mode 100644 src_bak/passport/unified-qr/index.config.ts delete mode 100644 src_bak/passport/unified-qr/index.tsx delete mode 100644 src_bak/styles/global.scss delete mode 100644 src_bak/types/address.ts delete mode 100644 src_bak/types/coupon.ts delete mode 100644 src_bak/types/global.d.ts delete mode 100644 src_bak/types/index.ts delete mode 100644 src_bak/types/member.ts delete mode 100644 src_bak/types/order.ts delete mode 100644 src_bak/types/product.ts delete mode 100644 src_bak/utils/auth.ts delete mode 100644 src_bak/utils/common.ts delete mode 100644 src_bak/utils/geofence.ts delete mode 100644 src_bak/utils/index.ts delete mode 100644 src_bak/utils/invite.ts delete mode 100644 src_bak/utils/login-guard.ts delete mode 100644 src_bak/utils/request.ts delete mode 100644 src_bak/utils/server.ts diff --git a/.workbuddy/memory/2026-07-01.md b/.workbuddy/memory/2026-07-01.md index 8ed17fa..73c45d5 100644 --- a/.workbuddy/memory/2026-07-01.md +++ b/.workbuddy/memory/2026-07-01.md @@ -12,5 +12,28 @@ - 修改 `src/app.config.ts`:注册新页面 `pages/store/center/index` - 订单状态字段说明(`ShopOrder`): - `payStatus: boolean` — `false`=未付款,`true`=已付款 - - `deliveryStatus: number` — `10`=未发货,`20`=已发货 + - `deliveryStatus: number` — `10`=未发货,`20`=已发货,`30`=发货已完成 - `orderStatus: number` — `0`=正常,`1`=已完成,`2`=已取消 + - `sendEndImg: string` — 配送员送达拍照(逗号分隔的多图URL) + +## 门店中心功能重构 + +- 取消注释 `src/pages/user/user.tsx` 第56-57行:门店中心菜单项(`user.isAdmin` 条件显示),位于"我的钱包"上方 +- 重写门店中心页面 `src/pages/store/center/index.tsx`: + - 修复 API 分页参数:使用 `page`/`limit` 替代 `pageNo`/`pageSize`,响应格式使用 `list`/`count` + - 新增"确认送达"操作(`opType='complete'`):配送货物到达后拍照上传,同时变更 payStatus=true + deliveryStatus=30 + orderStatus=1 + sendEndImg + - 已完成订单显示送达凭证照片(`sendEndImg`) + - 使用 `useDidShow` 生命周期刷新列表 + - 使用 `loadingRef` 防止并发加载 +- 修改门店中心显示条件:从 `user.isAdmin` 改为 `storeInfo`(通过 `/api/shop/shop-store-user/my` 接口判断当前用户是否为门店店员/店长) + +## 门店中心页面简化(货到付款模式) + +- 重写 `src/pages/store/center/index.tsx`: + - Tab 从4个简化为2个:**待处理**(statusFilter=8)、**已完成**(orderStatus=1) + - 待处理订单提供两种操作: + - "确认收款":仅变更 payStatus=true(已付款) + - "确认完成":同时变更 payStatus=true + deliveryStatus=30 + orderStatus=1 + sendEndImg(必填,配送到达拍照上传) + - 已完成订单仅展示,无操作按钮 + - 状态文案适配货到付款:待收款/待发货/待收货/已完成 + - Tab 颜色改为绿色主题 diff --git a/src/pages/store/center/index.tsx b/src/pages/store/center/index.tsx index 7e4aa4d..d8f108e 100644 --- a/src/pages/store/center/index.tsx +++ b/src/pages/store/center/index.tsx @@ -1,32 +1,40 @@ -import React, { useState, useEffect } from 'react' +import React, { useState, useEffect, useCallback, useRef } from 'react' import { View, Text, Image, ScrollView } from '@tarojs/components' -import Taro from '@tarojs/taro' -import { pageShopOrder, updateShopOrder } from '@/api/shop/shopOrder' -import type { ShopOrder } from '@/api/shop/shopOrder/model' -import { TenantId } from '../../../../config/app' +import Taro, { useDidShow } from '@tarojs/taro' +import { pageShopOrder, updateShopOrder, removeShopOrder } from '@/api/shop/shopOrder' +import type { ShopOrder, ShopOrderParam } from '@/api/shop/shopOrder/model' +import { TenantId } from '../../../config/app' -type TabKey = 'unpaid' | 'unshipped' | 'shipped' | 'completed' +definePageConfig({ + navigationBarTitleText: '门店中心', +}) -const TABS = [ - { key: 'unpaid', label: '待付款', params: { payStatus: 0 } }, - { key: 'unshipped', label: '待发货', params: { payStatus: 1, deliveryStatus: 10 } }, - { key: 'shipped', label: '待收货', params: { payStatus: 1, deliveryStatus: 20 } }, - { key: 'completed', label: '已完成', params: { orderStatus: 1, payStatus: 1 } }, -] as const +// ─── Tab 配置(货到付款模式:待处理 + 已完成)───────────────────── +type TabKey = 'pending' | 'completed' -type OpType = 'pay' | 'ship' | 'complete' +const TABS: { key: TabKey; label: string; params: Partial }[] = [ + { key: 'pending', label: '待处理', params: { statusFilter: 8 } }, + { key: 'completed', label: '已完成', params: { orderStatus: 1 } }, +] + +// ─── 操作类型 ───────────────────────────────────────────────────── +type OpType = 'pay' | 'complete' const OP_LABEL: Record = { - pay: '已付款', - ship: '已发货', + pay: '已收款', complete: '已完成', } -/** 上传图片到后端,返回图片 URL */ +const OP_DESC: Record = { + pay: '变更支付状态为已付款', + complete: '同时变更支付状态为已付款、发货状态为已完成、订单状态为已完成', +} + +// ─── 图片上传 ───────────────────────────────────────────────────── const uploadImage = (filePath: string): Promise => { return new Promise((resolve, reject) => { Taro.uploadFile({ - url: 'https://shop-api.websoft.top/api/oss/upload', + url: 'https://server.websoft.top/api/oss/upload', filePath, name: 'file', header: { 'content-type': 'application/json', TenantId }, @@ -47,45 +55,118 @@ const uploadImage = (filePath: string): Promise => { }) } +// ─── 状态辅助函数 ────────────────────────────────────────────────── + +/** 格式化日期为 Spring Boot LocalDateTime 可接受的格式:yyyy-MM-dd HH:mm:ss */ +function formatDateTime(date: Date): string { + const y = date.getFullYear() + const m = String(date.getMonth() + 1).padStart(2, '0') + const d = String(date.getDate()).padStart(2, '0') + const h = String(date.getHours()).padStart(2, '0') + const mi = String(date.getMinutes()).padStart(2, '0') + const s = String(date.getSeconds()).padStart(2, '0') + return `${y}-${m}-${d} ${h}:${mi}:${s}` +} + +function getStatusText(order: ShopOrder): string { + if (order.orderStatus === 2) return '待处理' + if (order.orderStatus === 1) return '已完成' + if (order.payStatus === false) return '待收款' + if (order.payStatus && order.deliveryStatus === 10) return '待发货' + if (order.payStatus && order.deliveryStatus === 20) return '待收货' + return '待处理' +} + +function getStatusColor(order: ShopOrder): string { + if (order.orderStatus === 2) return '#999' + if (order.orderStatus === 1) return '#0e932e' + if (order.payStatus === false) return '#ee0a24' + if (order.payStatus) return '#ff7d00' + return '#999' +} + +/** 获取待处理订单可执行的操作 */ +function getOrderActions(order: ShopOrder): { label: string; type: OpType }[] { + const actions: { label: string; type: OpType }[] = [] + // 未付款 → 可确认收款,也可直接确认完成 + if (order.payStatus === false) { + actions.push({ label: '确认收款', type: 'pay' }) + actions.push({ label: '确认完成', type: 'complete' }) + } + // 已付款但未完成 → 可确认完成 + if (order.payStatus && order.orderStatus !== 1 && order.orderStatus !== 2) { + actions.push({ label: '确认完成', type: 'complete' }) + } + return actions +} + +// ─── 页面组件 ────────────────────────────────────────────────────── export default function StoreCenterPage() { - const [activeTab, setActiveTab] = useState('unshipped') - const [orderList, setOrderList] = useState([]) - const [total, setTotal] = useState(0) - const [pageNo, setPageNo] = useState(1) - const [loading, setLoading] = useState(false) - const pageSize = 10 + const [activeTab, setActiveTab] = useState('pending') + + // 订单列表与分页 + const [orderList, setOrderList] = useState([]) + const [page, setPage] = useState(1) + const [hasMore, setHasMore] = useState(true) + const [loading, setLoading] = useState(false) // 操作弹窗状态 - const [showModal, setShowModal] = useState(false) + const [showModal, setShowModal] = useState(false) const [currentOrder, setCurrentOrder] = useState(null) - const [opType, setOpType] = useState('pay') + const [opType, setOpType] = useState('pay') const [proofImages, setProofImages] = useState([]) const [submitting, setSubmitting] = useState(false) + const pageSize = 10 + const loadingRef = useRef(false) + /** 加载订单列表 */ - const loadOrders = async (tab: TabKey = activeTab, page: number = 1, append = false) => { - const tabConfig = TABS.find(t => t.key === tab) - if (!tabConfig) return + const loadOrders = useCallback(async (tab: TabKey, pageNo: number = 1, append = false) => { + if (loadingRef.current) return + loadingRef.current = true setLoading(true) + try { - const res: any = await pageShopOrder({ + const tabConfig = TABS.find(t => t.key === tab) + if (!tabConfig) return + + const params: ShopOrderParam = { ...tabConfig.params, - pageNo, - pageSize, - } as any) - const records: ShopOrder[] = res?.records || res?.data?.records || [] - const totalCount: number = res?.total || res?.data?.total || 0 - setOrderList(append ? prev => [...prev, ...records] : records) - setTotal(totalCount) - setPageNo(page) + page: pageNo, + limit: pageSize, + } + + const res = await pageShopOrder(params) + const list = res?.list || [] + + setOrderList(prev => append ? [...prev, ...list] : list) + setPage(pageNo) + setHasMore(list.length >= pageSize) } catch (e: any) { Taro.showToast({ title: e.message || '加载失败', icon: 'none' }) + if (!append) setOrderList([]) } finally { + loadingRef.current = false setLoading(false) } - } + }, []) - useEffect(() => { loadOrders(activeTab, 1) }, [activeTab]) + // 切换 tab 时重新加载 + useEffect(() => { + loadOrders(activeTab, 1) + }, [activeTab, loadOrders]) + + // 页面重新显示时刷新 + useDidShow(() => { + loadOrders(activeTab, 1) + }) + + /** 加载更多 */ + const handleLoadMore = () => { + if (hasMore && !loadingRef.current) { + loadOrders(activeTab, page + 1, true) + } + } /** 打开操作弹窗 */ const openModal = (order: ShopOrder, type: OpType) => { @@ -102,21 +183,27 @@ export default function StoreCenterPage() { setProofImages([]) } - /** 选择凭证图片 */ + /** 选择并上传凭证图片 */ const chooseProofImage = () => { + const maxCount = 3 + const remaining = maxCount - proofImages.length + if (remaining <= 0) return + Taro.chooseImage({ - count: 1, + count: remaining, sizeType: ['compressed'], sourceType: ['camera', 'album'], success: async (res) => { - try { - Taro.showLoading({ title: '上传中...' }) - const url = await uploadImage(res.tempFilePaths[0]) - Taro.hideLoading() - setProofImages(prev => [...prev, url]) - } catch (e: any) { - Taro.hideLoading() - Taro.showToast({ title: e.message || '上传失败', icon: 'none' }) + for (const filePath of res.tempFilePaths) { + try { + Taro.showLoading({ title: '上传中...' }) + const url = await uploadImage(filePath) + Taro.hideLoading() + setProofImages(prev => [...prev, url]) + } catch (e: any) { + Taro.hideLoading() + Taro.showToast({ title: e.message || '上传失败', icon: 'none' }) + } } }, }) @@ -130,32 +217,40 @@ export default function StoreCenterPage() { /** 提交操作 */ const submitOperation = async () => { if (!currentOrder) return - if (proofImages.length === 0) { - Taro.showToast({ title: '请上传操作凭证', icon: 'none' }) + + // 确认完成必须上传凭证照片 + if (opType === 'complete' && proofImages.length === 0) { + Taro.showToast({ title: '请上传配送凭证照片', icon: 'none' }) return } + setSubmitting(true) try { - const proofText = `【门店操作凭证】${OP_LABEL[opType]}:${proofImages.join(',')}` const updateData: any = { orderId: currentOrder.orderId } if (opType === 'pay') { + // 确认收款:变更支付状态为已付款 updateData.payStatus = true - updateData.payTime = new Date().toISOString() - } else if (opType === 'ship') { - updateData.deliveryStatus = 20 - updateData.deliveryTime = new Date().toISOString() + updateData.payTime = formatDateTime(new Date()) } else if (opType === 'complete') { - updateData.orderStatus = 1 + // 确认完成:变更支付状态为已付款、发货状态为已完成、订单状态为已完成 + updateData.payStatus = true + updateData.payTime = formatDateTime(new Date()) + updateData.deliveryStatus = 20 // 发货状态 → 已完成 + updateData.orderStatus = 1 // 订单状态 → 已完成 + updateData.sendEndImg = proofImages.join(',') // 配送员送达拍照 } - // 将凭证追加到备注 - updateData.comments = (currentOrder.comments || '') + `\n${proofText}` + // 收款操作如有凭证也追加到备注 + if (opType === 'pay' && proofImages.length > 0) { + const proofText = `【门店收款凭证】:${proofImages.join(',')}` + updateData.comments = (currentOrder.comments || '') + `\n${proofText}` + } await updateShopOrder(updateData) Taro.showToast({ title: '操作成功', icon: 'success' }) closeModal() - loadOrders(activeTab, 1) + loadOrders(activeTab, 1) // 刷新列表 } catch (e: any) { Taro.showToast({ title: e.message || '操作失败', icon: 'none' }) } finally { @@ -163,23 +258,33 @@ export default function StoreCenterPage() { } } - /** 获取订单可进行的操作 */ - const getOrderActions = (order: ShopOrder) => { - const actions: { label: string; type: OpType }[] = [] - if (!order.payStatus) { - actions.push({ label: '标记已付款', type: 'pay' }) - } - if (order.payStatus && order.deliveryStatus === 10) { - actions.push({ label: '标记已发货', type: 'ship' }) - } - if (order.payStatus && order.deliveryStatus === 20 && order.orderStatus === 0) { - actions.push({ label: '标记已完成', type: 'complete' }) - } - return actions + /** 删除订单 */ + const handleDelete = (order: ShopOrder) => { + Taro.showModal({ + title: '提示', + content: `确定要删除订单 ${order.orderNo} 吗?删除后无法恢复。`, + confirmColor: '#ee0a24', + success: async (res) => { + if (!res.confirm) return + try { + Taro.showLoading({ title: '删除中...' }) + await removeShopOrder(order.orderId) + Taro.hideLoading() + Taro.showToast({ title: '删除成功', icon: 'success' }) + loadOrders(activeTab, 1) + } catch (e: any) { + Taro.hideLoading() + Taro.showToast({ title: e.message || '删除失败', icon: 'none' }) + } + }, + }) } + /** 渲染单个订单卡片 */ const renderOrderCard = (order: ShopOrder) => { - const actions = getOrderActions(order) + const actions = activeTab === 'pending' ? getOrderActions(order) : [] + const orderGoods = (order as any).orderGoods || [] + return ( {/* 订单头部 */} @@ -191,7 +296,7 @@ export default function StoreCenterPage() { {/* 商品列表 */} - {(order as any).orderGoods?.map((goods: any, idx: number) => ( + {orderGoods.map((goods: any, idx: number) => ( {goods.coverImage && ( @@ -219,30 +324,56 @@ export default function StoreCenterPage() { )} - {/* 金额 */} + {/* 送达凭证(已完成订单) */} + {order.sendEndImg && ( + + 配送凭证: + + {order.sendEndImg.split(',').map((img, i) => ( + + ))} + + + )} + + {/* 金额 + 支付方式 */} - 共{(order as any).orderGoods?.length || 0}件商品 + {order.payType === 0 ? '余额支付' : order.payType === 4 ? '现金支付' : '货到付款'} 实付:¥{order.payPrice || order.totalPrice} - {/* 操作按钮 */} - {actions.length > 0 && ( - + {/* 操作按钮(仅待处理订单) */} + + {/* 删除按钮 */} + handleDelete(order)} + > + 删除订单 + + + {actions.map(act => ( openModal(order, act.type)} > - {act.label} + {act.label} ))} - )} + ) } @@ -255,11 +386,11 @@ export default function StoreCenterPage() { setActiveTab(tab.key as TabKey)} + onClick={() => setActiveTab(tab.key)} > - + {tab.label} @@ -269,10 +400,9 @@ export default function StoreCenterPage() { {/* 订单列表 */} { - if (orderList.length < total && !loading) loadOrders(activeTab, pageNo + 1, true) - }} + style={{ height: 'calc(100vh - 50px)' }} + onScrollToLower={handleLoadMore} + lowerThreshold={100} > {loading && orderList.length === 0 ? ( @@ -290,6 +420,11 @@ export default function StoreCenterPage() { 加载中... )} + {!hasMore && orderList.length > 0 && ( + + 没有更多了 + + )} @@ -311,11 +446,16 @@ export default function StoreCenterPage() { 实付金额:¥{currentOrder.payPrice || currentOrder.totalPrice} + + 操作说明:{OP_DESC[opType]} + )} {/* 凭证上传 */} - 上传操作凭证(必填,最多3张) + + 上传凭证照片{opType === 'complete' ? '(必填,配送货物到达后拍照上传,最多3张)' : '(选填,最多3张)'} + {proofImages.map((url, idx) => ( @@ -344,8 +484,10 @@ export default function StoreCenterPage() { 取消 {submitting ? ( 提交中... @@ -360,23 +502,3 @@ export default function StoreCenterPage() { ) } - -/** 获取订单状态文字 */ -function getStatusText(order: ShopOrder): string { - if (order.payStatus === false) return '待付款' - if (order.orderStatus === 2) return '已取消' - if (order.deliveryStatus === 10) return '待发货' - if (order.deliveryStatus === 20) return '待收货' - if (order.orderStatus === 1) return '已完成' - return '处理中' -} - -/** 获取订单状态颜色 */ -function getStatusColor(order: ShopOrder): string { - if (order.payStatus === false) return '#ee0a24' - if (order.orderStatus === 2) return '#999' - if (order.deliveryStatus === 10) return '#ff7d00' - if (order.deliveryStatus === 20) return '#4b9cf5' - if (order.orderStatus === 1) return '#0e932e' - return '#999' -} diff --git a/src/pages/user/user.tsx b/src/pages/user/user.tsx index 6e5215d..095e6f6 100644 --- a/src/pages/user/user.tsx +++ b/src/pages/user/user.tsx @@ -53,11 +53,8 @@ const UserPage: React.FC = () => { }) const menuItems = [ - // { icon: '🏆', label: '赛事活动', url: '/pages/event/my/index' }, - // { icon: '📅', label: '预约穿线', url: '/pages/booking/list/index' }, - // { icon: '🎫', label: '优惠券', url: '/pages/user/coupon-list' }, - // 门店中心:仅管理员显示 - ...(user?.isAdmin ? [{ icon: '🏪', label: '门店中心', url: '/pages/store/center/index' }] : []), + // 门店中心:仅门店店员/店长显示(通过 /shop/shop-store-user/my 判断) + ...(storeInfo ? [{ icon: '🏪', label: '门店中心', url: '/pages/store/center/index' }] : []), { icon: '💰', label: '我的钱包', url: '/pages/user/wallet' }, { icon: '📍', label: '收货地址', url: '/pages/user/address-list' }, // { icon: '⭐', label: '积分明细', url: '/pages/user/points-record' }, diff --git a/src_bak/api/cms/cmsAd/index.ts b/src_bak/api/cms/cmsAd/index.ts deleted file mode 100644 index 37dae87..0000000 --- a/src_bak/api/cms/cmsAd/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsAd, CmsAdParam } from './model'; - - -/** - * 分页查询广告位 - */ -export async function pageCmsAd(params: CmsAdParam) { - const res = await request.get>>( - '/cms/cms-ad/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询广告位列表 - */ -export async function listCmsAd(params?: CmsAdParam) { - const res = await request.get>( - '/cms/cms-ad', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加广告位 - */ -export async function addCmsAd(data: CmsAd) { - const res = await request.post>( - '/cms/cms-ad', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改广告位 - */ -export async function updateCmsAd(data: CmsAd) { - const res = await request.put>( - '/cms/cms-ad', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除广告位 - */ -export async function removeCmsAd(id?: number) { - const res = await request.del>( - '/cms/cms-ad/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除广告位 - */ -export async function removeBatchCmsAd(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-ad/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询广告位 - */ -export async function getCmsAd(id: number) { - const res = await request.get>( - '/cms/cms-ad/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据code查询广告位 - */ -export async function getCmsAdByCode(code: string) { - const res = await request.get>( - '/cms/cms-ad/getByCode/' + code - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsAd/model/index.ts b/src_bak/api/cms/cmsAd/model/index.ts deleted file mode 100644 index 99cd4eb..0000000 --- a/src_bak/api/cms/cmsAd/model/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 广告位 - */ -export interface CmsAd { - // ID - adId?: number; - // 页面ID - designId?: number; - // 广告类型 - adType?: string; - // 广告类型 - type?: string; - // 广告位名称 - name?: string; - // 宽 - width?: string; - // 高 - height?: string; - // 广告图片 - images?: string; - // 图片列表 - imageList?: any[]; - // 路由/链接地址 - path?: string; - // 用户ID - userId?: number; - // 页面ID - pageId?: number; - // 页面名称 - pageName?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - merchantId?: number; - // 图片数组 - imgArr?: any[]; -} - -/** - * 广告位搜索条件 - */ -export interface CmsAdParam extends PageParam { - adId?: number; - adType?: string; - pageId?: number; - pageName?: string; - status?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsAdRecord/index.ts b/src_bak/api/cms/cmsAdRecord/index.ts deleted file mode 100644 index 55c042b..0000000 --- a/src_bak/api/cms/cmsAdRecord/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsAdRecord, CmsAdRecordParam } from './model'; - - -/** - * 分页查询广告图片 - */ -export async function pageCmsAdRecord(params: CmsAdRecordParam) { - const res = await request.get>>( - '/cms/cms-ad-record/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询广告图片列表 - */ -export async function listCmsAdRecord(params?: CmsAdRecordParam) { - const res = await request.get>( - '/cms/cms-ad-record', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加广告图片 - */ -export async function addCmsAdRecord(data: CmsAdRecord) { - const res = await request.post>( - '/cms/cms-ad-record', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改广告图片 - */ -export async function updateCmsAdRecord(data: CmsAdRecord) { - const res = await request.put>( - '/cms/cms-ad-record', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除广告图片 - */ -export async function removeCmsAdRecord(id?: number) { - const res = await request.del>( - '/cms/cms-ad-record/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除广告图片 - */ -export async function removeBatchCmsAdRecord(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-ad-record/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询广告图片 - */ -export async function getCmsAdRecord(id: number) { - const res = await request.get>( - '/cms/cms-ad-record/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsAdRecord/model/index.ts b/src_bak/api/cms/cmsAdRecord/model/index.ts deleted file mode 100644 index 0ecf5d1..0000000 --- a/src_bak/api/cms/cmsAdRecord/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 广告图片 - */ -export interface CmsAdRecord { - // ID - adRecordId?: number; - // 广告标题 - title?: string; - // 图片地址 - path?: string; - // 链接地址 - url?: string; - // 广告位ID - adId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 广告图片搜索条件 - */ -export interface CmsAdRecordParam extends PageParam { - adRecordId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsArticle/index.ts b/src_bak/api/cms/cmsArticle/index.ts deleted file mode 100644 index 608c0e5..0000000 --- a/src_bak/api/cms/cmsArticle/index.ts +++ /dev/null @@ -1,218 +0,0 @@ -import request from '@/utils/request'; -import type {ApiResult, PageResult} from '@/api'; -import type {CmsArticle, CmsArticleParam} from './model'; - -/** - * 分页查询文章 - */ -export async function pageCmsArticle(params: CmsArticleParam) { - const res = await request.get>>( - '/cms/cms-article/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询文章列表 - */ -export async function listCmsArticle(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加文章 - */ -export async function addCmsArticle(data: CmsArticle) { - const res = await request.post>( - '/cms/cms-article', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改文章 - */ -export async function updateCmsArticle(data: CmsArticle) { - const res = await request.put>( - '/cms/cms-article', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除文章 - */ -export async function removeCmsArticle(id?: number) { - const res = await request.del>( - '/cms/cms-article/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除文章 - */ -export async function removeBatchCmsArticle(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-article/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询文章 - */ -export async function getCmsArticle(id: number) { - const res = await request.get>( - '/cms/cms-article/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function getCount(params?: CmsArticleParam) { - const res = await request.get>('/cms/cms-article/data', { - params - }); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 上一篇 - * @param params - */ -export async function getPrevious(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article/getPrevious/' + params?.articleId, - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 下一篇 - * @param params - */ -export async function getNext(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article/getNext/' + params?.articleId, - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 验证文章密码 - * @param params - */ -export async function checkArticlePassword(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article/checkArticlePassword', - { - params - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -export async function findTags(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article/findTags', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function pageTags(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article/pageTags', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 按IDS查询文章 - * @param params - */ -export async function getByIds(params?: CmsArticleParam) { - const res = await request.get>( - '/cms/cms-article/getByIds', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据code查询文章 - */ -export async function getByCode(code: string) { - const res = await request.get>( - '/cms/cms-article/getByCode/' + code - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsArticle/model/index.ts b/src_bak/api/cms/cmsArticle/model/index.ts deleted file mode 100644 index 5206b48..0000000 --- a/src_bak/api/cms/cmsArticle/model/index.ts +++ /dev/null @@ -1,132 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 文章 - */ -export interface CmsArticle { - // 文章ID - articleId?: number; - // 文章标题 - title?: string; - // 文章类型 0常规 1视频 - type?: number; - // 文章模型 - model?: string; - // 文章详情页模板 - detail?: string; - // banner图片 - banner?: string; - // 列表显示方式(10小图展示 20大图展示) - showType?: number; - // 话题 - topic?: string; - // 标签 - tags?: any; - // 栏目ID - categoryId?: number; - // 栏目名称 - categoryName?: string; - // 封面图 - image?: string; - // 价格 - price?: number; - startTime?: any; - endTime?: any; - // 缩列图 - thumbnail?: string; - // 来源 - source?: string; - // 产品概述 - overview?: string; - // 虚拟阅读量(仅用作展示) - virtualViews?: number; - // 实际阅读量 - actualViews?: number; - // 购买人数 - bmUsers?: number; - // 浏览权限(0公开 1会员 2密码) - permission?: number; - // 访问密码 - password?: string; - // 确认密码 - password2?: string; - // 发布来源客户端 (APP、H5、小程序等) - platform?: string; - // 文章附件 - files?: string; - // 视频地址 - video?: string; - // 接受的文件类型 - accept?: string; - // 经度 - longitude?: string; - // 纬度 - latitude?: string; - // 所在省份 - province?: string; - // 所在城市 - city?: string; - // 所在辖区 - region?: string; - // 街道地址 - address?: string; - // 点赞数 - likes?: number; - // pdf地址 - pdfUrl?: string; - // 评论数 - commentNumbers?: number; - // 提醒谁看 - toUsers?: string; - // 文章内容 - content?: string; - // 是否推荐 - recommend?: number; - // 用户ID - userId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0已发布, 1待审核 2已驳回 3违规内容 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 父级id - parentId?: number; - nickname?: string; - username?: string; - author?: string; - shopId?: number; - tenantName?: string; - logo?: string; - fileList?: any; - // 编辑器类型 - editor?: number; -} - -/** - * 文章搜索条件 - */ -export interface CmsArticleParam extends PageParam { - articleId?: number; - articleIds?: string; - categoryId?: number; - parentId?: number; - status?: number; - // 是否推荐 - recommend?: number; - keywords?: string; - // 验证密码 - password?: string; - password2?: string; - tags?: string; - detail?: string; - sceneType?: string; -} diff --git a/src_bak/api/cms/cmsArticleCategory/index.ts b/src_bak/api/cms/cmsArticleCategory/index.ts deleted file mode 100644 index ba607c1..0000000 --- a/src_bak/api/cms/cmsArticleCategory/index.ts +++ /dev/null @@ -1,108 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsArticleCategory, CmsArticleCategoryParam } from './model'; - - -/** - * 分页查询文章分类表 - */ -export async function pageCmsArticleCategory(params: CmsArticleCategoryParam) { - const res = await request.get>>( - '/cms/cms-article-category/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询文章分类表列表 - */ -export async function listCmsArticleCategory(params?: CmsArticleCategoryParam) { - const res = await request.get>( - '/cms/cms-article-category', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加文章分类表 - */ -export async function addCmsArticleCategory(data: CmsArticleCategory) { - const res = await request.post>( - '/cms/cms-article-category', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改文章分类表 - */ -export async function updateCmsArticleCategory(data: CmsArticleCategory) { - const res = await request.put>( - '/cms/cms-article-category', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除文章分类表 - */ -export async function removeCmsArticleCategory(id?: number) { - const res = await request.del>( - '/cms/cms-article-category/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除文章分类表 - */ -export async function removeBatchCmsArticleCategory( - data: (number | undefined)[] -) { - const res = await request.del>( - '/cms/cms-article-category/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询文章分类表 - */ -export async function getCmsArticleCategory(id: number) { - const res = await request.get>( - '/cms/cms-article-category/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsArticleCategory/model/index.ts b/src_bak/api/cms/cmsArticleCategory/model/index.ts deleted file mode 100644 index 4270213..0000000 --- a/src_bak/api/cms/cmsArticleCategory/model/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 文章分类表 - */ -export interface CmsArticleCategory { - // 文章分类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; - value?: number; - label?: string; -} - -/** - * 文章分类表搜索条件 - */ -export interface CmsArticleCategoryParam extends PageParam { - categoryId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsArticleComment/index.ts b/src_bak/api/cms/cmsArticleComment/index.ts deleted file mode 100644 index 50b9806..0000000 --- a/src_bak/api/cms/cmsArticleComment/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsArticleComment, CmsArticleCommentParam } from './model'; - - -/** - * 分页查询文章评论表 - */ -export async function pageCmsArticleComment(params: CmsArticleCommentParam) { - const res = await request.get>>( - '/cms/cms-article-comment/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询文章评论表列表 - */ -export async function listCmsArticleComment(params?: CmsArticleCommentParam) { - const res = await request.get>( - '/cms/cms-article-comment', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加文章评论表 - */ -export async function addCmsArticleComment(data: CmsArticleComment) { - const res = await request.post>( - '/cms/cms-article-comment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改文章评论表 - */ -export async function updateCmsArticleComment(data: CmsArticleComment) { - const res = await request.put>( - '/cms/cms-article-comment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除文章评论表 - */ -export async function removeCmsArticleComment(id?: number) { - const res = await request.del>( - '/cms/cms-article-comment/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除文章评论表 - */ -export async function removeBatchCmsArticleComment(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-article-comment/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询文章评论表 - */ -export async function getCmsArticleComment(id: number) { - const res = await request.get>( - '/cms/cms-article-comment/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsArticleComment/model/index.ts b/src_bak/api/cms/cmsArticleComment/model/index.ts deleted file mode 100644 index 2490228..0000000 --- a/src_bak/api/cms/cmsArticleComment/model/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -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/src_bak/api/cms/cmsArticleContent/index.ts b/src_bak/api/cms/cmsArticleContent/index.ts deleted file mode 100644 index 8c3ca00..0000000 --- a/src_bak/api/cms/cmsArticleContent/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsArticleContent, CmsArticleContentParam } from './model'; - - -/** - * 分页查询文章记录表 - */ -export async function pageCmsArticleContent(params: CmsArticleContentParam) { - const res = await request.get>>( - '/cms/cms-article-content/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询文章记录表列表 - */ -export async function listCmsArticleContent(params?: CmsArticleContentParam) { - const res = await request.get>( - '/cms/cms-article-content', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加文章记录表 - */ -export async function addCmsArticleContent(data: CmsArticleContent) { - const res = await request.post>( - '/cms/cms-article-content', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改文章记录表 - */ -export async function updateCmsArticleContent(data: CmsArticleContent) { - const res = await request.put>( - '/cms/cms-article-content', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除文章记录表 - */ -export async function removeCmsArticleContent(id?: number) { - const res = await request.del>( - '/cms/cms-article-content/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除文章记录表 - */ -export async function removeBatchCmsArticleContent(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-article-content/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询文章记录表 - */ -export async function getCmsArticleContent(id: number) { - const res = await request.get>( - '/cms/cms-article-content/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsArticleContent/model/index.ts b/src_bak/api/cms/cmsArticleContent/model/index.ts deleted file mode 100644 index 432c376..0000000 --- a/src_bak/api/cms/cmsArticleContent/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 文章记录表 - */ -export interface CmsArticleContent { - // - id?: number; - // 文章ID - articleId?: number; - // 文章内容 - content?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 文章记录表搜索条件 - */ -export interface CmsArticleContentParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsArticleCount/index.ts b/src_bak/api/cms/cmsArticleCount/index.ts deleted file mode 100644 index fc02eb1..0000000 --- a/src_bak/api/cms/cmsArticleCount/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsArticleCount, CmsArticleCountParam } from './model'; - - -/** - * 分页查询点赞文章 - */ -export async function pageCmsArticleCount(params: CmsArticleCountParam) { - const res = await request.get>>( - '/cms/cms-article-count/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询点赞文章列表 - */ -export async function listCmsArticleCount(params?: CmsArticleCountParam) { - const res = await request.get>( - '/cms/cms-article-count', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加点赞文章 - */ -export async function addCmsArticleCount(data: CmsArticleCount) { - const res = await request.post>( - '/cms/cms-article-count', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改点赞文章 - */ -export async function updateCmsArticleCount(data: CmsArticleCount) { - const res = await request.put>( - '/cms/cms-article-count', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除点赞文章 - */ -export async function removeCmsArticleCount(id?: number) { - const res = await request.del>( - '/cms/cms-article-count/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除点赞文章 - */ -export async function removeBatchCmsArticleCount(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-article-count/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询点赞文章 - */ -export async function getCmsArticleCount(id: number) { - const res = await request.get>( - '/cms/cms-article-count/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsArticleCount/model/index.ts b/src_bak/api/cms/cmsArticleCount/model/index.ts deleted file mode 100644 index 9cfbc24..0000000 --- a/src_bak/api/cms/cmsArticleCount/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 点赞文章 - */ -export interface CmsArticleCount { - // 主键ID - id?: number; - // 文章ID - articleId?: number; - // 用户ID - userId?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 点赞文章搜索条件 - */ -export interface CmsArticleCountParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsArticleLike/index.ts b/src_bak/api/cms/cmsArticleLike/index.ts deleted file mode 100644 index eca990c..0000000 --- a/src_bak/api/cms/cmsArticleLike/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsArticleLike, CmsArticleLikeParam } from './model'; - - -/** - * 分页查询点赞文章 - */ -export async function pageCmsArticleLike(params: CmsArticleLikeParam) { - const res = await request.get>>( - '/cms/cms-article-like/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询点赞文章列表 - */ -export async function listCmsArticleLike(params?: CmsArticleLikeParam) { - const res = await request.get>( - '/cms/cms-article-like', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加点赞文章 - */ -export async function addCmsArticleLike(data: CmsArticleLike) { - const res = await request.post>( - '/cms/cms-article-like', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改点赞文章 - */ -export async function updateCmsArticleLike(data: CmsArticleLike) { - const res = await request.put>( - '/cms/cms-article-like', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除点赞文章 - */ -export async function removeCmsArticleLike(id?: number) { - const res = await request.del>( - '/cms/cms-article-like/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除点赞文章 - */ -export async function removeBatchCmsArticleLike(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-article-like/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询点赞文章 - */ -export async function getCmsArticleLike(id: number) { - const res = await request.get>( - '/cms/cms-article-like/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsArticleLike/model/index.ts b/src_bak/api/cms/cmsArticleLike/model/index.ts deleted file mode 100644 index ccee27a..0000000 --- a/src_bak/api/cms/cmsArticleLike/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 点赞文章 - */ -export interface CmsArticleLike { - // 主键ID - id?: number; - // 文章ID - articleId?: number; - // 用户ID - userId?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 点赞文章搜索条件 - */ -export interface CmsArticleLikeParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsComponents/index.ts b/src_bak/api/cms/cmsComponents/index.ts deleted file mode 100644 index c765f33..0000000 --- a/src_bak/api/cms/cmsComponents/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsComponents, CmsComponentsParam } from './model'; - - -/** - * 分页查询组件 - */ -export async function pageCmsComponents(params: CmsComponentsParam) { - const res = await request.get>>( - '/cms/cms-components/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询组件列表 - */ -export async function listCmsComponents(params?: CmsComponentsParam) { - const res = await request.get>( - '/cms/cms-components', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加组件 - */ -export async function addCmsComponents(data: CmsComponents) { - const res = await request.post>( - '/cms/cms-components', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改组件 - */ -export async function updateCmsComponents(data: CmsComponents) { - const res = await request.put>( - '/cms/cms-components', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除组件 - */ -export async function removeCmsComponents(id?: number) { - const res = await request.del>( - '/cms/cms-components/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除组件 - */ -export async function removeBatchCmsComponents(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-components/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询组件 - */ -export async function getCmsComponents(id: number) { - const res = await request.get>( - '/cms/cms-components/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsComponents/model/index.ts b/src_bak/api/cms/cmsComponents/model/index.ts deleted file mode 100644 index f3fc8f5..0000000 --- a/src_bak/api/cms/cmsComponents/model/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 组件 - */ -export interface CmsComponents { - // ID - id?: number; - // 组件标题 - title?: string; - // 关联导航ID - navigationId?: number; - // 组件类型 - type?: string; - // 页面关键词 - keywords?: string; - // 页面描述 - description?: string; - // 组件路径 - path?: string; - // 组件图标 - icon?: string; - // 用户ID - userId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 组件搜索条件 - */ -export interface CmsComponentsParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsDesign/index.ts b/src_bak/api/cms/cmsDesign/index.ts deleted file mode 100644 index 44696ff..0000000 --- a/src_bak/api/cms/cmsDesign/index.ts +++ /dev/null @@ -1,102 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsDesign, CmsDesignParam } from './model'; - - -/** - * 分页查询页面管理记录表 - */ -export async function pageCmsDesign(params: CmsDesignParam) { - const res = await request.get>>( - '/cms/cms-design/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询页面管理记录表列表 - */ -export async function listCmsDesign(params?: CmsDesignParam) { - const res = await request.get>( - '/cms/cms-design', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加页面管理记录表 - */ -export async function addCmsDesign(data: CmsDesign) { - const res = await request.post>( - '/cms/cms-design', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改页面管理记录表 - */ -export async function updateCmsDesign(data: CmsDesign) { - const res = await request.put>( - '/cms/cms-design', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除页面管理记录表 - */ -export async function removeCmsDesign(id?: number) { - const res = await request.del>( - '/cms/cms-design/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除页面管理记录表 - */ -export async function removeBatchCmsDesign(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-design/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询页面管理记录表 - */ -export async function getCmsDesign(id: number) { - const res = await request.get>( - '/cms/cms-design/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsDesign/model/index.ts b/src_bak/api/cms/cmsDesign/model/index.ts deleted file mode 100644 index d1a8c1c..0000000 --- a/src_bak/api/cms/cmsDesign/model/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 页面管理记录表 - */ -export interface CmsDesign { - pageId?: number; - name?: string; - keywords?: string; - description?: string; - path?: string; - component?: string; - photo?: string; - content?: string; - // 类型 - type?: string; - categoryId?: number; - // 宽 - 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; - // 关联网站导航ID - navigationId?: number; - showLayout?: boolean; - btn?: any[]; - showBanner?: boolean; - buyUrl?: string; - demoUrl?: string; - account?: string; - docUrl?: string; -} - -/** - * 页面管理记录表搜索条件 - */ -export interface CmsDesignParam extends PageParam { - pageId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsDesignRecord/index.ts b/src_bak/api/cms/cmsDesignRecord/index.ts deleted file mode 100644 index f1ea541..0000000 --- a/src_bak/api/cms/cmsDesignRecord/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsDesignRecord, CmsDesignRecordParam } from './model'; - - -/** - * 分页查询页面组件表 - */ -export async function pageCmsDesignRecord(params: CmsDesignRecordParam) { - const res = await request.get>>( - '/cms/cms-design-record/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询页面组件表列表 - */ -export async function listCmsDesignRecord(params?: CmsDesignRecordParam) { - const res = await request.get>( - '/cms/cms-design-record', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加页面组件表 - */ -export async function addCmsDesignRecord(data: CmsDesignRecord) { - const res = await request.post>( - '/cms/cms-design-record', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改页面组件表 - */ -export async function updateCmsDesignRecord(data: CmsDesignRecord) { - const res = await request.put>( - '/cms/cms-design-record', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除页面组件表 - */ -export async function removeCmsDesignRecord(id?: number) { - const res = await request.del>( - '/cms/cms-design-record/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除页面组件表 - */ -export async function removeBatchCmsDesignRecord(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-design-record/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询页面组件表 - */ -export async function getCmsDesignRecord(id: number) { - const res = await request.get>( - '/cms/cms-design-record/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsDesignRecord/model/index.ts b/src_bak/api/cms/cmsDesignRecord/model/index.ts deleted file mode 100644 index 0c6e809..0000000 --- a/src_bak/api/cms/cmsDesignRecord/model/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 页面组件表 - */ -export interface CmsDesignRecord { - // ID - id?: number; - // 关联导航ID - navigationId?: number; - parentId?: number; - pageId?: number; - // 组件 - title?: string; - // 组件标识 - dictCode?: string; - // 组件样式 - styles?: string; - // 卡片阴影显示时机 - shadow?: string; - // 页面关键词 - keywords?: string; - // 页面描述 - description?: string; - // 页面路由地址 - path?: string; - // 缩列图 - photo?: string; - // 用户ID - userId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 所属期次 - periodId?: number; -} - -/** - * 页面组件表搜索条件 - */ -export interface CmsDesignRecordParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsDocs/index.ts b/src_bak/api/cms/cmsDocs/index.ts deleted file mode 100644 index 585b1e4..0000000 --- a/src_bak/api/cms/cmsDocs/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsDocs, CmsDocsParam } from './model'; - - -/** - * 分页查询文档管理记录表 - */ -export async function pageCmsDocs(params: CmsDocsParam) { - const res = await request.get>>( - '/cms/cms-docs/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询文档管理记录表列表 - */ -export async function listCmsDocs(params?: CmsDocsParam) { - const res = await request.get>( - '/cms/cms-docs', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加文档管理记录表 - */ -export async function addCmsDocs(data: CmsDocs) { - const res = await request.post>( - '/cms/cms-docs', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改文档管理记录表 - */ -export async function updateCmsDocs(data: CmsDocs) { - const res = await request.put>( - '/cms/cms-docs', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除文档管理记录表 - */ -export async function removeCmsDocs(id?: number) { - const res = await request.del>( - '/cms/cms-docs/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除文档管理记录表 - */ -export async function removeBatchCmsDocs(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-docs/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询文档管理记录表 - */ -export async function getCmsDocs(id: number) { - const res = await request.get>( - '/cms/cms-docs/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsDocs/model/index.ts b/src_bak/api/cms/cmsDocs/model/index.ts deleted file mode 100644 index 1c8c78d..0000000 --- a/src_bak/api/cms/cmsDocs/model/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 文档管理记录表 - */ -export interface CmsDocs { - // 文档ID - docsId?: number; - // 文档标题 - title?: string; - // 上级目录 - parentId?: number; - // 书籍ID - bookId?: number; - // 可见性(public,private,protected) - visibility?: string; - // 虚拟阅读量(仅用作展示) - virtualViews?: number; - // 实际阅读量 - actualViews?: number; - // 用户ID - userId?: number; - // 备注 - comments?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 状态, 0正常, 1冻结 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 文档管理记录表搜索条件 - */ -export interface CmsDocsParam extends PageParam { - docsId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsDocsBook/index.ts b/src_bak/api/cms/cmsDocsBook/index.ts deleted file mode 100644 index 15b6766..0000000 --- a/src_bak/api/cms/cmsDocsBook/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsDocsBook, CmsDocsBookParam } from './model'; - - -/** - * 分页查询书籍记录表 - */ -export async function pageCmsDocsBook(params: CmsDocsBookParam) { - const res = await request.get>>( - '/cms/cms-docs-book/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询书籍记录表列表 - */ -export async function listCmsDocsBook(params?: CmsDocsBookParam) { - const res = await request.get>( - '/cms/cms-docs-book', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加书籍记录表 - */ -export async function addCmsDocsBook(data: CmsDocsBook) { - const res = await request.post>( - '/cms/cms-docs-book', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改书籍记录表 - */ -export async function updateCmsDocsBook(data: CmsDocsBook) { - const res = await request.put>( - '/cms/cms-docs-book', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除书籍记录表 - */ -export async function removeCmsDocsBook(id?: number) { - const res = await request.del>( - '/cms/cms-docs-book/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除书籍记录表 - */ -export async function removeBatchCmsDocsBook(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-docs-book/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询书籍记录表 - */ -export async function getCmsDocsBook(id: number) { - const res = await request.get>( - '/cms/cms-docs-book/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsDocsBook/model/index.ts b/src_bak/api/cms/cmsDocsBook/model/index.ts deleted file mode 100644 index 5e02d44..0000000 --- a/src_bak/api/cms/cmsDocsBook/model/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 书籍记录表 - */ -export interface CmsDocsBook { - // ID - bookId?: number; - // 书籍名称 - name?: string; - // 书籍标识 - code?: string; - // 封面图 - photo?: string; - // 备注 - comments?: string; - // 文档内容 - content?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 状态, 0正常, 1冻结 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 书籍记录表搜索条件 - */ -export interface CmsDocsBookParam extends PageParam { - bookId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsDocsContent/index.ts b/src_bak/api/cms/cmsDocsContent/index.ts deleted file mode 100644 index 1b64435..0000000 --- a/src_bak/api/cms/cmsDocsContent/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsDocsContent, CmsDocsContentParam } from './model'; - - -/** - * 分页查询文档内容记录表 - */ -export async function pageCmsDocsContent(params: CmsDocsContentParam) { - const res = await request.get>>( - '/cms/cms-docs-content/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询文档内容记录表列表 - */ -export async function listCmsDocsContent(params?: CmsDocsContentParam) { - const res = await request.get>( - '/cms/cms-docs-content', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加文档内容记录表 - */ -export async function addCmsDocsContent(data: CmsDocsContent) { - const res = await request.post>( - '/cms/cms-docs-content', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改文档内容记录表 - */ -export async function updateCmsDocsContent(data: CmsDocsContent) { - const res = await request.put>( - '/cms/cms-docs-content', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除文档内容记录表 - */ -export async function removeCmsDocsContent(id?: number) { - const res = await request.del>( - '/cms/cms-docs-content/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除文档内容记录表 - */ -export async function removeBatchCmsDocsContent(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-docs-content/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询文档内容记录表 - */ -export async function getCmsDocsContent(id: number) { - const res = await request.get>( - '/cms/cms-docs-content/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsDocsContent/model/index.ts b/src_bak/api/cms/cmsDocsContent/model/index.ts deleted file mode 100644 index dc06432..0000000 --- a/src_bak/api/cms/cmsDocsContent/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 文档内容记录表 - */ -export interface CmsDocsContent { - // ID - id?: number; - // 文档ID - docsId?: number; - // 文档内容 - content?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 文档内容记录表搜索条件 - */ -export interface CmsDocsContentParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsDomain/index.ts b/src_bak/api/cms/cmsDomain/index.ts deleted file mode 100644 index 748a5d5..0000000 --- a/src_bak/api/cms/cmsDomain/index.ts +++ /dev/null @@ -1,151 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsDomain, CmsDomainParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - - -/** - * 分页查询网站域名记录表 - */ -export async function pageCmsDomain(params: CmsDomainParam) { - const res = await request.get>>( - SERVER_API_URL + '/cms/cms-domain/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询网站域名记录表列表 - */ -export async function listCmsDomain(params?: CmsDomainParam) { - const res = await request.get>( - SERVER_API_URL + '/cms/cms-domain', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加网站域名记录表 - */ -export async function addCmsDomain(data: CmsDomain) { - const res = await request.post>( - SERVER_API_URL + '/cms/cms-domain', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改网站域名记录表 - */ -export async function updateCmsDomain(data: CmsDomain) { - const res = await request.post>( - SERVER_API_URL + '/cms/cms-domain/domain', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除网站域名记录表 - */ -export async function removeCmsDomain(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/cms/cms-domain/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除网站域名记录表 - */ -export async function removeBatchCmsDomain(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/cms/cms-domain/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询网站域名记录表 - */ -export async function getCmsDomain(id: number) { - const res = await request.get>( - SERVER_API_URL + '/cms/cms-domain/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 检查IP是否存在 - */ -export async function checkExistence( - field: string, - value: string, - id?: number -) { - const res = await request.get>( - SERVER_API_URL + '/cms/domain/existence', - { - params: { field, value, id } - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -export async function resolvable(id: number) { - const res = await request.get>( - SERVER_API_URL + '/cms/domain/resolvable/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function getTenantIdByDomain(params: CmsDomainParam) { - const res = await request.get>>( - SERVER_API_URL + '/cms/cms-domain/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - diff --git a/src_bak/api/cms/cmsDomain/model/index.ts b/src_bak/api/cms/cmsDomain/model/index.ts deleted file mode 100644 index 377e838..0000000 --- a/src_bak/api/cms/cmsDomain/model/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 网站域名记录表 - */ -export interface CmsDomain { - // ID - id?: number; - // 类型 0赠送域名 1绑定域名 - type?: number; - // 域名 - domain?: string; - // 主机记录 - hostName?: string; - // 记录值 - hostValue?: string; - // 状态 - status?: number; - // 排序号 - sortNumber?: number; - // 网站ID - websiteId?: number; - // 租户ID - appId?: number; - // 用户ID - userId?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 网站域名记录表搜索条件 - */ -export interface CmsDomainParam extends PageParam { - id?: number; - domain?: string; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsForm/index.ts b/src_bak/api/cms/cmsForm/index.ts deleted file mode 100644 index 19988a7..0000000 --- a/src_bak/api/cms/cmsForm/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsForm, CmsFormParam } from './model'; - - -/** - * 分页查询表单设计表 - */ -export async function pageCmsForm(params: CmsFormParam) { - const res = await request.get>>( - '/cms/cms-form/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询表单设计表列表 - */ -export async function listCmsForm(params?: CmsFormParam) { - const res = await request.get>( - '/cms/cms-form', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加表单设计表 - */ -export async function addCmsForm(data: CmsForm) { - const res = await request.post>( - '/cms/cms-form', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改表单设计表 - */ -export async function updateCmsForm(data: CmsForm) { - const res = await request.put>( - '/cms/cms-form', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除表单设计表 - */ -export async function removeCmsForm(id?: number) { - const res = await request.del>( - '/cms/cms-form/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除表单设计表 - */ -export async function removeBatchCmsForm(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-form/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询表单设计表 - */ -export async function getCmsForm(id: number) { - const res = await request.get>( - '/cms/cms-form/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsForm/model/index.ts b/src_bak/api/cms/cmsForm/model/index.ts deleted file mode 100644 index 6e43ff9..0000000 --- a/src_bak/api/cms/cmsForm/model/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 表单设计表 - */ -export interface CmsForm { - // ID - formId?: number; - // 表单标题 - name?: string; - // 顶部图片 - photo?: string; - // 背景图片 - background?: string; - // 视频文件 - video?: string; - // 提交次数 - submitNumber?: number; - // 页面布局 - layout?: string; - // 是否隐藏顶部图片 - hidePhoto?: number; - // 是否隐藏背景图片 - hideBackground?: number; - // 是否隐藏视频 - hideVideo?: number; - // 背景图片透明度 - opacity?: string; - // 用户ID - userId?: number; - // 商户ID - merchantId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 表单设计表搜索条件 - */ -export interface CmsFormParam extends PageParam { - formId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsFormRecord/index.ts b/src_bak/api/cms/cmsFormRecord/index.ts deleted file mode 100644 index 376bf44..0000000 --- a/src_bak/api/cms/cmsFormRecord/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsFormRecord, CmsFormRecordParam } from './model'; - - -/** - * 分页查询表单数据记录表 - */ -export async function pageCmsFormRecord(params: CmsFormRecordParam) { - const res = await request.get>>( - '/cms/cms-form-record/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询表单数据记录表列表 - */ -export async function listCmsFormRecord(params?: CmsFormRecordParam) { - const res = await request.get>( - '/cms/cms-form-record', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加表单数据记录表 - */ -export async function addCmsFormRecord(data: CmsFormRecord) { - const res = await request.post>( - '/cms/cms-form-record', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改表单数据记录表 - */ -export async function updateCmsFormRecord(data: CmsFormRecord) { - const res = await request.put>( - '/cms/cms-form-record', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除表单数据记录表 - */ -export async function removeCmsFormRecord(id?: number) { - const res = await request.del>( - '/cms/cms-form-record/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除表单数据记录表 - */ -export async function removeBatchCmsFormRecord(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-form-record/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询表单数据记录表 - */ -export async function getCmsFormRecord(id: number) { - const res = await request.get>( - '/cms/cms-form-record/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsFormRecord/model/index.ts b/src_bak/api/cms/cmsFormRecord/model/index.ts deleted file mode 100644 index 87624d1..0000000 --- a/src_bak/api/cms/cmsFormRecord/model/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 表单数据记录表 - */ -export interface CmsFormRecord { - // ID - formRecordId?: number; - // 手机号 - phone?: string; - // 表单数据 - formData?: string; - // 表单ID - formId?: number; - // 用户ID - userId?: number; - // 商户ID - merchantId?: number; - // 姓名 - name?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 表单数据记录表搜索条件 - */ -export interface CmsFormRecordParam extends PageParam { - formRecordId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsLang/index.ts b/src_bak/api/cms/cmsLang/index.ts deleted file mode 100644 index bda1b17..0000000 --- a/src_bak/api/cms/cmsLang/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsLang, CmsLangParam } from './model'; - -/** - * 分页查询国际化 - */ -export async function pageCmsLang(params: CmsLangParam) { - const res = await request.get>>( - '/cms/cms-lang/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询国际化列表 - */ -export async function listCmsLang(params?: CmsLangParam) { - const res = await request.get>( - '/cms/cms-lang', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加国际化 - */ -export async function addCmsLang(data: CmsLang) { - const res = await request.post>( - '/cms/cms-lang', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改国际化 - */ -export async function updateCmsLang(data: CmsLang) { - const res = await request.put>( - '/cms/cms-lang', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除国际化 - */ -export async function removeCmsLang(id?: number) { - const res = await request.del>( - '/cms/cms-lang/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除国际化 - */ -export async function removeBatchCmsLang(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-lang/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询国际化 - */ -export async function getCmsLang(id: number) { - const res = await request.get>( - '/cms/cms-lang/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsLang/model/index.ts b/src_bak/api/cms/cmsLang/model/index.ts deleted file mode 100644 index 2dae25f..0000000 --- a/src_bak/api/cms/cmsLang/model/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 国际化 - */ -export interface CmsLang { - // ID - id?: number; - // 名称 - name?: string; - // 菜单组件地址, 目录可为空 - code?: string; - // 启用语言 - lang?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 0禁用 1启用 - enable?: boolean; - // 状态, 0禁用 1启用 - status?: boolean; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 国际化搜索条件 - */ -export interface CmsLangParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsLangLog/index.ts b/src_bak/api/cms/cmsLangLog/index.ts deleted file mode 100644 index 056858b..0000000 --- a/src_bak/api/cms/cmsLangLog/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsLangLog, CmsLangLogParam } from './model'; - -/** - * 分页查询国际化记录启用 - */ -export async function pageCmsLangLog(params: CmsLangLogParam) { - const res = await request.get>>( - '/cms/cms-lang-log/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询国际化记录启用列表 - */ -export async function listCmsLangLog(params?: CmsLangLogParam) { - const res = await request.get>( - '/cms/cms-lang-log', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加国际化记录启用 - */ -export async function addCmsLangLog(data: CmsLangLog) { - const res = await request.post>( - '/cms/cms-lang-log', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改国际化记录启用 - */ -export async function updateCmsLangLog(data: CmsLangLog) { - const res = await request.put>( - '/cms/cms-lang-log', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除国际化记录启用 - */ -export async function removeCmsLangLog(id?: number) { - const res = await request.del>( - '/cms/cms-lang-log/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除国际化记录启用 - */ -export async function removeBatchCmsLangLog(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-lang-log/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询国际化记录启用 - */ -export async function getCmsLangLog(id: number) { - const res = await request.get>( - '/cms/cms-lang-log/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsLangLog/model/index.ts b/src_bak/api/cms/cmsLangLog/model/index.ts deleted file mode 100644 index 0d1cc29..0000000 --- a/src_bak/api/cms/cmsLangLog/model/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 国际化记录启用 - */ -export interface CmsLangLog { - // ID - id?: number; - // 关联ID - langId?: number; - // 编码 - code?: string; - // 名称 - lang?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 国际化记录启用搜索条件 - */ -export interface CmsLangLogParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsLink/index.ts b/src_bak/api/cms/cmsLink/index.ts deleted file mode 100644 index 1d6def0..0000000 --- a/src_bak/api/cms/cmsLink/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsLink, CmsLinkParam } from './model'; - - -/** - * 分页查询常用链接 - */ -export async function pageCmsLink(params: CmsLinkParam) { - const res = await request.get>>( - '/cms/cms-link/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询常用链接列表 - */ -export async function listCmsLink(params?: CmsLinkParam) { - const res = await request.get>( - '/cms/cms-link', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加常用链接 - */ -export async function addCmsLink(data: CmsLink) { - const res = await request.post>( - '/cms/cms-link', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改常用链接 - */ -export async function updateCmsLink(data: CmsLink) { - const res = await request.put>( - '/cms/cms-link', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除常用链接 - */ -export async function removeCmsLink(id?: number) { - const res = await request.del>( - '/cms/cms-link/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除常用链接 - */ -export async function removeBatchCmsLink(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-link/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询常用链接 - */ -export async function getCmsLink(id: number) { - const res = await request.get>( - '/cms/cms-link/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsLink/model/index.ts b/src_bak/api/cms/cmsLink/model/index.ts deleted file mode 100644 index 1258a5c..0000000 --- a/src_bak/api/cms/cmsLink/model/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 常用链接 - */ -export interface CmsLink { - // 自增ID - id?: number; - // 链接名称 - name?: string; - // 图标 - icon?: string; - // 链接地址 - url?: string; - // 链接分类 - linkType?: string; - // 应用ID - appId?: 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 CmsLinkParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsModel/index.ts b/src_bak/api/cms/cmsModel/index.ts deleted file mode 100644 index 77bee6d..0000000 --- a/src_bak/api/cms/cmsModel/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsModel, CmsModelParam } from './model'; - - -/** - * 分页查询模型 - */ -export async function pageCmsModel(params: CmsModelParam) { - const res = await request.get>>( - '/cms/cms-model/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询模型列表 - */ -export async function listCmsModel(params?: CmsModelParam) { - const res = await request.get>( - '/cms/cms-model', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加模型 - */ -export async function addCmsModel(data: CmsModel) { - const res = await request.post>( - '/cms/cms-model', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改模型 - */ -export async function updateCmsModel(data: CmsModel) { - const res = await request.put>( - '/cms/cms-model', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除模型 - */ -export async function removeCmsModel(id?: number) { - const res = await request.del>( - '/cms/cms-model/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除模型 - */ -export async function removeBatchCmsModel(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-model/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询模型 - */ -export async function getCmsModel(id: number) { - const res = await request.get>( - '/cms/cms-model/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsModel/model/index.ts b/src_bak/api/cms/cmsModel/model/index.ts deleted file mode 100644 index 4c1c7f7..0000000 --- a/src_bak/api/cms/cmsModel/model/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 模型 - */ -export interface CmsModel { - // ID - modelId?: number; - // 模型名称 - name?: string; - // 唯一标识 - model?: string; - // 菜单路由地址 - path?: string; - // 菜单组件地址, 目录可为空 - component?: string; - // 模型banner图片 - banner?: string; - // 缩列图 - thumb?: string; - // 封面图宽 - imageWidth?: string; - // 封面图高 - imageHeight?: string; - // 样式 - style?: string; - // Banner上的标题 - title?: string; - // Banner上的描述 - desc?: string; - // 列表显示方式(10小图展示 20大图展示) - showType?: number; - // 用户ID - userId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0已发布, 1待审核 2已驳回 3违规内容 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 模型搜索条件 - */ -export interface CmsModelParam extends PageParam { - modelId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsMp/index.ts b/src_bak/api/cms/cmsMp/index.ts deleted file mode 100644 index 4004efe..0000000 --- a/src_bak/api/cms/cmsMp/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsMp, CmsMpParam } from './model'; - - -/** - * 分页查询小程序信息 - */ -export async function pageCmsMp(params: CmsMpParam) { - const res = await request.get>>( - '/cms/cms-mp/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询小程序信息列表 - */ -export async function listCmsMp(params?: CmsMpParam) { - const res = await request.get>( - '/cms/cms-mp', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加小程序信息 - */ -export async function addCmsMp(data: CmsMp) { - const res = await request.post>( - '/cms/cms-mp', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改小程序信息 - */ -export async function updateCmsMp(data: CmsMp) { - const res = await request.put>( - '/cms/cms-mp', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除小程序信息 - */ -export async function removeCmsMp(id?: number) { - const res = await request.del>( - '/cms/cms-mp/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除小程序信息 - */ -export async function removeBatchCmsMp(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-mp/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询小程序信息 - */ -export async function getCmsMp(id: number) { - const res = await request.get>( - '/cms/cms-mp/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsMp/model/index.ts b/src_bak/api/cms/cmsMp/model/index.ts deleted file mode 100644 index b3eafe1..0000000 --- a/src_bak/api/cms/cmsMp/model/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 小程序信息 - */ -export interface CmsMp { - // ID - mpId?: number; - // 是否主账号 - type?: number; - // 小程序ID - appId?: string; - // 小程序密钥 - appSecret?: string; - // 小程序名称 - 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 CmsMpParam extends PageParam { - mpId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsMpAd/index.ts b/src_bak/api/cms/cmsMpAd/index.ts deleted file mode 100644 index 563d06c..0000000 --- a/src_bak/api/cms/cmsMpAd/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsMpAd, CmsMpAdParam } from './model'; - - -/** - * 分页查询小程序广告位 - */ -export async function pageCmsMpAd(params: CmsMpAdParam) { - const res = await request.get>>( - '/cms/cms-mp-ad/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询小程序广告位列表 - */ -export async function listCmsMpAd(params?: CmsMpAdParam) { - const res = await request.get>( - '/cms/cms-mp-ad', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加小程序广告位 - */ -export async function addCmsMpAd(data: CmsMpAd) { - const res = await request.post>( - '/cms/cms-mp-ad', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改小程序广告位 - */ -export async function updateCmsMpAd(data: CmsMpAd) { - const res = await request.put>( - '/cms/cms-mp-ad', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除小程序广告位 - */ -export async function removeCmsMpAd(id?: number) { - const res = await request.del>( - '/cms/cms-mp-ad/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除小程序广告位 - */ -export async function removeBatchCmsMpAd(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-mp-ad/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询小程序广告位 - */ -export async function getCmsMpAd(id: number) { - const res = await request.get>( - '/cms/cms-mp-ad/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsMpAd/model/index.ts b/src_bak/api/cms/cmsMpAd/model/index.ts deleted file mode 100644 index 3d061d6..0000000 --- a/src_bak/api/cms/cmsMpAd/model/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 小程序广告位 - */ -export interface CmsMpAd { - // ID - adId?: number; - // 页面ID - pageId?: number; - // 广告类型 - adType?: string; - // 广告位名称 - name?: string; - // 宽 - width?: string; - // 高 - height?: string; - // 广告图片 - images?: string; - // 路由/链接地址 - path?: string; - // 页面名称 - pageName?: string; - // 用户ID - userId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 小程序广告位搜索条件 - */ -export interface CmsMpAdParam extends PageParam { - adId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsMpField/index.ts b/src_bak/api/cms/cmsMpField/index.ts deleted file mode 100644 index 1eb216b..0000000 --- a/src_bak/api/cms/cmsMpField/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsMpField, CmsMpFieldParam } from './model'; - - -/** - * 分页查询小程序配置 - */ -export async function pageCmsMpField(params: CmsMpFieldParam) { - const res = await request.get>>( - '/cms/cms-mp-field/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询小程序配置列表 - */ -export async function listCmsMpField(params?: CmsMpFieldParam) { - const res = await request.get>( - '/cms/cms-mp-field', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加小程序配置 - */ -export async function addCmsMpField(data: CmsMpField) { - const res = await request.post>( - '/cms/cms-mp-field', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改小程序配置 - */ -export async function updateCmsMpField(data: CmsMpField) { - const res = await request.put>( - '/cms/cms-mp-field', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除小程序配置 - */ -export async function removeCmsMpField(id?: number) { - const res = await request.del>( - '/cms/cms-mp-field/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除小程序配置 - */ -export async function removeBatchCmsMpField(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-mp-field/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询小程序配置 - */ -export async function getCmsMpField(id: number) { - const res = await request.get>( - '/cms/cms-mp-field/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsMpField/model/index.ts b/src_bak/api/cms/cmsMpField/model/index.ts deleted file mode 100644 index f573edb..0000000 --- a/src_bak/api/cms/cmsMpField/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 小程序配置 - */ -export interface CmsMpField { - // 自增ID - id?: number; - // 类型,0文本 1图片 2其他 - type?: number; - // 名称 - name?: string; - // 备注 - comments?: string; - // 名称 - value?: string; - // 页面ID - pageId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 小程序配置搜索条件 - */ -export interface CmsMpFieldParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsMpMenu/index.ts b/src_bak/api/cms/cmsMpMenu/index.ts deleted file mode 100644 index 91554af..0000000 --- a/src_bak/api/cms/cmsMpMenu/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsMpMenu, CmsMpMenuParam } from './model'; - - -/** - * 分页查询小程序端菜单 - */ -export async function pageCmsMpMenu(params: CmsMpMenuParam) { - const res = await request.get>>( - '/cms/cms-mp-menu/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询小程序端菜单列表 - */ -export async function listCmsMpMenu(params?: CmsMpMenuParam) { - const res = await request.get>( - '/cms/cms-mp-menu', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加小程序端菜单 - */ -export async function addCmsMpMenu(data: CmsMpMenu) { - const res = await request.post>( - '/cms/cms-mp-menu', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改小程序端菜单 - */ -export async function updateCmsMpMenu(data: CmsMpMenu) { - const res = await request.put>( - '/cms/cms-mp-menu', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除小程序端菜单 - */ -export async function removeCmsMpMenu(id?: number) { - const res = await request.del>( - '/cms/cms-mp-menu/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除小程序端菜单 - */ -export async function removeBatchCmsMpMenu(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-mp-menu/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询小程序端菜单 - */ -export async function getCmsMpMenu(id: number) { - const res = await request.get>( - '/cms/cms-mp-menu/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsMpMenu/model/index.ts b/src_bak/api/cms/cmsMpMenu/model/index.ts deleted file mode 100644 index 7019e58..0000000 --- a/src_bak/api/cms/cmsMpMenu/model/index.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 小程序端菜单 - */ -export interface CmsMpMenu { - // ID - menuId?: number; - // 上级id, 0是顶级 - parentId?: number; - // 菜单名称 - title?: string; - // 类型 0功能图标 1订单状态图标 2首页导航图标 3 商城导航图标 4管理人员功能图标 - type?: number; - // 是否微信小程序菜单 - isMpWeixin?: string; - // 菜单路由地址 - path?: string; - // 菜单组件地址, 目录可为空 - component?: string; - // 打开位置 - target?: string; - // 菜单图标 - avatar?: string; - // 图标颜色 - color?: string; - // 上传图标 - icon?: string; - // 是否隐藏, 0否, 1是(仅注册路由不显示在左侧菜单) - hide?: number; - // 位置 0不限 1顶部 2底部 - position?: number; - // 0 第一行 1第二行 - rows?: 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; - // 分组名称 - groupName?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 小程序端菜单搜索条件 - */ -export interface CmsMpMenuParam extends PageParam { - menuId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsMpPages/index.ts b/src_bak/api/cms/cmsMpPages/index.ts deleted file mode 100644 index da3fd65..0000000 --- a/src_bak/api/cms/cmsMpPages/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsMpPages, CmsMpPagesParam } from './model'; - - -/** - * 分页查询小程序页面 - */ -export async function pageCmsMpPages(params: CmsMpPagesParam) { - const res = await request.get>>( - '/cms/cms-mp-pages/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询小程序页面列表 - */ -export async function listCmsMpPages(params?: CmsMpPagesParam) { - const res = await request.get>( - '/cms/cms-mp-pages', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加小程序页面 - */ -export async function addCmsMpPages(data: CmsMpPages) { - const res = await request.post>( - '/cms/cms-mp-pages', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改小程序页面 - */ -export async function updateCmsMpPages(data: CmsMpPages) { - const res = await request.put>( - '/cms/cms-mp-pages', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除小程序页面 - */ -export async function removeCmsMpPages(id?: number) { - const res = await request.del>( - '/cms/cms-mp-pages/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除小程序页面 - */ -export async function removeBatchCmsMpPages(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-mp-pages/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询小程序页面 - */ -export async function getCmsMpPages(id: number) { - const res = await request.get>( - '/cms/cms-mp-pages/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsMpPages/model/index.ts b/src_bak/api/cms/cmsMpPages/model/index.ts deleted file mode 100644 index 8b08ae1..0000000 --- a/src_bak/api/cms/cmsMpPages/model/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 小程序页面 - */ -export interface CmsMpPages { - // 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; -} - -/** - * 小程序页面搜索条件 - */ -export interface CmsMpPagesParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsNavigation/index.ts b/src_bak/api/cms/cmsNavigation/index.ts deleted file mode 100644 index 7eb316f..0000000 --- a/src_bak/api/cms/cmsNavigation/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsNavigation, CmsNavigationParam } from './model'; - -/** - * 分页查询网站导航记录表 - */ -export async function pageCmsNavigation(params: CmsNavigationParam) { - const res = await request.get>>( - '/cms/cms-navigation/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询网站导航记录表列表 - */ -export async function listCmsNavigation(params?: CmsNavigationParam) { - const res = await request.get>( - '/cms/cms-navigation', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询导航列表(树形结构) - */ -export async function treeNavigation(params?: CmsNavigationParam) { - const res = await request.get>( - '/cms/cms-navigation/tree', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} -/** - * 添加网站导航记录表 - */ -export async function addCmsNavigation(data: CmsNavigation) { - const res = await request.post>( - '/cms/cms-navigation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改网站导航记录表 - */ -export async function updateCmsNavigation(data: CmsNavigation) { - const res = await request.put>( - '/cms/cms-navigation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除网站导航记录表 - */ -export async function removeCmsNavigation(id?: number) { - const res = await request.del>( - '/cms/cms-navigation/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除网站导航记录表 - */ -export async function removeBatchCmsNavigation(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-navigation/batch', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询网站导航记录表 - */ -export async function getCmsNavigation(id: number) { - const res = await request.get>( - '/cms/cms-navigation/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function getNavigationByPath(params: CmsNavigationParam) { - const res = await request.get>( - '/cms/cms-navigation/getNavigationByPath', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - - -/** - * 根据code查询导航 - */ -export async function getByCode(code: string) { - const res = await request.get>( - '/cms/cms-navigation/getByCode/' + code - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - diff --git a/src_bak/api/cms/cmsNavigation/model/index.ts b/src_bak/api/cms/cmsNavigation/model/index.ts deleted file mode 100644 index cdd4f0c..0000000 --- a/src_bak/api/cms/cmsNavigation/model/index.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type {PageParam} from '@/api/index'; -import type {CmsDesign} from "@/api/cms/cmsDesign/model"; -import type {CmsModel} from "@/api/cms/cmsModel/model"; -import {CmsArticle} from "@/api/cms/cmsArticle/model"; - -/** - * 网站导航记录表 - */ -export interface CmsNavigation { - // ID - navigationId?: number; - // 上级id, 0是顶级 - parentId?: number; - // 菜单名称 - title?: string; - // 模型 - model?: string; - // 标识 - code?: string; - // 菜单路由地址 - path?: string; - // 菜单组件地址, 目录可为空 - component?: string; - // 组件路径 - componentPath?: string; - // 打开位置 - target?: string; - // 菜单图标 - icon?: string; - // banner图片 - banner?: string; - // 图标颜色 - color?: string; - // 是否隐藏, 0否, 1是(仅注册路由不显示在左侧菜单) - hide?: number; - // 可见类型 0所有人 1登录可见 2密码可见 - permission?: number; - // 访问密码 - password?: string; - // 位置 0不限 1顶部 2底部 - position?: number; - // 仅在顶部显示 - top?: number; - // 仅在底部显示 - bottom?: number; - // 菜单侧栏选中的path - active?: string; - // 其它路由元信息 - meta?: string; - // css样式 - style?: string; - // 父级栏目路由 - parentPath?: string; - // 父级栏目名称 - parentName?: string; - // 模型名称 - modelName?: string; - // 类型(模型) - type?: string; - // 绑定的页面(已废弃) - pageId?: number; - // 项目ID - itemId?: number; - // 是否微信小程序菜单 - isMpWeixin?: string; - // 用户ID - userId?: number; - // 设为首页 - home?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 是否删除, 0否, 1是 - deleted?: number; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 父级栏目 - parent?: CmsNavigation; - // 子级栏目 - children?: CmsNavigation[]; - // 模型信息 - modelInfo?: CmsModel; - // 栏目名称 - categoryName?: string; - // 是否禁用 - disabled?: boolean; - // 链接地址 - design?: CmsDesign; - // 子级数量 - childHeight?: number, - // 是否展开 - showChild?: boolean - // 布局 - layout?: any; - // 标题 - label?: string; - // 值 - value?: number; - // 文章列表 - articles?: CmsArticle[]; -} - -/** - * 网站导航记录表搜索条件 - */ -export interface CmsNavigationParam extends PageParam { - navigationId?: number; - parentId?: number; - hide?: number; - model?: string; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsOrder/index.ts b/src_bak/api/cms/cmsOrder/index.ts deleted file mode 100644 index 8224ddd..0000000 --- a/src_bak/api/cms/cmsOrder/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsOrder, CmsOrderParam } from './model'; - - -/** - * 分页查询订单 - */ -export async function pageCmsOrder(params: CmsOrderParam) { - const res = await request.get>>( - '/cms/cms-order/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询订单列表 - */ -export async function listCmsOrder(params?: CmsOrderParam) { - const res = await request.get>( - '/cms/cms-order', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加订单 - */ -export async function addCmsOrder(data: CmsOrder) { - const res = await request.post>( - '/cms/cms-order', - data - ); - if (res.code === 0) { - return res; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改订单 - */ -export async function updateCmsOrder(data: CmsOrder) { - const res = await request.put>( - '/cms/cms-order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除订单 - */ -export async function removeCmsOrder(id?: number) { - const res = await request.del>( - '/cms/cms-order/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除订单 - */ -export async function removeBatchCmsOrder(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-order/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询订单 - */ -export async function getCmsOrder(id: number) { - const res = await request.get>( - '/cms/cms-order/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsOrder/model/index.ts b/src_bak/api/cms/cmsOrder/model/index.ts deleted file mode 100644 index bde0439..0000000 --- a/src_bak/api/cms/cmsOrder/model/index.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 订单 - */ -export interface CmsOrder { - // 订单号 - orderId?: number; - // 关联模型 - model?: string; - // 订单标题 - title?: string; - // 订单编号 - orderNo?: string; - // 订单类型,0商城 1询价 2留言 - type?: number; - // 关联文章ID - articleId?: number; - // 真实姓名 - realName?: string; - // 手机号码 - phone?: string; - // 电子邮箱 - email?: string; - // 收货地址 - address?: string; - // 订单内容 - content?: string; - // 订单总额 - totalPrice?: string; - // 实际付款 - payPrice?: string; - // 报价询价 - price?: string; - // 购买数量 - totalNum?: number; - // 二维码地址,保存订单号,支付成功后才生成 - qrcode?: string; - // 下单渠道,0网站 1小程序 2其他 - channel?: number; - // 过期时间 - expirationTime?: string; - // 订单是否已结算(0未结算 1已结算) - isSettled?: number; - // 用户id - userId?: number; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 图像验证码 - code?: string; - // 图像验证码内容 - text?: string; -} - -/** - * 订单搜索条件 - */ -export interface CmsOrderParam extends PageParam { - orderId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsSpec/index.ts b/src_bak/api/cms/cmsSpec/index.ts deleted file mode 100644 index 145b031..0000000 --- a/src_bak/api/cms/cmsSpec/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsSpec, CmsSpecParam } from './model'; - - -/** - * 分页查询规格 - */ -export async function pageCmsSpec(params: CmsSpecParam) { - const res = await request.get>>( - '/cms/cms-spec/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询规格列表 - */ -export async function listCmsSpec(params?: CmsSpecParam) { - const res = await request.get>( - '/cms/cms-spec', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加规格 - */ -export async function addCmsSpec(data: CmsSpec) { - const res = await request.post>( - '/cms/cms-spec', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改规格 - */ -export async function updateCmsSpec(data: CmsSpec) { - const res = await request.put>( - '/cms/cms-spec', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除规格 - */ -export async function removeCmsSpec(id?: number) { - const res = await request.del>( - '/cms/cms-spec/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除规格 - */ -export async function removeBatchCmsSpec(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-spec/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询规格 - */ -export async function getCmsSpec(id: number) { - const res = await request.get>( - '/cms/cms-spec/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsSpec/model/index.ts b/src_bak/api/cms/cmsSpec/model/index.ts deleted file mode 100644 index 3a7913a..0000000 --- a/src_bak/api/cms/cmsSpec/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 规格 - */ -export interface CmsSpec { - // 规格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 CmsSpecParam extends PageParam { - specId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsSpecValue/index.ts b/src_bak/api/cms/cmsSpecValue/index.ts deleted file mode 100644 index 0983b22..0000000 --- a/src_bak/api/cms/cmsSpecValue/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsSpecValue, CmsSpecValueParam } from './model'; - - -/** - * 分页查询规格值 - */ -export async function pageCmsSpecValue(params: CmsSpecValueParam) { - const res = await request.get>>( - '/cms/cms-spec-value/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询规格值列表 - */ -export async function listCmsSpecValue(params?: CmsSpecValueParam) { - const res = await request.get>( - '/cms/cms-spec-value', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加规格值 - */ -export async function addCmsSpecValue(data: CmsSpecValue) { - const res = await request.post>( - '/cms/cms-spec-value', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改规格值 - */ -export async function updateCmsSpecValue(data: CmsSpecValue) { - const res = await request.put>( - '/cms/cms-spec-value', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除规格值 - */ -export async function removeCmsSpecValue(id?: number) { - const res = await request.del>( - '/cms/cms-spec-value/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除规格值 - */ -export async function removeBatchCmsSpecValue(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-spec-value/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询规格值 - */ -export async function getCmsSpecValue(id: number) { - const res = await request.get>( - '/cms/cms-spec-value/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsSpecValue/model/index.ts b/src_bak/api/cms/cmsSpecValue/model/index.ts deleted file mode 100644 index 697279d..0000000 --- a/src_bak/api/cms/cmsSpecValue/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 规格值 - */ -export interface CmsSpecValue { - // 规格值ID - specValueId?: number; - // 规格组ID - specId?: number; - // 规格值 - specValue?: string; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 规格值搜索条件 - */ -export interface CmsSpecValueParam extends PageParam { - specValueId?: number; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsWebsite/index.ts b/src_bak/api/cms/cmsWebsite/index.ts deleted file mode 100644 index 0679bcf..0000000 --- a/src_bak/api/cms/cmsWebsite/index.ts +++ /dev/null @@ -1,147 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CmsWebsite, CmsWebsiteParam } from './model'; - - -/** - * 分页查询网站信息记录表 - */ -export async function pageCmsWebsite(params: CmsWebsiteParam) { - const res = await request.get>>( - '/cms/cms-website/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询网站 - */ -export async function getCmsWebsiteAll(id: number) { - const res = await request.get>( - '/cms/cms-website/getAll/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询网站信息记录表列表 - */ -export async function listCmsWebsite(params?: CmsWebsiteParam) { - const res = await request.get>( - '/cms/cms-website', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加网站信息记录表 - */ -export async function addCmsWebsite(data: CmsWebsite) { - const res = await request.post>( - '/cms/cms-website', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改网站信息记录表 - */ -export async function updateCmsWebsite(data: CmsWebsite) { - const res = await request.put>( - '/cms/cms-website', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除网站信息记录表 - */ -export async function removeCmsWebsite(id?: number) { - const res = await request.del>( - '/cms/cms-website/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除网站信息记录表 - */ -export async function removeBatchCmsWebsite(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-website/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询网站信息记录表 - */ -export async function getCmsWebsite(id: number) { - const res = await request.get>( - '/cms/cms-website/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 清除缓存 - */ -export async function removeSiteInfoCache(key?: string) { - const res = await request.del>( - '/cms/cms-website/clearSiteInfo/' + key - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 分页查询网站信息记录表 - * @param params - */ -export async function pageCmsWebsiteAll(params: CmsWebsiteParam) { - const res = await request.get>>( - '/cms/cms-website/pageAll', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsWebsite/model/index.ts b/src_bak/api/cms/cmsWebsite/model/index.ts deleted file mode 100644 index e12d132..0000000 --- a/src_bak/api/cms/cmsWebsite/model/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import type { PageParam } from '@/api/index'; -import type {CmsNavigation} from "@/api/cms/cmsNavigation/model"; - -/** - * 网站信息记录表 - */ -export interface CmsWebsite { - // 站点ID - websiteId?: number; - // 网站名称 - websiteName?: string; - // 网站标识 - websiteCode?: string; - // 网站LOGO - websiteIcon?: string; - // 网站LOGO - websiteLogo?: string; - // 网站LOGO(深色模式) - websiteDarkLogo?: string; - // 网站类型 - websiteType?: string; - // 网站关键词 - keywords?: string; - // 域名前缀 - prefix?: string; - // 绑定域名 - domain?: string; - // 全局样式 - style?: string; - // 后台管理地址 - adminUrl?: string; - // 应用版本 10免费版 20专业版 30永久授权 - version?: number; - // 服务到期时间 - expirationTime?: string; - // 模版ID - templateId?: number; - // 行业类型(父级) - industryParent?: string; - // 行业类型(子级) - industryChild?: string; - // 企业ID - companyId?: number; - // 所在国家 - country?: string; - // 所在省份 - province?: string; - // 所在城市 - city?: string; - // 所在辖区 - region?: string; - // 经度 - longitude?: string; - // 纬度 - latitude?: string; - // 街道地址 - address?: string; - // 联系电话 - phone?: string; - // 电子邮箱 - email?: string; - // ICP备案号 - icpNo?: string; - // 公安备案 - policeNo?: string; - // 备注 - comments?: string; - // 是否推荐 - recommend?: number; - // 运行状态 - running?: number; - // 状态 0未开通 1运行中 2维护中 3已关闭 4已欠费停机 5违规关停 - status?: number; - // 维护说明 - statusText?: string; - // 关闭说明 - statusClose?: string; - // 状态图标 - statusIcon?: string; - // 全局样式 - styles?: string; - // 排序号 - sortNumber?: number; - // 用户ID - userId?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 网站配置 - config?: any; - topNavs?: CmsNavigation[]; - bottomNavs?: CmsNavigation[]; - loginUser?: any; - search?: boolean; -} - - -export interface AppInfo { - appId?: number; - appName?: string; - description?: string; - keywords?: string; - appCode?: string; - mpQrCode?: string; - title?: string; - logo?: string; - icon?: string; - domain?: string; - running?: number; - version?: number; - expirationTime?: string; - expired?: boolean; - expiredDays?: number; - soon?: number; - statusIcon?: string; - statusText?: string; - config?: Object; - serverTime?: Object; - topNavs?: CmsNavigation[]; - bottomNavs?: CmsNavigation[]; - setting?: Object; - createTime?: string; -} - -/** - * 网站信息记录表搜索条件 - */ -export interface CmsWebsiteParam extends PageParam { - websiteId?: number; - status?: number; - phone?: string; - keywords?: string; -} diff --git a/src_bak/api/cms/cmsWebsiteField/index.ts b/src_bak/api/cms/cmsWebsiteField/index.ts deleted file mode 100644 index 65644c6..0000000 --- a/src_bak/api/cms/cmsWebsiteField/index.ts +++ /dev/null @@ -1,129 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type {CmsWebsiteField, CmsWebsiteFieldParam, Config} from './model'; - -/** - * 分页查询应用参数 - */ -export async function pageCmsWebsiteField(params: CmsWebsiteFieldParam) { - const res = await request.get>>( - '/cms/cms-website-field/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用参数列表 - */ -export async function listCmsWebsiteField(params?: CmsWebsiteFieldParam) { - const res = await request.get>( - '/cms/cms-website-field', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用参数 - */ -export async function addCmsWebsiteField(data: CmsWebsiteField) { - const res = await request.post>( - '/cms/cms-website-field', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用参数 - */ -export async function updateCmsWebsiteField(data: CmsWebsiteField) { - const res = await request.put>( - '/cms/cms-website-field', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用参数 - */ -export async function removeCmsWebsiteField(id?: number) { - const res = await request.del>( - '/cms/cms-website-field/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用参数 - */ -export async function removeBatchCmsWebsiteField(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/cms-website-field/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用参数 - */ -export async function getCmsWebsiteField(id: number) { - const res = await request.get>( - '/cms/cms-website-field/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 恢复项目参数 - */ -export async function undeleteWebsiteField(id?: number) { - const res = await request.del>( - '/cms/website-field/undelete/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - - -/** - * 查询项目参数列表 - */ -export async function configWebsiteField(params?: CmsWebsiteFieldParam) { - const res = await request.get>( - '/cms/cms-website-field/config', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/cmsWebsiteField/model/index.ts b/src_bak/api/cms/cmsWebsiteField/model/index.ts deleted file mode 100644 index ec5967c..0000000 --- a/src_bak/api/cms/cmsWebsiteField/model/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 应用参数 - */ -export interface CmsWebsiteField { - // 自增ID - id?: number; - // 类型,0文本 1图片 2其他 - type?: number; - // 名称 - name?: string; - // 默认值 - defaultValue?: string; - // 可修改的值 [on|off] - modifyRange?: string; - // 备注 - comments?: string; - // css样式 - style?: string; - // 名称 - value?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 应用参数搜索条件 - */ -export interface CmsWebsiteFieldParam extends PageParam { - id?: number; - name?: string; - keywords?: string; -} - -export interface Config { - siteName?: string; - siteLogo?: string; - domain?: string; - icpNo?: string; - copyright?: string; - loginBgImg?: string; - address?: string; - tel?: string; - theme?: string; - workDay?: string; - kefu2?: string; - kefu1?: string; - email?: string; - loginTitle?: string; - sysLogo?: string; - vipText?: string; - vipComments?: string; - deliveryText?: string; - guaranteeText?: string; - openComments?: string; -} diff --git a/src_bak/api/cms/link/index.ts b/src_bak/api/cms/link/index.ts deleted file mode 100644 index 5ffcb84..0000000 --- a/src_bak/api/cms/link/index.ts +++ /dev/null @@ -1,113 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Link, LinkParam } from './model'; - - -/** - * 分页查询链接 - */ -export async function pageLink(params: LinkParam) { - const res = await request.get>>( - '/oa/link/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询链接列表 - */ -export async function listLink(params?: LinkParam) { - const res = await request.get>( - '/oa/link', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加链接 - */ -export async function addLink(data: Link) { - const res = await request.post>( - '/oa/link', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改链接 - */ -export async function updateLink(data: Link) { - const res = await request.put>( - '/oa/link', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除链接 - */ -export async function removeLink(id?: number) { - const res = await request.del>( - '/oa/link/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除链接 - */ -export async function removeBatchLink(data: (number | undefined)[]) { - const res = await request.del>( - '/oa/link/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 检查IP是否存在 - */ -export async function checkExistence( - field: string, - value: string, - id?: number -) { - const res = await request.get>( - '/oa/link/existence', - { - params: { field, value, id } - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/link/model/index.ts b/src_bak/api/cms/link/model/index.ts deleted file mode 100644 index b22d9dc..0000000 --- a/src_bak/api/cms/link/model/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 链接 - */ -export interface Link { - id?: number; - name?: string; - icon?: string; - url?: string; - linkType?: string; - appId?: number; - categoryId?: number; - userId?: number; - comments?: string; - recommend?: number; - sortNumber?: number; - deleted?: number; - status?: number; - createTime?: number; -} - -/** - * 链接搜索条件 - */ -export interface LinkParam extends PageParam { - id?: number; - linkType?: string; - categoryId?: number; - name?: string; -} diff --git a/src_bak/api/cms/mpOfficialMenu/index.ts b/src_bak/api/cms/mpOfficialMenu/index.ts deleted file mode 100644 index 396e464..0000000 --- a/src_bak/api/cms/mpOfficialMenu/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { MpOfficialMenu, MpOfficialMenuParam } from './model'; - - -/** - * 分页查询小程序端菜单 - */ -export async function pageMpOfficialMenu(params: MpOfficialMenuParam) { - const res = await request.get>>( - '/cms/mp-official-menu/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询小程序端菜单列表 - */ -export async function listMpOfficialMenu(params?: MpOfficialMenuParam) { - const res = await request.get>( - '/cms/mp-official-menu', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加小程序端菜单 - */ -export async function addMpOfficialMenu(data: MpOfficialMenu) { - const res = await request.post>( - '/cms/mp-official-menu', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改小程序端菜单 - */ -export async function updateMpOfficialMenu(data: MpOfficialMenu) { - const res = await request.put>( - '/cms/mp-official-menu', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除小程序端菜单 - */ -export async function removeMpOfficialMenu(id?: number) { - const res = await request.del>( - '/cms/mp-official-menu/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除小程序端菜单 - */ -export async function removeBatchMpOfficialMenu(data: (number | undefined)[]) { - const res = await request.del>( - '/cms/mp-official-menu/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询小程序端菜单 - */ -export async function getMpOfficialMenu(id: number) { - const res = await request.get>( - '/cms/mp-official-menu/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/cms/mpOfficialMenu/model/index.ts b/src_bak/api/cms/mpOfficialMenu/model/index.ts deleted file mode 100644 index dc4cd02..0000000 --- a/src_bak/api/cms/mpOfficialMenu/model/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 小程序端菜单 - */ -export interface MpOfficialMenu { - // ID - id?: number; - // 上级id, 0是顶级 - parentId?: number; - // 菜单名称 - name?: string; - // 类型 - type?: string; - // 菜单值 - key?: string; - // 用户ID - userId?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 小程序端菜单搜索条件 - */ -export interface MpOfficialMenuParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/index.ts b/src_bak/api/index.ts deleted file mode 100644 index 981f63c..0000000 --- a/src_bak/api/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * 接口统一返回结果 - */ -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?: string; - // 结束时间 - createTimeEnd?: string; - timeStart?: number; - timeEnd?: number; - isExpireTime?: number; - showSoldStatus?: boolean; - dateTime?: string; - lang?: string; - model?: string; - BaseUrl?: string; -} diff --git a/src_bak/api/json/china-provinces.geo.json b/src_bak/api/json/china-provinces.geo.json deleted file mode 100644 index be70ca7..0000000 --- a/src_bak/api/json/china-provinces.geo.json +++ /dev/null @@ -1 +0,0 @@ -{"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/src_bak/api/json/industry-data.json b/src_bak/api/json/industry-data.json deleted file mode 100644 index 0d8baa8..0000000 --- a/src_bak/api/json/industry-data.json +++ /dev/null @@ -1 +0,0 @@ -[{"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/src_bak/api/json/regions-data.json b/src_bak/api/json/regions-data.json deleted file mode 100644 index 4cbd130..0000000 --- a/src_bak/api/json/regions-data.json +++ /dev/null @@ -1 +0,0 @@ -[{"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/src_bak/api/layout/index.ts b/src_bak/api/layout/index.ts deleted file mode 100644 index 8ee8b60..0000000 --- a/src_bak/api/layout/index.ts +++ /dev/null @@ -1,116 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { User } from '@/api/system/user/model'; -import type { UpdatePasswordParam } from './model'; -import type {CmsWebsite} from "@/api/cms/cmsWebsite/model"; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 获取网站信息 - */ -export async function getShopInfo() { - const res = await request.get>( - '/shop/getShopInfo' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取当前登录的用户信息、菜单、权限、角色 - */ -export async function getUserInfo(): Promise { - const res = await request.get>(SERVER_API_URL + '/auth/user'); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function updateUserInfo(data: User): Promise { - const res = await request.put>( - SERVER_API_URL + '/auth/user', - data - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取服务器时间(实时) - * @return - */ -export async function getServerTime() { - const res = await request.get>( - '/cms/website/getServerTime' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取未来7天的日期 - * @return - */ -export async function getNext7day() { - const res = await request.get>( - '/cms/website/getNext7day' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 向子模块传递token - * @param url - */ -export async function transferToken(url: string): Promise { - const res = await request.get>(url); - return Promise.reject(new Error(res.message)); -} - -/** - * 修改当前登录的用户密码 - */ -export async function updatePassword( - data: UpdatePasswordParam -): Promise { - const res = await request.put>( - '/auth/password', - data - ); - if (res.code === 0) { - return res.message ?? '修改成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取微信小程序登录凭证 - */ - -export async function getWxOpenId(data: any) { - const res = await request.post>(SERVER_API_URL + '/wx-login/getWxOpenId',data); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - - -// 获取微信openId -export async function loginByOpenId(data: any) { - const res = await request.post>(SERVER_API_URL + '/wx-login/loginByOpenId', data); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/layout/model/index.ts b/src_bak/api/layout/model/index.ts deleted file mode 100644 index a3edbc1..0000000 --- a/src_bak/api/layout/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ - -/** - * 首页布局样式 - */ -export interface Layout { - // 内容区域的宽度 - width?: string; - // 文字颜色 - color?: string; - // 高亮颜色 - hover?: string; - // 背景颜色 - backgroundColor?: string; - headerStyle?: any; - siteNameStyle?: any; - showBanner?: boolean; - // 背景图片 - banner?: string; -} - -/** - * 修改密码参数 - */ -export interface UpdatePasswordParam { - // 新密码 - password: string; - // 原始密码 - oldPassword: string; -} diff --git a/src_bak/api/passport/login/index.ts b/src_bak/api/passport/login/index.ts deleted file mode 100644 index 0104c73..0000000 --- a/src_bak/api/passport/login/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api'; -import type { - LoginParam, - LoginResult, - CaptchaResult, - SmsCaptchaResult -} from './model'; -import {saveStorageByLoginUser, SERVER_API_URL} from "@/utils/server"; - -/** - * 账号密码登录 - */ -export async function login(data: LoginParam) { - const res = await request.post>( - SERVER_API_URL + '/login', - data - ); - if (res.code === 0) { - if (res.data?.user && res.data?.access_token) { - saveStorageByLoginUser(res.data.access_token, res.data.user) - } - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取验证码 - */ -export async function getCaptcha() { - const res = await request.get>( - SERVER_API_URL + '/captcha', - {} - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function loginBySms(data: LoginParam) { - const res = await request.post>( - SERVER_API_URL + '/loginBySms', - data - ); - if (res.code === 0) { - if(res.data?.user){ - saveStorageByLoginUser(`${res.data?.access_token}`, res.data?.user) - } - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 发送短信验证码 - */ -export async function sendSmsCaptcha(data: LoginParam) { - const res = await request.post>( - SERVER_API_URL + '/sendSmsCaptcha', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/passport/login/model/index.ts b/src_bak/api/passport/login/model/index.ts deleted file mode 100644 index abdd71d..0000000 --- a/src_bak/api/passport/login/model/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { User } from '@/api/system/user/model'; -/** - * 登录参数 - */ -export interface LoginParam { - // 账号 - username?: string; - // 密码 - password?: string; - // 租户id - tenantId?: number; - // 是否记住密码 - remember?: boolean; - // 手机号码 - phone?: string; - // 短信验证码 - code?: string; - // 图形验证码Key - captchaKey?: string; - // 图形验证码文本 - captchaText?: string; -} - -/** - * 登录返回结果 - */ -export interface LoginResult { - // token - access_token?: string; - // 用户信息 - user?: User; -} - -/** - * 图形验证码返回结果 - */ -export interface CaptchaResult { - // 验证码Key - key?: string; - // 图形验证码base64数据 - base64: string; - // 验证码文本 - text: string; -} - -/** - * 短信验证码返回结果 - */ -export interface SmsCaptchaResult { - // 验证码文本 - text: string; -} diff --git a/src_bak/api/passport/qr-login/index.ts b/src_bak/api/passport/qr-login/index.ts deleted file mode 100644 index bc4c85c..0000000 --- a/src_bak/api/passport/qr-login/index.ts +++ /dev/null @@ -1,244 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api'; -import Taro from '@tarojs/taro'; -import {SERVER_API_URL} from "@/utils/server"; -import {getUserInfo} from "@/api/layout"; - -/** - * 扫码登录相关接口 - */ - -// 生成扫码token请求参数 -export interface GenerateQRTokenParam { - // 客户端类型:web, app, wechat - clientType?: string; - // 设备信息 - deviceInfo?: string; - // 过期时间(分钟) - expireMinutes?: number; -} - -// 生成扫码token响应 -export interface GenerateQRTokenResult { - // 扫码token - token: string; - // 二维码内容(通常是包含token的URL或JSON) - qrContent: string; - // 过期时间戳 - expireTime: number; - // 二维码图片URL(可选) - qrImageUrl?: string; -} - -// 扫码状态枚举 -export enum QRLoginStatus { - PENDING = 'pending', // 等待扫码 - SCANNED = 'scanned', // 已扫码,等待确认 - CONFIRMED = 'confirmed', // 已确认登录 - EXPIRED = 'expired', // 已过期 - CANCELLED = 'cancelled' // 已取消 -} - -// 检查扫码状态响应 -export interface QRLoginStatusResult { - // 当前状态 - status: QRLoginStatus; - // 状态描述 - message?: string; - // 如果已确认登录,返回JWT token - accessToken?: string; - // 用户信息 - userInfo?: { - userId: number; - nickname?: string; - avatar?: string; - phone?: string; - }; - // 剩余有效时间(秒) - remainingTime?: number; -} - -// 确认登录请求参数 -export interface ConfirmLoginParam { - // 扫码token - token: string; - // 用户ID - userId: number; - // 登录平台:web, app, wechat - platform?: string; - // 微信用户信息(当platform为wechat时) - wechatInfo?: { - openid?: string; - unionid?: string; - nickname?: string; - avatar?: string; - gender?: string; - }; - // 设备信息 - deviceInfo?: string; -} - -// 确认登录响应 -export interface ConfirmLoginResult { - // 是否成功 - success: boolean; - // 消息 - message: string; - // 登录用户信息 - userInfo?: { - userId: number; - nickname?: string; - avatar?: string; - phone?: string; - }; -} - -/** - * 生成扫码登录token - */ -export async function generateQRToken(data?: GenerateQRTokenParam) { - const res = await request.post>( - SERVER_API_URL + '/qr-login/generate', - { - clientType: 'wechat', - expireMinutes: 5, - ...data - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 检查扫码登录状态 - */ -export async function checkQRLoginStatus(token: string) { - const res = await request.get>( - SERVER_API_URL + `/qr-login/status/${token}` - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 确认扫码登录(通用接口) - */ -export async function confirmQRLogin(data: ConfirmLoginParam) { - const res = await request.post>( - SERVER_API_URL + '/qr-login/confirm', - data - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 微信小程序扫码登录确认(便捷接口) - */ -export async function confirmWechatQRLogin(token: string, userId: number) { - try { - // 获取微信用户信息 - const userInfo = await getUserInfo(); - - const data: ConfirmLoginParam = { - token, - userId, - platform: 'wechat', - wechatInfo: { - nickname: userInfo?.nickname, - avatar: userInfo?.avatar, - gender: userInfo?.sex - }, - deviceInfo: await getDeviceInfo() - }; - - const res = await request.post>( - SERVER_API_URL + '/qr-login/confirm', - data - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); - } catch (error: any) { - return Promise.reject(new Error(error.message || '确认登录失败')); - } -} - -/** - * 获取设备信息 - */ -async function getDeviceInfo() { - return new Promise((resolve) => { - Taro.getSystemInfo({ - success: (res) => { - const deviceInfo = { - platform: res.platform, - system: res.system, - version: res.version, - model: res.model, - brand: res.brand, - screenWidth: res.screenWidth, - screenHeight: res.screenHeight - }; - resolve(JSON.stringify(deviceInfo)); - }, - fail: () => { - resolve('unknown'); - } - }); - }); -} - -/** - * 解析二维码内容,提取token - */ -export function parseQRContent(qrContent: string): string | null { - try { - // 尝试解析JSON格式 - if (qrContent.startsWith('{')) { - const parsed = JSON.parse(qrContent); - return parsed.token || parsed.qrCodeKey || null; - } - - // 尝试解析URL格式 - if (qrContent.includes('http')) { - const url = new URL(qrContent); - // 支持多种参数名 - return url.searchParams.get('token') || - url.searchParams.get('qrCodeKey') || - url.searchParams.get('qr_code_key') || - null; - } - - // 尝试解析简单的key=value格式 - if (qrContent.includes('=')) { - const params = new URLSearchParams(qrContent); - return params.get('token') || - params.get('qrCodeKey') || - params.get('qr_code_key') || - null; - } - - // 如果是以qr-login:开头的格式 - if (qrContent.startsWith('qr-login:')) { - return qrContent.replace('qr-login:', ''); - } - - // 直接返回内容作为token(如果是32位以上的字符串) - if (qrContent.length >= 32) { - return qrContent; - } - - return null; - } catch (error) { - console.error('解析二维码内容失败:', error); - return null; - } -} diff --git a/src_bak/api/shop/shopActivity/index.ts b/src_bak/api/shop/shopActivity/index.ts deleted file mode 100644 index db90974..0000000 --- a/src_bak/api/shop/shopActivity/index.ts +++ /dev/null @@ -1,110 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { - ShopActivity, - ShopActivityParam, - ActivitySignUpParams, - ActivityStats, -} from './model' -import { normalizeActivity } from './model' - -export type { ShopActivity, ActivityStatus, ActivityType } from './model' - -/** - * 分页查询活动 - */ -export async function pageShopActivity(params: ShopActivityParam) { - const res = await request.get>>( - '/shop/shop-activity/page', - params - ) - if (res.code === 0 && res.data) { - return { - ...res.data, - list: (res.data.list || []).map(normalizeActivity), - } - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询活动列表 - */ -export async function listShopActivity(params?: ShopActivityParam) { - const res = await request.get>( - '/shop/shop-activity', - params - ) - if (res.code === 0 && res.data) { - return res.data.map(normalizeActivity) - } - return Promise.reject(new Error(res.message)) -} - -/** - * 根据ID查询活动 - */ -export async function getShopActivity(id: number) { - const res = await request.get>( - '/shop/shop-activity/' + id - ) - if (res.code === 0 && res.data) { - return normalizeActivity(res.data) - } - return Promise.reject(new Error(res.message)) -} - -/** - * 报名活动 - */ -export async function signUpActivity(params: ActivitySignUpParams) { - const res = await request.post>( - '/shop/shop-activity/sign-up', - params - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 取消报名 - */ -export async function cancelSignUpActivity(activityId: number) { - const res = await request.post>( - '/shop/shop-activity/cancel-sign-up', - { activityId } - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取活动报名状态 - */ -export async function getSignUpStatus(activityId: number) { - const res = await request.get>( - '/shop/shop-activity/sign-up-status', - { activityId } - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取活动统计 - */ -export async function getActivityStats() { - const res = await request.get>( - '/shop/shop-activity/stats' - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopActivity/model/index.ts b/src_bak/api/shop/shopActivity/model/index.ts deleted file mode 100644 index b67d7de..0000000 --- a/src_bak/api/shop/shopActivity/model/index.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * 活动模型 - */ - -// 活动类型(前端语义化) -export type ActivityType = 'discount' | 'full_reduction' | 'seckill' | 'group_buy' | 'flash_sale' - -// 活动状态(前端语义化) -export type ActivityStatus = 'upcoming' | 'ongoing' | 'ended' | 'cancelled' - -// 活动数据(与后端字段对齐) -export interface ShopActivity { - id: number - name: string - image: string - banner?: string - startTime: string - endTime: string - /** 后端返回整数: 0=未开始 1=进行中 2=已结束,前端通过 normalizeActivity 转为语义化字符串 */ - status: ActivityStatus | number - /** 后端返回整数: 1=满减 2=折扣 3=秒杀 4=拼团 */ - type: ActivityType | number - typeName?: string - description: string - participants?: number - maxParticipants?: number - discountRate?: number - reductionAmount?: number - minAmount?: number - rules?: string - tenantId?: number - createTime: string - updateTime?: string -} - -// 活动查询参数 -export interface ShopActivityParam { - page?: number - limit?: number - status?: number | ActivityStatus - type?: number | ActivityType - keywords?: string -} - -// 活动报名参数 -export interface ActivitySignUpParams { - activityId: number - userId?: number - contactPhone?: string - remark?: string -} - -// 活动统计 -export interface ActivityStats { - total: number - ongoing: number - upcoming: number - ended: number - totalParticipants: number -} - -// 后端整数状态 → 前端语义化状态 -export function normalizeActivityStatus(status: number | ActivityStatus): ActivityStatus { - if (typeof status === 'string') return status - const map: Record = { 0: 'upcoming', 1: 'ongoing', 2: 'ended' } - return map[status] ?? 'ended' -} - -// 后端整数类型 → 前端语义化类型 -export function normalizeActivityType(type: number | ActivityType): ActivityType { - if (typeof type === 'string') return type - const map: Record = { - 1: 'full_reduction', - 2: 'discount', - 3: 'seckill', - 4: 'group_buy', - } - return map[type] ?? 'discount' -} - -// 规范化活动对象(处理后端整数字段) -export function normalizeActivity(a: ShopActivity): ShopActivity & { status: ActivityStatus; type: ActivityType } { - return { - ...a, - participants: a.participants ?? 0, - status: normalizeActivityStatus(a.status as number), - type: normalizeActivityType(a.type as number), - } -} diff --git a/src_bak/api/shop/shopAfterSale/index.ts b/src_bak/api/shop/shopAfterSale/index.ts deleted file mode 100644 index 2820d18..0000000 --- a/src_bak/api/shop/shopAfterSale/index.ts +++ /dev/null @@ -1,154 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' - -// 售后类型 -export type AfterSaleType = 'refund' | 'return' | 'exchange' | 'repair' - -// 售后状态 -export type AfterSaleStatus = - | 'pending' // 待审核 - | 'approved' // 已同意 - | 'rejected' // 已拒绝 - | 'processing' // 处理中 - | 'completed' // 已完成 - | 'cancelled' // 已取消 - -// 售后进度记录 -export interface ProgressRecord { - id: string - time: string - status: string - description: string - operator?: string - remark?: string -} - -// 售后详情 -export interface AfterSaleDetail { - id: string - orderId: string - orderNo: string - goodsName?: string - type: AfterSaleType - status: AfterSaleStatus - reason: string - description: string - amount: number - applyTime: string - processTime?: string - completeTime?: string - rejectReason?: string - contactPhone?: string - evidenceImages: string[] - progressRecords: ProgressRecord[] -} - -// 售后申请参数 -export interface AfterSaleApplyParams { - orderId: string - type: AfterSaleType - reason: string - description?: string - amount?: number - contactPhone?: string - evidenceImages?: string[] - goodsItems?: Array<{ goodsId: string; quantity: number }> -} - -// 售后列表查询参数 -export interface AfterSaleListParams { - page?: number - pageSize?: number - status?: AfterSaleStatus - type?: AfterSaleType -} - -// 售后类型映射 -export const AFTER_SALE_TYPE_MAP: Record = { - refund: '退款', - return: '退货', - exchange: '换货', - repair: '维修', -} - -// 售后状态映射 -export const AFTER_SALE_STATUS_MAP: Record = { - pending: '待审核', - approved: '已同意', - rejected: '已拒绝', - processing: '处理中', - completed: '已完成', - cancelled: '已取消', -} - -// 格式化售后状态 -export const formatAfterSaleStatus = (status: AfterSaleStatus): { - text: string - color: string - icon: string -} => { - const statusMap: Record = { - pending: { text: '待审核', color: 'text-orange-500', icon: '⏳' }, - approved: { text: '已同意', color: 'text-green-500', icon: '✅' }, - rejected: { text: '已拒绝', color: 'text-red-500', icon: '❌' }, - processing: { text: '处理中', color: 'text-blue-500', icon: '🔄' }, - completed: { text: '已完成', color: 'text-green-500', icon: '✅' }, - cancelled: { text: '已取消', color: 'text-gray-400', icon: '⭕' }, - } - return statusMap[status] || { text: status, color: 'text-gray-400', icon: '📋' } -} - -/** - * 申请售后 - */ -export async function applyAfterSale(data: AfterSaleApplyParams) { - const res = await request.post>( - '/shop/shop-after-sale/apply', - data - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 分页查询售后列表 - */ -export async function pageAfterSaleList(params: AfterSaleListParams) { - const res = await request.get>>( - '/shop/shop-after-sale/page', - params - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询售后详情 - */ -export async function getAfterSaleDetail(id: string) { - const res = await request.get>( - '/shop/shop-after-sale/' + id - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 撤销售后申请 - */ -export async function cancelAfterSale(id: string) { - const res = await request.post>( - '/shop/shop-after-sale/cancel', - { id } - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopArticle/index.ts b/src_bak/api/shop/shopArticle/index.ts deleted file mode 100644 index 68fb5c5..0000000 --- a/src_bak/api/shop/shopArticle/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopArticle, ShopArticleParam } from './model'; - -/** - * 分页查询商品文章 - */ -export async function pageShopArticle(params: ShopArticleParam) { - const res = await request.get>>( - '/shop/shop-article/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商品文章列表 - */ -export async function listShopArticle(params?: ShopArticleParam) { - const res = await request.get>( - '/shop/shop-article', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品文章 - */ -export async function addShopArticle(data: ShopArticle) { - const res = await request.post>( - '/shop/shop-article', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商品文章 - */ -export async function updateShopArticle(data: ShopArticle) { - const res = await request.put>( - '/shop/shop-article', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商品文章 - */ -export async function removeShopArticle(id?: number) { - const res = await request.del>( - '/shop/shop-article/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商品文章 - */ -export async function removeBatchShopArticle(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-article/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商品文章 - */ -export async function getShopArticle(id: number) { - const res = await request.get>( - '/shop/shop-article/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopArticle/model/index.ts b/src_bak/api/shop/shopArticle/model/index.ts deleted file mode 100644 index 18e7b58..0000000 --- a/src_bak/api/shop/shopArticle/model/index.ts +++ /dev/null @@ -1,123 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商品文章 - */ -export interface ShopArticle { - // 文章ID - articleId?: number; - // 文章标题 - title?: string; - // 文章类型 0常规 1视频 - type?: number; - // 模型 - model?: string; - // 详情页模板 - detail?: string; - // 文章分类ID - categoryId?: number; - // 上级id, 0是顶级 - parentId?: number; - // 话题 - topic?: string; - // 标签 - tags?: string; - // 封面图 - image?: string; - // 封面图宽 - imageWidth?: number; - // 封面图高 - imageHeight?: number; - // 付费金额 - price?: string; - // 开始时间 - startTime?: string; - // 结束时间 - endTime?: string; - // 来源 - source?: string; - // 产品概述 - overview?: string; - // 虚拟阅读量(仅用作展示) - virtualViews?: number; - // 实际阅读量 - actualViews?: number; - // 评分 - rate?: string; - // 列表显示方式(10小图展示 20大图展示) - showType?: number; - // 访问密码 - password?: string; - // 可见类型 0所有人 1登录可见 2密码可见 - permission?: number; - // 发布来源客户端 (APP、H5、小程序等) - platform?: string; - // 文章附件 - files?: string; - // 视频地址 - video?: string; - // 接受的文件类型 - accept?: string; - // 经度 - longitude?: string; - // 纬度 - latitude?: string; - // 所在省份 - province?: string; - // 所在城市 - city?: string; - // 所在辖区 - region?: string; - // 街道地址 - address?: string; - // 点赞数 - likes?: number; - // 评论数 - commentNumbers?: number; - // 提醒谁看 - toUsers?: string; - // 作者 - author?: string; - // 推荐 - recommend?: number; - // 报名人数 - bmUsers?: number; - // 用户ID - userId?: number; - // 项目ID - projectId?: number; - // 语言 - lang?: string; - // 关联默认语言的文章ID - langArticleId?: number; - // 是否自动翻译 - translation?: string; - // 编辑器类型 0 Markdown编辑器 1 富文本编辑器 - editor?: string; - // pdf文件地址 - pdfUrl?: string; - // 版本号 - version?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0已发布, 1待审核 2已驳回 3违规内容 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 商品文章搜索条件 - */ -export interface ShopArticleParam extends PageParam { - articleId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopBooking/index.ts b/src_bak/api/shop/shopBooking/index.ts deleted file mode 100644 index 2c003e5..0000000 --- a/src_bak/api/shop/shopBooking/index.ts +++ /dev/null @@ -1,121 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { - ShopBooking, - ShopBookingParam, - ShopBookingParams, - BookingStats, -} from './model' - -/** - * 分页查询预约订单 - */ -export async function pageShopBooking(params: ShopBookingParam) { - const res = await request.get>>( - '/shop/shop-booking/page', - params - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询预约订单列表 - */ -export async function listShopBooking(params?: ShopBookingParam) { - const res = await request.get>( - '/shop/shop-booking', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 根据ID查询预约订单 - */ -export async function getShopBooking(id: string) { - const res = await request.get>( - '/shop/shop-booking/' + id - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 创建预约订单 - */ -export async function createShopBooking(data: ShopBookingParams) { - const res = await request.post>( - '/shop/shop-booking', - data - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 修改预约订单 - */ -export async function updateShopBooking(data: ShopBookingParams) { - const res = await request.put>( - '/shop/shop-booking', - data - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 取消预约订单 - */ -export async function cancelShopBooking(id?: string) { - const res = await request.del>( - '/shop/shop-booking/' + id - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 改签预约订单 - */ -export async function rescheduleShopBooking(data: { - bookingId: string - newDate: string - newTime: string -}) { - const res = await request.post>( - '/shop/shop-booking/reschedule', - data - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取预约统计 - */ -export async function getBookingStats() { - const res = await request.get>( - '/shop/shop-booking/stats' - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopBooking/model/index.ts b/src_bak/api/shop/shopBooking/model/index.ts deleted file mode 100644 index 79d5be4..0000000 --- a/src_bak/api/shop/shopBooking/model/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * 预约订单模型 - */ - -// 预约状态 -export type BookingStatus = 'pending' | 'confirmed' | 'in_progress' | 'completed' | 'cancelled' | 'rescheduled' - -// 预约订单数据 -export interface ShopBooking { - id: number | string - bookingNo: string // 预约编号 - storeId: number // 店铺ID - storeName: string // 店铺名称 - storePhone?: string // 门店服务电话 - serviceId: number // 服务ID - serviceName: string // 服务名称 - bookingDate: string // 预约日期 - bookingTime: string // 预约时间段 - status: BookingStatus // 预约状态 - price: number // 价格 - createTime: string // 创建时间 - updateTime?: string // 更新时间 - remark?: string // 备注 - contactName?: string // 联系人 - contactPhone?: string // 联系电话 - address?: string // 地址 -} - -// 预约查询参数 -export interface ShopBookingParam { - page?: number - limit?: number - status?: BookingStatus // 按状态筛选 - storeId?: number // 按店铺筛选 - startDate?: string // 预约日期范围-起始 - endDate?: string // 预约日期范围-结束 - keywords?: string // 关键词搜索 - sortBy?: string // 排序方式(createTime, bookingDate) -} - -// 创建/更新预约参数 -export interface ShopBookingParams extends ShopBooking {} - -// 预约统计 -export interface BookingStats { - total: number // 总预约数 - pending: number // 待服务 - confirmed: number // 已确认 - inProgress: number // 进行中 - completed: number // 已完成 - cancelled: number // 已取消 - rescheduled: number // 已改签 -} diff --git a/src_bak/api/shop/shopCart/index.ts b/src_bak/api/shop/shopCart/index.ts deleted file mode 100644 index 16ac413..0000000 --- a/src_bak/api/shop/shopCart/index.ts +++ /dev/null @@ -1,153 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api'; -import type { ShopCart, ShopCartParam, AddToCartParam, UpdateCartNumParam } from './model'; - -/** - * 获取购物车列表 - */ -export async function listShopCart(params?: ShopCartParam) { - const res = await request.get>( - '/shop/shop-cart', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取购物车分页列表 - */ -export async function pageShopCart(params: ShopCartParam) { - const res = await request.get>( - '/shop/shop-cart/page', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取购物车数量 - */ -export async function getShopCartCount() { - const res = await request.get>( - '/shop/shop-cart/count' - ); - if (res.code === 0 && res.data) { - return res.data.count; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品到购物车 - */ -export async function addToCart(data: AddToCartParam) { - const res = await request.post>( - '/shop/shop-cart', - data - ); - if (res.code === 0) { - return res.message || '添加成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 更新购物车商品数量 - */ -export async function updateCartNum(data: UpdateCartNumParam) { - const res = await request.put>( - '/shop/shop-cart/' + data.id, - { quantity: data.num } - ); - if (res.code === 0) { - return res.message || '更新成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 更新购物车商品选中状态 - */ -export async function updateCartChecked(id: number, checked: boolean) { - const res = await request.put>( - '/shop/shop-cart/' + id, - { selected: checked } - ); - if (res.code === 0) { - return res.message || '更新成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 全选/取消全选购物车 - */ -export async function updateCartAllChecked(checked: boolean) { - const res = await request.put>( - '/shop/shop-cart/selected', - { selected: checked } - ); - if (res.code === 0) { - return res.message || '更新成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除购物车商品 - */ -export async function removeShopCart(id: number) { - const res = await request.del>( - '/shop/shop-cart/' + id - ); - if (res.code === 0) { - return res.message || '删除成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除购物车商品 - */ -export async function removeBatchShopCart(ids: number[]) { - const res = await request.del>( - '/shop/shop-cart/batch', - { ids } - ); - if (res.code === 0) { - return res.message || '删除成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 清空购物车 - */ -export async function clearShopCart() { - const res = await request.del>( - '/shop/shop-cart/clear' - ); - if (res.code === 0) { - return res.message || '清空成功'; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取购物车详情 - */ -export async function getShopCart(id: number) { - const res = await request.get>( - '/shop/shop-cart/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopCart/model/index.ts b/src_bak/api/shop/shopCart/model/index.ts deleted file mode 100644 index b8ed1ad..0000000 --- a/src_bak/api/shop/shopCart/model/index.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 购物车项 - */ -export interface ShopCart { - // 主键ID - id?: number; - // 用户ID - userId?: number; - // 商品ID - goodsId?: number; - // SKU ID - skuId?: number; - // 数量 - num?: number; - // 商品名称 - goodsName?: string; - // 商品图片 - goodsImage?: string; - // SKU价格 - skuPrice?: string; - // SKU规格 - skuSpec?: string; - // 库存 - stock?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 更新时间 - updateTime?: string; -} - -/** - * 购物车项扩展(包含选中状态,用于前端展示) - */ -export interface ShopCartItem extends ShopCart { - // 是否选中 - checked?: boolean; - // 商品详情 - product?: any; - // SKU详情 - sku?: any; -} - -/** - * 添加到购物车参数 - */ -export interface AddToCartParam { - // 商品ID - goodsId: number; - // SKU ID(单规格可不传) - skuId?: number; - // 数量 - num: number; -} - -/** - * 更新购物车数量参数 - */ -export interface UpdateCartNumParam { - // 购物车ID - id: number; - // 数量 - num: number; -} - -/** - * 购物车搜索条件 - */ -export interface ShopCartParam extends PageParam { - userId?: number; -} diff --git a/src_bak/api/shop/shopChatConversation/index.ts b/src_bak/api/shop/shopChatConversation/index.ts deleted file mode 100644 index 6a5ba5b..0000000 --- a/src_bak/api/shop/shopChatConversation/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopChatConversation, ShopChatConversationParam } from './model'; - -/** - * 分页查询聊天会话表 - */ -export async function pageShopChatConversation(params: ShopChatConversationParam) { - const res = await request.get>>( - '/shop/shop-chat-conversation/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询聊天会话表列表 - */ -export async function listShopChatConversation(params?: ShopChatConversationParam) { - const res = await request.get>( - '/shop/shop-chat-conversation', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加聊天会话表 - */ -export async function addShopChatConversation(data: ShopChatConversation) { - const res = await request.post>( - '/shop/shop-chat-conversation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改聊天会话表 - */ -export async function updateShopChatConversation(data: ShopChatConversation) { - const res = await request.put>( - '/shop/shop-chat-conversation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除聊天会话表 - */ -export async function removeShopChatConversation(id?: number) { - const res = await request.del>( - '/shop/shop-chat-conversation/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除聊天会话表 - */ -export async function removeShopBatchChatConversation(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-chat-conversation/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询聊天会话表 - */ -export async function getShopChatConversation(id: number) { - const res = await request.get>( - '/shop/shop-chat-conversation/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopChatConversation/model/index.ts b/src_bak/api/shop/shopChatConversation/model/index.ts deleted file mode 100644 index ea6a9b3..0000000 --- a/src_bak/api/shop/shopChatConversation/model/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 聊天消息表 - */ -export interface ShopChatConversation { - // 自增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 ShopChatConversationParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopChatMessage/index.ts b/src_bak/api/shop/shopChatMessage/index.ts deleted file mode 100644 index 4667ce7..0000000 --- a/src_bak/api/shop/shopChatMessage/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopChatMessage, ShopChatMessageParam } from './model'; - -/** - * 分页查询聊天消息表 - */ -export async function pageShopChatMessage(params: ShopChatMessageParam) { - const res = await request.get>>( - '/shop/shop-chat-message/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询聊天消息表列表 - */ -export async function listShopChatMessage(params?: ShopChatMessageParam) { - const res = await request.get>( - '/shop/shop-chat-message', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加聊天消息表 - */ -export async function addShopChatMessage(data: ShopChatMessage) { - const res = await request.post>( - '/shop/shop-chat-message', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加聊天消息表 - */ -export async function addShopBatchChatMessage(data: ShopChatMessage[]) { - const res = await request.post>( - '/shop/shop-chat-message/batch', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改聊天消息表 - */ -export async function updateShopChatMessage(data: ShopChatMessage) { - const res = await request.put>( - '/shop/shop-chat-message', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除聊天消息表 - */ -export async function removeShopChatMessage(id?: number) { - const res = await request.del>( - '/shop/shop-chat-message/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除聊天消息表 - */ -export async function removeShopBatchChatMessage(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-chat-message/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询聊天消息表 - */ -export async function getShopChatMessage(id: number) { - const res = await request.get>( - '/shop/shop-chat-message/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopChatMessage/model/index.ts b/src_bak/api/shop/shopChatMessage/model/index.ts deleted file mode 100644 index 411d45c..0000000 --- a/src_bak/api/shop/shopChatMessage/model/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 聊天消息表 - */ -export interface ShopChatMessage { - // 自增ID - id?: number; - // 发送人ID - formUserId?: number; - // 发送人名称 - formUserName?: string; - // 发送人头像 - formUserAvatar?: string; - // 发送人手机号 - formUserPhone?: string; - // 发送人别名 - formUserAlias?: string; - // 接收人ID - toUserId?: number; - // 接收人名称 - toUserName?: string; - // 接收人头像 - toUserAvatar?: string; - // 接收人手机号 - toUserPhone?: string; - // 接收人别名 - toUserAlias?: string; - // 消息类型 - type?: string; - // 消息内容 - content?: string; - // 屏蔽接收方 - sideTo?: number; - // 屏蔽发送方 - sideFrom?: number; - // 是否撤回 - withdraw?: number; - // 文件信息 - fileInfo?: string; - // 批量发送 - toUserIds?: any[]; - // 存在联系方式 - hasContact?: number; - // 状态, 0未读, 1已读 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 注册时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 聊天消息表搜索条件 - */ -export interface ShopChatMessageParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopCommissionRecord.ts b/src_bak/api/shop/shopCommissionRecord.ts deleted file mode 100644 index 350851a..0000000 --- a/src_bak/api/shop/shopCommissionRecord.ts +++ /dev/null @@ -1,29 +0,0 @@ -import request from '@/utils/request'; - -/** - * 获取我的佣金记录 - */ -export function getMyCommissionList(params: any) { - return request.get('/shop/shop-commission-record/my/list', params); -} - -/** - * 获取佣金统计 - */ -export function getCommissionStats() { - return request.get('/shop/shop-commission-record/my/stats'); -} - -/** - * 获取佣金记录列表(管理员) - */ -export function getCommissionList(params: any) { - return request.get('/shop/shop-commission-record/page', params); -} - -/** - * 手动触发佣金结算(管理员) - */ -export function settleCommission() { - return request.post('/shop/shop-commission-record/settle'); -} diff --git a/src_bak/api/shop/shopCommissionRole/index.ts b/src_bak/api/shop/shopCommissionRole/index.ts deleted file mode 100644 index 07a2b6c..0000000 --- a/src_bak/api/shop/shopCommissionRole/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopCommissionRole, ShopCommissionRoleParam } from './model'; - -/** - * 分页查询分红角色 - */ -export async function pageShopCommissionRole(params: ShopCommissionRoleParam) { - const res = await request.get>>( - '/shop/shop-commission-role/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分红角色列表 - */ -export async function listShopCommissionRole(params?: ShopCommissionRoleParam) { - const res = await request.get>( - '/shop/shop-commission-role', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分红角色 - */ -export async function addShopCommissionRole(data: ShopCommissionRole) { - const res = await request.post>( - '/shop/shop-commission-role', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分红角色 - */ -export async function updateShopCommissionRole(data: ShopCommissionRole) { - const res = await request.put>( - '/shop/shop-commission-role', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分红角色 - */ -export async function removeShopCommissionRole(id?: number) { - const res = await request.del>( - '/shop/shop-commission-role/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分红角色 - */ -export async function removeBatchShopCommissionRole(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-commission-role/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分红角色 - */ -export async function getShopCommissionRole(id: number) { - const res = await request.get>( - '/shop/shop-commission-role/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopCommissionRole/model/index.ts b/src_bak/api/shop/shopCommissionRole/model/index.ts deleted file mode 100644 index 2881941..0000000 --- a/src_bak/api/shop/shopCommissionRole/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分红角色 - */ -export interface ShopCommissionRole { - // - id?: number; - // - title?: string; - // - provinceId?: number; - // - cityId?: number; - // - regionId?: number; - // 状态, 0正常, 1异常 - status?: number; - // 备注 - comments?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // - sortNumber?: number; -} - -/** - * 分红角色搜索条件 - */ -export interface ShopCommissionRoleParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopCoupon/index.ts b/src_bak/api/shop/shopCoupon/index.ts deleted file mode 100644 index be92c82..0000000 --- a/src_bak/api/shop/shopCoupon/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopCoupon, ShopCouponParam, ShopCouponWithTake } from './model'; - -/** - * 分页查询优惠券 - */ -export async function pageShopCoupon(params: ShopCouponParam) { - const res = await request.get>>( - '/shop/shop-coupon/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询优惠券列表 - */ -export async function listShopCoupon(params?: ShopCouponParam) { - const res = await request.get>( - '/shop/shop-coupon', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加优惠券 - */ -export async function addShopCoupon(data: ShopCoupon) { - const res = await request.post>( - '/shop/shop-coupon', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改优惠券 - */ -export async function updateShopCoupon(data: ShopCoupon) { - const res = await request.put>( - '/shop/shop-coupon', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除优惠券 - */ -export async function removeShopCoupon(id?: number) { - const res = await request.del>( - '/shop/shop-coupon/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除优惠券 - */ -export async function removeBatchShopCoupon(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-coupon/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询优惠券 - */ -export async function getShopCoupon(id: number) { - const res = await request.get>( - '/shop/shop-coupon/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 领券中心-查询可领取优惠券列表(含是否已领取状态) - */ -export async function listCouponCenter(params?: ShopCouponParam) { - const res = await request.post>( - '/shop/shop-coupon/list', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopCoupon/model/index.ts b/src_bak/api/shop/shopCoupon/model/index.ts deleted file mode 100644 index 9fb4401..0000000 --- a/src_bak/api/shop/shopCoupon/model/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 优惠券 - */ -export interface ShopCoupon { - // id - id?: number; - // 优惠券名称 - name?: string; - // 优惠券描述 - description?: string; - // 优惠券类型(10满减券 20折扣券 30免费券 40无门槛券 50场地使用券) - type?: number; - // 满减券-减免金额 - reducePrice?: string; - // 折扣券-折扣率(0-100) - discount?: number; - // 最低消费金额 - minPrice?: string; - // 到期类型(10领取后生效 20固定时间) - expireType?: number; - // 领取后生效-有效天数 - expireDay?: number; - // 有效期开始时间 - startTime?: string; - // 有效期结束时间 - endTime?: string; - // 适用范围(10全部商品 20指定商品 30指定分类) - applyRange?: number; - // 适用范围配置(json格式) - applyRangeConfig?: string; - // 是否过期(0未过期 1已过期) - isExpire?: number; - // 排序(数字越小越靠前) - sortNumber?: number; - // 状态, 0正常, 1禁用 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 创建用户ID - userId?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 发放总数量(-1表示无限制) - totalCount?: number; - // 已发放数量 - issuedCount?: number; - // 每人限领数量(-1表示无限制) - limitPerUser?: number; - // 是否启用(0禁用 1启用) - enabled?: string; - // 发放对象(0全部用户 1仅会员 2仅非会员 3指定用户) - receiveTarget?: number; - // 指定用户ID列表(JSON数组格式),receiveTarget=3时使用 - receiveUserIds?: string; - // 场地使用券-场地类型 - venueType?: number; - // 场地使用券-指定场地ID - venueId?: number; - // 场地使用券-可用次数(-1表示无限制) - useCount?: number; - // 场地使用券-使用时长(分钟) - useDuration?: number; - sortBy?: string; -} - -/** - * 优惠券搜索条件 - */ -export interface ShopCouponParam extends PageParam { - id?: number; - status?: number; - isExpire?: number; - sortBy?: string; - sortOrder?: 'asc' | 'desc'; - keywords?: string; - enabled?: number; - type?: number; - minAmount?: number; -} - -/** - * 领券中心优惠券(含是否已领取) - */ -export interface ShopCouponWithTake extends ShopCoupon { - // 是否已领取 - hasTake?: boolean; - // 用户已领取数量 - userTakeNum?: number; - // 用户已使用数量 - userUseNum?: number; -} diff --git a/src_bak/api/shop/shopCustomerService/index.ts b/src_bak/api/shop/shopCustomerService/index.ts deleted file mode 100644 index 251739f..0000000 --- a/src_bak/api/shop/shopCustomerService/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import request from '@/utils/request' -import type { CustomerServiceInfo } from './model' - -/** 获取客服信息 */ -export function getCustomerServiceInfo() { - return request.post('/shopCustomerService/getInfo', {}) -} - -/** 发送消息 */ -export function sendMessage(data: { content: string; type: 'text' | 'image' }) { - return request.post<{ success: boolean }>('/shopCustomerService/sendMessage', data) -} - -/** 获取聊天记录 */ -export function getChatHistory(params: { page?: number; pageSize?: number } = {}) { - return request.post<{ items: any[]; total: number }>('/shopCustomerService/getHistory', params) -} diff --git a/src_bak/api/shop/shopCustomerService/model.ts b/src_bak/api/shop/shopCustomerService/model.ts deleted file mode 100644 index 9a3f2a3..0000000 --- a/src_bak/api/shop/shopCustomerService/model.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** 客服消息 */ -export interface CustomerServiceMessage { - id: number - userId: number - content: string - type: 'text' | 'image' - isFromUser: boolean - createTime: string -} - -/** 客服会话 */ -export interface CustomerServiceSession { - id: number - userId: number - status: number - createTime: string - messages?: CustomerServiceMessage[] -} - -/** 客服信息 */ -export interface CustomerServiceInfo { - online: boolean - onlineHours: string - hotline: string - wechat: string -} diff --git a/src_bak/api/shop/shopDealerApply/index.ts b/src_bak/api/shop/shopDealerApply/index.ts deleted file mode 100644 index c974214..0000000 --- a/src_bak/api/shop/shopDealerApply/index.ts +++ /dev/null @@ -1,155 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerApply, ShopDealerApplyParam } from './model'; - -/** - * 分页查询分销商申请记录表 - */ -export async function pageShopDealerApply(params: ShopDealerApplyParam) { - const res = await request.get>>( - '/shop/shop-dealer-apply/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商申请记录表列表 - */ -export async function listShopDealerApply(params?: ShopDealerApplyParam) { - const res = await request.get>( - '/shop/shop-dealer-apply', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商申请记录表 - */ -export async function addShopDealerApply(data: ShopDealerApply) { - try { - const res = await request.post>( - '/shop/shop-dealer-apply', - data - ); - if (res.code === 0) { - return res.message || '提交成功'; - } - // 直接抛出包含服务器错误信息的错误 - const error = new Error(res.message || '提交失败'); - (error as any).code = res.code; - (error as any).data = res.data; - throw error; - } catch (error: any) { - // 如果已经是我们处理过的错误,直接抛出 - if (error.message && error.code !== undefined) { - throw error; - } - - // 处理网络错误或其他异常 - console.error('添加分销商申请失败:', error); - - // 尝试从响应中提取错误信息 - if (error.response?.data) { - const responseData = error.response.data; - if (responseData.message) { - const newError = new Error(responseData.message); - (newError as any).code = responseData.code; - throw newError; - } - } - - // 默认错误处理 - throw new Error(error.message || '网络错误,请重试'); - } -} - -/** - * 修改分销商申请记录表 - */ -export async function updateShopDealerApply(data: ShopDealerApply) { - try { - const res = await request.put>( - '/shop/shop-dealer-apply', - data - ); - if (res.code === 0) { - return res.message || '修改成功'; - } - // 直接抛出包含服务器错误信息的错误 - const error = new Error(res.message || '修改失败'); - (error as any).code = res.code; - (error as any).data = res.data; - throw error; - } catch (error: any) { - // 如果已经是我们处理过的错误,直接抛出 - if (error.message && error.code !== undefined) { - throw error; - } - - // 处理网络错误或其他异常 - console.error('修改分销商申请失败:', error); - - // 尝试从响应中提取错误信息 - if (error.response?.data) { - const responseData = error.response.data; - if (responseData.message) { - const newError = new Error(responseData.message); - (newError as any).code = responseData.code; - throw newError; - } - } - - // 默认错误处理 - throw new Error(error.message || '网络错误,请重试'); - } -} - -/** - * 删除分销商申请记录表 - */ -export async function removeShopDealerApply(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-apply/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商申请记录表 - */ -export async function removeBatchShopDealerApply(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-apply/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分销商申请记录表 - */ -export async function getShopDealerApply(id: number) { - const res = await request.get>( - '/shop/shop-dealer-apply/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerApply/model/index.ts b/src_bak/api/shop/shopDealerApply/model/index.ts deleted file mode 100644 index 8ea27cc..0000000 --- a/src_bak/api/shop/shopDealerApply/model/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分销商申请记录表 - */ -export interface ShopDealerApply { - // 主键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 ShopDealerApplyParam extends PageParam { - applyId?: number; - mobile?: string; - userId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopDealerCapital/index.ts b/src_bak/api/shop/shopDealerCapital/index.ts deleted file mode 100644 index 4c4b112..0000000 --- a/src_bak/api/shop/shopDealerCapital/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerCapital, ShopDealerCapitalParam } from './model'; - -/** - * 分页查询分销商资金明细表 - */ -export async function pageShopDealerCapital(params: ShopDealerCapitalParam) { - const res = await request.get>>( - '/shop/shop-dealer-capital/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商资金明细表列表 - */ -export async function listShopDealerCapital(params?: ShopDealerCapitalParam) { - const res = await request.get>( - '/shop/shop-dealer-capital', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商资金明细表 - */ -export async function addShopDealerCapital(data: ShopDealerCapital) { - const res = await request.post>( - '/shop/shop-dealer-capital', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分销商资金明细表 - */ -export async function updateShopDealerCapital(data: ShopDealerCapital) { - const res = await request.put>( - '/shop/shop-dealer-capital', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分销商资金明细表 - */ -export async function removeShopDealerCapital(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-capital/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商资金明细表 - */ -export async function removeBatchShopDealerCapital(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-capital/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分销商资金明细表 - */ -export async function getShopDealerCapital(id: number) { - const res = await request.get>( - '/shop/shop-dealer-capital/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerCapital/model.ts b/src_bak/api/shop/shopDealerCapital/model.ts deleted file mode 100644 index ad4b293..0000000 --- a/src_bak/api/shop/shopDealerCapital/model.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * 分销商资金明细表 - */ -export interface ShopDealerCapital { - /** 主键ID */ - id?: number; - /** 分销商用户ID */ - userId?: number; - /** 分销商昵称 */ - nickName?: string; - /** 订单编号 */ - orderNo?: string; - /** 订单状态 */ - orderStatus?: number; - /** 资金流动类型 (10佣金收入 20提现支出 30转账支出 40转账收入 50佣金解冻 60配送奖励) */ - flowType?: number; - /** 金额 */ - money?: number; - /** 描述 */ - comments?: string; - /** 对方用户ID */ - toUserId?: number; - /** 对方昵称 */ - toNickName?: string; - /** 结算月份 */ - month?: string; - /** 商城ID */ - tenantId?: number; - /** 创建时间 */ - createTime?: string; - /** 修改时间 */ - updateTime?: string; -} - -/** - * 分销商资金明细表查询参数 - */ -export interface ShopDealerCapitalParam { - /** 主键ID */ - id?: number; - /** 分销商用户ID */ - userId?: number; - /** 订单编号 */ - orderNo?: string; - /** 资金流动类型 (10佣金收入 20提现支出 30转账支出 40转账收入 50佣金解冻) */ - flowType?: number; - /** 金额 */ - money?: number; - /** 描述 */ - comments?: string; - /** 对方用户ID */ - toUserId?: number; - /** 月份 */ - month?: string; - /** 第几页 */ - page?: number; - /** 每页多少条 */ - limit?: number; - /** 排序字段 */ - sort?: string; - /** 排序方式, asc升序, desc降序 */ - order?: string; - /** 起始时间 */ - createTimeStart?: string; - /** 结束时间 */ - createTimeEnd?: string; -} - -/** - * 资金流动类型枚举 - */ -export enum FlowTypeEnum { - /** 佣金收入 */ - COMMISSION_INCOME = 10, - /** 提现支出 */ - WITHDRAW_OUT = 20, - /** 转账支出 */ - TRANSFER_OUT = 30, - /** 转账收入 */ - TRANSFER_IN = 40, - /** 佣金解冻 */ - COMMISSION_UNFREEZE = 50, - /** 配送奖励 */ - DELIVERY_REWARD = 60, -} - -/** - * 返利记录类型 - */ -export type RebateRecordType = 'register' | 'order'; - -/** - * 返利记录状态 - */ -export type RebateRecordStatus = 'pending' | 'settled'; - -/** - * 返利记录(前端展示用) - */ -export interface RebateRecord { - id: number; - type: RebateRecordType; - title: string; - amount: number; - status: RebateRecordStatus; - date: string; - orderNo?: string; - comments?: string; -} diff --git a/src_bak/api/shop/shopDealerCapital/model/index.ts b/src_bak/api/shop/shopDealerCapital/model/index.ts deleted file mode 100644 index 00d29a7..0000000 --- a/src_bak/api/shop/shopDealerCapital/model/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分销商资金明细表 - */ -export interface ShopDealerCapital { - // 主键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 ShopDealerCapitalParam extends PageParam { - id?: number; - // 仅查询当前分销商的收益/资金明细 - userId?: number; - // 可选:按订单过滤 - orderId?: number; - // 可选:资金流动类型过滤 - flowType?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopDealerOrder/index.ts b/src_bak/api/shop/shopDealerOrder/index.ts deleted file mode 100644 index d29f0d8..0000000 --- a/src_bak/api/shop/shopDealerOrder/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerOrder, ShopDealerOrderParam } from './model'; - -/** - * 分页查询分销商订单记录表 - */ -export async function pageShopDealerOrder(params: ShopDealerOrderParam) { - const res = await request.get>>( - '/shop/shop-dealer-order/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商订单记录表列表 - */ -export async function listShopDealerOrder(params?: ShopDealerOrderParam) { - const res = await request.get>( - '/shop/shop-dealer-order', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商订单记录表 - */ -export async function addShopDealerOrder(data: ShopDealerOrder) { - const res = await request.post>( - '/shop/shop-dealer-order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分销商订单记录表 - */ -export async function updateShopDealerOrder(data: ShopDealerOrder) { - const res = await request.put>( - '/shop/shop-dealer-order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分销商订单记录表 - */ -export async function removeShopDealerOrder(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-order/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商订单记录表 - */ -export async function removeBatchShopDealerOrder(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-order/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分销商订单记录表 - */ -export async function getShopDealerOrder(id: number) { - const res = await request.get>( - '/shop/shop-dealer-order/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerOrder/model/index.ts b/src_bak/api/shop/shopDealerOrder/model/index.ts deleted file mode 100644 index 03c9512..0000000 --- a/src_bak/api/shop/shopDealerOrder/model/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分销商订单记录表 - */ -export interface ShopDealerOrder { - // 主键ID - id?: number; - // 买家用户ID - userId?: number; - nickname?: string; - // 订单编号(部分接口会直接返回订单号字符串) - orderNo?: string; - // 订单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; - // 佣金解冻(0未解冻 1已解冻) - isUnfreeze?: number; - // 订单状态 - orderStatus?: number; - // 结算时间 - settleTime?: number; - // 商城ID - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 分销商订单记录表搜索条件 - */ -export interface ShopDealerOrderParam extends PageParam { - id?: number; - firstUserId?: number; - secondUserId?: number; - thirdUserId?: number; - userId?: number; - // 数据权限/资源ID(通常传当前登录用户ID) - resourceId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopDealerReferee/index.ts b/src_bak/api/shop/shopDealerReferee/index.ts deleted file mode 100644 index 949794f..0000000 --- a/src_bak/api/shop/shopDealerReferee/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerReferee, ShopDealerRefereeParam } from './model'; - -/** - * 分页查询分销商推荐关系表 - */ -export async function pageShopDealerReferee(params: ShopDealerRefereeParam) { - const res = await request.get>>( - '/shop/shop-dealer-referee/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商推荐关系表列表 - */ -export async function listShopDealerReferee(params?: ShopDealerRefereeParam) { - const res = await request.get>( - '/shop/shop-dealer-referee', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商推荐关系表 - */ -export async function addShopDealerReferee(data: ShopDealerReferee) { - const res = await request.post>( - '/shop/shop-dealer-referee', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分销商推荐关系表 - */ -export async function updateShopDealerReferee(data: ShopDealerReferee) { - const res = await request.put>( - '/shop/shop-dealer-referee', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分销商推荐关系表 - */ -export async function removeShopDealerReferee(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-referee/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商推荐关系表 - */ -export async function removeBatchShopDealerReferee(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-referee/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分销商推荐关系表 - */ -export async function getShopDealerReferee(id: number) { - const res = await request.get>( - '/shop/shop-dealer-referee/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerReferee/model/index.ts b/src_bak/api/shop/shopDealerReferee/model/index.ts deleted file mode 100644 index 044a77d..0000000 --- a/src_bak/api/shop/shopDealerReferee/model/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 分销商推荐关系表 - */ -export interface ShopDealerReferee { - // 主键ID - id?: number; - // 分销商用户ID - dealerId?: number; - // 用户id(被推荐人) - userId?: number; - // 推荐关系层级(1,2,3) - level?: number; - // 商城ID - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 分销商推荐关系表搜索条件 - */ -export interface ShopDealerRefereeParam extends PageParam { - id?: number; - dealerId?: number; - keywords?: string; - deleted?: number; -} diff --git a/src_bak/api/shop/shopDealerSetting/index.ts b/src_bak/api/shop/shopDealerSetting/index.ts deleted file mode 100644 index b6b457b..0000000 --- a/src_bak/api/shop/shopDealerSetting/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerSetting, ShopDealerSettingParam } from './model'; - -/** - * 分页查询分销商设置表 - */ -export async function pageShopDealerSetting(params: ShopDealerSettingParam) { - const res = await request.get>>( - '/shop/shop-dealer-setting/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商设置表列表 - */ -export async function listShopDealerSetting(params?: ShopDealerSettingParam) { - const res = await request.get>( - '/shop/shop-dealer-setting', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商设置表 - */ -export async function addShopDealerSetting(data: ShopDealerSetting) { - const res = await request.post>( - '/shop/shop-dealer-setting', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分销商设置表 - */ -export async function updateShopDealerSetting(data: ShopDealerSetting) { - const res = await request.put>( - '/shop/shop-dealer-setting', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分销商设置表 - */ -export async function removeShopDealerSetting(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-setting/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商设置表 - */ -export async function removeBatchShopDealerSetting(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-setting/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分销商设置表 - */ -export async function getShopDealerSetting(id: number) { - const res = await request.get>( - '/shop/shop-dealer-setting/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerSetting/model/index.ts b/src_bak/api/shop/shopDealerSetting/model/index.ts deleted file mode 100644 index 12126c3..0000000 --- a/src_bak/api/shop/shopDealerSetting/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分销商设置表 - */ -export interface ShopDealerSetting { - // 设置项标示 - key?: string; - // 设置项描述 - describe?: string; - // 设置内容(json格式) - values?: string; - // 商城ID - tenantId?: number; - // 更新时间 - updateTime?: number; -} - -/** - * 分销商设置表搜索条件 - */ -export interface ShopDealerSettingParam extends PageParam { - key?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopDealerUser/index.ts b/src_bak/api/shop/shopDealerUser/index.ts deleted file mode 100644 index df82b27..0000000 --- a/src_bak/api/shop/shopDealerUser/index.ts +++ /dev/null @@ -1,103 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerUser, ShopDealerUserParam } from './model'; - -/** - * 分页查询分销商用户记录表 - */ -export async function pageShopDealerUser(params: ShopDealerUserParam) { - // 使用新的request方法,它会自动处理错误并返回完整的ApiResult - const res = await request.get>>( - '/shop/shop-dealer-user/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商用户记录表列表 - */ -export async function listShopDealerUser(params?: ShopDealerUserParam) { - const res = await request.get>( - '/shop/shop-dealer-user', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商用户记录表 - */ -export async function addShopDealerUser(data: ShopDealerUser) { - const res = await request.post>( - '/shop/shop-dealer-user', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分销商用户记录表 - */ -export async function updateShopDealerUser(data: ShopDealerUser) { - const res = await request.put>( - '/shop/shop-dealer-user', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分销商用户记录表 - */ -export async function removeShopDealerUser(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-user/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商用户记录表 - */ -export async function removeBatchShopDealerUser(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-user/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据userId查询分销商用户记录表 - */ -export async function getShopDealerUser(userId: number) { - const res = await request.get>( - '/shop/shop-dealer-user/' + userId - ); - if (res.code === 0) { - // 未注册为分销商时,后端可能返回 data=null,这里用 null 表示“没有分销商信息” - return res.data || null; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerUser/model/index.ts b/src_bak/api/shop/shopDealerUser/model/index.ts deleted file mode 100644 index beda51c..0000000 --- a/src_bak/api/shop/shopDealerUser/model/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分销商用户记录表 - */ -export interface ShopDealerUser { - // 主键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; - // 专属二维码 - qrcode?: string; - // 是否删除 - isDelete?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 分销商等级:0-普通用户 1-超级管理员 2-合伙人(总店) 3-合伙人(分店) - dealerLevel?: number; -} - -/** - * 分销商用户记录表搜索条件 - */ -export interface ShopDealerUserParam extends PageParam { - id?: number; - phone?: string; - userId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopDealerWithdraw/index.ts b/src_bak/api/shop/shopDealerWithdraw/index.ts deleted file mode 100644 index 398b9be..0000000 --- a/src_bak/api/shop/shopDealerWithdraw/index.ts +++ /dev/null @@ -1,145 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopDealerWithdraw, ShopDealerWithdrawParam } from './model'; - -// WeChat transfer v3: backend may return `package_info` for MiniProgram to open the -// "confirm receipt" page via `wx.requestMerchantTransfer`. -export type ShopDealerWithdrawCreateResult = - | string - | { - package_info?: string; - packageInfo?: string; - [k: string]: any; - } - | null - | undefined; - -// When applyStatus=20, user can "receive" (WeChat confirm receipt flow). -export type ShopDealerWithdrawReceiveResult = ShopDealerWithdrawCreateResult; - -/** - * 分页查询分销商提现明细表 - */ -export async function pageShopDealerWithdraw(params: ShopDealerWithdrawParam) { - const res = await request.get>>( - '/shop/shop-dealer-withdraw/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询分销商提现明细表列表 - */ -export async function listShopDealerWithdraw(params?: ShopDealerWithdrawParam) { - const res = await request.get>( - '/shop/shop-dealer-withdraw', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加分销商提现明细表 - */ -export async function addShopDealerWithdraw(data: ShopDealerWithdraw): Promise { - const res = await request.post>( - '/shop/shop-dealer-withdraw', - data - ); - if (res.code === 0) { - // Some backends return `message`, while WeChat transfer flow returns `data.package_info`. - return res.data ?? res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 用户领取(仅当 applyStatus=20 时)- 后台返回 package_info 供小程序调起确认收款页 - */ -export async function receiveShopDealerWithdraw(id: number): Promise { - const res = await request.post>( - '/shop/shop-dealer-withdraw/receive/' + id, - {} - ); - if (res.code === 0) { - return res.data ?? res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 领取成功回调:前端确认收款后通知后台把状态置为 applyStatus=40 - */ -export async function receiveSuccessShopDealerWithdraw(id: number) { - const res = await request.post>( - '/shop/shop-dealer-withdraw/receive-success/' + id, - {} - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改分销商提现明细表 - */ -export async function updateShopDealerWithdraw(data: ShopDealerWithdraw) { - const res = await request.put>( - '/shop/shop-dealer-withdraw', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除分销商提现明细表 - */ -export async function removeShopDealerWithdraw(id?: number) { - const res = await request.del>( - '/shop/shop-dealer-withdraw/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除分销商提现明细表 - */ -export async function removeBatchShopDealerWithdraw(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-dealer-withdraw/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询分销商提现明细表 - */ -export async function getShopDealerWithdraw(id: number) { - const res = await request.get>( - '/shop/shop-dealer-withdraw/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopDealerWithdraw/model/index.ts b/src_bak/api/shop/shopDealerWithdraw/model/index.ts deleted file mode 100644 index d53db44..0000000 --- a/src_bak/api/shop/shopDealerWithdraw/model/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 分销商提现明细表 - */ -export interface ShopDealerWithdraw { - // 主键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 ShopDealerWithdrawParam extends PageParam { - id?: number; - userId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopEvaluation/index.ts b/src_bak/api/shop/shopEvaluation/index.ts deleted file mode 100644 index b46e13a..0000000 --- a/src_bak/api/shop/shopEvaluation/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { - ShopEvaluation, - ShopEvaluationParam, - CreateEvaluationParams, - LikeEvaluationParams, - EvaluationStats, -} from './model' - -/** - * 分页查询评价 - */ -export async function pageShopEvaluation(params: ShopEvaluationParam) { - const res = await request.get>>( - '/shop/shop-evaluation/page', - params - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询评价列表 - */ -export async function listShopEvaluation(params?: ShopEvaluationParam) { - const res = await request.get>( - '/shop/shop-evaluation', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 根据ID查询评价 - */ -export async function getShopEvaluation(id: number) { - const res = await request.get>( - '/shop/shop-evaluation/' + id - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 创建评价 - */ -export async function createShopEvaluation(data: CreateEvaluationParams) { - const res = await request.post>( - '/shop/shop-evaluation', - data - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 删除评价 - */ -export async function removeShopEvaluation(id?: number) { - const res = await request.del>( - '/shop/shop-evaluation/' + id - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 点赞/取消点赞评价 - */ -export async function likeShopEvaluation(params: LikeEvaluationParams) { - const res = await request.post>( - '/shop/shop-evaluation/like', - params - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取商品评价统计 - */ -export async function getEvaluationStats(goodsId: number) { - const res = await request.get>( - '/shop/shop-evaluation/stats', - { goodsId } - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取订单的评价信息(用于判断是否已评价) - */ -export async function getOrderEvaluationStatus(orderId: number) { - const res = await request.get>( - '/shop/shop-evaluation/order-status', - { orderId } - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopEvaluation/model/index.ts b/src_bak/api/shop/shopEvaluation/model/index.ts deleted file mode 100644 index d74b52e..0000000 --- a/src_bak/api/shop/shopEvaluation/model/index.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * 商品评价模型 - */ - -// 评价维度 -export interface EvaluationDimension { - name: string // 维度名称(如:质量、服务、物流) - score: number // 维度评分(1-5) -} - -// 评价数据 -export interface ShopEvaluation { - id: number - goodsId: number // 商品ID - goodsName: string // 商品名称 - goodsImage: string // 商品图片 - orderId: number // 订单ID - userId: number // 用户ID - userName: string // 用户名(脱敏) - userAvatar?: string // 用户头像 - score: number // 总评分(1-5) - dimensions?: EvaluationDimension[] // 评价维度 - content: string // 评价内容 - images: string[] // 评价图片 - isAnonymous: boolean // 是否匿名 - likes: number // 点赞数 - isLiked: boolean // 当前用户是否点赞 - reply?: string // 商家回复 - replyTime?: string // 回复时间 - createTime: string // 评价时间 - updateTime?: string // 更新时间 -} - -// 评价查询参数 -export interface ShopEvaluationParam { - page?: number - limit?: number - goodsId?: number // 按商品查询 - userId?: number // 按用户查询 - orderId?: number // 按订单查询 - minScore?: number // 最低评分 - maxScore?: number // 最高评分 - hasImages?: boolean // 是否有图 - isLiked?: boolean // 是否点赞过 - sortBy?: string // 排序方式(newest, mostLiked) - keywords?: string // 关键词搜索 -} - -// 创建评价参数 -export interface CreateEvaluationParams { - orderId: number - goodsId: number - score: number - dimensions?: EvaluationDimension[] - content: string - images?: string[] - isAnonymous: boolean -} - -// 点赞/取消点赞参数 -export interface LikeEvaluationParams { - evaluationId: number - isLiked: boolean -} - -// 评价统计 -export interface EvaluationStats { - total: number // 总评价数 - averageScore: number // 平均评分 - scoreDistribution: { // 评分分布 - [key: number]: number - } - imageCount: number // 有图评价数 - positiveCount: number // 好评数(4-5星) - neutralCount: number // 中评数(3星) - negativeCount: number // 差评数(1-2星) -} diff --git a/src_bak/api/shop/shopEvent/index.ts b/src_bak/api/shop/shopEvent/index.ts deleted file mode 100644 index 237fe7b..0000000 --- a/src_bak/api/shop/shopEvent/index.ts +++ /dev/null @@ -1,80 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { - ShopEvent, - ShopEventParam, - EventRegisterParams, - EventRegistration, - RegistrationStatus, -} from './model' - -export type { ShopEvent, EventRegistration, RegistrationStatus, EventStatus, EventFormField } from './model' -export { getEventStatusLabel, getPayStatusLabel } from './model' - -/** - * 分页查询赛事 - */ -export async function pageShopEvent(params: ShopEventParam) { - const res = await request.get>>( - '/shop/shop-event/page', - params - ) - if (res.code === 0 && res.data) return res.data - return Promise.reject(new Error(res.message)) -} - -/** - * 赛事详情 - */ -export async function getShopEvent(id: number) { - const res = await request.get>(`/shop/shop-event/${id}`) - if (res.code === 0 && res.data) return res.data - return Promise.reject(new Error(res.message)) -} - -/** - * 提交报名(免费返回 {success,free},收费返回微信支付参数) - */ -export async function registerEvent(data: EventRegisterParams) { - const res = await request.post>>( - '/shop/shop-event/register', - data - ) - if (res.code === 0 && res.data) return res.data - return Promise.reject(new Error(res.message)) -} - -/** - * 重新发起支付 - */ -export async function payEventRegistration(registrationId: number) { - const res = await request.post>>( - '/shop/shop-event/pay', - { registrationId } - ) - if (res.code === 0 && res.data) return res.data - return Promise.reject(new Error(res.message)) -} - -/** - * 查询报名状态 - */ -export async function getRegistrationStatus(eventId: number) { - const res = await request.get>( - '/shop/shop-event/registration-status', - { eventId } - ) - if (res.code === 0 && res.data) return res.data - return Promise.reject(new Error(res.message)) -} - -/** - * 我的报名记录 - */ -export async function getMyRegistrations() { - const res = await request.get>( - '/shop/shop-event/my-registrations' - ) - if (res.code === 0 && res.data) return res.data - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopEvent/model/index.ts b/src_bak/api/shop/shopEvent/model/index.ts deleted file mode 100644 index bfde609..0000000 --- a/src_bak/api/shop/shopEvent/model/index.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * 赛事模型 - */ - -export type EventStatus = 'upcoming' | 'registering' | 'closed' | 'ended' - -/** 动态报名表单字段配置 */ -export interface EventFormField { - /** 字段唯一标识 */ - key: string - /** 显示名称(后台可自定义) */ - label: string - /** 字段类型:text-文本 number-数字 idcard-身份证 phone-手机号 select-下拉选择 radio-单选 */ - type: 'text' | 'number' | 'idcard' | 'phone' | 'select' | 'radio' - /** 是否必填 1=必填 0=选填 */ - required: number - /** 选项列表(type=select/radio时有效) */ - options?: string[] - /** 占位提示文字 */ - placeholder?: string - /** 排序号 */ - sort: number -} - -export interface ShopEvent { - id: number - name: string - description: string - image?: string - banner?: string - eventDate: string - location?: string - maxParticipants: number - entryFee: number - /** 动态表单字段配置(JSON字符串或数组) */ - formFields?: string | EventFormField[] - status: number | EventStatus - isHot: number - tenantId?: number - createTime: string - paidCount: number -} - -export interface ShopEventParam { - page?: number - limit?: number - status?: number - isHot?: number - tenantId?: number -} - -export interface EventRegisterParams { - eventId: number - /** 动态表单数据,key-value 形式 */ - formData?: Record -} - -export interface EventRegistration { - id: number - eventId: number - userId: number - /** 动态表单提交的数据 */ - formData?: string | Record - entryFee: number - payStatus: number // 0=待缴费 1=已缴费 2=已取消 - orderNo?: string - paidAt?: string - createTime: string - eventName?: string -} - -export interface RegistrationStatus { - registered: boolean - payStatus: number | null - registrationId?: number -} - -// 状态映射 -export function getEventStatusLabel(status: number): { label: string; color: string } { - const map: Record = { - 0: { label: '未开始', color: 'text-blue-500' }, - 1: { label: '报名中', color: 'text-green-500' }, - 2: { label: '已截止', color: 'text-orange-400' }, - 3: { label: '已结束', color: 'text-gray-400' }, - } - return map[status] ?? { label: '未知', color: 'text-gray-400' } -} - -export function getPayStatusLabel(payStatus: number): { label: string; color: string } { - const map: Record = { - 0: { label: '待缴费', color: 'text-orange-500' }, - 1: { label: '已缴费', color: 'text-green-500' }, - 2: { label: '已取消', color: 'text-gray-400' }, - } - return map[payStatus] ?? { label: '未知', color: 'text-gray-400' } -} diff --git a/src_bak/api/shop/shopExpress/index.ts b/src_bak/api/shop/shopExpress/index.ts deleted file mode 100644 index abfcf46..0000000 --- a/src_bak/api/shop/shopExpress/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopExpress, ShopExpressParam } from './model'; - -/** - * 分页查询物流公司 - */ -export async function pageShopExpress(params: ShopExpressParam) { - const res = await request.get>>( - '/shop/shop-express/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询物流公司列表 - */ -export async function listShopExpress(params?: ShopExpressParam) { - const res = await request.get>( - '/shop/shop-express', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加物流公司 - */ -export async function addShopExpress(data: ShopExpress) { - const res = await request.post>( - '/shop/shop-express', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改物流公司 - */ -export async function updateShopExpress(data: ShopExpress) { - const res = await request.put>( - '/shop/shop-express', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除物流公司 - */ -export async function removeShopExpress(id?: number) { - const res = await request.del>( - '/shop/shop-express/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除物流公司 - */ -export async function removeBatchShopExpress(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-express/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询物流公司 - */ -export async function getShopExpress(id: number) { - const res = await request.get>( - '/shop/shop-express/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopExpress/model/index.ts b/src_bak/api/shop/shopExpress/model/index.ts deleted file mode 100644 index 378a652..0000000 --- a/src_bak/api/shop/shopExpress/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 物流公司 - */ -export interface ShopExpress { - // 物流公司ID - expressId?: number; - // 物流公司名称 - expressName?: string; - // 物流公司编码 (微信) - wxCode?: string; - // 物流公司编码 (快递100) - kuaidi100Code?: string; - // 物流公司编码 (快递鸟) - kdniaoCode?: string; - // 排序号 - sortNumber?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 物流公司搜索条件 - */ -export interface ShopExpressParam extends PageParam { - expressId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopExpressTemplate/index.ts b/src_bak/api/shop/shopExpressTemplate/index.ts deleted file mode 100644 index b056f1f..0000000 --- a/src_bak/api/shop/shopExpressTemplate/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopExpressTemplate, ShopExpressTemplateParam } from './model'; - -/** - * 分页查询运费模板 - */ -export async function pageShopExpressTemplate(params: ShopExpressTemplateParam) { - const res = await request.get>>( - '/shop/shop-express-template/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询运费模板列表 - */ -export async function listShopExpressTemplate(params?: ShopExpressTemplateParam) { - const res = await request.get>( - '/shop/shop-express-template', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加运费模板 - */ -export async function addShopExpressTemplate(data: ShopExpressTemplate) { - const res = await request.post>( - '/shop/shop-express-template', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改运费模板 - */ -export async function updateShopExpressTemplate(data: ShopExpressTemplate) { - const res = await request.put>( - '/shop/shop-express-template', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除运费模板 - */ -export async function removeShopExpressTemplate(id?: number) { - const res = await request.del>( - '/shop/shop-express-template/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除运费模板 - */ -export async function removeBatchShopExpressTemplate(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-express-template/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询运费模板 - */ -export async function getShopExpressTemplate(id: number) { - const res = await request.get>( - '/shop/shop-express-template/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopExpressTemplate/model/index.ts b/src_bak/api/shop/shopExpressTemplate/model/index.ts deleted file mode 100644 index 5700987..0000000 --- a/src_bak/api/shop/shopExpressTemplate/model/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 运费模板 - */ -export interface ShopExpressTemplate { - // - id?: number; - // - type?: string; - // - title?: string; - // 收件价格 - firstAmount?: string; - // 续件价格 - extraAmount?: string; - // 状态, 0已发布, 1待审核 2已驳回 3违规内容 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // - sortNumber?: number; - // 首件数量/重量 - firstNum?: string; - // 续件数量/重量 - extraNum?: string; -} - -/** - * 运费模板搜索条件 - */ -export interface ShopExpressTemplateParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopExpressTemplateDetail/index.ts b/src_bak/api/shop/shopExpressTemplateDetail/index.ts deleted file mode 100644 index 783a53e..0000000 --- a/src_bak/api/shop/shopExpressTemplateDetail/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopExpressTemplateDetail, ShopExpressTemplateDetailParam } from './model'; - -/** - * 分页查询运费模板 - */ -export async function pageShopExpressTemplateDetail(params: ShopExpressTemplateDetailParam) { - const res = await request.get>>( - '/shop/shop-express-template-detail/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询运费模板列表 - */ -export async function listShopExpressTemplateDetail(params?: ShopExpressTemplateDetailParam) { - const res = await request.get>( - '/shop/shop-express-template-detail', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加运费模板 - */ -export async function addShopExpressTemplateDetail(data: ShopExpressTemplateDetail) { - const res = await request.post>( - '/shop/shop-express-template-detail', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改运费模板 - */ -export async function updateShopExpressTemplateDetail(data: ShopExpressTemplateDetail) { - const res = await request.put>( - '/shop/shop-express-template-detail', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除运费模板 - */ -export async function removeShopExpressTemplateDetail(id?: number) { - const res = await request.del>( - '/shop/shop-express-template-detail/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除运费模板 - */ -export async function removeBatchShopExpressTemplateDetail(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-express-template-detail/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询运费模板 - */ -export async function getShopExpressTemplateDetail(id: number) { - const res = await request.get>( - '/shop/shop-express-template-detail/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopExpressTemplateDetail/model/index.ts b/src_bak/api/shop/shopExpressTemplateDetail/model/index.ts deleted file mode 100644 index 84e2dc8..0000000 --- a/src_bak/api/shop/shopExpressTemplateDetail/model/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 运费模板 - */ -export interface ShopExpressTemplateDetail { - // - id?: number; - // - templateId?: number; - // 0按件 - type?: string; - // - provinceId?: number; - // - cityId?: number; - // 首件数量/重量 - firstNum?: string; - // 收件价格 - firstAmount?: string; - // 续件价格 - extraAmount?: string; - // 续件数量/重量 - extraNum?: string; - // 状态, 0已发布, 1待审核 2已驳回 3违规内容 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // - sortNumber?: number; -} - -/** - * 运费模板搜索条件 - */ -export interface ShopExpressTemplateDetailParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopGift/index.ts b/src_bak/api/shop/shopGift/index.ts deleted file mode 100644 index 9afda93..0000000 --- a/src_bak/api/shop/shopGift/index.ts +++ /dev/null @@ -1,260 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import {ShopGift, ShopGiftParam, GiftRedeemParam, GiftUseParam, QRCodeParam} from './model'; - -/** - * 分页查询礼品卡 - */ -export async function pageShopGift(params: ShopGiftParam) { - const res = await request.get>>( - '/shop/shop-gift/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询礼品卡列表 - */ -export async function listShopGift(params?: ShopGiftParam) { - const res = await request.get>( - '/shop/shop-gift', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加礼品卡 - */ -export async function addShopGift(data: ShopGift) { - const res = await request.post>( - '/shop/shop-gift', - data - ); - if (res.code === 0) { - return res.message; - } -} - -/** - * 生成礼品卡 - */ -export async function makeShopGift(data: ShopGift) { - const res = await request.post>( - '/shop/shop-gift/make', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改礼品卡 - */ -export async function updateShopGift(data: ShopGift) { - const res = await request.put>( - '/shop/shop-gift', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除礼品卡 - */ -export async function removeShopGift(id?: number) { - const res = await request.del>( - '/shop/shop-gift/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除礼品卡 - */ -export async function removeBatchShopGift(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-gift/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询礼品卡 - */ -export async function getShopGift(id: number) { - const res = await request.get>( - '/shop/shop-gift/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据code查询礼品卡 - * @param code - */ -export async function getShopGiftByCode(code: string) { - const res = await request.get>( - '/shop/shop-gift/by-code/' + code - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - - - -/** - * 兑换礼品卡 - */ -export async function redeemGift(params: GiftRedeemParam) { - const res = await request.post>( - '/shop/shop-gift/redeem', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 使用礼品卡 - */ -export async function useGift(params: GiftUseParam) { - const res = await request.post>( - '/shop/shop-gift/use', - params - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取用户的礼品卡列表 - */ -export async function getUserGifts(params: ShopGiftParam) { - const res = await request.get>>( - '/shop/shop-gift/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 验证礼品卡兑换码 - */ -export async function validateGiftCode(code: string) { - const res = await request.get>( - `/shop/shop-gift/validate/${code}` - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function exportShopGift(ids?: number[]) { - const res = await request.post>( - '/shop/shop-gift/export', - ids - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 生成礼品卡核销码(可用) - */ -export async function generateVerificationCode(data: QRCodeParam) { - const res = await request.post>( - '/qr-code/create-encrypted-qr-code', - data - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 验证核销码 - */ -export async function verifyGiftCard(params: { verificationCode?: string; giftCode?: string }) { - const res = await request.post>( - '/shop/shop-gift/verify', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 完成礼品卡核销 - */ -export async function completeVerification(params: { - giftId: number; - verificationCode: string; - storeId?: number; - storeName?: string; - operatorId?: number; - operatorName?: string; -}) { - const res = await request.post>( - '/shop/shop-gift/complete-verification', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 解密二维码数据 - */ -export async function decryptQrData(params: { token: string; encryptedData: string }) { - const res = await request.post>( - '/qr-code/decrypt-qr-data', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - diff --git a/src_bak/api/shop/shopGift/model/index.ts b/src_bak/api/shop/shopGift/model/index.ts deleted file mode 100644 index f3c7450..0000000 --- a/src_bak/api/shop/shopGift/model/index.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 水票 - */ -export interface ShopGift { - // 礼品卡ID - id?: number; - // 礼品卡名称 - name?: string; - // 礼品卡描述 - description?: string; - // 礼品卡兑换码 - code?: string; - // 关联商品ID - goodsId?: number; - // 商品名称 - goodsName?: string; - // 商品图片 - goodsImage?: string; - // 礼品卡面值 - faceValue?: string; - // 礼品卡类型 (10实物礼品卡 20虚拟礼品卡 30服务礼品卡) - type?: number; - // 领取时间 - takeTime?: string; - // 过期时间 - expireTime?: string; - // 有效期天数 - validDays?: number; - // 操作人 - operatorUserId?: number; - // 操作人名称 - operatorUserName?: string; - // 是否展示 - isShow?: string; - // 状态 (0未使用 1已使用 2已过期 3已失效) - status?: number; - // 备注 - comments?: string; - // 使用说明 - instructions?: string; - // 排序号 - sortNumber?: number; - // 拥有者用户ID - userId?: number; - // 发放者用户ID - issuerUserId?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 数量 - num?: number; - // 已发放数量 - issuedCount?: number; - // 总发放数量 - totalCount?: number; - // 使用门店/地址 - useLocation?: string; - // 客服联系方式 - contactInfo?: string; - // 核销时间 - verificationTime?: string; -} - -/** - * 礼品卡搜索条件 - */ -export interface ShopGiftParam extends PageParam { - id?: number; - keywords?: string; - code?: string; - // 礼品卡类型筛选 - type?: number; - // 状态筛选 (0未使用 1已使用 2失效) - status?: number; - // 用户ID筛选 - userId?: number; - // 商品ID筛选 - goodsId?: number; - // 是否过期筛选 - isExpired?: boolean; - // 排序字段 - sortBy?: 'createTime' | 'expireTime' | 'faceValue' | 'takeTime'; - // 排序方向 - sortOrder?: 'asc' | 'desc'; -} - -/** - * 礼品卡兑换参数 - */ -export interface GiftRedeemParam { - // 兑换码 - code: string; - // 用户ID - userId?: number; -} - -/** - * 礼品卡使用参数 - */ -export interface GiftUseParam { - // 礼品卡ID - giftId?: number; - // 使用地址/门店 - useLocation?: string; - // 使用备注 - useNote?: string; -} - -export interface QRCodeParam { - // 二维码数据 - data?: string; - // 二维码尺寸 - width?: number; - // 二维码高度 - height?: number; - // 二维码过期时间 - expireMinutes?: number; - // 业务类型 - businessType?: string; -} diff --git a/src_bak/api/shop/shopGiftCard/index.ts b/src_bak/api/shop/shopGiftCard/index.ts deleted file mode 100644 index 8136bb5..0000000 --- a/src_bak/api/shop/shopGiftCard/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import request from '@/utils/request' -import type { ShopGiftCard } from './model' - -/** 获取我的礼品卡列表 */ -export function listMyGiftCards() { - return request.get<{ code: number; data: ShopGiftCard[] }>('/shop/shop-gift/my') -} - -/** 绑定/兑换礼品卡 - * @param code - 礼品卡代码 - */ -export function bindGiftCard(code: string) { - return request.post<{ code: number; message: string }>('/shop/shop-gift/bind', { - code, - }) -} - -/** 获取礼品卡余额(从用户卡包统计中获取) */ -export function getGiftCardBalance() { - return request.get<{ code: number; data: { giftCards: number } }>('/user/card/stats') -} diff --git a/src_bak/api/shop/shopGiftCard/model.ts b/src_bak/api/shop/shopGiftCard/model.ts deleted file mode 100644 index f16c42e..0000000 --- a/src_bak/api/shop/shopGiftCard/model.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** 礼品卡 */ -export interface ShopGiftCard { - id: number - /** 卡号 */ - cardNo: string - /** 密码 */ - password?: string - /** 面额 */ - faceValue: number - /** 余额 */ - balance: number - /** 状态:0-未激活 1-正常 2-已用完 3-已过期 */ - status: number - /** 有效期 */ - expireTime: string - /** 创建时间 */ - createTime: string -} - -/** 礼品卡购买参数 */ -export interface GiftCardPurchaseParams { - amount: number - paymentMethod: number -} - -/** 礼品卡兑换参数 */ -export interface GiftCardExchangeParams { - code: string -} diff --git a/src_bak/api/shop/shopGoods/index.ts b/src_bak/api/shop/shopGoods/index.ts deleted file mode 100644 index 9b3a3a9..0000000 --- a/src_bak/api/shop/shopGoods/index.ts +++ /dev/null @@ -1,112 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopGoods, ShopGoodsParam } from './model'; - - -/** - * 分页查询商品 - */ -export async function pageShopGoods(params: ShopGoodsParam) { - const res = await request.get>>( - '/shop/shop-goods/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商品列表 - */ -export async function listShopGoods(params?: ShopGoodsParam) { - const res = await request.get>( - '/shop/shop-goods', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品 - */ -export async function addShopGoods(data: ShopGoods) { - const res = await request.post>( - '/shop/shop-goods', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商品 - */ -export async function updateShopGoods(data: ShopGoods) { - const res = await request.put>( - '/shop/shop-goods', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商品 - */ -export async function removeShopGoods(id?: number) { - const res = await request.del>( - '/shop/shop-goods/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商品 - */ -export async function removeBatchShopGoods(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-goods/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商品 - */ -export async function getShopGoods(id: number) { - const res = await request.get>( - '/shop/shop-goods/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -export async function getCount(params: ShopGoodsParam) { - const res = await request.get>('/shop/shop-goods/data', { - params - }); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopGoods/model/index.ts b/src_bak/api/shop/shopGoods/model/index.ts deleted file mode 100644 index fe12790..0000000 --- a/src_bak/api/shop/shopGoods/model/index.ts +++ /dev/null @@ -1,158 +0,0 @@ -import type { PageParam } from '@/api/index'; -import { ShopGoodsSpec } from '@/api/shop/shopGoodsSpec/model'; -import { ShopGoodsSku } from '@/api/shop/shopGoodsSku/model'; -import { ShopGoodsRoleCommission } from '@/api/shop/shopGoodsRoleCommission/model'; - -export interface GoodsCount { - totalNum: number; - totalNum2: number; - totalNum3: number; - totalNum4: number; -} -/** - * 商品记录表 - */ -export interface ShopGoods { - // 自增ID - goodsId?: number; - // 类型 1实物商品 2虚拟商品 - type?: number; - // 商品编码 - code?: string; - // 商品名称 - name?: string; - // 商品标题 - goodsName?: string; - // 商品封面图 - image?: string; - video?: string; - // 商品详情 - content?: string; - canExpress?: number; - // 商品分类 - category?: string; - // 商品分类ID - categoryId?: number; - parentName?: string; - categoryName?: string; - // 一级分类 - categoryParent?: string; - // 二级分类 - categoryChildren?: string; - // 商品规格 0单规格 1多规格 - specs?: number; - commissionRole?: number; - // 货架 - position?: string; - // 进货价 - buyingPrice?: string; - // 商品价格 - price?: string; - originPrice?: string; - // 销售价格 - salePrice?: string; - chainStorePrice?: string; - chainStoreRate?: string; - memberStoreRate?: string; - memberMarketRate?: string; - memberStoreCommission?: string; - supplierCommission?: string; - coopCommission?: string; - memberStorePrice?: string; - memberMarketPrice?: string; - // 经销商价格 - dealerPrice?: string; - // 有赠品 - buyingGift?: boolean; - // 有赠品 - priceGift?: boolean; - // 有赠品 - dealerGift?: boolean; - buyingGiftNum?: number; - priceGiftNum?: number; - priceGiftName?: string; - dealerGiftNum?: number; - // 库存计算方式(10下单减库存 20付款减库存) - deductStockType?: number; - // 封面图 - files?: string; - // 销量 - sales?: number; - isNew?: number; - // 库存 - stock?: number; - // 步长 - step?: number; - // 商品重量 - goodsWeight?: number; - // 消费赚取积分 - gainIntegral?: number; - // 推荐 - recommend?: number; - // 商户ID - merchantId?: number; - // 商户名称 - merchantName?: string; - supplierMerchantId?: number; - supplierName?: 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?: ShopGoodsSpec[]; - goodsRoleCommission?: ShopGoodsRoleCommission[]; - // 商品sku列表 - goodsSkus?: ShopGoodsSku[]; - // 单位名称 - unitName?: string; - expressTemplateId?: number; - canUseDate?: string; - ensureTag?: string; - expiredDay?: number; - // 可购买数量 - canBuyNumber?: number; - // 活动方式:0全平台 1新用户专享 - activityType?: number; - // 配送方式:0送上门 1限自提 - deliveryMode?: number; -} - -export interface BathSet { - price?: number; - salePrice?: number; - stock?: number; - skuNo?: string; -} - -/** - * 商品记录表搜索条件 - */ -export interface ShopGoodsParam extends PageParam { - parentId?: number; - categoryId?: number; - goodsId?: number; - goodsName?: string; - isShow?: number; - stock?: number; - keywords?: string; - recommend?: number; - // 0上架 1下架(以实际后端约定为准) - status?: number; -} diff --git a/src_bak/api/shop/shopGoodsCategory/index.ts b/src_bak/api/shop/shopGoodsCategory/index.ts deleted file mode 100644 index 3df88c0..0000000 --- a/src_bak/api/shop/shopGoodsCategory/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopGoodsCategory, ShopGoodsCategoryParam } from './model'; - -/** - * 分页查询商品分类 - */ -export async function pageShopGoodsCategory(params: ShopGoodsCategoryParam) { - const res = await request.get>>( - '/shop/shop-goods-category/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商品分类列表 - */ -export async function listShopGoodsCategory(params?: ShopGoodsCategoryParam) { - const res = await request.get>( - '/shop/shop-goods-category', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品分类 - */ -export async function addShopGoodsCategory(data: ShopGoodsCategory) { - const res = await request.post>( - '/shop/shop-goods-category', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商品分类 - */ -export async function updateShopGoodsCategory(data: ShopGoodsCategory) { - const res = await request.put>( - '/shop/shop-goods-category', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商品分类 - */ -export async function removeShopGoodsCategory(id?: number) { - const res = await request.del>( - '/shop/shop-goods-category/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商品分类 - */ -export async function removeBatchShopGoodsCategory(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-goods-category/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商品分类 - */ -export async function getShopGoodsCategory(id: number) { - const res = await request.get>( - '/shop/shop-goods-category/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopGoodsCategory/model/index.ts b/src_bak/api/shop/shopGoodsCategory/model/index.ts deleted file mode 100644 index c56c8b1..0000000 --- a/src_bak/api/shop/shopGoodsCategory/model/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商品分类 - */ -export interface ShopGoodsCategory { - // 商品分类ID - categoryId?: number; - // 分类标识 - categoryCode?: string; - // 分类名称 - title?: string; - // 类型 0商城分类 1外卖分类 - 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; - // 商铺ID - merchantId?: number; - // 状态, 0正常, 1禁用 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 注册时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 子菜单 - children?: ShopGoodsCategory[]; - key?: number; - value?: number; - label?: string; -} - -/** - * 商品分类搜索条件 - */ -export interface ShopGoodsCategoryParam extends PageParam { - categoryId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopGoodsComment/index.ts b/src_bak/api/shop/shopGoodsComment/index.ts deleted file mode 100644 index 2f29fb6..0000000 --- a/src_bak/api/shop/shopGoodsComment/index.ts +++ /dev/null @@ -1,69 +0,0 @@ -import request from '@/utils/request' -import type { ShopGoodsComment, SubmitCommentParams, CommentPageParams } from './model' - -/** - * 提交商品评价 - * @desc 对接 Java 后端 /api/shop/shopGoodsComment - */ -export function submitGoodsComment(data: SubmitCommentParams) { - return request.post<{ code: number; message: string }>('/shop/shopGoodsComment', { - goodsId: data.goodsId, - oid: data.oid || data.orderId, - unique: data.unique, - replyType: data.replyType, - goodsScore: data.goodsScore, - serviceScore: data.serviceScore || 5, - comment: data.comment || data.content, - pics: data.pics || data.images?.join(','), - }) -} - -/** - * 分页查询商品评价 - * @desc 对接 Java 后端 /api/shop/shopGoodsComment/page - */ -export function pageGoodsComment(params: CommentPageParams = {}) { - return request.get<{ - code: number - data: { - records: ShopGoodsComment[] - total: number - size: number - current: number - } - }>('/shop/shopGoodsComment/page', { - params: { - page: params.page || 1, - size: params.pageSize || 10, - goodsId: params.goodsId, - oid: params.oid || params.orderId, - }, - }) -} - -/** - * 查询我的评价列表 - * @desc 对接 Java 后端 /api/shop/shopGoodsComment - */ -export function myGoodsComment(params: { page?: number; pageSize?: number } = {}) { - return request.get<{ - code: number - data: { - records: ShopGoodsComment[] - total: number - } - }>('/shop/shopGoodsComment', { - params: { - page: params.page || 1, - size: params.pageSize || 10, - }, - }) -} - -/** - * 获取评价详情 - * @desc 对接 Java 后端 /api/shop/shopGoodsComment/{id} - */ -export function getGoodsComment(id: number) { - return request.get<{ code: number; data: ShopGoodsComment }>(`/shop/shopGoodsComment/${id}`) -} diff --git a/src_bak/api/shop/shopGoodsComment/model.ts b/src_bak/api/shop/shopGoodsComment/model.ts deleted file mode 100644 index f0e4d00..0000000 --- a/src_bak/api/shop/shopGoodsComment/model.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** 商品评价 - 对接 Java 后端 /api/shop/shopGoodsComment */ -export interface ShopGoodsComment { - /** 评论ID */ - id: number - /** 用户ID */ - uid?: number - userId?: number - /** 订单ID */ - oid?: number - orderId?: number - /** 商品唯一标识 */ - unique?: string - /** 商品ID */ - goodsId?: number - /** 商品类型(普通商品、秒杀商品) */ - replyType?: string - /** 商品分数 */ - goodsScore?: boolean | number - /** 服务分数 */ - serviceScore?: boolean | number - /** 评论内容 */ - comment?: string - content?: string - /** 评论图片(逗号分隔) */ - pics?: string - images?: string[] - /** 商家回复内容 */ - merchantReplyContent?: string - reply?: string - /** 商家回复时间 */ - merchantReplyTime?: number - replyTime?: number - /** 用户名称 */ - nickname?: string - /** 用户头像 */ - avatar?: string - /** 商品规格属性值 */ - sku?: string - /** 状态: 0正常, 1冻结 */ - status?: number - /** 创建时间 */ - createTime?: string -} - -/** 提交评价参数 - 对接 Java 后端 */ -export interface SubmitCommentParams { - /** 订单ID */ - oid?: number - orderId?: number - /** 商品ID */ - goodsId: number - /** 商品唯一标识 */ - unique?: string - /** 商品类型 */ - replyType?: string - /** 商品分数 (1-5) */ - goodsScore: number - /** 服务分数 (1-5) */ - serviceScore?: number - /** 评论内容 */ - comment: string - content?: string - /** 评论图片(逗号分隔) */ - pics?: string - images?: string[] -} - -/** 评价分页参数 */ -export interface CommentPageParams { - page?: number - pageSize?: number - /** 商品ID筛选 */ - goodsId?: number - /** 订单ID筛选 */ - oid?: number - orderId?: number -} diff --git a/src_bak/api/shop/shopGoodsEvaluate/index.ts b/src_bak/api/shop/shopGoodsEvaluate/index.ts deleted file mode 100644 index 3c73131..0000000 --- a/src_bak/api/shop/shopGoodsEvaluate/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import request from '@/utils/request' -import type { ShopGoodsEvaluate, SubmitEvaluateParams, EvaluatePageParams } from './model' - -/** 提交商品评价 */ -export function submitGoodsEvaluate(data: SubmitEvaluateParams) { - return request.post('/shopGoodsEvaluate/submit', data) -} - -/** 获取商品评价列表 */ -export function pageGoodsEvaluate(params: EvaluatePageParams = {}) { - return request.post<{ items: ShopGoodsEvaluate[]; total: number }>('/shopGoodsEvaluate/page', params) -} - -/** 获取我的评价列表 */ -export function myGoodsEvaluate(params: { page?: number; pageSize?: number } = {}) { - return request.post<{ items: ShopGoodsEvaluate[]; total: number }>('/shopGoodsEvaluate/myList', params) -} - -/** 获取评价详情 */ -export function getGoodsEvaluate(id: number) { - return request.post('/shopGoodsEvaluate/get', { id }) -} diff --git a/src_bak/api/shop/shopGoodsEvaluate/model.ts b/src_bak/api/shop/shopGoodsEvaluate/model.ts deleted file mode 100644 index 5846ae9..0000000 --- a/src_bak/api/shop/shopGoodsEvaluate/model.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** 商品评价 */ -export interface ShopGoodsEvaluate { - id: number - orderId: number - orderGoodsId: number - goodsId: number - goodsName?: string - goodsImage?: string - userId: number - nickname: string - avatar?: string - rating: number - content: string - images?: string[] - isAnonymous: boolean - createTime: string - /** 商家回复 */ - reply?: string - replyTime?: string -} - -/** 提交评价参数 */ -export interface SubmitEvaluateParams { - orderId: number - orderGoodsId: number - goodsId: number - rating: number - content: string - images?: string[] - isAnonymous?: boolean -} - -/** 分页参数 */ -export interface EvaluatePageParams { - page?: number - pageSize?: number - goodsId?: number - orderId?: number -} diff --git a/src_bak/api/shop/shopGoodsFavorite/index.ts b/src_bak/api/shop/shopGoodsFavorite/index.ts deleted file mode 100644 index fbb77b9..0000000 --- a/src_bak/api/shop/shopGoodsFavorite/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import request from '@/utils/request' -import type { ShopGoodsFavorite, ShopGoodsFavoriteParam } from './model' - -/** - * 解包 API 响应 - * request 工具默认 returnRaw=true,返回完整 {code, message, data} 包装 - * 此函数提取内层 data 字段,兼容 data 为 null/undefined 的情况 - */ -function unwrap(res: any): T { - if (res && typeof res === 'object' && 'data' in res) { - return res.data as T - } - return res as T -} - -// 添加收藏 -export async function addShopGoodsFavorite(data: { goodsId: number }) { - const res = await request.post('/shop/goods/favorite/add', data) - return unwrap(res) -} - -// 取消收藏 -export async function removeShopGoodsFavorite(data: { goodsId: number }) { - const res = await request.post('/shop/goods/favorite/remove', data) - return unwrap(res) -} - -// 查询收藏状态(返回 boolean:true=已收藏, false=未收藏) -export async function getShopGoodsFavoriteStatus(params: { goodsId: number }) { - const res = await request.get('/shop/goods/favorite/status', params) - return !!unwrap(res) // 确保返回纯布尔值 -} - -// 收藏列表 -export async function listShopGoodsFavorite(params: ShopGoodsFavoriteParam) { - const res = await request.get('/shop/goods/favorite/list', params) - return unwrap(res) || [] -} - -// 收藏列表(分页) -export async function pageShopGoodsFavorite(params: ShopGoodsFavoriteParam) { - const res = await request.get('/shop/goods/favorite/page', params) - return unwrap<{ list: ShopGoodsFavorite[]; total: number }>(res) || { list: [], total: 0 } -} diff --git a/src_bak/api/shop/shopGoodsFavorite/model.ts b/src_bak/api/shop/shopGoodsFavorite/model.ts deleted file mode 100644 index 2a89dac..0000000 --- a/src_bak/api/shop/shopGoodsFavorite/model.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface ShopGoodsFavorite { - favoriteId?: number - userId?: number - goodsId?: number - createTime?: string - goodsName?: string - goodsImage?: string - salePrice?: string -} - -export interface ShopGoodsFavoriteParam { - page?: number - limit?: number - userId?: number -} diff --git a/src_bak/api/shop/shopGoodsRoleCommission/index.ts b/src_bak/api/shop/shopGoodsRoleCommission/index.ts deleted file mode 100644 index c047baf..0000000 --- a/src_bak/api/shop/shopGoodsRoleCommission/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import { ShopGoodsRoleCommission, ShopGoodsRoleCommissionParam } from '@/api/shop/shopGoodsRoleCommission/model'; - -/** - * 分页查询商品绑定角色的分润金额 - */ -export async function pageShopGoodsRoleCommission(params: ShopGoodsRoleCommissionParam) { - const res = await request.get>>( - '/shop/shop-goods-role-commission/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商品绑定角色的分润金额列表 - */ -export async function listShopGoodsRoleCommission(params?: ShopGoodsRoleCommissionParam) { - const res = await request.get>( - '/shop/shop-goods-role-commission', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品绑定角色的分润金额 - */ -export async function addShopGoodsRoleCommission(data: ShopGoodsRoleCommission) { - const res = await request.post>( - '/shop/shop-goods-role-commission', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商品绑定角色的分润金额 - */ -export async function updateShopGoodsRoleCommission(data: ShopGoodsRoleCommission) { - const res = await request.put>( - '/shop/shop-goods-role-commission', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商品绑定角色的分润金额 - */ -export async function removeShopGoodsRoleCommission(id?: number) { - const res = await request.del>( - '/shop/shop-goods-role-commission/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商品绑定角色的分润金额 - */ -export async function removeBatchShopGoodsRoleCommission(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-goods-role-commission/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商品绑定角色的分润金额 - */ -export async function getShopGoodsRoleCommission(id: number) { - const res = await request.get>( - '/shop/shop-goods-role-commission/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopGoodsRoleCommission/model/index.ts b/src_bak/api/shop/shopGoodsRoleCommission/model/index.ts deleted file mode 100644 index 6db1178..0000000 --- a/src_bak/api/shop/shopGoodsRoleCommission/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商品绑定角色的分润金额 - */ -export interface ShopGoodsRoleCommission { - // - id?: number; - // - roleId?: number; - // - goodsId?: number; - // - sku?: string; - // - amount?: string; - // 状态, 0正常, 1异常 - status?: number; - // 备注 - comments?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // - sortNumber?: number; -} - -/** - * 商品绑定角色的分润金额搜索条件 - */ -export interface ShopGoodsRoleCommissionParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopGoodsSku/index.ts b/src_bak/api/shop/shopGoodsSku/index.ts deleted file mode 100644 index 8458fcb..0000000 --- a/src_bak/api/shop/shopGoodsSku/index.ts +++ /dev/null @@ -1,113 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import { ShopGoodsSpec } from '@/api/shop/shopGoodsSpec/model'; -import { ShopGoodsSku, ShopGoodsSkuParam } from '@/api/shop/shopGoodsSku/model'; - -export async function generateGoodsSku(data: ShopGoodsSpec) { - const res = await request.post>( - '/shop/goods-sku/generateGoodsSku', - data - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 分页查询商品sku列表 - */ -export async function pageShopGoodsSku(params: ShopGoodsSkuParam) { - const res = await request.get>>( - '/shop/shop-goods-sku/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商品sku列表列表 - */ -export async function listShopGoodsSku(params?: ShopGoodsSkuParam) { - const res = await request.get>( - '/shop/shop-goods-sku', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品sku列表 - */ -export async function addShopGoodsSku(data: ShopGoodsSku) { - const res = await request.post>( - '/shop/shop-goods-sku', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商品sku列表 - */ -export async function updateShopGoodsSku(data: ShopGoodsSku) { - const res = await request.put>( - '/shop/shop-goods-sku', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商品sku列表 - */ -export async function removeShopGoodsSku(id?: number) { - const res = await request.del>( - '/shop/shop-goods-sku/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商品sku列表 - */ -export async function removeBatchShopGoodsSku(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-goods-sku/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商品sku列表 - */ -export async function getShopGoodsSku(id: number) { - const res = await request.get>( - '/shop/shop-goods-sku/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopGoodsSku/model/index.ts b/src_bak/api/shop/shopGoodsSku/model/index.ts deleted file mode 100644 index 0880d7f..0000000 --- a/src_bak/api/shop/shopGoodsSku/model/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 商品sku列表 - */ -export interface ShopGoodsSku { - // 主键ID - id?: number; - // 商品ID - goodsId?: number; - // 商品属性索引值 (attr_value|attr_value[|....]) - sku?: string; - // 商品图片 - image?: string; - // 商品价格 - price?: string; - // 市场价格 - salePrice?: string; - // 成本价 - cost?: string; - // 库存 - stock?: number; - // sku编码 - skuNo?: string; - // 商品条码 - barCode?: string; - // 重量 - weight?: string; - // 体积 - volume?: string; - // 唯一值 - uuid?: string; - // 状态, 0正常, 1异常 - status?: number; - // 备注 - comments?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - images?: string; -} - -/** - * 商品sku列表搜索条件 - */ -export interface ShopGoodsSkuParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopGoodsSpec/index.ts b/src_bak/api/shop/shopGoodsSpec/index.ts deleted file mode 100644 index 5dde057..0000000 --- a/src_bak/api/shop/shopGoodsSpec/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopGoodsSpec, ShopGoodsSpecParam } from './model'; - -/** - * 分页查询商品多规格 - */ -export async function pageShopGoodsSpec(params: ShopGoodsSpecParam) { - const res = await request.get>>( - '/shop/shop-goods-spec/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商品多规格列表 - */ -export async function listShopGoodsSpec(params?: ShopGoodsSpecParam) { - const res = await request.get>( - '/shop/shop-goods-spec', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商品多规格 - */ -export async function addShopGoodsSpec(data: ShopGoodsSpec) { - const res = await request.post>( - '/shop/shop-goods-spec', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商品多规格 - */ -export async function updateShopGoodsSpec(data: ShopGoodsSpec) { - const res = await request.put>( - '/shop/shop-goods-spec', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商品多规格 - */ -export async function removeShopGoodsSpec(id?: number) { - const res = await request.del>( - '/shop/shop-goods-spec/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商品多规格 - */ -export async function removeBatchShopGoodsSpec(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-goods-spec/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商品多规格 - */ -export async function getShopGoodsSpec(id: number) { - const res = await request.get>( - '/shop/shop-goods-spec/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopGoodsSpec/model/index.ts b/src_bak/api/shop/shopGoodsSpec/model/index.ts deleted file mode 100644 index 44a6644..0000000 --- a/src_bak/api/shop/shopGoodsSpec/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 商品多规格 - */ -export interface ShopGoodsSpec { - // 主键 - id?: number; - // 商品ID - goodsId?: number; - // 规格ID - specId?: number; - // 规格名称 - specName?: string; - // 规格值 - specValue?: string; - // 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 - type?: string; - // 租户id - tenantId?: number; -} - -/** - * 商品多规格搜索条件 - */ -export interface ShopGoodsSpecParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopGroupBuy/index.ts b/src_bak/api/shop/shopGroupBuy/index.ts deleted file mode 100644 index a7be827..0000000 --- a/src_bak/api/shop/shopGroupBuy/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import request from '@/utils/request' -import type { - ShopGroupBuy, - ShopGroupBuyRecord, - ShopGroupBuyPageParams, -} from './model' - -/** 获取拼团商品列表 */ -export function pageShopGroupBuy(params: ShopGroupBuyPageParams = {}) { - return request.post<{ items: ShopGroupBuy[]; total: number }>('/shopGroupBuy/page', params) -} - -/** 获取拼团商品详情 */ -export function getShopGroupBuy(id: number) { - return request.post('/shopGroupBuy/get', { id }) -} - -/** 获取进行中的拼团记录(可参团) */ -export function listShopGroupBuyRecords(groupBuyId: number) { - return request.post('/shopGroupBuy/listRecords', { groupBuyId }) -} - -/** 发起拼团 */ -export function createGroupBuy(data: { groupBuyId: number; goodsId: number; skuId: number; quantity: number }) { - return request.post('/shopGroupBuy/create', data) -} - -/** 参与拼团 */ -export function joinGroupBuy(data: { recordId: number; goodsId: number; skuId: number; quantity: number }) { - return request.post('/shopGroupBuy/join', data) -} - -/** 获取我的拼团记录 */ -export function myGroupBuyRecords(params: { page?: number; pageSize?: number } = {}) { - return request.post<{ items: ShopGroupBuyRecord[]; total: number }>('/shopGroupBuy/myRecords', params) -} diff --git a/src_bak/api/shop/shopGroupBuy/model.ts b/src_bak/api/shop/shopGroupBuy/model.ts deleted file mode 100644 index 162af4a..0000000 --- a/src_bak/api/shop/shopGroupBuy/model.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** 拼团活动 */ -export interface ShopGroupBuy { - id: number - goodsId: number - goodsName?: string - goodsImage?: string - /** 拼团价格 */ - groupPrice: number - /** 成团人数 */ - groupSize: number - /** 已参团人数 */ - currentSize: number - /** 开始时间 */ - startTime: string - /** 结束时间 */ - endTime: string - /** 状态:0-未开始 1-进行中 2-已结束 */ - status: number - /** 商品详情 */ - product?: { - id: number - name: string - image: string - price: number - } -} - -/** 拼团记录 */ -export interface ShopGroupBuyRecord { - id: number - groupBuyId: number - userId: number - /** 团长ID */ - leaderId: number - /** 是否团长 */ - isLeader: boolean - /** 参团人数 */ - memberCount: number - /** 状态:0-待成团 1-已成团 2-已失败 */ - status: number - /** 过期时间 */ - expireTime: string - /** 成员列表 */ - members?: ShopGroupBuyMember[] -} - -/** 拼团成员 */ -export interface ShopGroupBuyMember { - id: number - userId: number - nickname: string - avatar: string - joinTime: string -} - -/** 分页参数 */ -export interface ShopGroupBuyPageParams { - page?: number - pageSize?: number - status?: number -} diff --git a/src_bak/api/shop/shopInvite/index.ts b/src_bak/api/shop/shopInvite/index.ts deleted file mode 100644 index ba38f75..0000000 --- a/src_bak/api/shop/shopInvite/index.ts +++ /dev/null @@ -1,278 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import { BaseUrl } from '@/config/app'; - -/** - * 小程序码生成参数 - */ -export interface MiniProgramCodeParam { - // 小程序页面路径 - page?: string; - // 场景值,最大32个可见字符 - scene: string; - // 二维码宽度,单位 px,最小 280px,最大 1280px - width?: number; - // 是否检查页面是否存在 - checkPath?: boolean; - // 环境版本 - envVersion?: 'release' | 'trial' | 'develop'; -} - -/** - * 邀请关系参数 - */ -export interface InviteRelationParam { - // 邀请人ID - inviterId: number; - // 被邀请人ID - inviteeId: number; - // 邀请来源 - source: string; - // 场景值 - scene?: string; - // 邀请时间 - inviteTime?: string; -} - -/** - * 绑定推荐关系参数 - */ -export interface BindRefereeParam { - // 推荐人ID - dealerId: number; - // 被推荐人ID (可选,如果不传则使用当前登录用户) - userId?: number; - // 推荐来源 - source?: string; - // 场景值 - scene?: string; -} - -/** - * 邀请统计数据 - */ -export interface InviteStats { - // 总邀请数 - totalInvites: number; - // 成功注册数 - successfulRegistrations: number; - // 转化率 - conversionRate: number; - // 今日邀请数 - todayInvites: number; - // 本月邀请数 - monthlyInvites: number; - // 邀请来源统计 - sourceStats: InviteSourceStat[]; -} - -/** - * 邀请来源统计 - */ -export interface InviteSourceStat { - source: string; - count: number; - successCount: number; - conversionRate: number; -} - -/** - * 邀请记录 - */ -export interface InviteRecord { - id?: number; - inviterId?: number; - inviteeId?: number; - inviterName?: string; - inviteeName?: string; - source?: string; - scene?: string; - status?: 'pending' | 'registered' | 'activated'; - inviteTime?: string; - registerTime?: string; - activateTime?: string; -} - -/** - * 邀请记录查询参数 - */ -export interface InviteRecordParam { - page?: number; - limit?: number; - inviterId?: number; - status?: string; - source?: string; - startTime?: string; - endTime?: string; -} - -/** - * 生成小程序码 - */ -export async function generateMiniProgramCode(data: MiniProgramCodeParam) { - try { - const url = '/wx-login/getOrderQRCodeUnlimited/' + data.scene; - // 由于接口直接返回图片buffer,我们直接构建完整的URL - return `${BaseUrl}${url}`; - } catch (error: any) { - throw new Error(error.message || '生成小程序码失败'); - } -} - -/** - * 生成邀请小程序码 - */ -export async function generateInviteCode(inviterId: number) { - const scene = `uid_${inviterId}`; - - return generateMiniProgramCode({ - page: 'pages/index/index', - scene: scene, - width: 180, - checkPath: true, - envVersion: 'trial' - }); -} - -/** - * 建立邀请关系 (旧接口,保留兼容性) - */ -export async function createInviteRelation(data: InviteRelationParam) { - const res = await request.post>( - '/invite/create-relation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 绑定推荐关系 (新接口) - */ -export async function bindRefereeRelation(data: BindRefereeParam) { - try { - const res = await request.post>( - '/shop/shop-dealer-referee', - { - dealerId: data.dealerId, - userId: data.userId, - source: data.source || 'qrcode', - scene: data.scene - } - ); - - if (res.code === 0) { - return res.data; - } - - throw new Error(res.message || '绑定推荐关系失败'); - } catch (error: any) { - console.error('绑定推荐关系API调用失败:', error); - throw new Error(error.message || '绑定推荐关系失败'); - } -} - -/** - * 处理邀请场景值 - */ -export async function processInviteScene(scene: string, userId: number) { - const res = await request.post>( - '/invite/process-scene', - { scene, userId } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取邀请统计数据 - */ -export async function getInviteStats(inviterId: number) { - const res = await request.get>( - `/invite/stats/${inviterId}` - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 分页查询邀请记录 - */ -export async function pageInviteRecords(params: InviteRecordParam) { - const res = await request.get>>( - '/invite/records/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取我的邀请记录 - */ -export async function getMyInviteRecords(params: InviteRecordParam) { - const res = await request.get>>( - '/invite/my-records', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 验证邀请码有效性 - */ -export async function validateInviteCode(scene: string) { - const res = await request.post>( - '/invite/validate-code', - { scene } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 更新邀请状态 - */ -export async function updateInviteStatus(inviteId: number, status: 'registered' | 'activated') { - const res = await request.put>( - `/invite/update-status/${inviteId}`, - { status } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取邀请排行榜 - */ -export async function getInviteRanking(params?: { limit?: number; period?: 'day' | 'week' | 'month' }) { - const res = await request.get>>( - '/invite/ranking', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopInvite/model/index.ts b/src_bak/api/shop/shopInvite/model/index.ts deleted file mode 100644 index 11aada9..0000000 --- a/src_bak/api/shop/shopInvite/model/index.ts +++ /dev/null @@ -1,279 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 邀请记录表 - */ -export interface InviteRecord { - // 主键ID - id?: number; - // 邀请人ID - inviterId?: number; - // 被邀请人ID - inviteeId?: number; - // 邀请人姓名 - inviterName?: string; - // 被邀请人姓名 - inviteeName?: string; - // 邀请来源 (qrcode, link, share等) - source?: string; - // 场景值 - scene?: string; - // 邀请状态: pending-待注册, registered-已注册, activated-已激活 - status?: 'pending' | 'registered' | 'activated'; - // 邀请时间 - inviteTime?: string; - // 注册时间 - registerTime?: string; - // 激活时间 - activateTime?: string; - // 备注 - comments?: string; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 邀请统计表 - */ -export interface InviteStats { - // 主键ID - id?: number; - // 邀请人ID - inviterId?: number; - // 统计日期 - statDate?: string; - // 总邀请数 - totalInvites?: number; - // 成功注册数 - successfulRegistrations?: number; - // 激活用户数 - activatedUsers?: number; - // 转化率 - conversionRate?: number; - // 今日邀请数 - todayInvites?: number; - // 本周邀请数 - weeklyInvites?: number; - // 本月邀请数 - monthlyInvites?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 邀请来源统计表 - */ -export interface InviteSourceStats { - // 主键ID - id?: number; - // 邀请人ID - inviterId?: number; - // 来源类型 - source?: string; - // 来源名称 - sourceName?: string; - // 邀请数量 - inviteCount?: number; - // 成功数量 - successCount?: number; - // 转化率 - conversionRate?: number; - // 统计日期 - statDate?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 小程序码记录表 - */ -export interface MiniProgramCode { - // 主键ID - id?: number; - // 邀请人ID - inviterId?: number; - // 场景值 - scene?: string; - // 小程序码URL - codeUrl?: string; - // 页面路径 - pagePath?: string; - // 二维码宽度 - width?: number; - // 环境版本 - envVersion?: string; - // 过期时间 - expireTime?: string; - // 使用次数 - useCount?: number; - // 最后使用时间 - lastUseTime?: string; - // 状态: active-有效, expired-过期, disabled-禁用 - status?: 'active' | 'expired' | 'disabled'; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 邀请记录搜索条件 - */ -export interface InviteRecordParam extends PageParam { - // 邀请人ID - inviterId?: number; - // 被邀请人ID - inviteeId?: number; - // 邀请状态 - status?: string; - // 邀请来源 - source?: string; - // 开始时间 - startTime?: string; - // 结束时间 - endTime?: string; - // 关键词搜索 - keywords?: string; -} - -/** - * 邀请统计搜索条件 - */ -export interface InviteStatsParam extends PageParam { - // 邀请人ID - inviterId?: number; - // 统计开始日期 - startDate?: string; - // 统计结束日期 - endDate?: string; -} - -/** - * 邀请来源统计搜索条件 - */ -export interface InviteSourceStatsParam extends PageParam { - // 邀请人ID - inviterId?: number; - // 来源类型 - source?: string; - // 统计开始日期 - startDate?: string; - // 统计结束日期 - endDate?: string; -} - -/** - * 小程序码搜索条件 - */ -export interface MiniProgramCodeParam extends PageParam { - // 邀请人ID - inviterId?: number; - // 状态 - status?: string; - // 场景值 - scene?: string; -} - -/** - * 邀请排行榜数据 - */ -export interface InviteRanking { - // 邀请人ID - inviterId?: number; - // 邀请人姓名 - inviterName?: string; - // 邀请人头像 - inviterAvatar?: string; - // 邀请数量 - inviteCount?: number; - // 成功数量 - successCount?: number; - // 转化率 - conversionRate?: number; - // 排名 - rank?: number; - // 奖励金额 - rewardAmount?: number; -} - -/** - * 邀请奖励配置 - */ -export interface InviteRewardConfig { - // 主键ID - id?: number; - // 奖励类型: register-注册奖励, activate-激活奖励, order-订单奖励 - rewardType?: string; - // 奖励名称 - rewardName?: string; - // 奖励金额 - rewardAmount?: number; - // 奖励积分 - rewardPoints?: number; - // 奖励优惠券ID - couponId?: number; - // 是否启用 - enabled?: boolean; - // 生效时间 - effectTime?: string; - // 失效时间 - expireTime?: string; - // 备注 - comments?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 邀请奖励记录 - */ -export interface InviteRewardRecord { - // 主键ID - id?: number; - // 邀请记录ID - inviteRecordId?: number; - // 邀请人ID - inviterId?: number; - // 被邀请人ID - inviteeId?: number; - // 奖励类型 - rewardType?: string; - // 奖励金额 - rewardAmount?: number; - // 奖励积分 - rewardPoints?: number; - // 优惠券ID - couponId?: number; - // 发放状态: pending-待发放, issued-已发放, failed-发放失败 - status?: 'pending' | 'issued' | 'failed'; - // 发放时间 - issueTime?: string; - // 失败原因 - failReason?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} diff --git a/src_bak/api/shop/shopInvoiceTitle/index.ts b/src_bak/api/shop/shopInvoiceTitle/index.ts deleted file mode 100644 index f2509c5..0000000 --- a/src_bak/api/shop/shopInvoiceTitle/index.ts +++ /dev/null @@ -1,166 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopInvoiceTitle, ShopInvoiceTitleParam, ShopInvoiceRecord, ShopInvoiceRecordParam, InvoiceApplyRequest } from './model'; - -/** - * 分页查询发票抬头 - */ -export async function pageShopInvoiceTitle(params: ShopInvoiceTitleParam) { - const res = await request.get>>( - '/shop/shop-invoice-title/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询发票抬头列表 - */ -export async function listShopInvoiceTitle(params?: ShopInvoiceTitleParam) { - const res = await request.get>( - '/shop/shop-invoice-title', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加发票抬头 - */ -export async function addShopInvoiceTitle(data: ShopInvoiceTitle) { - const res = await request.post>( - '/shop/shop-invoice-title', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改发票抬头 - */ -export async function updateShopInvoiceTitle(data: ShopInvoiceTitle) { - const res = await request.put>( - '/shop/shop-invoice-title', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除发票抬头 - */ -export async function removeShopInvoiceTitle(id?: number) { - const res = await request.del>( - '/shop/shop-invoice-title/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询发票抬头 - */ -export async function getShopInvoiceTitle(id: number) { - const res = await request.get>( - '/shop/shop-invoice-title/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 设置默认发票抬头 - */ -export async function setDefaultInvoiceTitle(id: number) { - const res = await request.put>( - '/shop/shop-invoice-title/set-default/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 分页查询发票记录 - */ -export async function pageShopInvoiceRecord(params: ShopInvoiceRecordParam) { - const res = await request.get>>( - '/shop/shop-invoice-record/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询发票记录列表 - */ -export async function listShopInvoiceRecord(params?: ShopInvoiceRecordParam) { - const res = await request.get>( - '/shop/shop-invoice-record', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 申请发票 - */ -export async function applyInvoice(data: InvoiceApplyRequest) { - const res = await request.post>( - '/shop/shop-invoice-record/apply', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询发票记录 - */ -export async function getShopInvoiceRecord(id: number) { - const res = await request.get>( - '/shop/shop-invoice-record/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取用户可开票订单列表 - */ -export async function listInvoiceableOrders() { - const res = await request.get>( - '/shop/shop-invoice-record/invoiceable-orders' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopInvoiceTitle/model.ts b/src_bak/api/shop/shopInvoiceTitle/model.ts deleted file mode 100644 index 88330bf..0000000 --- a/src_bak/api/shop/shopInvoiceTitle/model.ts +++ /dev/null @@ -1,155 +0,0 @@ -/** - * 发票抬头表 - */ -export interface ShopInvoiceTitle { - /** 主键ID */ - id?: number; - /** 用户ID */ - userId?: number; - /** 抬头类型: personal-个人, company-企业 */ - type?: 'personal' | 'company'; - /** 发票抬头名称 */ - name?: string; - /** 税号(企业必填) */ - taxNumber?: string; - /** 注册地址 */ - address?: string; - /** 注册电话 */ - phone?: string; - /** 开户银行 */ - bankName?: string; - /** 银行账号 */ - bankAccount?: string; - /** 接收邮箱 */ - email?: string; - /** 是否默认: 0-否, 1-是 */ - isDefault?: number; - /** 商城ID */ - tenantId?: number; - /** 创建时间 */ - createTime?: string; - /** 修改时间 */ - updateTime?: string; -} - -/** - * 发票抬头查询参数 - */ -export interface ShopInvoiceTitleParam { - /** 主键ID */ - id?: number; - /** 用户ID */ - userId?: number; - /** 抬头类型 */ - type?: string; - /** 是否默认 */ - isDefault?: number; - /** 第几页 */ - page?: number; - /** 每页多少条 */ - limit?: number; - /** 排序字段 */ - sort?: string; - /** 排序方式 */ - order?: string; -} - -/** - * 发票申请记录 - */ -export interface ShopInvoiceRecord { - /** 主键ID */ - id?: number; - /** 用户ID */ - userId?: number; - /** 用户昵称 */ - userNickName?: string; - /** 订单ID */ - orderId?: number; - /** 订单编号 */ - orderNo?: string; - /** 发票抬头ID */ - titleId?: number; - /** 发票类型: normal-普通发票, vat-增值税发票 */ - invoiceType?: 'normal' | 'vat'; - /** 发票抬头 */ - titleName?: string; - /** 税号 */ - taxNumber?: string; - /** 发票金额 */ - amount?: number; - /** 发票状态: 0-待处理, 1-开票中, 2-已开票, 3-开票失败 */ - status?: number; - /** 发票流水号 */ - invoiceNo?: string; - /** 发票URL */ - invoiceUrl?: string; - /** 申请时间 */ - applyTime?: string; - /** 开票时间 */ - invoiceTime?: string; - /** 商城ID */ - tenantId?: number; - /** 创建时间 */ - createTime?: string; - /** 修改时间 */ - updateTime?: string; -} - -/** - * 发票申请参数 - */ -export interface ShopInvoiceRecordParam { - /** 主键ID */ - id?: number; - /** 用户ID */ - userId?: number; - /** 订单ID */ - orderId?: number; - /** 发票抬头ID */ - titleId?: number; - /** 发票类型 */ - invoiceType?: string; - /** 发票状态 */ - status?: number; - /** 第几页 */ - page?: number; - /** 每页多少条 */ - limit?: number; - /** 排序字段 */ - sort?: string; - /** 排序方式 */ - order?: string; - /** 起始时间 */ - createTimeStart?: string; - /** 结束时间 */ - createTimeEnd?: string; -} - -/** - * 发票申请请求 - */ -export interface InvoiceApplyRequest { - /** 订单ID */ - orderId: number; - /** 发票抬头ID */ - titleId: number; - /** 发票类型 */ - invoiceType?: 'normal' | 'vat'; - /** 接收邮箱(电子发票) */ - email?: string; -} - -/** - * 发票状态枚举 - */ -export enum InvoiceStatusEnum { - /** 待处理 */ - PENDING = 0, - /** 开票中 */ - PROCESSING = 1, - /** 已开票 */ - COMPLETED = 2, - /** 开票失败 */ - FAILED = 3, -} diff --git a/src_bak/api/shop/shopLogistics/index.ts b/src_bak/api/shop/shopLogistics/index.ts deleted file mode 100644 index 97ccd93..0000000 --- a/src_bak/api/shop/shopLogistics/index.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { request } from '@/utils/request' - -// 物流信息接口 -export interface LogisticsInfo { - expressCompany: string // 快递公司代码 - expressCompanyName: string // 快递公司名称 - expressNo: string // 快递单号 - status: string // 物流状态 - updateTime: string // 更新时间 - estimatedTime?: string // 预计送达时间 - currentLocation?: string // 当前位置 - senderInfo?: { - name: string - phone: string - address: string - } - receiverInfo?: { - name: string - phone: string - address: string - } -} - -// 物流跟踪记录 -export interface LogisticsTrack { - time: string - location: string - status: string - description: string - isCompleted: boolean -} - -// 物流查询响应 -export interface LogisticsResponse { - success: boolean - data: { - logisticsInfo: LogisticsInfo - trackList: LogisticsTrack[] - } - message?: string -} - -// 支持的快递公司 -export const EXPRESS_COMPANIES = { - 'SF': '顺丰速运', - 'YTO': '圆通速递', - 'ZTO': '中通快递', - 'STO': '申通快递', - 'YD': '韵达速递', - 'HTKY': '百世快递', - 'JD': '京东物流', - 'EMS': '中国邮政', - 'YUNDA': '韵达快递', - 'JTSD': '极兔速递', - 'DBKD': '德邦快递', - 'UC': '优速快递' -} - -// 查询物流信息 -export const queryLogistics = async (params: { - orderId?: string - expressNo: string - expressCompany: string -}): Promise => { - try { - // 调用真实的物流查询API - const response = await request({ - url: '/logistics/query', - method: 'POST', - data: params - }) - - return response - } catch (error) { - console.error('查询物流信息失败:', error) - // 抛出错误而不是返回 Mock 数据 - throw error - } -} - -/** - * @deprecated 已弃用 - Mock 数据仅用于开发调试 - * 生产环境应删除此函数 - */ -const getMockLogisticsData = (params: { - orderId?: string - expressNo: string - expressCompany: string -}): LogisticsResponse => { - const now = new Date() - const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000) - const twoDaysAgo = new Date(now.getTime() - 2 * 24 * 60 * 60 * 1000) - const threeDaysAgo = new Date(now.getTime() - 3 * 24 * 60 * 60 * 1000) - - const mockData: LogisticsResponse = { - success: true, - data: { - logisticsInfo: { - expressCompany: params.expressCompany, - expressCompanyName: EXPRESS_COMPANIES[params.expressCompany] || params.expressCompany, - expressNo: params.expressNo, - status: '运输中', - updateTime: now.toISOString(), - estimatedTime: new Date(now.getTime() + 24 * 60 * 60 * 1000).toISOString(), - currentLocation: '北京市朝阳区', - senderInfo: { - name: '商家仓库', - phone: '400-123-4567', - address: '上海市浦东新区张江高科技园区' - }, - receiverInfo: { - name: '张三', - phone: '138****5678', - address: '北京市朝阳区三里屯街道' - } - }, - trackList: [ - { - time: now.toISOString(), - location: '北京市朝阳区', - status: '运输中', - description: '快件正在运输途中,预计今日送达,请保持手机畅通', - isCompleted: false - }, - { - time: new Date(now.getTime() - 2 * 60 * 60 * 1000).toISOString(), - location: '北京转运中心', - status: '已发出', - description: '快件已从北京转运中心发出,正在派送途中', - isCompleted: true - }, - { - time: new Date(now.getTime() - 6 * 60 * 60 * 1000).toISOString(), - location: '北京转运中心', - status: '已到达', - description: '快件已到达北京转运中心,正在进行分拣', - isCompleted: true - }, - { - time: yesterday.toISOString(), - location: '天津转运中心', - status: '已发出', - description: '快件已从天津转运中心发出', - isCompleted: true - }, - { - time: new Date(yesterday.getTime() - 4 * 60 * 60 * 1000).toISOString(), - location: '天津转运中心', - status: '已到达', - description: '快件已到达天津转运中心', - isCompleted: true - }, - { - time: twoDaysAgo.toISOString(), - location: '上海转运中心', - status: '已发出', - description: '快件已从上海转运中心发出', - isCompleted: true - }, - { - time: new Date(twoDaysAgo.getTime() - 2 * 60 * 60 * 1000).toISOString(), - location: '上海转运中心', - status: '已到达', - description: '快件已到达上海转运中心,正在进行分拣', - isCompleted: true - }, - { - time: threeDaysAgo.toISOString(), - location: '上海市浦东新区', - status: '已发货', - description: '商家已发货,快件已交给快递公司', - isCompleted: true - } - ] - } - } - - return mockData -} - -// 获取快递公司列表 -export const getExpressCompanies = () => { - return Object.entries(EXPRESS_COMPANIES).map(([code, name]) => ({ - code, - name - })) -} - -// 根据快递单号自动识别快递公司 -export const detectExpressCompany = (expressNo: string): string => { - // 这里可以根据快递单号的规则来自动识别快递公司 - // 实际项目中可以使用第三方服务的自动识别API - - if (expressNo.startsWith('SF')) return 'SF' - if (expressNo.startsWith('YT')) return 'YTO' - if (expressNo.startsWith('ZT')) return 'ZTO' - if (expressNo.startsWith('ST')) return 'STO' - if (expressNo.startsWith('YD')) return 'YD' - if (expressNo.startsWith('JD')) return 'JD' - if (expressNo.startsWith('EMS')) return 'EMS' - - // 默认返回顺丰 - return 'SF' -} - -// 格式化物流状态 -export const formatLogisticsStatus = (status: string): { - text: string - color: string - icon: string -} => { - const statusMap = { - '已发货': { text: '已发货', color: '#1890ff', icon: '📦' }, - '运输中': { text: '运输中', color: '#52c41a', icon: '🚚' }, - '派送中': { text: '派送中', color: '#faad14', icon: '🏃' }, - '已签收': { text: '已签收', color: '#52c41a', icon: '✅' }, - '异常': { text: '异常', color: '#ff4d4f', icon: '⚠️' }, - '退回': { text: '退回', color: '#ff4d4f', icon: '↩️' } - } - - return statusMap[status] || { text: status, color: '#666', icon: '📋' } -} - -// 计算预计送达时间 -export const calculateEstimatedTime = ( - sendTime: string, - expressCompany: string, - distance?: number -): string => { - const sendDate = new Date(sendTime) - let estimatedDays = 3 // 默认3天 - - // 根据快递公司调整预计时间 - switch (expressCompany) { - case 'SF': - estimatedDays = 1 // 顺丰次日达 - break - case 'JD': - estimatedDays = 1 // 京东次日达 - break - case 'YTO': - case 'ZTO': - case 'STO': - estimatedDays = 2 // 三通一达2天 - break - default: - estimatedDays = 3 - } - - // 根据距离调整(如果有距离信息) - if (distance) { - if (distance > 2000) estimatedDays += 1 // 超过2000公里加1天 - if (distance > 3000) estimatedDays += 1 // 超过3000公里再加1天 - } - - const estimatedDate = new Date(sendDate.getTime() + estimatedDays * 24 * 60 * 60 * 1000) - return estimatedDate.toISOString() -} diff --git a/src_bak/api/shop/shopMemberBenefit.ts b/src_bak/api/shop/shopMemberBenefit.ts deleted file mode 100644 index 83ce19d..0000000 --- a/src_bak/api/shop/shopMemberBenefit.ts +++ /dev/null @@ -1,29 +0,0 @@ -import request from '@/utils/request'; - -/** 获取可用权益包列表 */ -export function getBenefitPackageList() { - return request.get('/shop/shop-member-benefit-package/list'); -} - -/** 获取权益包详情 */ -export function getBenefitPackageDetail(id: number) { - return request.get(`/shop/shop-member-benefit-package/${id}`); -} - -/** 申请兑换 */ -export function exchangeBenefitPackage(data: { - packageId: number; - addressId?: number; -}) { - return request.post('/shop/shop-member-benefit-exchange/exchange', data); -} - -/** 我的兑换记录 */ -export function getMyExchangeList(params?: any) { - return request.get('/shop/shop-member-benefit-exchange/my/list', params); -} - -/** 取消兑换 */ -export function cancelExchange(id: number) { - return request.post(`/shop/shop-member-benefit-exchange/cancel/${id}`); -} diff --git a/src_bak/api/shop/shopMemberCenter.ts b/src_bak/api/shop/shopMemberCenter.ts deleted file mode 100644 index 66c4793..0000000 --- a/src_bak/api/shop/shopMemberCenter.ts +++ /dev/null @@ -1,113 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api'; - -/** - * 会员中心数据 - 整合分销商相关信息 - */ -export interface MemberCenterData { - // 基本信息 - memberLevel: string; // 会员等级名称 - memberLevelId: number; // 会员等级ID - isDealer: boolean; // 是否是分销商 - // 佣金信息 - commission: number; // 可提现佣金 - totalCommission: number; // 累计佣金 - frozenCommission: number; // 冻结佣金 - // 团队信息 - teamCount: number; // 团队人数 - activeCount: number; // 活跃人数 - memberCount: number; // 会员人数 - // 推广信息 - inviteCode: string; // 邀请码 - qrCode: string; // 推广二维码 -} - -/** - * 佣金明细记录 - */ -export interface CommissionRecord { - id: number; - type: number; // 1=佣金收入, 2=佣金提现, 3=佣金退回 - amount: number; // 金额 - status: number; // 状态: 0=待审核, 10=审核通过, 20=待收款, 30=已拒绝, 40=已完成 - remark: string; // 备注 - createTime: string; // 创建时间 - updateTime: string; // 更新时间 -} - -/** - * 获取会员中心数据 - */ -export async function getMemberCenterData() { - const res = await request.get>('/shop/shop-dealer-user/info'); - if (res.code === 0 && res.data) { - return res.data; - } - // 如果接口不存在,返回默认数据 - return { - memberLevel: '普通会员', - memberLevelId: 0, - isDealer: false, - commission: 0, - totalCommission: 0, - frozenCommission: 0, - teamCount: 0, - activeCount: 0, - memberCount: 0, - inviteCode: '', - qrCode: '', - }; -} - -/** - * 获取佣金明细列表 - */ -export async function listCommissionRecord(params?: { page?: number; limit?: number }) { - const res = await request.get>('/shop/shop-commission-record/page', params); - if (res.code === 0 && res.data) { - return res.data; - } - return { list: [], total: 0 }; -} - -/** - * 获取分销商资金信息 - */ -export async function getDealerCapital() { - const res = await request.get>('/shop/shop-dealer-capital/summary'); - if (res.code === 0 && res.data) { - return res.data; - } - return { - balance: 0, - totalEarning: 0, - frozenAmount: 0, - withdrawAmount: 0, - }; -} - -/** - * 获取分销设置信息(用于会员升级) - */ -export async function getDealerSetting() { - const res = await request.get>('/shop/shop-commission-role/list'); - if (res.code === 0 && res.data) { - return res.data; - } - return []; -} diff --git a/src_bak/api/shop/shopMemberRegister.ts b/src_bak/api/shop/shopMemberRegister.ts deleted file mode 100644 index 299449f..0000000 --- a/src_bak/api/shop/shopMemberRegister.ts +++ /dev/null @@ -1,108 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api'; - -/** - * 会员注册记录相关API - */ - -/** - * 会员注册记录 - */ -export interface MemberRegister { - id: number; - dealerId: number; - dealerName?: string; - dealerPhone?: string; - phone: string; - realName?: string; - memberFee: number; - memberFeeStatus: number; - registerFee: number; - registerFeeStatus: number; - userId?: number; - nickName?: string; - status: number; - comments?: string; - createTime: string; -} - -/** - * 注册费支付信息 - */ -export interface RegisterPayInfo { - id: number; - phone: string; - realName?: string; - registerFee: number; - dealerName?: string; - dealerPhone?: string; -} - -/** - * 获取我的下级注册列表 - */ -export async function getMyRegisterList(params?: { page?: number; limit?: number }) { - const res = await request.get>('/shop/shop-member-register/my/list', params); - return res.data || []; -} - -/** - * 录入下级 - */ -export async function addSubordinate(data: { phone: string; realName?: string }) { - const res = await request.post>('/shop/shop-member-register/add', data); - return res; -} - -/** - * 修改下级信息 - */ -export async function updateSubordinate(data: { id: number; phone?: string; realName?: string }) { - const res = await request.put>('/shop/shop-member-register/update', data); - return res; -} - -/** - * 检查手机号是否可注册 - */ -export async function checkPhone(phone: string) { - const res = await request.get>('/shop/shop-member-register/check', { phone }); - return res.data; -} - -/** - * 获取注册费支付信息 - */ -export async function getRegisterPayInfo(phone: string) { - const res = await request.get>('/shop/shop-member-register/pay/info', { phone }); - return res.data; -} - -/** - * 获取当前用户的注册状态 - */ -export async function getMyRegisterStatus() { - const res = await request.get>('/shop/shop-member-register/my/status'); - return res.data; -} - -/** - * 获取会员配置信息 - */ -export async function getMemberConfig() { - const res = await request.get>('/shop/shop-member-register/config'); - return res.data; -} diff --git a/src_bak/api/shop/shopMerchant/index.ts b/src_bak/api/shop/shopMerchant/index.ts deleted file mode 100644 index 6a855bf..0000000 --- a/src_bak/api/shop/shopMerchant/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopMerchant, ShopMerchantParam } from './model'; - -/** - * 分页查询商户 - */ -export async function pageShopMerchant(params: ShopMerchantParam) { - const res = await request.get>>( - '/shop/shop-merchant/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商户列表 - */ -export async function listShopMerchant(params?: ShopMerchantParam) { - const res = await request.get>( - '/shop/shop-merchant', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商户 - */ -export async function addShopMerchant(data: ShopMerchant) { - const res = await request.post>( - '/shop/shop-merchant', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商户 - */ -export async function updateShopMerchant(data: ShopMerchant) { - const res = await request.put>( - '/shop/shop-merchant', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商户 - */ -export async function removeShopMerchant(id?: number) { - const res = await request.del>( - '/shop/shop-merchant/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商户 - */ -export async function removeBatchShopMerchant(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-merchant/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商户 - */ -export async function getShopMerchant(id: number) { - const res = await request.get>( - '/shop/shop-merchant/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopMerchant/model/index.ts b/src_bak/api/shop/shopMerchant/model/index.ts deleted file mode 100644 index 4074c0d..0000000 --- a/src_bak/api/shop/shopMerchant/model/index.ts +++ /dev/null @@ -1,95 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商户 - */ -export interface ShopMerchant { - // ID - merchantId?: number; - // 商户名称 - merchantName?: string; - // 商户编号 - merchantCode?: string; - // 商户类型 - type?: number; - // 商户图标 - image?: string; - // 商户手机号 - phone?: string; - // 商户姓名 - realName?: string; - // 店铺类型 - shopType?: string; - // 项目分类 - itemType?: string; - // 商户分类 - category?: 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; - // 是否可以快递 - canExpress?: string; - // 是否推荐 - recommend?: number; - // 是否营业 - isOn?: number; - // - startTime?: string; - // - endTime?: string; - // 是否需要审核 - 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/src_bak/api/shop/shopMerchantAccount/index.ts b/src_bak/api/shop/shopMerchantAccount/index.ts deleted file mode 100644 index eaa94f2..0000000 --- a/src_bak/api/shop/shopMerchantAccount/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopMerchantAccount, ShopMerchantAccountParam } from './model'; - -/** - * 分页查询商户账号 - */ -export async function pageShopMerchantAccount(params: ShopMerchantAccountParam) { - const res = await request.get>>( - '/shop/shop-merchant-account/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商户账号列表 - */ -export async function listShopMerchantAccount(params?: ShopMerchantAccountParam) { - const res = await request.get>( - '/shop/shop-merchant-account', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商户账号 - */ -export async function addShopMerchantAccount(data: ShopMerchantAccount) { - const res = await request.post>( - '/shop/shop-merchant-account', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商户账号 - */ -export async function updateShopMerchantAccount(data: ShopMerchantAccount) { - const res = await request.put>( - '/shop/shop-merchant-account', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商户账号 - */ -export async function removeShopMerchantAccount(id?: number) { - const res = await request.del>( - '/shop/shop-merchant-account/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商户账号 - */ -export async function removeBatchShopMerchantAccount(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-merchant-account/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商户账号 - */ -export async function getShopMerchantAccount(id: number) { - const res = await request.get>( - '/shop/shop-merchant-account/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopMerchantAccount/model/index.ts b/src_bak/api/shop/shopMerchantAccount/model/index.ts deleted file mode 100644 index 8dc79db..0000000 --- a/src_bak/api/shop/shopMerchantAccount/model/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商户账号 - */ -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/src_bak/api/shop/shopMerchantApply/index.ts b/src_bak/api/shop/shopMerchantApply/index.ts deleted file mode 100644 index 151f6aa..0000000 --- a/src_bak/api/shop/shopMerchantApply/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopMerchantApply, ShopMerchantApplyParam } from './model'; - -/** - * 分页查询商户入驻申请 - */ -export async function pageShopMerchantApply(params: ShopMerchantApplyParam) { - const res = await request.get>>( - '/shop/shop-merchant-apply/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商户入驻申请列表 - */ -export async function listShopMerchantApply(params?: ShopMerchantApplyParam) { - const res = await request.get>( - '/shop/shop-merchant-apply', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商户入驻申请 - */ -export async function addShopMerchantApply(data: ShopMerchantApply) { - const res = await request.post>( - '/shop/shop-merchant-apply', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商户入驻申请 - */ -export async function updateShopMerchantApply(data: ShopMerchantApply) { - const res = await request.put>( - '/shop/shop-merchant-apply', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 审核通过 -export async function checkShopMerchantApply(data: ShopMerchantApply) { - const res = await request.put>( - '/shop/shop-merchant-apply/check', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商户入驻申请 - */ -export async function removeShopMerchantApply(id?: number) { - const res = await request.del>( - '/shop/shop-merchant-apply/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商户入驻申请 - */ -export async function removeBatchShopMerchantApply( - data: (number | undefined)[] -) { - const res = await request.del>( - '/shop/shop-merchant-apply/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商户入驻申请 - */ -export async function getShopMerchantApply(id: number) { - const res = await request.get>( - '/shop/shop-merchant-apply/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopMerchantApply/model/index.ts b/src_bak/api/shop/shopMerchantApply/model/index.ts deleted file mode 100644 index ba14a2e..0000000 --- a/src_bak/api/shop/shopMerchantApply/model/index.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商户入驻申请 - */ -export interface ShopMerchantApply { - // ID - applyId?: number; - // 类型 - type?: number; - // 主体名称 - merchantName?: string; - // 证件号码 - merchantCode?: string; - // 商户图标 - image?: string; - // 商户手机号 - phone?: string; - // 商户姓名 - realName?: string; - // 身份证号码 - idCard?: string; - // 店铺类型 - shopType?: string; - // 商户分类 - category?: string; - // 手续费 - commission?: string; - // 关键字 - keywords?: string; - // 营业执照 - yyzz?: string; - // 身份证正面 - sfz1?: string; - // 身份证反面 - sfz2?: string; - // 资质图片 - files?: string; - // 所有人 - userId?: number; - // 是否自营 - ownStore?: number; - // 是否推荐 - recommend?: number; - // 是否需要审核 - goodsReview?: number; - // 工作负责人 - name2?: string; - // 驳回原因 - reason?: string; - // 备注 - comments?: string; - // 状态 - status?: number; - // 排序号 - sortNumber?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 商户入驻申请搜索条件 - */ -export interface ShopMerchantApplyParam extends PageParam { - applyId?: number; - userId?: number; - shopType?: string; - phone?: string; - keywords?: string; -} diff --git a/src_bak/api/shop/shopMerchantCount/index.ts b/src_bak/api/shop/shopMerchantCount/index.ts deleted file mode 100644 index feef797..0000000 --- a/src_bak/api/shop/shopMerchantCount/index.ts +++ /dev/null @@ -1,103 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopMerchantCount, ShopMerchantCountParam } from './model'; - -/** - * 分页查询门店销售统计表 - */ -export async function pageShopMerchantCount(params: ShopMerchantCountParam) { - const res = await request.get>>( - '/shop/shop-merchant-count/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询门店销售统计表列表 - */ -export async function listShopMerchantCount(params?: ShopMerchantCountParam) { - const res = await request.get>( - '/shop/shop-merchant-count', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加门店销售统计表 - */ -export async function addShopMerchantCount(data: ShopMerchantCount) { - const res = await request.post>( - '/shop/shop-merchant-count', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改门店销售统计表 - */ -export async function updateShopMerchantCount(data: ShopMerchantCount) { - const res = await request.put>( - '/shop/shop-merchant-count', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除门店销售统计表 - */ -export async function removeShopMerchantCount(id?: number) { - const res = await request.del>( - '/shop/shop-merchant-count/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除门店销售统计表 - */ -export async function removeBatchShopMerchantCount( - data: (number | undefined)[] -) { - const res = await request.del>( - '/shop/shop-merchant-count/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询门店销售统计表 - */ -export async function getShopMerchantCount(id: number) { - const res = await request.get>( - '/shop/shop-merchant-count/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopMerchantCount/model/index.ts b/src_bak/api/shop/shopMerchantCount/model/index.ts deleted file mode 100644 index cc136f3..0000000 --- a/src_bak/api/shop/shopMerchantCount/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 门店销售统计表 - */ -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/src_bak/api/shop/shopMerchantType/index.ts b/src_bak/api/shop/shopMerchantType/index.ts deleted file mode 100644 index 4bf8b4e..0000000 --- a/src_bak/api/shop/shopMerchantType/index.ts +++ /dev/null @@ -1,103 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopMerchantType, ShopMerchantTypeParam } from './model'; - -/** - * 分页查询商户类型 - */ -export async function pageShopMerchantType(params: ShopMerchantTypeParam) { - const res = await request.get>>( - '/shop/shop-merchant-type/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询商户类型列表 - */ -export async function listShopMerchantType(params?: ShopMerchantTypeParam) { - const res = await request.get>( - '/shop/shop-merchant-type', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加商户类型 - */ -export async function addShopMerchantType(data: ShopMerchantType) { - const res = await request.post>( - '/shop/shop-merchant-type', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改商户类型 - */ -export async function updateShopMerchantType(data: ShopMerchantType) { - const res = await request.put>( - '/shop/shop-merchant-type', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除商户类型 - */ -export async function removeShopMerchantType(id?: number) { - const res = await request.del>( - '/shop/shop-merchant-type/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除商户类型 - */ -export async function removeBatchShopMerchantType( - data: (number | undefined)[] -) { - const res = await request.del>( - '/shop/shop-merchant-type/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询商户类型 - */ -export async function getShopMerchantType(id: number) { - const res = await request.get>( - '/shop/shop-merchant-type/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopMerchantType/model/index.ts b/src_bak/api/shop/shopMerchantType/model/index.ts deleted file mode 100644 index 522d081..0000000 --- a/src_bak/api/shop/shopMerchantType/model/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商户类型 - */ -export interface ShopMerchantType { - // ID - id?: number; - // 店铺类型 - name?: string; - // 店铺入驻条件 - comments?: string; - // 状态 - status?: number; - // 排序号 - sortNumber?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - value?: string; -} - -/** - * 商户类型搜索条件 - */ -export interface ShopMerchantTypeParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopMessage/index.ts b/src_bak/api/shop/shopMessage/index.ts deleted file mode 100644 index f8c4d8f..0000000 --- a/src_bak/api/shop/shopMessage/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import request from '@/utils/request' -import type { ShopMessage } from './model' - -/** 获取消息列表 */ -export function listShopMessage(params?: { - page?: number - limit?: number - type?: string - isRead?: boolean -}) { - return request.get<{ code: number; data: { list: ShopMessage[]; total: number } }>('/user/message/list', params) -} - -/** 获取消息详情 */ -export function getShopMessage(id: string) { - return request.get<{ code: number; data: ShopMessage }>(`/user/message/${id}`) -} - -/** 标记消息已读 */ -export function readShopMessage(id: string) { - return request.put<{ code: number }>(`/user/message/read/${id}`) -} - -/** 删除消息 */ -export function deleteShopMessage(id: string) { - return request.del<{ code: number }>(`/user/message/${id}`) -} - -/** 全部标记已读 */ -export function readAllShopMessage() { - return request.put<{ code: number }>('/user/message/read-all') -} - -/** 获取未读消息数量 */ -export function getUnreadMessageCount() { - return request.get<{ code: number; data: { count: number } }>('/user/message/unread-count') -} diff --git a/src_bak/api/shop/shopMessage/model/index.ts b/src_bak/api/shop/shopMessage/model/index.ts deleted file mode 100644 index 65f40cb..0000000 --- a/src_bak/api/shop/shopMessage/model/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** 消息类型 */ -export type MessageType = 'system' | 'order' | 'activity' - -/** 消息 */ -export interface ShopMessage { - /** 消息ID */ - id: string - /** 消息类型 */ - type: MessageType - /** 消息标题 */ - title: string - /** 消息内容 */ - content: string - /** 是否已读 */ - isRead: boolean - /** 创建时间 */ - createdAt: string - /** 相关链接(可选) */ - link?: string -} diff --git a/src_bak/api/shop/shopNotification/index.ts b/src_bak/api/shop/shopNotification/index.ts deleted file mode 100644 index d4a1eee..0000000 --- a/src_bak/api/shop/shopNotification/index.ts +++ /dev/null @@ -1,140 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopNotification, ShopNotificationParam } from './model'; - -/** - * 分页查询消息通知 - */ -export async function pageShopNotification(params: ShopNotificationParam) { - const res = await request.get>>( - '/shop/shop-notification/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询全部消息通知 - */ -export async function listShopNotification(params?: ShopNotificationParam) { - const res = await request.get>( - '/shop/shop-notification', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询消息通知 - */ -export async function getShopNotification(id: number) { - const res = await request.get>( - '/shop/shop-notification/' + id - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加消息通知 - */ -export async function addShopNotification(data: ShopNotification) { - const res = await request.post>( - '/shop/shop-notification', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改消息通知 - */ -export async function updateShopNotification(data: ShopNotification) { - const res = await request.put>( - '/shop/shop-notification', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除消息通知 - */ -export async function removeShopNotification(id?: number) { - const res = await request.del>( - '/shop/shop-notification/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取用户消息列表 - */ -export async function getShopNotificationByUserId(userId: number) { - const res = await request.get>( - '/shop/shop-notification/user/' + userId - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 标记消息已读 - */ -export async function markShopNotificationAsRead(id: number, userId: number) { - const res = await request.put>( - '/shop/shop-notification/read/' + id + '?userId=' + userId, - null - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 标记全部已读 - */ -export async function markAllShopNotificationAsRead(userId: number) { - const res = await request.put>( - '/shop/shop-notification/read-all?userId=' + userId, - null - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取未读消息数量 - */ -export async function getShopNotificationUnreadCount(userId: number) { - const res = await request.get>( - '/shop/shop-notification/unread-count', - { userId } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopNotification/model/index.ts b/src_bak/api/shop/shopNotification/model/index.ts deleted file mode 100644 index ce330d7..0000000 --- a/src_bak/api/shop/shopNotification/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -export interface ShopNotification { - id?: number; - userId?: number; - type?: number; // 1系统通知 2订单消息 3优惠活动 4物流通知 - title?: string; - content?: string; - relationId?: number; - relationType?: string; - isRead?: number; // 0未读 1已读 - readTime?: string; - tenantId?: number; - createTime?: string; -} - -export interface ShopNotificationParam { - id?: number; - userId?: number; - type?: number; - title?: string; - isRead?: number; - tenantId?: number; - keywords?: string; - createTimeStart?: string; - createTimeEnd?: string; -} diff --git a/src_bak/api/shop/shopOrder/index.ts b/src_bak/api/shop/shopOrder/index.ts deleted file mode 100644 index 95fdd26..0000000 --- a/src_bak/api/shop/shopOrder/index.ts +++ /dev/null @@ -1,194 +0,0 @@ -import request, { ErrorType, RequestError } from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopOrder, ShopOrderParam, OrderCreateRequest } from './model'; - -/** - * 分页查询订单 - */ -export async function pageShopOrder(params: ShopOrderParam) { - const res = await request.get>>( - '/shop/shop-order/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询订单列表 - */ -export async function listShopOrder(params?: ShopOrderParam) { - const res = await request.get>( - '/shop/shop-order', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加订单 - */ -export async function addShopOrder(data: ShopOrder) { - const res = await request.post>( - '/shop/shop-order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改订单 - */ -export async function updateShopOrder(data: ShopOrder) { - const res = await request.put>( - '/shop/shop-order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除订单 - */ -export async function removeShopOrder(id?: number) { - const res = await request.del>( - '/shop/shop-order/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除订单 - */ -export async function removeBatchShopOrder(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-order/batch', - { ids: data.filter(Boolean) } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询订单 - */ -export async function getShopOrder(id: number) { - const res = await request.get>( - '/shop/shop-order/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 微信支付返回数据 - */ -export interface WxPayResult { - prepayId: string; - orderNo: string; - timeStamp: string; - nonceStr: string; - package: string; - signType: string; - paySign: string; -} - -/** - * 订单重新发起支付(对"已创建但未支付"的订单生成新的预支付参数,不应重复创建订单) - * - * 说明:不同后端版本可能暴露不同路径,这里做兼容探测;若全部失败,调用方可自行降级处理。 - */ -export interface OrderPrepayRequest { - orderId: number; - payType: number; -} - -export async function prepayShopOrder(data: OrderPrepayRequest) { - const urls = [ - '/shop/shop-order/pay', - '/shop/shop-order/prepay', - '/shop/shop-order/repay' - ]; - - let lastError: unknown; - let businessError: unknown; - for (const url of urls) { - try { - const res = await request.post>(url, data, { showError: false }); - // request.ts 在 code!=0 时会直接 throw;走到这里通常都是 code===0 - if (res.code === 0) return res.data; - } catch (e) { - // 若已命中"业务错误"(例如订单已取消/已支付),优先保留该错误用于向上提示; - // 不要被后续的 404/网络错误覆盖掉,避免调用方误判为"不支持该接口"而降级走创建订单。 - if (!businessError && e instanceof RequestError && e.type === ErrorType.BUSINESS_ERROR) { - businessError = e; - } else { - lastError = e; - } - } - } - - return Promise.reject(businessError || lastError || new Error('发起支付失败')); -} - -/** - * 创建订单 - */ -export async function createOrder(data: OrderCreateRequest) { - // Java 后端期望 camelCase 字段,直接传 - const res = await request.post>( - '/shop/shop-order', - data - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修复订单支付状态 - */ -export async function repairOrder(data: ShopOrder) { - const res = await request.put>( - '/shop/shop-order/repair', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - - -/** - * 申请|同意退款 - */ -export async function refundShopOrder(data: ShopOrder) { - const res = await request.put>( - '/shop/shop-order/refund', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopOrder/model/index.ts b/src_bak/api/shop/shopOrder/model/index.ts deleted file mode 100644 index 2b8d177..0000000 --- a/src_bak/api/shop/shopOrder/model/index.ts +++ /dev/null @@ -1,231 +0,0 @@ -import type { PageParam } from '@/api/index'; -import type { ShopOrderGoods } from '@/api/shop/shopOrderGoods/model'; - -/** - * 订单 - */ -export interface ShopOrder { - // 订单号 - orderId?: number; - // 订单编号 - orderNo?: string; - // 订单类型,0商城订单 1预定订单/外卖 2会员卡 - type?: number; - // 标题 - title?: string; - // 快递/自提 - deliveryType?: number; - // 下单渠道,0小程序预定 1俱乐部训练场 3活动订场 - channel?: number; - // 微信支付订单号 - transactionId?: string; - // 微信退款订单号 - refundOrder?: string; - // 商户ID - merchantId?: number; - // 商户名称 - merchantName?: string; - // 商户编号 - merchantCode?: string; - // 归属门店ID(shop_store.id) - storeId?: number; - // 归属门店名称 - storeName?: string; - // 配送员用户ID(优先级派单) - riderId?: number; - // 发货仓库ID - warehouseId?: number; - // 使用的优惠券id - couponId?: number; - // 使用的会员卡id - cardId?: string; - // 关联管理员id - adminId?: number; - // 核销管理员id - confirmId?: number; - // IC卡号 - icCard?: string; - // 头像 - avatar?: string; - // 真实姓名 - realName?: string; - // 手机号码 - phone?: string; - // 手机号码(脱敏) - mobile?: string; - // 关联收货地址 - addressId?: number; - // 收货地址 - address?: string; - // - addressLat?: string; - // - addressLng?: string; - // 自提店铺id - selfTakeMerchantId?: number; - // 自提店铺 - selfTakeMerchantName?: string; - // 配送开始时间 - sendStartTime?: string; - // 配送结束时间 - sendEndTime?: string; - // 配送员送达拍照(选填) - sendEndImg?: string; - // 发货店铺id - expressMerchantId?: number; - // 发货店铺 - expressMerchantName?: string; - // 订单总额 - totalPrice?: string; - // 减少的金额,使用VIP会员折扣、优惠券抵扣、优惠券折扣后减去的价格 - reducePrice?: string; - // 实际付款 - payPrice?: string; - // 用于统计 - price?: string; - // 价钱,用于积分赠送 - money?: string; - // 退款金额 - refundMoney?: string; - // 教练价格 - coachPrice?: string; - // 购买数量 - totalNum?: number; - // 教练id - coachId?: number; - // 商品ID - formId?: number; - // 支付的用户id - payUserId?: number; - // 0余额支付, 1微信支付,102微信Native,2会员卡支付,3支付宝,4现金,5POS机,6VIP月卡,7VIP年卡,8VIP次卡,9IC月卡,10IC年卡,11IC次卡,12免费,13VIP充值卡,14IC充值卡,15积分支付,16VIP季卡,17IC季卡,18代付 - payType?: number; - // 代付支付方式,0余额支付, 1微信支付,102微信Native,2会员卡支付,3支付宝,4现金,5POS机,6VIP月卡,7VIP年卡,8VIP次卡,9IC月卡,10IC年卡,11IC次卡,12免费,13VIP充值卡,14IC充值卡,15积分支付,16VIP季卡,17IC季卡,18代付 - friendPayType?: number; - // 0未付款,1已付款 - payStatus?: boolean; - // 0未使用,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款 - orderStatus?: number; - // 发货状态(10未发货 20已发货 30部分发货) - deliveryStatus?: number; - // 发货时间 - deliveryTime?: string; - // 优惠类型:0无、1抵扣优惠券、2折扣优惠券、3、VIP月卡、4VIP年卡,5VIP次卡、6VIP会员卡、7IC月卡、8IC年卡、9IC次卡、10IC会员卡、11免费订单、12VIP充值卡、13IC充值卡、14VIP季卡、15IC季卡 - couponType?: number; - // 优惠说明 - couponDesc?: string; - // 二维码地址,保存订单号,支付成功后才生成 - qrcode?: string; - // vip月卡年卡、ic月卡年卡回退次数 - returnNum?: number; - // vip充值回退金额 - returnMoney?: string; - // 预约详情开始时间数组 - startTime?: string; - // 是否已开具发票:0未开发票,1已开发票,2不能开具发票 - isInvoice?: number; - // 发票流水号 - 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; - // 自提码 - selfTakeCode?: string; - // 是否已收到赠品 - hasTakeGift?: string; - // 订单商品项 - orderGoods?: ShopOrderGoods[]; -} - -/** - * 订单商品项 - */ -export interface OrderGoodsItem { - goodsId: number; - quantity: number; - skuId?: number; - specInfo?: string; -} - -/** - * 创建订单请求 - */ -export interface OrderCreateRequest { - // 商品信息列表 - goodsItems: OrderGoodsItem[]; - // 归属门店ID(shop_store.id) - storeId?: number; - // 归属门店名称(可选) - storeName?: string; - // 配送员用户ID(优先级派单) - riderId?: number; - // 发货仓库ID - warehouseId?: number; - // 收货地址ID - addressId?: number; - // 支付方式 - payType: number; - // 优惠券ID - couponId?: number; - // 备注 - comments?: string; - // 配送开始时间(用于预约/配送时间) - sendStartTime?: string; - // 配送方式 0快递 1自提 - deliveryType?: number; - // 自提店铺ID - selfTakeMerchantId?: number; - // 订单标题(可选,后端会自动生成) - title?: string; - // 配送方式:elevator(电梯) / stairs(步梯) / groundFloor(一楼商铺/其他) - deliveryMethod?: string; - // 楼层(步梯+送上楼时有值,从2开始) - deliveryFloor?: number; -} - -/** - * 订单搜索条件 - */ -export interface ShopOrderParam extends PageParam { - orderId?: number; - orderNo?: string; - phone?: string; - payStatus?: number; - orderStatus?: number; - payType?: number; - isInvoice?: boolean; - userId?: number; - // 归属门店ID(shop_store.id) - storeId?: number; - // 配送员用户ID - riderId?: number; - // 发货仓库ID - warehouseId?: number; - keywords?: string; - deliveryStatus?: number; - statusFilter?: number; -} diff --git a/src_bak/api/shop/shopOrderGoods/index.ts b/src_bak/api/shop/shopOrderGoods/index.ts deleted file mode 100644 index e12d634..0000000 --- a/src_bak/api/shop/shopOrderGoods/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api'; -import type { ShopOrderGoods } from '@/api/shop/shopOrderGoods/model'; - -/** - * 根据订单ID查询订单商品列表 - */ -export async function listShopOrderGoodsByOrderId(orderId: number) { - const res = await request.get>( - '/shop/shop-order-goods', - { orderId } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据ID查询订单商品 - */ -export async function getShopOrderGoods(id: number) { - const res = await request.get>( - '/shop/shop-order-goods/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopOrderGoods/model/index.ts b/src_bak/api/shop/shopOrderGoods/model/index.ts deleted file mode 100644 index a4034de..0000000 --- a/src_bak/api/shop/shopOrderGoods/model/index.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 商品信息 - */ -export interface ShopOrderGoods { - // 自增ID - id?: number; - // 关联订单表id - orderId?: number; - // 订单标识 - orderCode?: string; - // 关联商户ID - merchantId?: number; - // 商户名称 - merchantName?: string; - // 商品封面图 - image?: string; - // 关联商品id - goodsId?: number; - // 商品名称 - goodsName?: string; - // 商品规格 - spec?: string; - // - skuId?: number; - // 单价 - price?: string; - // 购买数量 - totalNum?: number; - // 0 未付款 1已付款,2无需付款或占用状态 - payStatus?: number; - // 0未使用,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款 - orderStatus?: number; - // 是否免费:0收费、1免费 - isFree?: string; - // 系统版本 0当前版本 其他版本 - version?: number; - // 预约时间段 - timePeriod?: string; - // 预定日期 - dateTime?: string; - // 开场时间 - startTime?: string; - // 结束时间 - endTime?: string; - // 毫秒时间戳 - timeFlag?: string; - // 过期时间 - expirationTime?: string; - // 备注 - comments?: string; - // 用户id - userId?: number; - // 租户id - tenantId?: number; - // 更新时间 - updateTime?: string; - // 创建时间 - createTime?: string; -} - -/** - * 商品信息搜索条件 - */ -export interface ShopOrderGoodsParam extends PageParam { - id?: number; - orderId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopOrderRefund/index.ts b/src_bak/api/shop/shopOrderRefund/index.ts deleted file mode 100644 index c36b12b..0000000 --- a/src_bak/api/shop/shopOrderRefund/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import request from '@/utils/request' - -export interface RefundDetail { - orderNo: string; - refundMoney: string; - reason: string; - status: number; - statusText: string; - time: string; - steps: RefundStep[]; -} - -export interface RefundStep { - title: string; - desc: string; - time: string; - done: boolean; -} - -/** - * 获取退款详情 - * @param orderId 订单ID - * @returns 退款详情 - */ -export async function getRefundDetail(orderId: string): Promise { - try { - const res = await request.get('/order/refund/detail', { - params: { orderId } - }); - return res.data; - } catch (error) { - console.error('获取退款详情失败', error); - throw error; - } -} - -/** - * 取消退款申请 - * @param orderId 订单ID - * @returns 是否成功 - */ -export async function cancelRefund(orderId: string): Promise { - try { - const res = await request.post('/order/refund/cancel', { - data: { orderId } - }); - return res.code === 0; - } catch (error) { - console.error('取消退款失败', error); - throw error; - } -} diff --git a/src_bak/api/shop/shopPointsOrder/index.ts b/src_bak/api/shop/shopPointsOrder/index.ts deleted file mode 100644 index ece68f6..0000000 --- a/src_bak/api/shop/shopPointsOrder/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { ShopPointsOrder, PointsOrderStatus, CreatePointsOrderParams } from './model' - -export type { ShopPointsOrder, PointsOrderStatus, CreatePointsOrderParams } from './model' - -/** 查询积分订单列表参数 */ -export interface ListShopPointsOrderParams { - page?: number - limit?: number - status?: PointsOrderStatus -} - -/** - * 查询积分订单列表 - */ -export async function listShopPointsOrder(params?: ListShopPointsOrderParams) { - const res = await request.get>>( - '/shop/shop-points-order/page', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取积分订单详情 - */ -export async function getShopPointsOrder(id: string) { - const res = await request.get>( - '/shop/shop-points-order/' + id - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 创建积分兑换订单 - */ -export async function createPointsOrder(data: CreatePointsOrderParams) { - const res = await request.post>( - '/shop/shop-points-order', - data - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 取消积分订单 - */ -export async function cancelShopPointsOrder(id: string) { - const res = await request.put>( - '/shop/shop-points-order/cancel/' + id - ) - if (res.code === 0) { - return true - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopPointsOrder/model/index.ts b/src_bak/api/shop/shopPointsOrder/model/index.ts deleted file mode 100644 index c556be9..0000000 --- a/src_bak/api/shop/shopPointsOrder/model/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** 积分订单状态 */ -export type PointsOrderStatus = 'pending' | 'paid' | 'shipped' | 'completed' | 'cancelled' - -/** 积分订单商品 */ -export interface PointsOrderItem { - /** 商品ID */ - goodsId: string - /** 商品名称 */ - goodsName: string - /** 商品图片 */ - goodsImage: string - /** 兑换积分 */ - points: number - /** 补差价金额 */ - moneyAmount?: string - /** 数量 */ - quantity: number -} - -/** 积分订单 */ -export interface ShopPointsOrder { - /** 订单ID */ - id: string - /** 订单号 */ - orderNo: string - /** 订单状态 */ - status: PointsOrderStatus - /** 总积分 */ - totalPoints: number - /** 补差价金额 */ - moneyAmount?: string - /** 支付方式: 1微信 0余额 */ - payType?: number - /** 商品列表 */ - items: PointsOrderItem[] - /** 收货人 */ - receiverName?: string - /** 收货电话 */ - receiverPhone?: string - /** 收货地址 */ - address: string - /** 物流单号 */ - trackingNo?: string - /** 物流公司 */ - trackingCompany?: string - /** 创建时间 */ - createdAt: string - /** 更新时间 */ - updatedAt?: string -} - -/** 创建积分订单参数 */ -export interface CreatePointsOrderParams { - /** 商品ID */ - productId: number - /** 数量 */ - quantity?: number - /** 收货地址ID(实物商品必填) */ - addressId?: number - /** 支付方式: 1微信 0余额(补差价时必填) */ - payType?: number -} diff --git a/src_bak/api/shop/shopPointsProduct/index.ts b/src_bak/api/shop/shopPointsProduct/index.ts deleted file mode 100644 index a9053b6..0000000 --- a/src_bak/api/shop/shopPointsProduct/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { ShopPointsProduct, ShopPointsProductParam } from './model' - -/** - * 分页查询积分兑换商品表 - */ -export async function pageShopPointsProduct(params: ShopPointsProductParam) { - const res = await request.get>>( - '/shop/shop-points-product/page', - params - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询积分兑换商品表列表 - */ -export async function listShopPointsProduct(params?: ShopPointsProductParam) { - const res = await request.get>( - '/shop/shop-points-product', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 根据id查询积分兑换商品详情 - */ -export async function getShopPointsProduct(id: number) { - const res = await request.get>( - '/shop/shop-points-product/' + id - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopPointsProduct/model/index.ts b/src_bak/api/shop/shopPointsProduct/model/index.ts deleted file mode 100644 index d027ad1..0000000 --- a/src_bak/api/shop/shopPointsProduct/model/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * 积分兑换商品表 - */ -export interface ShopPointsProduct { - /** ID */ - id?: number - /** 商品名称 */ - productName?: string - /** 商品图片 */ - productImage?: string - /** 商品类型: 0实物 1优惠券 2虚拟商品 */ - productType?: number - /** 优惠券ID(商品类型为优惠券时) */ - couponId?: number - /** 兑换所需积分 */ - pointsPrice?: number - /** 补差价金额 */ - moneyPrice?: string - /** 库存 */ - stock?: number - /** 兑换量 */ - sales?: number - /** 商品描述 */ - description?: string - /** 是否热门: 0否 1是 */ - isHot?: number - /** 状态: 0下架 1上架 */ - status?: number - /** 排序号 */ - sortNumber?: number - /** 创建时间 */ - createTime?: string -} - -/** - * 积分兑换商品搜索条件 - */ -export interface ShopPointsProductParam { - /** 页码 */ - page?: number - /** 每页数量 */ - limit?: number - /** ID */ - id?: number - /** 关键词 */ - keywords?: string - /** 是否热门 */ - isHot?: number - /** 状态 */ - status?: number -} diff --git a/src_bak/api/shop/shopRecharge/index.ts b/src_bak/api/shop/shopRecharge/index.ts deleted file mode 100644 index d9be40c..0000000 --- a/src_bak/api/shop/shopRecharge/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult } from '@/api' -import type { UserRecharge, RechargeRequest } from './model' - -export type { UserRecharge, RechargeRequest } - -/** - * 创建用户充值订单 - * 注意:后端可能需要实现此接口 - */ -export async function createUserRecharge(data: RechargeRequest): Promise { - const res = await request.post>( - '/shop/shop-recharge/create', - data - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 发起充值支付 - * 注意:后端可能需要实现此接口 - */ -export async function payUserRecharge(rechargeId: number): Promise { - const res = await request.post>( - '/shop/shop-recharge/pay', - { rechargeId } - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopRecharge/model/index.ts b/src_bak/api/shop/shopRecharge/model/index.ts deleted file mode 100644 index b17aa40..0000000 --- a/src_bak/api/shop/shopRecharge/model/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 用户充值类型定义 - */ - -export interface UserRecharge { - rechargeId?: number - orderNo?: string - amount?: string - payType?: number - payStatus?: number - createTime?: string -} - -export interface RechargeRequest { - amount: string - payType: number -} diff --git a/src_bak/api/shop/shopRechargeCode/index.ts b/src_bak/api/shop/shopRechargeCode/index.ts deleted file mode 100644 index 04d86d8..0000000 --- a/src_bak/api/shop/shopRechargeCode/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { ShopRechargeCode, ShopRechargeCodeParam } from './model' - -/** - * 使用兑换码充值 - */ -export async function useRechargeCode(code: string) { - const res = await request.post>( - '/shop/recharge-code/use', - { code } - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 获取兑换码信息 - */ -export async function getRechargeCodeInfo(code: string) { - const res = await request.get>( - '/shop/recharge-code/info', - { code } - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 分页查询用户兑换记录 - */ -export async function pageRechargeCodeRecords(params: { - page?: number - limit?: number -}) { - const res = await request.get>>( - '/shop/recharge-code/records', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopRechargeCode/model/index.ts b/src_bak/api/shop/shopRechargeCode/model/index.ts deleted file mode 100644 index b8aa00a..0000000 --- a/src_bak/api/shop/shopRechargeCode/model/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * 充值兑换码类型定义 - */ - -export interface ShopRechargeCode { - id: number - code: string - amount: string - userId?: number - status: number // 0-未使用, 1-已使用, 2-已过期 - generateType: number // 1-管理员生成, 2-批量生成 - batchNo?: string - expireTime?: string - usedAt?: string - balanceBefore?: string - balanceAfter?: string - createTime: string - updateTime: string -} - -export interface ShopRechargeCodeParam { - page?: number - limit?: number - code?: string - status?: number - batchNo?: string - userId?: number -} diff --git a/src_bak/api/shop/shopRechargeOrder.ts b/src_bak/api/shop/shopRechargeOrder.ts deleted file mode 100644 index b479610..0000000 --- a/src_bak/api/shop/shopRechargeOrder.ts +++ /dev/null @@ -1,40 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' - -/** - * 充值订单类型 - */ -export interface RechargeOrder { - orderId?: number - orderNo?: string - userId?: number - rechargeType?: number // 充值方式(10自定义金额 20套餐充值) - payPrice?: string // 支付金额 - giftMoney?: string // 赠送金额 - actualMoney?: string // 实际到账金额 - balance?: string // 用户可用余额 - payMethod?: string // 支付方式 - payStatus?: number // 支付状态(10待支付 20已支付) - payTime?: number // 付款时间戳 - platform?: string // 来源平台 - comments?: string // 备注 - createTime?: string // 创建时间 - updateTime?: string // 更新时间 -} - -/** - * 分页查询充值记录 - */ -export async function pageUserRechargeOrder(params: { - page?: number - limit?: number -}): Promise> { - const res = await request.get>>( - '/shop/shop-recharge-order/page', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message || '获取充值记录失败')) -} diff --git a/src_bak/api/shop/shopSeckill/index.ts b/src_bak/api/shop/shopSeckill/index.ts deleted file mode 100644 index ccf4140..0000000 --- a/src_bak/api/shop/shopSeckill/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import request from '@/utils/request' -import type { - ShopSeckill, - ShopSeckillOrder, - ShopSeckillPageParams, -} from './model' - -/** 获取秒杀商品列表 */ -export function pageShopSeckill(params: ShopSeckillPageParams = {}) { - return request.post<{ items: ShopSeckill[]; total: number }>('/shopSeckill/page', params) -} - -/** 获取秒杀商品详情 */ -export function getShopSeckill(id: number) { - return request.post('/shopSeckill/get', { id }) -} - -/** 创建秒杀订单 */ -export function createSeckillOrder(data: { seckillId: number; goodsId: number; skuId: number; quantity: number }) { - return request.post('/shopSeckill/createOrder', data) -} - -/** 获取我的秒杀订单 */ -export function mySeckillOrders(params: { page?: number; pageSize?: number } = {}) { - return request.post<{ items: ShopSeckillOrder[]; total: number }>('/shopSeckill/myOrders', params) -} - -/** 获取秒杀时间段(场次) */ -export function getSeckillTimeSlots() { - return request.post>('/shopSeckill/timeSlots', {}) -} diff --git a/src_bak/api/shop/shopSeckill/model.ts b/src_bak/api/shop/shopSeckill/model.ts deleted file mode 100644 index 5ee0b05..0000000 --- a/src_bak/api/shop/shopSeckill/model.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** 秒杀活动 */ -export interface ShopSeckill { - id: number - goodsId: number - goodsName?: string - goodsImage?: string - /** 秒杀价格 */ - seckillPrice: number - /** 开始时间 */ - startTime: string - /** 结束时间 */ - endTime: string - /** 秒杀库存 */ - stock: number - /** 已售数量 */ - soldCount: number - /** 状态:0-未开始 1-进行中 2-已结束 */ - status: number - /** 限购数量 */ - limitPerUser: number - /** 商品详情 */ - product?: { - id: number - name: string - image: string - price: number - originalPrice?: number - } -} - -/** 秒杀订单 */ -export interface ShopSeckillOrder { - id: number - seckillId: number - userId: number - goodsId: number - quantity: number - price: number - status: number - createTime: string -} - -/** 分页参数 */ -export interface ShopSeckillPageParams { - page?: number - pageSize?: number - status?: number -} diff --git a/src_bak/api/shop/shopSetting/index.ts b/src_bak/api/shop/shopSetting/index.ts deleted file mode 100644 index 92a3ffb..0000000 --- a/src_bak/api/shop/shopSetting/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopSetting, ShopSettingParam } from './model'; - -/** - * 分页查询设置 - */ -export async function pageShopSetting(params: ShopSettingParam) { - const res = await request.get>>( - '/shop/shop-setting/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询设置列表 - */ -export async function listShopSetting(params?: ShopSettingParam) { - const res = await request.get>( - '/shop/shop-setting', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据分类获取设置列表 - */ -export async function getShopSettingByCategory(category: string) { - const res = await request.get>( - `/shop/shop-setting/category/${category}` - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取分类设置值(Map格式) - */ -export async function getShopSettingCategoryValues(category: string) { - const res = await request.get>>( - `/shop/shop-setting/category/${category}/values` - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据key获取设置值 - */ -export async function getShopSettingValue(key: string) { - const res = await request.get>( - `/shop/shop-setting/key/${key}` - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据key获取完整设置 - */ -export async function getShopSettingByKey(key: string) { - const res = await request.get>( - `/shop/shop-setting/info/${key}` - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 保存或更新设置 - */ -export async function saveShopSetting(data: ShopSetting) { - const res = await request.post>( - '/shop/shop-setting', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 更新设置 - */ -export async function updateShopSetting(data: ShopSetting) { - const res = await request.put>( - '/shop/shop-setting', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量保存分类设置 - */ -export async function batchSaveShopSetting(category: string, values: Record) { - const res = await request.post>( - `/shop/shop-setting/batch/${category}`, - values - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除设置 - */ -export async function removeShopSetting(settingId: number) { - const res = await request.del>( - `/shop/shop-setting/${settingId}` - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopSetting/model/index.ts b/src_bak/api/shop/shopSetting/model/index.ts deleted file mode 100644 index e476bac..0000000 --- a/src_bak/api/shop/shopSetting/model/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 商城设置 - */ -export interface ShopSetting { - // 设置ID - settingId?: number; - // 设置分类: basic/payment/notify/order/points/dealer - category?: string; - // 设置项标识 - settingKey?: string; - // 设置项名称 - settingName?: string; - // 设置值(JSON格式) - settingValue?: string; - // 设置类型: string/number/boolean/json - valueType?: string; - // 设置说明 - description?: string; - // 排序号 - sortNumber?: number; - // 是否启用 0否 1是 - isEnabled?: number; - // 是否公开(前端可读)0否 1是 - isPublic?: number; - // 租户id - tenantId?: number; - // 创建时间 - createdTime?: number; - // 更新时间 - updatedTime?: number; -} - -/** - * 商城设置搜索条件 - */ -export interface ShopSettingParam extends PageParam { - settingId?: number; - category?: string; - settingKey?: string; - keywords?: string; -} diff --git a/src_bak/api/shop/shopSigninConfig/index.ts b/src_bak/api/shop/shopSigninConfig/index.ts deleted file mode 100644 index 73f9d43..0000000 --- a/src_bak/api/shop/shopSigninConfig/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult } from '@/api' -import type { ShopSigninConfig, ShopSigninConfigParam } from './model' - -/** - * 分页查询签到积分配置表 - */ -export async function pageShopSigninConfig(params: ShopSigninConfigParam) { - const res = await request.get>( - '/shop/shop-signin-config/page', - params - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询签到积分配置表列表 - */ -export async function listShopSigninConfig(params?: ShopSigninConfigParam) { - const res = await request.get>( - '/shop/shop-signin-config', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopSigninConfig/model/index.ts b/src_bak/api/shop/shopSigninConfig/model/index.ts deleted file mode 100644 index 07de101..0000000 --- a/src_bak/api/shop/shopSigninConfig/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * 签到积分配置表 - */ -export interface ShopSigninConfig { - /** 配置ID */ - configId?: number - /** 第几天(1-7循环) */ - dayNumber?: number - /** 获得积分数 */ - points?: number - /** 是否删除: 0否 1是 */ - deleted?: number - /** 租户ID */ - tenantId?: string -} - -/** - * 签到积分配置表搜索条件 - */ -export interface ShopSigninConfigParam { - /** 页码 */ - page?: number - /** 每页数量 */ - limit?: number - /** 配置ID */ - configId?: number - /** 关键词 */ - keywords?: string -} diff --git a/src_bak/api/shop/shopSigninRecord/index.ts b/src_bak/api/shop/shopSigninRecord/index.ts deleted file mode 100644 index 0f0d359..0000000 --- a/src_bak/api/shop/shopSigninRecord/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { ShopSigninRecord, ShopSigninRecordParam } from './model' - -/** - * 分页查询签到记录表 - */ -export async function pageShopSigninRecord(params: ShopSigninRecordParam) { - const res = await request.get>>( - '/shop/shop-signin-record/page', - params - ) - if (res.code === 0) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询签到记录表列表 - */ -export async function listShopSigninRecord(params?: ShopSigninRecordParam) { - const res = await request.get>( - '/shop/shop-signin-record', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 添加签到记录表 - */ -export async function addShopSigninRecord(data: Partial) { - const res = await request.post>( - '/shop/shop-signin-record', - data - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} - -/** - * 删除签到记录表 - */ -export async function removeShopSigninRecord(id?: number) { - const res = await request.del>( - '/shop/shop-signin-record/' + id - ) - if (res.code === 0) { - return res.message - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/shop/shopSigninRecord/model/index.ts b/src_bak/api/shop/shopSigninRecord/model/index.ts deleted file mode 100644 index 343df1f..0000000 --- a/src_bak/api/shop/shopSigninRecord/model/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * 签到记录表 - */ -export interface ShopSigninRecord { - /** 记录ID */ - recordId?: number - /** 用户ID */ - userId?: number - /** 签到日期 */ - signinDate?: string - /** 获得积分 */ - points?: number - /** 连续签到天数 */ - continuousDays?: number - /** 租户ID */ - tenantId?: string - /** 创建时间 */ - createTime?: string -} - -/** - * 签到记录搜索条件 - */ -export interface ShopSigninRecordParam { - /** 页码 */ - page?: number - /** 每页数量 */ - limit?: number - /** 记录ID */ - recordId?: number - /** 关键词 */ - keywords?: string -} diff --git a/src_bak/api/shop/shopSpec/index.ts b/src_bak/api/shop/shopSpec/index.ts deleted file mode 100644 index a4d9b29..0000000 --- a/src_bak/api/shop/shopSpec/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import { ShopSpec, ShopSpecParam } from '@/api/shop/shopSpec/model'; - -/** - * 分页查询规格 - */ -export async function pageShopSpec(params: ShopSpecParam) { - const res = await request.get>>( - '/shop/shop-spec/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询规格列表 - */ -export async function listShopSpec(params?: ShopSpecParam) { - const res = await request.get>( - '/shop/shop-spec', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加规格 - */ -export async function addShopSpec(data: ShopSpec) { - const res = await request.post>( - '/shop/shop-spec', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改规格 - */ -export async function updateShopSpec(data: ShopSpec) { - const res = await request.put>( - '/shop/shop-spec', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除规格 - */ -export async function removeShopSpec(id?: number) { - const res = await request.del>( - '/shop/shop-spec/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除规格 - */ -export async function removeBatchShopSpec(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-spec/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询规格 - */ -export async function getShopSpec(id: number) { - const res = await request.get>( - '/shop/shop-spec/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopSpec/model/index.ts b/src_bak/api/shop/shopSpec/model/index.ts deleted file mode 100644 index b85d062..0000000 --- a/src_bak/api/shop/shopSpec/model/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 规格 - */ -export interface ShopSpec { - // 规格ID - specId?: number; - // 规格名称 - specName?: string; - // 规格值 - specValue?: string; - // 商户ID - merchantId?: number; - // 创建用户 - userId?: number; - // 更新者 - updater?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1待修,2异常已修,3异常未修 - status?: number; - // 排序号 - sortNumber?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - value?: string; -} - -/** - * 规格搜索条件 - */ -export interface ShopSpecParam extends PageParam { - specId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopSpecValue/index.ts b/src_bak/api/shop/shopSpecValue/index.ts deleted file mode 100644 index a765b28..0000000 --- a/src_bak/api/shop/shopSpecValue/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopSpecValue, ShopSpecValueParam } from './model'; - -/** - * 分页查询规格值 - */ -export async function pageShopSpecValue(params: ShopSpecValueParam) { - const res = await request.get>>( - '/shop/shop-spec-value/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询规格值列表 - */ -export async function listShopSpecValue(params?: ShopSpecValueParam) { - const res = await request.get>( - '/shop/shop-spec-value', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加规格值 - */ -export async function addShopSpecValue(data: ShopSpecValue) { - const res = await request.post>( - '/shop/shop-spec-value', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改规格值 - */ -export async function updateShopSpecValue(data: ShopSpecValue) { - const res = await request.put>( - '/shop/shop-spec-value', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除规格值 - */ -export async function removeShopSpecValue(id?: number) { - const res = await request.del>( - '/shop/shop-spec-value/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除规格值 - */ -export async function removeBatchShopSpecValue(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-spec-value/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询规格值 - */ -export async function getShopSpecValue(id: number) { - const res = await request.get>( - '/shop/shop-spec-value/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopSpecValue/model/index.ts b/src_bak/api/shop/shopSpecValue/model/index.ts deleted file mode 100644 index 8980f3b..0000000 --- a/src_bak/api/shop/shopSpecValue/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 规格值 - */ -export interface ShopSpecValue { - // 规格值ID - specValueId?: number; - // 规格组ID - specId?: number; - // 规格值 - specValue?: string; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; -} - -/** - * 规格值搜索条件 - */ -export interface ShopSpecValueParam extends PageParam { - specValueId?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopStore/index.ts b/src_bak/api/shop/shopStore/index.ts deleted file mode 100644 index 7a9915e..0000000 --- a/src_bak/api/shop/shopStore/index.ts +++ /dev/null @@ -1,130 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopStore, ShopStoreParam, StoreLoginResult } from './model'; - -/** - * 分页查询门店 - */ -export async function pageShopStore(params: ShopStoreParam) { - const res = await request.get>>( - '/shop/shop-store/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询门店列表 - */ -export async function listShopStore(params?: ShopStoreParam) { - const res = await request.get>( - '/shop/shop-store', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加门店 - */ -export async function addShopStore(data: ShopStore) { - const res = await request.post>( - '/shop/shop-store', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改门店 - */ -export async function updateShopStore(data: ShopStore) { - const res = await request.put>( - '/shop/shop-store', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除门店 - */ -export async function removeShopStore(id?: number) { - const res = await request.del>( - '/shop/shop-store/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除门店 - */ -export async function removeBatchShopStore(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-store/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询门店 - */ -export async function getShopStore(id: number) { - const res = await request.get>( - '/shop/shop-store/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 门店账号密码登录 - */ -export async function storeLogin(data: { phone: string; password: string }) { - const res = await request.post>( - '/shop/shop-store/store-login', - data - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询当前用户的门店关联信息 - * 返回门店用户关联记录(含 roleType、storeName 等) - */ -export async function getMyStore() { - const res = await request.get>( - '/shop/shop-store/my-store' - ); - if (res.code === 0 && res.data) { - return res.data; - } - // 非门店用户返回 null 而非 reject,方便调用方判断 - return null; -} diff --git a/src_bak/api/shop/shopStore/model/index.ts b/src_bak/api/shop/shopStore/model/index.ts deleted file mode 100644 index 1c9e689..0000000 --- a/src_bak/api/shop/shopStore/model/index.ts +++ /dev/null @@ -1,81 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 门店 - */ -export interface ShopStore { - // 自增ID - id?: number; - // 店铺名称 - name?: string; - // 门店地址 - address?: string; - // 手机号码 - phone?: string; - // 邮箱 - email?: string; - // 门店经理 - managerName?: string; - // 门店banner - shopBanner?: string; - // 所在省份 - province?: string; - // 所在城市 - city?: string; - // 所在辖区 - region?: string; - // 经度和纬度 - lngAndLat?: string; - // 位置 - location?:string; - // 区域 - district?: string; - // 轮廓 - points?: string; - // 用户ID - userId?: number; - // 默认仓库ID(shop_warehouse.id) - warehouseId?: number; - // 默认仓库名称(可选) - warehouseName?: string; - // 营业时间 - businessHours?: string; - // 状态 - status?: number; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 距离(km,前端计算填充) - distance?: number; - // 是否删除 - isDelete?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 登录密码(虚拟字段,不入库) - password?: string; - // 用户名(虚拟字段,不入库) - username?: string; -} - -/** - * 门店搜索条件 - */ -export interface ShopStoreParam extends PageParam { - id?: number; - keywords?: string; - phone?: string; - password?: string; -} - -/** - * 门店登录结果 - */ -export interface StoreLoginResult { - access_token: string; - user: any; -} diff --git a/src_bak/api/shop/shopStoreFence/index.ts b/src_bak/api/shop/shopStoreFence/index.ts deleted file mode 100644 index 609defa..0000000 --- a/src_bak/api/shop/shopStoreFence/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api/index'; -import type { ShopStoreFence, ShopStoreFenceParam } from './model'; - -/** - * 分页查询黄家明_电子围栏 - */ -export async function pageShopStoreFence(params: ShopStoreFenceParam) { - const res = await request.get>>( - '/shop/shop-store-fence/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询黄家明_电子围栏列表 - */ -export async function listShopStoreFence(params?: ShopStoreFenceParam) { - const res = await request.get>( - '/shop/shop-store-fence', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加黄家明_电子围栏 - */ -export async function addShopStoreFence(data: ShopStoreFence) { - const res = await request.post>( - '/shop/shop-store-fence', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改黄家明_电子围栏 - */ -export async function updateShopStoreFence(data: ShopStoreFence) { - const res = await request.put>( - '/shop/shop-store-fence', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除黄家明_电子围栏 - */ -export async function removeShopStoreFence(id?: number) { - const res = await request.del>( - '/shop/shop-store-fence/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除黄家明_电子围栏 - */ -export async function removeBatchShopStoreFence(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-store-fence/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询黄家明_电子围栏 - */ -export async function getShopStoreFence(id: number) { - const res = await request.get>( - '/shop/shop-store-fence/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopStoreFence/model/index.ts b/src_bak/api/shop/shopStoreFence/model/index.ts deleted file mode 100644 index 99c20dd..0000000 --- a/src_bak/api/shop/shopStoreFence/model/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 黄家明_电子围栏 - */ -export interface ShopStoreFence { - // 自增ID - id?: number; - // 围栏名称 - name?: string; - // 类型 0圆形 1方形 - type?: number; - // 定位 - location?: string; - // 经度 - longitude?: string; - // 纬度 - latitude?: string; - // 区域 - district?: string; - // 电子围栏轮廓 - points?: string; - // 排序(数字越小越靠前) - sortNumber?: number; - // 备注 - comments?: string; - // 状态, 0正常, 1冻结 - status?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 黄家明_电子围栏搜索条件 - */ -export interface ShopStoreFenceParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopStoreRider/index.ts b/src_bak/api/shop/shopStoreRider/index.ts deleted file mode 100644 index c411aef..0000000 --- a/src_bak/api/shop/shopStoreRider/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopStoreRider, ShopStoreRiderParam } from './model'; - -/** - * 分页查询配送员 - */ -export async function pageShopStoreRider(params: ShopStoreRiderParam) { - const res = await request.get>>( - '/shop/shop-store-rider/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询配送员列表 - */ -export async function listShopStoreRider(params?: ShopStoreRiderParam) { - const res = await request.get>( - '/shop/shop-store-rider', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加配送员 - */ -export async function addShopStoreRider(data: ShopStoreRider) { - const res = await request.post>( - '/shop/shop-store-rider', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改配送员 - */ -export async function updateShopStoreRider(data: ShopStoreRider) { - const res = await request.put>( - '/shop/shop-store-rider', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除配送员 - */ -export async function removeShopStoreRider(id?: number) { - const res = await request.del>( - '/shop/shop-store-rider/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除配送员 - */ -export async function removeBatchShopStoreRider(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-store-rider/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询配送员 - */ -export async function getShopStoreRider(id: number) { - const res = await request.get>( - '/shop/shop-store-rider/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopStoreRider/model/index.ts b/src_bak/api/shop/shopStoreRider/model/index.ts deleted file mode 100644 index 0b7ed68..0000000 --- a/src_bak/api/shop/shopStoreRider/model/index.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 配送员 - */ -export interface ShopStoreRider { - // 主键ID - id?: string; - // 配送点ID(shop_dealer.id) - dealerId?: number; - // 骑手编号(可选) - riderNo?: string; - // 姓名 - realName?: string; - // 手机号 - mobile?: string; - // 头像 - avatar?: string; - // 身份证号(可选) - idCardNo?: string; - // 状态:1启用;0禁用 - status?: number; - // 接单状态:0休息/下线;1在线;2忙碌 - workStatus?: number; - // 是否开启自动派单:1是;0否 - autoDispatchEnabled?: number; - // 派单优先级(同小区多骑手时可用,值越大越优先) - dispatchPriority?: number; - // 最大同时配送单数(0表示不限制) - maxOnhandOrders?: number; - // 是否计算工资(提成):1计算;0不计算(如三方配送点可设0) - commissionCalcEnabled?: number; - // 水每桶提成金额(元/桶) - waterBucketUnitFee?: string; - // 其他商品提成方式:1按订单固定金额;2按订单金额比例;3按商品规则(另表) - otherGoodsCommissionType?: number; - // 其他商品提成值:固定金额(元)或比例(%) - otherGoodsCommissionValue?: string; - // 用户ID - userId?: number; - // 经度(配送员当前位置) - longitude?: string; - // 纬度(配送员当前位置) - latitude?: string; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 是否删除 - isDelete?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 配送员搜索条件 - */ -export interface ShopStoreRiderParam extends PageParam { - id?: number; - keywords?: string; - // 配送点/门店ID(后端可能用 dealerId 或 storeId) - dealerId?: number; - storeId?: number; - status?: number; - workStatus?: number; - autoDispatchEnabled?: number; -} diff --git a/src_bak/api/shop/shopStoreUser/index.ts b/src_bak/api/shop/shopStoreUser/index.ts deleted file mode 100644 index df33349..0000000 --- a/src_bak/api/shop/shopStoreUser/index.ts +++ /dev/null @@ -1,116 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopStoreUser, ShopStoreUserParam } from './model'; - -/** - * 分页查询店员 - */ -export async function pageShopStoreUser(params: ShopStoreUserParam) { - const res = await request.get>>( - '/shop/shop-store-user/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询店员列表 - */ -export async function listShopStoreUser(params?: ShopStoreUserParam) { - const res = await request.get>( - '/shop/shop-store-user', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加店员 - */ -export async function addShopStoreUser(data: ShopStoreUser) { - const res = await request.post>( - '/shop/shop-store-user', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改店员 - */ -export async function updateShopStoreUser(data: ShopStoreUser) { - const res = await request.put>( - '/shop/shop-store-user', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除店员 - */ -export async function removeShopStoreUser(id?: number) { - const res = await request.del>( - '/shop/shop-store-user/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除店员 - */ -export async function removeBatchShopStoreUser(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-store-user/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询店员 - */ -export async function getShopStoreUser(id: number) { - const res = await request.get>( - '/shop/shop-store-user/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询当前登录用户的店员信息 - * 用于小程序端判断当前用户是否为门店经理/店员 - * 返回店员记录(含 storeName 等关联字段),非店员返回 null - */ -export async function getMyClerk() { - const res = await request.get>( - '/shop/shop-store-user/my' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return null; -} diff --git a/src_bak/api/shop/shopStoreUser/model/index.ts b/src_bak/api/shop/shopStoreUser/model/index.ts deleted file mode 100644 index 46151f5..0000000 --- a/src_bak/api/shop/shopStoreUser/model/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 店员 - */ -export interface ShopStoreUser { - // 主键ID - id?: number; - // 配送点ID(shop_dealer.id) - storeId?: number; - // 用户ID - userId?: number; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 是否删除 - isDelete?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 店员搜索条件 - */ -export interface ShopStoreUserParam extends PageParam { - id?: number; - keywords?: string; - storeId?: number; - userId?: number; - isDelete?: number; -} diff --git a/src_bak/api/shop/shopStoreWarehouse/index.ts b/src_bak/api/shop/shopStoreWarehouse/index.ts deleted file mode 100644 index 898e7b9..0000000 --- a/src_bak/api/shop/shopStoreWarehouse/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api/index'; -import type { ShopStoreWarehouse, ShopStoreWarehouseParam } from './model'; - -/** - * 分页查询仓库 - */ -export async function pageShopStoreWarehouse(params: ShopStoreWarehouseParam) { - const res = await request.get>>( - '/shop/shop-store-warehouse/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询仓库列表 - */ -export async function listShopStoreWarehouse(params?: ShopStoreWarehouseParam) { - const res = await request.get>( - '/shop/shop-store-warehouse', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加仓库 - */ -export async function addShopStoreWarehouse(data: ShopStoreWarehouse) { - const res = await request.post>( - '/shop/shop-store-warehouse', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改仓库 - */ -export async function updateShopStoreWarehouse(data: ShopStoreWarehouse) { - const res = await request.put>( - '/shop/shop-store-warehouse', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除仓库 - */ -export async function removeShopStoreWarehouse(id?: number) { - const res = await request.del>( - '/shop/shop-store-warehouse/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除仓库 - */ -export async function removeBatchShopStoreWarehouse(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-store-warehouse/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询仓库 - */ -export async function getShopStoreWarehouse(id: number) { - const res = await request.get>( - '/shop/shop-store-warehouse/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopStoreWarehouse/model/index.ts b/src_bak/api/shop/shopStoreWarehouse/model/index.ts deleted file mode 100644 index 90d5d84..0000000 --- a/src_bak/api/shop/shopStoreWarehouse/model/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 仓库 - */ -export interface ShopStoreWarehouse { - // 自增ID - id?: number; - // 仓库名称 - name?: string; - // 唯一标识 - code?: string; - // 类型 中心仓,区域仓,门店仓 - type?: string; - // 仓库地址 - address?: string; - // 真实姓名 - realName?: string; - // 联系电话 - phone?: string; - // 所在省份 - province?: string; - // 所在城市 - city?: string; - // 所在辖区 - region?: string; - // 经纬度 - lngAndLat?: string; - // 用户ID - userId?: number; - // 状态 - status?: number; - // 备注 - comments?: string; - // 排序号 - sortNumber?: number; - // 是否删除 - isDelete?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 仓库搜索条件 - */ -export interface ShopStoreWarehouseParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopUserAddress.ts b/src_bak/api/shop/shopUserAddress.ts deleted file mode 100644 index b33a2f2..0000000 --- a/src_bak/api/shop/shopUserAddress.ts +++ /dev/null @@ -1,75 +0,0 @@ -import request from '@/utils/request'; -import type { ShopUserAddress } from './shopUserAddress/model'; - -/** - * 解析地址列表响应 - * 兼容多种后端返回格式: - * 1. 直接数组 ShopUserAddress[] - * 2. 标准包装 { code, message, data: ShopUserAddress[] } - * 3. 标准包装 + 分页 { code, message, data: { list: [], count } } - * 4. code 为 0 或 200 都视为成功 - */ -function parseAddressList(res: any): ShopUserAddress[] { - if (Array.isArray(res)) { - return res as ShopUserAddress[]; - } - if (res && typeof res === 'object') { - const code = (res as any).code; - if (code === 0 || code === 200) { - const data = (res as any).data; - if (Array.isArray(data)) { - return data as ShopUserAddress[]; - } - if (data && Array.isArray(data.list)) { - return data.list as ShopUserAddress[]; - } - // code 成功但 data 为空 - return []; - } - } - return []; -} - -/** 收货地址列表 */ -export async function listShopUserAddress(params?: any) { - const res: any = await request.get('/shop/shop-user-address', params); - // 调试日志:微信开发者工具 console 可见,便于核对返回结构 - // eslint-disable-next-line no-console - console.log('[listShopUserAddress] raw response:', JSON.stringify(res)?.substring(0, 500)); - return parseAddressList(res); -} - -/** 获取收货地址详情 */ -export function getShopUserAddress(id: number) { - return request.get(`/shop/shop-user-address/${id}`); -} - -/** 添加收货地址 */ -export function addShopUserAddress(data: any) { - return request.post('/shop/shop-user-address', data); -} - -/** 更新收货地址 */ -export function updateShopUserAddress(data: any) { - return request.put('/shop/shop-user-address', data); -} - -/** 删除收货地址 */ -export function removeShopUserAddress(id: number) { - return request.delete(`/shop/shop-user-address/${id}`); -} - -/** 批量删除收货地址 */ -export function removeBatchShopUserAddress(ids: number[]) { - return request.post('/shop/shop-user-address/batch-delete', { ids }); -} - -/** 设置默认收货地址 */ -export function setDefaultAddress(id: number) { - return request.post(`/shop/shop-user-address/set-default/${id}`); -} - -/** 获取默认收货地址 */ -export function getDefaultAddress() { - return request.get('/shop/shop-user-address/default'); -} diff --git a/src_bak/api/shop/shopUserAddress/index.ts b/src_bak/api/shop/shopUserAddress/index.ts deleted file mode 100644 index 35d7b45..0000000 --- a/src_bak/api/shop/shopUserAddress/index.ts +++ /dev/null @@ -1,132 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopUserAddress, ShopUserAddressParam } from './model'; - -/** - * 分页查询收货地址 - */ -export async function pageShopUserAddress(params: ShopUserAddressParam) { - const res = await request.get>>( - '/shop/shop-user-address/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询收货地址列表 - */ -export async function listShopUserAddress(params?: ShopUserAddressParam) { - const res = await request.get>( - '/shop/shop-user-address', - params - ); - console.log('[listShopUserAddress] raw response:', JSON.stringify(res)?.substring(0, 300)) - // 兼容多种响应格式 - // 1. 直接返回数组 - if (Array.isArray(res)) { - return res as ShopUserAddress[]; - } - // 2. 标准包装 { code, data, message } - if (res && typeof res === 'object') { - // 兼容 code: 0 和 code: 200 - const isSuccess = res.code === 0 || res.code === 200 - if (isSuccess) { - // data 是数组 - if (Array.isArray(res.data)) { - return res.data; - } - // data 是分页对象 { list, count } - if (res.data && Array.isArray((res.data as any).list)) { - return (res.data as any).list as ShopUserAddress[]; - } - // data 为 null/undefined 但 code 成功,返回空数组 - return []; - } - } - return Promise.reject(new Error((res as any)?.message || '获取地址列表失败')); -} - -/** - * 添加收货地址 - */ -export async function addShopUserAddress(data: ShopUserAddress) { - const res = await request.post>( - '/shop/shop-user-address', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改收货地址 - */ -export async function updateShopUserAddress(data: ShopUserAddress) { - const res = await request.put>( - '/shop/shop-user-address/' + data.id, - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除收货地址 - */ -export async function removeShopUserAddress(id?: number) { - const res = await request.del>( - '/shop/shop-user-address/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 设置默认收货地址 - */ -export async function setDefaultAddress(id: number) { - const res = await request.put>( - '/shop/shop-user-address/set-default/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除收货地址 - */ -export async function removeBatchShopUserAddress(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-user-address/batch', - { ids: data.filter(Boolean) } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询收货地址 - */ -export async function getShopUserAddress(id: number) { - const res = await request.get>( - '/shop/shop-user-address/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopUserAddress/model/index.ts b/src_bak/api/shop/shopUserAddress/model/index.ts deleted file mode 100644 index 85696b9..0000000 --- a/src_bak/api/shop/shopUserAddress/model/index.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { PageParam } from '@/api'; - -/** - * 收货地址 - */ -export interface ShopUserAddress { - // 主键ID - id?: number; - // 姓名 - name?: string; - // 手机号码 - phone?: string; - // 所在国家 - country?: string; - // 所在省份 - province?: string; - // 所在城市 - city?: string; - // 所在辖区 - region?: string; - // 收货地址 - address?: string; - // 收货地址 - fullAddress?: string; - // - lat?: string; - // - lng?: string; - // 1先生 2女士 - gender?: number; - // 家、公司、学校 - type?: string; - // 默认收货地址 - isDefault?: boolean; - // 用户ID - userId?: number; - // 租户id - tenantId?: number; - // 注册时间 - createTime?: string; - // 更新时间 - updateTime?: string; -} - -/** - * 收货地址搜索条件 - */ -export interface ShopUserAddressParam extends PageParam { - id?: number; - userId?: number; - isDefault?: boolean; - keywords?: string; -} diff --git a/src_bak/api/shop/shopUserCard/index.ts b/src_bak/api/shop/shopUserCard/index.ts deleted file mode 100644 index 254d12e..0000000 --- a/src_bak/api/shop/shopUserCard/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult } from '@/api' -import type { UserCardStats, UserOrderStats } from './model' - -/** - * 获取用户卡片统计(余额/积分/优惠券/礼品卡) - * 后端聚合接口:/api/user/card/stats(60s 缓存) - * 余额数据来源:后端跨库读取 gxwebsoft_core.sys_user - */ -export async function getUserCardStats(): Promise { - try { - const res = await request.get>('/user/card/stats') - if (res.code === 0 && res.data) { - const d = res.data - return { - balance: d.balance != null ? String(d.balance) : '0.00', - points: d.points || 0, - coupons: d.coupons || 0, - giftCards: d.giftCards || 0, - } - } - } catch (e) { - console.error('[CardStats] /user/card/stats 请求失败:', e) - } - return { - balance: '0.00', - points: 0, - coupons: 0, - giftCards: 0, - } -} - -/** - * 获取用户订单统计 - * 后端接口:/api/user/orders/stats(60s 缓存) - */ -export async function getUserOrderStats(): Promise { - try { - const res = await request.get>('/user/orders/stats') - if (res.code === 0 && res.data) { - return { - pending: res.data.pending || 0, - paid: res.data.paid || 0, - shipped: res.data.shipped || 0, - completed: res.data.completed || 0, - } - } - } catch (e) { - console.error('获取订单统计失败:', e) - } - return { - pending: 0, - paid: 0, - shipped: 0, - completed: 0, - } -} diff --git a/src_bak/api/shop/shopUserCard/model/index.ts b/src_bak/api/shop/shopUserCard/model/index.ts deleted file mode 100644 index 3cc0554..0000000 --- a/src_bak/api/shop/shopUserCard/model/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 用户卡片统计类型定义 - */ - -export interface UserCardStats { - balance: string - points: number - coupons: number - giftCards: number -} - -export interface UserOrderStats { - pending: number // 待付款 - paid: number // 待发货 - shipped: number // 待收货 - completed: number // 已完成 -} diff --git a/src_bak/api/shop/shopUserCoupon/index.ts b/src_bak/api/shop/shopUserCoupon/index.ts deleted file mode 100644 index 0aa346a..0000000 --- a/src_bak/api/shop/shopUserCoupon/index.ts +++ /dev/null @@ -1,155 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopUserCoupon, ShopUserCouponParam } from './model'; - -/** - * 分页查询用户优惠券 - */ -export async function pageShopUserCoupon(params: ShopUserCouponParam) { - const res = await request.get>>( - '/shop/shop-user-coupon/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询用户优惠券列表 - */ -export async function listShopUserCoupon(params?: ShopUserCouponParam) { - const res = await request.get>( - '/shop/shop-user-coupon', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加用户优惠券 - */ -export async function addShopUserCoupon(data: ShopUserCoupon) { - const res = await request.post>( - '/shop/shop-user-coupon', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改用户优惠券 - */ -export async function updateShopUserCoupon(data: ShopUserCoupon) { - const res = await request.put>( - '/shop/shop-user-coupon', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除用户优惠券 - */ -export async function removeShopUserCoupon(id?: number) { - const res = await request.del>( - '/shop/shop-user-coupon/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除用户优惠券 - */ -export async function removeBatchShopUserCoupon(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-user-coupon/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询用户优惠券 - */ -export async function getShopUserCoupon(id: number) { - const res = await request.get>( - '/shop/shop-user-coupon/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取我的可用优惠券 - */ -export async function getMyAvailableCoupons() { - const res = await request.get>( - '/shop/shop-user-coupon/my/available' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取我的已使用优惠券 - */ -export async function getMyUsedCoupons() { - const res = await request.get>( - '/shop/shop-user-coupon/my/used' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取我的已过期优惠券 - */ -export async function getMyExpiredCoupons() { - const res = await request.get>( - '/shop/shop-user-coupon/my/expired' - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - - -/** - * 领取优惠券 - */ -export async function takeCoupon(couponId: number) { - const res = await request.post>( - '/shop/shop-user-coupon/take', - { couponId } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopUserCoupon/model/index.ts b/src_bak/api/shop/shopUserCoupon/model/index.ts deleted file mode 100644 index f0f77e3..0000000 --- a/src_bak/api/shop/shopUserCoupon/model/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 用户优惠券 - */ -export interface ShopUserCoupon { - // id - id?: string; - // 优惠券模板ID - couponId?: number; - // 用户ID - userId?: number; - // 优惠券名称 - name?: string; - // 优惠券描述 - description?: string; - // 优惠券类型(10满减券 20折扣券 30免费劵) - type?: number; - // 满减券-减免金额 - reducePrice?: string; - // 折扣券-折扣率(0-100) - discount?: number; - // 最低消费金额 - minPrice?: string; - // 适用范围(10全部商品 20指定商品 30指定分类) - applyRange?: number; - // 适用范围配置(json格式) - applyRangeConfig?: string; - // 有效期开始时间 - startTime?: string; - // 有效期结束时间 - endTime?: string; - // 使用状态(0未使用 1已使用 2已过期) - status?: number; - // 状态文本描述 - statusText?: string; - // 是否过期, 0否, 1是 - isExpire?: number; - // 是否即将过期(后端计算) - isExpiringSoon?: boolean; - // 剩余天数(后端计算) - daysRemaining?: number; - // 剩余小时数(后端计算) - hoursRemaining?: number; - // 使用时间 - takeTime?: string; - // 使用订单ID - orderId?: string; - // 使用订单号 - orderNo?: string; - // 获取方式(10主动领取 20系统发放 30活动赠送) - obtainType?: number; - // 获取来源描述 - obtainSource?: string; - // 是否删除, 0否, 1是 - deleted?: string; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 用户优惠券搜索条件 - */ -export interface ShopUserCouponParam extends PageParam { - id?: number; - userId?: number; - status?: number; - isExpire?: number; - sortBy?: string; - sortOrder?: string; - // 仅查询有效的优惠券 - validOnly?: boolean; - // 仅查询已过期的优惠券 - expired?: boolean; - // 查询即将过期的优惠券 - expiringSoon?: boolean; - // 当前时间(用于测试) - currentTime?: string; - keywords?: string; -} diff --git a/src_bak/api/shop/shopUserReferee/index.ts b/src_bak/api/shop/shopUserReferee/index.ts deleted file mode 100644 index 5f7cc55..0000000 --- a/src_bak/api/shop/shopUserReferee/index.ts +++ /dev/null @@ -1,101 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ShopUserReferee, ShopUserRefereeParam } from './model'; - -/** - * 分页查询用户推荐关系表 - */ -export async function pageShopUserReferee(params: ShopUserRefereeParam) { - const res = await request.get>>( - '/shop/shop-user-referee/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询用户推荐关系表列表 - */ -export async function listShopUserReferee(params?: ShopUserRefereeParam) { - const res = await request.get>( - '/shop/shop-user-referee', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加用户推荐关系表 - */ -export async function addShopUserReferee(data: ShopUserReferee) { - const res = await request.post>( - '/shop/shop-user-referee', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改用户推荐关系表 - */ -export async function updateShopUserReferee(data: ShopUserReferee) { - const res = await request.put>( - '/shop/shop-user-referee', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除用户推荐关系表 - */ -export async function removeShopUserReferee(id?: number) { - const res = await request.del>( - '/shop/shop-user-referee/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除用户推荐关系表 - */ -export async function removeBatchShopUserReferee(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-user-referee/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询用户推荐关系表 - */ -export async function getShopUserReferee(id: number) { - const res = await request.get>( - '/shop/shop-user-referee/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/shop/shopUserReferee/model/index.ts b/src_bak/api/shop/shopUserReferee/model/index.ts deleted file mode 100644 index 910692c..0000000 --- a/src_bak/api/shop/shopUserReferee/model/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 用户推荐关系表 - */ -export interface ShopUserReferee { - // 主键ID - id?: number; - // 推荐人ID - dealerId?: number; - // 用户id(被推荐人) - userId?: number; - // 推荐关系层级(1,2,3) - level?: number; - // 备注 - comments?: string; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; -} - -/** - * 用户推荐关系表搜索条件 - */ -export interface ShopUserRefereeParam extends PageParam { - id?: number; - keywords?: string; -} diff --git a/src_bak/api/shop/shopWithdrawRecord.ts b/src_bak/api/shop/shopWithdrawRecord.ts deleted file mode 100644 index 0426731..0000000 --- a/src_bak/api/shop/shopWithdrawRecord.ts +++ /dev/null @@ -1,50 +0,0 @@ -import request from '@/utils/request'; - -/** - * 获取我的提现记录 - */ -export function getMyWithdrawList(params: any) { - return request.get('/shop/shop-withdraw-record/my/list', params); -} - -/** - * 获取提现统计 - */ -export function getWithdrawStats() { - return request.get('/shop/shop-withdraw-record/my/stats'); -} - -/** - * 获取提现配置 - */ -export function getWithdrawConfig() { - return request.get('/shop/shop-withdraw-record/config'); -} - -/** - * 申请提现 - */ -export function applyWithdraw(data: any) { - return request.post('/shop/shop-withdraw-record/apply', data); -} - -/** - * 获取提现记录列表(管理员) - */ -export function getWithdrawList(params: any) { - return request.get('/shop/shop-withdraw-record/page', params); -} - -/** - * 审核提现申请 - */ -export function auditWithdraw(id: number, data: any) { - return request.post(`/shop/shop-withdraw-record/audit/${id}`, data); -} - -/** - * 确认打款 - */ -export function confirmTransfer(id: number, data: any) { - return request.post(`/shop/shop-withdraw-record/transfer/${id}`, data); -} diff --git a/src_bak/api/system/access-key/index.ts b/src_bak/api/system/access-key/index.ts deleted file mode 100644 index a2863a3..0000000 --- a/src_bak/api/system/access-key/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { AccessKey, AccessKeyParam } from './model'; -import { PageResult } from '@/api/index'; -import {SERVER_API_URL} from "@/utils/server"; -/** - * 查询AccessKey列表 - */ -export async function pageAccessKey(params: AccessKeyParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/access-key/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加AccessKey - */ -export async function addAccessKey(data: AccessKey) { - const res = await request.post>( - SERVER_API_URL + '/system/access-key', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改AccessKey - */ -export async function updateAccessKey(data: AccessKey) { - const res = await request.put>( - SERVER_API_URL + '/system/access-key', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除AccessKey - */ -export async function removeAccessKey(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/access-key/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/access-key/model/index.ts b/src_bak/api/system/access-key/model/index.ts deleted file mode 100644 index 376b577..0000000 --- a/src_bak/api/system/access-key/model/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * 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/src_bak/api/system/appstore/index.ts b/src_bak/api/system/appstore/index.ts deleted file mode 100644 index 4acad48..0000000 --- a/src_bak/api/system/appstore/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// 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/src_bak/api/system/appstore/model/index.ts b/src_bak/api/system/appstore/model/index.ts deleted file mode 100644 index c3c9c45..0000000 --- a/src_bak/api/system/appstore/model/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * 消息 - */ -export interface Appstore { - // 消息id - id?: number; - // 标题 - title?: string; - // 时间 - time?: string; - // 状态 - status?: number; -} diff --git a/src_bak/api/system/cache/index.ts b/src_bak/api/system/cache/index.ts deleted file mode 100644 index 0fd5813..0000000 --- a/src_bak/api/system/cache/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { Cache, CacheParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 查询缓存数据 - */ -export async function listCache(params?: CacheParam) { - const res = await request.get>( - SERVER_API_URL + '/system/cache', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取缓存数据 - * @param key - */ -export async function getCache(key: string) { - const res = await request.get>( - SERVER_API_URL + '/system/cache/' + key - ); - if (res.code === 0) { - return res.data; - } -} - -/** - * 更新缓存数据 - * @param cache - */ -export async function updateCache(cache: Cache) { - const res = await request.post>( - SERVER_API_URL + '/system/cache', - cache - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除缓存数据 - * @param key - */ -export async function removeCache(key?: string) { - const res = await request.del>( - SERVER_API_URL + '/system/cache/' + key - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 更新缓存数据 - * @param cache - */ -export async function updateCacheTheme(cache: Cache) { - const res = await request.post>( - SERVER_API_URL + '/system/cache/theme', - cache - ); - if (res.code === 0) { - return res.message; - } -} diff --git a/src_bak/api/system/cache/model/index.ts b/src_bak/api/system/cache/model/index.ts deleted file mode 100644 index dc28d00..0000000 --- a/src_bak/api/system/cache/model/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -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/src_bak/api/system/chat/index.ts b/src_bak/api/system/chat/index.ts deleted file mode 100644 index e7b9e79..0000000 --- a/src_bak/api/system/chat/index.ts +++ /dev/null @@ -1,157 +0,0 @@ -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 "@/utils/server"; - -/** - * 查询聊天列表 - */ -export async function pageChatConversation(params: ChatConversationParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/chat-conversation/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询聊天列表 - */ -export async function pageChatMessage(params: ChatMessageParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/chat-message/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} -/** - * 查询日志列表 - */ -export async function listChatConversation(params?: ChatConversationParam) { - const res = await request.get>( - SERVER_API_URL + '/system/chat-conversation', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加日志 - */ -export async function addChatMessage(data: ChatMessage) { - const res = await request.post>( - SERVER_API_URL + '/system/chat-message', - data - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加日志 - */ -export async function addChatConversation(data: ChatConversation) { - const res = await request.post>( - SERVER_API_URL + '/system/chat-conversation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改日志 - */ -export async function updateChatConversation(data: any) { - const res = await request.put>( - SERVER_API_URL + '/system/chat-conversation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 绑定日志 - */ -export async function bindChatConversation(data: ChatConversation) { - const res = await request.put>( - SERVER_API_URL + '/system/chat-conversation/bind', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量添加 - */ -export async function addBatchChatConversation(data: ChatConversation[]) { - const res = await request.post>( - SERVER_API_URL + '/system/chat-conversation/batch', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除日志 - */ -export async function removeChatConversation(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/chat-conversation/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除日志 - */ -export async function removeBatchChatConversation( - data: (number | undefined)[] -) { - const res = await request.del>( - SERVER_API_URL + '/system/chat-conversation/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/chat/model/index.ts b/src_bak/api/system/chat/model/index.ts deleted file mode 100644 index 5ead20e..0000000 --- a/src_bak/api/system/chat/model/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -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/src_bak/api/system/chatConversation/index.ts b/src_bak/api/system/chatConversation/index.ts deleted file mode 100644 index 2b75eec..0000000 --- a/src_bak/api/system/chatConversation/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ChatConversation, ChatConversationParam } from './model'; - - -/** - * 分页查询聊天消息表 - */ -export async function pageChatConversation(params: ChatConversationParam) { - const res = await request.get>>( - '/shop/chat-conversation/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询聊天消息表列表 - */ -export async function listChatConversation(params?: ChatConversationParam) { - const res = await request.get>( - '/shop/chat-conversation', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加聊天消息表 - */ -export async function addChatConversation(data: ChatConversation) { - const res = await request.post>( - '/shop/chat-conversation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改聊天消息表 - */ -export async function updateChatConversation(data: ChatConversation) { - const res = await request.put>( - '/shop/chat-conversation', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除聊天消息表 - */ -export async function removeChatConversation(id?: number) { - const res = await request.del>( - '/shop/chat-conversation/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除聊天消息表 - */ -export async function removeBatchChatConversation(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/chat-conversation/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询聊天消息表 - */ -export async function getChatConversation(id: number) { - const res = await request.get>( - '/shop/chat-conversation/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/chatConversation/model/index.ts b/src_bak/api/system/chatConversation/model/index.ts deleted file mode 100644 index 110806d..0000000 --- a/src_bak/api/system/chatConversation/model/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -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/src_bak/api/system/chatMessage/index.ts b/src_bak/api/system/chatMessage/index.ts deleted file mode 100644 index 5526ebf..0000000 --- a/src_bak/api/system/chatMessage/index.ts +++ /dev/null @@ -1,120 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { ChatMessage, ChatMessageParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询聊天消息表 - */ -export async function pageChatMessage(params: ChatMessageParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/chat-message/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询聊天消息表列表 - */ -export async function listChatMessage(params?: ChatMessageParam) { - const res = await request.get>( - SERVER_API_URL + '/system/chat-message', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加聊天消息表 - */ -export async function addChatMessage(data: ChatMessage) { - const res = await request.post>( - SERVER_API_URL + '/system/chat-message', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加聊天消息表 - */ -export async function addBatchChatMessage(data: ChatMessage[]) { - const res = await request.post>( - SERVER_API_URL + '/system/chat-message/batch', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改聊天消息表 - */ -export async function updateChatMessage(data: ChatMessage) { - const res = await request.put>( - SERVER_API_URL + '/system/chat-message', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除聊天消息表 - */ -export async function removeChatMessage(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/chat-message/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除聊天消息表 - */ -export async function removeBatchChatMessage(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/chat-message/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询聊天消息表 - */ -export async function getChatMessage(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/chat-message/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/chatMessage/model/index.ts b/src_bak/api/system/chatMessage/model/index.ts deleted file mode 100644 index 4352a3f..0000000 --- a/src_bak/api/system/chatMessage/model/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -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/src_bak/api/system/company/index.ts b/src_bak/api/system/company/index.ts deleted file mode 100644 index 56738c2..0000000 --- a/src_bak/api/system/company/index.ts +++ /dev/null @@ -1,161 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { Company, CompanyParam } from './model'; -import { PageResult } from '@/api/index'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 查询企业资料 - */ -export async function getCompany(params?: CompanyParam) { - const res = await request.get>( - SERVER_API_URL + '/system/company/profile', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询企业资料不限租户 - */ -export async function getCompanyAll(companyId: number) { - const res = await request.get>( - SERVER_API_URL + '/system/company/profileAll/' + companyId - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询Company列表 - */ -export async function pageCompany(params: CompanyParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/company/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询Company列表不限租户 - */ -export async function pageCompanyAll(params: CompanyParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/company/pageAll', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加Company - */ -export async function addCompany(data: Company) { - const res = await request.post>( - SERVER_API_URL + '/system/company', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改Company - */ -export async function updateCompany(data: Company) { - const res = await request.put>( - SERVER_API_URL + '/system/company', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改CompanyAll - */ -export async function updateCompanyAll(data: Company) { - const res = await request.put>( - SERVER_API_URL + '/system/company/updateCompanyAll', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除Company - */ -export async function removeCompany(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 销毁租户 -export async function destructionTenant(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company/destruction/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除Company - */ -export async function removeBatchCompany(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/company/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/company/model/index.ts b/src_bak/api/system/company/model/index.ts deleted file mode 100644 index c804858..0000000 --- a/src_bak/api/system/company/model/index.ts +++ /dev/null @@ -1,120 +0,0 @@ -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; - 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; - 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/src_bak/api/system/companyComment/index.ts b/src_bak/api/system/companyComment/index.ts deleted file mode 100644 index 5b2cf41..0000000 --- a/src_bak/api/system/companyComment/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type {ApiResult, PageResult} from '@/api'; -import type {CompanyComment, CompanyCommentParam} from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询应用评论 - */ -export async function pageCompanyComment(params: CompanyCommentParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/company-comment/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用评论列表 - */ -export async function listCompanyComment(params?: CompanyCommentParam) { - const res = await request.get>( - SERVER_API_URL + '/system/company-comment', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用评论 - */ -export async function addCompanyComment(data: CompanyComment) { - const res = await request.post>( - SERVER_API_URL + '/system/company-comment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用评论 - */ -export async function updateCompanyComment(data: CompanyComment) { - const res = await request.put>( - SERVER_API_URL + '/system/company-comment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用评论 - */ -export async function removeCompanyComment(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company-comment/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用评论 - */ -export async function removeBatchCompanyComment(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/company-comment/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用评论 - */ -export async function getCompanyComment(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/company-comment/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/companyComment/model/index.ts b/src_bak/api/system/companyComment/model/index.ts deleted file mode 100644 index 45d4b6c..0000000 --- a/src_bak/api/system/companyComment/model/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -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/src_bak/api/system/companyContent/index.ts b/src_bak/api/system/companyContent/index.ts deleted file mode 100644 index adaf3cb..0000000 --- a/src_bak/api/system/companyContent/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CompanyContent, CompanyContentParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询应用详情 - */ -export async function pageCompanyContent(params: CompanyContentParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/company-content/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用详情列表 - */ -export async function listCompanyContent(params?: CompanyContentParam) { - const res = await request.get>( - SERVER_API_URL + '/system/company-content', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用详情 - */ -export async function addCompanyContent(data: CompanyContent) { - const res = await request.post>( - SERVER_API_URL + '/system/company-content', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用详情 - */ -export async function updateCompanyContent(data: CompanyContent) { - const res = await request.put>( - SERVER_API_URL + '/system/company-content', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用详情 - */ -export async function removeCompanyContent(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company-content/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用详情 - */ -export async function removeBatchCompanyContent(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/company-content/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用详情 - */ -export async function getCompanyContent(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/company-content/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/companyContent/model/index.ts b/src_bak/api/system/companyContent/model/index.ts deleted file mode 100644 index 226f513..0000000 --- a/src_bak/api/system/companyContent/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -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/src_bak/api/system/companyGit/index.ts b/src_bak/api/system/companyGit/index.ts deleted file mode 100644 index ab05987..0000000 --- a/src_bak/api/system/companyGit/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -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.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询代码仓库列表 - */ -export async function listCompanyGit(params?: CompanyGitParam) { - const res = await request.get>( - SERVER_API_URL + '/system/company-git', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加代码仓库 - */ -export async function addCompanyGit(data: CompanyGit) { - const res = await request.post>( - SERVER_API_URL + '/system/company-git', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改代码仓库 - */ -export async function updateCompanyGit(data: CompanyGit) { - const res = await request.put>( - SERVER_API_URL + '/system/company-git', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除代码仓库 - */ -export async function removeCompanyGit(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company-git/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除代码仓库 - */ -export async function removeBatchCompanyGit(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/company-git/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询代码仓库 - */ -export async function getCompanyGit(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/company-git/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/companyGit/model/index.ts b/src_bak/api/system/companyGit/model/index.ts deleted file mode 100644 index 901a7cd..0000000 --- a/src_bak/api/system/companyGit/model/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -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/src_bak/api/system/companyParameter/index.ts b/src_bak/api/system/companyParameter/index.ts deleted file mode 100644 index a981a35..0000000 --- a/src_bak/api/system/companyParameter/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CompanyParameter, CompanyParameterParam } from './model'; -import {SERVER_API_URL} from '@/utils/server'; - -/** - * 分页查询应用参数 - */ -export async function pageCompanyParameter(params: CompanyParameterParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/company-parameter/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用参数列表 - */ -export async function listCompanyParameter(params?: CompanyParameterParam) { - const res = await request.get>( - SERVER_API_URL + '/system/company-parameter', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用参数 - */ -export async function addCompanyParameter(data: CompanyParameter) { - const res = await request.post>( - SERVER_API_URL + '/system/company-parameter', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用参数 - */ -export async function updateCompanyParameter(data: CompanyParameter) { - const res = await request.put>( - SERVER_API_URL + '/system/company-parameter', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用参数 - */ -export async function removeCompanyParameter(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company-parameter/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用参数 - */ -export async function removeBatchCompanyParameter(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/company-parameter/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用参数 - */ -export async function getCompanyParameter(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/company-parameter/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/companyParameter/model/index.ts b/src_bak/api/system/companyParameter/model/index.ts deleted file mode 100644 index bf608d8..0000000 --- a/src_bak/api/system/companyParameter/model/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -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/src_bak/api/system/companyUrl/index.ts b/src_bak/api/system/companyUrl/index.ts deleted file mode 100644 index 3b74b53..0000000 --- a/src_bak/api/system/companyUrl/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { CompanyUrl, CompanyUrlParam } from './model'; -import {SERVER_API_URL} from '@/utils/server'; - -/** - * 分页查询应用域名 - */ -export async function pageCompanyUrl(params: CompanyUrlParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/company-url/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用域名列表 - */ -export async function listCompanyUrl(params?: CompanyUrlParam) { - const res = await request.get>( - SERVER_API_URL + '/system/company-url', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用域名 - */ -export async function addCompanyUrl(data: CompanyUrl) { - const res = await request.post>( - SERVER_API_URL + '/system/company-url', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用域名 - */ -export async function updateCompanyUrl(data: CompanyUrl) { - const res = await request.put>( - SERVER_API_URL + '/system/company-url', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用域名 - */ -export async function removeCompanyUrl(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/company-url/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用域名 - */ -export async function removeBatchCompanyUrl(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/company-url/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用域名 - */ -export async function getCompanyUrl(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/company-url/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/companyUrl/model/index.ts b/src_bak/api/system/companyUrl/model/index.ts deleted file mode 100644 index ddccc6b..0000000 --- a/src_bak/api/system/companyUrl/model/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 应用域名 - */ -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/src_bak/api/system/dict-data/index.ts b/src_bak/api/system/dict-data/index.ts deleted file mode 100644 index b8c9e26..0000000 --- a/src_bak/api/system/dict-data/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { DictData, DictDataParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询字典数据 - */ -export async function pageDictData(params: DictDataParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/dict-data/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询字典数据列表 - */ -export async function listDictData(params: DictDataParam) { - const res = await request.get>( - SERVER_API_URL + '/system/dict-data', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加字典数据 - */ -export async function addDictData(data: DictData) { - const res = await request.post>( - SERVER_API_URL + '/system/dict-data', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改字典数据 - */ -export async function updateDictData(data: DictData) { - const res = await request.put>( - SERVER_API_URL + '/system/dict-data', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除字典数据 - */ -export async function removeDictData(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/dict-data/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除字典数据 - */ -export async function removeDictDataBatch(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/dict-data/batch', - { data } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/dict-data/model/index.ts b/src_bak/api/system/dict-data/model/index.ts deleted file mode 100644 index b39b71c..0000000 --- a/src_bak/api/system/dict-data/model/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { PageParam } from '@/api/index'; - -/** - * 字典数据 - */ -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?: string; - text?: string; -} - -/** - * 字典数据搜索条件 - */ -export interface DictDataParam extends PageParam { - // 关键字 - keywords?: string; - // 字典标识 - dictCode?: string; - // 字典id - dictId?: number; - // - value?: number; - // - label?: string; - dictDataId?: number; -} diff --git a/src_bak/api/system/dict/index.ts b/src_bak/api/system/dict/index.ts deleted file mode 100644 index 0076c39..0000000 --- a/src_bak/api/system/dict/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { Dict, DictParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 查询字典列表 - */ -export async function listDictionaries(params?: DictParam) { - const res = await request.get>( - SERVER_API_URL + '/system/dict', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加字典 - */ -export async function addDict(data: Dict) { - const res = await request.post>( - SERVER_API_URL + '/system/dict', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改字典 - */ -export async function updateDict(data: Dict) { - const res = await request.put>( - SERVER_API_URL + '/system/dict', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除字典 - */ -export async function removeDict(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/dict/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/dict/model/index.ts b/src_bak/api/system/dict/model/index.ts deleted file mode 100644 index 575cb35..0000000 --- a/src_bak/api/system/dict/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * 字典 - */ -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/src_bak/api/system/dictionary-data/index.ts b/src_bak/api/system/dictionary-data/index.ts deleted file mode 100644 index a72b89f..0000000 --- a/src_bak/api/system/dictionary-data/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { DictionaryData, DictionaryDataParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询字典数据 - */ -export async function pageDictionaryData(params: DictionaryDataParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/dict-data/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询字典数据列表 - */ -export async function listDictionaryData(params: DictionaryDataParam) { - const res = await request.get>( - SERVER_API_URL + '/system/dict-data', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加字典数据 - */ -export async function addDictionaryData(data: DictionaryData) { - const res = await request.post>( - SERVER_API_URL + '/system/dict-data', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改字典数据 - */ -export async function updateDictionaryData(data: DictionaryData) { - const res = await request.put>( - SERVER_API_URL + '/system/dict-data', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除字典数据 - */ -export async function removeDictionaryData(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/dict-data/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除字典数据 - */ -export async function removeDictionaryDataBatch(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/dict-data/batch', - { data } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/dictionary-data/model/index.ts b/src_bak/api/system/dictionary-data/model/index.ts deleted file mode 100644 index e1301bd..0000000 --- a/src_bak/api/system/dictionary-data/model/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -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/src_bak/api/system/dictionary/index.ts b/src_bak/api/system/dictionary/index.ts deleted file mode 100644 index 6fb9aa4..0000000 --- a/src_bak/api/system/dictionary/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { Dictionary, DictionaryParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 查询字典列表 - */ -export async function listDictionaries(params?: DictionaryParam) { - const res = await request.get>( - SERVER_API_URL + '/system/dictionary', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加字典 - */ -export async function addDictionary(data: Dictionary) { - const res = await request.post>( - SERVER_API_URL + '/system/dictionary', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改字典 - */ -export async function updateDictionary(data: Dictionary) { - const res = await request.put>( - SERVER_API_URL + '/system/dictionary', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除字典 - */ -export async function removeDictionary(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/dictionary/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/dictionary/model/index.ts b/src_bak/api/system/dictionary/model/index.ts deleted file mode 100644 index d72e7c2..0000000 --- a/src_bak/api/system/dictionary/model/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * 字典 - */ -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/src_bak/api/system/environment/index.ts b/src_bak/api/system/environment/index.ts deleted file mode 100644 index e7a2919..0000000 --- a/src_bak/api/system/environment/index.ts +++ /dev/null @@ -1,125 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Environment, EnvironmentParam } from './model/index'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询应用 - */ -export async function pageEnvironment(params?: EnvironmentParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/environment/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用列表 - */ -export async function listEnvironment(params?: EnvironmentParam) { - const res = await request.get>( - SERVER_API_URL + '/system/environment', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用 - */ -export async function getEnvironment(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/environment/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用 - */ -export async function updateEnvironment(data: Environment) { - const res = await request.put>( - SERVER_API_URL + '/system/environment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 排行榜 -export async function ranking(params?: EnvironmentParam) { - const res = await request.get>( - SERVER_API_URL + '/system/environment/ranking', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 搜索历史 -export async function searchHistory(params?: string) { - const res = await request.get>( - SERVER_API_URL + '/system/environment/search-history', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 制作插件 - */ -export async function createEnvironment(data: Environment) { - const res = await request.post>( - SERVER_API_URL + '/system/environment/environment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/environment/model/index.ts b/src_bak/api/system/environment/model/index.ts deleted file mode 100644 index daa916b..0000000 --- a/src_bak/api/system/environment/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -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/src_bak/api/system/file/index.ts b/src_bak/api/system/file/index.ts deleted file mode 100644 index b392097..0000000 --- a/src_bak/api/system/file/index.ts +++ /dev/null @@ -1,99 +0,0 @@ -import request from '@/utils/request'; -import Taro from '@tarojs/taro' -import dayjs from 'dayjs'; -import crypto from 'crypto-js'; -import {Base64} from 'js-base64'; -import {FileRecord} from "@/api/system/file/model"; -import {TenantId} from "@/config/app"; - -export async function uploadOssByPath(filePath: string) { - return new Promise(async (resolve) => { - const date = new Date(); - date.setMinutes(date.getMinutes() + 1); - const policyText = { - expiration: date.toISOString(), // 设置policy过期时间。 - conditions: [ - // 限制上传大小。 - ["content-length-range", 0, 1024 * 1024 * 1024], - ], - }; - let sts = Taro.getStorageSync('sts'); - const stsExpired = Taro.getStorageSync('stsExpiredAt'); - if (!sts || (stsExpired && dayjs().isBefore(dayjs(stsExpired)))) { - // @ts-ignore - const {data: {data: {credentials}}} = await request.get(`https://shop-api.websoft.top/api/oss/getSTSToken`) - Taro.setStorageSync('sts', credentials) - Taro.setStorageSync('stsExpiredAt', credentials.expiration) - sts = credentials - } - - const [filename, ext] = filePath.split('.') - const key = `headers/${filename + (Math.random() * 100000)}.${ext}` - const policy = Base64.encode(JSON.stringify(policyText)) - const signature = computeSignature(sts.accessKeySecret, policy) - Taro.uploadFile({ - url: 'https://oss.wsdns.cn', - name: 'file', - filePath, - formData: { - key, - policy, - OSSAccessKeyId: sts.accessKeyId, - signature, - 'x-oss-security-token': sts.securityToken - }, - success: () => { - resolve(`https://oss.wsdns.cn/${key}`) - } - }) - }) -} - -const computeSignature = (accessKeySecret: string, canonicalString: string): string => { - return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret)); -} - -/** - * 上传阿里云OSS - */ -export async function uploadFile() { - return new Promise(async (resolve: (result: FileRecord) => void, reject) => { - Taro.chooseImage({ - count: 1, - sizeType: ['compressed'], - sourceType: ['album', 'camera'], - success: async (res) => { - const tempFilePath = res.tempFilePaths[0]; - // 上传图片到OSS - Taro.uploadFile({ - url: 'https://shop-api.websoft.top/api/oss/upload', - filePath: tempFilePath, - name: 'file', - header: { - 'content-type': 'application/json', - TenantId - }, - success: (res) => { - try { - const data = JSON.parse(res.data); - if (data.code === 0) { - resolve(data.data) - } else { - reject(new Error(data.message || '上传失败')) - } - } catch (error) { - reject(new Error('解析响应数据失败')) - } - }, - fail: (err) => { - reject(new Error('上传请求失败')) - } - }) - }, - fail: (err) => { - reject(new Error('选择图片失败')) - } - }); - }) - -} diff --git a/src_bak/api/system/file/model/index.ts b/src_bak/api/system/file/model/index.ts deleted file mode 100644 index 95d276d..0000000 --- a/src_bak/api/system/file/model/index.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { PageParam } from '@/api/index'; - -/** - * 文件上传记录 - */ -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/src_bak/api/system/login-record/index.ts b/src_bak/api/system/login-record/index.ts deleted file mode 100644 index 613363d..0000000 --- a/src_bak/api/system/login-record/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { LoginRecord, LoginRecordParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询登录日志 - */ -export async function pageLoginRecords(params: LoginRecordParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/login-record/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询登录日志列表 - */ -export async function listLoginRecords(params?: LoginRecordParam) { - const res = await request.get>( - SERVER_API_URL + '/system/login-record', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/login-record/model/index.ts b/src_bak/api/system/login-record/model/index.ts deleted file mode 100644 index 0836eb5..0000000 --- a/src_bak/api/system/login-record/model/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -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/src_bak/api/system/menu/index.ts b/src_bak/api/system/menu/index.ts deleted file mode 100644 index 2e1e8bc..0000000 --- a/src_bak/api/system/menu/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { Menu, MenuParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 查询菜单列表 - */ -export async function listMenus(params: MenuParam) { - const res = await request.get>( - SERVER_API_URL + '/system/menu', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加菜单 - */ -export async function addMenu(data: Menu) { - const res = await request.post>( - SERVER_API_URL + '/system/menu', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改菜单 - */ -export async function updateMenu(data: Menu) { - const res = await request.put>( - SERVER_API_URL + '/system/menu', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除菜单 - */ -export async function removeMenu(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/menu/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 菜单克隆 -export async function clone(data: Menu) { - const res = await request.post>( - SERVER_API_URL + '/system/menu/clone', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 制作插件 - */ -export async function createPlug(data: Menu) { - const res = await request.post>( - SERVER_API_URL + '/system/menu/plug', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 安装插件 -export async function installPlug(id?: number) { - const res = await request.get>( - SERVER_API_URL + '/system/menu/install/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/menu/model/index.ts b/src_bak/api/system/menu/model/index.ts deleted file mode 100644 index 4b52e95..0000000 --- a/src_bak/api/system/menu/model/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * 菜单 - */ -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/src_bak/api/system/modules/index.ts b/src_bak/api/system/modules/index.ts deleted file mode 100644 index f121b92..0000000 --- a/src_bak/api/system/modules/index.ts +++ /dev/null @@ -1,118 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Modules, ModulesParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询角色module - */ -export async function pageModules(params) { - const res = await request.get>>( - SERVER_API_URL + '/system/modules/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询角色列表 - */ -export async function listModules(params?: ModulesParam) { - const res = await request.get>( - SERVER_API_URL + '/system/modules', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加角色 - */ -export async function addModules(data: Modules) { - const res = await request.post>( - SERVER_API_URL + '/system/modules', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改角色 - */ -export async function updateModules(data: Modules) { - const res = await request.put>( - SERVER_API_URL + '/system/modules', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除角色 - */ -export async function removeModules(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/modules/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除角色 - */ -export async function removeModulesBath(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/modules/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取角色分配的菜单 - */ -export async function listModulesMenus(modulesId?: number) { - const res = await request.get>( - SERVER_API_URL + '/system/modules-menu/' + modulesId - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改角色菜单 - */ -export async function updateModulesMenus(modulesId?: number, data?: number[]) { - const res = await request.put>( - SERVER_API_URL + '/system/modules-menu/' + modulesId, - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/modules/model/index.ts b/src_bak/api/system/modules/model/index.ts deleted file mode 100644 index a1cda9b..0000000 --- a/src_bak/api/system/modules/model/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -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/src_bak/api/system/operation-record/index.ts b/src_bak/api/system/operation-record/index.ts deleted file mode 100644 index 3a7ce76..0000000 --- a/src_bak/api/system/operation-record/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { OperationRecord, OperationRecordParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询操作日志 - */ -export async function pageOperationRecords(params: OperationRecordParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/operation-record/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询操作日志列表 - */ -export async function listOperationRecords(params?: OperationRecordParam) { - const res = await request.get>( - SERVER_API_URL + '/system/operation-record', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/operation-record/model/index.ts b/src_bak/api/system/operation-record/model/index.ts deleted file mode 100644 index fc1425e..0000000 --- a/src_bak/api/system/operation-record/model/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -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/src_bak/api/system/order/index.ts b/src_bak/api/system/order/index.ts deleted file mode 100644 index c0237d6..0000000 --- a/src_bak/api/system/order/index.ts +++ /dev/null @@ -1,105 +0,0 @@ -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>>( - '/system/order/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询订单列表 - */ -export async function listOrder(params?: OrderParam) { - const res = await request.get>( - '/system/order', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加订单 - */ -export async function addOrder(data: Order) { - const res = await request.post>( - '/system/order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改订单 - */ -export async function updateOrder(data: Order) { - const res = await request.put>( - '/system/order', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除订单 - */ -export async function removeOrder(id?: number) { - const res = await request.del>( - '/system/order/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除订单 - */ -export async function removeBatchOrder(data: (number | undefined)[]) { - const res = await request.del>( - '/system/order/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询订单 - */ -export async function getOrder(id: number) { - const res = await request.get>( - '/system/order/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/order/model/index.ts b/src_bak/api/system/order/model/index.ts deleted file mode 100644 index d403932..0000000 --- a/src_bak/api/system/order/model/index.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 订单 - */ -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/src_bak/api/system/orderGoods/index.ts b/src_bak/api/system/orderGoods/index.ts deleted file mode 100644 index e486800..0000000 --- a/src_bak/api/system/orderGoods/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { OrderGoods, OrderGoodsParam } from './model'; - -/** - * 分页查询订单商品 - */ -export async function pageOrderGoods(params: OrderGoodsParam) { - const res = await request.get>>( - '/shop/shop-goods/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询订单商品列表 - */ -export async function listOrderGoods(params?: OrderGoodsParam) { - const res = await request.get>( - '/shop/shop-goods', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加订单商品 - */ -export async function addOrderGoods(data: OrderGoods) { - const res = await request.post>( - '/shop/shop-goods', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改订单商品 - */ -export async function updateOrderGoods(data: OrderGoods) { - const res = await request.put>( - '/shop/shop-goods', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除订单商品 - */ -export async function removeOrderGoods(id?: number) { - const res = await request.del>( - '/shop/shop-goods/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除订单商品 - */ -export async function removeBatchOrderGoods(data: (number | undefined)[]) { - const res = await request.del>( - '/shop/shop-goods/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询订单商品 - */ -export async function getOrderGoods(id: number) { - const res = await request.get>( - '/shop/shop-goods/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量添加订单商品 - */ -export async function addBatchOrderGoods(data: OrderGoods[]) { - const res = await request.post>( - '/shop/shop-goods/batch', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/orderGoods/model/index.ts b/src_bak/api/system/orderGoods/model/index.ts deleted file mode 100644 index 948d932..0000000 --- a/src_bak/api/system/orderGoods/model/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 订单商品 - */ -export interface OrderGoods { - // 订单号 - id?: number; - // 订单类型,0商城 1应用插件 - type?: number; - // 订单ID - orderId?: number; - // 项目ID - itemId?: number; - // 商品ID - goodsId?: 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; - orderId?: number; // 添加 orderId 属性 - keywords?: string; -} diff --git a/src_bak/api/system/organization/index.ts b/src_bak/api/system/organization/index.ts deleted file mode 100644 index 4a1f4af..0000000 --- a/src_bak/api/system/organization/index.ts +++ /dev/null @@ -1,86 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Organization, OrganizationParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询机构 - */ -export async function pageOrganizations(params: OrganizationParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/organization/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询机构列表 - */ -export async function listOrganizations(params?: OrganizationParam) { - const res = await request.get>( - SERVER_API_URL + '/system/organization', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加机构 - */ -export async function addOrganization(data: Organization) { - const res = await request.post>( - SERVER_API_URL + '/system/organization', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改机构 - */ -export async function updateOrganization(data: Organization) { - const res = await request.put>( - SERVER_API_URL + '/system/organization', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除机构 - */ -export async function removeOrganization(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/organization/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询机构 - */ -export async function getOrganization(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/organization/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/organization/model/index.ts b/src_bak/api/system/organization/model/index.ts deleted file mode 100644 index 1f9deaa..0000000 --- a/src_bak/api/system/organization/model/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -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/src_bak/api/system/parameter/index.ts b/src_bak/api/system/parameter/index.ts deleted file mode 100644 index 52e206e..0000000 --- a/src_bak/api/system/parameter/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Parameter, ParameterParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询应用参数 - */ -export async function pageParameter(params: ParameterParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/parameter/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用参数列表 - */ -export async function listParameter(params?: ParameterParam) { - const res = await request.get>( - SERVER_API_URL + '/system/parameter', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用参数 - */ -export async function addParameter(data: Parameter) { - const res = await request.post>( - SERVER_API_URL + '/system/parameter', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用参数 - */ -export async function updateParameter(data: Parameter) { - const res = await request.put>( - SERVER_API_URL + '/system/parameter', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用参数 - */ -export async function removeParameter(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/parameter/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用参数 - */ -export async function removeBatchParameter(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/parameter/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用参数 - */ -export async function getParameter(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/parameter/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/parameter/model/index.ts b/src_bak/api/system/parameter/model/index.ts deleted file mode 100644 index ae3d159..0000000 --- a/src_bak/api/system/parameter/model/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -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/src_bak/api/system/payment/index.ts b/src_bak/api/system/payment/index.ts deleted file mode 100644 index 98fd2d4..0000000 --- a/src_bak/api/system/payment/index.ts +++ /dev/null @@ -1,144 +0,0 @@ -import request from '@/utils/request'; -import type {ApiResult, PageResult} from '@/api/index'; -import type {Payment, PaymentParam} from './model'; -import type {ShopOrder} from '@/api/shop/shopOrder/model'; - -/** - * 分页查询支付方式 - */ -export async function pagePayment(params: PaymentParam) { - const res = await request.get>>( - '/system/payment/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询支付方式列表 - */ -export async function listPayment(params?: PaymentParam) { - const res = await request.get>( - '/system/payment', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加支付方式 - */ -export async function addPayment(data: Payment) { - const res = await request.post>( - '/system/payment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改支付方式 - */ -export async function updatePayment(data: Payment) { - const res = await request.put>( - '/system/payment', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除支付方式 - */ -export async function removePayment(id?: number) { - const res = await request.del>( - '/system/payment/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除支付方式 - */ -export async function removeBatchPayment(data: (number | undefined)[]) { - const res = await request.del>( - '/system/payment/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询支付方式 - */ -export async function getPayment(id: number) { - const res = await request.get>( - '/system/payment/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 生成支付二维码(微信native) - */ -export async function getNativeCode(data: ShopOrder) { - const res = await request.post>( - '/system/wx-native-pay/codeUrl', - data - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 使用余额支付 - */ -export async function payByBalance(data: ShopOrder) { - const res = await request.post>( - '/system/payment/balancePay', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 选择支付方式 - */ -export async function selectPayment(params?: PaymentParam) { - const res = await request.get>( - '/system/payment/select', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/payment/model/index.ts b/src_bak/api/system/payment/model/index.ts deleted file mode 100644 index 6a4ecfe..0000000 --- a/src_bak/api/system/payment/model/index.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 支付方式 - */ -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/src_bak/api/system/plug/index.ts b/src_bak/api/system/plug/index.ts deleted file mode 100644 index 997736d..0000000 --- a/src_bak/api/system/plug/index.ts +++ /dev/null @@ -1,125 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Plug, PlugParam } from './model/index'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询应用 - */ -export async function pagePlug(params: PlugParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/plug/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用列表 - */ -export async function listPlug(params?: PlugParam) { - const res = await request.get>( - SERVER_API_URL + '/system/plug', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用 - */ -export async function getPlug(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/plug/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用 - */ -export async function updatePlug(data: Plug) { - const res = await request.put>( - SERVER_API_URL + '/system/plug', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 排行榜 -export async function ranking(params?: PlugParam) { - const res = await request.get>( - SERVER_API_URL + '/system/plug/ranking', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -// 搜索历史 -export async function searchHistory(params?: string) { - const res = await request.get>( - SERVER_API_URL + '/system/plug/search-history', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 制作插件 - */ -export async function createPlug(data: Plug) { - const res = await request.post>( - SERVER_API_URL + '/system/plug/plug', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/plug/model/index.ts b/src_bak/api/system/plug/model/index.ts deleted file mode 100644 index e67242f..0000000 --- a/src_bak/api/system/plug/model/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -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/src_bak/api/system/role/index.ts b/src_bak/api/system/role/index.ts deleted file mode 100644 index 9cadf52..0000000 --- a/src_bak/api/system/role/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -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 "@/utils/server"; - -/** - * 分页查询角色 - */ -export async function pageRoles(params: RoleParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/role/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询角色列表 - */ -export async function listRoles(params?: RoleParam) { - const res = await request.get>( - SERVER_API_URL + '/system/role', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加角色 - */ -export async function addRole(data: Role) { - const res = await request.post>( - SERVER_API_URL + '/system/role', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改角色 - */ -export async function updateRole(data: Role) { - const res = await request.put>( - SERVER_API_URL + '/system/role', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除角色 - */ -export async function removeRole(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/role/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除角色 - */ -export async function removeRoles(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/role/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取角色分配的菜单 - */ -export async function listRoleMenus(roleId?: number) { - const res = await request.get>( - SERVER_API_URL + '/system/role-menu/' + roleId - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改角色菜单 - */ -export async function updateRoleMenus(roleId?: number, data?: number[]) { - const res = await request.put>( - SERVER_API_URL + '/system/role-menu/' + roleId, - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/role/model/index.ts b/src_bak/api/system/role/model/index.ts deleted file mode 100644 index d4c9a50..0000000 --- a/src_bak/api/system/role/model/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -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/src_bak/api/system/setting/index.ts b/src_bak/api/system/setting/index.ts deleted file mode 100644 index 3719833..0000000 --- a/src_bak/api/system/setting/index.ts +++ /dev/null @@ -1,126 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Setting, SettingParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询设置 - */ -export async function pageSetting(params: SettingParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/setting/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询设置列表 - */ -export async function listSetting(params?: SettingParam) { - const res = await request.get>( - SERVER_API_URL + '/system/setting', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询 - */ -export async function getSetting(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/setting/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加设置 - */ -export async function addSetting(data: Setting) { - const res = await request.post>( - SERVER_API_URL + '/system/setting', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改设置 - */ -export async function updateSetting(data: Setting) { - const res = await request.put>( - SERVER_API_URL + '/system/setting', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除设置 - */ -export async function removeSetting(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/setting/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除设置 - */ -export async function removeBatchSetting(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/setting/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/setting/model/index.ts b/src_bak/api/system/setting/model/index.ts deleted file mode 100644 index 879a9e9..0000000 --- a/src_bak/api/system/setting/model/index.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 系统设置 - */ -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/src_bak/api/system/tenant/index.ts b/src_bak/api/system/tenant/index.ts deleted file mode 100644 index 1d54bf4..0000000 --- a/src_bak/api/system/tenant/index.ts +++ /dev/null @@ -1,178 +0,0 @@ -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 "@/utils/server"; - -/** - * 分页查询租户 - */ -export async function pageTenant(params: TenantParam) { - // 租户列表查询需要传一个key - // params.tenantCode = 'ZAcxbdmDQFwUKC3e'; - const res = await request.get>>( - SERVER_API_URL + '/system/tenant/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询租户资料 - */ -export async function profile(params?: TenantParam) { - const res = await request.get>( - SERVER_API_URL + '/system/tenant/profile', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询租户列表 - */ -export async function listTenant(params?: TenantParam) { - const res = await request.get>( - SERVER_API_URL + '/system/tenant', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询 - */ -export async function getTenant(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/tenant/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加租户 - */ -export async function addTenant(data: Tenant) { - const res = await request.post>( - SERVER_API_URL + '/system/tenant', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改租户 - */ -export async function updateTenant(data: Tenant) { - const res = await request.put>( - SERVER_API_URL + '/system/tenant', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除租户 - */ -export async function removeTenant(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/tenant/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除租户 - */ -export async function removeBatchTenant(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/tenant/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 重置用户密码 - */ -export async function updateTenantPassword( - tenantId?: number, - password?: string -) { - const res = await request.put>( - SERVER_API_URL + '/system/tenant/password', - { - tenantId, - password - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 租户初始化 - */ -export async function initialization(roleId?: number) { - const res = await request.get>( - SERVER_API_URL + '/system/tenant/role-menu/' + roleId - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/tenant/model/index.ts b/src_bak/api/system/tenant/model/index.ts deleted file mode 100644 index de007b2..0000000 --- a/src_bak/api/system/tenant/model/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -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/src_bak/api/system/url/index.ts b/src_bak/api/system/url/index.ts deleted file mode 100644 index c1724ec..0000000 --- a/src_bak/api/system/url/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { Url, UrlParam } from './model'; -import {SERVER_API_URL} from '@/utils/server'; - -/** - * 分页查询应用域名 - */ -export async function pageUrl(params: UrlParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/url/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询应用域名列表 - */ -export async function listUrl(params?: UrlParam) { - const res = await request.get>( - SERVER_API_URL + '/system/url', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加应用域名 - */ -export async function addUrl(data: Url) { - const res = await request.post>( - SERVER_API_URL + '/system/url', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改应用域名 - */ -export async function updateUrl(data: Url) { - const res = await request.put>( - SERVER_API_URL + '/system/url', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除应用域名 - */ -export async function removeUrl(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/url/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除应用域名 - */ -export async function removeBatchUrl(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/url/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询应用域名 - */ -export async function getUrl(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/url/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/url/model/index.ts b/src_bak/api/system/url/model/index.ts deleted file mode 100644 index 1564067..0000000 --- a/src_bak/api/system/url/model/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 应用域名 - */ -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/src_bak/api/system/user-collection/index.ts b/src_bak/api/system/user-collection/index.ts deleted file mode 100644 index 1459927..0000000 --- a/src_bak/api/system/user-collection/index.ts +++ /dev/null @@ -1,106 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { UserCollection, UserCollectionParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询我的收藏 - */ -export async function pageUserCollection(params: UserCollectionParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/user-collection/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询我的收藏列表 - */ -export async function listUserCollection(params?: UserCollectionParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user-collection', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加我的收藏 - */ -export async function addUserCollection(data: UserCollection) { - const res = await request.post>( - SERVER_API_URL + '/system/user-collection', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改我的收藏 - */ -export async function updateUserCollection(data: UserCollection) { - const res = await request.put>( - SERVER_API_URL + '/system/user-collection', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除我的收藏 - */ -export async function removeUserCollection(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/user-collection/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除我的收藏 - */ -export async function removeBatchUserCollection(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/user-collection/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询我的收藏 - */ -export async function getUserCollection(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/user-collection/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/user-collection/model/index.ts b/src_bak/api/system/user-collection/model/index.ts deleted file mode 100644 index ebd88c9..0000000 --- a/src_bak/api/system/user-collection/model/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -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/src_bak/api/system/user-file/index.ts b/src_bak/api/system/user-file/index.ts deleted file mode 100644 index cff199a..0000000 --- a/src_bak/api/system/user-file/index.ts +++ /dev/null @@ -1,89 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { UserFile, UserFileParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询用户文件 - */ -export async function pageUserFiles(params: UserFileParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/user-file/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询用户文件列表 - */ -export async function listUserFiles(params: UserFileParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user-file', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加用户文件 - */ -export async function addUserFile(data: UserFile) { - const res = await request.post>( - SERVER_API_URL + '/system/user-file', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改用户文件 - */ -export async function updateUserFile(data: UserFile) { - const res = await request.put>( - SERVER_API_URL + '/system/user-file', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除用户文件 - */ -export async function removeUserFile(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/user-file/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除用户文件 - */ -export async function removeUserFiles(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/user-file/batch', - { data } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/user-file/model/index.ts b/src_bak/api/system/user-file/model/index.ts deleted file mode 100644 index ca51256..0000000 --- a/src_bak/api/system/user-file/model/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -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/src_bak/api/system/user-group/index.ts b/src_bak/api/system/user-group/index.ts deleted file mode 100644 index 004db57..0000000 --- a/src_bak/api/system/user-group/index.ts +++ /dev/null @@ -1,120 +0,0 @@ -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 "@/utils/server"; -/** - * 分页查询仓库 - */ -export async function pageGroup(params: GroupParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/user-group/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询仓库列表 - */ -export async function listGroup(params?: GroupParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user-group', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加仓库 - */ -export async function addGroup(data: Group) { - const res = await request.post>( - SERVER_API_URL + '/system/user-group', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改仓库 - */ -export async function updateGroup(data: Group) { - const res = await request.put>( - SERVER_API_URL + '/system/user-group', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 绑定仓库 - */ -export async function bindGroup(data: Group) { - const res = await request.put>( - SERVER_API_URL + '/system/user-group/bind', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量添加设备 - */ -export async function addBatchGroup(data: Group[]) { - const res = await request.post>( - SERVER_API_URL + '/system/user-group/batch', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除仓库 - */ -export async function removeGroup(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/user-group/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除仓库 - */ -export async function removeBatchGroup(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/user-group/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/user-group/model/index.ts b/src_bak/api/system/user-group/model/index.ts deleted file mode 100644 index dc858cb..0000000 --- a/src_bak/api/system/user-group/model/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -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/src_bak/api/system/user/balance-log/index.ts b/src_bak/api/system/user/balance-log/index.ts deleted file mode 100644 index e8c7a57..0000000 --- a/src_bak/api/system/user/balance-log/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { UserBalanceLog, UserBalanceLogParam } from './model' - -/** - * 分页查询用户余额日志 - */ -export async function pageUserBalanceLog(params?: UserBalanceLogParam): Promise> { - const res = await request.get>>( - '/shop/shop-user-balance-log/page', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 查询全部用户余额日志 - */ -export async function listUserBalanceLog(params?: UserBalanceLogParam): Promise { - const res = await request.get>( - '/shop/shop-user-balance-log', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/system/user/balance-log/model/index.ts b/src_bak/api/system/user/balance-log/model/index.ts deleted file mode 100644 index 29ea8db..0000000 --- a/src_bak/api/system/user/balance-log/model/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * 用户余额日志类型定义 - */ - -export interface UserBalanceLog { - logId: number - userId: number - scene: number - money: string - balance: string - orderNo: string - describe?: string - comments?: string - remark?: string - createTime: string -} - -export interface UserBalanceLogParam { - page?: number - limit?: number - userId?: number - scene?: number -} diff --git a/src_bak/api/system/user/balance.ts b/src_bak/api/system/user/balance.ts deleted file mode 100644 index 0d47240..0000000 --- a/src_bak/api/system/user/balance.ts +++ /dev/null @@ -1,23 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult } from '@/api' -import type { UserBalance } from './model' - -/** - * 获取当前用户余额信息(跨库读取 gxwebsoft_core.sys_user) - * 通过 paopao-api 本地 /auth/user-balance 接口,无需跨域请求 core 系统 - */ -export async function getUserBalance(): Promise { - const res = await request.get>( - '/auth/user-balance' - ) - if (res.code === 0 && res.data) { - const data = res.data - return { - balance: data.balance != null ? String(data.balance) : '0', - frozenBalance: '0', - totalIncome: '0', - totalExpense: '0', - } - } - return Promise.reject(new Error(res.message || '获取余额失败')) -} diff --git a/src_bak/api/system/user/index.ts b/src_bak/api/system/user/index.ts deleted file mode 100644 index 05a8e02..0000000 --- a/src_bak/api/system/user/index.ts +++ /dev/null @@ -1,261 +0,0 @@ -import request from '@/utils/request'; -import type {ApiResult, PageResult} from '@/api'; -import type {User, UserParam} from './model'; -import type { UserBalance } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -// 导出用户余额相关 -export * from './balance'; -export * from './balance-log'; -export * from './points'; -export * from './withdraw'; - -// 用户余额类型 -export type { UserBalance }; - -/** - * 分页查询用户 - */ -export async function pageUsers(params: UserParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/user/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询用户列表 - */ -export async function listUsers(params?: UserParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询用户列表 - */ -export async function getStaffs(params?: UserParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询用户列表 - */ -export async function getCompanyList(params?: UserParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询用户 - */ -export async function getUser(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/user/' + id, - {} - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加用户 - */ -export async function addUser(data: User) { - const res = await request.post>( - SERVER_API_URL + '/system/user', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改用户 - */ -export async function updateUser(data: User) { - const res = await request.put>( - SERVER_API_URL + '/system/user', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除用户 - */ -export async function removeUser(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/user/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除用户 - */ -export async function removeUsers(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/user/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改用户状态 - */ -export async function updateUserStatus(userId?: number, status?: number) { - const res = await request.put>( - SERVER_API_URL + '/system/user/status', - { - userId, - status - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改推荐状态 - */ -export async function updateUserRecommend(form:any) { - const res = await request.put>( - SERVER_API_URL + '/system/user/recommend', - form - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 重置用户密码 - */ -export async function updateUserPassword(userId?: number, password = '123456') { - const res = await request.put>( - SERVER_API_URL + '/system/user/password', - { - userId, - password - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 统计用户余额(使用 paopao-api) - */ -export async function countUserBalance(params?: UserParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user/countUserBalance', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - - -/** - * 选择管理员账号登录 - * @param params - */ -export async function listAdminsByPhoneAll(params?: UserParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user/listAdminsByPhoneAll', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/user/model/count.ts b/src_bak/api/system/user/model/count.ts deleted file mode 100644 index 3b0ef49..0000000 --- a/src_bak/api/system/user/model/count.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 用户 - */ -export interface Count { - balance?: string; -} - -/** - * 用户搜索条件 - */ -export interface UserParam extends PageParam { - organizationId?: number; -} diff --git a/src_bak/api/system/user/model/index.ts b/src_bak/api/system/user/model/index.ts deleted file mode 100644 index 378472b..0000000 --- a/src_bak/api/system/user/model/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * 用户余额类型定义 - */ - -export interface UserBalance { - balance: string - frozenBalance: string - totalIncome: string - totalExpense: string -} - -/** - * 用户信息(来自 core 系统 sys_user 表) - */ -export interface User { - userId?: number - id?: number - username?: string - realName?: string - nickname?: string - avatar?: string - phone?: string - mobile?: string - email?: string - gender?: number - balance?: string | number - points?: number - memberLevelId?: number - memberLevelName?: string - status?: number - createTime?: string - updateTime?: string - /** 扩展字段,兼容后端返回的额外属性 */ - [key: string]: unknown -} diff --git a/src_bak/api/system/user/points/index.ts b/src_bak/api/system/user/points/index.ts deleted file mode 100644 index 468a671..0000000 --- a/src_bak/api/system/user/points/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult, PageResult } from '@/api' -import type { UserPointsLog } from './model' - -/** - * 用户积分统计数据 - */ -export interface UserPointsInfo { - points: number // 当前积分 - totalEarned: number // 累计获得 - totalUsed: number // 累计使用 - expiringSoon: number // 即将过期 -} - -/** - * 获取用户积分信息(包含汇总统计) - */ -export async function getUserPointsInfo(): Promise { - const res = await request.get>( - '/user/points' - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} - -/** - * 分页查询用户积分日志 - */ -export async function pageUserPointsLog(params?: { - page?: number - limit?: number - type?: number -}): Promise> { - const res = await request.get>>( - '/shop/shop-user-points-log/page', - params - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/system/user/points/model/index.ts b/src_bak/api/system/user/points/model/index.ts deleted file mode 100644 index 8c2a809..0000000 --- a/src_bak/api/system/user/points/model/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * 用户积分类型定义 - */ - -export interface UserPointsLog { - logId: number - userId: number - points: number - type: number // 1-获得, 2-消费, 3-过期, 4-调整 - reason?: string - orderId?: number - createTime: string -} diff --git a/src_bak/api/system/user/withdraw/index.ts b/src_bak/api/system/user/withdraw/index.ts deleted file mode 100644 index 08d471c..0000000 --- a/src_bak/api/system/user/withdraw/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import request from '@/utils/request' -import type { ApiResult } from '@/api' -import type { UserWithdraw, WithdrawRequest } from './model' - -/** - * 创建用户提现申请 - * 注意:后端可能需要实现此接口 - */ -export async function createUserWithdraw(data: WithdrawRequest): Promise { - const res = await request.post>( - '/shop/shop-user-withdraw/create', - data - ) - if (res.code === 0 && res.data) { - return res.data - } - return Promise.reject(new Error(res.message)) -} diff --git a/src_bak/api/system/user/withdraw/model/index.ts b/src_bak/api/system/user/withdraw/model/index.ts deleted file mode 100644 index 29aa100..0000000 --- a/src_bak/api/system/user/withdraw/model/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * 用户提现类型定义 - */ - -export interface UserWithdraw { - id?: number - userId?: number - amount?: string - withdrawType?: number // 0-微信零钱, 1-银行卡, 2-支付宝 - accountInfo?: string - status?: number - createTime?: string -} - -export interface WithdrawRequest { - amount: string - withdrawType: number - accountInfo?: string -} diff --git a/src_bak/api/system/userRole/index.ts b/src_bak/api/system/userRole/index.ts deleted file mode 100644 index ecaefcc..0000000 --- a/src_bak/api/system/userRole/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult } from '@/api/index'; -import type { UserRole, UserRoleParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 查询用户角色 - */ -export async function listUserRole(params?: UserRoleParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user-role', - params - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改用户角色 - */ -export async function updateUserRole(data: UserRole) { - const res = await request.put>( - SERVER_API_URL + '/system/user-role', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 新增用户角色 - * 说明:部分后端实现为 POST 新增、PUT 修改;这里补齐 API 以便新用户无角色时可以创建默认角色。 - */ -export async function addUserRole(data: UserRole) { - const res = await request.post>( - SERVER_API_URL + '/system/user-role', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/userRole/model/index.ts b/src_bak/api/system/userRole/model/index.ts deleted file mode 100644 index 835bbae..0000000 --- a/src_bak/api/system/userRole/model/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 用户 - */ -export interface UserRole { - id?: number; - // 用户id - userId?: number; - // 角色ID - roleId?: number; - // 创建时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 角色名称 - roleName?: string; - // 角色标识 - roleCode?: string; - // 租户ID - tenantId?: number; -} - -/** - * 用户搜索条件 - */ -export interface UserRoleParam extends PageParam { - keywords?: any; - userId?: number; -} diff --git a/src_bak/api/system/userVerify/index.ts b/src_bak/api/system/userVerify/index.ts deleted file mode 100644 index 21416e7..0000000 --- a/src_bak/api/system/userVerify/index.ts +++ /dev/null @@ -1,130 +0,0 @@ -import request from '@/utils/request'; -import type {ApiResult, PageResult} from '@/api/index'; -import type {UserVerify, UserVerifyParam} from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -export async function myUserVerify(params: UserVerifyParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user-verify/myUserVerify', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 分页查询实名认证 - */ -export async function pageUserVerify(params: UserVerifyParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/user-verify/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询实名认证列表 - */ -export async function listUserVerify(params?: UserVerifyParam) { - const res = await request.get>( - SERVER_API_URL + '/system/user-verify', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加实名认证 - */ -export async function addUserVerify(data: UserVerify) { - const res = await request.post>( - SERVER_API_URL + '/system/user-verify', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改实名认证 - */ -export async function updateUserVerify(data: UserVerify) { - const res = await request.put>( - SERVER_API_URL + '/system/user-verify', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除实名认证 - */ -export async function removeUserVerify(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/user-verify/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除实名认证 - */ -export async function removeBatchUserVerify(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/user-verify/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询实名认证 - */ -export async function getUserVerify(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/user-verify/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 提交实名认证申请 - * @param data - */ -export async function submit(data: UserVerify) { - const res = await request.put>( - SERVER_API_URL + '/system/user-verify/submit', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/userVerify/model/index.ts b/src_bak/api/system/userVerify/model/index.ts deleted file mode 100644 index 2d52441..0000000 --- a/src_bak/api/system/userVerify/model/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { PageParam } from '@/api/index'; - -/** - * 实名认证 - */ -export interface UserVerify { - // 自增ID - id?: number; - // 用户ID - userId?: number; - // 认证类型, 0个人, 1企业 - type?: any; - // 主体名称 - name?: string; - // 真实姓名 - realName?: string; - // 手机号码 - phone?: string; - // 头像 - avatar?: string; - // 证件号码 - idCard?: string; - // 出生日期 - birthday?: string; - // 正面 - sfz1?: string; - // 反面 - sfz2?: string; - // 企业名称 - company?: string; - // 营业执照号码 - zzCode?: string; - // 营业执照 - zzImg?: string; - // 备注 - comments?: string; - // 状态, 0在线, 1离线 - status?: number; - // 是否删除, 0否, 1是 - deleted?: number; - // 租户id - tenantId?: number; - // 注册时间 - createTime?: string; - // 修改时间 - updateTime?: string; - // 状态名称 - statusText?: string; -} - -/** - * 实名认证搜索条件 - */ -export interface UserVerifyParam extends PageParam { - id?: number; - status?: number; - keywords?: string; -} diff --git a/src_bak/api/system/version/index.ts b/src_bak/api/system/version/index.ts deleted file mode 100644 index fdca9dc..0000000 --- a/src_bak/api/system/version/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -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 "@/utils/server"; - -/** - * 分页查询角色 - */ -export async function pageVersion(params: VersionParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/version/page', - params - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询角色列表 - */ -export async function listVersion(params?: VersionParam) { - const res = await request.get>( - SERVER_API_URL + '/system/version', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加角色 - */ -export async function addVersion(data: Version) { - const res = await request.post>( - SERVER_API_URL + '/system/version', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改角色 - */ -export async function updateVersion(data: Version) { - const res = await request.put>( - SERVER_API_URL + '/system/version', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除角色 - */ -export async function removeVersion(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/version/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除角色 - */ -export async function removeVersions(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/version/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 获取角色分配的菜单 - */ -export async function listVersionMenus(versionId?: number) { - const res = await request.get>( - SERVER_API_URL + '/system/version-menu/' + versionId - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改角色菜单 - */ -export async function updateVersionMenus(versionId?: number, data?: number[]) { - const res = await request.put>( - SERVER_API_URL + '/system/version-menu/' + versionId, - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/version/model/index.ts b/src_bak/api/system/version/model/index.ts deleted file mode 100644 index 8899e2f..0000000 --- a/src_bak/api/system/version/model/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -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/src_bak/api/system/white-domain/index.ts b/src_bak/api/system/white-domain/index.ts deleted file mode 100644 index fc68e9f..0000000 --- a/src_bak/api/system/white-domain/index.ts +++ /dev/null @@ -1,146 +0,0 @@ -import request from '@/utils/request'; -import type { ApiResult, PageResult } from '@/api'; -import type { WhiteDomain, WhiteDomainParam } from './model'; -import {SERVER_API_URL} from "@/utils/server"; - -/** - * 分页查询服务器白名单 - */ -export async function pageWhiteDomain(params: WhiteDomainParam) { - const res = await request.get>>( - SERVER_API_URL + '/system/white-domain/page', - { - params - } - ); - if (res.code === 0) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 查询服务器白名单列表 - */ -export async function listWhiteDomain(params?: WhiteDomainParam) { - const res = await request.get>( - SERVER_API_URL + '/system/white-domain', - { - params - } - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 添加服务器白名单 - */ -export async function addWhiteDomain(data: WhiteDomain) { - const res = await request.post>( - SERVER_API_URL + '/system/white-domain', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 修改服务器白名单 - */ -export async function updateWhiteDomain(data: WhiteDomain) { - const res = await request.put>( - SERVER_API_URL + '/system/white-domain', - data - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 删除服务器白名单 - */ -export async function removeWhiteDomain(id?: number) { - const res = await request.del>( - SERVER_API_URL + '/system/white-domain/' + id - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 批量删除服务器白名单 - */ -export async function removeBatchWhiteDomain(data: (number | undefined)[]) { - const res = await request.del>( - SERVER_API_URL + '/system/white-domain/batch', - { - data - } - ); - if (res.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} - -/** - * 根据id查询服务器白名单 - */ -export async function getWhiteDomain(id: number) { - const res = await request.get>( - SERVER_API_URL + '/system/white-domain/' + id - ); - if (res.code === 0 && res.data) { - return res.data; - } - return Promise.reject(new Error(res.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.code === 0) { - return res.message; - } - return Promise.reject(new Error(res.message)); -} diff --git a/src_bak/api/system/white-domain/model/index.ts b/src_bak/api/system/white-domain/model/index.ts deleted file mode 100644 index 8a231df..0000000 --- a/src_bak/api/system/white-domain/model/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -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/src_bak/app.config.ts b/src_bak/app.config.ts deleted file mode 100644 index da941a2..0000000 --- a/src_bak/app.config.ts +++ /dev/null @@ -1,168 +0,0 @@ -export default { - pages: [ - // TabBar 页面 - 'pages/index/index', - 'pages/shop/index', - 'pages/points/index', - 'pages/user/user', - // 认证页面 - 'passport/login', - 'passport/register', - 'passport/sms-login', - 'passport/forget', - 'passport/agreement', - 'passport/setting', - 'passport/qr-login/index', - 'passport/qr-confirm/index', - 'passport/unified-qr/index', - // 首页子页面 - 'pages/index/search', - 'pages/index/notification', - 'pages/index/article-detail', - 'pages/index/article-list', - 'pages/index/coupon-center/index', - // 商城子页面 - 'pages/shop/category', - 'pages/shop/product-detail', - 'pages/shop/cart', - 'pages/shop/checkout', - 'pages/shop/group-buy-list/index', - 'pages/shop/group-buy-detail/index', - 'pages/shop/seckill-list/index', - 'pages/shop/seckill-detail/index', - // 积分子页面 - 'pages/points/signin', - 'pages/points/product-detail', - 'pages/points/product-list/index', - 'pages/points/exchange/index', - 'pages/points/points-rules/index', - 'pages/order-list', - // 用户子页面 - 'pages/user/profile', - 'pages/user/wallet', - 'pages/user/recharge', - 'pages/user/recharge-record/index', - 'pages/user/withdraw/index', - 'pages/user/balance-log/index', - 'pages/user/coupon-list', - 'pages/user/points-record', - 'pages/user/address-list', - 'pages/user/address-edit', - 'pages/user/setting', - 'pages/user/shop-setting/index', - 'pages/user/member/index', - 'pages/user/member-upgrade/index', - 'pages/user/invite-subordinate/index', - 'pages/user/register-pay/index', - 'pages/user/promotion/index', - 'pages/user/commission/index', - // 'pages/user/withdraw-list/index', - 'pages/user/team/index', - 'pages/user/invite-record/index', - 'pages/user/favorite-list/index', - 'pages/user/history-list/index', - 'pages/user/help-center/index', - 'pages/user/help-detail/index', - 'pages/user/customer-service/index', - 'pages/user/redeem/index', - // 会员权益包页面 - 'pages/user/benefit-packages/index', - 'pages/user/benefit-exchange-confirm/index', - 'pages/user/benefit-exchange-list/index', - // 订单页面 - 'pages/order/list', - 'pages/order/detail', - 'pages/order/refund', - 'pages/order/refund-detail', - 'pages/order/after-sale-apply', - 'pages/order/after-sale-list', - 'pages/order/after-sale-detail', - 'pages/order/logistics', - 'pages/order/evaluate/index', - 'pages/order/evaluate-list/index', - 'pages/order/evaluate-detail/index', - // 门店页面 - 'pages/store/list/index', - 'pages/store/booking/index', - // 售后页面 - 'pages/after-sale/apply/index', - 'pages/after-sale/progress/index', - 'pages/after-sale/list/index', - // 活动页面 - 'pages/activity/list/index', - 'pages/activity/detail/index', - // 赛事报名页面 - 'pages/event/list/index', - 'pages/event/detail/index', - 'pages/event/register/index', - 'pages/event/my/index', - // 预约订单页面 - 'pages/booking/list/index', - 'pages/booking/detail/index', - 'pages/booking/reschedule/index', - // 消息页面 - 'pages/message/list/index', - 'pages/message/detail/index', - // 礼品卡页面 - 'pages/gift-card/purchase/index', - 'pages/gift-card/exchange/index', - 'pages/gift-card/balance/index', - // 发票页面 - 'pages/invoice/title/index', - 'pages/invoice/apply/index', - 'pages/invoice/records/index', - // 分享返利页面 - 'pages/share/index', - 'pages/rebate/records/index', - // 'pages/rebate/withdraw/index', - // 数据统计页面 - 'pages/statistics/dashboard/index', - 'pages/statistics/sales/index', - 'pages/statistics/users/index', - ], - window: { - backgroundTextStyle: 'light', - navigationBarBackgroundColor: '#fff', - navigationBarTitleText: 'Paopao Taro', - navigationBarTextStyle: 'black', - backgroundColor: '#f8f8f8', - }, - permission: { - 'scope.userLocation': { - desc: '用于获取您的位置,按距离展示附近门店和选择收货地址定位', - }, - }, - requiredPrivateInfos: ['getLocation', 'chooseLocation'], - tabBar: { - custom: false, - color: '#8a8a8a', - selectedColor: '#0e932e', - backgroundColor: '#ffffff', - list: [ - { - pagePath: 'pages/index/index', - iconPath: 'assets/tabbar/home.png', - selectedIconPath: 'assets/tabbar/home-active.png', - text: '首页', - }, - { - pagePath: 'pages/shop/index', - iconPath: 'assets/tabbar/category.png', - selectedIconPath: 'assets/tabbar/category-active.png', - text: '分类', - }, - { - pagePath: 'pages/order/list', - iconPath: 'assets/tabbar/order.png', - selectedIconPath: 'assets/tabbar/order-active.png', - text: '订单', - }, - { - pagePath: 'pages/user/user', - iconPath: 'assets/tabbar/user.png', - selectedIconPath: 'assets/tabbar/user-active.png', - text: '我的', - }, - ], - }, -} diff --git a/src_bak/app.scss b/src_bak/app.scss deleted file mode 100644 index 5122105..0000000 --- a/src_bak/app.scss +++ /dev/null @@ -1,80 +0,0 @@ -// 全局样式 - -// 导入 NutUI 样式(必须在其他规则之前) -@use '@nutui/nutui-react-taro/dist/styles/theme-default.scss'; - -// TailwindCSS 指令 -@tailwind base; // noinspection TailwindCssInclude -@tailwind components; // noinspection TailwindCssInclude -@tailwind utilities; // noinspection TailwindCssInclude - -// 自定义样式变量 -:root { - --primary-color: #1890ff; - --secondary-color: #52c41a; - --text-color: #333333; - --bg-color: #ffffff; - --border-color: #e8e8e8; -} - -// 暗黑模式 -.dark { - --primary-color: #177ddc; - --text-color: #ffffff; - --bg-color: #141414; - --border-color: #303030; - - background-color: var(--bg-color); - color: var(--text-color); -} - -// 全局重置样式 -page { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-size: 28px; - color: var(--text-color); - background-color: var(--bg-color); -} - -// 安全区域适配(小程序不支持 env(),使用固定值) -.safe-area-bottom { - padding-bottom: 20px; -} - -// 通用工具类 -.flex-center { - display: flex; - align-items: center; - justify-content: center; -} - -.flex-between { - display: flex; - align-items: center; - justify-content: space-between; -} - -.text-ellipsis { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-ellipsis-2 { - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; -} - -// 加载旋转动画(Loading组件使用) -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - diff --git a/src_bak/app.tsx b/src_bak/app.tsx deleted file mode 100644 index 2cdb97e..0000000 --- a/src_bak/app.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useState } from 'react' -import Taro, { useLaunch, useDidShow, useDidHide, getSystemInfoSync } from '@tarojs/taro' -import { View } from '@tarojs/components' -import { ConfigProvider } from '@nutui/nutui-react-taro' -import zhCN from '@nutui/nutui-react-taro/dist/locales/zh-CN' -import AppContext from './contexts/AppContext' -import { UserProvider } from './contexts/UserContext' -import { CartProvider } from './contexts/CartContext' -import ErrorBoundary from './components/ErrorBoundary' -import './app.scss' - -type AppProps = { - children?: React.ReactNode -} - -function App(props: AppProps) { - const [theme, setTheme] = useState<'light' | 'dark'>('light') - - useLaunch(() => { - const systemInfo = getSystemInfoSync() - const savedTheme = Taro.getStorageSync('app_theme') - if (savedTheme === 'light' || savedTheme === 'dark') { - setTheme(savedTheme) - } - }) - - useDidShow(() => {}) - - useDidHide(() => {}) - - const toggleTheme = () => { - setTheme(prev => { - const next = prev === 'light' ? 'dark' : 'light' - try { Taro.setStorageSync('app_theme', next) } catch { /* ignore */ } - return next - }) - } - - return ( - - - - - - - {props.children} - - - - - - - ) -} - -export default App diff --git a/src_bak/assets/logo.png b/src_bak/assets/logo.png deleted file mode 100644 index 2069978fff76afbdb903b47d92dcef6e28404fcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158093 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

@Q5vM8na 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 KMNUMnLSTYljYp>d diff --git a/src_bak/assets/tabbar/order-active.png b/src_bak/assets/tabbar/order-active.png deleted file mode 100644 index 96f42774c4be0262a67a5f2181d326cef0871fec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2272 zcma*pc{mjM8VB&-7&C_KYsoSlBD*js3}Gx;W(e6L>#=5+vdoYz#}=|gj4jE&lWoRw zL2(tMyDXUPPxt9#HHtxU5>)1prv&)Z`=*wnIF-a)`ep@~%s?#(osh zvsg>%*s;OvJZX7+i0fvR8;qXtW@1qePJrNAsGi4o1p_G27beQIxCh{Bt8^yZ9ZX7d zDx|8d&d%eV)487mM-;Mw5`Ws>?qEl;!vHG~Y;Q$1eHo>fV(&3nY|g1di5)4Hc_lR0 zQUmq2{Nd-ttA3vQl2#il3Bl3rS|jfzm4G4@rRSzB?Tl=Ea1rV(*K=VVNZXYgcS+OM zml$bmdp;!}H91{QXpEs+dJ;(E38m&ut`-wpGg1miF1la~yPAp@RLy!h+z5*ND;@lO zzM(l+v&>=uiJ0l1mqzAo8;bPq3!m5Tj1gB~e)ojZGMpnM(B|@vJT}yjYV(SYB=^1B zcbwnhHlI@xJa08%t{(5P?ZiV*$e*h=s9tw~qQGZG?PKP=gH|u~<*%<)x*r<*ej-;3RusJ0t-8J(>Q~bgv`_%C>lL()cAill zO)rmw5Evs28w`#hEVeA$-y$7?p9#ug_p}XgR?QsL5YVO*YRn2j`tI%v+PD>Iyq+y^ zwVh~Wf;0PPCWRvvm+r6Gq&sT@!gtf(E#pJDF1~ohAr!vHSxy~gHS=I#c^3US)g-=N zBiP-L;UElSFO^KMHuzavx~`xC*4&sF%vz4GztOSp(Bfw2J4!C;U|FQuC~zVshX#cKFNWOPbc8FXn}a*B4fa2_6eKL`o)*+rmx}QPsoly zZ6kfFN#NtcbPsKVr$GMnX0~bHJk}Xx974Qgfa;@@Y9LS?Z0;x}z=0s6mK2fWllFCv zKrqLAci2pBru)q|SPH~^;927j_fSf$fuJRWYV2tMHyJ|55kOcf;JAD}9_G5iNMX5kyX1FmYC(6IXuQ zNl>yctAl~HOPp8@C`g#A@6Bf&u#d?1fat_pgxtBh)N_&}>jDN#jmKo5!~(~WD7XKj z_BRL#QgC1@=Ppl~<{cWJKCOj;f_**mGEsb0a^9j&dtc#8WLK95#G6Zh_!iL@PZ~QB z`S^I+u@Ojf+xW!4w-0NZ-5s|MN>YoVh{8e>_MxPMD<}Ex#vD4qCv5 z2w#jIQNU`c*oiq=?PlE*VFiwM>+>g~)aYL`VU@4%xyn&yjRxYN$mN}KmIzm+VZRKf zu?!OVjf|cT(0t|Emd+#))|R=u=k56+g`s|;dEBM6RU@5?26QrbWSbp(AnV9p;D$sg zCk;rQkoO!Z^`5F0*<23v!%&ghK~b`P=AW0e4l=Ec8Q5t7#;4Vt77=HF4iM!8@C>@} zy>+Lipo|pPWlIfC0SGM;G!_6f91Wrd| z3=0-2d3jKjHaMAh zj^(0%1B>ON1r#Xa7#hrlBwKX-E9iFB&&z@Ow4t6#NV0Ch|HrpGU@32`du?|T*V%^u zYVL4x?1A4+z`pz`cdYx}+bP^L6Lh>=h&jh6tV9Wv@L2>dWSTy~ukuh7@SK>w3T2hs z3oAiC+B5-@Lzq=p8@5nSc_Qg*^LzNOe!mw_?B%xbPGz zH;XM>pc@;w&5*`rXb+Kjb!x&zR!IMaK=F2Et6!a&Uye*3J}-)-JP~k(-k*sRL}wKzM`fW$dWLXD@`$#M2{gh;i>}*jF32X z>j~j@?A_-6MgTU+Qrhj8xCuH(uTDv#fbT@^P> z@o%*_fOGQ4g2qe*W~92lYxbUo-=spSY5)kaB@k36#$}|%ThDBmK9x!8%ZrIMgd0li z=Y(8VQP1oK+hl2J>PKhoe1ms=So(}}^c$-t|MSIva@QLq(hVLyy+Z=A6Qwg|aJ8D! zgbRcJ3#9&1mDZ!J^LTQ0wi~&IKVRVg1QaNEEb3uZJD~aS`~q|_hMJY?_apuWg0LnA diff --git a/src_bak/assets/tabbar/order.png b/src_bak/assets/tabbar/order.png deleted file mode 100644 index ca7a06798a6d770e8bebcf357f93ecea942d1a89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2205 zcmV;O2x9k%P)6<-wqR6wZ3`69nxUtiyfI$pn1Xzf$2;k8#eBG-L2=-n}tlBUGAdLQ1Lw7q!00sZ1gwXy{Tat`BwYQJI zr3-!LBJCzVF8m{Qa_~*M$%&e*rDUKzRcr=;wC6ZQ0tuSpu&!>qm(qT_4V~E`K#>aq ze_or+0ww@tj($ca#jjdGC9<0Snz|!wvJp=aano9xGvGe^uC15=Amu4%%r5SfAPS7g z?8CBW8hz-Txna$QWsE?u7GreNWEMCKKc>im}BS@!87{Llcb4ZtjQxNMv$#~grE zh6dm701RH>RCo?RDnonfw_ve>E#&lH^5pWEdtBE5D9HQY9q_G~=`(Y(v0U!$aW@Viu)932oAqu1 z&}iHm=@iDa2xr?fb$&xxw*V-nt=rHwMx;4ZilO<^GXTw#w{V~aa0~VIRvmzPx$Q!; z1JFg8>N)8E)XQxbnnwko#)BwZI=A+n3c_AvJp-`y#O#q@;jZQIYHk{9^62(|2j}V z9`q>cTUv-#{e}d90xF^0zFpp><3W)m1V{SHW_Qbw0H_KSU(Lg^3BjWH4;{6EzDuCA zssCj-093?Oktifn{O57>k?^?J8aVw|dL@G409c9helvysJjZJ%#s36CpVyY0W7hg! za{F)q=vz9z4MfZnF5Ss%2y>&A6%GeL$QSnp!m3$QL#LT@rHY0GKqHkIz_MUf?l6`X zZQ1YW`j7yS6hXjrZ2`fs#V1e00zhyE5LCUrjE}8lXaGnq5J-5Z-=5ikQO~;vIhCMh zSQ#FGSUEwke0T&H5DFZH&y08q&*>v}9lD(cfLO%<0x%#HJPMzIAs#wKI~@R1RCPy? z4#19Njd-X7&}mhz+;#x0GTEsf2cXl!S-I^1SY@(PJq|#pg|l+o0kFzsr+OTKP77z{ zwgX_5$xih+0G$=i+Fb|0I-{NGa{xLkn62cVNe z)pFATsFm4H^j-ph_xJbs@A2{4mKlV16lMMXur^1{0Z{QtM0`gN@8Fq1ct_FgWmUBc zoYLPM069o9)J(Ym0l+s4z9|4<^fwFsB8KM$Kn0lY=h%w*QcKer;8K~G)S0FLyuQ9N z1Mp^!Nz?zrt7y0gZWe!20Ek);kbv1BxPc#HCk@3S9q20VUmJj|3mgT(>sfd=&n&`g zX#jt7*&KX1URVH-`d2z< z{-P(R23yCZX3tdaw{+k3Spbltknj0Zf!v(&|9xdZqn~Sp>VxMn0J?w!0OZU2$2Gp| zf86R@wla_`zH$#FTRM{a4g(M@B&Q+~?GS`yrJBrKnf&Q&0zf8-oCs_ftjkaHf zCr1pFV=gAbA01&L?63HE~+x>6?4t=L>$UzVa|3`^P7GKBY=30ktFJ=G)B2(7_ z(HqWh2oHZSE6~m;A4TA#x f00v1!K~w_(PZY*ItMU|Z00000NkvXXu0mjfXx|Af diff --git a/src_bak/assets/tabbar/points-active.png b/src_bak/assets/tabbar/points-active.png deleted file mode 100644 index bccaf3ebdee97bf26c6f221ef83e793f6373fb53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4794 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 Uh|O7~RR91007*qoM6N<$g7c~4$^ZZW diff --git a/src_bak/assets/tabbar/points.png b/src_bak/assets/tabbar/points.png deleted file mode 100644 index 6e0e6e3c0c3843d0704b51532f9f3f710b02149a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4650 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 diff --git a/src_bak/assets/tabbar/user-active.png b/src_bak/assets/tabbar/user-active.png deleted file mode 100644 index c132039b77283c970a7f2af10042594aac568c1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 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 void -} - -class ErrorBoundary extends Component { - constructor(props: ErrorBoundaryProps) { - super(props) - this.state = { hasError: false } - } - - static getDerivedStateFromError(error: Error): ErrorBoundaryState { - return { hasError: true, error } - } - - componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { - this.setState({ error, errorInfo }) - this.props.onError?.(error, errorInfo) - console.error('ErrorBoundary caught an error:', error, errorInfo) - } - - private handleReset = () => { - this.setState({ hasError: false, error: undefined, errorInfo: undefined }) - } - - private handleReload = () => { - Taro.reLaunch({ url: '/pages/index/index' }) - } - - render() { - if (this.state.hasError) { - if (this.props.fallback) return this.props.fallback - - return ( - - - ! - 页面出现了问题 - 请稍后重试,或返回首页继续使用。 - {process.env.NODE_ENV === 'development' && ( - - 错误详情 - {this.state.error?.message} - - )} - - - - - - - ) - } - - return this.props.children - } -} - -export default ErrorBoundary diff --git a/src_bak/components/NavBar/index.tsx b/src_bak/components/NavBar/index.tsx deleted file mode 100644 index 2ba723f..0000000 --- a/src_bak/components/NavBar/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { View, Text } from '@tarojs/components'; -import { useNavigate } from '@tarojs/taro'; - -interface NavBarProps { - title: string; - onBack?: () => void; - rightText?: string; - onRightClick?: () => void; -} - -export default function NavBar({ title, onBack, rightText, onRightClick }: NavBarProps) { - const navigate = useNavigate(); - - const handleBack = () => { - if (onBack) { - onBack(); - } else { - navigate(-1); - } - }; - - return ( - - - - {title} - - {rightText && ( - - {rightText} - - )} - - ); -} diff --git a/src_bak/components/QRLoginScanner.tsx b/src_bak/components/QRLoginScanner.tsx deleted file mode 100644 index aad6bd7..0000000 --- a/src_bak/components/QRLoginScanner.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import React, { useState } from 'react' -import { View, Text } from '@tarojs/components' -import { Button, Loading } from '@nutui/nutui-react-taro' -import { Failure, Scan, Success } from '@nutui/icons-react-taro' -import Taro from '@tarojs/taro' -import { confirmWechatQRLogin, parseQRContent } from '@/api/passport/qr-login' - -export interface QRLoginScannerProps { - onSuccess?: (result: any) => void - onError?: (error: string) => void - className?: string - buttonText?: string - showStatus?: boolean -} - -type ScanState = 'idle' | 'scanning' | 'confirming' | 'success' | 'error' - -const QRLoginScanner: React.FC = ({ - onSuccess, - onError, - className = '', - buttonText = '开始扫码登录', - showStatus = true, -}) => { - const [state, setState] = useState('idle') - const [error, setError] = useState('') - const [result, setResult] = useState(null) - - const reset = () => { - setState('idle') - setError('') - setResult(null) - } - - const startScan = async () => { - try { - setState('scanning') - setError('') - - const scanRes = await Taro.scanCode({ onlyFromCamera: false, scanType: ['qrCode'] }) - const rawContent = scanRes.result || '' - const token = parseQRContent(rawContent) - const userId = Number(Taro.getStorageSync('UserId')) - - if (!token) { - throw new Error('未识别到有效的登录二维码') - } - - if (!userId) { - throw new Error('当前用户未登录') - } - - setState('confirming') - const confirmRes = await confirmWechatQRLogin(token, userId) - setResult(confirmRes) - setState('success') - onSuccess?.(confirmRes) - } catch (err: any) { - const message = err?.errMsg?.includes('cancel') - ? '已取消扫码' - : err?.message || '扫码登录失败' - setError(message) - setState('error') - onError?.(message) - } - } - - const renderStatus = () => { - switch (state) { - case 'scanning': - return ( - - - 请扫描登录二维码... - - ) - case 'confirming': - return ( - - - 正在确认登录... - - ) - case 'success': - return ( - - - 登录确认成功 - - ) - case 'error': - return ( - - - {error || '扫码登录失败'} - - ) - default: - return null - } - } - - const loading = state === 'scanning' || state === 'confirming' - - return ( - - - - {showStatus && {renderStatus()}} - - {state === 'success' && result && ( - - 扫码登录已确认,请返回网页端查看登录结果。 - - )} - - {state === 'idle' && ( - - 扫描网页端展示的登录二维码,即可完成登录确认。 - - )} - - ) -} - -export default QRLoginScanner diff --git a/src_bak/components/business/AddressCard/index.tsx b/src_bak/components/business/AddressCard/index.tsx deleted file mode 100644 index 9eea2a2..0000000 --- a/src_bak/components/business/AddressCard/index.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' -import type { ShopUserAddress } from '@/api/shop/shopUserAddress/model' - -interface AddressCardProps { - address: ShopUserAddress - /** 是否选中状态(用于选择地址场景,如结算页) */ - selected?: boolean - /** 是否为选择模式(显示radio圆圈) */ - selectMode?: boolean - onClick?: () => void - showActions?: boolean - onEdit?: () => void - onDelete?: () => void - onDefault?: () => void -} - -const AddressCard: React.FC = ({ - address, - selected = false, - selectMode = false, - onClick, - showActions = false, - onEdit, - onDelete, - onDefault, -}) => { - const fullAddress = [address.province, address.city, address.region, address.address].filter(Boolean).join(' ') - - return ( - - - {/* 选择模式下的radio圈 */} - {selectMode && ( - - - {selected && ( - - - - )} - - - )} - - - {/* 姓名 + 手机号 + 默认标签 */} - - {address.name} - {address.phone} - {address.isDefault && ( - - 默认 - - )} - - - {/* 完整地址 */} - - {fullAddress || address.fullAddress || address.address || '暂无地址'} - - - - - {/* 操作栏 */} - {showActions && ( - - {/* 默认地址切换 */} - { e.stopPropagation(); onDefault?.() }} - > - - {address.isDefault && ( - - - - )} - - 默认地址 - - - {/* 编辑/删除 */} - - {onEdit && ( - { e.stopPropagation(); onEdit?.() }} - > - 编辑 - - )} - | - {onDelete && ( - { e.stopPropagation(); onDelete?.() }} - > - 删除 - - )} - - - )} - - ) -} - -export default AddressCard diff --git a/src_bak/components/business/CouponCard/index.tsx b/src_bak/components/business/CouponCard/index.tsx deleted file mode 100644 index fcc37f7..0000000 --- a/src_bak/components/business/CouponCard/index.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' -import type { ShopUserCoupon } from '@/api/shop/shopUserCoupon/model' -import { getCouponTypeText, formatCouponValue, isExpiringSoon } from '@/hooks/useCoupon' - -interface CouponCardProps { - coupon: ShopUserCoupon - disabled?: boolean - onClick?: () => void - showDelete?: boolean - onDelete?: () => void -} - -const CouponCard: React.FC = ({ - coupon, - disabled = false, - onClick, - showDelete = false, - onDelete, -}) => { - const isUsed = coupon.status === 1 - const isExpired = coupon.status === 2 || coupon.isExpire === 1 - const expiringSoon = isExpiringSoon(coupon) - - const getValidTime = () => { - if (coupon.startTime && coupon.endTime) { - return `${coupon.startTime.slice(0, 10)} - ${coupon.endTime.slice(0, 10)}` - } - return '永久有效' - } - - const getRangeText = () => { - switch (coupon.applyRange) { - case 10: return '全场通用' - case 20: return '指定商品' - case 30: return '指定分类' - default: return '全场通用' - } - } - - return ( - - - {/* 左侧金额区域 */} - - {formatCouponValue(coupon)} - {(() => { - if (coupon.type === 50) { - // 场地使用券 - const parts: string[] = [] - if (coupon.useDuration && coupon.useDuration > 0) parts.push(`${coupon.useDuration}分钟`) - return parts.length > 0 ? ( - {parts.join(' | ')} - ) : null - } - if (coupon.type === 40 || !coupon.minPrice || Number(coupon.minPrice) <= 0) return null - return 满{coupon.minPrice}可用 - })()} - - - {/* 右侧信息区域 */} - - - - - {coupon.name || getCouponTypeText(coupon.type)} - {expiringSoon && !isUsed && !isExpired && ( - 即将过期 - )} - - {getRangeText()} - {getValidTime()} - {coupon.description && ( - {coupon.description} - )} - - - {/* 状态标签 */} - - {isUsed && ( - 已使用 - )} - {isExpired && ( - 已过期 - )} - {!isUsed && !isExpired && ( - - )} - - - - {/* 删除按钮 */} - {showDelete && (isUsed || isExpired) && ( - - { e.stopPropagation(); onDelete?.() }}> - 删除 - - - )} - - - - ) -} - -export default CouponCard diff --git a/src_bak/components/business/CouponSelect/index.tsx b/src_bak/components/business/CouponSelect/index.tsx deleted file mode 100644 index b63db2b..0000000 --- a/src_bak/components/business/CouponSelect/index.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import React, { useEffect, useMemo } from 'react' -import { View, Text, ScrollView } from '@tarojs/components' -import type { ShopUserCoupon } from '@/api/shop/shopUserCoupon/model' - -interface CouponSelectProps { - visible: boolean - coupons: ShopUserCoupon[] - minAmount?: number - selectedCouponId?: string - onClose: () => void - onSelect: (coupon: ShopUserCoupon | null) => void -} - -const CouponSelect: React.FC = ({ - visible, - coupons, - minAmount = 0, - selectedCouponId, - onClose, - onSelect, -}) => { - const [showOverlay, setShowOverlay] = React.useState(false) - const [slideUp, setSlideUp] = React.useState(false) - - // 控制动画 - React.useEffect(() => { - if (visible) { - setShowOverlay(true) - setTimeout(() => setSlideUp(true), 10) - } else { - setSlideUp(false) - setTimeout(() => setShowOverlay(false), 300) - } - }, [visible]) - - const handleClose = () => { - setSlideUp(false) - setTimeout(() => { - setShowOverlay(false) - onClose() - }, 300) - } - - const handleSelect = (coupon: ShopUserCoupon | null) => { - handleClose() - onSelect(coupon) - } - - const availableCoupons = useMemo(() => { - return coupons.filter(c => { - if (c.status !== 0 && c.status !== undefined) return false - if (c.endTime && new Date(c.endTime) < new Date()) return false - return (Number(c.minPrice) || 0) <= minAmount - }) - }, [coupons, minAmount]) - - if (!showOverlay) return null - - return ( - - {/* 遮罩层 */} - - - {/* 弹窗内容 */} - - - {/* 关闭按钮 */} - - - × - - - - - 选择优惠券 - handleSelect(null)} - > - 不使用优惠券 - - - - {availableCoupons.length === 0 ? ( - - 暂无可用优惠券 - - ) : ( - - {availableCoupons.map((coupon) => { - const isSelected = selectedCouponId === coupon.id - return ( - handleSelect(coupon)} - > - - {coupon.type === 20 ? ( - - - {coupon.discount || 0}折 - - - {coupon.minPrice && Number(coupon.minPrice) > 0 ? `满${coupon.minPrice}可用` : '无门槛'} - - - ) : coupon.type === 50 ? ( - - - {coupon.useCount && coupon.useCount > 0 ? `${coupon.useCount}次` : '不限次'} - - - {coupon.useDuration && coupon.useDuration > 0 ? `${coupon.useDuration}分钟` : '场地使用'} - - - ) : ( - - ¥ - - {coupon.reducePrice || 0} - - - {coupon.type === 40 ? '无门槛' : - (coupon.minPrice && Number(coupon.minPrice) > 0 ? `满${coupon.minPrice}可用` : '无门槛')} - - - )} - - - - - {coupon.name || coupon.description || '优惠券'} - - - {coupon.startTime?.slice(0, 10)} ~ {coupon.endTime?.slice(0, 10)} - - - - {isSelected && ( - - {'✓'} - - )} - - ) - })} - - )} - - - - ) -} - -export default CouponSelect diff --git a/src_bak/components/business/MemberBadge/index.tsx b/src_bak/components/business/MemberBadge/index.tsx deleted file mode 100644 index a0e67a3..0000000 --- a/src_bak/components/business/MemberBadge/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' - -interface MemberBadgeProps { - levelName?: string - size?: 'small' | 'normal' -} - -const MemberBadge: React.FC = ({ levelName, size = 'normal' }) => { - if (!levelName) return null - - const sizeClass = size === 'small' ? 'text-xs px-1 py-0' : 'text-sm px-2 py-1' - - return ( - - {levelName} - - ) -} - -export default MemberBadge diff --git a/src_bak/components/business/PayModal/index.tsx b/src_bak/components/business/PayModal/index.tsx deleted file mode 100644 index 4bf390f..0000000 --- a/src_bak/components/business/PayModal/index.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { View, Text } from '@tarojs/components' -import Price from '@/components/common/Price' - -interface PayModalProps { - visible: boolean - amount: string - onClose: () => void - onConfirm: (payType: number) => void -} - -const PAY_TYPES = [ - { id: 1, name: '微信支付', desc: '推荐使用', icon: 'pay-wechat' }, - { id: 0, name: '货到付款', desc: '使用账户余额', icon: 'pay-balance' }, -] - -const PayModal: React.FC = ({ visible, amount, onClose, onConfirm }) => { - const [selected, setSelected] = useState(1) - const [showOverlay, setShowOverlay] = useState(false) - const [slideUp, setSlideUp] = useState(false) - - // 控制动画 - useEffect(() => { - if (visible) { - setShowOverlay(true) - setTimeout(() => setSlideUp(true), 10) - } else { - setSlideUp(false) - setTimeout(() => setShowOverlay(false), 300) - } - }, [visible]) - - const handleClose = () => { - setSlideUp(false) - setTimeout(() => { - setShowOverlay(false) - onClose() - }, 300) - } - - const handleConfirm = () => { - handleClose() - onConfirm(selected) - } - - if (!showOverlay) return null - - return ( - - {/* 遮罩层 */} - - - {/* 弹窗内容 */} - - - {/* 关闭按钮 */} - - - × - - - - - 选择支付方式 - - - - - - - {PAY_TYPES.map((item) => ( - setSelected(item.id)} - > - - - - {item.id === 1 ? '微' : '余'} - - - - {item.name} - {item.desc} - - - - {selected === item.id && ( - - )} - - - ))} - - - - 确认支付 - - - - - ) -} - -export default PayModal diff --git a/src_bak/components/business/SkuSelector/index.tsx b/src_bak/components/business/SkuSelector/index.tsx deleted file mode 100644 index e9c9ee0..0000000 --- a/src_bak/components/business/SkuSelector/index.tsx +++ /dev/null @@ -1,346 +0,0 @@ -import React, { useState, useEffect, useMemo } from 'react' -import { View, Text, Image, ScrollView } from '@tarojs/components' -import Taro from '@tarojs/taro' -import type { ShopGoods, ShopGoodsSku } from '@/api/shop/shopGoods/model' -import type { ShopGoodsSpec } from '@/api/shop/shopGoodsSpec/model' -import Price from '@/components/common/Price' - -interface SkuSelectorProps { - visible: boolean - product: ShopGoods | null - mode?: 'cart' | 'buy' - onClose: () => void - onConfirm: (sku: ShopGoodsSku, quantity: number) => void -} - -// 将平铺的规格值列表转换为按规格ID分组的格式 -interface SpecGroup { - specId: number - specName: string - values: Array<{ specValueId: number; specValue: string }> -} - -// 解析可能为JSON字符串的规格值 -const parseSpecValue = (value: string | undefined): string => { - if (!value) return '' - const trimmed = value.trim() - // 处理带引号的JSON字符串,如 "红色" -> 红色 - if (trimmed.startsWith('"') && trimmed.endsWith('"') && trimmed.length >= 2) { - try { - return JSON.parse(trimmed) - } catch { - return trimmed.slice(1, -1) - } - } - return trimmed -} - -const SkuSelector: React.FC = ({ - visible, - product, - mode = 'cart', - onClose, - onConfirm, -}) => { - const [selectedSpecs, setSelectedSpecs] = useState>({}) - const [selectedSku, setSelectedSku] = useState(null) - const [quantity, setQuantity] = useState(1) - const [showOverlay, setShowOverlay] = useState(false) - const [slideUp, setSlideUp] = useState(false) - - // 控制动画 - useEffect(() => { - if (visible) { - setShowOverlay(true) - // 延迟一帧触发滑入动画 - setTimeout(() => setSlideUp(true), 10) - } else { - setSlideUp(false) - setTimeout(() => setShowOverlay(false), 300) - } - }, [visible]) - - // 将平铺的goodsSpecs转换为按规格分组的格式 - const specGroups = useMemo(() => { - if (!product?.goodsSpecs?.length) return [] - - const groupMap = new Map() - - product.goodsSpecs.forEach((spec: ShopGoodsSpec, idx: number) => { - if (!groupMap.has(spec.specId!)) { - groupMap.set(spec.specId!, { - specId: spec.specId!, - specName: spec.specName || `规格${groupMap.size + 1}`, - values: [] - }) - } - groupMap.get(spec.specId!)!.values.push({ - specValueId: spec.id || idx, // 优先使用规格值ID,否则用索引 - specValue: parseSpecValue(spec.specValue) - }) - }) - - return Array.from(groupMap.values()) - }, [product?.goodsSpecs]) - - // 当弹窗重新打开时,重置状态 - useEffect(() => { - if (visible) { - setSelectedSpecs({}) - setSelectedSku(null) - setQuantity(1) - } - }, [visible]) - - // 根据已选规格查找匹配的 SKU - useEffect(() => { - if (!product?.goodsSkus?.length) { - // 单规格商品,使用商品本身的价格 - setSelectedSku(null) - return - } - - const specValues = Object.values(selectedSpecs) - const specCount = specGroups.length - - if (specValues.length < specCount) { - setSelectedSku(null) - return - } - - // 根据选中的 specValueId 找到对应的中文值,拼接后排序匹配 - const selectedValues: string[] = [] - specGroups.forEach(group => { - const valueId = selectedSpecs[group.specId] - if (valueId !== undefined) { - const value = group.values.find(v => v.specValueId === valueId) - if (value) selectedValues.push(value.specValue) - } - }) - const selectedStr = selectedValues.sort().join('|') - - const matched = product.goodsSkus.find(sku => { - const skuValue = sku.sku || '' - const skuParts = skuValue.split('|').map(s => parseSpecValue(s.trim())) - const skuStr = skuParts.sort().join('|') - return skuStr === selectedStr - }) - - setSelectedSku(matched || null) - }, [selectedSpecs, product, specGroups]) - - const handleSpecClick = (specId: number, valueId: number) => { - setSelectedSpecs(prev => { - const next = { ...prev } - if (next[specId] === valueId) { - delete next[specId] - } else { - next[specId] = valueId - } - return next - }) - setQuantity(1) - } - - const handleClose = () => { - setSlideUp(false) - setTimeout(() => { - setShowOverlay(false) - onClose() - }, 300) - } - - const handleConfirm = () => { - try { - // 单规格商品(无SKU列表 或 SKU列表为空数组) - if ((!product?.goodsSkus || product.goodsSkus.length === 0) && product) { - const fakeSku: ShopGoodsSku = { - id: 0, - goodsId: product.goodsId!, - price: product.price || product.salePrice, - salePrice: product.salePrice || product.price, - stock: product.stock, - image: product.image, - } - handleClose() - onConfirm(fakeSku, quantity) - return - } - - // 多规格商品 - 必须已选择 SKU - if (selectedSku) { - handleClose() - onConfirm(selectedSku, quantity) - return - } - - // 有规格但未选择完整 - if (specGroups.length > 0) { - Taro.showToast({ title: '请选择完整的规格', icon: 'none' }) - return - } - - // 其他情况 - Taro.showToast({ title: '无法添加商品', icon: 'none' }) - } catch (err) { - Taro.showToast({ title: '操作失败', icon: 'none' }) - } - } - - // 价格优先级:SKU售价 > SKU原价 > 商品售价 > 商品原价 > 0 - // 注意:ShopGoods 模型中 price=商品价格(低), salePrice=销售/市场价(高) - // ShopGoodsSku 模型中 price=商品价格, salePrice=市场价格(高) - // 统一以 price 为准,salePrice 仅作兜底展示 - const currentPrice = selectedSku?.price || selectedSku?.salePrice || product?.price || product?.salePrice || '0' - const currentStock = selectedSku?.stock ?? product?.stock ?? 0 - const currentImage = selectedSku?.image || product?.image || (product?.files?.split(',')[0]) || '' - - // 单规格商品可以确认,或者多规格商品已选择了 SKU - const canConfirm = (!product?.goodsSkus || product.goodsSkus.length === 0) || selectedSku !== null - - // 获取未选择完整的规格提示 - const getUnselectedSpec = () => { - if (specGroups.length === 0) return null - const unselected = specGroups.find( - spec => !selectedSpecs[spec.specId] - ) - return unselected?.specName - } - - // 获取选中的规格文字描述 - const getSelectedText = () => { - const selected: string[] = [] - specGroups.forEach(group => { - const valueId = selectedSpecs[group.specId] - if (valueId !== undefined) { - const value = group.values.find(v => v.specValueId === valueId) - if (value) selected.push(value.specValue) - } - }) - return selected.length > 0 ? selected.join(', ') : '默认' - } - - // 如果不需要显示,直接返回null - if (!showOverlay) return null - - return ( - - {/* 遮罩层 */} - - - {/* 弹窗内容 */} - - - {/* 关闭按钮 */} - - - × - - - - {/* 商品信息 */} - - - - - 库存: {currentStock} - - 已选: {getSelectedText()} - - - - - {/* 规格选择 */} - - {specGroups.map((group) => ( - - - {group.specName} - - - {group.values.map((value) => { - const isActive = selectedSpecs[group.specId] === value.specValueId - return ( - handleSpecClick(group.specId, value.specValueId)} - > - {value.specValue} - - ) - })} - - - ))} - - {/* 无规格时显示提示 */} - {specGroups.length === 0 && product?.goodsSkus?.length === 0 && ( - - 单规格商品 - - )} - - - {/* 数量 */} - - 数量 - - quantity > 1 && setQuantity(prev => prev - 1)} - > - - - - {quantity} - = currentStock ? 'border-gray-200 text-gray-300' : 'border-gray-300 text-gray-500' - }`} - onClick={() => quantity < currentStock && setQuantity(prev => prev + 1)} - > - = currentStock ? 'text-gray-300' : 'text-gray-500'}>+ - - - - - {/* 确认按钮 */} - - - - {getUnselectedSpec() ? `请选择${getUnselectedSpec()}` : (mode === 'cart' ? '加入购物车' : '立即购买')} - - - - - - - ) -} - -export default SkuSelector diff --git a/src_bak/components/common/BottomButton/index.scss b/src_bak/components/common/BottomButton/index.scss deleted file mode 100644 index 2f93925..0000000 --- a/src_bak/components/common/BottomButton/index.scss +++ /dev/null @@ -1,59 +0,0 @@ -/* 底部悬浮按钮样式 */ - -.bottom-button-container { - position: fixed; - bottom: 0; - left: 0; - right: 0; - z-index: 999; - background-color: #ffffff; - padding: 12PX 16PX; - padding-bottom: 24PX; - border-top: 1PX solid #f0f0f0; -} - -.bottom-btn-subtitle { - text-align: center; - margin-bottom: 8px; -} - -.subtitle-text { - font-size: 14px; - color: #666666; -} - -.subtitle-price { - color: #ff6600; - font-weight: 500; -} - -.bottom-btn { - width: 100%; - height: 88rpx; - background-color: #0e932e; - color: #ffffff; - font-size: 32rpx; - font-weight: 500; - border-radius: 44rpx; - border: none; - margin: 0; - padding: 0; - display: flex; - align-items: center; - justify-content: center; - line-height: 88rpx; -} - -.bottom-btn::after { - border: none; -} - -.bottom-btn[disabled] { - background-color: #cccccc; - color: #ffffff; -} - -.bottom-btn[loading] { - background-color: #0e932e; - opacity: 0.8; -} diff --git a/src_bak/components/common/BottomButton/index.tsx b/src_bak/components/common/BottomButton/index.tsx deleted file mode 100644 index c52d1af..0000000 --- a/src_bak/components/common/BottomButton/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react' -import { View, Button, Text } from '@tarojs/components' -import styles from './index.scss' - -interface BottomButtonProps { - text?: string - onClick?: () => void - disabled?: boolean - loading?: boolean - color?: string - subtitle?: string -} - -const BottomButton: React.FC = ({ - text = '确认', - onClick, - disabled = false, - loading = false, - color = '#0e932e', - subtitle -}) => { - return ( - - {subtitle && ( - - {subtitle} - - )} - - - ) -} - -export default BottomButton diff --git a/src_bak/components/common/EmptyState/index.tsx b/src_bak/components/common/EmptyState/index.tsx deleted file mode 100644 index 4da086e..0000000 --- a/src_bak/components/common/EmptyState/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' -import { Button } from '@nutui/nutui-react-taro' - -interface EmptyStateProps { - image?: string - text?: string - description?: string - actionText?: string - onAction?: () => void -} - -const DEFAULT_IMAGE = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iI2Y1ZjVmNSIvPjx0ZXh0IHg9IjUwJSIgeT0iNTAlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE0IiBmaWxsPSIjY2NjIj7or77nqIvliY3liIY8L3RleHQ+PC9zdmc+' - -const EmptyState: React.FC = ({ - image = DEFAULT_IMAGE, - text = '暂无数据', - description, - actionText, - onAction, -}) => { - return ( - - - - - {text} - {description && ( - {description} - )} - {actionText && onAction && ( - - )} - - ) -} - -export default EmptyState diff --git a/src_bak/components/common/FixedButton/index.tsx b/src_bak/components/common/FixedButton/index.tsx deleted file mode 100644 index f0686bb..0000000 --- a/src_bak/components/common/FixedButton/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React from 'react' -import { View } from '@tarojs/components' -import { Button } from '@nutui/nutui-react-taro' - -interface FixedButtonProps { - text?: string - onClick?: () => void - icon?: React.ReactNode - disabled?: boolean - background?: string -} - -/** - * 底部固定按钮组件 - * 用于地址列表"新增地址"、地址编辑"保存"等底部固定操作 - */ -const FixedButton: React.FC = ({ text, onClick, icon, disabled, background }) => { - return ( - <> - {/* 底部安全区域占位 */} - - - - - - ) -} - -export default FixedButton diff --git a/src_bak/components/common/LazyImage/index.tsx b/src_bak/components/common/LazyImage/index.tsx deleted file mode 100644 index 39c093c..0000000 --- a/src_bak/components/common/LazyImage/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { View, Image, Text } from '@tarojs/components'; -import { useState, useEffect } from 'react'; -import { useIntersectionObserver } from '@tarojs/taro'; - -interface LazyImageProps { - src: string; - placeholder?: string; - className?: string; - style?: React.CSSProperties; - mode?: 'scaleToFill' | 'aspectFit' | 'aspectFill' | 'widthFix' | 'heightFix' | 'top' | 'bottom' | 'center' | 'left' | 'right' | 'top left' | 'top right' | 'bottom left' | 'bottom right'; -} - -export default function LazyImage({ src, placeholder, className, style, mode = 'aspectFill' }: LazyImageProps) { - const [loaded, setLoaded] = useState(false); - const [inView, setInView] = useState(false); - const { intersectionObserver } = useIntersectionObserver(); - - useEffect(() => { - if (!intersectionObserver) return; - - intersectionObserver.relativeToViewport(); - intersectionObserver.observe({ - type: 'relativeToViewport', - success: (res) => { - if (res.intersectionRatio > 0) { - setInView(true); - } - } - }); - - return () => { - intersectionObserver.disconnect(); - }; - }, [intersectionObserver]); - - return ( - - {!loaded && ( - - {placeholder ? ( - - ) : ( - 加载中... - )} - - )} - {(inView || loaded) && ( - setLoaded(true)} - /> - )} - - ); -} diff --git a/src_bak/components/common/LoadMore/index.tsx b/src_bak/components/common/LoadMore/index.tsx deleted file mode 100644 index 8c3e11e..0000000 --- a/src_bak/components/common/LoadMore/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' - -interface LoadMoreProps { - loading?: boolean - finished?: boolean -} - -const LoadMore: React.FC = ({ loading = false, finished = false }) => { - if (finished) { - return ( - - - 没有更多了 - - - ) - } - - if (loading) { - return ( - - 加载中... - - ) - } - - return null -} - -export default LoadMore diff --git a/src_bak/components/common/Loading/index.tsx b/src_bak/components/common/Loading/index.tsx deleted file mode 100644 index 15d2396..0000000 --- a/src_bak/components/common/Loading/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' - -interface LoadingProps { - /** 提示文字,默认"加载中..." */ - text?: string - /** 是否全屏居中显示 */ - fullscreen?: boolean - /** 自定义样式类名 */ - className?: string -} - -/** - * 统一加载状态组件 - * - 小程序兼容(无 CSS transition / animation 依赖) - * - 支持内嵌和全屏两种模式 - */ -const Loading: React.FC = ({ - text = '加载中...', - fullscreen = false, - className = '', -}) => { - const content = ( - - {/* 简单的旋转加载指示器 */} - - {text} - - ) - - // 全屏模式需要外层容器 - if (fullscreen) { - return <>{content} - } - - return content -} - -export default Loading diff --git a/src_bak/components/common/OrderCard/index.tsx b/src_bak/components/common/OrderCard/index.tsx deleted file mode 100644 index 0b8c057..0000000 --- a/src_bak/components/common/OrderCard/index.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React from 'react' -import { View, Text, Image } from '@tarojs/components' -import Taro from '@tarojs/taro' -import type { ShopOrder } from '@/api/shop/shopOrder/model' -import Price from '../Price' - -interface OrderCardProps { - order: ShopOrder - onClick?: () => void -} - -/** 综合 payStatus + deliveryStatus + orderStatus 计算列表卡片状态文案 */ -const getCardStatus = (order: ShopOrder): { text: string; color: string } => { - const { payStatus, deliveryStatus, orderStatus } = order - - if (orderStatus === 2) return { text: '已取消', color: '#999' } - if (orderStatus === 3) return { text: '取消中', color: '#ff7d00' } - if (orderStatus === 6) return { text: '已退款', color: '#999' } - if (orderStatus === 4 || orderStatus === 7) return { text: '退款申请中', color: '#ee0a24' } - if (orderStatus === 5) return { text: '退款被拒绝', color: '#ee0a24' } - - if (!payStatus) return { text: '待付款', color: '#ee0a24' } - if (deliveryStatus === 10) return { text: '待发货', color: '#4b9cf5' } - if (deliveryStatus === 20 || deliveryStatus === 30) return { text: '待收货', color: '#4b9cf5' } - if (orderStatus === 1) return { text: '已完成', color: '#0e932e' } - - return { text: '已付款', color: '#0e932e' } -} - -const OrderCard: React.FC = ({ order, onClick }) => { - const handleClick = () => { - if (onClick) { - onClick() - return - } - Taro.navigateTo({ url: `/pages/order/detail?id=${order.orderId}` }) - } - - const { text: statusText, color: statusColor } = getCardStatus(order) - - // 获取首个商品图片作为封面,或显示默认占位 - const coverImage = order.orderGoods?.[0]?.image || '' - const hasGoods = (order.orderGoods?.length || 0) > 0 - - return ( - - {/* 头部:订单号 + 状态 */} - - - 订单号: {order.orderNo} - - - {statusText} - - - - {/* 商品信息区域 */} - {hasGoods ? ( - - {order.orderGoods?.map((item, idx) => ( - - {/* 商品缩略图 */} - - {item.image ? ( - - ) : ( - - 暂无图片 - - )} - - - {/* 商品信息 */} - - - - {item.goodsName || '未知商品'} - - {item.spec ? ( - - 规格: {item.spec} - - ) : null} - - - - - x{item.totalNum || 1} - - - - - ))} - - ) : ( - /* 无商品信息时的 fallback */ - - - {coverImage ? ( - - ) : ( - 暂无图片 - )} - - - - {order.title || '订单商品'} - - - 共{order.totalNum || 0}件 - - - - )} - - {/* 底部:日期 + 金额汇总 */} - - - {order.createTime?.slice(0, 10)} - - - - 共{order.totalNum || order.orderGoods?.reduce((sum, g) => sum + (g.totalNum || 1), 0) || 0}件 - - 实付 - - - - - ) -} - -export default OrderCard diff --git a/src_bak/components/common/Price/index.tsx b/src_bak/components/common/Price/index.tsx deleted file mode 100644 index 5e020bf..0000000 --- a/src_bak/components/common/Price/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react' -import { View, Text } from '@tarojs/components' -import { isGuest } from '@/utils/auth' - -interface PriceProps { - price: string | number - original?: string | number - size?: 'small' | 'normal' | 'large' - color?: string - symbol?: string - /** - * 游客脱敏模式: - * - 当用户未登录时,**不显示价格**,改成"登录后查看"占位文案 - * - 用于过微信审核:游客可浏览商品列表/详情,但价格需登录后可见 - * - 不传则维持原行为(游客也显示价格) - */ - loginMask?: boolean - /** - * 自定义脱敏文案(仅在 loginMask=true 且游客态下生效) - */ - maskText?: string -} - -const Price: React.FC = ({ - price, - original, - size = 'normal', - color = '#ee0a24', - symbol = '¥', - loginMask = false, - maskText = '登录后查看价格', -}) => { - const fmt = (p: string | number) => { - const num = typeof p === 'string' ? parseFloat(p) : p - return isNaN(num) ? '0.00' : num.toFixed(2) - } - - const sizeMap = { - small: { mask: 'text-xs', symbol: 'text-xs', integer: 'text-sm font-medium', decimal: 'text-xs' }, - normal: { mask: 'text-sm', symbol: 'text-sm', integer: 'text-lg font-bold', decimal: 'text-sm' }, - large: { mask: 'text-base', symbol: 'text-lg', integer: 'text-2xl font-bold', decimal: 'text-lg' }, - } - - const cls = sizeMap[size] - - // 游客态 + 开启脱敏 -> 显示占位文案 - if (loginMask && isGuest()) { - return ( - - {maskText} - - ) - } - - return ( - - {symbol} - {fmt(price).split('.')[0]} - .{fmt(price).split('.')[1]} - {original && ( - ¥{fmt(original)} - )} - - ) -} - -export default Price diff --git a/src_bak/components/common/ProductCard/index.tsx b/src_bak/components/common/ProductCard/index.tsx deleted file mode 100644 index 5f52ae2..0000000 --- a/src_bak/components/common/ProductCard/index.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react' -import { View, Text, Image } from '@tarojs/components' -import Taro from '@tarojs/taro' -import Price from '../Price' -import { isGuest } from '@/utils/auth' -import type { ShopGoods } from '@/api/shop/shopGoods/model' - -interface ProductCardProps { - product: ShopGoods - onClick?: () => void -} - -const ProductCard: React.FC = ({ product, onClick }) => { - const handleClick = () => { - if (onClick) { - onClick() - return - } - Taro.navigateTo({ url: `/pages/shop/product-detail?id=${product.goodsId}` }) - } - - return ( - - - - - - - {product.name || product.goodsName} - - - - - {product.salePrice && product.salePrice !== product.price && ( - isGuest() ? null : ( - - ¥{product.salePrice} - - ) - )} - - {product.sales !== undefined && product.sales > 0 && ( - - 已售{product.sales} - - )} - - - - ) -} - -export default ProductCard diff --git a/src_bak/components/common/VirtualList/index.tsx b/src_bak/components/common/VirtualList/index.tsx deleted file mode 100644 index 792be17..0000000 --- a/src_bak/components/common/VirtualList/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { View, ScrollView } from '@tarojs/components'; -import { useState, useEffect, useRef, useCallback } from 'react'; - -interface VirtualListProps { - data: T[]; - itemHeight: number; - containerHeight: number; - renderItem: (item: T, index: number) => JSX.Element; - keyExtractor: (item: T, index: number) => string | number; - onEndReached?: () => void; - onEndReachedThreshold?: number; -} - -export default function VirtualList({ - data, - itemHeight, - containerHeight, - renderItem, - keyExtractor, - onEndReached, - onEndReachedThreshold = 0 -}: VirtualListProps) { - const [startIndex, setStartIndex] = useState(0); - const [endIndex, setEndIndex] = useState(Math.ceil(containerHeight / itemHeight) + 5); - const scrollViewRef = useRef(null); - - const visibleItemCount = Math.ceil(containerHeight / itemHeight) + 10; - const offsetY = startIndex * itemHeight; - - const handleScroll = useCallback((e: any) => { - const scrollTop = e.detail.scrollTop; - const newStartIndex = Math.floor(scrollTop / itemHeight); - const newEndIndex = newStartIndex + visibleItemCount; - - setStartIndex(Math.max(0, newStartIndex - 5)); - setEndIndex(Math.min(data.length, newEndIndex + 5)); - - // 触底加载 - if (onEndReached && onEndReachedThreshold > 0) { - const { scrollHeight, clientHeight } = e.detail; - if (scrollHeight - scrollTop - clientHeight < onEndReachedThreshold) { - onEndReached(); - } - } - }, [itemHeight, visibleItemCount, data.length, onEndReached, onEndReachedThreshold]); - - const visibleData = data.slice(startIndex, endIndex); - - return ( - - - - {visibleData.map((item, index) => ( - - {renderItem(item, startIndex + index)} - - ))} - - - - ); -} diff --git a/src_bak/config/app.ts b/src_bak/config/app.ts deleted file mode 100644 index 6b18c33..0000000 --- a/src_bak/config/app.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '../../config/app' diff --git a/src_bak/contexts/AppContext.tsx b/src_bak/contexts/AppContext.tsx deleted file mode 100644 index 3528475..0000000 --- a/src_bak/contexts/AppContext.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createContext, useContext } from 'react' - -export interface AppContextType { - theme: 'light' | 'dark' - toggleTheme: () => void -} - -const AppContext = createContext({ - theme: 'light', - toggleTheme: () => {} -}) - -export const useAppContext = () => useContext(AppContext) - -export default AppContext diff --git a/src_bak/contexts/CartContext.tsx b/src_bak/contexts/CartContext.tsx deleted file mode 100644 index 78639eb..0000000 --- a/src_bak/contexts/CartContext.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import React, { createContext, useContext, useState, useCallback, type ReactNode } from 'react' -import Taro from '@tarojs/taro' -import { listShopCart, addToCart, updateCartNum, removeShopCart, removeBatchShopCart, updateCartAllChecked } from '@/api/shop/shopCart' -import type { ShopGoods, ShopGoodsSku } from '@/api/shop/shopGoods/model' - -export interface CartItem { - id?: number - goodsId: number - skuId?: number - quantity: number - product?: ShopGoods - sku?: ShopGoodsSku - checked?: boolean - // 后端返回的字段 - goodsName?: string - goodsImage?: string - skuPrice?: string - skuSpec?: string - stock?: number -} - -interface CartContextType { - items: CartItem[] - totalCount: number - totalPrice: string - selectedItems: CartItem[] - selectedCount: number - selectedPrice: string - loading: boolean - refresh: () => Promise - addItem: (product: ShopGoods, sku?: ShopGoodsSku, quantity?: number) => Promise - removeItem: (goodsId: number, skuId?: number) => Promise - updateQuantity: (goodsId: number, skuId: number | undefined, quantity: number) => Promise - toggleSelect: (goodsId: number, skuId: number | undefined) => Promise - selectAll: (checked: boolean) => Promise - clearCart: () => Promise - getItemQuantity: (goodsId: number, skuId?: number) => number - // 删除选中的商品 - removeSelected: () => Promise -} - -const CartContext = createContext(undefined) - -export const CartProvider: React.FC<{ children: ReactNode }> = ({ children }) => { - const [items, setItems] = useState([]) - const [loading, setLoading] = useState(false) - - // 刷新购物车数据 - const refresh = useCallback(async () => { - setLoading(true) - try { - const data = await listShopCart() - // 防御性检查:确保返回的是数组 - const safeData = Array.isArray(data) ? data : [] - // 转换为前端格式,默认都选中 - const mappedItems: CartItem[] = safeData.map(item => ({ - id: item.id, - goodsId: item.goodsId!, - skuId: item.skuId, - quantity: item.num || 1, - goodsName: item.goodsName, - goodsImage: item.goodsImage, - skuPrice: item.skuPrice, - skuSpec: item.skuSpec, - stock: item.stock, - checked: true, - })) - setItems(mappedItems) - } catch (err) { - console.error('刷新购物车失败', err) - setItems([]) - } finally { - setLoading(false) - } - }, []) - - // 添加商品到购物车 - const addItem = useCallback(async (product: ShopGoods, sku?: ShopGoodsSku, quantity = 1) => { - try { - const params = { - goodsId: product.goodsId!, - num: quantity, - } as Record - // 只有多规格商品才传 skuId,且不能为 0 - if (sku?.id && sku.id > 0) { - params.skuId = sku.id - } - await addToCart(params) - Taro.showToast({ title: '已加入购物车', icon: 'success' }) - // 刷新购物车 - await refresh() - } catch (err: any) { - console.error('[CartContext] 添加失败:', err) - Taro.showToast({ title: err.message || '添加失败', icon: 'none' }) - throw err - } - }, [refresh]) - - // 删除商品 - const removeItem = useCallback(async (goodsId: number, skuId?: number) => { - const item = items.find(i => i.goodsId === goodsId && i.skuId === skuId) - if (!item?.id) return - - try { - await removeShopCart(item.id) - // 本地更新 - setItems(prev => prev.filter(i => !(i.goodsId === goodsId && i.skuId === skuId))) - } catch (err: any) { - Taro.showToast({ title: err.message || '删除失败', icon: 'none' }) - } - }, [items]) - - // 更新数量 - const updateQuantity = useCallback(async (goodsId: number, skuId: number | undefined, quantity: number) => { - if (quantity <= 0) { - await removeItem(goodsId, skuId) - return - } - - const item = items.find(i => i.goodsId === goodsId && i.skuId === skuId) - if (!item?.id) return - - try { - await updateCartNum({ id: item.id, num: quantity }) - // 本地更新 - setItems(prev => prev.map(i => - (i.goodsId === goodsId && i.skuId === skuId) ? { ...i, quantity } : i - )) - } catch (err: any) { - Taro.showToast({ title: err.message || '更新失败', icon: 'none' }) - } - }, [items, removeItem]) - - // 切换选中状态 - const toggleSelect = useCallback(async (goodsId: number, skuId: number | undefined) => { - const item = items.find(i => i.goodsId === goodsId && i.skuId === skuId) - if (!item || !item.id) return - - const newChecked = !item.checked - // 本地立即更新 - setItems(prev => prev.map(i => - (i.goodsId === goodsId && i.skuId === skuId) ? { ...i, checked: newChecked } : i - )) - - // 同步到后端 - try { - await updateCartChecked(item.id, newChecked) - } catch (err) { - // API失败时回滚本地状态 - setItems(prev => prev.map(i => - (i.goodsId === goodsId && i.skuId === skuId) ? { ...i, checked: !newChecked } : i - )) - console.error('更新选中状态失败', err) - } - }, [items]) - - // 全选/取消全选 - const selectAll = useCallback(async (checked: boolean) => { - // 本地立即更新 - setItems(prev => prev.map(i => ({ ...i, checked }))) - // 尝试调用API - try { - await updateCartAllChecked(checked) - } catch (err) { - // API失败时静默处理,本地状态已更新 - } - }, []) - - // 清空购物车 - const clearCart = useCallback(async () => { - try { - await removeBatchShopCart(items.map(i => i.id!).filter(Boolean)) - setItems([]) - } catch (err: any) { - Taro.showToast({ title: err.message || '清空失败', icon: 'none' }) - } - }, [items]) - - // 删除选中的商品 - const removeSelected = useCallback(async () => { - const selected = items.filter(i => i.checked && i.id) - if (selected.length === 0) return - - try { - await removeBatchShopCart(selected.map(i => i.id!)) - setItems(prev => prev.filter(i => !i.checked)) - Taro.showToast({ title: `已删除${selected.length}件商品`, icon: 'success' }) - } catch (err: any) { - Taro.showToast({ title: err.message || '删除失败', icon: 'none' }) - } - }, [items]) - - const getItemQuantity = useCallback((goodsId: number, skuId?: number): number => { - return items.find(i => i.goodsId === goodsId && i.skuId === skuId)?.quantity || 0 - }, [items]) - - const calcPrice = (list: CartItem[]) => - list.reduce((sum, i) => sum + Number(i.skuPrice || i.sku?.price || i.product?.salePrice || i.product?.price || 0) * i.quantity, 0).toFixed(2) - - const selectedItems = items.filter(i => i.checked) - const selectedCount = selectedItems.reduce((s, i) => s + i.quantity, 0) - - return ( - s + i.quantity, 0), - totalPrice: calcPrice(items), - selectedItems, - selectedCount, - selectedPrice: calcPrice(selectedItems), - loading, - refresh, - addItem, - removeItem, - updateQuantity, - toggleSelect, - selectAll, - clearCart, - getItemQuantity, - removeSelected, - }} - > - {children} - - ) -} - -export const useCartContext = (): CartContextType => { - const context = useContext(CartContext) - if (!context) throw new Error('useCartContext must be used within CartProvider') - return context -} diff --git a/src_bak/contexts/UserContext.tsx b/src_bak/contexts/UserContext.tsx deleted file mode 100644 index a4d9864..0000000 --- a/src_bak/contexts/UserContext.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import React, { createContext, useContext, useState, useEffect, type ReactNode } from 'react' -import Taro from '@tarojs/taro' -import type { User } from '@/api/system/user/model' -import { getUserInfo, loginByOpenId } from '@/api/layout' -import { saveStorageByLoginUser, clearStorageByLoginUser } from '@/utils/server' -import { TenantId } from '@/config/app' - -interface UserContextType { - user: User | null - isLoggedIn: boolean - loading: boolean - loginUser: (token: string, userInfo: User) => void - logoutUser: () => void - refreshUser: () => Promise - syncFromStorage: () => boolean -} - -const UserContext = createContext(undefined) - -export const UserProvider: React.FC<{ children: ReactNode }> = ({ children }) => { - const [user, setUser] = useState(null) - const [loading, setLoading] = useState(true) - - useEffect(() => { - const init = async () => { - const token = Taro.getStorageSync('access_token') - const userData = Taro.getStorageSync('User') - - // 情况1: 有本地token和用户数据,直接使用 - if (token && userData) { - const parsed = typeof userData === 'string' ? JSON.parse(userData) : userData - setUser(parsed as User) - setLoading(false) - return - } - - // 情况2: 有token但没有用户数据,尝试从接口获取 - if (token) { - try { - const userInfo = await getUserInfo() - setUser(userInfo) - setLoading(false) - return - } catch { - // token无效,清除并尝试静默登录 - clearStorageByLoginUser() - } - } - - // 情况3: 没有本地token,尝试静默登录(老用户自动登录) - try { - const loginResult = await new Promise<{ access_token?: string; user?: User }>((resolve, reject) => { - Taro.login({ - success: (res) => { - if (res.code) { - loginByOpenId({ code: res.code, tenantId: TenantId }) - .then(resolve) - .catch(reject) - } else { - reject(new Error('no code')) - } - }, - fail: reject, - }) - }) - // 静默登录成功(老用户),自动完成登录 - if (loginResult?.access_token && loginResult?.user) { - saveStorageByLoginUser(loginResult.access_token, loginResult.user) - setUser(loginResult.user) - } - } catch { - // 静默登录失败(非老用户或网络问题),保持未登录状态 - } - - setLoading(false) - } - init() - }, []) - - const loginUser = (token: string, userInfo: User) => { - saveStorageByLoginUser(token, userInfo) - setUser(userInfo) - } - - const logoutUser = () => { - clearStorageByLoginUser() - setUser(null) - } - - /** 从 storage 快速同步用户状态(无需网络请求),供页面 useDidShow 调用 */ - const syncFromStorage = (): boolean => { - const token = Taro.getStorageSync('access_token') - const userData = Taro.getStorageSync('User') - if (token && userData) { - const parsed = typeof userData === 'string' ? JSON.parse(userData) : userData - setUser(parsed as User) - return true - } - if (!token) { - setUser(null) - } - return false - } - - const refreshUser = async (): Promise => { - if (!Taro.getStorageSync('access_token')) return null - try { - const userInfo = await getUserInfo() - const token = Taro.getStorageSync('access_token') - if (token) { - saveStorageByLoginUser(token, userInfo) - } - setUser(userInfo) - return userInfo - } catch { - return null - } - } - - return ( - - {children} - - ) -} - -export const useUserContext = (): UserContextType => { - const context = useContext(UserContext) - if (!context) { - throw new Error('useUserContext must be used within UserProvider') - } - return context -} diff --git a/src_bak/hooks/index.ts b/src_bak/hooks/index.ts deleted file mode 100644 index 4f2ea4e..0000000 --- a/src_bak/hooks/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Context Hooks -export { useAppContext } from './useAppContext' -export { useUser } from './useUser' -export { useCartContext } from '../contexts/CartContext' - -// Theme -export { useTheme } from './useTheme' - -// Utility Hooks -export { useCountDown } from './useCountDown' -export type { CountDownResult } from './useCountDown' - -export { useCountUp } from './useCountUp' -export type { CountUpResult, CountUpOptions } from './useCountUp' - -export { useRequest } from './useRequest' -export type { - RequestState, - UseRequestOptions, - UseRequestReturn, -} from './useRequest' - -// Feature Hooks -export { useAddress } from './useAddress' -export { useCoupon } from './useCoupon' -export { usePagination } from './usePagination' -export { usePayment } from './usePayment' -export { useScrollHeight } from './useScrollHeight' diff --git a/src_bak/hooks/useAddress.ts b/src_bak/hooks/useAddress.ts deleted file mode 100644 index d408c36..0000000 --- a/src_bak/hooks/useAddress.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { useState, useCallback } from 'react' -import { - listShopUserAddress, - getShopUserAddress, - addShopUserAddress, - updateShopUserAddress, - removeShopUserAddress, - setDefaultAddress, -} from '@/api/shop/shopUserAddress' -import type { ShopUserAddress } from '@/api/shop/shopUserAddress/model' - -interface UseAddressReturn { - addresses: ShopUserAddress[] - loading: boolean - defaultAddress: ShopUserAddress | null - loadAddresses: () => Promise - getAddress: (id: number) => Promise - addAddress: (data: Partial) => Promise - updateAddress: (data: ShopUserAddress) => Promise - deleteAddress: (id: number) => Promise - setDefault: (id: number) => Promise -} - -export function useAddress(): UseAddressReturn { - const [addresses, setAddresses] = useState([]) - const [loading, setLoading] = useState(false) - - const loadAddresses = useCallback(async () => { - setLoading(true) - try { - const list = await listShopUserAddress() - // 调试日志:可看到解析后的地址数量与首项 - // eslint-disable-next-line no-console - console.log('[useAddress] loaded addresses:', Array.isArray(list) ? list.length : 0, - list && (list as any[]).length > 0 ? JSON.stringify(list[0])?.substring(0, 200) : '(empty)') - setAddresses(Array.isArray(list) ? list : []) - } catch (error: any) { - // eslint-disable-next-line no-console - console.error('[useAddress] Load addresses error:', error?.message || error) - setAddresses([]) - } finally { - setLoading(false) - } - }, []) - - /** 根据 ID 获取单个地址 */ - const getAddress = useCallback(async (id: number): Promise => { - try { - return await getShopUserAddress(id) - } catch { - return null - } - }, []) - - const addAddress = useCallback(async (data: Partial): Promise => { - try { - await addShopUserAddress(data as any) - await loadAddresses() - return true - } catch { - return false - } - }, [loadAddresses]) - - const updateAddress = useCallback(async (data: ShopUserAddress): Promise => { - try { - await updateShopUserAddress(data) - await loadAddresses() - return true - } catch { - return false - } - }, [loadAddresses]) - - const deleteAddress = useCallback(async (id: number): Promise => { - try { - await removeShopUserAddress(id) - setAddresses(prev => prev.filter(a => a.id !== id)) - return true - } catch { - return false - } - }, []) - - const setDefault = useCallback(async (id: number): Promise => { - try { - await setDefaultAddress(id) - await loadAddresses() - return true - } catch { - return false - } - }, [loadAddresses]) - - const defaultAddress = addresses.find(a => a.isDefault) || addresses[0] || null - - return { addresses, loading, defaultAddress, loadAddresses, getAddress, addAddress, updateAddress, deleteAddress, setDefault } -} diff --git a/src_bak/hooks/useAppContext.ts b/src_bak/hooks/useAppContext.ts deleted file mode 100644 index 279c7fb..0000000 --- a/src_bak/hooks/useAppContext.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from 'react' -import AppContext from '@/contexts/AppContext' - -export const useAppContext = () => { - const context = useContext(AppContext) - - if (!context) { - throw new Error('useAppContext 必须在 AppContext.Provider 内使用') - } - - return context -} diff --git a/src_bak/hooks/useCountDown.ts b/src_bak/hooks/useCountDown.ts deleted file mode 100644 index 3924c1c..0000000 --- a/src_bak/hooks/useCountDown.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { useState, useEffect, useCallback, useRef } from 'react' - -export interface CountDownResult { - /** 剩余秒数 */ - seconds: number - /** 剩余分钟 */ - minutes: number - /** 剩余小时 */ - hours: number - /** 剩余天数 */ - days: number - /** 总剩余秒数 */ - totalSeconds: number - /** 是否在运行 */ - isRunning: boolean - /** 是否已结束 */ - isExpired: boolean - /** 格式化后的字符串 */ - formatted: string - /** 暂停 */ - pause: () => void - /** 继续 */ - resume: () => void - /** 重置 */ - reset: (newTargetDate?: number) => void -} - -/** - * 倒计时 Hook - * @param targetDate 目标时间戳(毫秒),0 表示立即结束 - * @param options 配置选项 - */ -export function useCountDown( - targetDate: number, - options: { - /** 触发间隔(毫秒),默认 1000 */ - interval?: number - /** 结束时的回调 */ - onComplete?: () => void - /** 是否自动开始,默认 true */ - autoStart?: boolean - /** 格式化函数,默认返回 HH:MM:SS 或 DD天HH:MM:SS */ - format?: (result: Pick) => string - } = {} -): CountDownResult { - const { interval = 1000, onComplete, autoStart = true, format } = options - - const targetRef = useRef(targetDate) - const onCompleteRef = useRef(onComplete) - const intervalRef = useRef | null>(null) - - const [state, setState] = useState(() => calculateTimeLeft(targetDate)) - const [isRunning, setIsRunning] = useState(autoStart) - - // 更新回调引用 - useEffect(() => { - onCompleteRef.current = onComplete - }, [onComplete]) - - // 更新目标时间 - useEffect(() => { - targetRef.current = targetDate - setState(calculateTimeLeft(targetDate)) - }, [targetDate]) - - // 计算剩余时间 - function calculateTimeLeft(target: number) { - const now = Date.now() - const diff = Math.max(0, Math.floor((target - now) / 1000)) - return { - totalSeconds: diff, - days: Math.floor(diff / 86400), - hours: Math.floor((diff % 86400) / 3600), - minutes: Math.floor((diff % 3600) / 60), - seconds: diff % 60, - } - } - - // 默认格式化 - const defaultFormat = useCallback((r: Pick) => { - const pad = (n: number) => String(n).padStart(2, '0') - if (r.days > 0) { - return `${r.days}天${pad(r.hours)}:${pad(r.minutes)}:${pad(r.seconds)}` - } - return `${pad(r.hours)}:${pad(r.minutes)}:${pad(r.seconds)}` - }, []) - - // 启动定时器 - const startInterval = useCallback(() => { - if (intervalRef.current) clearInterval(intervalRef.current) - intervalRef.current = setInterval(() => { - const left = calculateTimeLeft(targetRef.current) - setState(left) - if (left.totalSeconds <= 0) { - if (intervalRef.current) clearInterval(intervalRef.current) - setIsRunning(false) - onCompleteRef.current?.() - } - }, interval) - }, [interval]) - - // 控制定时器 - useEffect(() => { - if (isRunning) { - // 立即执行一次 - const left = calculateTimeLeft(targetRef.current) - setState(left) - if (left.totalSeconds <= 0) { - setIsRunning(false) - onCompleteRef.current?.() - } else { - startInterval() - } - } else { - if (intervalRef.current) { - clearInterval(intervalRef.current) - intervalRef.current = null - } - } - return () => { - if (intervalRef.current) clearInterval(intervalRef.current) - } - }, [isRunning, startInterval]) - - const pause = useCallback(() => setIsRunning(false), []) - const resume = useCallback(() => { - if (state.totalSeconds > 0) setIsRunning(true) - }, [state.totalSeconds]) - const reset = useCallback((newTarget?: number) => { - const target = newTarget ?? targetDate - targetRef.current = target - setState(calculateTimeLeft(target)) - setIsRunning(true) - }, [targetDate]) - - return { - ...state, - isRunning, - isExpired: state.totalSeconds <= 0, - formatted: (format ?? defaultFormat)(state), - pause, - resume, - reset, - } -} diff --git a/src_bak/hooks/useCountUp.ts b/src_bak/hooks/useCountUp.ts deleted file mode 100644 index 35401ba..0000000 --- a/src_bak/hooks/useCountUp.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { useState, useEffect, useCallback, useRef } from 'react' - -export interface CountUpResult { - /** 当前秒数 */ - seconds: number - /** 当前分钟 */ - minutes: number - /** 当前小时 */ - hours: number - /** 总秒数 */ - totalSeconds: number - /** 是否在运行 */ - isRunning: boolean - /** 格式化后的字符串 */ - formatted: string - /** 暂停 */ - pause: () => void - /** 继续 */ - resume: () => void - /** 重置 */ - reset: (newStartFrom?: number) => void -} - -export interface CountUpOptions { - /** 起始值(秒),默认 0 */ - startFrom?: number - /** 触发间隔(毫秒),默认 1000 */ - interval?: number - /** 最大值,超出后停止 */ - maxValue?: number - /** 格式化函数 */ - format?: (result: Pick) => string -} - -/** - * 正向计时 Hook - * @param options 配置选项 - */ -export function useCountUp(options: CountUpOptions = {}): CountUpResult { - const { startFrom = 0, interval = 1000, maxValue, format } = options - - const startRef = useRef(startFrom) - const maxRef = useRef(maxValue) - const intervalRef = useRef | null>(null) - - const [totalSeconds, setTotalSeconds] = useState(startFrom) - const [isRunning, setIsRunning] = useState(false) - - // 计算时分秒 - const calcTime = useCallback((total: number) => ({ - totalSeconds: total, - hours: Math.floor(total / 3600), - minutes: Math.floor((total % 3600) / 60), - seconds: total % 60, - }), []) - - const [time, setTime] = useState(() => calcTime(startFrom)) - - // 默认格式化 - const defaultFormat = useCallback((r: Pick) => { - const pad = (n: number) => String(n).padStart(2, '0') - return `${pad(r.hours)}:${pad(r.minutes)}:${pad(r.seconds)}` - }, []) - - const startInterval = useCallback(() => { - if (intervalRef.current) clearInterval(intervalRef.current) - intervalRef.current = setInterval(() => { - setTotalSeconds(prev => { - const next = prev + Math.floor(interval / 1000) - const max = maxRef.current - if (max !== undefined && next >= max) { - if (intervalRef.current) clearInterval(intervalRef.current) - setIsRunning(false) - return max - } - return next - }) - }, interval) - }, [interval]) - - // 更新 refs - useEffect(() => { - startRef.current = startFrom - setTotalSeconds(startFrom) - setTime(calcTime(startFrom)) - }, [startFrom, calcTime]) - - useEffect(() => { - maxRef.current = maxValue - }, [maxValue]) - - // 同步 totalSeconds 到 time - useEffect(() => { - setTime(calcTime(totalSeconds)) - }, [totalSeconds, calcTime]) - - // 控制定时器 - useEffect(() => { - if (isRunning) { - startInterval() - } else { - if (intervalRef.current) { - clearInterval(intervalRef.current) - intervalRef.current = null - } - } - return () => { - if (intervalRef.current) clearInterval(intervalRef.current) - } - }, [isRunning, startInterval]) - - const pause = useCallback(() => setIsRunning(false), []) - const resume = useCallback(() => setIsRunning(true), []) - const reset = useCallback((newStart?: number) => { - const start = newStart ?? startFrom - startRef.current = start - setTotalSeconds(start) - setTime(calcTime(start)) - setIsRunning(true) - }, [startFrom, calcTime]) - - return { - ...time, - isRunning, - formatted: (format ?? defaultFormat)(time), - pause, - resume, - reset, - } -} diff --git a/src_bak/hooks/useCoupon.ts b/src_bak/hooks/useCoupon.ts deleted file mode 100644 index f927293..0000000 --- a/src_bak/hooks/useCoupon.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { useState, useCallback } from 'react' -import { - listShopUserCoupon, - pageShopUserCoupon, - removeShopUserCoupon, - getMyAvailableCoupons, - getMyUsedCoupons, - getMyExpiredCoupons, -} from '@/api/shop/shopUserCoupon' -import type { ShopUserCoupon } from '@/api/shop/shopUserCoupon/model' - -export type CouponTab = 'available' | 'used' | 'expired' - -interface UseCouponReturn { - coupons: ShopUserCoupon[] - loading: boolean - tab: CouponTab - setTab: (tab: CouponTab) => void - loadCoupons: () => Promise - deleteCoupon: (id: string) => Promise -} - -export function useCoupon(): UseCouponReturn { - const [coupons, setCoupons] = useState([]) - const [loading, setLoading] = useState(false) - const [tab, setTab] = useState('available') - - const loadCoupons = useCallback(async () => { - setLoading(true) - try { - let list: ShopUserCoupon[] = [] - switch (tab) { - case 'available': - list = await getMyAvailableCoupons() - break - case 'used': - list = await getMyUsedCoupons() - break - case 'expired': - list = await getMyExpiredCoupons() - break - } - setCoupons(list || []) - } catch (error) { - console.error('Load coupons error:', error) - } finally { - setLoading(false) - } - }, [tab]) - - const deleteCoupon = useCallback(async (id: string): Promise => { - try { - await removeShopUserCoupon(Number(id)) - setCoupons(prev => prev.filter(c => c.id !== id)) - return true - } catch { - return false - } - }, []) - - return { coupons, loading, tab, setTab, loadCoupons, deleteCoupon } -} - -// 获取优惠券类型文本 -export function getCouponTypeText(type?: number): string { - switch (type) { - case 10: return '满减券' - case 20: return '折扣券' - case 30: return '免费券' - case 40: return '无门槛券' - case 50: return '场地使用券' - default: return '优惠券' - } -} - -// 获取优惠券状态文本 -export function getCouponStatusText(coupon: ShopUserCoupon): string { - if (coupon.status === 1) return '已使用' - if (coupon.status === 2 || coupon.isExpire === 1) return '已过期' - return '未使用' -} - -// 格式化优惠券金额 -export function formatCouponValue(coupon: ShopUserCoupon): string { - switch (coupon.type) { - case 20: - // 折扣券 - return `${coupon.discount || 0}折` - case 40: - // 无门槛券 - return `¥${coupon.reducePrice || '0'}` - case 50: - // 场地使用券 - return coupon.useCount && coupon.useCount > 0 ? `${coupon.useCount}次` : '不限次' - default: - // 满减券/免费券 - return `¥${coupon.reducePrice || '0'}` - } -} - -// 检查优惠券是否即将过期(3天内) -export function isExpiringSoon(coupon: ShopUserCoupon): boolean { - return coupon.isExpiringSoon === true || (coupon.daysRemaining !== undefined && coupon.daysRemaining <= 3) -} diff --git a/src_bak/hooks/usePagination.ts b/src_bak/hooks/usePagination.ts deleted file mode 100644 index d004e1d..0000000 --- a/src_bak/hooks/usePagination.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { useState, useCallback } from 'react' -import type { PageParam, PageResult } from '@/api/index' - -interface UsePaginationOptions { - api: (params: PageParam) => Promise> - defaultParams?: Partial - pageSize?: number - immediate?: boolean -} - -interface UsePaginationReturn { - list: T[] - loading: boolean - refreshing: boolean - loadingMore: boolean - finished: boolean - total: number - params: PageParam - run: (extraParams?: Record) => Promise - refresh: () => Promise - loadMore: () => Promise - reset: () => void - setParams: (params: Partial) => void -} - -export function usePagination(options: UsePaginationOptions): UsePaginationReturn { - const { api, defaultParams = {}, pageSize = 10, immediate = false } = options - - const [list, setList] = useState([]) - const [loading, setLoading] = useState(false) - const [refreshing, setRefreshing] = useState(false) - const [loadingMore, setLoadingMore] = useState(false) - const [finished, setFinished] = useState(false) - const [total, setTotal] = useState(0) - const [params, setParamsState] = useState({ - page: 1, - limit: pageSize, - ...defaultParams, - }) - - const setParams = (newParams: Partial) => { - setParamsState(prev => ({ ...prev, ...newParams })) - } - - const fetchData = useCallback(async (page: number, extraParams?: Record) => { - const result = await api({ ...params, ...extraParams, page, limit: pageSize }) - setList(result?.list || []) - setTotal(result?.count || 0) - setFinished((result?.list || []).length < pageSize) - return result - }, [api, params, pageSize]) - - const run = useCallback(async (extraParams?: Record) => { - setLoading(true) - try { - await fetchData(1, extraParams) - setParamsState(prev => ({ ...prev, page: 1 })) - } catch (error) { - console.error('Pagination run error:', error) - } finally { - setLoading(false) - } - }, [fetchData]) - - const refresh = useCallback(async () => { - if (refreshing) return - setRefreshing(true) - setFinished(false) - try { - await fetchData(1) - setParamsState(prev => ({ ...prev, page: 1 })) - } catch (error) { - console.error('Refresh error:', error) - } finally { - setRefreshing(false) - } - }, [fetchData, refreshing]) - - const loadMore = useCallback(async () => { - if (loadingMore || finished) return - setLoadingMore(true) - try { - const nextPage = (params.page || 1) + 1 - const result = await api({ ...params, page: nextPage, limit: pageSize }) - const newList = result?.list || [] - setList(prev => [...prev, ...newList]) - setTotal(result?.count || 0) - setFinished(newList.length < pageSize) - setParamsState(prev => ({ ...prev, page: nextPage })) - } catch (error) { - console.error('LoadMore error:', error) - } finally { - setLoadingMore(false) - } - }, [api, params, pageSize, loadingMore, finished]) - - const reset = useCallback(() => { - setList([]) - setFinished(false) - setTotal(0) - setParamsState(prev => ({ ...prev, page: 1 })) - }, []) - - // 立即执行 - if (immediate && list.length === 0 && !loading && !refreshing) { - run() - } - - return { list, loading, refreshing, loadingMore, finished, total, params, run, refresh, loadMore, reset, setParams } -} diff --git a/src_bak/hooks/usePayment.ts b/src_bak/hooks/usePayment.ts deleted file mode 100644 index 6c90aab..0000000 --- a/src_bak/hooks/usePayment.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { useState, useCallback } from 'react' -import Taro from '@tarojs/taro' - -interface UsePaymentOptions { - onSuccess?: (orderNo: string) => void - onFail?: (error: any) => void -} - -interface UsePaymentReturn { - loading: boolean - error: string | null - requestPayment: (payParams: { - timeStamp: string - nonceStr: string - package: string - signType: string - paySign: string - orderNo?: string - }) => Promise - createAndPay: (createOrderFn: () => Promise) => Promise -} - -export function usePayment(options: UsePaymentOptions = {}): UsePaymentReturn { - const { onSuccess, onFail } = options - const [loading, setLoading] = useState(false) - const [error, setError] = useState(null) - - const requestPayment = useCallback(async (payParams: { - timeStamp: string - nonceStr: string - package: string - signType: string - paySign: string - orderNo?: string - }): Promise => { - setLoading(true) - setError(null) - try { - await Taro.requestPayment({ - timeStamp: payParams.timeStamp, - nonceStr: payParams.nonceStr, - package: payParams.package, - signType: payParams.signType as any, - paySign: payParams.paySign, - }) - payParams.orderNo && onSuccess?.(payParams.orderNo) - return true - } catch (err: any) { - if (err.errMsg?.includes('cancel')) { - setError('支付已取消') - } else { - setError(err.errMsg || '支付失败') - onFail?.(err) - } - return false - } finally { - setLoading(false) - } - }, [onSuccess, onFail]) - - const createAndPay = useCallback(async (createOrderFn: () => Promise): Promise => { - setLoading(true) - setError(null) - try { - const result = await createOrderFn() - return await requestPayment(result) - } catch (err: any) { - setError(err.message || '创建订单失败') - onFail?.(err) - return false - } finally { - setLoading(false) - } - }, [requestPayment, onFail]) - - return { loading, error, requestPayment, createAndPay } -} diff --git a/src_bak/hooks/useRequest.ts b/src_bak/hooks/useRequest.ts deleted file mode 100644 index d3866b3..0000000 --- a/src_bak/hooks/useRequest.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { useState, useEffect, useCallback, useRef } from 'react' - -/** 简易 AbortSignal 替代(兼容小程序环境) */ -class SimpleAbortSignal { - private _aborted = false - get aborted() { return this._aborted } - abort() { this._aborted = true } -} -class SimpleAbortController { - signal = new SimpleAbortSignal() - abort() { this.signal.abort() } -} - -export interface RequestState { - /** 请求结果数据 */ - data: T | null - /** 是否加载中 */ - loading: boolean - /** 错误信息 */ - error: Error | null - /** 是否首次加载完成(不管成功或失败) */ - initialized: boolean -} - -export interface UseRequestOptions { - /** 手动触发模式下需要调用 run 执行 */ - manual?: boolean - /** 初始数据 */ - defaultData?: T - /** 请求函数 */ - service?: (...args: P) => Promise - /** 成功回调 */ - onSuccess?: (data: T, params: P) => void - /** 失败回调 */ - onError?: (error: Error, params: P) => void - /** 轮询间隔(毫秒),设置后自动轮询 */ - pollingInterval?: number - /** 轮询在页面隐藏时暂停,默认 true */ - pollingWhenHidden?: boolean - /** 防抖延迟(毫秒) */ - debounceInterval?: number - /** 依赖变化时自动重新请求 */ - refreshDeps?: unknown[] - /** 请求节流间隔(毫秒) */ - throttleInterval?: number - /** 缓存 key,相同 key 的请求结果会被缓存 */ - cacheKey?: string - /** 缓存有效期(毫秒) */ - cacheTime?: number - /** 重新请求尝试次数 */ - retryCount?: number - /** 重试延迟(毫秒),默认 1000 */ - retryInterval?: number -} - -export interface UseRequestReturn { - /** 当前状态 */ - state: RequestState - /** 请求结果数据(state.data 的快捷访问) */ - data: T | null - /** 是否加载中(state.loading 的快捷访问) */ - loading: boolean - /** 错误信息(state.error 的快捷访问) */ - error: Error | null - /** 是否首次加载完成(state.initialized 的快捷访问) */ - initialized: boolean - /** 触发请求(manual 模式下) */ - run: (...params: P) => Promise - /** 带 loading 的运行 */ - runLoading: (...params: P) => Promise - /** 取消请求 */ - cancel: () => void - /** 刷新(使用上次参数) */ - refresh: () => void - /** 修改 data(不发起请求) */ - mutate: (data: T | ((prev: T | null) => T)) => void - /** 当前参数 */ - params: P -} - -// 简单缓存 -const cache = new Map() - -function getCache(key: string): T | null { - const item = cache.get(key) - if (!item) return null - if (Date.now() > item.expireAt) { - cache.delete(key) - return null - } - return item.data as T -} - -function setCache(key: string, data: T, cacheTime: number) { - cache.set(key, { data, expireAt: Date.now() + cacheTime }) -} - -/** - * 请求封装 Hook - * @param service 请求函数 - * @param options 配置选项 - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function useRequest( - service: (...args: P) => Promise, - options: UseRequestOptions = {} -): UseRequestReturn - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function useRequest( - service: undefined, - options: UseRequestOptions = {} -): UseRequestReturn - -export function useRequest( - service: ((...args: P) => Promise) | undefined, - options: UseRequestOptions = {} -): UseRequestReturn { - const { - manual = false, - defaultData, - onSuccess, - onError, - pollingInterval, - pollingWhenHidden = true, - debounceInterval, - refreshDeps = [], - throttleInterval, - cacheKey, - cacheTime = 5 * 60 * 1000, - retryCount = 0, - retryInterval = 1000, - } = options - - const [state, setState] = useState>({ - data: defaultData ?? null, - loading: false, - error: null, - initialized: !!defaultData, - }) - - const [params, setParams] = useState

([] as unknown as P) - - const serviceRef = useRef(service) - const onSuccessRef = useRef(onSuccess) - const onErrorRef = useRef(onError) - const pollingTimerRef = useRef | null>(null) - const abortControllerRef = useRef(null) - const isMountedRef = useRef(true) - const debounceTimerRef = useRef | null>(null) - const throttleLastRunRef = useRef(0) - - // 更新 refs - useEffect(() => { - serviceRef.current = service - }, [service]) - useEffect(() => { onSuccessRef.current = onSuccess }, [onSuccess]) - useEffect(() => { onErrorRef.current = onError }, [onError]) - - // 清理 - useEffect(() => { - isMountedRef.current = true - return () => { - isMountedRef.current = false - if (pollingTimerRef.current) clearInterval(pollingTimerRef.current) - if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current) - abortControllerRef.current?.abort() - } - }, []) - - // 页面可见性处理(使用 Taro 生命周期,兼容小程序环境) - useEffect(() => { - if (!pollingInterval || !pollingWhenHidden) return - // 在小程序中,Taro.useDidShow / useDidHide 仅可在页面组件中使用 - // useRequest 作为通用 hook 无法直接使用这些,因此跳过 - // 如需轮询暂停/恢复能力,可在页面组件中手动调用 cancel / refresh - }, [pollingInterval, pollingWhenHidden]) - - // 依赖刷新 - 使用 useRef 避免闭包过期 - const refreshDepsRef = useRef(refreshDeps) - refreshDepsRef.current = refreshDeps - - useEffect(() => { - if (!manual && refreshDepsRef.current.length > 0) { - refresh() - } - }, [...refreshDeps]) // eslint-disable-line - - const run = useCallback(async (...p: P): Promise => { - // 防抖 - if (debounceInterval) { - if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current) - return new Promise((resolve) => { - debounceTimerRef.current = setTimeout(async () => { - const result = await doRequest(...p) - resolve(result) - }, debounceInterval) - }) - } - - // 节流 - if (throttleInterval) { - const now = Date.now() - if (now - throttleLastRunRef.current < throttleInterval) { - return - } - throttleLastRunRef.current = now - } - - return doRequest(...p) - }, [debounceInterval, throttleInterval]) // eslint-disable-line - - const doRequest = useCallback(async (...p: P): Promise => { - if (!serviceRef.current) return - - setParams(p) - abortControllerRef.current?.abort() - abortControllerRef.current = new SimpleAbortController() - - // 检查缓存 - if (cacheKey) { - const cached = getCache(cacheKey) - if (cached !== null) { - setState({ data: cached, loading: false, error: null, initialized: true }) - return cached - } - } - - setState(prev => ({ ...prev, loading: true, error: null })) - - try { - let result!: T - let attempt = 0 - const maxAttempts = retryCount + 1 - - while (attempt < maxAttempts) { - try { - result = await serviceRef.current(...p) - break - } catch (err: unknown) { - attempt++ - const isAbortError = err instanceof Error && err.message.includes('abort') - if (attempt >= maxAttempts || isAbortError) { - throw err - } - await new Promise(r => setTimeout(r, retryInterval * attempt)) - } - } - - if (!isMountedRef.current) return - - // 缓存 - if (cacheKey) { - setCache(cacheKey, result, cacheTime) - } - - setState({ data: result, loading: false, error: null, initialized: true }) - onSuccessRef.current?.(result, p) - - // 轮询 - if (pollingInterval && !pollingTimerRef.current) { - pollingTimerRef.current = setInterval(() => { - doRequest(...p) - }, pollingInterval) - } - - return result - } catch (err: unknown) { - if (!isMountedRef.current) return - const error = err instanceof Error ? err : new Error(String(err)) - setState({ data: null, loading: false, error, initialized: true }) - onErrorRef.current?.(error, p) - return undefined - } - }, [cacheKey, cacheTime, pollingInterval, pollingWhenHidden, retryCount, retryInterval]) // eslint-disable-line - - const runLoading = useCallback(async (...p: P) => { - if (!serviceRef.current) return - setParams(p) - return doRequest(...p) - }, [doRequest]) - - const cancel = useCallback(() => { - if (pollingTimerRef.current) { - clearInterval(pollingTimerRef.current) - pollingTimerRef.current = null - } - abortControllerRef.current?.abort() - setState(prev => ({ ...prev, loading: false })) - }, []) - - const refresh = useCallback(() => { - if (params.length > 0) { - run(...params) - } - }, [params, run]) - - const mutate = useCallback((data: T | ((prev: T | null) => T)) => { - setState(prev => ({ - ...prev, - data: typeof data === 'function' ? (data as (prev: T | null) => T)(prev.data) : data, - })) - }, []) - - // 自动执行 - useEffect(() => { - if (!manual && service) { - run(...([] as unknown as P)) - } - }, []) // eslint-disable-line - - return { - state, - data: state.data, - loading: state.loading, - error: state.error, - initialized: state.initialized, - run, - runLoading, - cancel, - refresh, - mutate, - params, - } -} diff --git a/src_bak/hooks/useScrollHeight.ts b/src_bak/hooks/useScrollHeight.ts deleted file mode 100644 index 1dd2274..0000000 --- a/src_bak/hooks/useScrollHeight.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useState, useEffect } from 'react' -import Taro from '@tarojs/taro' - -/** - * 获取可滚动区域高度,替代 calc(100vh - Npx) - * 小程序不支持 vh/vw 单位,此 hook 动态计算可用高度 - * @param minus 需要减去的高度(rpx 或 px),默认 0 - */ -export function useScrollHeight(minus: number = 0) { - const [height, setHeight] = useState('100vh') - - useEffect(() => { - try { - const systemInfo = Taro.getSystemInfoSync() - // windowHeight 已经减去了导航栏等系统 UI - const available = systemInfo.windowHeight - minus - setHeight(`${available}px`) - } catch { - setHeight('100vh') - } - }, [minus]) - - return height -} diff --git a/src_bak/hooks/useTheme.ts b/src_bak/hooks/useTheme.ts deleted file mode 100644 index d128779..0000000 --- a/src_bak/hooks/useTheme.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useContext } from 'react' -import AppContext from '@/contexts/AppContext' - -export interface ThemeConfig { - /** 当前主题 */ - theme: 'light' | 'dark' - /** 是否为深色模式 */ - isDark: boolean - /** 是否为浅色模式 */ - isLight: boolean - /** 切换主题 */ - toggleTheme: () => void - /** 设置为浅色主题 */ - setLight: () => void - /** 设置为深色主题 */ - setDark: () => void -} - -/** - * 主题 Hook - * 从 AppContext 获取主题状态和切换函数 - */ -export const useTheme = (): ThemeConfig => { - const { theme, toggleTheme } = useContext(AppContext) - - const setLight = () => { - if (theme !== 'light') toggleTheme() - } - - const setDark = () => { - if (theme !== 'dark') toggleTheme() - } - - return { - theme, - isDark: theme === 'dark', - isLight: theme === 'light', - toggleTheme, - setLight, - setDark, - } -} diff --git a/src_bak/hooks/useUser.ts b/src_bak/hooks/useUser.ts deleted file mode 100644 index c91c2ea..0000000 --- a/src_bak/hooks/useUser.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { useUserContext } from '@/contexts/UserContext' -import { useEffect, useState } from 'react' -import Taro from '@tarojs/taro' -import type { User } from '@/api/system/user/model' -import { loginByOpenId } from '@/api/layout' -import { TenantId } from '@/config/app' - -/** - * useUser - 兼容性 Hook - * 优先使用 UserContext,在未包裹 UserProvider 时降级为本地状态 - */ -export const useUser = () => { - try { - const ctx = useUserContext() - return ctx - } catch { - // 未在 UserProvider 中,使用降级逻辑 - return useUserFallback() - } -} - -/** 降级方案:不依赖 Context 的本地用户状态 */ -const useUserFallback = () => { - const [user, setUser] = useState(null) - const [loading, setLoading] = useState(true) - - const loadFromStorage = () => { - const token = Taro.getStorageSync('access_token') - const userData = Taro.getStorageSync('User') - if (token && userData) { - const parsed = typeof userData === 'string' ? JSON.parse(userData) : userData - setUser(parsed as User) - return true - } - return !!token - } - - const loginUser = (token: string, userInfo: User) => { - Taro.setStorageSync('access_token', token) - Taro.setStorageSync('User', userInfo) - setUser(userInfo) - } - - const logoutUser = () => { - Taro.removeStorageSync('access_token') - Taro.removeStorageSync('User') - setUser(null) - } - - const refreshUser = async () => { - // 降级方案不自动刷新 - return user - } - - const syncFromStorage = (): boolean => { - return loadFromStorage() - } - - useEffect(() => { - const init = async () => { - const hasLocal = loadFromStorage() - if (!hasLocal) { - try { - const data = await new Promise((resolve, reject) => { - Taro.login({ - success: (res) => loginByOpenId({ code: res.code, tenantId: TenantId }).then(resolve).catch(reject), - fail: reject, - }) - }) - if (data?.access_token && data?.user) { - loginUser(data.access_token, data.user) - } - } catch { /* ignore */ } - } - setLoading(false) - } - init() - }, []) - - return { user, isLoggedIn: !!user, loading, loginUser, logoutUser, refreshUser, syncFromStorage } -} diff --git a/src_bak/index.html b/src_bak/index.html deleted file mode 100644 index c1d7b6c..0000000 --- a/src_bak/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Paopao Taro - <% if (typeof script !== 'undefined' && script) { %><% } %> - - -

- - diff --git a/src_bak/pages/activity/detail/index.config.ts b/src_bak/pages/activity/detail/index.config.ts deleted file mode 100644 index 2fd54bd..0000000 --- a/src_bak/pages/activity/detail/index.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default { - navigationBarTitleText: '活动详情', -} diff --git a/src_bak/pages/activity/detail/index.tsx b/src_bak/pages/activity/detail/index.tsx deleted file mode 100644 index 9b0c765..0000000 --- a/src_bak/pages/activity/detail/index.tsx +++ /dev/null @@ -1,245 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { View, Text, ScrollView, Image } from '@tarojs/components' -import Taro from '@tarojs/taro' -import { getShopActivity, signUpActivity, cancelSignUpActivity, getSignUpStatus } from '@/api/shop/shopActivity' -import type { ShopActivity, ActivityStatus } from '@/api/shop/shopActivity/model' - -definePageConfig({ - navigationBarTitleText: '活动详情', -}) - -const ActivityDetailPage: React.FC = () => { - const { id } = Taro.getCurrentInstance().router?.params || {} - const [activity, setActivity] = useState(null) - const [loading, setLoading] = useState(true) - const [signedUp, setSignedUp] = useState(false) - const [submitting, setSubmitting] = useState(false) - - useEffect(() => { - if (id) { - fetchDetail(Number(id)) - fetchSignUpStatus(Number(id)) - } - }, [id]) - - const fetchDetail = async (activityId: number) => { - try { - const data = await getShopActivity(activityId) - setActivity(data) - } catch (err: any) { - Taro.showToast({ title: err.message || '加载失败', icon: 'none' }) - } finally { - setLoading(false) - } - } - - const fetchSignUpStatus = async (activityId: number) => { - try { - const res = await getSignUpStatus(activityId) - setSignedUp(res.signedUp) - } catch { - // 未登录或接口不可用时忽略 - } - } - - // 报名活动 - const handleSignUp = () => { - if (!activity) return - Taro.showModal({ - title: '确认报名', - content: '确定报名参加该活动吗?', - confirmColor: '#0e932e', - success: async (res) => { - if (res.confirm) { - setSubmitting(true) - try { - await signUpActivity({ activityId: activity.id, userId: 0 }) - setSignedUp(true) - setActivity(prev => prev ? { ...prev, participants: prev.participants + 1 } : prev) - Taro.showToast({ title: '报名成功', icon: 'success' }) - } catch (err: any) { - Taro.showToast({ title: err.message || '报名失败', icon: 'none' }) - } finally { - setSubmitting(false) - } - } - } - }) - } - - // 取消报名 - const handleCancelSignUp = () => { - if (!activity) return - Taro.showModal({ - title: '取消报名', - content: '确定取消报名吗?', - confirmColor: '#ef4444', - success: async (res) => { - if (res.confirm) { - setSubmitting(true) - try { - await cancelSignUpActivity(activity.id) - setSignedUp(false) - setActivity(prev => prev ? { ...prev, participants: Math.max(0, prev.participants - 1) } : prev) - Taro.showToast({ title: '已取消报名', icon: 'success' }) - } catch (err: any) { - Taro.showToast({ title: err.message || '取消失败', icon: 'none' }) - } finally { - setSubmitting(false) - } - } - } - }) - } - - // 分享活动 - const handleShare = () => { - Taro.showToast({ title: '分享功能开发中', icon: 'none' }) - } - - // 获取状态标签 - const getStatusLabel = (status: ActivityStatus) => { - const map: Record = { - upcoming: { label: '未开始', color: 'text-blue-500' }, - ongoing: { label: '进行中', color: 'text-green-500' }, - ended: { label: '已结束', color: 'text-gray-400' }, - cancelled: { label: '已取消', color: 'text-gray-400' }, - } - return map[status] || { label: '未知', color: 'text-gray-400' } - } - - // 格式化时间 - const formatTime = (timeStr: string) => { - const date = new Date(timeStr) - return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}` - } - - if (loading) { - return ( - - 加载中... - - ) - } - - if (!activity) { - return ( - - 活动不存在 - - ) - } - - const statusInfo = getStatusLabel(activity.status) - - return ( - - - {/* 活动头图 */} - {activity.image ? ( - - ) : ( - - 🎉 - - )} - - {/* 活动信息 */} - - - {activity.name} - - {statusInfo.label} - - - - - - 📅 - {formatTime(activity.startTime)} - - - 👥 - {activity.participants}人参与 - - {activity.maxParticipants && ( - - 🔢 - 限{activity.maxParticipants}人 - - )} - - - - {activity.typeName || activity.type} - {activity.description.split('\n')[0]} - - - - {/* 活动详情 */} - - 活动详情 - - {activity.description} - - - - {/* 活动规则 */} - {activity.rules && ( - - 活动规则 - - {activity.rules} - - - )} - - - - - {/* 底部操作栏 */} - - - 分享 - - - {activity.status === 'ongoing' && !signedUp && ( - - {submitting ? '处理中...' : '立即报名'} - - )} - - {activity.status === 'ongoing' && signedUp && ( - - {submitting ? '处理中...' : '取消报名'} - - )} - - {activity.status === 'upcoming' && ( - - 即将开始 - - )} - - {(activity.status === 'ended' || activity.status === 'cancelled') && ( - - 已结束 - - )} - - - ) -} - -export default ActivityDetailPage diff --git a/src_bak/pages/activity/list/index.config.ts b/src_bak/pages/activity/list/index.config.ts deleted file mode 100644 index 6b10e16..0000000 --- a/src_bak/pages/activity/list/index.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default { - navigationBarTitleText: '活动列表', -} diff --git a/src_bak/pages/activity/list/index.tsx b/src_bak/pages/activity/list/index.tsx deleted file mode 100644 index c6e4efe..0000000 --- a/src_bak/pages/activity/list/index.tsx +++ /dev/null @@ -1,220 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { View, Text, ScrollView } from '@tarojs/components' -import Taro from '@tarojs/taro' -import { pageShopActivity, signUpActivity } from '@/api/shop/shopActivity' -import type { ShopActivity, ActivityStatus, ActivityType } from '@/api/shop/shopActivity' -import EmptyState from '@/components/common/EmptyState' -import LoadMore from '@/components/common/LoadMore' - -definePageConfig({ - navigationBarTitleText: '活动列表', -}) - -const ActivityListPage: React.FC = () => { - const [activeTab, setActiveTab] = useState(0) - const [activities, setActivities] = useState([]) - const [loading, setLoading] = useState(false) - const [finished, setFinished] = useState(false) - const [page, setPage] = useState(1) - - useEffect(() => { - setActivities([]) - setPage(1) - setFinished(false) - loadList(1) - }, [activeTab]) - - const loadList = async (p: number) => { - if (loading) return - setLoading(true) - - try { - // 根据 tab 筛选状态 - let status: ActivityStatus | undefined - if (activeTab === 1) status = 'ongoing' - else if (activeTab === 2) status = 'upcoming' - else if (activeTab === 3) status = 'ended' - - const res = await pageShopActivity({ - page: p, - limit: 10, - status, - }) - - if (res?.list) { - if (p === 1) { - setActivities(res.list) - } else { - setActivities(prev => [...prev, ...res.list]) - } - setFinished(res.list.length < 10) - setPage(p) - } - } catch (err) { - console.error('加载活动列表失败', err) - Taro.showToast({ title: '加载失败', icon: 'none' }) - } finally { - setLoading(false) - } - } - - // 加载更多 - const handleLoadMore = () => { - if (!finished && !loading) { - loadList(page + 1) - } - } - - // 报名活动 - const handleSignUp = async (id: number) => { - Taro.showModal({ - title: '确认报名', - content: '确定报名参加该活动吗?', - confirmColor: '#0e932e', - success: async (res) => { - if (res.confirm) { - try { - await signUpActivity({ activityId: id, userId: 0 }) - Taro.showToast({ title: '报名成功', icon: 'success' }) - } catch (err) { - console.error('报名失败', err) - Taro.showToast({ title: '报名失败', icon: 'none' }) - } - } - } - }) - } - - // 获取状态标签 - const getStatusLabel = (status: ActivityStatus) => { - const map: Record = { - 'upcoming': { label: '未开始', color: 'text-blue-500' }, - 'ongoing': { label: '进行中', color: 'text-green-500' }, - 'ended': { label: '已结束', color: 'text-gray-400' }, - 'cancelled': { label: '已取消', color: 'text-gray-400' }, - } - return map[status] || { label: '未知', color: 'text-gray-400' } - } - - // 获取活动类型名称 - const getTypeLabel = (type: ActivityType) => { - const map: Record = { - 'discount': '限时折扣', - 'full_reduction': '满减活动', - 'seckill': '秒杀活动', - 'group_buy': '团购活动', - 'flash_sale': '闪购活动', - } - return map[type] || '其他' - } - - // 格式化时间 - const formatTime = (timeStr: string) => { - const date = new Date(timeStr) - const month = (date.getMonth() + 1).toString().padStart(2, '0') - const day = date.getDate().toString().padStart(2, '0') - const hour = date.getHours().toString().padStart(2, '0') - const minute = date.getMinutes().toString().padStart(2, '0') - return `${month}-${day} ${hour}:${minute}` - } - - return ( - - {/* Tab 栏 */} - - {['全部', '进行中', '未开始', '已结束'].map((tab, index) => ( - setActiveTab(index)} - > - {tab} - {activeTab === index && ( - - )} - - ))} - - - {/* 活动列表 */} - - - {activities.length === 0 && !loading ? ( - - ) : ( - activities.map(activity => ( - (() => { - const statusInfo = getStatusLabel(activity.status) - return ( - Taro.navigateTo({ url: `/pages/activity/detail/index?id=${activity.id}` })}> - {/* 活动图片 */} - - 🎉 - - - {/* 活动信息 */} - - - {activity.name} - - {statusInfo.label} - - - {activity.description} - - - - 📅 - {formatTime(activity.startTime)} - - - 👥 - {activity.participants}人参与 - - - - - {/* 活动类型标签 */} - - - {getTypeLabel(activity.type)} - - - {activity.status === 'ongoing' && ( - handleSignUp(activity.id)} - > - 立即报名 - - )} - {activity.status === 'upcoming' && ( - Taro.navigateTo({ url: `/pages/activity/detail/index?id=${activity.id}` })} - > - 查看详情 - - )} - - - ) - })() - )) - )} - - - - - - ) -} - -export default ActivityListPage diff --git a/src_bak/pages/after-sale/apply/index.config.ts b/src_bak/pages/after-sale/apply/index.config.ts deleted file mode 100644 index 716b532..0000000 --- a/src_bak/pages/after-sale/apply/index.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default { - navigationBarTitleText: '申请售后', -} diff --git a/src_bak/pages/after-sale/apply/index.tsx b/src_bak/pages/after-sale/apply/index.tsx deleted file mode 100644 index 593e9f4..0000000 --- a/src_bak/pages/after-sale/apply/index.tsx +++ /dev/null @@ -1,251 +0,0 @@ -import React, { useState } from 'react' -import { View, Text, Textarea, ScrollView, Radio, RadioGroup, Checkbox, Input } from '@tarojs/components' -import Taro from '@tarojs/taro' -import { applyAfterSale } from '@/api/shop/shopAfterSale' -import type { AfterSaleType } from '@/api/shop/shopAfterSale' - -definePageConfig({ - navigationBarTitleText: '申请售后', -}) - -const AfterSaleApplyPage: React.FC = () => { - const params = Taro.getCurrentInstance().router?.params || {} - const orderId = params.orderId || '' - const [orderGoods, setOrderGoods] = useState>([]) - const [saleType, setSaleType] = useState(1) // 1:退款, 2:退货退款, 3:换货 - const [submitting, setSubmitting] = useState(false) - const [reason, setReason] = useState('') - const [amount, setAmount] = useState('') - const [description, setDescription] = useState('') - const [images, setImages] = useState([]) - - // 退款原因选项 - const refundReasons = ['商品质量问题', '商品与描述不符', '商品破损/缺陷', '物流问题', '其他'] - const returnReasons = ['商品质量问题', '商品与描述不符', '商品破损/缺陷', '尺码/颜色不合适', '不喜欢/不想要', '其他'] - const exchangeReasons = ['商品质量问题', '商品与描述不符', '商品破损/缺陷', '尺码/颜色不合适', '其他'] - - // 获取当前原因列表 - const getCurrentReasons = () => { - if (saleType === 1) return refundReasons - if (saleType === 2) return returnReasons - return exchangeReasons - } - - // 处理商品选择 - const handleGoodsCheck = (id: number) => { - setOrderGoods(prev => - prev.map(g => g.id === id ? { ...g, checked: !g.checked } : g) - ) - } - - // 选择图片 - const handleChooseImage = () => { - if (images.length >= 6) { - Taro.showToast({ title: '最多上传6张图片', icon: 'none' }) - return - } - Taro.chooseImage({ - count: 6 - images.length, - success: (res) => { - setImages(prev => [...prev, ...res.tempFilePaths]) - } - }) - } - - // 删除图片 - const handleDeleteImage = (index: number) => { - setImages(prev => prev.filter((_, i) => i !== index)) - } - - // 提交申请 - const handleSubmit = () => { - const checkedGoods = orderGoods.filter(g => g.checked) - if (!reason) { - Taro.showToast({ title: '请选择原因', icon: 'none' }) - return - } - if (saleType === 1 && !amount) { - Taro.showToast({ title: '请输入退款金额', icon: 'none' }) - return - } - - const typeMap: Record = { - 1: 'refund', - 2: 'return', - 3: 'exchange', - } - - Taro.showModal({ - title: '确认提交', - content: '确定提交售后申请吗?', - confirmColor: '#0e932e', - success: async (res) => { - if (res.confirm) { - setSubmitting(true) - Taro.showLoading({ title: '提交中...' }) - try { - await applyAfterSale({ - orderId, - type: typeMap[saleType], - reason, - description, - amount: saleType === 1 ? Number(amount) : undefined, - evidenceImages: images, - goodsItems: checkedGoods.map(g => ({ goodsId: String(g.id), quantity: g.num })), - }) - Taro.hideLoading() - Taro.showToast({ title: '提交成功', icon: 'success' }) - setTimeout(() => Taro.navigateBack(), 1500) - } catch (err: any) { - Taro.hideLoading() - Taro.showToast({ title: err.message || '提交失败', icon: 'none' }) - } finally { - setSubmitting(false) - } - } - } - }) - } - - return ( - - - {/* 订单商品 */} - - 选择商品 - {orderGoods.map(goods => ( - handleGoodsCheck(goods.id)} - > - - - 🛍️ - - - {goods.name} - ¥{goods.price} × {goods.num} - - - ))} - - - {/* 售后类型 */} - - 售后类型 - setSaleType(parseInt(e.detail.value))}> - - - - 仅退款 - - - - 退货退款 - - - - 换货 - - - - - - {/* 退款金额 */} - {saleType === 1 && ( - - 退款金额 - - ¥ - setAmount(e.detail.value)} - placeholder='请输入退款金额' - className='flex-1' - /> - - 最多可退 ¥134.00 - - )} - - {/* 售后原因 */} - - 售后原因 - - {getCurrentReasons().map((r, index) => ( - setReason(r)} - > - - {r} - - - ))} - - - - {/* 问题描述 */} - - 问题描述 -