diff --git a/.workbuddy/memory/2026-07-01.md b/.workbuddy/memory/2026-07-01.md new file mode 100644 index 0000000..cafd254 --- /dev/null +++ b/.workbuddy/memory/2026-07-01.md @@ -0,0 +1 @@ +- 修改 `src/pages/user/about/index.tsx`:根据截图将“广西金炜建设工程有限公司”的简介更新为“玉林市玉州区鑫龙家电经营部”相关内容,包括头部品牌、公司简介、核心业务、联系信息及版权。 diff --git a/src/api/shop/shopGoodsFavorite/index.ts b/src/api/shop/shopGoodsFavorite/index.ts index fbb77b9..2f8c734 100644 --- a/src/api/shop/shopGoodsFavorite/index.ts +++ b/src/api/shop/shopGoodsFavorite/index.ts @@ -1,44 +1,40 @@ import request from '@/utils/request' +import type { ApiResult } from '@/api' 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) + const res = await request.post>('/shop/goods/favorite/add', data, { showError: false }) + if (res.code === 0) { + return res.data + } + return Promise.reject(new Error(res.message)) } -// 取消收藏 +// 取消收藏(关闭全局错误提示,由调用方自行处理) export async function removeShopGoodsFavorite(data: { goodsId: number }) { - const res = await request.post('/shop/goods/favorite/remove', data) - return unwrap(res) + const res = await request.post>('/shop/goods/favorite/remove', data, { showError: false }) + if (res.code === 0) { + return res.data + } + return Promise.reject(new Error(res.message)) } -// 查询收藏状态(返回 boolean:true=已收藏, false=未收藏) +// 查询收藏状态 export async function getShopGoodsFavoriteStatus(params: { goodsId: number }) { - const res = await request.get('/shop/goods/favorite/status', params) - return !!unwrap(res) // 确保返回纯布尔值 + const res = await request.get>('/shop/goods/favorite/status', params) + if (res.code === 0) { + return res.data + } + return Promise.reject(new Error(res.message)) } // 收藏列表 -export async function listShopGoodsFavorite(params: ShopGoodsFavoriteParam) { - const res = await request.get('/shop/goods/favorite/list', params) - return unwrap(res) || [] +export function listShopGoodsFavorite(params: ShopGoodsFavoriteParam) { + return request.get('/shop/goods/favorite/list', params) } // 收藏列表(分页) -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 } +export function pageShopGoodsFavorite(params: ShopGoodsFavoriteParam) { + return request.get<{ list: ShopGoodsFavorite[]; total: number }>('/shop/goods/favorite/page', params) } diff --git a/src/api/shop/shopUserAddress.ts b/src/api/shop/shopUserAddress.ts index b33a2f2..fad29bb 100644 --- a/src/api/shop/shopUserAddress.ts +++ b/src/api/shop/shopUserAddress.ts @@ -1,42 +1,8 @@ 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 listShopUserAddress(params?: any) { + return request.get('/shop/shop-user-address', params); } /** 获取收货地址详情 */ @@ -66,7 +32,7 @@ export function removeBatchShopUserAddress(ids: number[]) { /** 设置默认收货地址 */ export function setDefaultAddress(id: number) { - return request.post(`/shop/shop-user-address/set-default/${id}`); + return request.put(`/shop/shop-user-address/set-default/${id}`); } /** 获取默认收货地址 */ diff --git a/src/api/shop/shopUserAddress/index.ts b/src/api/shop/shopUserAddress/index.ts index 35d7b45..dde2623 100644 --- a/src/api/shop/shopUserAddress/index.ts +++ b/src/api/shop/shopUserAddress/index.ts @@ -24,30 +24,10 @@ export async function listShopUserAddress(params?: ShopUserAddressParam) { '/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[]; + if (res.code === 0 && res.data) { + return res.data; } - // 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 || '获取地址列表失败')); + return Promise.reject(new Error(res.message)); } /** diff --git a/src/api/shop/shopUserAddress/model.ts b/src/api/shop/shopUserAddress/model.ts new file mode 100644 index 0000000..c6c5433 --- /dev/null +++ b/src/api/shop/shopUserAddress/model.ts @@ -0,0 +1,17 @@ +/** 收货地址 */ +export interface ShopUserAddress { + id?: number; + userId?: number; + name?: string; // 收货人姓名 + phone?: string; // 收货人电话 + province?: string; // 省份 + city?: string; // 城市 + district?: string; // 区县 + region?: string; // 区域(部分接口用 region) + detail?: string; // 详细地址 + lng?: string; // 经度 + lat?: string; // 纬度 + isDefault?: number; // 是否默认 0-否 1-是 + createTime?: string; + updateTime?: string; +} diff --git a/src/app.config.ts b/src/app.config.ts index da941a2..be86734 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -42,7 +42,7 @@ export default { 'pages/user/wallet', 'pages/user/recharge', 'pages/user/recharge-record/index', - 'pages/user/withdraw/index', + // 'pages/user/withdraw/index', 'pages/user/balance-log/index', 'pages/user/coupon-list', 'pages/user/points-record', @@ -56,7 +56,7 @@ export default { 'pages/user/register-pay/index', 'pages/user/promotion/index', 'pages/user/commission/index', - // 'pages/user/withdraw-list/index', + 'pages/user/withdraw-list/index', 'pages/user/team/index', 'pages/user/invite-record/index', 'pages/user/favorite-list/index', @@ -65,6 +65,8 @@ export default { 'pages/user/help-detail/index', 'pages/user/customer-service/index', 'pages/user/redeem/index', + // 关于我们 + 'pages/user/about/index', // 会员权益包页面 'pages/user/benefit-packages/index', 'pages/user/benefit-exchange-confirm/index', @@ -114,7 +116,7 @@ export default { // 分享返利页面 'pages/share/index', 'pages/rebate/records/index', - // 'pages/rebate/withdraw/index', + 'pages/rebate/withdraw/index', // 数据统计页面 'pages/statistics/dashboard/index', 'pages/statistics/sales/index', diff --git a/src/components/business/PayModal/index.tsx b/src/components/business/PayModal/index.tsx index 4bf390f..4725e52 100644 --- a/src/components/business/PayModal/index.tsx +++ b/src/components/business/PayModal/index.tsx @@ -10,12 +10,11 @@ interface PayModalProps { } const PAY_TYPES = [ - { id: 1, name: '微信支付', desc: '推荐使用', icon: 'pay-wechat' }, - { id: 0, name: '货到付款', desc: '使用账户余额', icon: 'pay-balance' }, + { id: 0, name: '货到付款', desc: '送达时支付', icon: 'pay-cod' }, ] const PayModal: React.FC = ({ visible, amount, onClose, onConfirm }) => { - const [selected, setSelected] = useState(1) + const [selected, setSelected] = useState(0) const [showOverlay, setShowOverlay] = useState(false) const [slideUp, setSlideUp] = useState(false) @@ -60,7 +59,7 @@ const PayModal: React.FC = ({ visible, amount, onClose, onConfirm {/* 关闭按钮 */} - @@ -86,7 +85,7 @@ const PayModal: React.FC = ({ visible, amount, onClose, onConfirm - {item.id === 1 ? '微' : '余'} + {item.id === 0 ? '货' : (item.id === 1 ? '微' : '余')} diff --git a/src/components/business/SkuSelector/index.tsx b/src/components/business/SkuSelector/index.tsx index e9c9ee0..adbd7d8 100644 --- a/src/components/business/SkuSelector/index.tsx +++ b/src/components/business/SkuSelector/index.tsx @@ -157,7 +157,7 @@ const SkuSelector: React.FC = ({ const fakeSku: ShopGoodsSku = { id: 0, goodsId: product.goodsId!, - price: product.price || product.salePrice, + price: product.salePrice || product.price, salePrice: product.salePrice || product.price, stock: product.stock, image: product.image, @@ -187,11 +187,7 @@ const SkuSelector: React.FC = ({ } } - // 价格优先级:SKU售价 > SKU原价 > 商品售价 > 商品原价 > 0 - // 注意:ShopGoods 模型中 price=商品价格(低), salePrice=销售/市场价(高) - // ShopGoodsSku 模型中 price=商品价格, salePrice=市场价格(高) - // 统一以 price 为准,salePrice 仅作兜底展示 - const currentPrice = selectedSku?.price || selectedSku?.salePrice || product?.price || product?.salePrice || '0' + const currentPrice = selectedSku?.salePrice || selectedSku?.price || product?.salePrice || product?.price || '0' const currentStock = selectedSku?.stock ?? product?.stock ?? 0 const currentImage = selectedSku?.image || product?.image || (product?.files?.split(',')[0]) || '' diff --git a/src/hooks/useAddress.ts b/src/hooks/useAddress.ts index d408c36..93c6891 100644 --- a/src/hooks/useAddress.ts +++ b/src/hooks/useAddress.ts @@ -29,14 +29,10 @@ export function useAddress(): UseAddressReturn { 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) + const actualList = Array.isArray(list) ? list : (list as any)?.data || [] + setAddresses(actualList) + } catch (error) { + console.error('Load addresses error:', error) setAddresses([]) } finally { setLoading(false) diff --git a/src/pages/help-center.tsx b/src/pages/help-center.tsx index c97d27d..cce93d8 100644 --- a/src/pages/help-center.tsx +++ b/src/pages/help-center.tsx @@ -36,7 +36,7 @@ const helpData: HelpCategory[] = [ title: '支付与退款', icon: '💰', questions: [ - { id: 201, title: '支持哪些支付方式?', content: '我们支持微信支付、支付宝支付(如有)、货到付款、积分抵扣等多种支付方式。' }, + { id: 201, title: '支持哪些支付方式?', content: '我们支持微信支付、支付宝支付(如有)、余额支付、积分抵扣等多种支付方式。' }, { id: 202, title: '如何申请退款?', content: '在订单详情页点击"申请退款"按钮,填写退款原因和说明,提交后等待商家审核。' }, { id: 203, title: '退款多久到账?', content: '退款审核通过后,原路退回您的支付账户。微信支付一般1-3个工作日到账,余额支付即时到账。' }, ] diff --git a/src/pages/index/index.tsx b/src/pages/index/index.tsx index 6a97198..0c7b73c 100644 --- a/src/pages/index/index.tsx +++ b/src/pages/index/index.tsx @@ -29,10 +29,10 @@ const IndexPage: React.FC = () => { // 功能入口(8个) const featureEntries = [ { icon: '🎁', label: '全部商品', url: '/pages/shop/index' }, - { icon: '🎯', label: '限时秒杀', url: '/pages/shop/seckill-list/index' }, + { icon: '🤝', label: '收货地址', url: '/pages/user/address-list' }, { icon: '🎫', label: '领券中心', url: '/pages/index/coupon-center/index' }, { icon: '⭐', label: '我的收藏', url: '/pages/user/favorite-list/index' }, - { icon: '👑', label: '会员中心', url: '/pages/user/member/index' }, + { icon: '👑', label: '关于我们', url: '/pages/user/about/index' }, { icon: '💰', label: '积分商城', url: '/pages/points/index' }, { icon: '🏪', label: '门店信息', url: '/pages/store/list/index' }, { icon: '❓', label: '帮助中心', url: '/pages/user/help-center/index' }, @@ -86,7 +86,7 @@ const IndexPage: React.FC = () => { } // tabBar 页面列表 - const tabBarPages = ['/pages/index/index', '/pages/shop/index', '/pages/user/user'] + const tabBarPages = ['/pages/index/index', '/pages/shop/index', '/pages/order/list', '/pages/user/user'] const handleFeatureClick = (url: string) => { if (tabBarPages.includes(url)) { @@ -231,7 +231,7 @@ const IndexPage: React.FC = () => { ) : ( @@ -239,20 +239,20 @@ const IndexPage: React.FC = () => { )} - - {item.goodsName || item.name} - - + + {item.goodsName || item.name} + + + + {item.sales !== undefined && item.sales > 0 && ( + 已售 {item.sales} + )} - {item.sales !== undefined && item.sales > 0 && ( - 已售 {item.sales} - )} - )) ) : ( diff --git a/src/pages/index/search.tsx b/src/pages/index/search.tsx index cf1fb4f..b92bce3 100644 --- a/src/pages/index/search.tsx +++ b/src/pages/index/search.tsx @@ -31,7 +31,7 @@ const SearchPage: React.FC = () => { if (!q.trim()) return setLoading(true) try { - const params: ShopGoodsParam = { keywords: q, status: 0, page: 1, limit: 20 } + const params: ShopGoodsParam = { keywords: q, isShow: 1, page: 1, limit: 20 } const res = await pageShopGoods(params) setList(res?.list || []) // 保存搜索历史 diff --git a/src/pages/list.tsx b/src/pages/list.tsx index 1ac4b59..7feba90 100644 --- a/src/pages/list.tsx +++ b/src/pages/list.tsx @@ -112,12 +112,12 @@ const StoreListPage: React.FC = () => { > 📍 导航到店 - {/* handleBooking(store.id!)}*/} - {/*>*/} - {/* 📅 立即预约*/} - {/**/} + handleBooking(store.id!)} + > + 📅 立即预约 + ))} diff --git a/src/pages/order/list.tsx b/src/pages/order/list.tsx index 38addb8..8b25e59 100644 --- a/src/pages/order/list.tsx +++ b/src/pages/order/list.tsx @@ -30,7 +30,12 @@ interface TabState { } const OrderListPage: React.FC = () => { - const { tab: initTab } = Taro.getCurrentInstance().router?.params || {} + const initTab = Taro.getCurrentInstance().router?.params?.tab + ?? Taro.getStorageSync('order_tab') + // 读取后清除,避免影响下次进入 + if (Taro.getStorageSync('order_tab') !== '') { + Taro.removeStorageSync('order_tab') + } const [tabIndex, setTabIndex] = useState(Number(initTab) || 0) // 每个 tab 独立维护状态 diff --git a/src/pages/promotion.config.ts b/src/pages/promotion.config.ts index 33edb8f..7655d57 100644 --- a/src/pages/promotion.config.ts +++ b/src/pages/promotion.config.ts @@ -1,3 +1,3 @@ export default { - navigationBarTitleText: '分享好友', + navigationBarTitleText: '分销推广', } diff --git a/src/pages/seckill-detail.tsx b/src/pages/seckill-detail.tsx index 995a586..f3d4a20 100644 --- a/src/pages/seckill-detail.tsx +++ b/src/pages/seckill-detail.tsx @@ -91,26 +91,14 @@ const SeckillDetailPage: React.FC = () => { setCountdown(`${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`) } - const handleBuyClick = () => { + const handleBuyNow = () => { if (!seckill) return - if (seckill.status === 0) { - Taro.showToast({ title: '活动尚未开始,请耐心等待', icon: 'none' }) - return - } - - if (seckill.status === 2 || new Date(seckill.endTime).getTime() <= Date.now()) { - Taro.showToast({ title: '活动已结束,下次再来', icon: 'none' }) - return - } - if (seckill.stock <= 0) { - Taro.showToast({ title: '已抢光,下次再来', icon: 'none' }) + Taro.showToast({ title: '已抢光', icon: 'none' }) return } - if (submitting) return - // 先拉取商品规格(如果没有的话) if (!product && seckill.goodsId) { Taro.showLoading({ title: '加载规格...' }) @@ -267,11 +255,8 @@ const SeckillDetailPage: React.FC = () => { {submitting ? '抢购中...' : isActive ? (seckill.stock > 0 ? '立即抢购' : '已抢光') : seckill.status === 0 ? '即将开始' : '已结束'} diff --git a/src/pages/shop/checkout.tsx b/src/pages/shop/checkout.tsx index eb299ae..5d00790 100644 --- a/src/pages/shop/checkout.tsx +++ b/src/pages/shop/checkout.tsx @@ -8,7 +8,7 @@ import { useScrollHeight } from '@/hooks/useScrollHeight' import { getMyAvailableCoupons } from '@/api/shop/shopUserCoupon' import AddressCard from '@/components/business/AddressCard' import CouponCard from '@/components/business/CouponCard' -import { createOrder, type WxPayResult } from '@/api/shop/shopOrder' +import { createOrder } from '@/api/shop/shopOrder' import type { ShopOrder } from '@/api/shop/shopOrder/model' import { listShopGoods } from '@/api/shop/shopGoods' import type { ShopGoods } from '@/api/shop/shopGoods/model' @@ -124,8 +124,7 @@ const CheckoutPage: React.FC = () => { const [rushBuyProducts, setRushBuyProducts] = useState([]) // 支付方式相关状态 - // payType: 1=微信支付, 0=货到付款(默认) - const [payType, setPayType] = useState(0) + const [payType, setPayType] = useState(0) // 0: 货到付款 // 从本地存储获取立即购买的数据 const buyNowItems = useMemo(() => { @@ -217,7 +216,7 @@ const CheckoutPage: React.FC = () => { } } - // 加载凑单推荐商品 + // 选择地址 const handleSelectAddress = () => { Taro.navigateTo({ url: '/pages/user/address-list?from=checkout', @@ -271,21 +270,18 @@ const CheckoutPage: React.FC = () => { const res = await createOrder(orderParams) - // 清理购物车数据(无论哪种支付方式都需清理) + // 货到付款 - 只需创建订单,无需调用支付接口 + console.log('订单创建成功', res) + + // 清理数据 if (fromBuyNow) { Taro.removeStorageSync('buy_now') } else { await removeSelected() } - // 根据支付方式处理 - if (payType === 1) { - // 微信支付 - res 是 WxPayResult - await handleWxPay(res as WxPayResult) - } - - // 货到付款(payType=0)无需在线支付,直接下单成功 - Taro.showToast({ title: payType === 0 ? '下单成功' : '支付成功', icon: 'success' }) + // 显示成功提示 + Taro.showToast({ title: '订单已提交', icon: 'success' }) setTimeout(() => { Taro.switchTab({ url: '/pages/order/list' }) }, 1500) @@ -296,25 +292,6 @@ const CheckoutPage: React.FC = () => { } } - // 微信支付 - const handleWxPay = async (payData: WxPayResult & { paid?: string }) => { - // 后端返回已支付(回调丢失自动修复场景) - if (payData.paid === 'true') { - return // 直接视为支付成功 - } - return new Promise((resolve, reject) => { - Taro.requestPayment({ - timeStamp: payData.timeStamp, - nonceStr: payData.nonceStr, - package: payData.package, - signType: payData.signType, - paySign: payData.paySign, - success: () => resolve(), - fail: (err) => reject(new Error('支付取消')) - }) - }) - } - // 安全的数字格式化 const formatPrice = (price: number | string): string => { const num = typeof price === 'string' ? parseFloat(price) : price @@ -462,49 +439,23 @@ const CheckoutPage: React.FC = () => { 支付方式 - {/* 微信支付 */} - {/* setPayType(1)}*/} - {/*>*/} - {/* */} - {/* */} - {/* */} - {/* */} - {/* 微信支付*/} - {/* 推荐使用*/} - {/* */} - {/* */} - {/* {payType === 1 && (*/} - {/* */} - {/* )}*/} - {/* */} - {/**/} - {/* 货到付款 */} setPayType(0)} + style={{ backgroundColor: '#f0fdf4' }} > 货到付款 - 商品送达后付款 + 送达时支付 - {payType === 0 && ( - - )} + diff --git a/src/pages/shop/group-buy-detail/index.tsx b/src/pages/shop/group-buy-detail/index.tsx index 2cee697..ad0eddc 100644 --- a/src/pages/shop/group-buy-detail/index.tsx +++ b/src/pages/shop/group-buy-detail/index.tsx @@ -7,7 +7,6 @@ import type { ShopGroupBuy, ShopGroupBuyRecord } from '@/api/shop/shopGroupBuy/m import type { ShopGoods } from '@/api/shop/shopGoods/model' import type { ShopGoodsSku } from '@/api/shop/shopGoodsSku/model' import SkuSelector from '@/components/business/SkuSelector' -import Price from '@/components/common/Price' definePageConfig({ navigationBarTitleText: '拼团详情', @@ -193,12 +192,12 @@ const GroupBuyDetailPage: React.FC = () => { {groupBuy.goodsName || groupBuy.product?.name} - + + ¥{groupBuy.groupPrice} + + + ¥{groupBuy.product?.price || 0} + {isActive && remaining > 0 && ( diff --git a/src/pages/shop/group-buy-list/index.tsx b/src/pages/shop/group-buy-list/index.tsx index 0db11e4..928cb33 100644 --- a/src/pages/shop/group-buy-list/index.tsx +++ b/src/pages/shop/group-buy-list/index.tsx @@ -4,7 +4,6 @@ import Taro from '@tarojs/taro' import { pageShopGroupBuy } from '@/api/shop/shopGroupBuy' import type { ShopGroupBuy } from '@/api/shop/shopGroupBuy/model' import EmptyState from '@/components/common/EmptyState' -import Price from '@/components/common/Price' definePageConfig({ navigationBarTitleText: '拼团活动', @@ -92,12 +91,12 @@ const GroupBuyListPage: React.FC = () => { - + + {'\u00A5'}{item.groupPrice} + + + {'\u00A5'}{item.product?.price || 0} + { setIsFavorite(true) Taro.showToast({ title: '收藏成功', icon: 'success' }) } - } catch (err: any) { - // 接口报错时仍更新UI状态,避免状态不一致 - console.error('[ProductDetail] 收藏操作失败:', err?.message || err) - if (isFavorite) { - setIsFavorite(false) - } else { - setIsFavorite(true) - } - // 不再额外弹toast(handleError已经弹了后端返回的错误信息) + } catch (e: any) { + Taro.showToast({ title: e?.message || '操作失败', icon: 'none' }) } } @@ -165,12 +158,10 @@ const ProductDetailPage: React.FC = () => { } const handleGoCart = () => { - // 购物车不是 tabBar 页面,使用 navigateTo;路径与 app.config.ts 中注册的 'pages/shop/cart' 对应 Taro.navigateTo({ url: '/pages/shop/cart' }) } const handleContactService = () => { - // 直接跳转到在线客服页面(已实现完整功能:微信客服按钮 + 历史消息 + 热线 + 微信留言) Taro.navigateTo({ url: '/pages/user/customer-service/index' }) } @@ -214,7 +205,6 @@ const ProductDetailPage: React.FC = () => { '' ) // 兜底:如果内容里直接包含 http(s) 图片链接(非 img 标签包裹的),也尝试转成图片 - // 匹配独立的 https://xxx.jpg/png/gif 链接 if (html.includes('http') && !html.includes(' { {/* 图片轮播 */} - - {images.map((img, idx) => ( - - { - // 根据第一张图片的实际宽高比动态设置 Swiper 高度 - if (idx === 0) { - const { width, height } = e.detail - if (width > 0) { - const screenWidth = Taro.getSystemInfoSync().windowWidth - setSwiperHeight(Math.round((height / width) * screenWidth)) - } - } - }} - onClick={() => Taro.previewImage({ current: img, urls: images })} - /> - - ))} - {images.length === 0 && ( - - - 暂无图片 - - - )} - + + {images.map((img, idx) => ( + + { + // 根据第一张图片的实际宽高比动态设置 Swiper 高度 + if (idx === 0) { + const { width, height } = e.detail + if (width > 0) { + const screenWidth = Taro.getSystemInfoSync().windowWidth + setSwiperHeight(Math.round((height / width) * screenWidth)) + } + } + }} + onClick={() => Taro.previewImage({ current: img, urls: images })} + /> + + ))} + {images.length === 0 && ( + + + 暂无图片 + + + )} + {/* 价格区域 */} diff --git a/src/pages/shop/seckill-detail/index.tsx b/src/pages/shop/seckill-detail/index.tsx index 2273e76..f3d4a20 100644 --- a/src/pages/shop/seckill-detail/index.tsx +++ b/src/pages/shop/seckill-detail/index.tsx @@ -7,7 +7,6 @@ import type { ShopSeckill } from '@/api/shop/shopSeckill/model' import type { ShopGoods } from '@/api/shop/shopGoods/model' import type { ShopGoodsSku } from '@/api/shop/shopGoodsSku/model' import SkuSelector from '@/components/business/SkuSelector' -import Price from '@/components/common/Price' definePageConfig({ navigationBarTitleText: '秒杀详情', @@ -92,26 +91,14 @@ const SeckillDetailPage: React.FC = () => { setCountdown(`${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`) } - const handleBuyClick = () => { + const handleBuyNow = () => { if (!seckill) return - if (seckill.status === 0) { - Taro.showToast({ title: '活动尚未开始,请耐心等待', icon: 'none' }) - return - } - - if (seckill.status === 2 || new Date(seckill.endTime).getTime() <= Date.now()) { - Taro.showToast({ title: '活动已结束,下次再来', icon: 'none' }) - return - } - if (seckill.stock <= 0) { - Taro.showToast({ title: '已抢光,下次再来', icon: 'none' }) + Taro.showToast({ title: '已抢光', icon: 'none' }) return } - if (submitting) return - // 先拉取商品规格(如果没有的话) if (!product && seckill.goodsId) { Taro.showLoading({ title: '加载规格...' }) @@ -200,13 +187,12 @@ const SeckillDetailPage: React.FC = () => { {/* 价格和倒计时 */} - + + ¥{seckill.seckillPrice} + + + ¥{seckill.product?.price || 0} + @@ -269,11 +255,8 @@ const SeckillDetailPage: React.FC = () => { {submitting ? '抢购中...' : isActive ? (seckill.stock > 0 ? '立即抢购' : '已抢光') : seckill.status === 0 ? '即将开始' : '已结束'} diff --git a/src/pages/shop/seckill-list/index.tsx b/src/pages/shop/seckill-list/index.tsx index 79f5174..0bd8795 100644 --- a/src/pages/shop/seckill-list/index.tsx +++ b/src/pages/shop/seckill-list/index.tsx @@ -4,7 +4,6 @@ import Taro from '@tarojs/taro' import { pageShopSeckill } from '@/api/shop/shopSeckill' import type { ShopSeckill } from '@/api/shop/shopSeckill/model' import EmptyState from '@/components/common/EmptyState' -import Price from '@/components/common/Price' definePageConfig({ navigationBarTitleText: '限时秒杀', @@ -122,12 +121,12 @@ const SeckillListPage: React.FC = () => { - + + {'\u00A5'}{item.seckillPrice} + + + {'\u00A5'}{item.product?.price || 0} + { ) : ( 🕐 - 营业时间未设置 + 营业时间:9:00 ~ 18:00 )} diff --git a/src/pages/user/about/index.config.ts b/src/pages/user/about/index.config.ts new file mode 100644 index 0000000..51121d3 --- /dev/null +++ b/src/pages/user/about/index.config.ts @@ -0,0 +1,3 @@ +export default { + navigationBarTitleText: '关于我们', +} diff --git a/src/pages/user/about/index.tsx b/src/pages/user/about/index.tsx new file mode 100644 index 0000000..9e24923 --- /dev/null +++ b/src/pages/user/about/index.tsx @@ -0,0 +1,85 @@ +import React from 'react' +import { View, Text, ScrollView } from '@tarojs/components' + +definePageConfig({ + navigationBarTitleText: '关于我们', +}) + +const AboutPage: React.FC = () => { + return ( + + {/* 头部品牌区 */} + + + + + 玉林市玉州区鑫龙家电经营部 + 鑫龙家电 v1.0.0 + + + {/* 公司简介 */} + + 公司简介 + + 玉林市玉州区鑫龙家电经营部是一家专注于家用电器销售、安装及维修服务的本地经营部。 + 我们提供冰箱、洗衣机、空调、电视、厨房电器、生活小家电等多种品类,涵盖售前咨询、 + 售后安装、维护保养及故障维修等一站式家电服务。 + + + 经营部秉承"诚信经营、服务至上"的理念,以优质的产品和贴心的服务赢得了本地客户的信赖。 + 我们致力于让每一位顾客都能买得放心、用得安心,享受便捷的家电生活体验。 + + + + {/* 核心业务 */} + + 核心业务 + {[ + { icon: '📺', title: '家电零售', desc: '电视、冰箱、洗衣机等全品类家电销售' }, + { icon: '❄️', title: '空调服务', desc: '空调销售、安装、加氟、清洗及维修' }, + { icon: '🍳', title: '厨房电器', desc: '油烟机、燃气灶、热水器等厨卫电器' }, + { icon: '🛠️', title: '安装维修', desc: '专业师傅上门安装、检测及故障维修' }, + { icon: '🔧', title: '保养维护', desc: '定期清洗保养,延长家电使用寿命' }, + { icon: '✅', title: '品质保障', desc: '正品货源、透明报价、售后无忧' }, + ].map((item, idx) => ( + + {item.icon} + + {item.title} + {item.desc} + + + ))} + + + {/* 联系我们 */} + + 联系我们 + + {[ + { label: '经营部名称', value: '玉林市玉州区鑫龙家电经营部' }, + { label: '经营地址', value: '大新里南718号' }, + { label: '联系电话', value: '13260472256' }, + { label: '营业时间', value: '9:00 ~ 18:00' }, + ].map((item, idx) => ( + + {item.label} + {item.value} + + ))} + + + + {/* 底部版权 */} + + Copyright © 2024 玉林市玉州区鑫龙家电经营部 + All Rights Reserved + + + ) +} + +export default AboutPage diff --git a/src/pages/user/favorite-list/index.tsx b/src/pages/user/favorite-list/index.tsx index d7aaf09..fc2a726 100644 --- a/src/pages/user/favorite-list/index.tsx +++ b/src/pages/user/favorite-list/index.tsx @@ -5,7 +5,6 @@ import { listShopGoodsFavorite } from '@/api/shop/shopGoodsFavorite' import type { ShopGoodsFavorite } from '@/api/shop/shopGoodsFavorite/model' import EmptyState from '@/components/common/EmptyState' import LoadMore from '@/components/common/LoadMore' -import Price from '@/components/common/Price' definePageConfig({ navigationBarTitleText: '我的收藏', @@ -77,9 +76,9 @@ const FavoriteListPage: React.FC = () => { {item.goodsName} - - - + + ¥{item.salePrice || '0'} + ))} diff --git a/src/pages/user/help-center/index.tsx b/src/pages/user/help-center/index.tsx index 511412f..62e2352 100644 --- a/src/pages/user/help-center/index.tsx +++ b/src/pages/user/help-center/index.tsx @@ -36,7 +36,7 @@ const helpData: HelpCategory[] = [ title: '支付与退款', icon: '💰', questions: [ - { id: 201, title: '支持哪些支付方式?', content: '我们支持微信支付、支付宝支付(如有)、货到付款、积分抵扣等多种支付方式。' }, + { id: 201, title: '支持哪些支付方式?', content: '我们支持微信支付、支付宝支付(如有)、余额支付、积分抵扣等多种支付方式。' }, { id: 202, title: '如何申请退款?', content: '在订单详情页点击"申请退款"按钮,填写退款原因和说明,提交后等待商家审核。' }, { id: 203, title: '退款多久到账?', content: '退款审核通过后,原路退回您的支付账户。微信支付一般1-3个工作日到账,余额支付即时到账。' }, ] diff --git a/src/pages/user/index.tsx b/src/pages/user/index.tsx index fe6669b..fdc1b7d 100644 --- a/src/pages/user/index.tsx +++ b/src/pages/user/index.tsx @@ -7,6 +7,17 @@ import MemberBadge from '@/components/business/MemberBadge' const UserPage: React.FC = () => { const { user, isLoggedIn } = useUser() + // TabBar 页面列表 + const tabBarPages = ['/pages/index/index', '/pages/shop/index', '/pages/order/list', '/pages/user/user'] + + const handleNavigate = (url: string) => { + if (tabBarPages.includes(url)) { + Taro.switchTab({ url }) + } else { + Taro.navigateTo({ url }) + } + } + const menuItems = [ { icon: '📦', label: '我的订单', url: '/pages/order/list' }, { icon: '📅', label: '预约订单', url: '/pages/booking/list' }, @@ -30,68 +41,56 @@ const UserPage: React.FC = () => { {/* 顶部渐变背景区域 */} - {/* 渐变背景 — 绿色系 */} + {/* 渐变背景 */} {/* 装饰圆形 */} + - - {/* 用户信息卡片 */} {/* 头像区域 */} {isLoggedIn && user?.avatar ? ( ) : ( 👤 @@ -100,7 +99,7 @@ const UserPage: React.FC = () => { {isLoggedIn && user?.memberLevelName && ( VIP @@ -110,7 +109,7 @@ const UserPage: React.FC = () => { {/* 用户信息 */} - + {isLoggedIn ? (user?.nickname || user?.phone || '用户') : '点击登录'} {isLoggedIn && user?.memberLevelName && ( @@ -118,59 +117,50 @@ const UserPage: React.FC = () => { )} {isLoggedIn ? ( - ID: {(user as any)?.id || '暂无'} + ID: {(user as any)?.id || '暂无'} ) : ( - 登录后享受更多服务 + 登录后享受更多服务 )} {/* 箭头 */} - - {'>'} + + {'>'} - {/* 数据概览 — 4列白色文字 */} + {/* 数据概览 */} {isLoggedIn && ( Taro.navigateTo({ url: '/pages/user/wallet' })} + className='text-center py-2 rounded-lg' + onClick={() => Taro.switchTab({ url: '/pages/points/index' })} > - - ¥{((user as any)?.balance || '0.00')} - - 余额 - - Taro.navigateTo({ url: '/pages/points/index' })} - > - + {(user as any)?.points || 0} - 积分 + 积分 Taro.navigateTo({ url: '/pages/user/coupon-list' })} > - + 0 - 优惠券 + 优惠券 Taro.navigateTo({ url: '/pages/order/list' })} + className='text-center py-2 rounded-lg' + onClick={() => Taro.switchTab({ url: '/pages/order/list' })} > - + 0 - 订单 + 订单 )} @@ -182,7 +172,7 @@ const UserPage: React.FC = () => { 我的订单 - Taro.navigateTo({ url: '/pages/order/list' })}> + Taro.switchTab({ url: '/pages/order/list' })}> 全部订单 {'>'} @@ -197,7 +187,7 @@ const UserPage: React.FC = () => { key={item.status} className='flex flex-col items-center py-2 rounded-lg' style={{ background: `${item.color}10` }} - onClick={() => Taro.navigateTo({ url: `/pages/order/list?tab=${item.status}` })} + onClick={() => { Taro.setStorageSync('order_tab', item.status); Taro.switchTab({ url: '/pages/order/list' }) }} > {item.icon} {item.label} @@ -213,7 +203,7 @@ const UserPage: React.FC = () => { className={`flex items-center justify-between px-4 py-3 ${ idx < menuItems.length - 1 ? 'border-b border-gray-50' : '' }`} - onClick={() => Taro.navigateTo({ url: item.url })} + onClick={() => handleNavigate(item.url)} > {item.icon} diff --git a/src/pages/user/setting.tsx b/src/pages/user/setting.tsx index f22e7b1..1110f02 100644 --- a/src/pages/user/setting.tsx +++ b/src/pages/user/setting.tsx @@ -39,7 +39,7 @@ const SettingPage: React.FC = () => { const menuItems = [ { label: '清除缓存', action: handleClearCache }, - { label: '关于我们', action: () => Taro.showToast({ title: 'v1.0.0', icon: 'none' }) }, + { label: '关于我们', action: () => Taro.navigateTo({ url: '/pages/user/about/index' }) }, { label: '用户协议', action: () => Taro.navigateTo({ url: '/passport/agreement' }) }, { label: '隐私政策', action: () => Taro.navigateTo({ url: '/passport/agreement' }) }, ] diff --git a/src/pages/user/user.tsx b/src/pages/user/user.tsx index af4a69c..3ddec4d 100644 --- a/src/pages/user/user.tsx +++ b/src/pages/user/user.tsx @@ -155,7 +155,7 @@ const UserPage: React.FC = () => { 我的订单 - Taro.navigateTo({ url: '/pages/order/list' })}> + Taro.switchTab({ url: '/pages/order/list' })}> 全部订单 {'>'} @@ -169,7 +169,7 @@ const UserPage: React.FC = () => { Taro.navigateTo({ url: `/pages/order/list?tab=${item.status}` })} + onClick={() => { Taro.setStorageSync('order_tab', item.status); Taro.switchTab({ url: '/pages/order/list' }) }} > {item.icon} {item.label} diff --git a/src/pages/user/wallet.tsx b/src/pages/user/wallet.tsx index 1df8744..a5bd882 100644 --- a/src/pages/user/wallet.tsx +++ b/src/pages/user/wallet.tsx @@ -45,10 +45,17 @@ const WalletPage: React.FC = () => { Taro.navigateTo({ url: '/pages/user/recharge' })} + onClick={() => Taro.navigateTo({ url: '/pages/user/redeem/index' })} > 充值 + {/* Taro.navigateTo({ url: '/pages/user/withdraw/index' })}*/} + {/*>*/} + {/* 提现*/} + {/**/} @@ -76,6 +83,13 @@ const WalletPage: React.FC = () => { 🎫 兑换码 + {/* Taro.navigateTo({ url: '/pages/user/withdraw/index' })}*/} + {/*>*/} + {/* 💰*/} + {/* 提现记录*/} + {/**/} diff --git a/src/pages/user/withdraw/index.scss b/src/pages/user/withdraw/index.scss index 6682606..a699efe 100644 --- a/src/pages/user/withdraw/index.scss +++ b/src/pages/user/withdraw/index.scss @@ -1,76 +1,28 @@ .withdraw-page { display: flex; flex-direction: column; - min-height: 100vh; - background: #f5f6fa; - padding-bottom: env(safe-area-inset-bottom); + height: 100vh; + background: #f5f5f5; } -/* ========== 余额卡片 ========== */ -.balance-card { - margin: 24rpx; - padding: 40rpx 32rpx 32rpx; - background: linear-gradient(135deg, #ff6b35 0%, #ff8c42 100%); - border-radius: 20rpx; - color: #fff; -} - -.balance-header { - margin-bottom: 16rpx; -} - -.balance-label { - font-size: 26rpx; - color: rgba(255, 255, 255, 0.85); -} - -.balance-amount-row { - display: flex; - align-items: baseline; -} - -.currency-symbol-lg { - font-size: 40rpx; - font-weight: bold; - color: #fff; - margin-right: 8rpx; -} - -.balance-number { - font-size: 72rpx; - font-weight: bold; - color: #fff; - line-height: 1; -} - -.balance-tips { - margin-top: 16rpx; -} - -.balance-tip-text { - font-size: 24rpx; - color: rgba(255, 255, 255, 0.7); -} - -/* ========== 提现输入卡片 ========== */ .withdraw-card { margin: 24rpx; padding: 32rpx; background: #fff; - border-radius: 20rpx; + border-radius: 16rpx; } .card-title { - font-size: 30rpx; + font-size: 28rpx; font-weight: bold; color: #333; - margin-bottom: 28rpx; + margin-bottom: 32rpx; } .amount-input-wrap { display: flex; align-items: center; - padding: 20rpx 0; + padding: 24rpx 0; border-bottom: 2rpx solid #eee; margin-bottom: 16rpx; } @@ -89,162 +41,65 @@ color: #333; } -.all-withdraw { - flex-shrink: 0; - padding: 8rpx 20rpx; - background: #fff3ee; - color: #ff6b35; +.amount-tips { + display: flex; + justify-content: space-between; + align-items: center; font-size: 24rpx; + color: #999; +} + +.all-withdraw { + color: #ff6b35; font-weight: bold; - border-radius: 24rpx; - border: 2rpx solid #ffd4bc; } .fee-tips { - display: flex; - align-items: center; - gap: 8rpx; - margin-top: 16rpx; - padding: 12rpx 16rpx; - font-size: 24rpx; - color: #e67e22; - background: #fef9f5; - border-radius: 8rpx; + margin-top: 12rpx; + font-size: 22rpx; + color: #ff9a56; } -.fee-free { - color: #27ae60; - background: #f0faf4; -} - -.fee-icon { - font-size: 24rpx; -} - -/* ========== 提现规则区域(核心审核项)========== */ -.rules-section { +.config-card { margin: 0 24rpx 24rpx; + padding: 24rpx 32rpx; background: #fff; - border-radius: 20rpx; - overflow: hidden; + border-radius: 16rpx; } -/* 标题栏 */ -.rules-header { +.config-item { display: flex; - align-items: center; - gap: 12rpx; - padding: 28rpx 32rpx 20rpx; - background: linear-gradient(135deg, #fef0eb 0%, #fff8f5 100%); - border-bottom: 2rpx solid #fce8e1; -} - -.rules-header-icon { - font-size: 36rpx; -} - -.rules-header-title { - font-size: 30rpx; - font-weight: bold; - color: #c0392b; -} - -/* 规则网格 - 两列 */ -.rules-grid { - display: grid; - grid-template-columns: 1fr 1fr; - padding: 24rpx 24rpx 8rpx; - gap: 16rpx; -} - -.rule-cell { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 20rpx 12rpx; - background: #fafafa; - border-radius: 12rpx; - border: 2rpx solid #f0f0f0; -} - -.rule-cell-wide { - grid-column: span 2; - flex-direction: row; justify-content: space-between; - padding: 18rpx 24rpx; + padding: 16rpx 0; + border-bottom: 1rpx solid #f5f5f5; } -.rule-cell-label { - font-size: 23rpx; - color: #999; - margin-bottom: 8rpx; +.config-item:last-child { + border-bottom: none; } -.rule-cell-value { - font-size: 28rpx; - font-weight: bold; - color: #333; -} - -.rule-cell-wide .rule-cell-label { - margin-bottom: 0; -} - -/* 详细规则文字列表 */ -.rules-detail { - padding: 20rpx 32rpx 28rpx; -} - -.detail-item { - display: flex; - align-items: flex-start; - gap: 10rpx; - padding: 10rpx 0; -} - -.detail-bullet { - flex-shrink: 0; +.config-label { font-size: 26rpx; - color: #ff6b35; - margin-top: 2rpx; -} - -.detail-text { - font-size: 25rpx; color: #666; - line-height: 1.7; } -/* ========== 底部按钮区 ========== */ -.bottom-area { - margin-top: auto; - padding: 20rpx 40rpx 40rpx; +.config-value { + font-size: 26rpx; + color: #333; + font-weight: bold; } .submit-btn { - width: 100%; - padding: 26rpx 0; + margin: 48rpx 24rpx; + padding: 24rpx 0; text-align: center; background: linear-gradient(135deg, #ff6b35 0%, #ff9a56 100%); color: #fff; font-size: 32rpx; font-weight: bold; border-radius: 48rpx; - box-shadow: 0 8rpx 24rpx rgba(255, 107, 53, 0.35); } .submit-btn.disabled { - opacity: 0.45; - box-shadow: none; -} - -.submit-disclaimer { - text-align: center; - margin-top: 16rpx; -} - -.disclaimer-text { - font-size: 22rpx; - color: #bbb; + opacity: 0.5; } diff --git a/src/pages/user/withdraw/index.tsx b/src/pages/user/withdraw/index.tsx index c28b535..3cbd95d 100644 --- a/src/pages/user/withdraw/index.tsx +++ b/src/pages/user/withdraw/index.tsx @@ -24,9 +24,9 @@ export default function WithdrawPage() { const loadConfig = async () => { try { - const res: any = await getWithdrawConfig(); - if (res.code === 200 || res.code === 0) { - setConfig(res.data || {}); + const res = await getWithdrawConfig(); + if (res.code === 200) { + setConfig(res.data); } } catch (error) { console.error('加载配置失败', error); @@ -35,25 +35,15 @@ export default function WithdrawPage() { const loadStats = async () => { try { - const res: any = await getWithdrawStats(); - if (res.code === 200 || res.code === 0) { - setStats(res.data || {}); + const res = await getWithdrawStats(); + if (res.code === 200) { + setStats(res.data); } } catch (error) { console.error('加载统计失败', error); } }; - // 从配置或默认值读取 - const minAmount = config.withdraw_min_amount || '10'; - const maxAmount = config.withdraw_max_amount || '200'; - const dailyLimit = config.withdraw_daily_limit || '2000'; - const dailyCount = config.withdraw_daily_count || 3; - const timeStart = config.withdraw_time_start || ''; - const timeEnd = config.withdraw_time_end || ''; - const feeRate = config.withdraw_fee_rate || '0'; - const arrivalTime = config.arrival_time || ''; - const handleWithdraw = () => { if (!amount || parseFloat(amount) <= 0) { Taro.showToast({ title: '请输入提现金额', icon: 'none' }); @@ -61,12 +51,15 @@ export default function WithdrawPage() { } const amountNum = parseFloat(amount); - if (amountNum < parseFloat(minAmount)) { + const minAmount = parseFloat(config.withdraw_min_amount || '10'); + const maxAmount = parseFloat(config.withdraw_max_amount || '200'); + + if (amountNum < minAmount) { Taro.showToast({ title: `最低提现金额为${minAmount}元`, icon: 'none' }); return; } - if (amountNum > parseFloat(maxAmount)) { + if (amountNum > maxAmount) { Taro.showToast({ title: `单次最大提现金额为${maxAmount}元`, icon: 'none' }); return; } @@ -76,12 +69,12 @@ export default function WithdrawPage() { const handlePayConfirm = async (payType: number) => { setShowPayModal(false); - if (payType !== 0) return; + if (payType !== 0) return; // 0微信支付 setSubmitting(true); try { - const res: any = await applyWithdraw({ amount: parseFloat(amount) }); - if (res.code === 200 || res.code === 0) { + const res = await applyWithdraw({ amount: parseFloat(amount) }); + if (res.code === 200) { Taro.showToast({ title: '提现申请已提交', icon: 'success' }); setTimeout(() => { Taro.navigateBack(); @@ -98,156 +91,65 @@ export default function WithdrawPage() { }; const handleAllWithdraw = () => { - const available = stats.withdrawingTotal || stats.balance || '0.00'; + // 可提现余额 + const available = stats.withdrawingTotal || '0'; setAmount(available); }; - const availableBalance = stats.withdrawingTotal || stats.balance || '0.00'; - return ( - {/* 余额卡片 */} - - - 可提现余额(元) - - - ¥ - {availableBalance} - - - 佣金已结算,可申请提现 - - - - {/* 提现输入 */} 提现金额 + ¥ setAmount(e.detail.value)} /> - + + + + 可提现佣金: ¥{stats.withdrawingTotal || '0.00'} + 全部提现 - {feeRate && parseFloat(feeRate) > 0 ? ( + + {config.withdraw_fee_rate && parseFloat(config.withdraw_fee_rate) > 0 && ( - ⚠️ - 本次提现将收取 {feeRate}% 手续费 - - ) : ( - - - 当前免收提现手续费 + 手续费: {config.withdraw_fee_rate}% )} - {/* ====== 提现规则展示(核心审核项)====== */} - - {/* 标题栏 */} - - 📋 - 提现规则说明 + + + 单次限额 + ¥{config.withdraw_max_amount || '200'} - - {/* 规则网格 - 两列布局更醒目 */} - - - 最低提现 - {minAmount} 元起 - - - 单次限额 - {maxAmount} 元/次 - - - 每日限额 - {dailyLimit} 元/天 - - - 每日次数 - {dailyCount} 次/天 - - - 提现时间 - {timeStart && timeEnd ? `${timeStart}-${timeEnd}` : '全天可提'} - - - 到账时间 - {arrivalTime || '1-3个工作日'} - - - 手续费 - - {feeRate && parseFloat(feeRate) > 0 ? `${feeRate}%` : '免手续费'} + + 每日限额 + ¥{config.withdraw_daily_limit || '2000'} + + {config.withdraw_time_start && ( + + 提现时间 + + {config.withdraw_time_start} - {config.withdraw_time_end} - - - {/* 详细规则文字 */} - - - - 提现金额范围为 ¥{minAmount} ~ ¥{maxAmount},超出范围无法提交 - - - - 每日最多可提现 {dailyCount} 次,累计不超过 ¥{dailyLimit} - - {timeStart && timeEnd ? ( - - - 仅在每日 {timeStart} 至 {timeEnd} 期间可发起提现申请 - - ) : ( - - - 支持全天 24 小时发起提现申请 - - )} - - - 提现申请提交后将在 {arrivalTime || '1-3个工作日'} 内审核到账,遇国家法定节假日顺延 - - {feeRate && parseFloat(feeRate) > 0 ? ( - - - 每笔提现将收取 {feeRate}% 的服务手续费,从提现金额中直接扣除 - - ) : ( - - - 当前活动期间免收提现手续费,全额到账 - - )} - - - 提现金额将原路退回至您的支付账户,请确保账户状态正常 - - + )} - {/* 底部按钮 */} - - - {submitting ? '提交中...' : '确认提现'} - - - 提交即表示您已阅读并同意以上提现规则 - + + {submitting ? '提交中...' : '确认提现'} (response: any, config: RequestConfig): T => { if (typeof data === 'object' && data !== null && 'code' in data) { const apiResponse = data as ApiResponse - if (apiResponse.code === 0 || apiResponse.code === 200) { + if (apiResponse.code === 0) { return (config.returnRaw ? data : apiResponse.data) as T } diff --git a/src_bak/api/cms/cmsAd/index.ts b/src_bak/api/cms/cmsAd/index.ts new file mode 100644 index 0000000..37dae87 --- /dev/null +++ b/src_bak/api/cms/cmsAd/index.ts @@ -0,0 +1,115 @@ +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 new file mode 100644 index 0000000..99cd4eb --- /dev/null +++ b/src_bak/api/cms/cmsAd/model/index.ts @@ -0,0 +1,60 @@ +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 new file mode 100644 index 0000000..55c042b --- /dev/null +++ b/src_bak/api/cms/cmsAdRecord/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..0ecf5d1 --- /dev/null +++ b/src_bak/api/cms/cmsAdRecord/model/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..608c0e5 --- /dev/null +++ b/src_bak/api/cms/cmsArticle/index.ts @@ -0,0 +1,218 @@ +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 new file mode 100644 index 0000000..5206b48 --- /dev/null +++ b/src_bak/api/cms/cmsArticle/model/index.ts @@ -0,0 +1,132 @@ +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 new file mode 100644 index 0000000..ba607c1 --- /dev/null +++ b/src_bak/api/cms/cmsArticleCategory/index.ts @@ -0,0 +1,108 @@ +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 new file mode 100644 index 0000000..4270213 --- /dev/null +++ b/src_bak/api/cms/cmsArticleCategory/model/index.ts @@ -0,0 +1,59 @@ +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 new file mode 100644 index 0000000..50b9806 --- /dev/null +++ b/src_bak/api/cms/cmsArticleComment/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CmsArticleComment, CmsArticleCommentParam } from './model'; + + +/** + * 分页查询文章评论表 + */ +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 new file mode 100644 index 0000000..2490228 --- /dev/null +++ b/src_bak/api/cms/cmsArticleComment/model/index.ts @@ -0,0 +1,47 @@ +import type { PageParam } from '@/api'; + +/** + * 文章评论表 + */ +export interface CmsArticleComment { + // 评价ID + commentId?: number; + // 文章ID + articleId?: number; + // 评分 (10好评 20中评 30差评) + score?: number; + // 评价内容 + content?: string; + // 是否为图片评价 + isPicture?: number; + // 评论者ID + userId?: number; + // 被评价者ID + toUserId?: number; + // 回复的评论ID + replyCommentId?: number; + // 回复者ID + replyUserId?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 备注 + comments?: string; + // 状态, 0未读, 1已读 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 文章评论表搜索条件 + */ +export interface CmsArticleCommentParam extends PageParam { + commentId?: number; + keywords?: string; +} diff --git a/src_bak/api/cms/cmsArticleContent/index.ts b/src_bak/api/cms/cmsArticleContent/index.ts new file mode 100644 index 0000000..8c3ca00 --- /dev/null +++ b/src_bak/api/cms/cmsArticleContent/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..432c376 --- /dev/null +++ b/src_bak/api/cms/cmsArticleContent/model/index.ts @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..fc02eb1 --- /dev/null +++ b/src_bak/api/cms/cmsArticleCount/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..9cfbc24 --- /dev/null +++ b/src_bak/api/cms/cmsArticleCount/model/index.ts @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..eca990c --- /dev/null +++ b/src_bak/api/cms/cmsArticleLike/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..ccee27a --- /dev/null +++ b/src_bak/api/cms/cmsArticleLike/model/index.ts @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..c765f33 --- /dev/null +++ b/src_bak/api/cms/cmsComponents/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..f3fc8f5 --- /dev/null +++ b/src_bak/api/cms/cmsComponents/model/index.ts @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..44696ff --- /dev/null +++ b/src_bak/api/cms/cmsDesign/index.ts @@ -0,0 +1,102 @@ +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 new file mode 100644 index 0000000..d1a8c1c --- /dev/null +++ b/src_bak/api/cms/cmsDesign/model/index.ts @@ -0,0 +1,60 @@ +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 new file mode 100644 index 0000000..f1ea541 --- /dev/null +++ b/src_bak/api/cms/cmsDesignRecord/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..0c6e809 --- /dev/null +++ b/src_bak/api/cms/cmsDesignRecord/model/index.ts @@ -0,0 +1,51 @@ +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 new file mode 100644 index 0000000..585b1e4 --- /dev/null +++ b/src_bak/api/cms/cmsDocs/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..1c8c78d --- /dev/null +++ b/src_bak/api/cms/cmsDocs/model/index.ts @@ -0,0 +1,45 @@ +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 new file mode 100644 index 0000000..15b6766 --- /dev/null +++ b/src_bak/api/cms/cmsDocsBook/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..5e02d44 --- /dev/null +++ b/src_bak/api/cms/cmsDocsBook/model/index.ts @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..1b64435 --- /dev/null +++ b/src_bak/api/cms/cmsDocsContent/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..dc06432 --- /dev/null +++ b/src_bak/api/cms/cmsDocsContent/model/index.ts @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..748a5d5 --- /dev/null +++ b/src_bak/api/cms/cmsDomain/index.ts @@ -0,0 +1,151 @@ +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 new file mode 100644 index 0000000..377e838 --- /dev/null +++ b/src_bak/api/cms/cmsDomain/model/index.ts @@ -0,0 +1,44 @@ +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 new file mode 100644 index 0000000..19988a7 --- /dev/null +++ b/src_bak/api/cms/cmsForm/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..6e43ff9 --- /dev/null +++ b/src_bak/api/cms/cmsForm/model/index.ts @@ -0,0 +1,53 @@ +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 new file mode 100644 index 0000000..376bf44 --- /dev/null +++ b/src_bak/api/cms/cmsFormRecord/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..87624d1 --- /dev/null +++ b/src_bak/api/cms/cmsFormRecord/model/index.ts @@ -0,0 +1,41 @@ +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 new file mode 100644 index 0000000..bda1b17 --- /dev/null +++ b/src_bak/api/cms/cmsLang/index.ts @@ -0,0 +1,105 @@ +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 new file mode 100644 index 0000000..2dae25f --- /dev/null +++ b/src_bak/api/cms/cmsLang/model/index.ts @@ -0,0 +1,39 @@ +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 new file mode 100644 index 0000000..056858b --- /dev/null +++ b/src_bak/api/cms/cmsLangLog/index.ts @@ -0,0 +1,105 @@ +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 new file mode 100644 index 0000000..0d1cc29 --- /dev/null +++ b/src_bak/api/cms/cmsLangLog/model/index.ts @@ -0,0 +1,27 @@ +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 new file mode 100644 index 0000000..1d6def0 --- /dev/null +++ b/src_bak/api/cms/cmsLink/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..1258a5c --- /dev/null +++ b/src_bak/api/cms/cmsLink/model/index.ts @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..77bee6d --- /dev/null +++ b/src_bak/api/cms/cmsModel/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..4c1c7f7 --- /dev/null +++ b/src_bak/api/cms/cmsModel/model/index.ts @@ -0,0 +1,57 @@ +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 new file mode 100644 index 0000000..4004efe --- /dev/null +++ b/src_bak/api/cms/cmsMp/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..b3eafe1 --- /dev/null +++ b/src_bak/api/cms/cmsMp/model/index.ts @@ -0,0 +1,61 @@ +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 new file mode 100644 index 0000000..563d06c --- /dev/null +++ b/src_bak/api/cms/cmsMpAd/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..3d061d6 --- /dev/null +++ b/src_bak/api/cms/cmsMpAd/model/index.ts @@ -0,0 +1,47 @@ +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 new file mode 100644 index 0000000..1eb216b --- /dev/null +++ b/src_bak/api/cms/cmsMpField/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..f573edb --- /dev/null +++ b/src_bak/api/cms/cmsMpField/model/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..91554af --- /dev/null +++ b/src_bak/api/cms/cmsMpMenu/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..7019e58 --- /dev/null +++ b/src_bak/api/cms/cmsMpMenu/model/index.ts @@ -0,0 +1,79 @@ +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 new file mode 100644 index 0000000..da3fd65 --- /dev/null +++ b/src_bak/api/cms/cmsMpPages/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..8b08ae1 --- /dev/null +++ b/src_bak/api/cms/cmsMpPages/model/index.ts @@ -0,0 +1,47 @@ +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 new file mode 100644 index 0000000..7eb316f --- /dev/null +++ b/src_bak/api/cms/cmsNavigation/index.ts @@ -0,0 +1,138 @@ +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 new file mode 100644 index 0000000..cdd4f0c --- /dev/null +++ b/src_bak/api/cms/cmsNavigation/model/index.ts @@ -0,0 +1,117 @@ +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 new file mode 100644 index 0000000..8224ddd --- /dev/null +++ b/src_bak/api/cms/cmsOrder/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..bde0439 --- /dev/null +++ b/src_bak/api/cms/cmsOrder/model/index.ts @@ -0,0 +1,69 @@ +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 new file mode 100644 index 0000000..145b031 --- /dev/null +++ b/src_bak/api/cms/cmsSpec/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..3a7913a --- /dev/null +++ b/src_bak/api/cms/cmsSpec/model/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..0983b22 --- /dev/null +++ b/src_bak/api/cms/cmsSpecValue/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..697279d --- /dev/null +++ b/src_bak/api/cms/cmsSpecValue/model/index.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..0679bcf --- /dev/null +++ b/src_bak/api/cms/cmsWebsite/index.ts @@ -0,0 +1,147 @@ +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 new file mode 100644 index 0000000..e12d132 --- /dev/null +++ b/src_bak/api/cms/cmsWebsite/model/index.ts @@ -0,0 +1,138 @@ +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 new file mode 100644 index 0000000..65644c6 --- /dev/null +++ b/src_bak/api/cms/cmsWebsiteField/index.ts @@ -0,0 +1,129 @@ +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 new file mode 100644 index 0000000..ec5967c --- /dev/null +++ b/src_bak/api/cms/cmsWebsiteField/model/index.ts @@ -0,0 +1,63 @@ +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 new file mode 100644 index 0000000..5ffcb84 --- /dev/null +++ b/src_bak/api/cms/link/index.ts @@ -0,0 +1,113 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Link, LinkParam } from './model'; + + +/** + * 分页查询链接 + */ +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 new file mode 100644 index 0000000..b22d9dc --- /dev/null +++ b/src_bak/api/cms/link/model/index.ts @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..396e464 --- /dev/null +++ b/src_bak/api/cms/mpOfficialMenu/index.ts @@ -0,0 +1,106 @@ +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 new file mode 100644 index 0000000..dc4cd02 --- /dev/null +++ b/src_bak/api/cms/mpOfficialMenu/model/index.ts @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..981f63c --- /dev/null +++ b/src_bak/api/index.ts @@ -0,0 +1,61 @@ +/** + * 接口统一返回结果 + */ +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 new file mode 100644 index 0000000..be70ca7 --- /dev/null +++ b/src_bak/api/json/china-provinces.geo.json @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"id":"65","size":"550","name":"新疆","cp":[84.9023,42.148],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7588],[96.416,42.7148],[95.9766,42.4951],[96.0645,42.3193],[96.2402,42.2314],[95.9766,41.9238],[95.2734,41.6162],[95.1855,41.792],[94.5703,41.4844],[94.043,41.0889],[93.8672,40.6934],[93.0762,40.6494],[92.6367,39.6387],[92.373,39.3311],[92.373,39.1113],[92.373,39.0234],[90.1758,38.4961],[90.3516,38.2324],[90.6152,38.3203],[90.5273,37.8369],[91.0547,37.4414],[91.3184,37.0898],[90.7031,36.7822],[90.791,36.6064],[91.0547,36.5186],[91.0547,36.0791],[90.8789,36.0352],[90,36.2549],[89.9121,36.0791],[89.7363,36.0791],[89.209,36.2988],[88.7695,36.3428],[88.5938,36.4746],[87.3633,36.4307],[86.2207,36.167],[86.1328,35.8594],[85.6055,35.6836],[85.0781,35.7275],[84.1992,35.376],[83.1445,35.4199],[82.8809,35.6836],[82.4414,35.7275],[82.002,35.332],[81.6504,35.2441],[80.4199,35.4199],[80.2441,35.2881],[80.332,35.1563],[80.2441,35.2002],[79.8926,34.8047],[79.8047,34.4971],[79.1016,34.4531],[79.0137,34.3213],[78.2227,34.7168],[78.0469,35.2441],[78.0469,35.5078],[77.4316,35.4639],[76.8164,35.6396],[76.5527,35.8594],[76.2012,35.8154],[75.9375,36.0352],[76.0254,36.4746],[75.8496,36.6943],[75.498,36.7383],[75.4102,36.958],[75.0586,37.002],[74.8828,36.9141],[74.7949,37.0459],[74.5313,37.0898],[74.5313,37.2217],[74.8828,37.2217],[75.1465,37.4414],[74.8828,37.5732],[74.9707,37.749],[74.8828,38.4521],[74.3555,38.6719],[74.1797,38.6719],[74.0918,38.54],[73.8281,38.584],[73.7402,38.8477],[73.8281,38.9795],[73.4766,39.375],[73.916,39.5068],[73.916,39.6826],[73.8281,39.7705],[74.0039,40.0342],[74.8828,40.3418],[74.7949,40.5176],[75.2344,40.4297],[75.5859,40.6494],[75.7617,40.2979],[76.377,40.3857],[76.9043,41.001],[77.6074,41.001],[78.1348,41.2207],[78.1348,41.3965],[80.1563,42.0557],[80.2441,42.2754],[80.1563,42.627],[80.2441,42.8467],[80.5078,42.8906],[80.4199,43.0664],[80.7715,43.1982],[80.4199,44.165],[80.4199,44.6045],[79.9805,44.8242],[79.9805,44.9561],[81.7383,45.3955],[82.0898,45.2197],[82.5293,45.2197],[82.2656,45.6592],[83.0566,47.2412],[83.6719,47.0215],[84.7266,47.0215],[84.9023,46.8896],[85.5176,47.0654],[85.6934,47.2852],[85.5176,48.1201],[85.7813,48.4277],[86.5723,48.5596],[86.8359,48.8232],[86.748,48.9551],[86.8359,49.1309],[87.8027,49.1748],[87.8906,48.999],[87.7148,48.9111],[88.0664,48.7354],[87.9785,48.6035],[88.5059,48.3838],[88.6816,48.1641],[89.1211,47.9883],[89.5605,48.0322],[89.7363,47.8564],[90.0879,47.8564],[90.3516,47.6807],[90.5273,47.2412],[90.8789,46.9775],[91.0547,46.582],[90.8789,46.3184],[91.0547,46.0107],[90.7031,45.7471],[90.7031,45.5273],[90.8789,45.2197],[91.582,45.0879],[93.5156,44.9561],[94.7461,44.3408],[95.3613,44.2969],[95.3613,44.0332],[95.5371,43.9014],[95.8887,43.2422],[96.3281,42.9346],[96.416,42.7588]]]}},{"type":"Feature","properties":{"id":"54","size":"550","name":"西藏","cp":[87.8695,31.6846],"childNum":7},"geometry":{"type":"Polygon","coordinates":[[[79.0137,34.3213],[79.1016,34.4531],[79.8047,34.4971],[79.8926,34.8047],[80.2441,35.2002],[80.332,35.1563],[80.2441,35.2881],[80.4199,35.4199],[81.6504,35.2441],[82.002,35.332],[82.4414,35.7275],[82.8809,35.6836],[83.1445,35.4199],[84.1992,35.376],[85.0781,35.7275],[85.6055,35.6836],[86.1328,35.8594],[86.2207,36.167],[87.3633,36.4307],[88.5938,36.4746],[88.7695,36.3428],[89.209,36.2988],[89.7363,36.0791],[89.3848,36.0352],[89.4727,35.9033],[89.7363,35.7715],[89.7363,35.4199],[89.4727,35.376],[89.4727,35.2441],[89.5605,34.8926],[89.8242,34.8486],[89.7363,34.6729],[89.8242,34.3652],[89.6484,34.0137],[90.0879,33.4863],[90.7031,33.1348],[91.4063,33.1348],[91.9336,32.8271],[92.1973,32.8271],[92.2852,32.7393],[92.9883,32.7393],[93.5156,32.4756],[93.7793,32.5635],[94.1309,32.4316],[94.6582,32.6074],[95.1855,32.4316],[95.0098,32.2998],[95.1855,32.3438],[95.2734,32.2119],[95.3613,32.168],[95.3613,31.9922],[95.4492,31.8164],[95.8008,31.6846],[95.9766,31.8164],[96.1523,31.5967],[96.2402,31.9482],[96.5039,31.7285],[96.8555,31.6846],[96.7676,31.9922],[97.2949,32.0801],[97.3828,32.5635],[97.7344,32.5195],[98.1738,32.3438],[98.4375,31.8604],[98.877,31.4209],[98.6133,31.2012],[98.9648,30.7617],[99.1406,29.2676],[98.9648,29.1357],[98.9648,28.8281],[98.7891,28.8721],[98.7891,29.0039],[98.7012,28.916],[98.6133,28.5205],[98.7891,28.3447],[98.7012,28.2129],[98.3496,28.125],[98.2617,28.3887],[98.1738,28.125],[97.5586,28.5205],[97.2949,28.0811],[97.3828,27.9053],[97.0313,27.7295],[96.5039,28.125],[95.7129,28.2568],[95.3613,28.125],[95.2734,27.9492],[94.2188,27.5537],[93.8672,27.0264],[93.6035,26.9385],[92.1094,26.8506],[92.0215,27.4658],[91.582,27.5537],[91.582,27.9053],[91.4063,28.0371],[91.0547,27.8613],[90.7031,28.0811],[89.8242,28.2129],[89.6484,28.1689],[89.1211,27.5977],[89.1211,27.334],[89.0332,27.2021],[88.7695,27.4219],[88.8574,27.9932],[88.6816,28.125],[88.1543,27.9053],[87.8906,27.9492],[87.7148,27.8174],[87.0996,27.8174],[86.748,28.125],[86.5723,28.125],[86.4844,27.9053],[86.1328,28.125],[86.0449,27.9053],[85.6934,28.3447],[85.6055,28.2568],[85.166,28.3447],[85.166,28.6523],[84.9023,28.5645],[84.4629,28.7402],[84.2871,28.8721],[84.1992,29.2236],[84.1113,29.2676],[83.584,29.1797],[83.2324,29.5752],[82.1777,30.0586],[82.0898,30.3223],[81.3867,30.3662],[81.2109,30.0146],[81.0352,30.2344],[80.0684,30.5859],[79.7168,30.9375],[79.0137,31.0693],[78.75,31.333],[78.8379,31.5967],[78.6621,31.8164],[78.75,31.9043],[78.4863,32.124],[78.3984,32.5195],[78.75,32.6953],[78.9258,32.3438],[79.2773,32.5635],[79.1016,33.1787],[78.6621,33.6621],[78.6621,34.1016],[78.9258,34.1455],[79.0137,34.3213]]]}},{"type":"Feature","properties":{"id":"15","size":"450","name":"内蒙古","cp":[111.670801,41.818311],"childNum":12},"geometry":{"type":"Polygon","coordinates":[[[97.207,42.8027],[99.4922,42.583],[100.8105,42.6709],[101.7773,42.4951],[102.041,42.2314],[102.7441,42.1436],[103.3594,41.8799],[103.8867,41.792],[104.502,41.8799],[104.502,41.6602],[105.0293,41.5723],[105.7324,41.9238],[107.4023,42.4512],[109.4238,42.4512],[110.3906,42.7588],[111.0059,43.3301],[111.9727,43.6816],[111.9727,43.8135],[111.4453,44.3848],[111.7969,45],[111.9727,45.0879],[113.6426,44.7363],[114.1699,44.9561],[114.5215,45.3955],[115.6641,45.4395],[116.1914,45.7031],[116.2793,45.9668],[116.543,46.2744],[117.334,46.3623],[117.4219,46.582],[117.7734,46.5381],[118.3008,46.7578],[118.7402,46.7139],[118.916,46.7578],[119.0918,46.6699],[119.707,46.626],[119.9707,46.7139],[119.707,47.1973],[118.4766,47.9883],[117.8613,48.0322],[117.334,47.6807],[116.8066,47.9004],[116.1914,47.8564],[115.9277,47.6807],[115.5762,47.9004],[115.4883,48.1641],[115.8398,48.252],[115.8398,48.5596],[116.7188,49.834],[117.7734,49.5264],[118.5645,49.9219],[119.2676,50.0977],[119.3555,50.3174],[119.1797,50.3613],[119.5313,50.7568],[119.5313,50.8887],[119.707,51.0645],[120.1465,51.6797],[120.6738,51.9434],[120.7617,52.1191],[120.7617,52.251],[120.5859,52.3389],[120.6738,52.5146],[120.4102,52.6465],[120.0586,52.6025],[120.0586,52.7344],[120.8496,53.2617],[121.4648,53.3496],[121.8164,53.042],[121.2012,52.5586],[121.6406,52.4268],[121.7285,52.2949],[121.9922,52.2949],[122.168,52.5146],[122.6953,52.251],[122.6074,52.0752],[122.959,51.3281],[123.3105,51.2402],[123.6621,51.3721],[124.3652,51.2842],[124.541,51.3721],[124.8926,51.3721],[125.0684,51.6357],[125.332,51.6357],[126.0352,51.0205],[125.7715,50.7568],[125.7715,50.5371],[125.332,50.1416],[125.1563,49.834],[125.2441,49.1748],[124.8047,49.1309],[124.4531,48.1201],[124.2773,48.5156],[122.4316,47.373],[123.0469,46.7139],[123.3984,46.8896],[123.3984,46.9775],[123.4863,46.9775],[123.5742,46.8457],[123.5742,46.8896],[123.5742,46.6699],[123.0469,46.582],[123.2227,46.2305],[122.7832,46.0107],[122.6953,45.7031],[122.4316,45.8789],[122.2559,45.791],[121.8164,46.0107],[121.7285,45.7471],[121.9043,45.7031],[122.2559,45.2637],[122.0801,44.8682],[122.3438,44.2529],[123.1348,44.4727],[123.4863,43.7256],[123.3105,43.5059],[123.6621,43.374],[123.5742,43.0225],[123.3105,42.9785],[123.1348,42.8027],[122.7832,42.7148],[122.3438,42.8467],[122.3438,42.6709],[121.9922,42.7148],[121.7285,42.4512],[121.4648,42.4951],[120.498,42.0996],[120.1465,41.7041],[119.8828,42.1875],[119.5313,42.3633],[119.3555,42.2754],[119.2676,41.7041],[119.4434,41.6162],[119.2676,41.3086],[118.3887,41.3086],[118.125,41.748],[118.3008,41.792],[118.3008,42.0996],[118.125,42.0557],[117.9492,42.2314],[118.0371,42.4072],[117.7734,42.627],[117.5098,42.583],[117.334,42.4512],[116.8945,42.4072],[116.8066,42.0117],[116.2793,42.0117],[116.0156,41.792],[115.9277,41.9238],[115.2246,41.5723],[114.9609,41.6162],[114.873,42.0996],[114.5215,42.1436],[114.1699,41.792],[114.2578,41.5723],[113.9063,41.4404],[113.9941,41.2207],[113.9063,41.1328],[114.082,40.7373],[114.082,40.5176],[113.8184,40.5176],[113.5547,40.3418],[113.2031,40.3857],[112.7637,40.166],[112.3242,40.2539],[111.9727,39.5947],[111.4453,39.6387],[111.3574,39.4189],[111.0938,39.375],[111.0938,39.5947],[110.6543,39.2871],[110.127,39.4629],[110.2148,39.2871],[109.8633,39.2432],[109.9512,39.1553],[108.9844,38.3203],[109.0723,38.0127],[108.8965,37.9688],[108.8086,38.0127],[108.7207,37.7051],[108.1934,37.6172],[107.666,37.8809],[107.3145,38.1006],[106.7871,38.1885],[106.5234,38.3203],[106.9629,38.9795],[106.7871,39.375],[106.3477,39.2871],[105.9082,38.7158],[105.8203,37.793],[104.3262,37.4414],[103.4473,37.8369],[103.3594,38.0127],[103.5352,38.1445],[103.4473,38.3643],[104.2383,38.9795],[104.0625,39.4189],[103.3594,39.3311],[103.0078,39.1113],[102.4805,39.2432],[101.8652,39.1113],[102.041,38.8916],[101.7773,38.6719],[101.3379,38.7598],[101.25,39.0234],[100.9863,38.9355],[100.8105,39.4189],[100.5469,39.4189],[100.0195,39.7705],[99.4922,39.8584],[100.1074,40.2539],[100.1953,40.6494],[99.9316,41.001],[99.2285,40.8691],[99.0527,40.6934],[98.9648,40.7813],[98.7891,40.6055],[98.5254,40.7373],[98.6133,40.6494],[98.3496,40.5615],[98.3496,40.9131],[97.4707,41.4844],[97.8223,41.6162],[97.8223,41.748],[97.207,42.8027]]]}},{"type":"Feature","properties":{"id":"63","size":"800","name":"青海","cp":[95.2402,35.4199],"childNum":8},"geometry":{"type":"Polygon","coordinates":[[[89.7363,36.0791],[89.9121,36.0791],[90,36.2549],[90.8789,36.0352],[91.0547,36.0791],[91.0547,36.5186],[90.791,36.6064],[90.7031,36.7822],[91.3184,37.0898],[91.0547,37.4414],[90.5273,37.8369],[90.6152,38.3203],[90.3516,38.2324],[90.1758,38.4961],[92.373,39.0234],[92.373,39.1113],[93.1641,39.1992],[93.1641,38.9795],[93.6914,38.9355],[93.8672,38.7158],[94.3066,38.7598],[94.5703,38.3643],[95.0098,38.4082],[95.4492,38.2764],[95.7129,38.3643],[96.2402,38.1006],[96.416,38.2324],[96.6797,38.1885],[96.6797,38.4521],[97.1191,38.584],[97.0313,39.1992],[98.1738,38.8037],[98.3496,39.0234],[98.6133,38.9355],[98.7891,39.0674],[99.1406,38.9355],[99.8438,38.3643],[100.1953,38.2764],[100.0195,38.4521],[100.1074,38.4961],[100.459,38.2764],[100.7227,38.2324],[101.1621,37.8369],[101.5137,37.8809],[101.7773,37.6172],[101.9531,37.7051],[102.1289,37.4414],[102.5684,37.1777],[102.4805,36.958],[102.6563,36.8262],[102.5684,36.7383],[102.832,36.3428],[103.0078,36.2549],[102.9199,36.0791],[102.9199,35.9033],[102.6563,35.7715],[102.832,35.5957],[102.4805,35.5957],[102.3047,35.4199],[102.3926,35.2002],[101.9531,34.8486],[101.9531,34.6289],[102.2168,34.4092],[102.1289,34.2773],[101.6895,34.1016],[100.9863,34.3652],[100.8105,34.2773],[101.25,33.6621],[101.5137,33.7061],[101.6016,33.5303],[101.7773,33.5303],[101.6895,33.3105],[101.7773,33.2227],[101.6016,33.1348],[101.1621,33.2227],[101.25,32.6953],[100.7227,32.6514],[100.7227,32.5195],[100.3711,32.7393],[100.1074,32.6514],[100.1074,32.8711],[99.8438,33.0029],[99.7559,32.7393],[99.2285,32.915],[99.2285,33.0469],[98.877,33.1787],[98.4375,34.0576],[97.8223,34.1895],[97.6465,34.1016],[97.7344,33.9258],[97.3828,33.8818],[97.4707,33.5742],[97.7344,33.3984],[97.3828,32.8711],[97.4707,32.6953],[97.7344,32.5195],[97.3828,32.5635],[97.2949,32.0801],[96.7676,31.9922],[96.8555,31.6846],[96.5039,31.7285],[96.2402,31.9482],[96.1523,31.5967],[95.9766,31.8164],[95.8008,31.6846],[95.4492,31.8164],[95.3613,31.9922],[95.3613,32.168],[95.2734,32.2119],[95.1855,32.3438],[95.0098,32.2998],[95.1855,32.4316],[94.6582,32.6074],[94.1309,32.4316],[93.7793,32.5635],[93.5156,32.4756],[92.9883,32.7393],[92.2852,32.7393],[92.1973,32.8271],[91.9336,32.8271],[91.4063,33.1348],[90.7031,33.1348],[90.0879,33.4863],[89.6484,34.0137],[89.8242,34.3652],[89.7363,34.6729],[89.8242,34.8486],[89.5605,34.8926],[89.4727,35.2441],[89.4727,35.376],[89.7363,35.4199],[89.7363,35.7715],[89.4727,35.9033],[89.3848,36.0352],[89.7363,36.0791]]]}},{"type":"Feature","properties":{"id":"51","size":"900","name":"四川","cp":[101.9199,30.1904],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[101.7773,33.5303],[101.8652,33.5742],[101.9531,33.4424],[101.8652,33.0908],[102.4805,33.4424],[102.2168,33.9258],[102.9199,34.3213],[103.0957,34.1895],[103.1836,33.7939],[104.1504,33.6182],[104.2383,33.3984],[104.4141,33.3105],[104.3262,33.2227],[104.4141,33.0469],[104.3262,32.8711],[104.4141,32.7393],[105.2051,32.6074],[105.3809,32.7393],[105.3809,32.8711],[105.4688,32.915],[105.5566,32.7393],[106.084,32.8711],[106.084,32.7393],[106.3477,32.6514],[107.0508,32.6953],[107.1387,32.4756],[107.2266,32.4316],[107.4023,32.5195],[108.0176,32.168],[108.2813,32.2559],[108.5449,32.2119],[108.3691,32.168],[108.2813,31.9043],[108.5449,31.6846],[108.1934,31.5088],[107.9297,30.8496],[107.4902,30.8496],[107.4023,30.7617],[107.4902,30.6299],[107.0508,30.0146],[106.7871,30.0146],[106.6113,30.3223],[106.2598,30.1904],[105.8203,30.4541],[105.6445,30.2783],[105.5566,30.1025],[105.7324,29.8828],[105.293,29.5313],[105.4688,29.3115],[105.7324,29.2676],[105.8203,28.96],[106.2598,28.8721],[106.3477,28.5205],[105.9961,28.7402],[105.6445,28.4326],[105.9082,28.125],[106.1719,28.125],[106.3477,27.8174],[105.6445,27.6416],[105.5566,27.7734],[105.293,27.7295],[105.2051,27.9932],[105.0293,28.0811],[104.8535,27.9053],[104.4141,27.9492],[104.3262,28.0371],[104.4141,28.125],[104.4141,28.2568],[104.2383,28.4326],[104.4141,28.6084],[103.8867,28.6523],[103.7988,28.3008],[103.4473,28.125],[103.4473,27.7734],[102.9199,27.29],[103.0078,26.3672],[102.6563,26.1914],[102.5684,26.3672],[102.1289,26.1035],[101.8652,26.0596],[101.6016,26.2354],[101.6895,26.3672],[101.4258,26.5869],[101.4258,26.8066],[101.4258,26.7188],[101.1621,27.0264],[101.1621,27.1582],[100.7227,27.8613],[100.3711,27.8174],[100.2832,27.7295],[100.0195,28.125],[100.1953,28.3447],[99.668,28.8281],[99.4043,28.5205],[99.4043,28.1689],[99.2285,28.3008],[99.1406,29.2676],[98.9648,30.7617],[98.6133,31.2012],[98.877,31.4209],[98.4375,31.8604],[98.1738,32.3438],[97.7344,32.5195],[97.4707,32.6953],[97.3828,32.8711],[97.7344,33.3984],[97.4707,33.5742],[97.3828,33.8818],[97.7344,33.9258],[97.6465,34.1016],[97.8223,34.1895],[98.4375,34.0576],[98.877,33.1787],[99.2285,33.0469],[99.2285,32.915],[99.7559,32.7393],[99.8438,33.0029],[100.1074,32.8711],[100.1074,32.6514],[100.3711,32.7393],[100.7227,32.5195],[100.7227,32.6514],[101.25,32.6953],[101.1621,33.2227],[101.6016,33.1348],[101.7773,33.2227],[101.6895,33.3105],[101.7773,33.5303]]]}},{"type":"Feature","properties":{"id":"23","size":"700","name":"黑龙江","cp":[128.642464,46.756967],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[121.4648,53.3496],[123.6621,53.5693],[124.8926,53.0859],[125.0684,53.2178],[125.5957,53.0859],[125.6836,52.9102],[126.123,52.7783],[126.0352,52.6025],[126.2109,52.5146],[126.3867,52.2949],[126.3867,52.207],[126.5625,52.1631],[126.4746,51.9434],[126.9141,51.3721],[126.8262,51.2842],[127.002,51.3281],[126.9141,51.1084],[127.2656,50.7568],[127.3535,50.2734],[127.6172,50.2295],[127.5293,49.8779],[127.793,49.6143],[128.7598,49.5703],[129.1113,49.3506],[129.4629,49.4385],[130.2539,48.8672],[130.6934,48.8672],[130.5176,48.6475],[130.8691,48.2959],[130.6934,48.1201],[131.0449,47.6807],[132.5391,47.7246],[132.627,47.9443],[133.0664,48.1201],[133.5059,48.1201],[134.209,48.3838],[135.0879,48.4277],[134.7363,48.252],[134.5605,47.9883],[134.7363,47.6807],[134.5605,47.4609],[134.3848,47.4609],[134.209,47.2852],[134.209,47.1533],[133.8574,46.5381],[133.9453,46.2744],[133.5059,45.835],[133.418,45.5713],[133.2422,45.5273],[133.0664,45.1318],[132.8906,45.0439],[131.9238,45.3516],[131.5723,45.0439],[131.0449,44.8682],[131.3086,44.0771],[131.2207,43.7256],[131.3086,43.4619],[130.8691,43.418],[130.5176,43.6377],[130.3418,43.9893],[129.9902,43.8574],[129.9023,44.0332],[129.8145,43.9014],[129.2871,43.8135],[129.1992,43.5938],[128.8477,43.5498],[128.4961,44.165],[128.4082,44.4727],[128.0566,44.3408],[128.0566,44.1211],[127.7051,44.1211],[127.5293,44.6045],[127.0898,44.6045],[127.002,44.7803],[127.0898,45],[126.9141,45.1318],[126.5625,45.2637],[126.0352,45.1758],[125.7715,45.3076],[125.6836,45.5273],[125.0684,45.3955],[124.8926,45.5273],[124.3652,45.4395],[124.0137,45.7471],[123.9258,46.2305],[123.2227,46.2305],[123.0469,46.582],[123.5742,46.6699],[123.5742,46.8896],[123.5742,46.8457],[123.4863,46.9775],[123.3984,46.9775],[123.3984,46.8896],[123.0469,46.7139],[122.4316,47.373],[124.2773,48.5156],[124.4531,48.1201],[124.8047,49.1309],[125.2441,49.1748],[125.1563,49.834],[125.332,50.1416],[125.7715,50.5371],[125.7715,50.7568],[126.0352,51.0205],[125.332,51.6357],[125.0684,51.6357],[124.8926,51.3721],[124.541,51.3721],[124.3652,51.2842],[123.6621,51.3721],[123.3105,51.2402],[122.959,51.3281],[122.6074,52.0752],[122.6953,52.251],[122.168,52.5146],[121.9922,52.2949],[121.7285,52.2949],[121.6406,52.4268],[121.2012,52.5586],[121.8164,53.042],[121.4648,53.3496]]]}},{"type":"Feature","properties":{"id":"62","size":"690","name":"甘肃","cp":[103.823557,36.058039],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7148],[97.207,42.8027],[97.8223,41.748],[97.8223,41.6162],[97.4707,41.4844],[98.3496,40.9131],[98.3496,40.5615],[98.6133,40.6494],[98.5254,40.7373],[98.7891,40.6055],[98.9648,40.7813],[99.0527,40.6934],[99.2285,40.8691],[99.9316,41.001],[100.1953,40.6494],[100.1074,40.2539],[99.4922,39.8584],[100.0195,39.7705],[100.5469,39.4189],[100.8105,39.4189],[100.9863,38.9355],[101.25,39.0234],[101.3379,38.7598],[101.7773,38.6719],[102.041,38.8916],[101.8652,39.1113],[102.4805,39.2432],[103.0078,39.1113],[103.3594,39.3311],[104.0625,39.4189],[104.2383,38.9795],[103.4473,38.3643],[103.5352,38.1445],[103.3594,38.0127],[103.4473,37.8369],[104.3262,37.4414],[104.5898,37.4414],[104.5898,37.2217],[104.8535,37.2217],[105.293,36.8262],[105.2051,36.6943],[105.4688,36.123],[105.293,35.9912],[105.3809,35.7715],[105.7324,35.7275],[105.8203,35.5518],[105.9961,35.4639],[105.9082,35.4199],[105.9961,35.4199],[106.084,35.376],[106.2598,35.4199],[106.3477,35.2441],[106.5234,35.332],[106.4355,35.6836],[106.6992,35.6836],[106.9629,35.8154],[106.875,36.123],[106.5234,36.2549],[106.5234,36.4746],[106.4355,36.5625],[106.6113,36.7822],[106.6113,37.0898],[107.3145,37.0898],[107.3145,36.9141],[108.7207,36.3428],[108.6328,35.9912],[108.5449,35.8594],[108.6328,35.5518],[108.5449,35.2881],[107.7539,35.2881],[107.7539,35.1123],[107.8418,35.0244],[107.666,34.9365],[107.2266,34.8926],[106.9629,35.0684],[106.6113,35.0684],[106.5234,34.7607],[106.3477,34.585],[106.6992,34.3213],[106.5234,34.2773],[106.6113,34.1455],[106.4355,33.9258],[106.5234,33.5303],[105.9961,33.6182],[105.7324,33.3984],[105.9961,33.1787],[105.9082,33.0029],[105.4688,32.915],[105.3809,32.8711],[105.3809,32.7393],[105.2051,32.6074],[104.4141,32.7393],[104.3262,32.8711],[104.4141,33.0469],[104.3262,33.2227],[104.4141,33.3105],[104.2383,33.3984],[104.1504,33.6182],[103.1836,33.7939],[103.0957,34.1895],[102.9199,34.3213],[102.2168,33.9258],[102.4805,33.4424],[101.8652,33.0908],[101.9531,33.4424],[101.8652,33.5742],[101.7773,33.5303],[101.6016,33.5303],[101.5137,33.7061],[101.25,33.6621],[100.8105,34.2773],[100.9863,34.3652],[101.6895,34.1016],[102.1289,34.2773],[102.2168,34.4092],[101.9531,34.6289],[101.9531,34.8486],[102.3926,35.2002],[102.3047,35.4199],[102.4805,35.5957],[102.832,35.5957],[102.6563,35.7715],[102.9199,35.9033],[102.9199,36.0791],[103.0078,36.2549],[102.832,36.3428],[102.5684,36.7383],[102.6563,36.8262],[102.4805,36.958],[102.5684,37.1777],[102.1289,37.4414],[101.9531,37.7051],[101.7773,37.6172],[101.5137,37.8809],[101.1621,37.8369],[100.7227,38.2324],[100.459,38.2764],[100.1074,38.4961],[100.0195,38.4521],[100.1953,38.2764],[99.8438,38.3643],[99.1406,38.9355],[98.7891,39.0674],[98.6133,38.9355],[98.3496,39.0234],[98.1738,38.8037],[97.0313,39.1992],[97.1191,38.584],[96.6797,38.4521],[96.6797,38.1885],[96.416,38.2324],[96.2402,38.1006],[95.7129,38.3643],[95.4492,38.2764],[95.0098,38.4082],[94.5703,38.3643],[94.3066,38.7598],[93.8672,38.7158],[93.6914,38.9355],[93.1641,38.9795],[93.1641,39.1992],[92.373,39.1113],[92.373,39.3311],[92.6367,39.6387],[93.0762,40.6494],[93.8672,40.6934],[94.043,41.0889],[94.5703,41.4844],[95.1855,41.792],[95.2734,41.6162],[95.9766,41.9238],[96.2402,42.2314],[96.0645,42.3193],[95.9766,42.4951],[96.416,42.7148]]]}},{"type":"Feature","properties":{"id":"53","size":"1200","name":"云南","cp":[101.512251,24.740609],"childNum":16},"geometry":{"type":"Polygon","coordinates":[[[98.1738,28.125],[98.2617,28.3887],[98.3496,28.125],[98.7012,28.2129],[98.7891,28.3447],[98.6133,28.5205],[98.7012,28.916],[98.7891,29.0039],[98.7891,28.8721],[98.9648,28.8281],[98.9648,29.1357],[99.1406,29.2676],[99.2285,28.3008],[99.4043,28.1689],[99.4043,28.5205],[99.668,28.8281],[100.1953,28.3447],[100.0195,28.125],[100.2832,27.7295],[100.3711,27.8174],[100.7227,27.8613],[101.1621,27.1582],[101.1621,27.0264],[101.4258,26.7188],[101.4258,26.8066],[101.4258,26.5869],[101.6895,26.3672],[101.6016,26.2354],[101.8652,26.0596],[102.1289,26.1035],[102.5684,26.3672],[102.6563,26.1914],[103.0078,26.3672],[102.9199,27.29],[103.4473,27.7734],[103.4473,28.125],[103.7988,28.3008],[103.8867,28.6523],[104.4141,28.6084],[104.2383,28.4326],[104.4141,28.2568],[104.4141,28.125],[104.3262,28.0371],[104.4141,27.9492],[104.8535,27.9053],[105.0293,28.0811],[105.2051,27.9932],[105.293,27.7295],[105.2051,27.3779],[104.5898,27.334],[104.4141,27.4658],[104.1504,27.2461],[103.8867,27.4219],[103.623,27.0264],[103.7109,26.9824],[103.7109,26.7627],[103.8867,26.543],[104.4141,26.6748],[104.6777,26.4111],[104.3262,25.708],[104.8535,25.2246],[104.5898,25.0488],[104.6777,24.9609],[104.502,24.7412],[104.6777,24.3457],[104.7656,24.4775],[105.0293,24.4336],[105.2051,24.082],[105.4688,24.0381],[105.5566,24.126],[105.9961,24.126],[106.1719,23.8184],[106.1719,23.5547],[105.6445,23.4229],[105.5566,23.2031],[105.293,23.3789],[104.8535,23.1592],[104.7656,22.8516],[104.3262,22.6758],[104.1504,22.8076],[103.9746,22.5439],[103.623,22.7637],[103.5352,22.5879],[103.3594,22.8076],[103.0957,22.4561],[102.4805,22.7637],[102.3047,22.4121],[101.8652,22.3682],[101.7773,22.5],[101.6016,22.1924],[101.8652,21.6211],[101.7773,21.1377],[101.6016,21.2256],[101.25,21.1816],[101.1621,21.7529],[100.6348,21.4453],[100.1074,21.4893],[99.9316,22.0605],[99.2285,22.1484],[99.4043,22.5879],[99.3164,22.7197],[99.4922,23.0713],[98.877,23.2031],[98.7012,23.9502],[98.877,24.126],[98.1738,24.082],[97.7344,23.8623],[97.5586,23.9063],[97.7344,24.126],[97.6465,24.4336],[97.5586,24.4336],[97.5586,24.7412],[97.7344,24.8291],[97.8223,25.2686],[98.1738,25.4004],[98.1738,25.6201],[98.3496,25.5762],[98.5254,25.8398],[98.7012,25.8838],[98.6133,26.0596],[98.7012,26.1475],[98.7891,26.5869],[98.7012,27.5098],[98.5254,27.6416],[98.3496,27.5098],[98.1738,28.125]]]}},{"type":"Feature","properties":{"id":"45","size":"1450","name":"广西","cp":[107.7813,23.6426],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[104.502,24.7412],[104.6777,24.6094],[105.2051,24.9609],[105.9961,24.6533],[106.1719,24.7852],[106.1719,24.9609],[106.875,25.1807],[107.0508,25.2686],[106.9629,25.4883],[107.2266,25.6201],[107.4902,25.2246],[107.7539,25.2246],[107.8418,25.1367],[108.1055,25.2246],[108.1934,25.4443],[108.3691,25.5322],[108.6328,25.3125],[108.6328,25.5762],[109.0723,25.5322],[108.9844,25.752],[109.3359,25.708],[109.5117,26.0156],[109.7754,25.8838],[109.9512,26.1914],[110.2148,25.9717],[110.5664,26.3232],[111.1816,26.3232],[111.2695,26.2354],[111.2695,25.8838],[111.4453,25.8398],[111.0059,25.0049],[111.0938,24.9609],[111.3574,25.1367],[111.5332,24.6533],[111.709,24.7852],[112.0605,24.7412],[111.8848,24.6533],[112.0605,24.3457],[111.8848,24.2139],[111.8848,23.9941],[111.7969,23.8184],[111.6211,23.8184],[111.6211,23.6865],[111.3574,23.4668],[111.4453,23.0273],[111.2695,22.8076],[110.7422,22.5439],[110.7422,22.2803],[110.6543,22.1484],[110.3027,22.1484],[110.3027,21.8848],[109.9512,21.8408],[109.8633,21.665],[109.7754,21.6211],[109.7754,21.4014],[109.5996,21.4453],[109.1602,21.3574],[109.248,20.874],[109.0723,20.9619],[109.0723,21.5332],[108.7207,21.5332],[108.6328,21.665],[108.2813,21.4893],[107.8418,21.6211],[107.4023,21.6211],[107.0508,21.7969],[107.0508,21.9287],[106.6992,22.0166],[106.6113,22.4121],[106.7871,22.7637],[106.6992,22.8955],[105.9082,22.9395],[105.5566,23.0713],[105.5566,23.2031],[105.6445,23.4229],[106.1719,23.5547],[106.1719,23.8184],[105.9961,24.126],[105.5566,24.126],[105.4688,24.0381],[105.2051,24.082],[105.0293,24.4336],[104.7656,24.4775],[104.6777,24.3457],[104.502,24.7412]]]}},{"type":"Feature","properties":{"id":"43","size":"1700","name":"湖南","cp":[111.782279,28.09409],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[109.248,28.4766],[109.248,29.1357],[109.5117,29.6191],[109.6875,29.6191],[109.7754,29.751],[110.4785,29.6631],[110.6543,29.751],[110.4785,30.0146],[110.8301,30.1465],[111.7969,29.9268],[112.2363,29.5313],[112.5,29.6191],[112.6758,29.5752],[112.9395,29.7949],[113.0273,29.751],[112.9395,29.4873],[113.0273,29.4434],[113.5547,29.8389],[113.5547,29.707],[113.7305,29.5752],[113.6426,29.3115],[113.7305,29.0918],[113.9063,29.0479],[114.1699,28.8281],[114.082,28.5645],[114.2578,28.3447],[113.7305,27.9492],[113.6426,27.5977],[113.6426,27.3779],[113.8184,27.29],[113.7305,27.1143],[113.9063,26.9385],[113.9063,26.6309],[114.082,26.5869],[113.9941,26.1914],[114.2578,26.1475],[113.9941,26.0596],[113.9063,25.4443],[113.6426,25.3125],[113.2031,25.5322],[112.8516,25.3564],[113.0273,25.2246],[113.0273,24.9609],[112.8516,24.917],[112.5879,25.1367],[112.2363,25.1807],[112.1484,24.873],[112.0605,24.7412],[111.709,24.7852],[111.5332,24.6533],[111.3574,25.1367],[111.0938,24.9609],[111.0059,25.0049],[111.4453,25.8398],[111.2695,25.8838],[111.2695,26.2354],[111.1816,26.3232],[110.5664,26.3232],[110.2148,25.9717],[109.9512,26.1914],[109.7754,25.8838],[109.5117,26.0156],[109.4238,26.2793],[109.248,26.3232],[109.4238,26.5869],[109.3359,26.7188],[109.5117,26.8066],[109.5117,27.0264],[109.3359,27.1582],[108.8965,27.0264],[108.8086,27.1143],[109.4238,27.5977],[109.3359,27.9053],[109.3359,28.2568],[109.248,28.4766]]]}},{"type":"Feature","properties":{"id":"61","size":"1150","name":"陕西","cp":[108.948024,34.263161],"childNum":10},"geometry":{"type":"Polygon","coordinates":[[[105.4688,32.915],[105.9082,33.0029],[105.9961,33.1787],[105.7324,33.3984],[105.9961,33.6182],[106.5234,33.5303],[106.4355,33.9258],[106.6113,34.1455],[106.5234,34.2773],[106.6992,34.3213],[106.3477,34.585],[106.5234,34.7607],[106.6113,35.0684],[106.9629,35.0684],[107.2266,34.8926],[107.666,34.9365],[107.8418,35.0244],[107.7539,35.1123],[107.7539,35.2881],[108.5449,35.2881],[108.6328,35.5518],[108.5449,35.8594],[108.6328,35.9912],[108.7207,36.3428],[107.3145,36.9141],[107.3145,37.0898],[107.3145,37.6172],[107.666,37.8809],[108.1934,37.6172],[108.7207,37.7051],[108.8086,38.0127],[108.8965,37.9688],[109.0723,38.0127],[108.9844,38.3203],[109.9512,39.1553],[109.8633,39.2432],[110.2148,39.2871],[110.127,39.4629],[110.6543,39.2871],[111.0938,39.5947],[111.0938,39.375],[111.1816,39.2432],[110.918,38.7158],[110.8301,38.4961],[110.4785,38.1885],[110.4785,37.9688],[110.8301,37.6611],[110.3906,37.002],[110.4785,36.123],[110.5664,35.6396],[110.2148,34.8926],[110.2148,34.6729],[110.3906,34.585],[110.4785,34.2334],[110.6543,34.1455],[110.6543,33.8379],[111.0059,33.5303],[111.0059,33.2666],[110.7422,33.1348],[110.5664,33.2666],[110.3027,33.1787],[109.5996,33.2666],[109.4238,33.1348],[109.7754,33.0469],[109.7754,32.915],[110.127,32.7393],[110.127,32.6074],[109.6875,32.6074],[109.5117,32.4316],[109.5996,31.7285],[109.248,31.7285],[109.0723,31.9482],[108.5449,32.2119],[108.2813,32.2559],[108.0176,32.168],[107.4023,32.5195],[107.2266,32.4316],[107.1387,32.4756],[107.0508,32.6953],[106.3477,32.6514],[106.084,32.7393],[106.084,32.8711],[105.5566,32.7393],[105.4688,32.915]]]}},{"type":"Feature","properties":{"id":"44","size":"1600","name":"广东","cp":[113.280637,23.125178],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[109.7754,21.4014],[109.7754,21.6211],[109.8633,21.665],[109.9512,21.8408],[110.3027,21.8848],[110.3027,22.1484],[110.6543,22.1484],[110.7422,22.2803],[110.7422,22.5439],[111.2695,22.8076],[111.4453,23.0273],[111.3574,23.4668],[111.6211,23.6865],[111.6211,23.8184],[111.7969,23.8184],[111.8848,23.9941],[111.8848,24.2139],[112.0605,24.3457],[111.8848,24.6533],[112.0605,24.7412],[112.1484,24.873],[112.2363,25.1807],[112.5879,25.1367],[112.8516,24.917],[113.0273,24.9609],[113.0273,25.2246],[112.8516,25.3564],[113.2031,25.5322],[113.6426,25.3125],[113.9063,25.4443],[113.9941,25.2686],[114.6094,25.4004],[114.7852,25.2686],[114.6973,25.1367],[114.4336,24.9609],[114.1699,24.6973],[114.4336,24.5215],[115.4004,24.7852],[115.8398,24.5654],[115.752,24.7852],[115.9277,24.917],[116.2793,24.7852],[116.3672,24.873],[116.543,24.6094],[116.7188,24.6533],[116.9824,24.1699],[116.9824,23.9063],[117.1582,23.5547],[117.334,23.2471],[116.8945,23.3789],[116.6309,23.1152],[116.543,22.8516],[115.9277,22.7197],[115.6641,22.7637],[115.5762,22.6318],[115.0488,22.6758],[114.6094,22.3682],[114.3457,22.5439],[113.9941,22.5],[113.8184,22.1924],[114.3457,22.1484],[114.4336,22.0166],[114.082,21.9287],[113.9941,21.7969],[113.5547,22.0166],[113.1152,21.8408],[112.9395,21.5771],[112.4121,21.4453],[112.2363,21.5332],[111.5332,21.4893],[111.2695,21.3574],[110.7422,21.3574],[110.6543,21.2256],[110.7422,20.918],[110.4785,20.874],[110.6543,20.2588],[110.5664,20.2588],[110.3906,20.127],[110.0391,20.127],[109.8633,20.127],[109.8633,20.3027],[109.5996,20.918],[109.7754,21.4014],[109.7754,21.4014]],[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}},{"type":"Feature","properties":{"id":"22","size":"1120","name":"吉林","cp":[125.7746,43.5938],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[123.2227,46.2305],[123.9258,46.2305],[124.0137,45.7471],[124.3652,45.4395],[124.8926,45.5273],[125.0684,45.3955],[125.6836,45.5273],[125.7715,45.3076],[126.0352,45.1758],[126.5625,45.2637],[126.9141,45.1318],[127.0898,45],[127.002,44.7803],[127.0898,44.6045],[127.5293,44.6045],[127.7051,44.1211],[128.0566,44.1211],[128.0566,44.3408],[128.4082,44.4727],[128.4961,44.165],[128.8477,43.5498],[129.1992,43.5938],[129.2871,43.8135],[129.8145,43.9014],[129.9023,44.0332],[129.9902,43.8574],[130.3418,43.9893],[130.5176,43.6377],[130.8691,43.418],[131.3086,43.4619],[131.3086,43.3301],[131.1328,42.9346],[130.4297,42.7148],[130.6055,42.6709],[130.6055,42.4512],[130.2539,42.7588],[130.2539,42.8906],[130.166,42.9785],[129.9023,43.0225],[129.7266,42.4951],[129.375,42.4512],[128.9355,42.0117],[128.0566,42.0117],[128.3203,41.5723],[128.1445,41.3525],[127.0898,41.5283],[127.1777,41.5723],[126.9141,41.792],[126.6504,41.6602],[126.4746,41.3965],[126.123,40.957],[125.6836,40.8691],[125.5957,40.9131],[125.7715,41.2207],[125.332,41.6602],[125.332,41.9678],[125.4199,42.0996],[125.332,42.1436],[124.8926,42.8027],[124.8926,43.0664],[124.7168,43.0664],[124.4531,42.8467],[124.2773,43.2422],[123.8379,43.4619],[123.6621,43.374],[123.3105,43.5059],[123.4863,43.7256],[123.1348,44.4727],[122.3438,44.2529],[122.0801,44.8682],[122.2559,45.2637],[121.9043,45.7031],[121.7285,45.7471],[121.8164,46.0107],[122.2559,45.791],[122.4316,45.8789],[122.6953,45.7031],[122.7832,46.0107],[123.2227,46.2305]]]}},{"type":"Feature","properties":{"id":"13","size":"1300","name":"河北","cp":[114.502461,38.045474],"childNum":11},"geometry":{"type":"MultiPolygon","coordinates":[[[[114.5215,39.5068],[114.3457,39.8584],[113.9941,39.9902],[114.5215,40.3418],[114.3457,40.3857],[114.2578,40.6055],[114.082,40.7373],[113.9063,41.1328],[113.9941,41.2207],[113.9063,41.4404],[114.2578,41.5723],[114.1699,41.792],[114.5215,42.1436],[114.873,42.0996],[114.9609,41.6162],[115.2246,41.5723],[115.9277,41.9238],[116.0156,41.792],[116.2793,42.0117],[116.8066,42.0117],[116.8945,42.4072],[117.334,42.4512],[117.5098,42.583],[117.7734,42.627],[118.0371,42.4072],[117.9492,42.2314],[118.125,42.0557],[118.3008,42.0996],[118.3008,41.792],[118.125,41.748],[118.3887,41.3086],[119.2676,41.3086],[118.8281,40.8252],[119.2676,40.5176],[119.5313,40.5615],[119.707,40.1221],[119.8828,39.9463],[119.5313,39.6826],[119.4434,39.4189],[118.916,39.0674],[118.4766,38.9355],[118.125,39.0234],[118.0371,39.1992],[118.0371,39.2432],[117.8613,39.4189],[117.9492,39.5947],[117.6855,39.5947],[117.5098,39.7705],[117.5098,39.9902],[117.6855,39.9902],[117.6855,40.0781],[117.4219,40.21],[117.2461,40.5176],[117.4219,40.6494],[116.9824,40.6934],[116.6309,41.0449],[116.3672,40.9131],[116.4551,40.7813],[116.1914,40.7813],[116.1035,40.6055],[115.752,40.5615],[115.9277,40.2539],[115.4004,39.9463],[115.4883,39.6387],[115.752,39.5068],[116.1914,39.5947],[116.3672,39.4629],[116.543,39.5947],[116.8066,39.5947],[116.8945,39.1113],[116.7188,38.9355],[116.7188,38.8037],[117.2461,38.54],[117.5977,38.6279],[117.9492,38.3203],[117.4219,37.8369],[116.8066,37.8369],[116.4551,37.4854],[116.2793,37.5732],[116.2793,37.3535],[116.0156,37.3535],[115.752,36.9141],[115.3125,36.5186],[115.4883,36.167],[115.3125,36.0791],[115.1367,36.2109],[114.9609,36.0791],[114.873,36.123],[113.7305,36.3428],[113.4668,36.6504],[113.7305,36.8701],[113.7305,37.1338],[114.1699,37.6611],[113.9941,37.7051],[113.8184,38.1445],[113.5547,38.2764],[113.5547,38.54],[113.8184,38.8037],[113.8184,38.9355],[113.9063,39.0234],[114.3457,39.0674],[114.5215,39.5068]]],[[[117.2461,40.0781],[117.1582,39.8145],[117.1582,39.6387],[116.8945,39.6826],[116.8945,39.8145],[116.8066,39.9902],[117.2461,40.0781]]]]}},{"type":"Feature","properties":{"id":"42","size":"1500","name":"湖北","cp":[113.298572,30.684355],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.2148,31.1572],[110.127,31.377],[109.6875,31.5527],[109.7754,31.6846],[109.5996,31.7285],[109.5117,32.4316],[109.6875,32.6074],[110.127,32.6074],[110.127,32.7393],[109.7754,32.915],[109.7754,33.0469],[109.4238,33.1348],[109.5996,33.2666],[110.3027,33.1787],[110.5664,33.2666],[110.7422,33.1348],[111.0059,33.2666],[111.5332,32.6074],[112.3242,32.3438],[113.2031,32.4316],[113.4668,32.2998],[113.7305,32.4316],[113.8184,31.8604],[113.9941,31.7725],[114.1699,31.8604],[114.5215,31.7725],[114.6094,31.5527],[114.7852,31.4648],[115.1367,31.5967],[115.2246,31.4209],[115.4004,31.4209],[115.5762,31.2012],[116.0156,31.0254],[115.752,30.6738],[116.1035,30.1904],[116.1035,29.8389],[115.9277,29.707],[115.4883,29.7949],[114.873,29.3994],[114.2578,29.3555],[113.9063,29.0479],[113.7305,29.0918],[113.6426,29.3115],[113.7305,29.5752],[113.5547,29.707],[113.5547,29.8389],[113.0273,29.4434],[112.9395,29.4873],[113.0273,29.751],[112.9395,29.7949],[112.6758,29.5752],[112.5,29.6191],[112.2363,29.5313],[111.7969,29.9268],[110.8301,30.1465],[110.4785,30.0146],[110.6543,29.751],[110.4785,29.6631],[109.7754,29.751],[109.6875,29.6191],[109.5117,29.6191],[109.248,29.1357],[109.0723,29.3555],[108.9844,29.3115],[108.6328,29.8389],[108.457,29.7949],[108.5449,30.2344],[108.457,30.4102],[108.6328,30.5859],[108.8086,30.498],[109.0723,30.6299],[109.1602,30.542],[109.248,30.6299],[109.4238,30.542],[109.8633,30.8936],[110.0391,30.8057],[110.2148,31.1572]]]}},{"type":"Feature","properties":{"id":"52","size":"2000","name":"贵州","cp":[106.6113,26.9385],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[104.1504,27.2461],[104.4141,27.4658],[104.5898,27.334],[105.2051,27.3779],[105.293,27.7295],[105.5566,27.7734],[105.6445,27.6416],[106.3477,27.8174],[106.1719,28.125],[105.9082,28.125],[105.6445,28.4326],[105.9961,28.7402],[106.3477,28.5205],[106.5234,28.5645],[106.4355,28.7842],[106.5234,28.7842],[106.6113,28.6523],[106.6113,28.5205],[106.6992,28.4766],[106.875,28.7842],[107.4023,28.8721],[107.4023,29.1797],[107.5781,29.2236],[107.8418,29.1357],[107.8418,29.0039],[108.2813,29.0918],[108.3691,28.6523],[108.5449,28.6523],[108.5449,28.3887],[108.7207,28.4766],[108.7207,28.2129],[109.0723,28.2129],[109.248,28.4766],[109.3359,28.2568],[109.3359,27.9053],[109.4238,27.5977],[108.8086,27.1143],[108.8965,27.0264],[109.3359,27.1582],[109.5117,27.0264],[109.5117,26.8066],[109.3359,26.7188],[109.4238,26.5869],[109.248,26.3232],[109.4238,26.2793],[109.5117,26.0156],[109.3359,25.708],[108.9844,25.752],[109.0723,25.5322],[108.6328,25.5762],[108.6328,25.3125],[108.3691,25.5322],[108.1934,25.4443],[108.1055,25.2246],[107.8418,25.1367],[107.7539,25.2246],[107.4902,25.2246],[107.2266,25.6201],[106.9629,25.4883],[107.0508,25.2686],[106.875,25.1807],[106.1719,24.9609],[106.1719,24.7852],[105.9961,24.6533],[105.2051,24.9609],[104.6777,24.6094],[104.502,24.7412],[104.6777,24.9609],[104.5898,25.0488],[104.8535,25.2246],[104.3262,25.708],[104.6777,26.4111],[104.4141,26.6748],[103.8867,26.543],[103.7109,26.7627],[103.7109,26.9824],[103.623,27.0264],[103.8867,27.4219],[104.1504,27.2461]]]}},{"type":"Feature","properties":{"id":"37","size":"1500","name":"山东","cp":[118.7402,36.4307],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[115.4883,36.167],[115.3125,36.5186],[115.752,36.9141],[116.0156,37.3535],[116.2793,37.3535],[116.2793,37.5732],[116.4551,37.4854],[116.8066,37.8369],[117.4219,37.8369],[117.9492,38.3203],[118.125,38.1445],[118.916,38.1445],[119.3555,37.6611],[119.0039,37.5293],[119.0039,37.3535],[119.3555,37.1338],[119.707,37.1338],[119.8828,37.3975],[120.498,37.8369],[120.5859,38.1445],[120.9375,38.4521],[121.0254,37.8369],[121.2012,37.6611],[121.9043,37.4854],[122.168,37.6172],[122.2559,37.4854],[122.6074,37.4854],[122.6953,37.3535],[122.6074,36.9141],[122.4316,36.7822],[121.8164,36.8701],[121.7285,36.6943],[121.1133,36.6064],[121.1133,36.4307],[121.377,36.2549],[120.7617,36.167],[120.9375,35.8594],[120.6738,36.0352],[119.707,35.4639],[119.9707,34.9805],[119.3555,35.0244],[119.2676,35.1123],[118.916,35.0244],[118.7402,34.7168],[118.4766,34.6729],[118.3887,34.4092],[118.2129,34.4092],[118.125,34.6289],[117.9492,34.6729],[117.5977,34.4531],[117.334,34.585],[117.2461,34.4531],[116.8066,34.9365],[116.4551,34.8926],[116.3672,34.6289],[116.1914,34.585],[115.5762,34.585],[115.4004,34.8486],[114.7852,35.0684],[115.0488,35.376],[115.2246,35.4199],[115.4883,35.7275],[116.1035,36.0791],[115.3125,35.8154],[115.4883,36.167]]]}},{"type":"Feature","properties":{"id":"36","size":"1700","name":"江西","cp":[115.592151,27.676493],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[114.2578,28.3447],[114.082,28.5645],[114.1699,28.8281],[113.9063,29.0479],[114.2578,29.3555],[114.873,29.3994],[115.4883,29.7949],[115.9277,29.707],[116.1035,29.8389],[116.2793,29.7949],[116.7188,30.0586],[116.8945,29.9268],[116.7188,29.751],[116.7188,29.6191],[117.1582,29.707],[117.0703,29.8389],[117.1582,29.9268],[117.5098,29.6191],[118.0371,29.5752],[118.2129,29.3994],[118.0371,29.1797],[118.0371,29.0479],[118.3887,28.7842],[118.4766,28.3447],[118.4766,28.3008],[118.3008,28.0811],[117.7734,27.8174],[117.5098,27.9932],[116.9824,27.6416],[117.1582,27.29],[117.0703,27.1143],[116.543,26.8066],[116.6309,26.4551],[116.3672,26.2354],[116.4551,26.1035],[116.1914,25.8838],[116.0156,25.2686],[115.8398,25.2246],[115.9277,24.917],[115.752,24.7852],[115.8398,24.5654],[115.4004,24.7852],[114.4336,24.5215],[114.1699,24.6973],[114.4336,24.9609],[114.6973,25.1367],[114.7852,25.2686],[114.6094,25.4004],[113.9941,25.2686],[113.9063,25.4443],[113.9941,26.0596],[114.2578,26.1475],[113.9941,26.1914],[114.082,26.5869],[113.9063,26.6309],[113.9063,26.9385],[113.7305,27.1143],[113.8184,27.29],[113.6426,27.3779],[113.6426,27.5977],[113.7305,27.9492],[114.2578,28.3447]]]}},{"type":"Feature","properties":{"id":"41","size":"1700","name":"河南","cp":[113.0668,33.8818],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.3906,34.585],[110.8301,34.6289],[111.1816,34.8047],[111.5332,34.8486],[111.7969,35.0684],[112.0605,35.0684],[112.0605,35.2881],[112.7637,35.2002],[113.1152,35.332],[113.6426,35.6836],[113.7305,36.3428],[114.873,36.123],[114.9609,36.0791],[115.1367,36.2109],[115.3125,36.0791],[115.4883,36.167],[115.3125,35.8154],[116.1035,36.0791],[115.4883,35.7275],[115.2246,35.4199],[115.0488,35.376],[114.7852,35.0684],[115.4004,34.8486],[115.5762,34.585],[116.1914,34.585],[116.1914,34.4092],[116.543,34.2773],[116.6309,33.9258],[116.1914,33.7061],[116.0156,33.9697],[115.6641,34.0576],[115.5762,33.9258],[115.5762,33.6621],[115.4004,33.5303],[115.3125,33.1787],[114.873,33.1348],[114.873,33.0029],[115.1367,32.8711],[115.2246,32.6074],[115.5762,32.4316],[115.8398,32.5195],[115.9277,31.7725],[115.4883,31.6846],[115.4004,31.4209],[115.2246,31.4209],[115.1367,31.5967],[114.7852,31.4648],[114.6094,31.5527],[114.5215,31.7725],[114.1699,31.8604],[113.9941,31.7725],[113.8184,31.8604],[113.7305,32.4316],[113.4668,32.2998],[113.2031,32.4316],[112.3242,32.3438],[111.5332,32.6074],[111.0059,33.2666],[111.0059,33.5303],[110.6543,33.8379],[110.6543,34.1455],[110.4785,34.2334],[110.3906,34.585]]]}},{"type":"Feature","properties":{"id":"21","size":"1500","name":"辽宁","cp":[122.0438,41.0889],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[119.2676,41.3086],[119.4434,41.6162],[119.2676,41.7041],[119.3555,42.2754],[119.5313,42.3633],[119.8828,42.1875],[120.1465,41.7041],[120.498,42.0996],[121.4648,42.4951],[121.7285,42.4512],[121.9922,42.7148],[122.3438,42.6709],[122.3438,42.8467],[122.7832,42.7148],[123.1348,42.8027],[123.3105,42.9785],[123.5742,43.0225],[123.6621,43.374],[123.8379,43.4619],[124.2773,43.2422],[124.4531,42.8467],[124.7168,43.0664],[124.8926,43.0664],[124.8926,42.8027],[125.332,42.1436],[125.4199,42.0996],[125.332,41.9678],[125.332,41.6602],[125.7715,41.2207],[125.5957,40.9131],[125.6836,40.8691],[124.541,40.21],[124.1016,39.6826],[123.3984,39.6826],[123.1348,39.4189],[123.1348,39.0234],[122.0801,39.0234],[121.5527,38.7158],[121.1133,38.6719],[120.9375,38.9795],[121.377,39.1992],[121.2012,39.5508],[122.0801,40.3857],[121.9922,40.6934],[121.7285,40.8252],[121.2012,40.8252],[120.5859,40.21],[119.8828,39.9463],[119.707,40.1221],[119.5313,40.5615],[119.2676,40.5176],[118.8281,40.8252],[119.2676,41.3086]]]}},{"type":"Feature","properties":{"id":"14","size":"1450","name":"山西","cp":[111.849248,36.857014],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[110.918,38.7158],[111.1816,39.2432],[111.0938,39.375],[111.3574,39.4189],[111.4453,39.6387],[111.9727,39.5947],[112.3242,40.2539],[112.7637,40.166],[113.2031,40.3857],[113.5547,40.3418],[113.8184,40.5176],[114.082,40.5176],[114.082,40.7373],[114.2578,40.6055],[114.3457,40.3857],[114.5215,40.3418],[113.9941,39.9902],[114.3457,39.8584],[114.5215,39.5068],[114.3457,39.0674],[113.9063,39.0234],[113.8184,38.9355],[113.8184,38.8037],[113.5547,38.54],[113.5547,38.2764],[113.8184,38.1445],[113.9941,37.7051],[114.1699,37.6611],[113.7305,37.1338],[113.7305,36.8701],[113.4668,36.6504],[113.7305,36.3428],[113.6426,35.6836],[113.1152,35.332],[112.7637,35.2002],[112.0605,35.2881],[112.0605,35.0684],[111.7969,35.0684],[111.5332,34.8486],[111.1816,34.8047],[110.8301,34.6289],[110.3906,34.585],[110.2148,34.6729],[110.2148,34.8926],[110.5664,35.6396],[110.4785,36.123],[110.3906,37.002],[110.8301,37.6611],[110.4785,37.9688],[110.4785,38.1885],[110.8301,38.4961],[110.918,38.7158]]]}},{"type":"Feature","properties":{"id":"34","size":"1700","name":"安徽","cp":[117.283042,31.26119],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[116.6309,33.9258],[116.543,34.2773],[116.1914,34.4092],[116.1914,34.585],[116.3672,34.6289],[116.8945,34.4092],[117.1582,34.0576],[117.5977,34.0137],[117.7734,33.7061],[118.125,33.75],[117.9492,33.2227],[118.0371,33.1348],[118.2129,33.2227],[118.3008,32.7832],[118.7402,32.7393],[118.916,32.959],[119.1797,32.8271],[119.1797,32.4756],[118.5645,32.5635],[118.6523,32.2119],[118.4766,32.168],[118.3887,31.9482],[118.916,31.5527],[118.7402,31.377],[118.8281,31.2451],[119.3555,31.2891],[119.4434,31.1572],[119.6191,31.1133],[119.6191,31.0693],[119.4434,30.6738],[119.2676,30.6299],[119.3555,30.4102],[118.916,30.3223],[118.916,29.9707],[118.7402,29.707],[118.2129,29.3994],[118.0371,29.5752],[117.5098,29.6191],[117.1582,29.9268],[117.0703,29.8389],[117.1582,29.707],[116.7188,29.6191],[116.7188,29.751],[116.8945,29.9268],[116.7188,30.0586],[116.2793,29.7949],[116.1035,29.8389],[116.1035,30.1904],[115.752,30.6738],[116.0156,31.0254],[115.5762,31.2012],[115.4004,31.4209],[115.4883,31.6846],[115.9277,31.7725],[115.8398,32.5195],[115.5762,32.4316],[115.2246,32.6074],[115.1367,32.8711],[114.873,33.0029],[114.873,33.1348],[115.3125,33.1787],[115.4004,33.5303],[115.5762,33.6621],[115.5762,33.9258],[115.6641,34.0576],[116.0156,33.9697],[116.1914,33.7061],[116.6309,33.9258]]]}},{"type":"Feature","properties":{"id":"35","size":"2000","name":"福建","cp":[118.306239,26.075302],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[118.4766,28.3008],[118.8281,28.2568],[118.7402,28.0371],[118.916,27.4658],[119.2676,27.4219],[119.6191,27.6855],[119.7949,27.29],[120.2344,27.4219],[120.4102,27.1582],[120.7617,27.0264],[120.6738,26.8945],[120.2344,26.8506],[120.2344,26.7188],[120.4102,26.6748],[120.498,26.3672],[120.2344,26.2793],[120.4102,26.1475],[120.0586,26.1914],[119.9707,25.9277],[119.7949,25.9277],[119.9707,25.4004],[119.7949,25.2686],[119.5313,25.1367],[119.4434,25.0049],[119.2676,25.0928],[118.916,24.8291],[118.6523,24.5215],[118.4766,24.5215],[118.4766,24.4336],[118.2129,24.3457],[118.2129,24.1699],[117.8613,23.9941],[117.7734,23.7744],[117.5098,23.5986],[117.1582,23.5547],[116.9824,23.9063],[116.9824,24.1699],[116.7188,24.6533],[116.543,24.6094],[116.3672,24.873],[116.2793,24.7852],[115.9277,24.917],[115.8398,25.2246],[116.0156,25.2686],[116.1914,25.8838],[116.4551,26.1035],[116.3672,26.2354],[116.6309,26.4551],[116.543,26.8066],[117.0703,27.1143],[117.1582,27.29],[116.9824,27.6416],[117.5098,27.9932],[117.7734,27.8174],[118.3008,28.0811],[118.4766,28.3008]]]}},{"type":"Feature","properties":{"id":"33","size":"2100","name":"浙江","cp":[120.498,29.0918],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[118.2129,29.3994],[118.7402,29.707],[118.916,29.9707],[118.916,30.3223],[119.3555,30.4102],[119.2676,30.6299],[119.4434,30.6738],[119.6191,31.0693],[119.6191,31.1133],[119.9707,31.1572],[120.498,30.8057],[120.9375,31.0254],[121.2891,30.6738],[121.9922,30.8057],[122.6953,30.8936],[122.8711,30.7178],[122.959,30.1465],[122.6074,30.1025],[122.6074,29.9268],[122.168,29.5313],[122.3438,28.8721],[121.9922,28.8721],[121.9922,28.4326],[121.7285,28.3447],[121.7285,28.2129],[121.4648,28.2129],[121.5527,28.0371],[121.2891,27.9492],[121.1133,27.4219],[120.6738,27.334],[120.6738,27.1582],[120.9375,27.0264],[120.7617,27.0264],[120.4102,27.1582],[120.2344,27.4219],[119.7949,27.29],[119.6191,27.6855],[119.2676,27.4219],[118.916,27.4658],[118.7402,28.0371],[118.8281,28.2568],[118.4766,28.3008],[118.4766,28.3447],[118.3887,28.7842],[118.0371,29.0479],[118.0371,29.1797],[118.2129,29.3994]]]}},{"type":"Feature","properties":{"id":"32","size":"1950","name":"江苏","cp":[119.767413,33.041544],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[116.3672,34.6289],[116.4551,34.8926],[116.8066,34.9365],[117.2461,34.4531],[117.334,34.585],[117.5977,34.4531],[117.9492,34.6729],[118.125,34.6289],[118.2129,34.4092],[118.3887,34.4092],[118.4766,34.6729],[118.7402,34.7168],[118.916,35.0244],[119.2676,35.1123],[119.3555,35.0244],[119.3555,34.8486],[119.707,34.585],[120.3223,34.3652],[120.9375,33.0469],[121.0254,32.6514],[121.377,32.4756],[121.4648,32.168],[121.9043,31.9922],[121.9922,31.6846],[121.9922,31.5967],[121.2012,31.8604],[121.1133,31.7285],[121.377,31.5088],[121.2012,31.4648],[120.9375,31.0254],[120.498,30.8057],[119.9707,31.1572],[119.6191,31.1133],[119.4434,31.1572],[119.3555,31.2891],[118.8281,31.2451],[118.7402,31.377],[118.916,31.5527],[118.3887,31.9482],[118.4766,32.168],[118.6523,32.2119],[118.5645,32.5635],[119.1797,32.4756],[119.1797,32.8271],[118.916,32.959],[118.7402,32.7393],[118.3008,32.7832],[118.2129,33.2227],[118.0371,33.1348],[117.9492,33.2227],[118.125,33.75],[117.7734,33.7061],[117.5977,34.0137],[117.1582,34.0576],[116.8945,34.4092],[116.3672,34.6289]]]}},{"type":"Feature","properties":{"id":"50","size":"2380","name":"重庆","cp":[107.304962,29.533155],"childNum":40},"geometry":{"type":"Polygon","coordinates":[[[108.5449,31.6846],[108.2813,31.9043],[108.3691,32.168],[108.5449,32.2119],[109.0723,31.9482],[109.248,31.7285],[109.5996,31.7285],[109.7754,31.6846],[109.6875,31.5527],[110.127,31.377],[110.2148,31.1572],[110.0391,30.8057],[109.8633,30.8936],[109.4238,30.542],[109.248,30.6299],[109.1602,30.542],[109.0723,30.6299],[108.8086,30.498],[108.6328,30.5859],[108.457,30.4102],[108.5449,30.2344],[108.457,29.7949],[108.6328,29.8389],[108.9844,29.3115],[109.0723,29.3555],[109.248,29.1357],[109.248,28.4766],[109.0723,28.2129],[108.7207,28.2129],[108.7207,28.4766],[108.5449,28.3887],[108.5449,28.6523],[108.3691,28.6523],[108.2813,29.0918],[107.8418,29.0039],[107.8418,29.1357],[107.5781,29.2236],[107.4023,29.1797],[107.4023,28.8721],[106.875,28.7842],[106.6992,28.4766],[106.6113,28.5205],[106.6113,28.6523],[106.5234,28.7842],[106.4355,28.7842],[106.5234,28.5645],[106.3477,28.5205],[106.2598,28.8721],[105.8203,28.96],[105.7324,29.2676],[105.4688,29.3115],[105.293,29.5313],[105.7324,29.8828],[105.5566,30.1025],[105.6445,30.2783],[105.8203,30.4541],[106.2598,30.1904],[106.6113,30.3223],[106.7871,30.0146],[107.0508,30.0146],[107.4902,30.6299],[107.4023,30.7617],[107.4902,30.8496],[107.9297,30.8496],[108.1934,31.5088],[108.5449,31.6846]]]}},{"type":"Feature","properties":{"id":"64","size":"2100","name":"宁夏","cp":[105.9961,37.3096],"childNum":5},"geometry":{"type":"Polygon","coordinates":[[[104.3262,37.4414],[105.8203,37.793],[105.9082,38.7158],[106.3477,39.2871],[106.7871,39.375],[106.9629,38.9795],[106.5234,38.3203],[106.7871,38.1885],[107.3145,38.1006],[107.666,37.8809],[107.3145,37.6172],[107.3145,37.0898],[106.6113,37.0898],[106.6113,36.7822],[106.4355,36.5625],[106.5234,36.4746],[106.5234,36.2549],[106.875,36.123],[106.9629,35.8154],[106.6992,35.6836],[106.4355,35.6836],[106.5234,35.332],[106.3477,35.2441],[106.2598,35.4199],[106.084,35.376],[105.9961,35.4199],[106.084,35.4639],[105.9961,35.4639],[105.8203,35.5518],[105.7324,35.7275],[105.3809,35.7715],[105.293,35.9912],[105.4688,36.123],[105.2051,36.6943],[105.293,36.8262],[104.8535,37.2217],[104.5898,37.2217],[104.5898,37.4414],[104.3262,37.4414]]]}},{"type":"Feature","properties":{"id":"46","size":"4500","name":"海南","cp":[109.9512,19.2041],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[108.6328,19.3799],[109.0723,19.6436],[109.248,19.9512],[109.5996,20.0391],[110.0391,20.127],[110.3906,20.127],[110.5664,20.2588],[110.6543,20.2588],[111.0938,19.9512],[111.2695,19.9951],[110.6543,19.1602],[110.5664,18.6768],[110.2148,18.5889],[110.0391,18.3691],[109.8633,18.3691],[109.6875,18.1055],[108.9844,18.2813],[108.6328,18.457],[108.6328,19.3799]]]}},{"type":"Feature","properties":{"id":"71","size":"3000","name":"台湾","cp":[120.0254,23.5986],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[121.9043,25.0488],[121.9922,25.0049],[121.8164,24.7412],[121.9043,24.5654],[121.6406,24.0381],[121.377,23.1152],[121.0254,22.6758],[120.8496,22.0605],[120.7617,21.9287],[120.6738,22.3242],[120.2344,22.5879],[120.0586,23.0713],[120.1465,23.6865],[121.0254,25.0488],[121.5527,25.3125],[121.9043,25.0488]]]}},{"type":"Feature","properties":{"id":"11","size":"5000","name":"北京","cp":[116.4551,40.2539],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[117.4219,40.21],[117.334,40.1221],[117.2461,40.0781],[116.8066,39.9902],[116.8945,39.8145],[116.8945,39.6826],[116.8066,39.5947],[116.543,39.5947],[116.3672,39.4629],[116.1914,39.5947],[115.752,39.5068],[115.4883,39.6387],[115.4004,39.9463],[115.9277,40.2539],[115.752,40.5615],[116.1035,40.6055],[116.1914,40.7813],[116.4551,40.7813],[116.3672,40.9131],[116.6309,41.0449],[116.9824,40.6934],[117.4219,40.6494],[117.2461,40.5176],[117.4219,40.21]]]}},{"type":"Feature","properties":{"id":"12","size":"5000","name":"天津","cp":[117.4219,39.4189],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[116.8066,39.5947],[116.8945,39.6826],[117.1582,39.6387],[117.1582,39.8145],[117.2461,40.0781],[117.334,40.1221],[117.4219,40.21],[117.6855,40.0781],[117.6855,39.9902],[117.5098,39.9902],[117.5098,39.7705],[117.6855,39.5947],[117.9492,39.5947],[117.8613,39.4189],[118.0371,39.2432],[118.0371,39.1992],[117.8613,39.1113],[117.5977,38.6279],[117.2461,38.54],[116.7188,38.8037],[116.7188,38.9355],[116.8945,39.1113],[116.8066,39.5947]]]}},{"type":"Feature","properties":{"id":"31","size":"7500","name":"上海","cp":[121.4648,31.2891],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[120.9375,31.0254],[121.2012,31.4648],[121.377,31.5088],[121.1133,31.7285],[121.2012,31.8604],[121.9922,31.5967],[121.9043,31.1572],[121.9922,30.8057],[121.2891,30.6738],[120.9375,31.0254]]]}},{"type":"Feature","properties":{"id":"81","size":"18000","name":"香港","cp":[114.1178,22.3242],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[114.6094,22.4121],[114.5215,22.1484],[114.3457,22.1484],[113.9063,22.1484],[113.8184,22.1924],[113.9063,22.4121],[114.1699,22.5439],[114.3457,22.5439],[114.4336,22.5439],[114.4336,22.4121],[114.6094,22.4121]]]}},{"type":"Feature","properties":{"id":"82","size":"27","name":"澳门","cp":[111.5547,22.1484],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}}]} diff --git a/src_bak/api/json/industry-data.json b/src_bak/api/json/industry-data.json new file mode 100644 index 0000000..0d8baa8 --- /dev/null +++ b/src_bak/api/json/industry-data.json @@ -0,0 +1 @@ +[{"value":1001,"label":"IT服务","children":[{"value":1001000,"label":"计算机软件/硬件/信息服务","children":[]},{"value":1001001,"label":"互联网和相关服务","children":[]},{"value":1001002,"label":"其他","children":[]}],"icon":""},{"value":1002,"label":"制造业","children":[{"value":1002000,"label":"机械/电子","children":[]},{"value":1003000,"label":"服装/纺织","children":[]},{"value":1002002,"label":"汽车","children":[]},{"value":1002005,"label":"金属制品","children":[]},{"value":1003002,"label":"食品/饮料","children":[]},{"value":1003003,"label":"家具/家纺","children":[]},{"value":1002001,"label":"重工制造","children":[]},{"value":1003005,"label":"家电/数码","children":[]},{"value":1002004,"label":"橡胶/塑料","children":[]},{"value":1003004,"label":"日用品/化妆品","children":[]},{"value":1002006,"label":"化学原料制品","children":[]},{"value":1003007,"label":"文教/工美/体育/娱乐用品","children":[]},{"value":1003006,"label":"烟酒/茶","children":[]},{"value":1002007,"label":"非金属矿物","children":[]},{"value":1002003,"label":"其他","children":[]}],"icon":""},{"value":1003,"label":"批发/零售","children":[{"value":1003008,"label":"批发","children":[]},{"value":1003010,"label":"零售","children":[]},{"value":1003001,"label":"超市/便利店/百货商场","children":[]},{"value":1003011,"label":"进出口","children":[]},{"value":1003009,"label":"其他","children":[]}],"icon":""},{"value":1004,"label":"生活服务","children":[{"value":1004001,"label":"餐饮","children":[]},{"value":1004004,"label":"居民服务","children":[]},{"value":1004002,"label":"租赁和商务服务","children":[]},{"value":1004000,"label":"酒店/住宿","children":[]},{"value":1004003,"label":"其他","children":[]}],"icon":""},{"value":1005,"label":"文化/体育/娱乐业","children":[{"value":1005001,"label":"文化/体育","children":[]},{"value":1005002,"label":"娱乐/旅游","children":[]},{"value":1005000,"label":"新闻传媒","children":[]},{"value":1005003,"label":"其他","children":[]}],"icon":""},{"value":1006,"label":"建筑/房地产","children":[{"value":1006001,"label":"建筑业","children":[]},{"value":1006002,"label":"建材装修","children":[]},{"value":1006000,"label":"房地产","children":[]},{"value":1006003,"label":"其他","children":[]}],"icon":""},{"value":1007,"label":"教育","children":[{"value":1007000,"label":"学前教育","children":[],"desc":"如:托儿所、幼儿园"},{"value":1007001,"label":"初中等教育","children":[],"desc":"如:小学、初中、高中、职高"},{"value":1007002,"label":"高等教育","children":[],"desc":"如:大学、高职、高专"},{"value":1007003,"label":"培训机构","children":[]},{"value":1007004,"label":"其他","children":[]}],"icon":""},{"value":1008,"label":"运输/物流/仓储","children":[{"value":1008003,"label":"物流/仓储","children":[]},{"value":1008000,"label":"道路/铁路运输","children":[]},{"value":1008004,"label":"邮政/快递","children":[]},{"value":1008001,"label":"航空运输","children":[]},{"value":1008002,"label":"水上运输","children":[]},{"value":1008005,"label":"其他","children":[]}],"icon":""},{"value":1009,"label":"医疗","children":[{"value":1009000,"label":"医院/医疗机构","children":[]},{"value":1009003,"label":"医疗器械","children":[]},{"value":1009001,"label":"医药制造","children":[]},{"value":1009002,"label":"医药流通","children":[]},{"value":1009004,"label":"其他","children":[]}],"icon":""},{"value":1010,"label":"政府","children":[{"value":1010000,"label":"党政机关","children":[]},{"value":1010001,"label":"国家权力/行政机构","children":[]},{"value":1010002,"label":"检察院/法院/公安","children":[]},{"value":1010003,"label":"民政/人社/交通/卫生","children":[]},{"value":1010004,"label":"发改委/经信委/商务局/统计局","children":[]},{"value":1010005,"label":"国土/规划","children":[]},{"value":1010006,"label":"税务/海关/工商/环保/物价/药品","children":[]},{"value":1010007,"label":"政协/民主党派","children":[]},{"value":1010008,"label":"地方政府","children":[]},{"value":1010009,"label":"其他","children":[]}],"icon":""},{"value":1011,"label":"金融","children":[{"value":1011000,"label":"保险","children":[]},{"value":1011001,"label":"银行","children":[]},{"value":1011002,"label":"证券/投资/基金","children":[]},{"value":1011003,"label":"其他","children":[]}],"icon":""},{"value":1012,"label":"能源/采矿","children":[{"value":1014003,"label":"电力/热力/燃气/水供应业","children":[]},{"value":1012003,"label":"石油/天然气","children":[]},{"value":1012002,"label":"煤炭","children":[]},{"value":1012001,"label":"有色金属","children":[]},{"value":1012000,"label":"钢铁","children":[]},{"value":1012004,"label":"其他","children":[]}],"icon":""},{"value":1013,"label":"农林渔牧","children":[{"value":1013000,"label":"农林渔牧","children":[]}],"icon":""},{"value":1014,"label":"其他行业","children":[{"value":1014000,"label":"科学研究和技术服务业","children":[]},{"value":1014002,"label":"社会组织","children":[]},{"value":1014001,"label":"水利和环境管理","children":[]},{"value":1014004,"label":"国际组织","children":[]},{"value":1014005,"label":"其他","children":[]}],"icon":""}] diff --git a/src_bak/api/json/regions-data.json b/src_bak/api/json/regions-data.json new file mode 100644 index 0000000..4cbd130 --- /dev/null +++ b/src_bak/api/json/regions-data.json @@ -0,0 +1 @@ +[{"label":"北京","value":"110000","children":[{"value":"110100","label":"北京市","children":[{"value":"110101","label":"东城区"},{"value":"110102","label":"西城区"},{"value":"110103","label":"崇文区"},{"value":"110104","label":"宣武区"},{"value":"110105","label":"朝阳区"},{"value":"110106","label":"丰台区"},{"value":"110107","label":"石景山区"},{"value":"110108","label":"海淀区"},{"value":"110109","label":"门头沟区"},{"value":"110111","label":"房山区"},{"value":"110112","label":"通州区"},{"value":"110113","label":"顺义区"},{"value":"110114","label":"昌平区"},{"value":"110115","label":"大兴区"},{"value":"110116","label":"怀柔区"},{"value":"110117","label":"平谷区"},{"value":"110228","label":"密云县"},{"value":"110229","label":"延庆县"}]}]},{"label":"天津","value":"120000","children":[{"value":"120100","label":"天津市","children":[{"value":"120101","label":"和平区"},{"value":"120102","label":"河东区"},{"value":"120103","label":"河西区"},{"value":"120104","label":"南开区"},{"value":"120105","label":"河北区"},{"value":"120106","label":"红桥区"},{"value":"120107","label":"塘沽区"},{"value":"120108","label":"汉沽区"},{"value":"120109","label":"大港区"},{"value":"120110","label":"东丽区"},{"value":"120111","label":"西青区"},{"value":"120112","label":"津南区"},{"value":"120113","label":"北辰区"},{"value":"120114","label":"武清区"},{"value":"120115","label":"宝坻区"},{"value":"120116","label":"滨海新区"},{"value":"120221","label":"宁河县"},{"value":"120223","label":"静海县"},{"value":"120225","label":"蓟县"}]}]},{"label":"河北省","value":"130000","children":[{"value":"130100","label":"石家庄市","children":[{"value":"130102","label":"长安区"},{"value":"130103","label":"桥东区"},{"value":"130104","label":"桥西区"},{"value":"130105","label":"新华区"},{"value":"130107","label":"井陉矿区"},{"value":"130108","label":"裕华区"},{"value":"130121","label":"井陉县"},{"value":"130123","label":"正定县"},{"value":"130124","label":"栾城县"},{"value":"130125","label":"行唐县"},{"value":"130126","label":"灵寿县"},{"value":"130127","label":"高邑县"},{"value":"130128","label":"深泽县"},{"value":"130129","label":"赞皇县"},{"value":"130130","label":"无极县"},{"value":"130131","label":"平山县"},{"value":"130132","label":"元氏县"},{"value":"130133","label":"赵县"},{"value":"130181","label":"辛集市"},{"value":"130182","label":"藁城市"},{"value":"130183","label":"晋州市"},{"value":"130184","label":"新乐市"},{"value":"130185","label":"鹿泉市"}]},{"value":"130200","label":"唐山市","children":[{"value":"130202","label":"路南区"},{"value":"130203","label":"路北区"},{"value":"130204","label":"古冶区"},{"value":"130205","label":"开平区"},{"value":"130207","label":"丰南区"},{"value":"130208","label":"丰润区"},{"value":"130223","label":"滦县"},{"value":"130224","label":"滦南县"},{"value":"130225","label":"乐亭县"},{"value":"130227","label":"迁西县"},{"value":"130229","label":"玉田县"},{"value":"130230","label":"唐海县"},{"value":"130281","label":"遵化市"},{"value":"130283","label":"迁安市"}]},{"value":"130300","label":"秦皇岛市","children":[{"value":"130302","label":"海港区"},{"value":"130303","label":"山海关区"},{"value":"130304","label":"北戴河区"},{"value":"130321","label":"青龙满族自治县"},{"value":"130322","label":"昌黎县"},{"value":"130323","label":"抚宁县"},{"value":"130324","label":"卢龙县"},{"value":"130399","label":"经济技术开发区"}]},{"value":"130400","label":"邯郸市","children":[{"value":"130402","label":"邯山区"},{"value":"130403","label":"丛台区"},{"value":"130404","label":"复兴区"},{"value":"130406","label":"峰峰矿区"},{"value":"130421","label":"邯郸县"},{"value":"130423","label":"临漳县"},{"value":"130424","label":"成安县"},{"value":"130425","label":"大名县"},{"value":"130426","label":"涉县"},{"value":"130427","label":"磁县"},{"value":"130428","label":"肥乡县"},{"value":"130429","label":"永年县"},{"value":"130430","label":"邱县"},{"value":"130431","label":"鸡泽县"},{"value":"130432","label":"广平县"},{"value":"130433","label":"馆陶县"},{"value":"130434","label":"魏县"},{"value":"130435","label":"曲周县"},{"value":"130481","label":"武安市"}]},{"value":"130500","label":"邢台市","children":[{"value":"130502","label":"桥东区"},{"value":"130503","label":"桥西区"},{"value":"130521","label":"邢台县"},{"value":"130522","label":"临城县"},{"value":"130523","label":"内丘县"},{"value":"130524","label":"柏乡县"},{"value":"130525","label":"隆尧县"},{"value":"130526","label":"任县"},{"value":"130527","label":"南和县"},{"value":"130528","label":"宁晋县"},{"value":"130529","label":"巨鹿县"},{"value":"130530","label":"新河县"},{"value":"130531","label":"广宗县"},{"value":"130532","label":"平乡县"},{"value":"130533","label":"威县"},{"value":"130534","label":"清河县"},{"value":"130535","label":"临西县"},{"value":"130581","label":"南宫市"},{"value":"130582","label":"沙河市"}]},{"value":"130600","label":"保定市","children":[{"value":"130602","label":"新市区"},{"value":"130603","label":"北市区"},{"value":"130604","label":"南市区"},{"value":"130621","label":"满城县"},{"value":"130622","label":"清苑县"},{"value":"130623","label":"涞水县"},{"value":"130624","label":"阜平县"},{"value":"130625","label":"徐水县"},{"value":"130626","label":"定兴县"},{"value":"130627","label":"唐县"},{"value":"130628","label":"高阳县"},{"value":"130629","label":"容城县"},{"value":"130630","label":"涞源县"},{"value":"130631","label":"望都县"},{"value":"130632","label":"安新县"},{"value":"130633","label":"易县"},{"value":"130634","label":"曲阳县"},{"value":"130635","label":"蠡县"},{"value":"130636","label":"顺平县"},{"value":"130637","label":"博野县"},{"value":"130638","label":"雄县"},{"value":"130681","label":"涿州市"},{"value":"130682","label":"定州市"},{"value":"130683","label":"安国市"},{"value":"130684","label":"高碑店市"},{"value":"130698","label":"高开区"}]},{"value":"130700","label":"张家口市","children":[{"value":"130702","label":"桥东区"},{"value":"130703","label":"桥西区"},{"value":"130705","label":"宣化区"},{"value":"130706","label":"下花园区"},{"value":"130721","label":"宣化县"},{"value":"130722","label":"张北县"},{"value":"130723","label":"康保县"},{"value":"130724","label":"沽源县"},{"value":"130725","label":"尚义县"},{"value":"130726","label":"蔚县"},{"value":"130727","label":"阳原县"},{"value":"130728","label":"怀安县"},{"value":"130729","label":"万全县"},{"value":"130730","label":"怀来县"},{"value":"130731","label":"涿鹿县"},{"value":"130732","label":"赤城县"},{"value":"130733","label":"崇礼县"}]},{"value":"130800","label":"承德市","children":[{"value":"130802","label":"双桥区"},{"value":"130803","label":"双滦区"},{"value":"130804","label":"鹰手营子矿区"},{"value":"130821","label":"承德县"},{"value":"130822","label":"兴隆县"},{"value":"130823","label":"平泉县"},{"value":"130824","label":"滦平县"},{"value":"130825","label":"隆化县"},{"value":"130826","label":"丰宁满族自治县"},{"value":"130827","label":"宽城满族自治县"},{"value":"130828","label":"围场满族蒙古族自治县"}]},{"value":"130900","label":"沧州市","children":[{"value":"130902","label":"新华区"},{"value":"130903","label":"运河区"},{"value":"130921","label":"沧县"},{"value":"130922","label":"青县"},{"value":"130923","label":"东光县"},{"value":"130924","label":"海兴县"},{"value":"130925","label":"盐山县"},{"value":"130926","label":"肃宁县"},{"value":"130927","label":"南皮县"},{"value":"130928","label":"吴桥县"},{"value":"130929","label":"献县"},{"value":"130930","label":"孟村回族自治县"},{"value":"130981","label":"泊头市"},{"value":"130982","label":"任丘市"},{"value":"130983","label":"黄骅市"},{"value":"130984","label":"河间市"}]},{"value":"131000","label":"廊坊市","children":[{"value":"131002","label":"安次区"},{"value":"131003","label":"广阳区"},{"value":"131022","label":"固安县"},{"value":"131023","label":"永清县"},{"value":"131024","label":"香河县"},{"value":"131025","label":"大城县"},{"value":"131026","label":"文安县"},{"value":"131028","label":"大厂回族自治县"},{"value":"131051","label":"开发区"},{"value":"131052","label":"燕郊经济技术开发区"},{"value":"131081","label":"霸州市"},{"value":"131082","label":"三河市"}]},{"value":"131100","label":"衡水市","children":[{"value":"131102","label":"桃城区"},{"value":"131121","label":"枣强县"},{"value":"131122","label":"武邑县"},{"value":"131123","label":"武强县"},{"value":"131124","label":"饶阳县"},{"value":"131125","label":"安平县"},{"value":"131126","label":"故城县"},{"value":"131127","label":"景县"},{"value":"131128","label":"阜城县"},{"value":"131181","label":"冀州市"},{"value":"131182","label":"深州市"}]}]},{"label":"山西省","value":"140000","children":[{"value":"140100","label":"太原市","children":[{"value":"140105","label":"小店区"},{"value":"140106","label":"迎泽区"},{"value":"140107","label":"杏花岭区"},{"value":"140108","label":"尖草坪区"},{"value":"140109","label":"万柏林区"},{"value":"140110","label":"晋源区"},{"value":"140121","label":"清徐县"},{"value":"140122","label":"阳曲县"},{"value":"140123","label":"娄烦县"},{"value":"140181","label":"古交市"}]},{"value":"140200","label":"大同市","children":[{"value":"140202","label":"城区"},{"value":"140203","label":"矿区"},{"value":"140211","label":"南郊区"},{"value":"140212","label":"新荣区"},{"value":"140221","label":"阳高县"},{"value":"140222","label":"天镇县"},{"value":"140223","label":"广灵县"},{"value":"140224","label":"灵丘县"},{"value":"140225","label":"浑源县"},{"value":"140226","label":"左云县"},{"value":"140227","label":"大同县"}]},{"value":"140300","label":"阳泉市","children":[{"value":"140302","label":"城区"},{"value":"140303","label":"矿区"},{"value":"140311","label":"郊区"},{"value":"140321","label":"平定县"},{"value":"140322","label":"盂县"}]},{"value":"140400","label":"长治市","children":[{"value":"140421","label":"长治县"},{"value":"140423","label":"襄垣县"},{"value":"140424","label":"屯留县"},{"value":"140425","label":"平顺县"},{"value":"140426","label":"黎城县"},{"value":"140427","label":"壶关县"},{"value":"140428","label":"长子县"},{"value":"140429","label":"武乡县"},{"value":"140430","label":"沁县"},{"value":"140431","label":"沁源县"},{"value":"140481","label":"潞城市"},{"value":"140482","label":"城区"},{"value":"140483","label":"郊区"},{"value":"140484","label":"高新区"}]},{"value":"140500","label":"晋城市","children":[{"value":"140502","label":"城区"},{"value":"140521","label":"沁水县"},{"value":"140522","label":"阳城县"},{"value":"140524","label":"陵川县"},{"value":"140525","label":"泽州县"},{"value":"140581","label":"高平市"}]},{"value":"140600","label":"朔州市","children":[{"value":"140602","label":"朔城区"},{"value":"140603","label":"平鲁区"},{"value":"140621","label":"山阴县"},{"value":"140622","label":"应县"},{"value":"140623","label":"右玉县"},{"value":"140624","label":"怀仁县"}]},{"value":"140700","label":"晋中市","children":[{"value":"140702","label":"榆次区"},{"value":"140721","label":"榆社县"},{"value":"140722","label":"左权县"},{"value":"140723","label":"和顺县"},{"value":"140724","label":"昔阳县"},{"value":"140725","label":"寿阳县"},{"value":"140726","label":"太谷县"},{"value":"140727","label":"祁县"},{"value":"140728","label":"平遥县"},{"value":"140729","label":"灵石县"},{"value":"140781","label":"介休市"}]},{"value":"140800","label":"运城市","children":[{"value":"140802","label":"盐湖区"},{"value":"140821","label":"临猗县"},{"value":"140822","label":"万荣县"},{"value":"140823","label":"闻喜县"},{"value":"140824","label":"稷山县"},{"value":"140825","label":"新绛县"},{"value":"140826","label":"绛县"},{"value":"140827","label":"垣曲县"},{"value":"140828","label":"夏县"},{"value":"140829","label":"平陆县"},{"value":"140830","label":"芮城县"},{"value":"140881","label":"永济市"},{"value":"140882","label":"河津市"}]},{"value":"140900","label":"忻州市","children":[{"value":"140902","label":"忻府区"},{"value":"140921","label":"定襄县"},{"value":"140922","label":"五台县"},{"value":"140923","label":"代县"},{"value":"140924","label":"繁峙县"},{"value":"140925","label":"宁武县"},{"value":"140926","label":"静乐县"},{"value":"140927","label":"神池县"},{"value":"140928","label":"五寨县"},{"value":"140929","label":"岢岚县"},{"value":"140930","label":"河曲县"},{"value":"140931","label":"保德县"},{"value":"140932","label":"偏关县"},{"value":"140981","label":"原平市"}]},{"value":"141000","label":"临汾市","children":[{"value":"141002","label":"尧都区"},{"value":"141021","label":"曲沃县"},{"value":"141022","label":"翼城县"},{"value":"141023","label":"襄汾县"},{"value":"141024","label":"洪洞县"},{"value":"141025","label":"古县"},{"value":"141026","label":"安泽县"},{"value":"141027","label":"浮山县"},{"value":"141028","label":"吉县"},{"value":"141029","label":"乡宁县"},{"value":"141030","label":"大宁县"},{"value":"141031","label":"隰县"},{"value":"141032","label":"永和县"},{"value":"141033","label":"蒲县"},{"value":"141034","label":"汾西县"},{"value":"141081","label":"侯马市"},{"value":"141082","label":"霍州市"}]},{"value":"141100","label":"吕梁市","children":[{"value":"141102","label":"离石区"},{"value":"141121","label":"文水县"},{"value":"141122","label":"交城县"},{"value":"141123","label":"兴县"},{"value":"141124","label":"临县"},{"value":"141125","label":"柳林县"},{"value":"141126","label":"石楼县"},{"value":"141127","label":"岚县"},{"value":"141128","label":"方山县"},{"value":"141129","label":"中阳县"},{"value":"141130","label":"交口县"},{"value":"141181","label":"孝义市"},{"value":"141182","label":"汾阳市"}]}]},{"label":"内蒙古自治区","value":"150000","children":[{"value":"150100","label":"呼和浩特市","children":[{"value":"150102","label":"新城区"},{"value":"150103","label":"回民区"},{"value":"150104","label":"玉泉区"},{"value":"150105","label":"赛罕区"},{"value":"150121","label":"土默特左旗"},{"value":"150122","label":"托克托县"},{"value":"150123","label":"和林格尔县"},{"value":"150124","label":"清水河县"},{"value":"150125","label":"武川县"}]},{"value":"150200","label":"包头市","children":[{"value":"150202","label":"东河区"},{"value":"150203","label":"昆都仑区"},{"value":"150204","label":"青山区"},{"value":"150205","label":"石拐区"},{"value":"150206","label":"白云矿区"},{"value":"150207","label":"九原区"},{"value":"150221","label":"土默特右旗"},{"value":"150222","label":"固阳县"},{"value":"150223","label":"达尔罕茂明安联合旗"}]},{"value":"150300","label":"乌海市","children":[{"value":"150302","label":"海勃湾区"},{"value":"150303","label":"海南区"},{"value":"150304","label":"乌达区"}]},{"value":"150400","label":"赤峰市","children":[{"value":"150402","label":"红山区"},{"value":"150403","label":"元宝山区"},{"value":"150404","label":"松山区"},{"value":"150421","label":"阿鲁科尔沁旗"},{"value":"150422","label":"巴林左旗"},{"value":"150423","label":"巴林右旗"},{"value":"150424","label":"林西县"},{"value":"150425","label":"克什克腾旗"},{"value":"150426","label":"翁牛特旗"},{"value":"150428","label":"喀喇沁旗"},{"value":"150429","label":"宁城县"},{"value":"150430","label":"敖汉旗"}]},{"value":"150500","label":"通辽市","children":[{"value":"150502","label":"科尔沁区"},{"value":"150521","label":"科尔沁左翼中旗"},{"value":"150522","label":"科尔沁左翼后旗"},{"value":"150523","label":"开鲁县"},{"value":"150524","label":"库伦旗"},{"value":"150525","label":"奈曼旗"},{"value":"150526","label":"扎鲁特旗"},{"value":"150581","label":"霍林郭勒市"}]},{"value":"150600","label":"鄂尔多斯市","children":[{"value":"150602","label":"东胜区"},{"value":"150621","label":"达拉特旗"},{"value":"150622","label":"准格尔旗"},{"value":"150623","label":"鄂托克前旗"},{"value":"150624","label":"鄂托克旗"},{"value":"150625","label":"杭锦旗"},{"value":"150626","label":"乌审旗"},{"value":"150627","label":"伊金霍洛旗"}]},{"value":"150700","label":"呼伦贝尔市","children":[{"value":"150702","label":"海拉尔区"},{"value":"150721","label":"阿荣旗"},{"value":"150722","label":"莫力达瓦达斡尔族自治旗"},{"value":"150723","label":"鄂伦春自治旗"},{"value":"150724","label":"鄂温克族自治旗"},{"value":"150725","label":"陈巴尔虎旗"},{"value":"150726","label":"新巴尔虎左旗"},{"value":"150727","label":"新巴尔虎右旗"},{"value":"150781","label":"满洲里市"},{"value":"150782","label":"牙克石市"},{"value":"150783","label":"扎兰屯市"},{"value":"150784","label":"额尔古纳市"},{"value":"150785","label":"根河市"}]},{"value":"150800","label":"巴彦淖尔市","children":[{"value":"150802","label":"临河区"},{"value":"150821","label":"五原县"},{"value":"150822","label":"磴口县"},{"value":"150823","label":"乌拉特前旗"},{"value":"150824","label":"乌拉特中旗"},{"value":"150825","label":"乌拉特后旗"},{"value":"150826","label":"杭锦后旗"}]},{"value":"150900","label":"乌兰察布市","children":[{"value":"150902","label":"集宁区"},{"value":"150921","label":"卓资县"},{"value":"150922","label":"化德县"},{"value":"150923","label":"商都县"},{"value":"150924","label":"兴和县"},{"value":"150925","label":"凉城县"},{"value":"150926","label":"察哈尔右翼前旗"},{"value":"150927","label":"察哈尔右翼中旗"},{"value":"150928","label":"察哈尔右翼后旗"},{"value":"150929","label":"四子王旗"},{"value":"150981","label":"丰镇市"}]},{"value":"152200","label":"兴安盟","children":[{"value":"152201","label":"乌兰浩特市"},{"value":"152202","label":"阿尔山市"},{"value":"152221","label":"科尔沁右翼前旗"},{"value":"152222","label":"科尔沁右翼中旗"},{"value":"152223","label":"扎赉特旗"},{"value":"152224","label":"突泉县"}]},{"value":"152500","label":"锡林郭勒盟","children":[{"value":"152501","label":"二连浩特市"},{"value":"152502","label":"锡林浩特市"},{"value":"152522","label":"阿巴嘎旗"},{"value":"152523","label":"苏尼特左旗"},{"value":"152524","label":"苏尼特右旗"},{"value":"152525","label":"东乌珠穆沁旗"},{"value":"152526","label":"西乌珠穆沁旗"},{"value":"152527","label":"太仆寺旗"},{"value":"152528","label":"镶黄旗"},{"value":"152529","label":"正镶白旗"},{"value":"152530","label":"正蓝旗"},{"value":"152531","label":"多伦县"}]},{"value":"152900","label":"阿拉善盟","children":[{"value":"152921","label":"阿拉善左旗"},{"value":"152922","label":"阿拉善右旗"},{"value":"152923","label":"额济纳旗"}]}]},{"label":"辽宁省","value":"210000","children":[{"value":"210100","label":"沈阳市","children":[{"value":"210102","label":"和平区"},{"value":"210103","label":"沈河区"},{"value":"210104","label":"大东区"},{"value":"210105","label":"皇姑区"},{"value":"210106","label":"铁西区"},{"value":"210111","label":"苏家屯区"},{"value":"210112","label":"东陵区"},{"value":"210113","label":"新城子区"},{"value":"210114","label":"于洪区"},{"value":"210122","label":"辽中县"},{"value":"210123","label":"康平县"},{"value":"210124","label":"法库县"},{"value":"210181","label":"新民市"},{"value":"210182","label":"浑南新区"},{"value":"210183","label":"张士开发区"},{"value":"210184","label":"沈北新区"}]},{"value":"210200","label":"大连市","children":[{"value":"210202","label":"中山区"},{"value":"210203","label":"西岗区"},{"value":"210204","label":"沙河口区"},{"value":"210211","label":"甘井子区"},{"value":"210212","label":"旅顺口区"},{"value":"210213","label":"金州区"},{"value":"210224","label":"长海县"},{"value":"210251","label":"开发区"},{"value":"210281","label":"瓦房店市"},{"value":"210282","label":"普兰店市"},{"value":"210283","label":"庄河市"},{"value":"210297","label":"岭前区"}]},{"value":"210300","label":"鞍山市","children":[{"value":"210302","label":"铁东区"},{"value":"210303","label":"铁西区"},{"value":"210304","label":"立山区"},{"value":"210311","label":"千山区"},{"value":"210321","label":"台安县"},{"value":"210323","label":"岫岩满族自治县"},{"value":"210351","label":"高新区"},{"value":"210381","label":"海城市"}]},{"value":"210400","label":"抚顺市","children":[{"value":"210402","label":"新抚区"},{"value":"210403","label":"东洲区"},{"value":"210404","label":"望花区"},{"value":"210411","label":"顺城区"},{"value":"210421","label":"抚顺县"},{"value":"210422","label":"新宾满族自治县"},{"value":"210423","label":"清原满族自治县"}]},{"value":"210500","label":"本溪市","children":[{"value":"210502","label":"平山区"},{"value":"210503","label":"溪湖区"},{"value":"210504","label":"明山区"},{"value":"210505","label":"南芬区"},{"value":"210521","label":"本溪满族自治县"},{"value":"210522","label":"桓仁满族自治县"}]},{"value":"210600","label":"丹东市","children":[{"value":"210602","label":"元宝区"},{"value":"210603","label":"振兴区"},{"value":"210604","label":"振安区"},{"value":"210624","label":"宽甸满族自治县"},{"value":"210681","label":"东港市"},{"value":"210682","label":"凤城市"}]},{"value":"210700","label":"锦州市","children":[{"value":"210702","label":"古塔区"},{"value":"210703","label":"凌河区"},{"value":"210711","label":"太和区"},{"value":"210726","label":"黑山县"},{"value":"210727","label":"义县"},{"value":"210781","label":"凌海市"},{"value":"210782","label":"北镇市"}]},{"value":"210800","label":"营口市","children":[{"value":"210802","label":"站前区"},{"value":"210803","label":"西市区"},{"value":"210804","label":"鲅鱼圈区"},{"value":"210811","label":"老边区"},{"value":"210881","label":"盖州市"},{"value":"210882","label":"大石桥市"}]},{"value":"210900","label":"阜新市","children":[{"value":"210902","label":"海州区"},{"value":"210903","label":"新邱区"},{"value":"210904","label":"太平区"},{"value":"210905","label":"清河门区"},{"value":"210911","label":"细河区"},{"value":"210921","label":"阜新蒙古族自治县"},{"value":"210922","label":"彰武县"}]},{"value":"211000","label":"辽阳市","children":[{"value":"211002","label":"白塔区"},{"value":"211003","label":"文圣区"},{"value":"211004","label":"宏伟区"},{"value":"211005","label":"弓长岭区"},{"value":"211011","label":"太子河区"},{"value":"211021","label":"辽阳县"},{"value":"211081","label":"灯塔市"}]},{"value":"211100","label":"盘锦市","children":[{"value":"211102","label":"双台子区"},{"value":"211103","label":"兴隆台区"},{"value":"211121","label":"大洼县"},{"value":"211122","label":"盘山县"}]},{"value":"211200","label":"铁岭市","children":[{"value":"211202","label":"银州区"},{"value":"211204","label":"清河区"},{"value":"211221","label":"铁岭县"},{"value":"211223","label":"西丰县"},{"value":"211224","label":"昌图县"},{"value":"211281","label":"调兵山市"},{"value":"211282","label":"开原市"}]},{"value":"211300","label":"朝阳市","children":[{"value":"211302","label":"双塔区"},{"value":"211303","label":"龙城区"},{"value":"211321","label":"朝阳县"},{"value":"211322","label":"建平县"},{"value":"211324","label":"喀喇沁左翼蒙古族自治县"},{"value":"211381","label":"北票市"},{"value":"211382","label":"凌源市"}]},{"value":"211400","label":"葫芦岛市","children":[{"value":"211402","label":"连山区"},{"value":"211403","label":"龙港区"},{"value":"211404","label":"南票区"},{"value":"211421","label":"绥中县"},{"value":"211422","label":"建昌县"},{"value":"211481","label":"兴城市"}]}]},{"label":"吉林省","value":"220000","children":[{"value":"220100","label":"长春市","children":[{"value":"220102","label":"南关区"},{"value":"220103","label":"宽城区"},{"value":"220104","label":"朝阳区"},{"value":"220105","label":"二道区"},{"value":"220106","label":"绿园区"},{"value":"220112","label":"双阳区"},{"value":"220122","label":"农安县"},{"value":"220181","label":"九台市"},{"value":"220182","label":"榆树市"},{"value":"220183","label":"德惠市"},{"value":"220184","label":"高新技术产业开发区"},{"value":"220185","label":"汽车产业开发区"},{"value":"220186","label":"经济技术开发区"},{"value":"220187","label":"净月旅游开发区"}]},{"value":"220200","label":"吉林市","children":[{"value":"220202","label":"昌邑区"},{"value":"220203","label":"龙潭区"},{"value":"220204","label":"船营区"},{"value":"220211","label":"丰满区"},{"value":"220221","label":"永吉县"},{"value":"220281","label":"蛟河市"},{"value":"220282","label":"桦甸市"},{"value":"220283","label":"舒兰市"},{"value":"220284","label":"磐石市"}]},{"value":"220300","label":"四平市","children":[{"value":"220302","label":"铁西区"},{"value":"220303","label":"铁东区"},{"value":"220322","label":"梨树县"},{"value":"220323","label":"伊通满族自治县"},{"value":"220381","label":"公主岭市"},{"value":"220382","label":"双辽市"}]},{"value":"220400","label":"辽源市","children":[{"value":"220402","label":"龙山区"},{"value":"220403","label":"西安区"},{"value":"220421","label":"东丰县"},{"value":"220422","label":"东辽县"}]},{"value":"220500","label":"通化市","children":[{"value":"220502","label":"东昌区"},{"value":"220503","label":"二道江区"},{"value":"220521","label":"通化县"},{"value":"220523","label":"辉南县"},{"value":"220524","label":"柳河县"},{"value":"220581","label":"梅河口市"},{"value":"220582","label":"集安市"}]},{"value":"220600","label":"白山市","children":[{"value":"220602","label":"八道江区"},{"value":"220621","label":"抚松县"},{"value":"220622","label":"靖宇县"},{"value":"220623","label":"长白朝鲜族自治县"},{"value":"220625","label":"江源市"},{"value":"220681","label":"临江市"}]},{"value":"220700","label":"松原市","children":[{"value":"220702","label":"宁江区"},{"value":"220721","label":"前郭尔罗斯蒙古族自治县"},{"value":"220722","label":"长岭县"},{"value":"220723","label":"乾安县"},{"value":"220724","label":"扶余县"}]},{"value":"220800","label":"白城市","children":[{"value":"220802","label":"洮北区"},{"value":"220821","label":"镇赉县"},{"value":"220822","label":"通榆县"},{"value":"220881","label":"洮南市"},{"value":"220882","label":"大安市"}]},{"value":"222400","label":"延边朝鲜族自治州","children":[{"value":"222401","label":"延吉市"},{"value":"222402","label":"图们市"},{"value":"222403","label":"敦化市"},{"value":"222404","label":"珲春市"},{"value":"222405","label":"龙井市"},{"value":"222406","label":"和龙市"},{"value":"222424","label":"汪清县"},{"value":"222426","label":"安图县"}]}]},{"label":"黑龙江省","value":"230000","children":[{"value":"230100","label":"哈尔滨市","children":[{"value":"230102","label":"道里区"},{"value":"230103","label":"南岗区"},{"value":"230104","label":"道外区"},{"value":"230106","label":"香坊区"},{"value":"230107","label":"动力区"},{"value":"230108","label":"平房区"},{"value":"230109","label":"松北区"},{"value":"230111","label":"呼兰区"},{"value":"230123","label":"依兰县"},{"value":"230124","label":"方正县"},{"value":"230125","label":"宾县"},{"value":"230126","label":"巴彦县"},{"value":"230127","label":"木兰县"},{"value":"230128","label":"通河县"},{"value":"230129","label":"延寿县"},{"value":"230181","label":"阿城市"},{"value":"230182","label":"双城市"},{"value":"230183","label":"尚志市"},{"value":"230184","label":"五常市"},{"value":"230185","label":"阿城市"}]},{"value":"230200","label":"齐齐哈尔市","children":[{"value":"230202","label":"龙沙区"},{"value":"230203","label":"建华区"},{"value":"230204","label":"铁锋区"},{"value":"230205","label":"昂昂溪区"},{"value":"230206","label":"富拉尔基区"},{"value":"230207","label":"碾子山区"},{"value":"230208","label":"梅里斯达斡尔族区"},{"value":"230221","label":"龙江县"},{"value":"230223","label":"依安县"},{"value":"230224","label":"泰来县"},{"value":"230225","label":"甘南县"},{"value":"230227","label":"富裕县"},{"value":"230229","label":"克山县"},{"value":"230230","label":"克东县"},{"value":"230231","label":"拜泉县"},{"value":"230281","label":"讷河市"}]},{"value":"230300","label":"鸡西市","children":[{"value":"230302","label":"鸡冠区"},{"value":"230303","label":"恒山区"},{"value":"230304","label":"滴道区"},{"value":"230305","label":"梨树区"},{"value":"230306","label":"城子河区"},{"value":"230307","label":"麻山区"},{"value":"230321","label":"鸡东县"},{"value":"230381","label":"虎林市"},{"value":"230382","label":"密山市"}]},{"value":"230400","label":"鹤岗市","children":[{"value":"230402","label":"向阳区"},{"value":"230403","label":"工农区"},{"value":"230404","label":"南山区"},{"value":"230405","label":"兴安区"},{"value":"230406","label":"东山区"},{"value":"230407","label":"兴山区"},{"value":"230421","label":"萝北县"},{"value":"230422","label":"绥滨县"}]},{"value":"230500","label":"双鸭山市","children":[{"value":"230502","label":"尖山区"},{"value":"230503","label":"岭东区"},{"value":"230505","label":"四方台区"},{"value":"230506","label":"宝山区"},{"value":"230521","label":"集贤县"},{"value":"230522","label":"友谊县"},{"value":"230523","label":"宝清县"},{"value":"230524","label":"饶河县"}]},{"value":"230600","label":"大庆市","children":[{"value":"230602","label":"萨尔图区"},{"value":"230603","label":"龙凤区"},{"value":"230604","label":"让胡路区"},{"value":"230605","label":"红岗区"},{"value":"230606","label":"大同区"},{"value":"230621","label":"肇州县"},{"value":"230622","label":"肇源县"},{"value":"230623","label":"林甸县"},{"value":"230624","label":"杜尔伯特蒙古族自治县"}]},{"value":"230700","label":"伊春市","children":[{"value":"230702","label":"伊春区"},{"value":"230703","label":"南岔区"},{"value":"230704","label":"友好区"},{"value":"230705","label":"西林区"},{"value":"230706","label":"翠峦区"},{"value":"230707","label":"新青区"},{"value":"230708","label":"美溪区"},{"value":"230709","label":"金山屯区"},{"value":"230710","label":"五营区"},{"value":"230711","label":"乌马河区"},{"value":"230712","label":"汤旺河区"},{"value":"230713","label":"带岭区"},{"value":"230714","label":"乌伊岭区"},{"value":"230715","label":"红星区"},{"value":"230716","label":"上甘岭区"},{"value":"230722","label":"嘉荫县"},{"value":"230781","label":"铁力市"}]},{"value":"230800","label":"佳木斯市","children":[{"value":"230802","label":"永红区"},{"value":"230803","label":"向阳区"},{"value":"230804","label":"前进区"},{"value":"230805","label":"东风区"},{"value":"230811","label":"郊区"},{"value":"230822","label":"桦南县"},{"value":"230826","label":"桦川县"},{"value":"230828","label":"汤原县"},{"value":"230833","label":"抚远县"},{"value":"230881","label":"同江市"},{"value":"230882","label":"富锦市"}]},{"value":"230900","label":"七台河市","children":[{"value":"230902","label":"新兴区"},{"value":"230903","label":"桃山区"},{"value":"230904","label":"茄子河区"},{"value":"230921","label":"勃利县"}]},{"value":"231000","label":"牡丹江市","children":[{"value":"231002","label":"东安区"},{"value":"231003","label":"阳明区"},{"value":"231004","label":"爱民区"},{"value":"231005","label":"西安区"},{"value":"231024","label":"东宁县"},{"value":"231025","label":"林口县"},{"value":"231081","label":"绥芬河市"},{"value":"231083","label":"海林市"},{"value":"231084","label":"宁安市"},{"value":"231085","label":"穆棱市"}]},{"value":"231100","label":"黑河市","children":[{"value":"231102","label":"爱辉区"},{"value":"231121","label":"嫩江县"},{"value":"231123","label":"逊克县"},{"value":"231124","label":"孙吴县"},{"value":"231181","label":"北安市"},{"value":"231182","label":"五大连池市"}]},{"value":"231200","label":"绥化市","children":[{"value":"231202","label":"北林区"},{"value":"231221","label":"望奎县"},{"value":"231222","label":"兰西县"},{"value":"231223","label":"青冈县"},{"value":"231224","label":"庆安县"},{"value":"231225","label":"明水县"},{"value":"231226","label":"绥棱县"},{"value":"231281","label":"安达市"},{"value":"231282","label":"肇东市"},{"value":"231283","label":"海伦市"}]},{"value":"232700","label":"大兴安岭地区","children":[{"value":"232721","label":"呼玛县"},{"value":"232722","label":"塔河县"},{"value":"232723","label":"漠河县"},{"value":"232724","label":"加格达奇区"}]}]},{"label":"上海","value":"310000","children":[{"value":"310100","label":"上海市","children":[{"value":"310101","label":"黄浦区"},{"value":"310103","label":"卢湾区"},{"value":"310104","label":"徐汇区"},{"value":"310105","label":"长宁区"},{"value":"310106","label":"静安区"},{"value":"310107","label":"普陀区"},{"value":"310108","label":"闸北区"},{"value":"310109","label":"虹口区"},{"value":"310110","label":"杨浦区"},{"value":"310112","label":"闵行区"},{"value":"310113","label":"宝山区"},{"value":"310114","label":"嘉定区"},{"value":"310115","label":"浦东新区"},{"value":"310116","label":"金山区"},{"value":"310117","label":"松江区"},{"value":"310118","label":"青浦区"},{"value":"310119","label":"南汇区"},{"value":"310120","label":"奉贤区"},{"value":"310152","label":"川沙区"},{"value":"310230","label":"崇明县"}]}]},{"label":"江苏省","value":"320000","children":[{"value":"320100","label":"南京市","children":[{"value":"320102","label":"玄武区"},{"value":"320103","label":"白下区"},{"value":"320104","label":"秦淮区"},{"value":"320105","label":"建邺区"},{"value":"320106","label":"鼓楼区"},{"value":"320107","label":"下关区"},{"value":"320111","label":"浦口区"},{"value":"320113","label":"栖霞区"},{"value":"320114","label":"雨花台区"},{"value":"320115","label":"江宁区"},{"value":"320116","label":"六合区"},{"value":"320124","label":"溧水县"},{"value":"320125","label":"高淳县"}]},{"value":"320200","label":"无锡市","children":[{"value":"320202","label":"崇安区"},{"value":"320203","label":"南长区"},{"value":"320204","label":"北塘区"},{"value":"320205","label":"锡山区"},{"value":"320206","label":"惠山区"},{"value":"320211","label":"滨湖区"},{"value":"320281","label":"江阴市"},{"value":"320282","label":"宜兴市"},{"value":"320296","label":"新区"}]},{"value":"320300","label":"徐州市","children":[{"value":"320302","label":"鼓楼区"},{"value":"320303","label":"云龙区"},{"value":"320304","label":"九里区"},{"value":"320305","label":"贾汪区"},{"value":"320311","label":"泉山区"},{"value":"320321","label":"丰县"},{"value":"320322","label":"沛县"},{"value":"320323","label":"铜山县"},{"value":"320324","label":"睢宁县"},{"value":"320381","label":"新沂市"},{"value":"320382","label":"邳州市"}]},{"value":"320400","label":"常州市","children":[{"value":"320402","label":"天宁区"},{"value":"320404","label":"钟楼区"},{"value":"320405","label":"戚墅堰区"},{"value":"320411","label":"新北区"},{"value":"320412","label":"武进区"},{"value":"320481","label":"溧阳市"},{"value":"320482","label":"金坛市"}]},{"value":"320500","label":"苏州市","children":[{"value":"320502","label":"沧浪区"},{"value":"320503","label":"平江区"},{"value":"320504","label":"金阊区"},{"value":"320505","label":"虎丘区"},{"value":"320506","label":"吴中区"},{"value":"320507","label":"相城区"},{"value":"320581","label":"常熟市"},{"value":"320582","label":"张家港市"},{"value":"320583","label":"昆山市"},{"value":"320584","label":"吴江市"},{"value":"320585","label":"太仓市"},{"value":"320594","label":"新区"},{"value":"320595","label":"园区"}]},{"value":"320600","label":"南通市","children":[{"value":"320602","label":"崇川区"},{"value":"320611","label":"港闸区"},{"value":"320612","label":"通州区"},{"value":"320621","label":"海安县"},{"value":"320623","label":"如东县"},{"value":"320681","label":"启东市"},{"value":"320682","label":"如皋市"},{"value":"320683","label":"通州市"},{"value":"320684","label":"海门市"},{"value":"320693","label":"开发区"}]},{"value":"320700","label":"连云港市","children":[{"value":"320703","label":"连云区"},{"value":"320705","label":"新浦区"},{"value":"320706","label":"海州区"},{"value":"320721","label":"赣榆县"},{"value":"320722","label":"东海县"},{"value":"320723","label":"灌云县"},{"value":"320724","label":"灌南县"}]},{"value":"320800","label":"淮安市","children":[{"value":"320802","label":"清河区"},{"value":"320803","label":"楚州区"},{"value":"320804","label":"淮阴区"},{"value":"320811","label":"清浦区"},{"value":"320826","label":"涟水县"},{"value":"320829","label":"洪泽县"},{"value":"320830","label":"盱眙县"},{"value":"320831","label":"金湖县"}]},{"value":"320900","label":"盐城市","children":[{"value":"320902","label":"亭湖区"},{"value":"320903","label":"盐都区"},{"value":"320921","label":"响水县"},{"value":"320922","label":"滨海县"},{"value":"320923","label":"阜宁县"},{"value":"320924","label":"射阳县"},{"value":"320925","label":"建湖县"},{"value":"320981","label":"东台市"},{"value":"320982","label":"大丰市"}]},{"value":"321000","label":"扬州市","children":[{"value":"321002","label":"广陵区"},{"value":"321003","label":"邗江区"},{"value":"321011","label":"维扬区"},{"value":"321023","label":"宝应县"},{"value":"321081","label":"仪征市"},{"value":"321084","label":"高邮市"},{"value":"321088","label":"江都市"},{"value":"321092","label":"经济开发区"}]},{"value":"321100","label":"镇江市","children":[{"value":"321102","label":"京口区"},{"value":"321111","label":"润州区"},{"value":"321112","label":"丹徒区"},{"value":"321181","label":"丹阳市"},{"value":"321182","label":"扬中市"},{"value":"321183","label":"句容市"}]},{"value":"321200","label":"泰州市","children":[{"value":"321202","label":"海陵区"},{"value":"321203","label":"高港区"},{"value":"321281","label":"兴化市"},{"value":"321282","label":"靖江市"},{"value":"321283","label":"泰兴市"},{"value":"321284","label":"姜堰市"}]},{"value":"321300","label":"宿迁市","children":[{"value":"321302","label":"宿城区"},{"value":"321311","label":"宿豫区"},{"value":"321322","label":"沭阳县"},{"value":"321323","label":"泗阳县"},{"value":"321324","label":"泗洪县"}]}]},{"label":"浙江省","value":"330000","children":[{"value":"330100","label":"杭州市","children":[{"value":"330102","label":"上城区"},{"value":"330103","label":"下城区"},{"value":"330104","label":"江干区"},{"value":"330105","label":"拱墅区"},{"value":"330106","label":"西湖区"},{"value":"330108","label":"滨江区"},{"value":"330109","label":"萧山区"},{"value":"330110","label":"余杭区"},{"value":"330122","label":"桐庐县"},{"value":"330127","label":"淳安县"},{"value":"330182","label":"建德市"},{"value":"330183","label":"富阳市"},{"value":"330185","label":"临安市"}]},{"value":"330200","label":"宁波市","children":[{"value":"330203","label":"海曙区"},{"value":"330204","label":"江东区"},{"value":"330205","label":"江北区"},{"value":"330206","label":"北仑区"},{"value":"330211","label":"镇海区"},{"value":"330212","label":"鄞州区"},{"value":"330225","label":"象山县"},{"value":"330226","label":"宁海县"},{"value":"330281","label":"余姚市"},{"value":"330282","label":"慈溪市"},{"value":"330283","label":"奉化市"}]},{"value":"330300","label":"温州市","children":[{"value":"330302","label":"鹿城区"},{"value":"330303","label":"龙湾区"},{"value":"330304","label":"瓯海区"},{"value":"330322","label":"洞头县"},{"value":"330324","label":"永嘉县"},{"value":"330326","label":"平阳县"},{"value":"330327","label":"苍南县"},{"value":"330328","label":"文成县"},{"value":"330329","label":"泰顺县"},{"value":"330381","label":"瑞安市"},{"value":"330382","label":"乐清市"}]},{"value":"330400","label":"嘉兴市","children":[{"value":"330402","label":"南湖区"},{"value":"330411","label":"秀洲区"},{"value":"330421","label":"嘉善县"},{"value":"330424","label":"海盐县"},{"value":"330481","label":"海宁市"},{"value":"330482","label":"平湖市"},{"value":"330483","label":"桐乡市"}]},{"value":"330500","label":"湖州市","children":[{"value":"330502","label":"吴兴区"},{"value":"330503","label":"南浔区"},{"value":"330521","label":"德清县"},{"value":"330522","label":"长兴县"},{"value":"330523","label":"安吉县"}]},{"value":"330600","label":"绍兴市","children":[{"value":"330602","label":"越城区"},{"value":"330621","label":"绍兴县"},{"value":"330624","label":"新昌县"},{"value":"330681","label":"诸暨市"},{"value":"330682","label":"上虞市"},{"value":"330683","label":"嵊州市"}]},{"value":"330700","label":"金华市","children":[{"value":"330702","label":"婺城区"},{"value":"330703","label":"金东区"},{"value":"330723","label":"武义县"},{"value":"330726","label":"浦江县"},{"value":"330727","label":"磐安县"},{"value":"330781","label":"兰溪市"},{"value":"330782","label":"义乌市"},{"value":"330783","label":"东阳市"},{"value":"330784","label":"永康市"}]},{"value":"330800","label":"衢州市","children":[{"value":"330802","label":"柯城区"},{"value":"330803","label":"衢江区"},{"value":"330822","label":"常山县"},{"value":"330824","label":"开化县"},{"value":"330825","label":"龙游县"},{"value":"330881","label":"江山市"}]},{"value":"330900","label":"舟山市","children":[{"value":"330902","label":"定海区"},{"value":"330903","label":"普陀区"},{"value":"330921","label":"岱山县"},{"value":"330922","label":"嵊泗县"}]},{"value":"331000","label":"台州市","children":[{"value":"331002","label":"椒江区"},{"value":"331003","label":"黄岩区"},{"value":"331004","label":"路桥区"},{"value":"331021","label":"玉环县"},{"value":"331022","label":"三门县"},{"value":"331023","label":"天台县"},{"value":"331024","label":"仙居县"},{"value":"331081","label":"温岭市"},{"value":"331082","label":"临海市"}]},{"value":"331100","label":"丽水市","children":[{"value":"331102","label":"莲都区"},{"value":"331121","label":"青田县"},{"value":"331122","label":"缙云县"},{"value":"331123","label":"遂昌县"},{"value":"331124","label":"松阳县"},{"value":"331125","label":"云和县"},{"value":"331126","label":"庆元县"},{"value":"331127","label":"景宁畲族自治县"},{"value":"331181","label":"龙泉市"}]}]},{"label":"安徽省","value":"340000","children":[{"value":"340100","label":"合肥市","children":[{"value":"340102","label":"瑶海区"},{"value":"340103","label":"庐阳区"},{"value":"340104","label":"蜀山区"},{"value":"340111","label":"包河区"},{"value":"340121","label":"长丰县"},{"value":"340122","label":"肥东县"},{"value":"340123","label":"肥西县"},{"value":"340151","label":"高新区"},{"value":"340191","label":"中区"},{"value":"341400","label":"巢湖市"},{"value":"341402","label":"居巢区"},{"value":"341421","label":"庐江县"}]},{"value":"340200","label":"芜湖市","children":[{"value":"340202","label":"镜湖区"},{"value":"340203","label":"弋江区"},{"value":"340207","label":"鸠江区"},{"value":"340208","label":"三山区"},{"value":"340221","label":"芜湖县"},{"value":"340222","label":"繁昌县"},{"value":"340223","label":"南陵县"},{"value":"341422","label":"无为县"}]},{"value":"340300","label":"蚌埠市","children":[{"value":"340302","label":"龙子湖区"},{"value":"340303","label":"蚌山区"},{"value":"340304","label":"禹会区"},{"value":"340311","label":"淮上区"},{"value":"340321","label":"怀远县"},{"value":"340322","label":"五河县"},{"value":"340323","label":"固镇县"}]},{"value":"340400","label":"淮南市","children":[{"value":"340402","label":"大通区"},{"value":"340403","label":"田家庵区"},{"value":"340404","label":"谢家集区"},{"value":"340405","label":"八公山区"},{"value":"340406","label":"潘集区"},{"value":"340421","label":"凤台县"}]},{"value":"340500","label":"马鞍山市","children":[{"value":"340502","label":"金家庄区"},{"value":"340503","label":"花山区"},{"value":"340504","label":"雨山区"},{"value":"340521","label":"当涂县"},{"value":"341423","label":"含山县"},{"value":"341424","label":"和县"}]},{"value":"340600","label":"淮北市","children":[{"value":"340602","label":"杜集区"},{"value":"340603","label":"相山区"},{"value":"340604","label":"烈山区"},{"value":"340621","label":"濉溪县"}]},{"value":"340700","label":"铜陵市","children":[{"value":"340702","label":"铜官山区"},{"value":"340703","label":"狮子山区"},{"value":"340711","label":"郊区"},{"value":"340721","label":"铜陵县"}]},{"value":"340800","label":"安庆市","children":[{"value":"340802","label":"迎江区"},{"value":"340803","label":"大观区"},{"value":"340811","label":"宜秀区"},{"value":"340822","label":"怀宁县"},{"value":"340823","label":"枞阳县"},{"value":"340824","label":"潜山县"},{"value":"340825","label":"太湖县"},{"value":"340826","label":"宿松县"},{"value":"340827","label":"望江县"},{"value":"340828","label":"岳西县"},{"value":"340881","label":"桐城市"}]},{"value":"341000","label":"黄山市","children":[{"value":"341002","label":"屯溪区"},{"value":"341003","label":"黄山区"},{"value":"341004","label":"徽州区"},{"value":"341021","label":"歙县"},{"value":"341022","label":"休宁县"},{"value":"341023","label":"黟县"},{"value":"341024","label":"祁门县"}]},{"value":"341100","label":"滁州市","children":[{"value":"341102","label":"琅琊区"},{"value":"341103","label":"南谯区"},{"value":"341122","label":"来安县"},{"value":"341124","label":"全椒县"},{"value":"341125","label":"定远县"},{"value":"341126","label":"凤阳县"},{"value":"341181","label":"天长市"},{"value":"341182","label":"明光市"}]},{"value":"341200","label":"阜阳市","children":[{"value":"341202","label":"颍州区"},{"value":"341203","label":"颍东区"},{"value":"341204","label":"颍泉区"},{"value":"341221","label":"临泉县"},{"value":"341222","label":"太和县"},{"value":"341225","label":"阜南县"},{"value":"341226","label":"颍上县"},{"value":"341282","label":"界首市"}]},{"value":"341300","label":"宿州市","children":[{"value":"341302","label":"埇桥区"},{"value":"341321","label":"砀山县"},{"value":"341322","label":"萧县"},{"value":"341323","label":"灵璧县"},{"value":"341324","label":"泗县"}]},{"value":"341500","label":"六安市","children":[{"value":"341502","label":"金安区"},{"value":"341503","label":"裕安区"},{"value":"341521","label":"寿县"},{"value":"341522","label":"霍邱县"},{"value":"341523","label":"舒城县"},{"value":"341524","label":"金寨县"},{"value":"341525","label":"霍山县"}]},{"value":"341600","label":"亳州市","children":[{"value":"341602","label":"谯城区"},{"value":"341621","label":"涡阳县"},{"value":"341622","label":"蒙城县"},{"value":"341623","label":"利辛县"}]},{"value":"341700","label":"池州市","children":[{"value":"341702","label":"贵池区"},{"value":"341721","label":"东至县"},{"value":"341722","label":"石台县"},{"value":"341723","label":"青阳县"}]},{"value":"341800","label":"宣城市","children":[{"value":"341802","label":"宣州区"},{"value":"341821","label":"郎溪县"},{"value":"341822","label":"广德县"},{"value":"341823","label":"泾县"},{"value":"341824","label":"绩溪县"},{"value":"341825","label":"旌德县"},{"value":"341881","label":"宁国市"}]}]},{"label":"福建省","value":"350000","children":[{"value":"350100","label":"福州市","children":[{"value":"350102","label":"鼓楼区"},{"value":"350103","label":"台江区"},{"value":"350104","label":"仓山区"},{"value":"350105","label":"马尾区"},{"value":"350111","label":"晋安区"},{"value":"350121","label":"闽侯县"},{"value":"350122","label":"连江县"},{"value":"350123","label":"罗源县"},{"value":"350124","label":"闽清县"},{"value":"350125","label":"永泰县"},{"value":"350128","label":"平潭县"},{"value":"350181","label":"福清市"},{"value":"350182","label":"长乐市"}]},{"value":"350200","label":"厦门市","children":[{"value":"350203","label":"思明区"},{"value":"350205","label":"海沧区"},{"value":"350206","label":"湖里区"},{"value":"350211","label":"集美区"},{"value":"350212","label":"同安区"},{"value":"350213","label":"翔安区"}]},{"value":"350300","label":"莆田市","children":[{"value":"350302","label":"城厢区"},{"value":"350303","label":"涵江区"},{"value":"350304","label":"荔城区"},{"value":"350305","label":"秀屿区"},{"value":"350322","label":"仙游县"}]},{"value":"350400","label":"三明市","children":[{"value":"350402","label":"梅列区"},{"value":"350403","label":"三元区"},{"value":"350421","label":"明溪县"},{"value":"350423","label":"清流县"},{"value":"350424","label":"宁化县"},{"value":"350425","label":"大田县"},{"value":"350426","label":"尤溪县"},{"value":"350427","label":"沙县"},{"value":"350428","label":"将乐县"},{"value":"350429","label":"泰宁县"},{"value":"350430","label":"建宁县"},{"value":"350481","label":"永安市"}]},{"value":"350500","label":"泉州市","children":[{"value":"350502","label":"鲤城区"},{"value":"350503","label":"丰泽区"},{"value":"350504","label":"洛江区"},{"value":"350505","label":"泉港区"},{"value":"350521","label":"惠安县"},{"value":"350524","label":"安溪县"},{"value":"350525","label":"永春县"},{"value":"350526","label":"德化县"},{"value":"350527","label":"金门县"},{"value":"350581","label":"石狮市"},{"value":"350582","label":"晋江市"},{"value":"350583","label":"南安市"}]},{"value":"350600","label":"漳州市","children":[{"value":"350602","label":"芗城区"},{"value":"350603","label":"龙文区"},{"value":"350622","label":"云霄县"},{"value":"350623","label":"漳浦县"},{"value":"350624","label":"诏安县"},{"value":"350625","label":"长泰县"},{"value":"350626","label":"东山县"},{"value":"350627","label":"南靖县"},{"value":"350628","label":"平和县"},{"value":"350629","label":"华安县"},{"value":"350681","label":"龙海市"}]},{"value":"350700","label":"南平市","children":[{"value":"350702","label":"延平区"},{"value":"350721","label":"顺昌县"},{"value":"350722","label":"浦城县"},{"value":"350723","label":"光泽县"},{"value":"350724","label":"松溪县"},{"value":"350725","label":"政和县"},{"value":"350781","label":"邵武市"},{"value":"350782","label":"武夷山市"},{"value":"350783","label":"建瓯市"},{"value":"350784","label":"建阳市"}]},{"value":"350800","label":"龙岩市","children":[{"value":"350802","label":"新罗区"},{"value":"350821","label":"长汀县"},{"value":"350822","label":"永定县"},{"value":"350823","label":"上杭县"},{"value":"350824","label":"武平县"},{"value":"350825","label":"连城县"},{"value":"350881","label":"漳平市"}]},{"value":"350900","label":"宁德市","children":[{"value":"350902","label":"蕉城区"},{"value":"350921","label":"霞浦县"},{"value":"350922","label":"古田县"},{"value":"350923","label":"屏南县"},{"value":"350924","label":"寿宁县"},{"value":"350925","label":"周宁县"},{"value":"350926","label":"柘荣县"},{"value":"350981","label":"福安市"},{"value":"350982","label":"福鼎市"}]}]},{"label":"江西省","value":"360000","children":[{"value":"360100","label":"南昌市","children":[{"value":"360102","label":"东湖区"},{"value":"360103","label":"西湖区"},{"value":"360104","label":"青云谱区"},{"value":"360105","label":"湾里区"},{"value":"360111","label":"青山湖区"},{"value":"360121","label":"南昌县"},{"value":"360122","label":"新建县"},{"value":"360123","label":"安义县"},{"value":"360124","label":"进贤县"},{"value":"360125","label":"红谷滩新区"},{"value":"360126","label":"经济技术开发区"},{"value":"360127","label":"昌北区"}]},{"value":"360200","label":"景德镇市","children":[{"value":"360202","label":"昌江区"},{"value":"360203","label":"珠山区"},{"value":"360222","label":"浮梁县"},{"value":"360281","label":"乐平市"}]},{"value":"360300","label":"萍乡市","children":[{"value":"360302","label":"安源区"},{"value":"360313","label":"湘东区"},{"value":"360321","label":"莲花县"},{"value":"360322","label":"上栗县"},{"value":"360323","label":"芦溪县"}]},{"value":"360400","label":"九江市","children":[{"value":"360402","label":"庐山区"},{"value":"360403","label":"浔阳区"},{"value":"360421","label":"九江县"},{"value":"360423","label":"武宁县"},{"value":"360424","label":"修水县"},{"value":"360425","label":"永修县"},{"value":"360426","label":"德安县"},{"value":"360427","label":"星子县"},{"value":"360428","label":"都昌县"},{"value":"360429","label":"湖口县"},{"value":"360430","label":"彭泽县"},{"value":"360481","label":"瑞昌市"}]},{"value":"360500","label":"新余市","children":[{"value":"360502","label":"渝水区"},{"value":"360521","label":"分宜县"}]},{"value":"360600","label":"鹰潭市","children":[{"value":"360602","label":"月湖区"},{"value":"360622","label":"余江县"},{"value":"360681","label":"贵溪市"}]},{"value":"360700","label":"赣州市","children":[{"value":"360702","label":"章贡区"},{"value":"360721","label":"赣县"},{"value":"360722","label":"信丰县"},{"value":"360723","label":"大余县"},{"value":"360724","label":"上犹县"},{"value":"360725","label":"崇义县"},{"value":"360726","label":"安远县"},{"value":"360727","label":"龙南县"},{"value":"360728","label":"定南县"},{"value":"360729","label":"全南县"},{"value":"360730","label":"宁都县"},{"value":"360731","label":"于都县"},{"value":"360732","label":"兴国县"},{"value":"360733","label":"会昌县"},{"value":"360734","label":"寻乌县"},{"value":"360735","label":"石城县"},{"value":"360751","label":"黄金区"},{"value":"360781","label":"瑞金市"},{"value":"360782","label":"南康市"}]},{"value":"360800","label":"吉安市","children":[{"value":"360802","label":"吉州区"},{"value":"360803","label":"青原区"},{"value":"360821","label":"吉安县"},{"value":"360822","label":"吉水县"},{"value":"360823","label":"峡江县"},{"value":"360824","label":"新干县"},{"value":"360825","label":"永丰县"},{"value":"360826","label":"泰和县"},{"value":"360827","label":"遂川县"},{"value":"360828","label":"万安县"},{"value":"360829","label":"安福县"},{"value":"360830","label":"永新县"},{"value":"360881","label":"井冈山市"}]},{"value":"360900","label":"宜春市","children":[{"value":"360902","label":"袁州区"},{"value":"360921","label":"奉新县"},{"value":"360922","label":"万载县"},{"value":"360923","label":"上高县"},{"value":"360924","label":"宜丰县"},{"value":"360925","label":"靖安县"},{"value":"360926","label":"铜鼓县"},{"value":"360981","label":"丰城市"},{"value":"360982","label":"樟树市"},{"value":"360983","label":"高安市"}]},{"value":"361000","label":"抚州市","children":[{"value":"361002","label":"临川区"},{"value":"361021","label":"南城县"},{"value":"361022","label":"黎川县"},{"value":"361023","label":"南丰县"},{"value":"361024","label":"崇仁县"},{"value":"361025","label":"乐安县"},{"value":"361026","label":"宜黄县"},{"value":"361027","label":"金溪县"},{"value":"361028","label":"资溪县"},{"value":"361029","label":"东乡县"},{"value":"361030","label":"广昌县"}]},{"value":"361100","label":"上饶市","children":[{"value":"361102","label":"信州区"},{"value":"361121","label":"上饶县"},{"value":"361122","label":"广丰县"},{"value":"361123","label":"玉山县"},{"value":"361124","label":"铅山县"},{"value":"361125","label":"横峰县"},{"value":"361126","label":"弋阳县"},{"value":"361127","label":"余干县"},{"value":"361128","label":"鄱阳县"},{"value":"361129","label":"万年县"},{"value":"361130","label":"婺源县"},{"value":"361181","label":"德兴市"}]}]},{"label":"山东省","value":"370000","children":[{"value":"370100","label":"济南市","children":[{"value":"370102","label":"历下区"},{"value":"370103","label":"市中区"},{"value":"370104","label":"槐荫区"},{"value":"370105","label":"天桥区"},{"value":"370112","label":"历城区"},{"value":"370113","label":"长清区"},{"value":"370124","label":"平阴县"},{"value":"370125","label":"济阳县"},{"value":"370126","label":"商河县"},{"value":"370181","label":"章丘市"}]},{"value":"370200","label":"青岛市","children":[{"value":"370202","label":"市南区"},{"value":"370203","label":"市北区"},{"value":"370205","label":"四方区"},{"value":"370211","label":"黄岛区"},{"value":"370212","label":"崂山区"},{"value":"370213","label":"李沧区"},{"value":"370214","label":"城阳区"},{"value":"370251","label":"开发区"},{"value":"370281","label":"胶州市"},{"value":"370282","label":"即墨市"},{"value":"370283","label":"平度市"},{"value":"370284","label":"胶南市"},{"value":"370285","label":"莱西市"}]},{"value":"370300","label":"淄博市","children":[{"value":"370302","label":"淄川区"},{"value":"370303","label":"张店区"},{"value":"370304","label":"博山区"},{"value":"370305","label":"临淄区"},{"value":"370306","label":"周村区"},{"value":"370321","label":"桓台县"},{"value":"370322","label":"高青县"},{"value":"370323","label":"沂源县"}]},{"value":"370400","label":"枣庄市","children":[{"value":"370402","label":"市中区"},{"value":"370403","label":"薛城区"},{"value":"370404","label":"峄城区"},{"value":"370405","label":"台儿庄区"},{"value":"370406","label":"山亭区"},{"value":"370481","label":"滕州市"}]},{"value":"370500","label":"东营市","children":[{"value":"370502","label":"东营区"},{"value":"370503","label":"河口区"},{"value":"370521","label":"垦利县"},{"value":"370522","label":"利津县"},{"value":"370523","label":"广饶县"},{"value":"370589","label":"西城区"},{"value":"370590","label":"东城区"}]},{"value":"370600","label":"烟台市","children":[{"value":"370602","label":"芝罘区"},{"value":"370611","label":"福山区"},{"value":"370612","label":"牟平区"},{"value":"370613","label":"莱山区"},{"value":"370634","label":"长岛县"},{"value":"370681","label":"龙口市"},{"value":"370682","label":"莱阳市"},{"value":"370683","label":"莱州市"},{"value":"370684","label":"蓬莱市"},{"value":"370685","label":"招远市"},{"value":"370686","label":"栖霞市"},{"value":"370687","label":"海阳市"}]},{"value":"370700","label":"潍坊市","children":[{"value":"370702","label":"潍城区"},{"value":"370703","label":"寒亭区"},{"value":"370704","label":"坊子区"},{"value":"370705","label":"奎文区"},{"value":"370724","label":"临朐县"},{"value":"370725","label":"昌乐县"},{"value":"370751","label":"开发区"},{"value":"370781","label":"青州市"},{"value":"370782","label":"诸城市"},{"value":"370783","label":"寿光市"},{"value":"370784","label":"安丘市"},{"value":"370785","label":"高密市"},{"value":"370786","label":"昌邑市"}]},{"value":"370800","label":"济宁市","children":[{"value":"370802","label":"市中区"},{"value":"370811","label":"任城区"},{"value":"370826","label":"微山县"},{"value":"370827","label":"鱼台县"},{"value":"370828","label":"金乡县"},{"value":"370829","label":"嘉祥县"},{"value":"370830","label":"汶上县"},{"value":"370831","label":"泗水县"},{"value":"370832","label":"梁山县"},{"value":"370881","label":"曲阜市"},{"value":"370882","label":"兖州市"},{"value":"370883","label":"邹城市"}]},{"value":"370900","label":"泰安市","children":[{"value":"370902","label":"泰山区"},{"value":"370903","label":"岱岳区"},{"value":"370921","label":"宁阳县"},{"value":"370923","label":"东平县"},{"value":"370982","label":"新泰市"},{"value":"370983","label":"肥城市"}]},{"value":"371000","label":"威海市","children":[{"value":"371002","label":"环翠区"},{"value":"371081","label":"文登市"},{"value":"371082","label":"荣成市"},{"value":"371083","label":"乳山市"}]},{"value":"371100","label":"日照市","children":[{"value":"371102","label":"东港区"},{"value":"371103","label":"岚山区"},{"value":"371121","label":"五莲县"},{"value":"371122","label":"莒县"}]},{"value":"371200","label":"莱芜市","children":[{"value":"371202","label":"莱城区"},{"value":"371203","label":"钢城区"}]},{"value":"371300","label":"临沂市","children":[{"value":"371302","label":"兰山区"},{"value":"371311","label":"罗庄区"},{"value":"371312","label":"河东区"},{"value":"371321","label":"沂南县"},{"value":"371322","label":"郯城县"},{"value":"371323","label":"沂水县"},{"value":"371324","label":"苍山县"},{"value":"371325","label":"费县"},{"value":"371326","label":"平邑县"},{"value":"371327","label":"莒南县"},{"value":"371328","label":"蒙阴县"},{"value":"371329","label":"临沭县"}]},{"value":"371400","label":"德州市","children":[{"value":"371402","label":"德城区"},{"value":"371421","label":"陵县"},{"value":"371422","label":"宁津县"},{"value":"371423","label":"庆云县"},{"value":"371424","label":"临邑县"},{"value":"371425","label":"齐河县"},{"value":"371426","label":"平原县"},{"value":"371427","label":"夏津县"},{"value":"371428","label":"武城县"},{"value":"371451","label":"开发区"},{"value":"371481","label":"乐陵市"},{"value":"371482","label":"禹城市"}]},{"value":"371500","label":"聊城市","children":[{"value":"371502","label":"东昌府区"},{"value":"371521","label":"阳谷县"},{"value":"371522","label":"莘县"},{"value":"371523","label":"茌平县"},{"value":"371524","label":"东阿县"},{"value":"371525","label":"冠县"},{"value":"371526","label":"高唐县"},{"value":"371581","label":"临清市"}]},{"value":"371600","label":"滨州市","children":[{"value":"371602","label":"滨城区"},{"value":"371621","label":"惠民县"},{"value":"371622","label":"阳信县"},{"value":"371623","label":"无棣县"},{"value":"371624","label":"沾化县"},{"value":"371625","label":"博兴县"},{"value":"371626","label":"邹平县"}]},{"value":"371700","label":"菏泽市","children":[{"value":"371702","label":"牡丹区"},{"value":"371721","label":"曹县"},{"value":"371722","label":"单县"},{"value":"371723","label":"成武县"},{"value":"371724","label":"巨野县"},{"value":"371725","label":"郓城县"},{"value":"371726","label":"鄄城县"},{"value":"371727","label":"定陶县"},{"value":"371728","label":"东明县"}]}]},{"label":"河南省","value":"410000","children":[{"value":"410100","label":"郑州市","children":[{"value":"410102","label":"中原区"},{"value":"410103","label":"二七区"},{"value":"410104","label":"管城回族区"},{"value":"410105","label":"金水区"},{"value":"410106","label":"上街区"},{"value":"410108","label":"惠济区"},{"value":"410122","label":"中牟县"},{"value":"410181","label":"巩义市"},{"value":"410182","label":"荥阳市"},{"value":"410183","label":"新密市"},{"value":"410184","label":"新郑市"},{"value":"410185","label":"登封市"},{"value":"410186","label":"郑东新区"},{"value":"410187","label":"高新区"}]},{"value":"410200","label":"开封市","children":[{"value":"410202","label":"龙亭区"},{"value":"410203","label":"顺河回族区"},{"value":"410204","label":"鼓楼区"},{"value":"410205","label":"禹王台区"},{"value":"410211","label":"金明区"},{"value":"410221","label":"杞县"},{"value":"410222","label":"通许县"},{"value":"410223","label":"尉氏县"},{"value":"410224","label":"开封县"},{"value":"410225","label":"兰考县"}]},{"value":"410300","label":"洛阳市","children":[{"value":"410302","label":"老城区"},{"value":"410303","label":"西工区"},{"value":"410304","label":"廛河回族区"},{"value":"410305","label":"涧西区"},{"value":"410306","label":"吉利区"},{"value":"410307","label":"洛龙区"},{"value":"410322","label":"孟津县"},{"value":"410323","label":"新安县"},{"value":"410324","label":"栾川县"},{"value":"410325","label":"嵩县"},{"value":"410326","label":"汝阳县"},{"value":"410327","label":"宜阳县"},{"value":"410328","label":"洛宁县"},{"value":"410329","label":"伊川县"},{"value":"410381","label":"偃师市"},{"value":"471004","label":"高新区"}]},{"value":"410400","label":"平顶山市","children":[{"value":"410402","label":"新华区"},{"value":"410403","label":"卫东区"},{"value":"410404","label":"石龙区"},{"value":"410411","label":"湛河区"},{"value":"410421","label":"宝丰县"},{"value":"410422","label":"叶县"},{"value":"410423","label":"鲁山县"},{"value":"410425","label":"郏县"},{"value":"410481","label":"舞钢市"},{"value":"410482","label":"汝州市"}]},{"value":"410500","label":"安阳市","children":[{"value":"410502","label":"文峰区"},{"value":"410503","label":"北关区"},{"value":"410505","label":"殷都区"},{"value":"410506","label":"龙安区"},{"value":"410522","label":"安阳县"},{"value":"410523","label":"汤阴县"},{"value":"410526","label":"滑县"},{"value":"410527","label":"内黄县"},{"value":"410581","label":"林州市"}]},{"value":"410600","label":"鹤壁市","children":[{"value":"410602","label":"鹤山区"},{"value":"410603","label":"山城区"},{"value":"410611","label":"淇滨区"},{"value":"410621","label":"浚县"},{"value":"410622","label":"淇县"}]},{"value":"410700","label":"新乡市","children":[{"value":"410702","label":"红旗区"},{"value":"410703","label":"卫滨区"},{"value":"410704","label":"凤泉区"},{"value":"410711","label":"牧野区"},{"value":"410721","label":"新乡县"},{"value":"410724","label":"获嘉县"},{"value":"410725","label":"原阳县"},{"value":"410726","label":"延津县"},{"value":"410727","label":"封丘县"},{"value":"410728","label":"长垣县"},{"value":"410781","label":"卫辉市"},{"value":"410782","label":"辉县市"}]},{"value":"410800","label":"焦作市","children":[{"value":"410802","label":"解放区"},{"value":"410803","label":"中站区"},{"value":"410804","label":"马村区"},{"value":"410811","label":"山阳区"},{"value":"410821","label":"修武县"},{"value":"410822","label":"博爱县"},{"value":"410823","label":"武陟县"},{"value":"410825","label":"温县"},{"value":"410882","label":"沁阳市"},{"value":"410883","label":"孟州市"}]},{"value":"410881","label":"济源市"},{"value":"410900","label":"濮阳市","children":[{"value":"410902","label":"华龙区"},{"value":"410922","label":"清丰县"},{"value":"410923","label":"南乐县"},{"value":"410926","label":"范县"},{"value":"410927","label":"台前县"},{"value":"410928","label":"濮阳县"}]},{"value":"411000","label":"许昌市","children":[{"value":"411002","label":"魏都区"},{"value":"411023","label":"许昌县"},{"value":"411024","label":"鄢陵县"},{"value":"411025","label":"襄城县"},{"value":"411081","label":"禹州市"},{"value":"411082","label":"长葛市"}]},{"value":"411100","label":"漯河市","children":[{"value":"411102","label":"源汇区"},{"value":"411103","label":"郾城区"},{"value":"411104","label":"召陵区"},{"value":"411121","label":"舞阳县"},{"value":"411122","label":"临颍县"}]},{"value":"411200","label":"三门峡市","children":[{"value":"411202","label":"湖滨区"},{"value":"411221","label":"渑池县"},{"value":"411222","label":"陕县"},{"value":"411224","label":"卢氏县"},{"value":"411281","label":"义马市"},{"value":"411282","label":"灵宝市"}]},{"value":"411300","label":"南阳市","children":[{"value":"411302","label":"宛城区"},{"value":"411303","label":"卧龙区"},{"value":"411321","label":"南召县"},{"value":"411322","label":"方城县"},{"value":"411323","label":"西峡县"},{"value":"411324","label":"镇平县"},{"value":"411325","label":"内乡县"},{"value":"411326","label":"淅川县"},{"value":"411327","label":"社旗县"},{"value":"411328","label":"唐河县"},{"value":"411329","label":"新野县"},{"value":"411330","label":"桐柏县"},{"value":"411381","label":"邓州市"}]},{"value":"411400","label":"商丘市","children":[{"value":"411402","label":"梁园区"},{"value":"411403","label":"睢阳区"},{"value":"411421","label":"民权县"},{"value":"411422","label":"睢县"},{"value":"411423","label":"宁陵县"},{"value":"411424","label":"柘城县"},{"value":"411425","label":"虞城县"},{"value":"411426","label":"夏邑县"},{"value":"411481","label":"永城市"}]},{"value":"411500","label":"信阳市","children":[{"value":"411502","label":"浉河区"},{"value":"411503","label":"平桥区"},{"value":"411521","label":"罗山县"},{"value":"411522","label":"光山县"},{"value":"411523","label":"新县"},{"value":"411524","label":"商城县"},{"value":"411525","label":"固始县"},{"value":"411526","label":"潢川县"},{"value":"411527","label":"淮滨县"},{"value":"411528","label":"息县"}]},{"value":"411600","label":"周口市","children":[{"value":"411602","label":"川汇区"},{"value":"411621","label":"扶沟县"},{"value":"411622","label":"西华县"},{"value":"411623","label":"商水县"},{"value":"411624","label":"沈丘县"},{"value":"411625","label":"郸城县"},{"value":"411626","label":"淮阳县"},{"value":"411627","label":"太康县"},{"value":"411628","label":"鹿邑县"},{"value":"411681","label":"项城市"}]},{"value":"411700","label":"驻马店市","children":[{"value":"411702","label":"驿城区"},{"value":"411721","label":"西平县"},{"value":"411722","label":"上蔡县"},{"value":"411723","label":"平舆县"},{"value":"411724","label":"正阳县"},{"value":"411725","label":"确山县"},{"value":"411726","label":"泌阳县"},{"value":"411727","label":"汝南县"},{"value":"411728","label":"遂平县"},{"value":"411729","label":"新蔡县"}]}]},{"label":"湖北省","value":"420000","children":[{"value":"420100","label":"武汉市","children":[{"value":"420102","label":"江岸区"},{"value":"420103","label":"江汉区"},{"value":"420104","label":"硚口区"},{"value":"420105","label":"汉阳区"},{"value":"420106","label":"武昌区"},{"value":"420107","label":"青山区"},{"value":"420111","label":"洪山区"},{"value":"420112","label":"东西湖区"},{"value":"420113","label":"汉南区"},{"value":"420114","label":"蔡甸区"},{"value":"420115","label":"江夏区"},{"value":"420116","label":"黄陂区"},{"value":"420117","label":"新洲区"}]},{"value":"420200","label":"黄石市","children":[{"value":"420202","label":"黄石港区"},{"value":"420203","label":"西塞山区"},{"value":"420204","label":"下陆区"},{"value":"420205","label":"铁山区"},{"value":"420222","label":"阳新县"},{"value":"420281","label":"大冶市"}]},{"value":"420300","label":"十堰市","children":[{"value":"420302","label":"茅箭区"},{"value":"420303","label":"张湾区"},{"value":"420321","label":"郧县"},{"value":"420322","label":"郧西县"},{"value":"420323","label":"竹山县"},{"value":"420324","label":"竹溪县"},{"value":"420325","label":"房县"},{"value":"420381","label":"丹江口市"},{"value":"420382","label":"城区"}]},{"value":"420500","label":"宜昌市","children":[{"value":"420502","label":"西陵区"},{"value":"420503","label":"伍家岗区"},{"value":"420504","label":"点军区"},{"value":"420505","label":"猇亭区"},{"value":"420506","label":"夷陵区"},{"value":"420525","label":"远安县"},{"value":"420526","label":"兴山县"},{"value":"420527","label":"秭归县"},{"value":"420528","label":"长阳土家族自治县"},{"value":"420529","label":"五峰土家族自治县"},{"value":"420551","label":"葛洲坝区"},{"value":"420552","label":"开发区"},{"value":"420581","label":"宜都市"},{"value":"420582","label":"当阳市"},{"value":"420583","label":"枝江市"}]},{"value":"420600","label":"襄阳市","children":[{"value":"420602","label":"襄城区"},{"value":"420606","label":"樊城区"},{"value":"420607","label":"襄州区"},{"value":"420624","label":"南漳县"},{"value":"420625","label":"谷城县"},{"value":"420626","label":"保康县"},{"value":"420682","label":"老河口市"},{"value":"420683","label":"枣阳市"},{"value":"420684","label":"宜城市"}]},{"value":"420700","label":"鄂州市","children":[{"value":"420702","label":"梁子湖区"},{"value":"420703","label":"华容区"},{"value":"420704","label":"鄂城区"}]},{"value":"420800","label":"荆门市","children":[{"value":"420802","label":"东宝区"},{"value":"420804","label":"掇刀区"},{"value":"420821","label":"京山县"},{"value":"420822","label":"沙洋县"},{"value":"420881","label":"钟祥市"}]},{"value":"420900","label":"孝感市","children":[{"value":"420902","label":"孝南区"},{"value":"420921","label":"孝昌县"},{"value":"420922","label":"大悟县"},{"value":"420923","label":"云梦县"},{"value":"420981","label":"应城市"},{"value":"420982","label":"安陆市"},{"value":"420984","label":"汉川市"}]},{"value":"421000","label":"荆州市","children":[{"value":"421002","label":"沙市区"},{"value":"421003","label":"荆州区"},{"value":"421022","label":"公安县"},{"value":"421023","label":"监利县"},{"value":"421024","label":"江陵县"},{"value":"421081","label":"石首市"},{"value":"421083","label":"洪湖市"},{"value":"421087","label":"松滋市"}]},{"value":"421100","label":"黄冈市","children":[{"value":"421102","label":"黄州区"},{"value":"421121","label":"团风县"},{"value":"421122","label":"红安县"},{"value":"421123","label":"罗田县"},{"value":"421124","label":"英山县"},{"value":"421125","label":"浠水县"},{"value":"421126","label":"蕲春县"},{"value":"421127","label":"黄梅县"},{"value":"421181","label":"麻城市"},{"value":"421182","label":"武穴市"}]},{"value":"421200","label":"咸宁市","children":[{"value":"421202","label":"咸安区"},{"value":"421221","label":"嘉鱼县"},{"value":"421222","label":"通城县"},{"value":"421223","label":"崇阳县"},{"value":"421224","label":"通山县"},{"value":"421281","label":"赤壁市"},{"value":"421282","label":"温泉城区"}]},{"value":"421300","label":"随州市","children":[{"value":"421302","label":"曾都区"},{"value":"421321","label":"随县"},{"value":"421381","label":"广水市"}]},{"value":"422800","label":"恩施土家族苗族自治州","children":[{"value":"422801","label":"恩施市"},{"value":"422802","label":"利川市"},{"value":"422822","label":"建始县"},{"value":"422823","label":"巴东县"},{"value":"422825","label":"宣恩县"},{"value":"422826","label":"咸丰县"},{"value":"422827","label":"来凤县"},{"value":"422828","label":"鹤峰县"}]},{"value":"429004","label":"仙桃市"},{"value":"429005","label":"潜江市"},{"value":"429006","label":"天门市"},{"value":"429021","label":"神农架林区"}]},{"label":"湖南省","value":"430000","children":[{"value":"430100","label":"长沙市","children":[{"value":"430102","label":"芙蓉区"},{"value":"430103","label":"天心区"},{"value":"430104","label":"岳麓区"},{"value":"430105","label":"开福区"},{"value":"430111","label":"雨花区"},{"value":"430121","label":"长沙县"},{"value":"430122","label":"望城县"},{"value":"430124","label":"宁乡县"},{"value":"430181","label":"浏阳市"}]},{"value":"430200","label":"株洲市","children":[{"value":"430202","label":"荷塘区"},{"value":"430203","label":"芦淞区"},{"value":"430204","label":"石峰区"},{"value":"430211","label":"天元区"},{"value":"430221","label":"株洲县"},{"value":"430223","label":"攸县"},{"value":"430224","label":"茶陵县"},{"value":"430225","label":"炎陵县"},{"value":"430281","label":"醴陵市"}]},{"value":"430300","label":"湘潭市","children":[{"value":"430302","label":"雨湖区"},{"value":"430304","label":"岳塘区"},{"value":"430321","label":"湘潭县"},{"value":"430381","label":"湘乡市"},{"value":"430382","label":"韶山市"}]},{"value":"430400","label":"衡阳市","children":[{"value":"430405","label":"珠晖区"},{"value":"430406","label":"雁峰区"},{"value":"430407","label":"石鼓区"},{"value":"430408","label":"蒸湘区"},{"value":"430412","label":"南岳区"},{"value":"430421","label":"衡阳县"},{"value":"430422","label":"衡南县"},{"value":"430423","label":"衡山县"},{"value":"430424","label":"衡东县"},{"value":"430426","label":"祁东县"},{"value":"430481","label":"耒阳市"},{"value":"430482","label":"常宁市"}]},{"value":"430500","label":"邵阳市","children":[{"value":"430502","label":"双清区"},{"value":"430503","label":"大祥区"},{"value":"430511","label":"北塔区"},{"value":"430521","label":"邵东县"},{"value":"430522","label":"新邵县"},{"value":"430523","label":"邵阳县"},{"value":"430524","label":"隆回县"},{"value":"430525","label":"洞口县"},{"value":"430527","label":"绥宁县"},{"value":"430528","label":"新宁县"},{"value":"430529","label":"城步苗族自治县"},{"value":"430581","label":"武冈市"}]},{"value":"430600","label":"岳阳市","children":[{"value":"430602","label":"岳阳楼区"},{"value":"430603","label":"云溪区"},{"value":"430611","label":"君山区"},{"value":"430621","label":"岳阳县"},{"value":"430623","label":"华容县"},{"value":"430624","label":"湘阴县"},{"value":"430626","label":"平江县"},{"value":"430681","label":"汨罗市"},{"value":"430682","label":"临湘市"}]},{"value":"430700","label":"常德市","children":[{"value":"430702","label":"武陵区"},{"value":"430703","label":"鼎城区"},{"value":"430721","label":"安乡县"},{"value":"430722","label":"汉寿县"},{"value":"430723","label":"澧县"},{"value":"430724","label":"临澧县"},{"value":"430725","label":"桃源县"},{"value":"430726","label":"石门县"},{"value":"430781","label":"津市市"}]},{"value":"430800","label":"张家界市","children":[{"value":"430802","label":"永定区"},{"value":"430811","label":"武陵源区"},{"value":"430821","label":"慈利县"},{"value":"430822","label":"桑植县"}]},{"value":"430900","label":"益阳市","children":[{"value":"430902","label":"资阳区"},{"value":"430903","label":"赫山区"},{"value":"430921","label":"南县"},{"value":"430922","label":"桃江县"},{"value":"430923","label":"安化县"},{"value":"430981","label":"沅江市"}]},{"value":"431000","label":"郴州市","children":[{"value":"431002","label":"北湖区"},{"value":"431003","label":"苏仙区"},{"value":"431021","label":"桂阳县"},{"value":"431022","label":"宜章县"},{"value":"431023","label":"永兴县"},{"value":"431024","label":"嘉禾县"},{"value":"431025","label":"临武县"},{"value":"431026","label":"汝城县"},{"value":"431027","label":"桂东县"},{"value":"431028","label":"安仁县"},{"value":"431081","label":"资兴市"}]},{"value":"431100","label":"永州市","children":[{"value":"431102","label":"零陵区"},{"value":"431103","label":"冷水滩区"},{"value":"431121","label":"祁阳县"},{"value":"431122","label":"东安县"},{"value":"431123","label":"双牌县"},{"value":"431124","label":"道县"},{"value":"431125","label":"江永县"},{"value":"431126","label":"宁远县"},{"value":"431127","label":"蓝山县"},{"value":"431128","label":"新田县"},{"value":"431129","label":"江华瑶族自治县"}]},{"value":"431200","label":"怀化市","children":[{"value":"431202","label":"鹤城区"},{"value":"431221","label":"中方县"},{"value":"431222","label":"沅陵县"},{"value":"431223","label":"辰溪县"},{"value":"431224","label":"溆浦县"},{"value":"431225","label":"会同县"},{"value":"431226","label":"麻阳苗族自治县"},{"value":"431227","label":"新晃侗族自治县"},{"value":"431228","label":"芷江侗族自治县"},{"value":"431229","label":"靖州苗族侗族自治县"},{"value":"431230","label":"通道侗族自治县"},{"value":"431281","label":"洪江市"}]},{"value":"431300","label":"娄底市","children":[{"value":"431302","label":"娄星区"},{"value":"431321","label":"双峰县"},{"value":"431322","label":"新化县"},{"value":"431381","label":"冷水江市"},{"value":"431382","label":"涟源市"}]},{"value":"433100","label":"湘西土家族苗族自治州","children":[{"value":"433101","label":"吉首市"},{"value":"433122","label":"泸溪县"},{"value":"433123","label":"凤凰县"},{"value":"433124","label":"花垣县"},{"value":"433125","label":"保靖县"},{"value":"433126","label":"古丈县"},{"value":"433127","label":"永顺县"},{"value":"433130","label":"龙山县"}]}]},{"label":"广东省","value":"440000","children":[{"value":"440100","label":"广州市","children":[{"value":"440103","label":"荔湾区"},{"value":"440104","label":"越秀区"},{"value":"440105","label":"海珠区"},{"value":"440106","label":"天河区"},{"value":"440111","label":"白云区"},{"value":"440112","label":"黄埔区"},{"value":"440113","label":"番禺区"},{"value":"440114","label":"花都区"},{"value":"440115","label":"南沙区"},{"value":"440116","label":"萝岗区"},{"value":"440183","label":"增城市"},{"value":"440184","label":"从化市"},{"value":"440188","label":"东山区"}]},{"value":"440200","label":"韶关市","children":[{"value":"440203","label":"武江区"},{"value":"440204","label":"浈江区"},{"value":"440205","label":"曲江区"},{"value":"440222","label":"始兴县"},{"value":"440224","label":"仁化县"},{"value":"440229","label":"翁源县"},{"value":"440232","label":"乳源瑶族自治县"},{"value":"440233","label":"新丰县"},{"value":"440281","label":"乐昌市"},{"value":"440282","label":"南雄市"}]},{"value":"440300","label":"深圳市","children":[{"value":"440303","label":"罗湖区"},{"value":"440304","label":"福田区"},{"value":"440305","label":"南山区"},{"value":"440306","label":"宝安区"},{"value":"440307","label":"龙岗区"},{"value":"440308","label":"盐田区"},{"value":"1032697","label":"光明新区"},{"value":"1032698","label":"坪山新区"},{"value":"1032699","label":"大鹏新区"},{"value":"1032700","label":"龙华新区"}]},{"value":"440400","label":"珠海市","children":[{"value":"440402","label":"香洲区"},{"value":"440403","label":"斗门区"},{"value":"440404","label":"金湾区"},{"value":"440486","label":"金唐区"},{"value":"440487","label":"南湾区"}]},{"value":"440500","label":"汕头市","children":[{"value":"440507","label":"龙湖区"},{"value":"440511","label":"金平区"},{"value":"440512","label":"濠江区"},{"value":"440513","label":"潮阳区"},{"value":"440514","label":"潮南区"},{"value":"440515","label":"澄海区"},{"value":"440523","label":"南澳县"}]},{"value":"440600","label":"佛山市","children":[{"value":"440604","label":"禅城区"},{"value":"440605","label":"南海区"},{"value":"440606","label":"顺德区"},{"value":"440607","label":"三水区"},{"value":"440608","label":"高明区"}]},{"value":"440700","label":"江门市","children":[{"value":"440703","label":"蓬江区"},{"value":"440704","label":"江海区"},{"value":"440705","label":"新会区"},{"value":"440781","label":"台山市"},{"value":"440783","label":"开平市"},{"value":"440784","label":"鹤山市"},{"value":"440785","label":"恩平市"}]},{"value":"440800","label":"湛江市","children":[{"value":"440802","label":"赤坎区"},{"value":"440803","label":"霞山区"},{"value":"440804","label":"坡头区"},{"value":"440811","label":"麻章区"},{"value":"440823","label":"遂溪县"},{"value":"440825","label":"徐闻县"},{"value":"440881","label":"廉江市"},{"value":"440882","label":"雷州市"},{"value":"440883","label":"吴川市"}]},{"value":"440900","label":"茂名市","children":[{"value":"440902","label":"茂南区"},{"value":"440903","label":"茂港区"},{"value":"440923","label":"电白县"},{"value":"440981","label":"高州市"},{"value":"440982","label":"化州市"},{"value":"440983","label":"信宜市"}]},{"value":"441200","label":"肇庆市","children":[{"value":"441202","label":"端州区"},{"value":"441203","label":"鼎湖区"},{"value":"441223","label":"广宁县"},{"value":"441224","label":"怀集县"},{"value":"441225","label":"封开县"},{"value":"441226","label":"德庆县"},{"value":"441283","label":"高要市"},{"value":"441284","label":"四会市"}]},{"value":"441300","label":"惠州市","children":[{"value":"441302","label":"惠城区"},{"value":"441303","label":"惠阳区"},{"value":"441322","label":"博罗县"},{"value":"441323","label":"惠东县"},{"value":"441324","label":"龙门县"}]},{"value":"441400","label":"梅州市","children":[{"value":"441402","label":"梅江区"},{"value":"441421","label":"梅县"},{"value":"441422","label":"大埔县"},{"value":"441423","label":"丰顺县"},{"value":"441424","label":"五华县"},{"value":"441426","label":"平远县"},{"value":"441427","label":"蕉岭县"},{"value":"441481","label":"兴宁市"}]},{"value":"441500","label":"汕尾市","children":[{"value":"441502","label":"城区"},{"value":"441521","label":"海丰县"},{"value":"441523","label":"陆河县"},{"value":"441581","label":"陆丰市"}]},{"value":"441600","label":"河源市","children":[{"value":"441602","label":"源城区"},{"value":"441621","label":"紫金县"},{"value":"441622","label":"龙川县"},{"value":"441623","label":"连平县"},{"value":"441624","label":"和平县"},{"value":"441625","label":"东源县"}]},{"value":"441700","label":"阳江市","children":[{"value":"441702","label":"江城区"},{"value":"441721","label":"阳西县"},{"value":"441723","label":"阳东县"},{"value":"441781","label":"阳春市"}]},{"value":"441800","label":"清远市","children":[{"value":"441802","label":"清城区"},{"value":"441821","label":"佛冈县"},{"value":"441823","label":"阳山县"},{"value":"441825","label":"连山壮族瑶族自治县"},{"value":"441826","label":"连南瑶族自治县"},{"value":"441827","label":"清新县"},{"value":"441881","label":"英德市"},{"value":"441882","label":"连州市"}]},{"value":"441900","label":"东莞市"},{"value":"442000","label":"中山市"},{"value":"445100","label":"潮州市","children":[{"value":"445102","label":"湘桥区"},{"value":"445121","label":"潮安县"},{"value":"445122","label":"饶平县"},{"value":"445185","label":"枫溪区"}]},{"value":"445200","label":"揭阳市","children":[{"value":"445202","label":"榕城区"},{"value":"445221","label":"揭东县"},{"value":"445222","label":"揭西县"},{"value":"445224","label":"惠来县"},{"value":"445281","label":"普宁市"},{"value":"445284","label":"东山区"}]},{"value":"445300","label":"云浮市","children":[{"value":"445302","label":"云城区"},{"value":"445321","label":"新兴县"},{"value":"445322","label":"郁南县"},{"value":"445323","label":"云安县"},{"value":"445381","label":"罗定市"}]}]},{"label":"广西壮族自治区","value":"450000","children":[{"value":"450100","label":"南宁市","children":[{"value":"450102","label":"兴宁区"},{"value":"450103","label":"青秀区"},{"value":"450105","label":"江南区"},{"value":"450107","label":"西乡塘区"},{"value":"450108","label":"良庆区"},{"value":"450109","label":"邕宁区"},{"value":"450122","label":"武鸣县"},{"value":"450123","label":"隆安县"},{"value":"450124","label":"马山县"},{"value":"450125","label":"上林县"},{"value":"450126","label":"宾阳县"},{"value":"450127","label":"横县"}]},{"value":"450200","label":"柳州市","children":[{"value":"450202","label":"城中区"},{"value":"450203","label":"鱼峰区"},{"value":"450204","label":"柳南区"},{"value":"450205","label":"柳北区"},{"value":"450221","label":"柳江县"},{"value":"450222","label":"柳城县"},{"value":"450223","label":"鹿寨县"},{"value":"450224","label":"融安县"},{"value":"450225","label":"融水苗族自治县"},{"value":"450226","label":"三江侗族自治县"}]},{"value":"450300","label":"桂林市","children":[{"value":"450302","label":"秀峰区"},{"value":"450303","label":"叠彩区"},{"value":"450304","label":"象山区"},{"value":"450305","label":"七星区"},{"value":"450311","label":"雁山区"},{"value":"450321","label":"阳朔县"},{"value":"450322","label":"临桂县"},{"value":"450323","label":"灵川县"},{"value":"450324","label":"全州县"},{"value":"450325","label":"兴安县"},{"value":"450326","label":"永福县"},{"value":"450327","label":"灌阳县"},{"value":"450328","label":"龙胜各族自治县"},{"value":"450329","label":"资源县"},{"value":"450330","label":"平乐县"},{"value":"450331","label":"荔浦县"},{"value":"450332","label":"恭城瑶族自治县"}]},{"value":"450400","label":"梧州市","children":[{"value":"450403","label":"万秀区"},{"value":"450404","label":"蝶山区"},{"value":"450405","label":"长洲区"},{"value":"450421","label":"苍梧县"},{"value":"450422","label":"藤县"},{"value":"450423","label":"蒙山县"},{"value":"450481","label":"岑溪市"}]},{"value":"450500","label":"北海市","children":[{"value":"450502","label":"海城区"},{"value":"450503","label":"银海区"},{"value":"450512","label":"铁山港区"},{"value":"450521","label":"合浦县"}]},{"value":"450600","label":"防城港市","children":[{"value":"450602","label":"港口区"},{"value":"450603","label":"防城区"},{"value":"450621","label":"上思县"},{"value":"450681","label":"东兴市"}]},{"value":"450700","label":"钦州市","children":[{"value":"450702","label":"钦南区"},{"value":"450703","label":"钦北区"},{"value":"450721","label":"灵山县"},{"value":"450722","label":"浦北县"}]},{"value":"450800","label":"贵港市","children":[{"value":"450802","label":"港北区"},{"value":"450803","label":"港南区"},{"value":"450804","label":"覃塘区"},{"value":"450821","label":"平南县"},{"value":"450881","label":"桂平市"}]},{"value":"450900","label":"玉林市","children":[{"value":"450902","label":"玉州区"},{"value":"450921","label":"容县"},{"value":"450922","label":"陆川县"},{"value":"450923","label":"博白县"},{"value":"450924","label":"兴业县"},{"value":"450981","label":"北流市"}]},{"value":"451000","label":"百色市","children":[{"value":"451002","label":"右江区"},{"value":"451021","label":"田阳县"},{"value":"451022","label":"田东县"},{"value":"451023","label":"平果县"},{"value":"451024","label":"德保县"},{"value":"451025","label":"靖西县"},{"value":"451026","label":"那坡县"},{"value":"451027","label":"凌云县"},{"value":"451028","label":"乐业县"},{"value":"451029","label":"田林县"},{"value":"451030","label":"西林县"},{"value":"451031","label":"隆林各族自治县"}]},{"value":"451100","label":"贺州市","children":[{"value":"451102","label":"八步区"},{"value":"451121","label":"昭平县"},{"value":"451122","label":"钟山县"},{"value":"451123","label":"富川瑶族自治县"}]},{"value":"451200","label":"河池市","children":[{"value":"451202","label":"金城江区"},{"value":"451221","label":"南丹县"},{"value":"451222","label":"天峨县"},{"value":"451223","label":"凤山县"},{"value":"451224","label":"东兰县"},{"value":"451225","label":"罗城仫佬族自治县"},{"value":"451226","label":"环江毛南族自治县"},{"value":"451227","label":"巴马瑶族自治县"},{"value":"451228","label":"都安瑶族自治县"},{"value":"451229","label":"大化瑶族自治县"},{"value":"451281","label":"宜州市"}]},{"value":"451300","label":"来宾市","children":[{"value":"451302","label":"兴宾区"},{"value":"451321","label":"忻城县"},{"value":"451322","label":"象州县"},{"value":"451323","label":"武宣县"},{"value":"451324","label":"金秀瑶族自治县"},{"value":"451381","label":"合山市"}]},{"value":"451400","label":"崇左市","children":[{"value":"451402","label":"江洲区"},{"value":"451421","label":"扶绥县"},{"value":"451422","label":"宁明县"},{"value":"451423","label":"龙州县"},{"value":"451424","label":"大新县"},{"value":"451425","label":"天等县"},{"value":"451481","label":"凭祥市"}]}]},{"label":"海南省","value":"460000","children":[{"value":"460100","label":"海口市","children":[{"value":"460105","label":"秀英区"},{"value":"460106","label":"龙华区"},{"value":"460107","label":"琼山区"},{"value":"460108","label":"美兰区"}]},{"value":"460200","label":"三亚市"},{"value":"469001","label":"五指山市"},{"value":"469002","label":"琼海市"},{"value":"469003","label":"儋州市"},{"value":"469005","label":"文昌市"},{"value":"469006","label":"万宁市"},{"value":"469007","label":"东方市"},{"value":"469025","label":"定安县"},{"value":"469026","label":"屯昌县"},{"value":"469027","label":"澄迈县"},{"value":"469028","label":"临高县"},{"value":"469030","label":"白沙黎族自治县"},{"value":"469031","label":"昌江黎族自治县"},{"value":"469033","label":"乐东黎族自治县"},{"value":"469034","label":"陵水黎族自治县"},{"value":"469035","label":"保亭黎族苗族自治县"},{"value":"469036","label":"琼中黎族苗族自治县"},{"value":"469037","label":"西沙群岛"},{"value":"469038","label":"南沙群岛"},{"value":"469039","label":"中沙群岛的岛礁及其海域"}]},{"label":"重庆","value":"500000","children":[{"value":"500100","label":"重庆市","children":[{"value":"500101","label":"万州区"},{"value":"500102","label":"涪陵区"},{"value":"500103","label":"渝中区"},{"value":"500104","label":"大渡口区"},{"value":"500105","label":"江北区"},{"value":"500106","label":"沙坪坝区"},{"value":"500107","label":"九龙坡区"},{"value":"500108","label":"南岸区"},{"value":"500109","label":"北碚区"},{"value":"500110","label":"万盛区"},{"value":"500111","label":"双桥区"},{"value":"500112","label":"渝北区"},{"value":"500113","label":"巴南区"},{"value":"500114","label":"黔江区"},{"value":"500115","label":"长寿区"},{"value":"500222","label":"綦江县"},{"value":"500223","label":"潼南县"},{"value":"500224","label":"铜梁县"},{"value":"500225","label":"大足县"},{"value":"500226","label":"荣昌县"},{"value":"500227","label":"璧山县"},{"value":"500228","label":"梁平县"},{"value":"500229","label":"城口县"},{"value":"500230","label":"丰都县"},{"value":"500231","label":"垫江县"},{"value":"500232","label":"武隆县"},{"value":"500233","label":"忠县"},{"value":"500234","label":"开县"},{"value":"500235","label":"云阳县"},{"value":"500236","label":"奉节县"},{"value":"500237","label":"巫山县"},{"value":"500238","label":"巫溪县"},{"value":"500240","label":"石柱土家族自治县"},{"value":"500241","label":"秀山土家族苗族自治县"},{"value":"500242","label":"酉阳土家族苗族自治县"},{"value":"500243","label":"彭水苗族土家族自治县"},{"value":"500381","label":"江津区"},{"value":"500382","label":"合川区"},{"value":"500383","label":"永川区"},{"value":"500384","label":"南川区"}]}]},{"label":"四川省","value":"510000","children":[{"value":"510100","label":"成都市","children":[{"value":"510104","label":"锦江区"},{"value":"510105","label":"青羊区"},{"value":"510106","label":"金牛区"},{"value":"510107","label":"武侯区"},{"value":"510108","label":"成华区"},{"value":"510112","label":"龙泉驿区"},{"value":"510113","label":"青白江区"},{"value":"510114","label":"新都区"},{"value":"510115","label":"温江区"},{"value":"510121","label":"金堂县"},{"value":"510122","label":"双流县"},{"value":"510124","label":"郫县"},{"value":"510129","label":"大邑县"},{"value":"510131","label":"蒲江县"},{"value":"510132","label":"新津县"},{"value":"510181","label":"都江堰市"},{"value":"510182","label":"彭州市"},{"value":"510183","label":"邛崃市"},{"value":"510184","label":"崇州市"}]},{"value":"510300","label":"自贡市","children":[{"value":"510302","label":"自流井区"},{"value":"510303","label":"贡井区"},{"value":"510304","label":"大安区"},{"value":"510311","label":"沿滩区"},{"value":"510321","label":"荣县"},{"value":"510322","label":"富顺县"}]},{"value":"510400","label":"攀枝花市","children":[{"value":"510402","label":"东区"},{"value":"510403","label":"西区"},{"value":"510411","label":"仁和区"},{"value":"510421","label":"米易县"},{"value":"510422","label":"盐边县"}]},{"value":"510500","label":"泸州市","children":[{"value":"510502","label":"江阳区"},{"value":"510503","label":"纳溪区"},{"value":"510504","label":"龙马潭区"},{"value":"510521","label":"泸县"},{"value":"510522","label":"合江县"},{"value":"510524","label":"叙永县"},{"value":"510525","label":"古蔺县"}]},{"value":"510600","label":"德阳市","children":[{"value":"510603","label":"旌阳区"},{"value":"510623","label":"中江县"},{"value":"510626","label":"罗江县"},{"value":"510681","label":"广汉市"},{"value":"510682","label":"什邡市"},{"value":"510683","label":"绵竹市"}]},{"value":"510700","label":"绵阳市","children":[{"value":"510703","label":"涪城区"},{"value":"510704","label":"游仙区"},{"value":"510722","label":"三台县"},{"value":"510723","label":"盐亭县"},{"value":"510724","label":"安县"},{"value":"510725","label":"梓潼县"},{"value":"510726","label":"北川羌族自治县"},{"value":"510727","label":"平武县"},{"value":"510751","label":"高新区"},{"value":"510781","label":"江油市"}]},{"value":"510800","label":"广元市","children":[{"value":"510802","label":"利州区"},{"value":"510811","label":"元坝区"},{"value":"510812","label":"朝天区"},{"value":"510821","label":"旺苍县"},{"value":"510822","label":"青川县"},{"value":"510823","label":"剑阁县"},{"value":"510824","label":"苍溪县"}]},{"value":"510900","label":"遂宁市","children":[{"value":"510903","label":"船山区"},{"value":"510904","label":"安居区"},{"value":"510921","label":"蓬溪县"},{"value":"510922","label":"射洪县"},{"value":"510923","label":"大英县"}]},{"value":"511000","label":"内江市","children":[{"value":"511002","label":"市中区"},{"value":"511011","label":"东兴区"},{"value":"511024","label":"威远县"},{"value":"511025","label":"资中县"},{"value":"511028","label":"隆昌县"}]},{"value":"511100","label":"乐山市","children":[{"value":"511102","label":"市中区"},{"value":"511111","label":"沙湾区"},{"value":"511112","label":"五通桥区"},{"value":"511113","label":"金口河区"},{"value":"511123","label":"犍为县"},{"value":"511124","label":"井研县"},{"value":"511126","label":"夹江县"},{"value":"511129","label":"沐川县"},{"value":"511132","label":"峨边彝族自治县"},{"value":"511133","label":"马边彝族自治县"},{"value":"511181","label":"峨眉山市"}]},{"value":"511300","label":"南充市","children":[{"value":"511302","label":"顺庆区"},{"value":"511303","label":"高坪区"},{"value":"511304","label":"嘉陵区"},{"value":"511321","label":"南部县"},{"value":"511322","label":"营山县"},{"value":"511323","label":"蓬安县"},{"value":"511324","label":"仪陇县"},{"value":"511325","label":"西充县"},{"value":"511381","label":"阆中市"}]},{"value":"511400","label":"眉山市","children":[{"value":"511402","label":"东坡区"},{"value":"511421","label":"仁寿县"},{"value":"511422","label":"彭山县"},{"value":"511423","label":"洪雅县"},{"value":"511424","label":"丹棱县"},{"value":"511425","label":"青神县"}]},{"value":"511500","label":"宜宾市","children":[{"value":"511502","label":"翠屏区"},{"value":"511521","label":"宜宾县"},{"value":"511522","label":"南溪县"},{"value":"511523","label":"江安县"},{"value":"511524","label":"长宁县"},{"value":"511525","label":"高县"},{"value":"511526","label":"珙县"},{"value":"511527","label":"筠连县"},{"value":"511528","label":"兴文县"},{"value":"511529","label":"屏山县"}]},{"value":"511600","label":"广安市","children":[{"value":"511602","label":"广安区"},{"value":"511621","label":"岳池县"},{"value":"511622","label":"武胜县"},{"value":"511623","label":"邻水县"},{"value":"511681","label":"华蓥市"},{"value":"511682","label":"市辖区"}]},{"value":"511700","label":"达州市","children":[{"value":"511702","label":"通川区"},{"value":"511721","label":"达县"},{"value":"511722","label":"宣汉县"},{"value":"511723","label":"开江县"},{"value":"511724","label":"大竹县"},{"value":"511725","label":"渠县"},{"value":"511781","label":"万源市"}]},{"value":"511800","label":"雅安市","children":[{"value":"511802","label":"雨城区"},{"value":"511821","label":"名山县"},{"value":"511822","label":"荥经县"},{"value":"511823","label":"汉源县"},{"value":"511824","label":"石棉县"},{"value":"511825","label":"天全县"},{"value":"511826","label":"芦山县"},{"value":"511827","label":"宝兴县"}]},{"value":"511900","label":"巴中市","children":[{"value":"511902","label":"巴州区"},{"value":"511921","label":"通江县"},{"value":"511922","label":"南江县"},{"value":"511923","label":"平昌县"}]},{"value":"512000","label":"资阳市","children":[{"value":"512002","label":"雁江区"},{"value":"512021","label":"安岳县"},{"value":"512022","label":"乐至县"},{"value":"512081","label":"简阳市"}]},{"value":"513200","label":"阿坝藏族羌族自治州","children":[{"value":"513221","label":"汶川县"},{"value":"513222","label":"理县"},{"value":"513223","label":"茂县"},{"value":"513224","label":"松潘县"},{"value":"513225","label":"九寨沟县"},{"value":"513226","label":"金川县"},{"value":"513227","label":"小金县"},{"value":"513228","label":"黑水县"},{"value":"513229","label":"马尔康县"},{"value":"513230","label":"壤塘县"},{"value":"513231","label":"阿坝县"},{"value":"513232","label":"若尔盖县"},{"value":"513233","label":"红原县"}]},{"value":"513300","label":"甘孜藏族自治州","children":[{"value":"513321","label":"康定县"},{"value":"513322","label":"泸定县"},{"value":"513323","label":"丹巴县"},{"value":"513324","label":"九龙县"},{"value":"513325","label":"雅江县"},{"value":"513326","label":"道孚县"},{"value":"513327","label":"炉霍县"},{"value":"513328","label":"甘孜县"},{"value":"513329","label":"新龙县"},{"value":"513330","label":"德格县"},{"value":"513331","label":"白玉县"},{"value":"513332","label":"石渠县"},{"value":"513333","label":"色达县"},{"value":"513334","label":"理塘县"},{"value":"513335","label":"巴塘县"},{"value":"513336","label":"乡城县"},{"value":"513337","label":"稻城县"},{"value":"513338","label":"得荣县"}]},{"value":"513400","label":"凉山彝族自治州","children":[{"value":"513401","label":"西昌市"},{"value":"513422","label":"木里藏族自治县"},{"value":"513423","label":"盐源县"},{"value":"513424","label":"德昌县"},{"value":"513425","label":"会理县"},{"value":"513426","label":"会东县"},{"value":"513427","label":"宁南县"},{"value":"513428","label":"普格县"},{"value":"513429","label":"布拖县"},{"value":"513430","label":"金阳县"},{"value":"513431","label":"昭觉县"},{"value":"513432","label":"喜德县"},{"value":"513433","label":"冕宁县"},{"value":"513434","label":"越西县"},{"value":"513435","label":"甘洛县"},{"value":"513436","label":"美姑县"},{"value":"513437","label":"雷波县"}]}]},{"label":"贵州省","value":"520000","children":[{"value":"520100","label":"贵阳市","children":[{"value":"520102","label":"南明区"},{"value":"520103","label":"云岩区"},{"value":"520111","label":"花溪区"},{"value":"520112","label":"乌当区"},{"value":"520113","label":"白云区"},{"value":"520114","label":"小河区"},{"value":"520121","label":"开阳县"},{"value":"520122","label":"息烽县"},{"value":"520123","label":"修文县"},{"value":"520151","label":"金阳开发区"},{"value":"520181","label":"清镇市"}]},{"value":"520200","label":"六盘水市","children":[{"value":"520201","label":"钟山区"},{"value":"520203","label":"六枝特区"},{"value":"520221","label":"水城县"},{"value":"520222","label":"盘县"}]},{"value":"520300","label":"遵义市","children":[{"value":"520302","label":"红花岗区"},{"value":"520303","label":"汇川区"},{"value":"520321","label":"遵义县"},{"value":"520322","label":"桐梓县"},{"value":"520323","label":"绥阳县"},{"value":"520324","label":"正安县"},{"value":"520325","label":"道真仡佬族苗族自治县"},{"value":"520326","label":"务川仡佬族苗族自治县"},{"value":"520327","label":"凤冈县"},{"value":"520328","label":"湄潭县"},{"value":"520329","label":"余庆县"},{"value":"520330","label":"习水县"},{"value":"520381","label":"赤水市"},{"value":"520382","label":"仁怀市"}]},{"value":"520400","label":"安顺市","children":[{"value":"520402","label":"西秀区"},{"value":"520421","label":"平坝县"},{"value":"520422","label":"普定县"},{"value":"520423","label":"镇宁布依族苗族自治县"},{"value":"520424","label":"关岭布依族苗族自治县"},{"value":"520425","label":"紫云苗族布依族自治县"}]},{"value":"522200","label":"铜仁地区","children":[{"value":"522201","label":"铜仁市"},{"value":"522222","label":"江口县"},{"value":"522223","label":"玉屏侗族自治县"},{"value":"522224","label":"石阡县"},{"value":"522225","label":"思南县"},{"value":"522226","label":"印江土家族苗族自治县"},{"value":"522227","label":"德江县"},{"value":"522228","label":"沿河土家族自治县"},{"value":"522229","label":"松桃苗族自治县"},{"value":"522230","label":"万山特区"}]},{"value":"522300","label":"黔西南布依族苗族自治州","children":[{"value":"522301","label":"兴义市"},{"value":"522322","label":"兴仁县"},{"value":"522323","label":"普安县"},{"value":"522324","label":"晴隆县"},{"value":"522325","label":"贞丰县"},{"value":"522326","label":"望谟县"},{"value":"522327","label":"册亨县"},{"value":"522328","label":"安龙县"}]},{"value":"522400","label":"毕节地区","children":[{"value":"522401","label":"毕节市"},{"value":"522422","label":"大方县"},{"value":"522423","label":"黔西县"},{"value":"522424","label":"金沙县"},{"value":"522425","label":"织金县"},{"value":"522426","label":"纳雍县"},{"value":"522427","label":"威宁彝族回族苗族自治县"},{"value":"522428","label":"赫章县"}]},{"value":"522600","label":"黔东南苗族侗族自治州","children":[{"value":"522601","label":"凯里市"},{"value":"522622","label":"黄平县"},{"value":"522623","label":"施秉县"},{"value":"522624","label":"三穗县"},{"value":"522625","label":"镇远县"},{"value":"522626","label":"岑巩县"},{"value":"522627","label":"天柱县"},{"value":"522628","label":"锦屏县"},{"value":"522629","label":"剑河县"},{"value":"522630","label":"台江县"},{"value":"522631","label":"黎平县"},{"value":"522632","label":"榕江县"},{"value":"522633","label":"从江县"},{"value":"522634","label":"雷山县"},{"value":"522635","label":"麻江县"},{"value":"522636","label":"丹寨县"}]},{"value":"522700","label":"黔南布依族苗族自治州","children":[{"value":"522701","label":"都匀市"},{"value":"522702","label":"福泉市"},{"value":"522722","label":"荔波县"},{"value":"522723","label":"贵定县"},{"value":"522725","label":"瓮安县"},{"value":"522726","label":"独山县"},{"value":"522727","label":"平塘县"},{"value":"522728","label":"罗甸县"},{"value":"522729","label":"长顺县"},{"value":"522730","label":"龙里县"},{"value":"522731","label":"惠水县"},{"value":"522732","label":"三都水族自治县"}]}]},{"label":"云南省","value":"530000","children":[{"value":"530100","label":"昆明市","children":[{"value":"530102","label":"五华区"},{"value":"530103","label":"盘龙区"},{"value":"530111","label":"官渡区"},{"value":"530112","label":"西山区"},{"value":"530113","label":"东川区"},{"value":"530121","label":"呈贡县"},{"value":"530122","label":"晋宁县"},{"value":"530124","label":"富民县"},{"value":"530125","label":"宜良县"},{"value":"530126","label":"石林彝族自治县"},{"value":"530127","label":"嵩明县"},{"value":"530128","label":"禄劝彝族苗族自治县"},{"value":"530129","label":"寻甸回族彝族自治县"},{"value":"530181","label":"安宁市"}]},{"value":"530300","label":"曲靖市","children":[{"value":"530302","label":"麒麟区"},{"value":"530321","label":"马龙县"},{"value":"530322","label":"陆良县"},{"value":"530323","label":"师宗县"},{"value":"530324","label":"罗平县"},{"value":"530325","label":"富源县"},{"value":"530326","label":"会泽县"},{"value":"530328","label":"沾益县"},{"value":"530381","label":"宣威市"}]},{"value":"530400","label":"玉溪市","children":[{"value":"530402","label":"红塔区"},{"value":"530421","label":"江川县"},{"value":"530422","label":"澄江县"},{"value":"530423","label":"通海县"},{"value":"530424","label":"华宁县"},{"value":"530425","label":"易门县"},{"value":"530426","label":"峨山彝族自治县"},{"value":"530427","label":"新平彝族傣族自治县"},{"value":"530428","label":"元江哈尼族彝族傣族自治县"}]},{"value":"530500","label":"保山市","children":[{"value":"530502","label":"隆阳区"},{"value":"530521","label":"施甸县"},{"value":"530522","label":"腾冲县"},{"value":"530523","label":"龙陵县"},{"value":"530524","label":"昌宁县"}]},{"value":"530600","label":"昭通市","children":[{"value":"530602","label":"昭阳区"},{"value":"530621","label":"鲁甸县"},{"value":"530622","label":"巧家县"},{"value":"530623","label":"盐津县"},{"value":"530624","label":"大关县"},{"value":"530625","label":"永善县"},{"value":"530626","label":"绥江县"},{"value":"530627","label":"镇雄县"},{"value":"530628","label":"彝良县"},{"value":"530629","label":"威信县"},{"value":"530630","label":"水富县"}]},{"value":"530700","label":"丽江市","children":[{"value":"530702","label":"古城区"},{"value":"530721","label":"玉龙纳西族自治县"},{"value":"530722","label":"永胜县"},{"value":"530723","label":"华坪县"},{"value":"530724","label":"宁蒗彝族自治县"}]},{"value":"530800","label":"普洱市","children":[{"value":"530802","label":"思茅区"},{"value":"530821","label":"宁洱哈尼族彝族自治县"},{"value":"530822","label":"墨江哈尼族自治县"},{"value":"530823","label":"景东彝族自治县"},{"value":"530824","label":"景谷傣族彝族自治县"},{"value":"530825","label":"镇沅彝族哈尼族拉祜族自治县"},{"value":"530826","label":"江城哈尼族彝族自治县"},{"value":"530827","label":"孟连傣族拉祜族佤族自治县"},{"value":"530828","label":"澜沧拉祜族自治县"},{"value":"530829","label":"西盟佤族自治县"}]},{"value":"530900","label":"临沧市","children":[{"value":"530902","label":"临翔区"},{"value":"530921","label":"凤庆县"},{"value":"530922","label":"云县"},{"value":"530923","label":"永德县"},{"value":"530924","label":"镇康县"},{"value":"530925","label":"双江拉祜族佤族布朗族傣族自治县"},{"value":"530926","label":"耿马傣族佤族自治县"},{"value":"530927","label":"沧源佤族自治县"}]},{"value":"532300","label":"楚雄彝族自治州","children":[{"value":"532301","label":"楚雄市"},{"value":"532322","label":"双柏县"},{"value":"532323","label":"牟定县"},{"value":"532324","label":"南华县"},{"value":"532325","label":"姚安县"},{"value":"532326","label":"大姚县"},{"value":"532327","label":"永仁县"},{"value":"532328","label":"元谋县"},{"value":"532329","label":"武定县"},{"value":"532331","label":"禄丰县"}]},{"value":"532500","label":"红河哈尼族彝族自治州","children":[{"value":"532501","label":"个旧市"},{"value":"532502","label":"开远市"},{"value":"532522","label":"蒙自县"},{"value":"532523","label":"屏边苗族自治县"},{"value":"532524","label":"建水县"},{"value":"532525","label":"石屏县"},{"value":"532526","label":"弥勒县"},{"value":"532527","label":"泸西县"},{"value":"532528","label":"元阳县"},{"value":"532529","label":"红河县"},{"value":"532530","label":"金平苗族瑶族傣族自治县"},{"value":"532531","label":"绿春县"},{"value":"532532","label":"河口瑶族自治县"}]},{"value":"532600","label":"文山壮族苗族自治州","children":[{"value":"532621","label":"文山县"},{"value":"532622","label":"砚山县"},{"value":"532623","label":"西畴县"},{"value":"532624","label":"麻栗坡县"},{"value":"532625","label":"马关县"},{"value":"532626","label":"丘北县"},{"value":"532627","label":"广南县"},{"value":"532628","label":"富宁县"}]},{"value":"532800","label":"西双版纳傣族自治州","children":[{"value":"532801","label":"景洪市"},{"value":"532822","label":"勐海县"},{"value":"532823","label":"勐腊县"}]},{"value":"532900","label":"大理白族自治州","children":[{"value":"532901","label":"大理市"},{"value":"532922","label":"漾濞彝族自治县"},{"value":"532923","label":"祥云县"},{"value":"532924","label":"宾川县"},{"value":"532925","label":"弥渡县"},{"value":"532926","label":"南涧彝族自治县"},{"value":"532927","label":"巍山彝族回族自治县"},{"value":"532928","label":"永平县"},{"value":"532929","label":"云龙县"},{"value":"532930","label":"洱源县"},{"value":"532931","label":"剑川县"},{"value":"532932","label":"鹤庆县"}]},{"value":"533100","label":"德宏傣族景颇族自治州","children":[{"value":"533102","label":"瑞丽市"},{"value":"533103","label":"潞西市"},{"value":"533122","label":"梁河县"},{"value":"533123","label":"盈江县"},{"value":"533124","label":"陇川县"}]},{"value":"533300","label":"怒江傈僳族自治州","children":[{"value":"533321","label":"泸水县"},{"value":"533323","label":"福贡县"},{"value":"533324","label":"贡山独龙族怒族自治县"},{"value":"533325","label":"兰坪白族普米族自治县"}]},{"value":"533400","label":"迪庆藏族自治州","children":[{"value":"533421","label":"香格里拉县"},{"value":"533422","label":"德钦县"},{"value":"533423","label":"维西傈僳族自治县"}]}]},{"label":"西藏自治区","value":"540000","children":[{"value":"540100","label":"拉萨市","children":[{"value":"540102","label":"城关区"},{"value":"540121","label":"林周县"},{"value":"540122","label":"当雄县"},{"value":"540123","label":"尼木县"},{"value":"540124","label":"曲水县"},{"value":"540125","label":"堆龙德庆县"},{"value":"540126","label":"达孜县"},{"value":"540127","label":"墨竹工卡县"}]},{"value":"542100","label":"昌都地区","children":[{"value":"542121","label":"昌都县"},{"value":"542122","label":"江达县"},{"value":"542123","label":"贡觉县"},{"value":"542124","label":"类乌齐县"},{"value":"542125","label":"丁青县"},{"value":"542126","label":"察雅县"},{"value":"542127","label":"八宿县"},{"value":"542128","label":"左贡县"},{"value":"542129","label":"芒康县"},{"value":"542132","label":"洛隆县"},{"value":"542133","label":"边坝县"}]},{"value":"542200","label":"山南地区","children":[{"value":"542221","label":"乃东县"},{"value":"542222","label":"扎囊县"},{"value":"542223","label":"贡嘎县"},{"value":"542224","label":"桑日县"},{"value":"542225","label":"琼结县"},{"value":"542226","label":"曲松县"},{"value":"542227","label":"措美县"},{"value":"542228","label":"洛扎县"},{"value":"542229","label":"加查县"},{"value":"542231","label":"隆子县"},{"value":"542232","label":"错那县"},{"value":"542233","label":"浪卡子县"}]},{"value":"542300","label":"日喀则地区","children":[{"value":"542301","label":"日喀则市"},{"value":"542322","label":"南木林县"},{"value":"542323","label":"江孜县"},{"value":"542324","label":"定日县"},{"value":"542325","label":"萨迦县"},{"value":"542326","label":"拉孜县"},{"value":"542327","label":"昂仁县"},{"value":"542328","label":"谢通门县"},{"value":"542329","label":"白朗县"},{"value":"542330","label":"仁布县"},{"value":"542331","label":"康马县"},{"value":"542332","label":"定结县"},{"value":"542333","label":"仲巴县"},{"value":"542334","label":"亚东县"},{"value":"542335","label":"吉隆县"},{"value":"542336","label":"聂拉木县"},{"value":"542337","label":"萨嘎县"},{"value":"542338","label":"岗巴县"}]},{"value":"542400","label":"那曲地区","children":[{"value":"542421","label":"那曲县"},{"value":"542422","label":"嘉黎县"},{"value":"542423","label":"比如县"},{"value":"542424","label":"聂荣县"},{"value":"542425","label":"安多县"},{"value":"542426","label":"申扎县"},{"value":"542427","label":"索县"},{"value":"542428","label":"班戈县"},{"value":"542429","label":"巴青县"},{"value":"542430","label":"尼玛县"}]},{"value":"542500","label":"阿里地区","children":[{"value":"542521","label":"普兰县"},{"value":"542522","label":"札达县"},{"value":"542523","label":"噶尔县"},{"value":"542524","label":"日土县"},{"value":"542525","label":"革吉县"},{"value":"542526","label":"改则县"},{"value":"542527","label":"措勤县"}]},{"value":"542600","label":"林芝地区","children":[{"value":"542621","label":"林芝县"},{"value":"542622","label":"工布江达县"},{"value":"542623","label":"米林县"},{"value":"542624","label":"墨脱县"},{"value":"542625","label":"波密县"},{"value":"542626","label":"察隅县"},{"value":"542627","label":"朗县"}]}]},{"label":"陕西省","value":"610000","children":[{"value":"610100","label":"西安市","children":[{"value":"610102","label":"新城区"},{"value":"610103","label":"碑林区"},{"value":"610104","label":"莲湖区"},{"value":"610111","label":"灞桥区"},{"value":"610112","label":"未央区"},{"value":"610113","label":"雁塔区"},{"value":"610114","label":"阎良区"},{"value":"610115","label":"临潼区"},{"value":"610116","label":"长安区"},{"value":"610122","label":"蓝田县"},{"value":"610124","label":"周至县"},{"value":"610125","label":"户县"},{"value":"610126","label":"高陵县"}]},{"value":"610200","label":"铜川市","children":[{"value":"610202","label":"王益区"},{"value":"610203","label":"印台区"},{"value":"610204","label":"耀州区"},{"value":"610222","label":"宜君县"}]},{"value":"610300","label":"宝鸡市","children":[{"value":"610302","label":"渭滨区"},{"value":"610303","label":"金台区"},{"value":"610304","label":"陈仓区"},{"value":"610322","label":"凤翔县"},{"value":"610323","label":"岐山县"},{"value":"610324","label":"扶风县"},{"value":"610326","label":"眉县"},{"value":"610327","label":"陇县"},{"value":"610328","label":"千阳县"},{"value":"610329","label":"麟游县"},{"value":"610330","label":"凤县"},{"value":"610331","label":"太白县"}]},{"value":"610400","label":"咸阳市","children":[{"value":"610402","label":"秦都区"},{"value":"610403","label":"杨陵区"},{"value":"610404","label":"渭城区"},{"value":"610422","label":"三原县"},{"value":"610423","label":"泾阳县"},{"value":"610424","label":"乾县"},{"value":"610425","label":"礼泉县"},{"value":"610426","label":"永寿县"},{"value":"610427","label":"彬县"},{"value":"610428","label":"长武县"},{"value":"610429","label":"旬邑县"},{"value":"610430","label":"淳化县"},{"value":"610431","label":"武功县"},{"value":"610481","label":"兴平市"}]},{"value":"610500","label":"渭南市","children":[{"value":"610502","label":"临渭区"},{"value":"610521","label":"华县"},{"value":"610522","label":"潼关县"},{"value":"610523","label":"大荔县"},{"value":"610524","label":"合阳县"},{"value":"610525","label":"澄城县"},{"value":"610526","label":"蒲城县"},{"value":"610527","label":"白水县"},{"value":"610528","label":"富平县"},{"value":"610581","label":"韩城市"},{"value":"610582","label":"华阴市"}]},{"value":"610600","label":"延安市","children":[{"value":"610602","label":"宝塔区"},{"value":"610621","label":"延长县"},{"value":"610622","label":"延川县"},{"value":"610623","label":"子长县"},{"value":"610624","label":"安塞县"},{"value":"610625","label":"志丹县"},{"value":"610626","label":"吴起县"},{"value":"610627","label":"甘泉县"},{"value":"610628","label":"富县"},{"value":"610629","label":"洛川县"},{"value":"610630","label":"宜川县"},{"value":"610631","label":"黄龙县"},{"value":"610632","label":"黄陵县"}]},{"value":"610700","label":"汉中市","children":[{"value":"610702","label":"汉台区"},{"value":"610721","label":"南郑县"},{"value":"610722","label":"城固县"},{"value":"610723","label":"洋县"},{"value":"610724","label":"西乡县"},{"value":"610725","label":"勉县"},{"value":"610726","label":"宁强县"},{"value":"610727","label":"略阳县"},{"value":"610728","label":"镇巴县"},{"value":"610729","label":"留坝县"},{"value":"610730","label":"佛坪县"}]},{"value":"610800","label":"榆林市","children":[{"value":"610802","label":"榆阳区"},{"value":"610821","label":"神木县"},{"value":"610822","label":"府谷县"},{"value":"610823","label":"横山县"},{"value":"610824","label":"靖边县"},{"value":"610825","label":"定边县"},{"value":"610826","label":"绥德县"},{"value":"610827","label":"米脂县"},{"value":"610828","label":"佳县"},{"value":"610829","label":"吴堡县"},{"value":"610830","label":"清涧县"},{"value":"610831","label":"子洲县"}]},{"value":"610900","label":"安康市","children":[{"value":"610902","label":"汉滨区"},{"value":"610921","label":"汉阴县"},{"value":"610922","label":"石泉县"},{"value":"610923","label":"宁陕县"},{"value":"610924","label":"紫阳县"},{"value":"610925","label":"岚皋县"},{"value":"610926","label":"平利县"},{"value":"610927","label":"镇坪县"},{"value":"610928","label":"旬阳县"},{"value":"610929","label":"白河县"}]},{"value":"611000","label":"商洛市","children":[{"value":"611002","label":"商州区"},{"value":"611021","label":"洛南县"},{"value":"611022","label":"丹凤县"},{"value":"611023","label":"商南县"},{"value":"611024","label":"山阳县"},{"value":"611025","label":"镇安县"},{"value":"611026","label":"柞水县"}]}]},{"label":"甘肃省","value":"620000","children":[{"value":"620100","label":"兰州市","children":[{"value":"620102","label":"城关区"},{"value":"620103","label":"七里河区"},{"value":"620104","label":"西固区"},{"value":"620105","label":"安宁区"},{"value":"620111","label":"红古区"},{"value":"620121","label":"永登县"},{"value":"620122","label":"皋兰县"},{"value":"620123","label":"榆中县"}]},{"value":"620200","label":"嘉峪关市"},{"value":"620300","label":"金昌市","children":[{"value":"620302","label":"金川区"},{"value":"620321","label":"永昌县"}]},{"value":"620400","label":"白银市","children":[{"value":"620402","label":"白银区"},{"value":"620403","label":"平川区"},{"value":"620421","label":"靖远县"},{"value":"620422","label":"会宁县"},{"value":"620423","label":"景泰县"}]},{"value":"620500","label":"天水市","children":[{"value":"620502","label":"秦州区"},{"value":"620503","label":"麦积区"},{"value":"620521","label":"清水县"},{"value":"620522","label":"秦安县"},{"value":"620523","label":"甘谷县"},{"value":"620524","label":"武山县"},{"value":"620525","label":"张家川回族自治县"}]},{"value":"620600","label":"武威市","children":[{"value":"620602","label":"凉州区"},{"value":"620621","label":"民勤县"},{"value":"620622","label":"古浪县"},{"value":"620623","label":"天祝藏族自治县"}]},{"value":"620700","label":"张掖市","children":[{"value":"620702","label":"甘州区"},{"value":"620721","label":"肃南裕固族自治县"},{"value":"620722","label":"民乐县"},{"value":"620723","label":"临泽县"},{"value":"620724","label":"高台县"},{"value":"620725","label":"山丹县"}]},{"value":"620800","label":"平凉市","children":[{"value":"620802","label":"崆峒区"},{"value":"620821","label":"泾川县"},{"value":"620822","label":"灵台县"},{"value":"620823","label":"崇信县"},{"value":"620824","label":"华亭县"},{"value":"620825","label":"庄浪县"},{"value":"620826","label":"静宁县"}]},{"value":"620900","label":"酒泉市","children":[{"value":"620902","label":"肃州区"},{"value":"620921","label":"金塔县"},{"value":"620922","label":"安西县"},{"value":"620923","label":"肃北蒙古族自治县"},{"value":"620924","label":"阿克塞哈萨克族自治县"},{"value":"620981","label":"玉门市"},{"value":"620982","label":"敦煌市"}]},{"value":"621000","label":"庆阳市","children":[{"value":"621002","label":"西峰区"},{"value":"621021","label":"庆城县"},{"value":"621022","label":"环县"},{"value":"621023","label":"华池县"},{"value":"621024","label":"合水县"},{"value":"621025","label":"正宁县"},{"value":"621026","label":"宁县"},{"value":"621027","label":"镇原县"}]},{"value":"621100","label":"定西市","children":[{"value":"621102","label":"安定区"},{"value":"621121","label":"通渭县"},{"value":"621122","label":"陇西县"},{"value":"621123","label":"渭源县"},{"value":"621124","label":"临洮县"},{"value":"621125","label":"漳县"},{"value":"621126","label":"岷县"}]},{"value":"621200","label":"陇南市","children":[{"value":"621202","label":"武都区"},{"value":"621221","label":"成县"},{"value":"621222","label":"文县"},{"value":"621223","label":"宕昌县"},{"value":"621224","label":"康县"},{"value":"621225","label":"西和县"},{"value":"621226","label":"礼县"},{"value":"621227","label":"徽县"},{"value":"621228","label":"两当县"}]},{"value":"622900","label":"临夏回族自治州","children":[{"value":"622901","label":"临夏市"},{"value":"622921","label":"临夏县"},{"value":"622922","label":"康乐县"},{"value":"622923","label":"永靖县"},{"value":"622924","label":"广河县"},{"value":"622925","label":"和政县"},{"value":"622926","label":"东乡族自治县"},{"value":"622927","label":"积石山保安族东乡族撒拉族自治县"}]},{"value":"623000","label":"甘南藏族自治州","children":[{"value":"623001","label":"合作市"},{"value":"623021","label":"临潭县"},{"value":"623022","label":"卓尼县"},{"value":"623023","label":"舟曲县"},{"value":"623024","label":"迭部县"},{"value":"623025","label":"玛曲县"},{"value":"623026","label":"碌曲县"},{"value":"623027","label":"夏河县"}]}]},{"label":"青海省","value":"630000","children":[{"value":"630100","label":"西宁市","children":[{"value":"630102","label":"城东区"},{"value":"630103","label":"城中区"},{"value":"630104","label":"城西区"},{"value":"630105","label":"城北区"},{"value":"630121","label":"大通回族土族自治县"},{"value":"630122","label":"湟中县"},{"value":"630123","label":"湟源县"}]},{"value":"632100","label":"海东地区","children":[{"value":"632121","label":"平安县"},{"value":"632122","label":"民和回族土族自治县"},{"value":"632123","label":"乐都县"},{"value":"632126","label":"互助土族自治县"},{"value":"632127","label":"化隆回族自治县"},{"value":"632128","label":"循化撒拉族自治县"}]},{"value":"632200","label":"海北藏族自治州","children":[{"value":"632221","label":"门源回族自治县"},{"value":"632222","label":"祁连县"},{"value":"632223","label":"海晏县"},{"value":"632224","label":"刚察县"}]},{"value":"632300","label":"黄南藏族自治州","children":[{"value":"632321","label":"同仁县"},{"value":"632322","label":"尖扎县"},{"value":"632323","label":"泽库县"},{"value":"632324","label":"河南蒙古族自治县"}]},{"value":"632500","label":"海南藏族自治州","children":[{"value":"632521","label":"共和县"},{"value":"632522","label":"同德县"},{"value":"632523","label":"贵德县"},{"value":"632524","label":"兴海县"},{"value":"632525","label":"贵南县"}]},{"value":"632600","label":"果洛藏族自治州","children":[{"value":"632621","label":"玛沁县"},{"value":"632622","label":"班玛县"},{"value":"632623","label":"甘德县"},{"value":"632624","label":"达日县"},{"value":"632625","label":"久治县"},{"value":"632626","label":"玛多县"}]},{"value":"632700","label":"玉树藏族自治州","children":[{"value":"632721","label":"玉树县"},{"value":"632722","label":"杂多县"},{"value":"632723","label":"称多县"},{"value":"632724","label":"治多县"},{"value":"632725","label":"囊谦县"},{"value":"632726","label":"曲麻莱县"}]},{"value":"632800","label":"海西蒙古族藏族自治州","children":[{"value":"632801","label":"格尔木市"},{"value":"632802","label":"德令哈市"},{"value":"632821","label":"乌兰县"},{"value":"632822","label":"都兰县"},{"value":"632823","label":"天峻县"}]}]},{"label":"宁夏回族自治区","value":"640000","children":[{"value":"640100","label":"银川市","children":[{"value":"640104","label":"兴庆区"},{"value":"640105","label":"西夏区"},{"value":"640106","label":"金凤区"},{"value":"640121","label":"永宁县"},{"value":"640122","label":"贺兰县"},{"value":"640181","label":"灵武市"}]},{"value":"640200","label":"石嘴山市","children":[{"value":"640202","label":"大武口区"},{"value":"640205","label":"惠农区"},{"value":"640221","label":"平罗县"}]},{"value":"640300","label":"吴忠市","children":[{"value":"640302","label":"利通区"},{"value":"640303","label":"红寺堡区"},{"value":"640323","label":"盐池县"},{"value":"640324","label":"同心县"},{"value":"640381","label":"青铜峡市"}]},{"value":"640400","label":"固原市","children":[{"value":"640402","label":"原州区"},{"value":"640422","label":"西吉县"},{"value":"640423","label":"隆德县"},{"value":"640424","label":"泾源县"},{"value":"640425","label":"彭阳县"}]},{"value":"640500","label":"中卫市","children":[{"value":"640502","label":"沙坡头区"},{"value":"640521","label":"中宁县"},{"value":"640522","label":"海原县"}]}]},{"label":"新疆维吾尔自治区","value":"650000","children":[{"value":"650100","label":"乌鲁木齐市","children":[{"value":"650102","label":"天山区"},{"value":"650103","label":"沙依巴克区"},{"value":"650104","label":"新市区"},{"value":"650105","label":"水磨沟区"},{"value":"650106","label":"头屯河区"},{"value":"650107","label":"达坂城区"},{"value":"650108","label":"东山区"},{"value":"650109","label":"米东区"},{"value":"650121","label":"乌鲁木齐县"}]},{"value":"650200","label":"克拉玛依市","children":[{"value":"650202","label":"独山子区"},{"value":"650203","label":"克拉玛依区"},{"value":"650204","label":"白碱滩区"},{"value":"650205","label":"乌尔禾区"}]},{"value":"652100","label":"吐鲁番地区","children":[{"value":"652101","label":"吐鲁番市"},{"value":"652122","label":"鄯善县"},{"value":"652123","label":"托克逊县"}]},{"value":"652200","label":"哈密地区","children":[{"value":"652201","label":"哈密市"},{"value":"652222","label":"巴里坤哈萨克自治县"},{"value":"652223","label":"伊吾县"}]},{"value":"652300","label":"昌吉回族自治州","children":[{"value":"652301","label":"昌吉市"},{"value":"652302","label":"阜康市"},{"value":"652303","label":"米泉市"},{"value":"652323","label":"呼图壁县"},{"value":"652324","label":"玛纳斯县"},{"value":"652325","label":"奇台县"},{"value":"652327","label":"吉木萨尔县"},{"value":"652328","label":"木垒哈萨克自治县"}]},{"value":"652700","label":"博尔塔拉蒙古自治州","children":[{"value":"652701","label":"博乐市"},{"value":"652722","label":"精河县"},{"value":"652723","label":"温泉县"}]},{"value":"652800","label":"巴音郭楞蒙古自治州","children":[{"value":"652801","label":"库尔勒市"},{"value":"652822","label":"轮台县"},{"value":"652823","label":"尉犁县"},{"value":"652824","label":"若羌县"},{"value":"652825","label":"且末县"},{"value":"652826","label":"焉耆回族自治县"},{"value":"652827","label":"和静县"},{"value":"652828","label":"和硕县"},{"value":"652829","label":"博湖县"}]},{"value":"652900","label":"阿克苏地区","children":[{"value":"652901","label":"阿克苏市"},{"value":"652922","label":"温宿县"},{"value":"652923","label":"库车县"},{"value":"652924","label":"沙雅县"},{"value":"652925","label":"新和县"},{"value":"652926","label":"拜城县"},{"value":"652927","label":"乌什县"},{"value":"652928","label":"阿瓦提县"},{"value":"652929","label":"柯坪县"}]},{"value":"653000","label":"克孜勒苏柯尔克孜自治州","children":[{"value":"653001","label":"阿图什市"},{"value":"653022","label":"阿克陶县"},{"value":"653023","label":"阿合奇县"},{"value":"653024","label":"乌恰县"}]},{"value":"653100","label":"喀什地区","children":[{"value":"653101","label":"喀什市"},{"value":"653121","label":"疏附县"},{"value":"653122","label":"疏勒县"},{"value":"653123","label":"英吉沙县"},{"value":"653124","label":"泽普县"},{"value":"653125","label":"莎车县"},{"value":"653126","label":"叶城县"},{"value":"653127","label":"麦盖提县"},{"value":"653128","label":"岳普湖县"},{"value":"653129","label":"伽师县"},{"value":"653130","label":"巴楚县"},{"value":"653131","label":"塔什库尔干塔吉克自治县"}]},{"value":"653200","label":"和田地区","children":[{"value":"653201","label":"和田市"},{"value":"653221","label":"和田县"},{"value":"653222","label":"墨玉县"},{"value":"653223","label":"皮山县"},{"value":"653224","label":"洛浦县"},{"value":"653225","label":"策勒县"},{"value":"653226","label":"于田县"},{"value":"653227","label":"民丰县"}]},{"value":"654000","label":"伊犁哈萨克自治州","children":[{"value":"654002","label":"伊宁市"},{"value":"654003","label":"奎屯市"},{"value":"654021","label":"伊宁县"},{"value":"654022","label":"察布查尔锡伯自治县"},{"value":"654023","label":"霍城县"},{"value":"654024","label":"巩留县"},{"value":"654025","label":"新源县"},{"value":"654026","label":"昭苏县"},{"value":"654027","label":"特克斯县"},{"value":"654028","label":"尼勒克县"}]},{"value":"654200","label":"塔城地区","children":[{"value":"654201","label":"塔城市"},{"value":"654202","label":"乌苏市"},{"value":"654221","label":"额敏县"},{"value":"654223","label":"沙湾县"},{"value":"654224","label":"托里县"},{"value":"654225","label":"裕民县"},{"value":"654226","label":"和布克赛尔蒙古自治县"}]},{"value":"654300","label":"阿勒泰地区","children":[{"value":"654301","label":"阿勒泰市"},{"value":"654321","label":"布尔津县"},{"value":"654322","label":"富蕴县"},{"value":"654323","label":"福海县"},{"value":"654324","label":"哈巴河县"},{"value":"654325","label":"青河县"},{"value":"654326","label":"吉木乃县"}]},{"value":"659001","label":"石河子市"},{"value":"659002","label":"阿拉尔市"},{"value":"659003","label":"图木舒克市"},{"value":"659004","label":"五家渠市"}]},{"label":"台湾省","value":"710000","children":[{"value":"710100","label":"台北市","children":[{"value":"710101","label":"中正区"},{"value":"710102","label":"大同区"},{"value":"710103","label":"中山区"},{"value":"710104","label":"松山区"},{"value":"710105","label":"大安区"},{"value":"710106","label":"万华区"},{"value":"710107","label":"信义区"},{"value":"710108","label":"士林区"},{"value":"710109","label":"北投区"},{"value":"710110","label":"内湖区"},{"value":"710111","label":"南港区"},{"value":"710112","label":"文山区"}]},{"value":"710200","label":"高雄市","children":[{"value":"710201","label":"新兴区"},{"value":"710202","label":"前金区"},{"value":"710203","label":"芩雅区"},{"value":"710204","label":"盐埕区"},{"value":"710205","label":"鼓山区"},{"value":"710206","label":"旗津区"},{"value":"710207","label":"前镇区"},{"value":"710208","label":"三民区"},{"value":"710209","label":"左营区"},{"value":"710210","label":"楠梓区"},{"value":"710211","label":"小港区"}]},{"value":"710300","label":"台南市","children":[{"value":"710301","label":"中西区"},{"value":"710302","label":"东区"},{"value":"710303","label":"南区"},{"value":"710304","label":"北区"},{"value":"710305","label":"安平区"},{"value":"710306","label":"安南区"}]},{"value":"710400","label":"台中市","children":[{"value":"710401","label":"中区"},{"value":"710402","label":"东区"},{"value":"710403","label":"南区"},{"value":"710404","label":"西区"},{"value":"710405","label":"北区"},{"value":"710406","label":"北屯区"},{"value":"710407","label":"西屯区"},{"value":"710408","label":"南屯区"}]},{"value":"710500","label":"金门县"},{"value":"710600","label":"南投县"},{"value":"710700","label":"基隆市","children":[{"value":"710701","label":"仁爱区"},{"value":"710702","label":"信义区"},{"value":"710703","label":"中正区"},{"value":"710704","label":"中山区"},{"value":"710705","label":"安乐区"},{"value":"710706","label":"暖暖区"},{"value":"710707","label":"七堵区"}]},{"value":"710800","label":"新竹市","children":[{"value":"710801","label":"东区"},{"value":"710802","label":"北区"},{"value":"710803","label":"香山区"}]},{"value":"710900","label":"嘉义市","children":[{"value":"710901","label":"东区"},{"value":"710902","label":"西区"}]},{"value":"711100","label":"新北市"},{"value":"711200","label":"宜兰县"},{"value":"711300","label":"新竹县"},{"value":"711400","label":"桃园县"},{"value":"711500","label":"苗栗县"},{"value":"711700","label":"彰化县"},{"value":"711900","label":"嘉义县"},{"value":"712100","label":"云林县"},{"value":"712400","label":"屏东县"},{"value":"712500","label":"台东县"},{"value":"712600","label":"花莲县"},{"value":"712700","label":"澎湖县"}]},{"label":"香港特别行政区","value":"810000","children":[{"value":"810100","label":"香港岛","children":[{"value":"810101","label":"中西区"},{"value":"810102","label":"湾仔"},{"value":"810103","label":"东区"},{"value":"810104","label":"南区"}]},{"value":"810200","label":"九龙","children":[{"value":"810201","label":"九龙城区"},{"value":"810202","label":"油尖旺区"},{"value":"810203","label":"深水埗区"},{"value":"810204","label":"黄大仙区"},{"value":"810205","label":"观塘区"}]},{"value":"810300","label":"新界","children":[{"value":"810301","label":"北区"},{"value":"810302","label":"大埔区"},{"value":"810303","label":"沙田区"},{"value":"810304","label":"西贡区"},{"value":"810305","label":"元朗区"},{"value":"810306","label":"屯门区"},{"value":"810307","label":"荃湾区"},{"value":"810308","label":"葵青区"},{"value":"810309","label":"离岛区"}]}]},{"label":"澳门特别行政区","value":"820000","children":[{"value":"820100","label":"澳门半岛"},{"value":"820200","label":"离岛"}]},{"label":"海外","value":"990000","children":[{"value":"990100","label":"海外"}]}] diff --git a/src_bak/api/layout/index.ts b/src_bak/api/layout/index.ts new file mode 100644 index 0000000..8ee8b60 --- /dev/null +++ b/src_bak/api/layout/index.ts @@ -0,0 +1,116 @@ +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 new file mode 100644 index 0000000..a3edbc1 --- /dev/null +++ b/src_bak/api/layout/model/index.ts @@ -0,0 +1,29 @@ + +/** + * 首页布局样式 + */ +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 new file mode 100644 index 0000000..0104c73 --- /dev/null +++ b/src_bak/api/passport/login/index.ts @@ -0,0 +1,68 @@ +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 new file mode 100644 index 0000000..abdd71d --- /dev/null +++ b/src_bak/api/passport/login/model/index.ts @@ -0,0 +1,52 @@ +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 new file mode 100644 index 0000000..bc4c85c --- /dev/null +++ b/src_bak/api/passport/qr-login/index.ts @@ -0,0 +1,244 @@ +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 new file mode 100644 index 0000000..db90974 --- /dev/null +++ b/src_bak/api/shop/shopActivity/index.ts @@ -0,0 +1,110 @@ +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 new file mode 100644 index 0000000..b67d7de --- /dev/null +++ b/src_bak/api/shop/shopActivity/model/index.ts @@ -0,0 +1,89 @@ +/** + * 活动模型 + */ + +// 活动类型(前端语义化) +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 new file mode 100644 index 0000000..2820d18 --- /dev/null +++ b/src_bak/api/shop/shopAfterSale/index.ts @@ -0,0 +1,154 @@ +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 new file mode 100644 index 0000000..68fb5c5 --- /dev/null +++ b/src_bak/api/shop/shopArticle/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..18e7b58 --- /dev/null +++ b/src_bak/api/shop/shopArticle/model/index.ts @@ -0,0 +1,123 @@ +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 new file mode 100644 index 0000000..2c003e5 --- /dev/null +++ b/src_bak/api/shop/shopBooking/index.ts @@ -0,0 +1,121 @@ +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 new file mode 100644 index 0000000..79d5be4 --- /dev/null +++ b/src_bak/api/shop/shopBooking/model/index.ts @@ -0,0 +1,53 @@ +/** + * 预约订单模型 + */ + +// 预约状态 +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 new file mode 100644 index 0000000..16ac413 --- /dev/null +++ b/src_bak/api/shop/shopCart/index.ts @@ -0,0 +1,153 @@ +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 new file mode 100644 index 0000000..b8ed1ad --- /dev/null +++ b/src_bak/api/shop/shopCart/model/index.ts @@ -0,0 +1,74 @@ +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 new file mode 100644 index 0000000..6a5ba5b --- /dev/null +++ b/src_bak/api/shop/shopChatConversation/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..ea6a9b3 --- /dev/null +++ b/src_bak/api/shop/shopChatConversation/model/index.ts @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..4667ce7 --- /dev/null +++ b/src_bak/api/shop/shopChatMessage/index.ts @@ -0,0 +1,115 @@ +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 new file mode 100644 index 0000000..411d45c --- /dev/null +++ b/src_bak/api/shop/shopChatMessage/model/index.ts @@ -0,0 +1,63 @@ +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 new file mode 100644 index 0000000..350851a --- /dev/null +++ b/src_bak/api/shop/shopCommissionRecord.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..07a2b6c --- /dev/null +++ b/src_bak/api/shop/shopCommissionRole/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..2881941 --- /dev/null +++ b/src_bak/api/shop/shopCommissionRole/model/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..be92c82 --- /dev/null +++ b/src_bak/api/shop/shopCoupon/index.ts @@ -0,0 +1,115 @@ +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 new file mode 100644 index 0000000..9fb4401 --- /dev/null +++ b/src_bak/api/shop/shopCoupon/model/index.ts @@ -0,0 +1,97 @@ +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 new file mode 100644 index 0000000..251739f --- /dev/null +++ b/src_bak/api/shop/shopCustomerService/index.ts @@ -0,0 +1,17 @@ +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 new file mode 100644 index 0000000..9a3f2a3 --- /dev/null +++ b/src_bak/api/shop/shopCustomerService/model.ts @@ -0,0 +1,26 @@ +/** 客服消息 */ +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 new file mode 100644 index 0000000..c974214 --- /dev/null +++ b/src_bak/api/shop/shopDealerApply/index.ts @@ -0,0 +1,155 @@ +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 new file mode 100644 index 0000000..8ea27cc --- /dev/null +++ b/src_bak/api/shop/shopDealerApply/model/index.ts @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..4c4b112 --- /dev/null +++ b/src_bak/api/shop/shopDealerCapital/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..ad4b293 --- /dev/null +++ b/src_bak/api/shop/shopDealerCapital/model.ts @@ -0,0 +1,109 @@ +/** + * 分销商资金明细表 + */ +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 new file mode 100644 index 0000000..00d29a7 --- /dev/null +++ b/src_bak/api/shop/shopDealerCapital/model/index.ts @@ -0,0 +1,41 @@ +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 new file mode 100644 index 0000000..d29f0d8 --- /dev/null +++ b/src_bak/api/shop/shopDealerOrder/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..03c9512 --- /dev/null +++ b/src_bak/api/shop/shopDealerOrder/model/index.ts @@ -0,0 +1,60 @@ +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 new file mode 100644 index 0000000..949794f --- /dev/null +++ b/src_bak/api/shop/shopDealerReferee/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..044a77d --- /dev/null +++ b/src_bak/api/shop/shopDealerReferee/model/index.ts @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..b6b457b --- /dev/null +++ b/src_bak/api/shop/shopDealerSetting/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..12126c3 --- /dev/null +++ b/src_bak/api/shop/shopDealerSetting/model/index.ts @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..df82b27 --- /dev/null +++ b/src_bak/api/shop/shopDealerUser/index.ts @@ -0,0 +1,103 @@ +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 new file mode 100644 index 0000000..beda51c --- /dev/null +++ b/src_bak/api/shop/shopDealerUser/model/index.ts @@ -0,0 +1,53 @@ +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 new file mode 100644 index 0000000..398b9be --- /dev/null +++ b/src_bak/api/shop/shopDealerWithdraw/index.ts @@ -0,0 +1,145 @@ +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 new file mode 100644 index 0000000..d53db44 --- /dev/null +++ b/src_bak/api/shop/shopDealerWithdraw/model/index.ts @@ -0,0 +1,48 @@ +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 new file mode 100644 index 0000000..b46e13a --- /dev/null +++ b/src_bak/api/shop/shopEvaluation/index.ts @@ -0,0 +1,119 @@ +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 new file mode 100644 index 0000000..d74b52e --- /dev/null +++ b/src_bak/api/shop/shopEvaluation/model/index.ts @@ -0,0 +1,77 @@ +/** + * 商品评价模型 + */ + +// 评价维度 +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 new file mode 100644 index 0000000..237fe7b --- /dev/null +++ b/src_bak/api/shop/shopEvent/index.ts @@ -0,0 +1,80 @@ +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 new file mode 100644 index 0000000..bfde609 --- /dev/null +++ b/src_bak/api/shop/shopEvent/model/index.ts @@ -0,0 +1,96 @@ +/** + * 赛事模型 + */ + +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 new file mode 100644 index 0000000..abfcf46 --- /dev/null +++ b/src_bak/api/shop/shopExpress/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..378a652 --- /dev/null +++ b/src_bak/api/shop/shopExpress/model/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..b056f1f --- /dev/null +++ b/src_bak/api/shop/shopExpressTemplate/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..5700987 --- /dev/null +++ b/src_bak/api/shop/shopExpressTemplate/model/index.ts @@ -0,0 +1,41 @@ +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 new file mode 100644 index 0000000..783a53e --- /dev/null +++ b/src_bak/api/shop/shopExpressTemplateDetail/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..84e2dc8 --- /dev/null +++ b/src_bak/api/shop/shopExpressTemplateDetail/model/index.ts @@ -0,0 +1,45 @@ +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 new file mode 100644 index 0000000..9afda93 --- /dev/null +++ b/src_bak/api/shop/shopGift/index.ts @@ -0,0 +1,260 @@ +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 new file mode 100644 index 0000000..f3c7450 --- /dev/null +++ b/src_bak/api/shop/shopGift/model/index.ts @@ -0,0 +1,127 @@ +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 new file mode 100644 index 0000000..8136bb5 --- /dev/null +++ b/src_bak/api/shop/shopGiftCard/index.ts @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..f16c42e --- /dev/null +++ b/src_bak/api/shop/shopGiftCard/model.ts @@ -0,0 +1,29 @@ +/** 礼品卡 */ +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 new file mode 100644 index 0000000..9b3a3a9 --- /dev/null +++ b/src_bak/api/shop/shopGoods/index.ts @@ -0,0 +1,112 @@ +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 new file mode 100644 index 0000000..fe12790 --- /dev/null +++ b/src_bak/api/shop/shopGoods/model/index.ts @@ -0,0 +1,158 @@ +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 new file mode 100644 index 0000000..3df88c0 --- /dev/null +++ b/src_bak/api/shop/shopGoodsCategory/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..c56c8b1 --- /dev/null +++ b/src_bak/api/shop/shopGoodsCategory/model/index.ts @@ -0,0 +1,64 @@ +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 new file mode 100644 index 0000000..2f29fb6 --- /dev/null +++ b/src_bak/api/shop/shopGoodsComment/index.ts @@ -0,0 +1,69 @@ +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 new file mode 100644 index 0000000..f0e4d00 --- /dev/null +++ b/src_bak/api/shop/shopGoodsComment/model.ts @@ -0,0 +1,77 @@ +/** 商品评价 - 对接 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 new file mode 100644 index 0000000..3c73131 --- /dev/null +++ b/src_bak/api/shop/shopGoodsEvaluate/index.ts @@ -0,0 +1,22 @@ +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 new file mode 100644 index 0000000..5846ae9 --- /dev/null +++ b/src_bak/api/shop/shopGoodsEvaluate/model.ts @@ -0,0 +1,39 @@ +/** 商品评价 */ +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 new file mode 100644 index 0000000..fbb77b9 --- /dev/null +++ b/src_bak/api/shop/shopGoodsFavorite/index.ts @@ -0,0 +1,44 @@ +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 new file mode 100644 index 0000000..2a89dac --- /dev/null +++ b/src_bak/api/shop/shopGoodsFavorite/model.ts @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..c047baf --- /dev/null +++ b/src_bak/api/shop/shopGoodsRoleCommission/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..6db1178 --- /dev/null +++ b/src_bak/api/shop/shopGoodsRoleCommission/model/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..8458fcb --- /dev/null +++ b/src_bak/api/shop/shopGoodsSku/index.ts @@ -0,0 +1,113 @@ +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 new file mode 100644 index 0000000..0880d7f --- /dev/null +++ b/src_bak/api/shop/shopGoodsSku/model/index.ts @@ -0,0 +1,50 @@ +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 new file mode 100644 index 0000000..5dde057 --- /dev/null +++ b/src_bak/api/shop/shopGoodsSpec/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..44a6644 --- /dev/null +++ b/src_bak/api/shop/shopGoodsSpec/model/index.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..a7be827 --- /dev/null +++ b/src_bak/api/shop/shopGroupBuy/index.ts @@ -0,0 +1,36 @@ +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 new file mode 100644 index 0000000..162af4a --- /dev/null +++ b/src_bak/api/shop/shopGroupBuy/model.ts @@ -0,0 +1,61 @@ +/** 拼团活动 */ +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 new file mode 100644 index 0000000..ba38f75 --- /dev/null +++ b/src_bak/api/shop/shopInvite/index.ts @@ -0,0 +1,278 @@ +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 new file mode 100644 index 0000000..11aada9 --- /dev/null +++ b/src_bak/api/shop/shopInvite/model/index.ts @@ -0,0 +1,279 @@ +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 new file mode 100644 index 0000000..f2509c5 --- /dev/null +++ b/src_bak/api/shop/shopInvoiceTitle/index.ts @@ -0,0 +1,166 @@ +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 new file mode 100644 index 0000000..88330bf --- /dev/null +++ b/src_bak/api/shop/shopInvoiceTitle/model.ts @@ -0,0 +1,155 @@ +/** + * 发票抬头表 + */ +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 new file mode 100644 index 0000000..97ccd93 --- /dev/null +++ b/src_bak/api/shop/shopLogistics/index.ts @@ -0,0 +1,258 @@ +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 new file mode 100644 index 0000000..83ce19d --- /dev/null +++ b/src_bak/api/shop/shopMemberBenefit.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..66c4793 --- /dev/null +++ b/src_bak/api/shop/shopMemberCenter.ts @@ -0,0 +1,113 @@ +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 new file mode 100644 index 0000000..299449f --- /dev/null +++ b/src_bak/api/shop/shopMemberRegister.ts @@ -0,0 +1,108 @@ +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 new file mode 100644 index 0000000..6a855bf --- /dev/null +++ b/src_bak/api/shop/shopMerchant/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..4074c0d --- /dev/null +++ b/src_bak/api/shop/shopMerchant/model/index.ts @@ -0,0 +1,95 @@ +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 new file mode 100644 index 0000000..eaa94f2 --- /dev/null +++ b/src_bak/api/shop/shopMerchantAccount/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..8dc79db --- /dev/null +++ b/src_bak/api/shop/shopMerchantAccount/model/index.ts @@ -0,0 +1,39 @@ +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 new file mode 100644 index 0000000..151f6aa --- /dev/null +++ b/src_bak/api/shop/shopMerchantApply/index.ts @@ -0,0 +1,115 @@ +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 new file mode 100644 index 0000000..ba14a2e --- /dev/null +++ b/src_bak/api/shop/shopMerchantApply/model/index.ts @@ -0,0 +1,72 @@ +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 new file mode 100644 index 0000000..feef797 --- /dev/null +++ b/src_bak/api/shop/shopMerchantCount/index.ts @@ -0,0 +1,103 @@ +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 new file mode 100644 index 0000000..cc136f3 --- /dev/null +++ b/src_bak/api/shop/shopMerchantCount/model/index.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..4bf8b4e --- /dev/null +++ b/src_bak/api/shop/shopMerchantType/index.ts @@ -0,0 +1,103 @@ +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 new file mode 100644 index 0000000..522d081 --- /dev/null +++ b/src_bak/api/shop/shopMerchantType/model/index.ts @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..f8c4d8f --- /dev/null +++ b/src_bak/api/shop/shopMessage/index.ts @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..65f40cb --- /dev/null +++ b/src_bak/api/shop/shopMessage/model/index.ts @@ -0,0 +1,20 @@ +/** 消息类型 */ +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 new file mode 100644 index 0000000..d4a1eee --- /dev/null +++ b/src_bak/api/shop/shopNotification/index.ts @@ -0,0 +1,140 @@ +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 new file mode 100644 index 0000000..ce330d7 --- /dev/null +++ b/src_bak/api/shop/shopNotification/model/index.ts @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..95fdd26 --- /dev/null +++ b/src_bak/api/shop/shopOrder/index.ts @@ -0,0 +1,194 @@ +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 new file mode 100644 index 0000000..2b8d177 --- /dev/null +++ b/src_bak/api/shop/shopOrder/model/index.ts @@ -0,0 +1,231 @@ +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 new file mode 100644 index 0000000..e12d634 --- /dev/null +++ b/src_bak/api/shop/shopOrderGoods/index.ts @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..a4034de --- /dev/null +++ b/src_bak/api/shop/shopOrderGoods/model/index.ts @@ -0,0 +1,70 @@ +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 new file mode 100644 index 0000000..c36b12b --- /dev/null +++ b/src_bak/api/shop/shopOrderRefund/index.ts @@ -0,0 +1,52 @@ +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 new file mode 100644 index 0000000..ece68f6 --- /dev/null +++ b/src_bak/api/shop/shopPointsOrder/index.ts @@ -0,0 +1,66 @@ +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 new file mode 100644 index 0000000..c556be9 --- /dev/null +++ b/src_bak/api/shop/shopPointsOrder/model/index.ts @@ -0,0 +1,62 @@ +/** 积分订单状态 */ +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 new file mode 100644 index 0000000..a9053b6 --- /dev/null +++ b/src_bak/api/shop/shopPointsProduct/index.ts @@ -0,0 +1,44 @@ +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 new file mode 100644 index 0000000..d027ad1 --- /dev/null +++ b/src_bak/api/shop/shopPointsProduct/model/index.ts @@ -0,0 +1,51 @@ +/** + * 积分兑换商品表 + */ +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 new file mode 100644 index 0000000..d9be40c --- /dev/null +++ b/src_bak/api/shop/shopRecharge/index.ts @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..b17aa40 --- /dev/null +++ b/src_bak/api/shop/shopRecharge/model/index.ts @@ -0,0 +1,17 @@ +/** + * 用户充值类型定义 + */ + +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 new file mode 100644 index 0000000..04d86d8 --- /dev/null +++ b/src_bak/api/shop/shopRechargeCode/index.ts @@ -0,0 +1,48 @@ +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 new file mode 100644 index 0000000..b8aa00a --- /dev/null +++ b/src_bak/api/shop/shopRechargeCode/model/index.ts @@ -0,0 +1,28 @@ +/** + * 充值兑换码类型定义 + */ + +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 new file mode 100644 index 0000000..b479610 --- /dev/null +++ b/src_bak/api/shop/shopRechargeOrder.ts @@ -0,0 +1,40 @@ +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 new file mode 100644 index 0000000..ccf4140 --- /dev/null +++ b/src_bak/api/shop/shopSeckill/index.ts @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..5ee0b05 --- /dev/null +++ b/src_bak/api/shop/shopSeckill/model.ts @@ -0,0 +1,48 @@ +/** 秒杀活动 */ +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 new file mode 100644 index 0000000..92a3ffb --- /dev/null +++ b/src_bak/api/shop/shopSetting/index.ts @@ -0,0 +1,138 @@ +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 new file mode 100644 index 0000000..e476bac --- /dev/null +++ b/src_bak/api/shop/shopSetting/model/index.ts @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..73f9d43 --- /dev/null +++ b/src_bak/api/shop/shopSigninConfig/index.ts @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..07de101 --- /dev/null +++ b/src_bak/api/shop/shopSigninConfig/model/index.ts @@ -0,0 +1,29 @@ +/** + * 签到积分配置表 + */ +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 new file mode 100644 index 0000000..0f0d359 --- /dev/null +++ b/src_bak/api/shop/shopSigninRecord/index.ts @@ -0,0 +1,58 @@ +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 new file mode 100644 index 0000000..343df1f --- /dev/null +++ b/src_bak/api/shop/shopSigninRecord/model/index.ts @@ -0,0 +1,33 @@ +/** + * 签到记录表 + */ +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 new file mode 100644 index 0000000..a4d9b29 --- /dev/null +++ b/src_bak/api/shop/shopSpec/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..b85d062 --- /dev/null +++ b/src_bak/api/shop/shopSpec/model/index.ts @@ -0,0 +1,38 @@ +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 new file mode 100644 index 0000000..a765b28 --- /dev/null +++ b/src_bak/api/shop/shopSpecValue/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..8980f3b --- /dev/null +++ b/src_bak/api/shop/shopSpecValue/model/index.ts @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..7a9915e --- /dev/null +++ b/src_bak/api/shop/shopStore/index.ts @@ -0,0 +1,130 @@ +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 new file mode 100644 index 0000000..1c9e689 --- /dev/null +++ b/src_bak/api/shop/shopStore/model/index.ts @@ -0,0 +1,81 @@ +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 new file mode 100644 index 0000000..609defa --- /dev/null +++ b/src_bak/api/shop/shopStoreFence/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..99c20dd --- /dev/null +++ b/src_bak/api/shop/shopStoreFence/model/index.ts @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..c411aef --- /dev/null +++ b/src_bak/api/shop/shopStoreRider/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..0b7ed68 --- /dev/null +++ b/src_bak/api/shop/shopStoreRider/model/index.ts @@ -0,0 +1,71 @@ +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 new file mode 100644 index 0000000..df33349 --- /dev/null +++ b/src_bak/api/shop/shopStoreUser/index.ts @@ -0,0 +1,116 @@ +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 new file mode 100644 index 0000000..46151f5 --- /dev/null +++ b/src_bak/api/shop/shopStoreUser/model/index.ts @@ -0,0 +1,36 @@ +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 new file mode 100644 index 0000000..898e7b9 --- /dev/null +++ b/src_bak/api/shop/shopStoreWarehouse/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..90d5d84 --- /dev/null +++ b/src_bak/api/shop/shopStoreWarehouse/model/index.ts @@ -0,0 +1,53 @@ +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 new file mode 100644 index 0000000..b33a2f2 --- /dev/null +++ b/src_bak/api/shop/shopUserAddress.ts @@ -0,0 +1,75 @@ +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 new file mode 100644 index 0000000..35d7b45 --- /dev/null +++ b/src_bak/api/shop/shopUserAddress/index.ts @@ -0,0 +1,132 @@ +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 new file mode 100644 index 0000000..85696b9 --- /dev/null +++ b/src_bak/api/shop/shopUserAddress/model/index.ts @@ -0,0 +1,53 @@ +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 new file mode 100644 index 0000000..254d12e --- /dev/null +++ b/src_bak/api/shop/shopUserCard/index.ts @@ -0,0 +1,57 @@ +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 new file mode 100644 index 0000000..3cc0554 --- /dev/null +++ b/src_bak/api/shop/shopUserCard/model/index.ts @@ -0,0 +1,17 @@ +/** + * 用户卡片统计类型定义 + */ + +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 new file mode 100644 index 0000000..0aa346a --- /dev/null +++ b/src_bak/api/shop/shopUserCoupon/index.ts @@ -0,0 +1,155 @@ +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 new file mode 100644 index 0000000..f0f77e3 --- /dev/null +++ b/src_bak/api/shop/shopUserCoupon/model/index.ts @@ -0,0 +1,84 @@ +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 new file mode 100644 index 0000000..5f7cc55 --- /dev/null +++ b/src_bak/api/shop/shopUserReferee/index.ts @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..910692c --- /dev/null +++ b/src_bak/api/shop/shopUserReferee/model/index.ts @@ -0,0 +1,33 @@ +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 new file mode 100644 index 0000000..0426731 --- /dev/null +++ b/src_bak/api/shop/shopWithdrawRecord.ts @@ -0,0 +1,50 @@ +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 new file mode 100644 index 0000000..a2863a3 --- /dev/null +++ b/src_bak/api/system/access-key/index.ts @@ -0,0 +1,59 @@ +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 new file mode 100644 index 0000000..376b577 --- /dev/null +++ b/src_bak/api/system/access-key/model/index.ts @@ -0,0 +1,20 @@ +/** + * AccessKey + */ +export interface AccessKey { + id?: number; + phone?: string; + accessKey?: string; + accessSecret?: string; + createTime?: string; + tenantId?: number; + code?: number; +} + +/** + * AccessKey搜索条件 + */ +export interface AccessKeyParam { + id?: number; + accessKey?: string; +} diff --git a/src_bak/api/system/appstore/index.ts b/src_bak/api/system/appstore/index.ts new file mode 100644 index 0000000..4acad48 --- /dev/null +++ b/src_bak/api/system/appstore/index.ts @@ -0,0 +1,11 @@ +// json数据 +export function appstoreType() { + return [ + { value: '0', label: '全部', text: '全部', comments: '' }, + { value: '1', label: '系统管理', text: '系统管理', comments: '' }, + { value: '2', label: '内容管理', text: '内容管理', comments: '' }, + { value: '3', label: '第三方应用', text: '第三方应用', comments: '' }, + { value: '4', label: '办公协同', text: '办公协同', comments: '' }, + { value: '5', label: '商城模块', text: '商城模块', comments: '' } + ]; +} diff --git a/src_bak/api/system/appstore/model/index.ts b/src_bak/api/system/appstore/model/index.ts new file mode 100644 index 0000000..c3c9c45 --- /dev/null +++ b/src_bak/api/system/appstore/model/index.ts @@ -0,0 +1,13 @@ +/** + * 消息 + */ +export interface Appstore { + // 消息id + id?: number; + // 标题 + title?: string; + // 时间 + time?: string; + // 状态 + status?: number; +} diff --git a/src_bak/api/system/cache/index.ts b/src_bak/api/system/cache/index.ts new file mode 100644 index 0000000..0fd5813 --- /dev/null +++ b/src_bak/api/system/cache/index.ts @@ -0,0 +1,76 @@ +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 new file mode 100644 index 0000000..dc28d00 --- /dev/null +++ b/src_bak/api/system/cache/model/index.ts @@ -0,0 +1,18 @@ +import type { PageParam } from '@/api'; + +/** + * 缓存管理 + */ +export interface Cache { + key?: string; + content?: string; + uploadMethod?: any; + expireTime?: number; // 过期时间(秒) +} + +/** + * 搜索条件 + */ +export interface CacheParam extends PageParam { + key?: string; +} diff --git a/src_bak/api/system/chat/index.ts b/src_bak/api/system/chat/index.ts new file mode 100644 index 0000000..e7b9e79 --- /dev/null +++ b/src_bak/api/system/chat/index.ts @@ -0,0 +1,157 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { + ChatConversation, + ChatConversationParam, + ChatMessage, + ChatMessageParam +} from '@/api/system/chat/model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..5ead20e --- /dev/null +++ b/src_bak/api/system/chat/model/index.ts @@ -0,0 +1,49 @@ +import type { PageParam } from '@/api'; +import type { User } from '@/api/system/user/model'; + +export interface ChatConversation { + id?: number; + userId?: number; + friendId?: number; + userInfo?: User; + friendInfo?: User; + content: string; + messages: ChatMessage[]; + unRead: number; + createTime?: string; + updateTime: string | number | Date; +} + +export interface ChatMessage { + id?: number; + formUserId?: number; + formUserInfo?: User; + toUserInfo?: User; + toUserId?: number; + type: string; + content: string; + status?: number; + createTime?: number; + updateTime?: number; +} + +/** + * 搜索条件 + */ +export interface ChatConversationParam extends PageParam { + userId?: number; + status: number; + onlyFake: boolean; + keywords: string; +} + +/** + * 搜索条件 + */ +export interface ChatMessageParam extends PageParam { + formUserId?: number; + toUserId?: number; + type?: string; + status?: number; + keywords: string; +} diff --git a/src_bak/api/system/chatConversation/index.ts b/src_bak/api/system/chatConversation/index.ts new file mode 100644 index 0000000..2b75eec --- /dev/null +++ b/src_bak/api/system/chatConversation/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ChatConversation, ChatConversationParam } from './model'; + + +/** + * 分页查询聊天消息表 + */ +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 new file mode 100644 index 0000000..110806d --- /dev/null +++ b/src_bak/api/system/chatConversation/model/index.ts @@ -0,0 +1,37 @@ +import type { PageParam } from '@/api'; + +/** + * 聊天消息表 + */ +export interface ChatConversation { + // 自增ID + id?: number; + // 用户ID + userId?: number; + // 好友ID + friendId?: number; + // 消息类型 + type?: number; + // 消息内容 + content?: string; + // 未读消息 + unRead?: number; + // 状态, 0未读, 1已读 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 聊天消息表搜索条件 + */ +export interface ChatConversationParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/chatMessage/index.ts b/src_bak/api/system/chatMessage/index.ts new file mode 100644 index 0000000..5526ebf --- /dev/null +++ b/src_bak/api/system/chatMessage/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { ChatMessage, ChatMessageParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..4352a3f --- /dev/null +++ b/src_bak/api/system/chatMessage/model/index.ts @@ -0,0 +1,49 @@ +import type { PageParam } from '@/api'; + +/** + * 聊天消息表 + */ +export interface ChatMessage { + // 自增ID + id?: number; + // 发送人ID + formUserId?: number; + // 接收人ID + toUserId?: number; + // 消息类型 + type?: string; + // 消息内容 + content?: string; + // 屏蔽接收方 + sideTo?: number; + // 屏蔽发送方 + sideFrom?: number; + // 是否撤回 + withdraw?: number; + // 文件信息 + fileInfo?: string; + toUserName?: any; + formUserName?: string; + // 批量发送 + toUserIds?: any[]; + // 存在联系方式 + hasContact?: number; + // 状态, 0未读, 1已读 + status?: number; + // 是否删除, 0否, 1是 + deleted?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; + // 修改时间 + updateTime?: string; +} + +/** + * 聊天消息表搜索条件 + */ +export interface ChatMessageParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/company/index.ts b/src_bak/api/system/company/index.ts new file mode 100644 index 0000000..56738c2 --- /dev/null +++ b/src_bak/api/system/company/index.ts @@ -0,0 +1,161 @@ +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 new file mode 100644 index 0000000..c804858 --- /dev/null +++ b/src_bak/api/system/company/model/index.ts @@ -0,0 +1,120 @@ +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 new file mode 100644 index 0000000..5b2cf41 --- /dev/null +++ b/src_bak/api/system/companyComment/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type {ApiResult, PageResult} from '@/api'; +import type {CompanyComment, CompanyCommentParam} from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..45d4b6c --- /dev/null +++ b/src_bak/api/system/companyComment/model/index.ts @@ -0,0 +1,43 @@ +import type { PageParam } from '@/api'; + +/** + * 应用评论 + */ +export interface CompanyComment { + // ID + id?: number; + // 父级ID + parentId?: number; + // 用户ID + userId?: number; + // 企业ID + companyId?: number; + // 评分 + rate?: number; + // 排序(数字越小越靠前) + sortNumber?: number; + // 评论内容 + comments?: string; + // 状态 + status?: number; + // 租户id + tenantId?: number; + // 租户名称 + tenantName?: string; + // 企业 + logo?: string; + // 创建时间 + createTime?: string; + // 子列表 + children?: CompanyComment[]; +} + +/** + * 应用评论搜索条件 + */ +export interface CompanyCommentParam extends PageParam { + id?: number; + userId?: number; + tenantId?: number; + keywords?: string; +} diff --git a/src_bak/api/system/companyContent/index.ts b/src_bak/api/system/companyContent/index.ts new file mode 100644 index 0000000..adaf3cb --- /dev/null +++ b/src_bak/api/system/companyContent/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyContent, CompanyContentParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..226f513 --- /dev/null +++ b/src_bak/api/system/companyContent/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 应用详情 + */ +export interface CompanyContent { + // + id?: number; + // 企业ID + companyId?: number; + // 详细内容 + content?: string; + // 租户id + tenantId?: number; + // 创建时间 + createTime?: string; +} + +/** + * 应用详情搜索条件 + */ +export interface CompanyContentParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/companyGit/index.ts b/src_bak/api/system/companyGit/index.ts new file mode 100644 index 0000000..ab05987 --- /dev/null +++ b/src_bak/api/system/companyGit/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyGit, CompanyGitParam } from './model'; +import { SERVER_API_URL } from '@/config/index'; + +/** + * 分页查询代码仓库 + */ +export async function pageCompanyGit(params: CompanyGitParam) { + const res = await request.get>>( + SERVER_API_URL + '/system/company-git/page', + { + params + } + ); + if (res.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 new file mode 100644 index 0000000..901a7cd --- /dev/null +++ b/src_bak/api/system/companyGit/model/index.ts @@ -0,0 +1,41 @@ +import type { PageParam } from '@/api'; + +/** + * 代码仓库 + */ +export interface CompanyGit { + // 自增ID + id?: number; + // 仓库名称 + title?: string; + // 厂商 0私有仓库 1github 2gitee 3其他 + brand?: string; + // 语言 + language?: string; + // 企业ID + companyId?: number; + // 仓库地址 + domain?: string; + // 账号 + account?: string; + // 密码 + password?: string; + // 仓库描述 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 代码仓库搜索条件 + */ +export interface CompanyGitParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/companyParameter/index.ts b/src_bak/api/system/companyParameter/index.ts new file mode 100644 index 0000000..a981a35 --- /dev/null +++ b/src_bak/api/system/companyParameter/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyParameter, CompanyParameterParam } from './model'; +import {SERVER_API_URL} from '@/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 new file mode 100644 index 0000000..bf608d8 --- /dev/null +++ b/src_bak/api/system/companyParameter/model/index.ts @@ -0,0 +1,33 @@ +import type { PageParam } from '@/api'; + +/** + * 应用参数 + */ +export interface CompanyParameter { + // 自增ID + id?: number; + // 参数名称 + name?: string; + // 参数内容 + value?: string; + // 企业ID + companyId?: number; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 应用参数搜索条件 + */ +export interface CompanyParameterParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/companyUrl/index.ts b/src_bak/api/system/companyUrl/index.ts new file mode 100644 index 0000000..3b74b53 --- /dev/null +++ b/src_bak/api/system/companyUrl/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { CompanyUrl, CompanyUrlParam } from './model'; +import {SERVER_API_URL} from '@/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 new file mode 100644 index 0000000..ddccc6b --- /dev/null +++ b/src_bak/api/system/companyUrl/model/index.ts @@ -0,0 +1,39 @@ +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 new file mode 100644 index 0000000..b8c9e26 --- /dev/null +++ b/src_bak/api/system/dict-data/index.ts @@ -0,0 +1,87 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DictData, DictDataParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..b39b71c --- /dev/null +++ b/src_bak/api/system/dict-data/model/index.ts @@ -0,0 +1,46 @@ +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 new file mode 100644 index 0000000..0076c39 --- /dev/null +++ b/src_bak/api/system/dict/index.ts @@ -0,0 +1,61 @@ +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 new file mode 100644 index 0000000..575cb35 --- /dev/null +++ b/src_bak/api/system/dict/model/index.ts @@ -0,0 +1,29 @@ +/** + * 字典 + */ +export interface Dict { + // 字典id + dictId?: number; + // 字典标识 + dictCode?: string; + // 字典名称 + dictName?: string; + // 排序号 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + type?: number; + tenantId?: number; +} + +/** + * 字典搜索条件 + */ +export interface DictParam { + dictCode?: string; + dictName?: string; + type?: number; + tenantId?: number; +} diff --git a/src_bak/api/system/dictionary-data/index.ts b/src_bak/api/system/dictionary-data/index.ts new file mode 100644 index 0000000..a72b89f --- /dev/null +++ b/src_bak/api/system/dictionary-data/index.ts @@ -0,0 +1,87 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { DictionaryData, DictionaryDataParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..e1301bd --- /dev/null +++ b/src_bak/api/system/dictionary-data/model/index.ts @@ -0,0 +1,33 @@ +import { PageParam } from '@/api'; + +/** + * 字典数据 + */ +export interface DictionaryData { + // 字典数据id + dictDataId?: number; + // 字典id + dictId?: number; + // 字典数据标识 + dictDataCode?: string; + // 字典数据名称 + dictDataName?: string; + // 排序号 + sortNumber?: string; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; +} + +/** + * 字典数据搜索条件 + */ +export interface DictionaryDataParam extends PageParam { + // 关键字 + keywords?: string; + // 字典标识 + dictCode?: string; + // 字典id + dictId?: number; +} diff --git a/src_bak/api/system/dictionary/index.ts b/src_bak/api/system/dictionary/index.ts new file mode 100644 index 0000000..6fb9aa4 --- /dev/null +++ b/src_bak/api/system/dictionary/index.ts @@ -0,0 +1,61 @@ +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 new file mode 100644 index 0000000..d72e7c2 --- /dev/null +++ b/src_bak/api/system/dictionary/model/index.ts @@ -0,0 +1,29 @@ +/** + * 字典 + */ +export interface Dictionary { + // 字典id + dictId?: number; + // 字典标识 + dictCode?: string; + // 字典名称 + dictName?: string; + // 排序号 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + type?: number; + tenantId?: number; +} + +/** + * 字典搜索条件 + */ +export interface DictionaryParam { + dictCode?: string; + dictName?: string; + type?: number; + tenantId?: number; +} diff --git a/src_bak/api/system/environment/index.ts b/src_bak/api/system/environment/index.ts new file mode 100644 index 0000000..e7a2919 --- /dev/null +++ b/src_bak/api/system/environment/index.ts @@ -0,0 +1,125 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Environment, EnvironmentParam } from './model/index'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..daa916b --- /dev/null +++ b/src_bak/api/system/environment/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 插件 + */ +export interface Environment { + id?: number; + environmentName?: string; + environmentCode?: string; + brand?: string; + serverIp?: string; + modulesUrl?: string; + modulesApi?: string; + sortNumber?: number; + comments?: string; + status?: number; +} + +/** + * 插件搜索条件 + */ +export interface EnvironmentParam extends PageParam { + id: number; + environmentName: string; +} diff --git a/src_bak/api/system/file/index.ts b/src_bak/api/system/file/index.ts new file mode 100644 index 0000000..b392097 --- /dev/null +++ b/src_bak/api/system/file/index.ts @@ -0,0 +1,99 @@ +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 new file mode 100644 index 0000000..95d276d --- /dev/null +++ b/src_bak/api/system/file/model/index.ts @@ -0,0 +1,54 @@ +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 new file mode 100644 index 0000000..613363d --- /dev/null +++ b/src_bak/api/system/login-record/index.ts @@ -0,0 +1,32 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { LoginRecord, LoginRecordParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..0836eb5 --- /dev/null +++ b/src_bak/api/system/login-record/model/index.ts @@ -0,0 +1,38 @@ +import { PageParam } from '@/api'; + +/** + * 登录日志 + */ +export interface LoginRecord { + // 登录日志id + id: number; + // 用户账号 + username: string; + // 操作系统 + os: string; + // 设备名称 + device: string; + // 浏览器类型 + browser: string; + // ip地址 + ip: string; + // 操作类型, 0登录成功, 1登录失败, 2退出登录, 3续签token + loginType: number; + // 备注 + comments: string; + // 操作时间 + createTime: string; + // 用户昵称 + nickname: string; +} + +/** + * 登录日志搜索条件 + */ +export interface LoginRecordParam extends PageParam { + username?: string; + nickname?: string; + createTimeStart?: string; + createTimeEnd?: string; + loginType?: number; +} diff --git a/src_bak/api/system/menu/index.ts b/src_bak/api/system/menu/index.ts new file mode 100644 index 0000000..2e1e8bc --- /dev/null +++ b/src_bak/api/system/menu/index.ts @@ -0,0 +1,98 @@ +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 new file mode 100644 index 0000000..4b52e95 --- /dev/null +++ b/src_bak/api/system/menu/model/index.ts @@ -0,0 +1,67 @@ +/** + * 菜单 + */ +export interface Menu { + // 菜单id + menuId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 菜单名称 + title: string; + // 菜单路由地址 + path: string; + // 菜单组件地址 + component: string; + // 模块API + modulesUrl?: string; + // 模块ID + modules?: string; + // 菜单类型, 0菜单, 1按钮 + menuType?: number; + // 排序号 + sortNumber?: number; + // 权限标识 + authority?: string; + // 菜单图标 + icon?: string; + // 是否隐藏, 0否,1是(仅注册路由不显示左侧菜单) + hide?: number; + // 路由元信息 + meta?: string; + // 创建时间 + createTime?: string; + // 子菜单 + children?: Menu[]; + // 权限树回显选中状态, 0未选中, 1选中 + checked?: boolean; + // + key?: number; + // + value?: number; + // + parentIds?: number[]; + // + openType?: number; + disabled?: boolean; + // + appId?: number; + // + tenantId?: number; + tenantName?: string; + companyId?: number; + // 插件Api + plugUrl?: string; + label?: string; +} + +/** + * 菜单搜索参数 + */ +export interface MenuParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; + menuType?: number; + hide?: number; +} diff --git a/src_bak/api/system/modules/index.ts b/src_bak/api/system/modules/index.ts new file mode 100644 index 0000000..f121b92 --- /dev/null +++ b/src_bak/api/system/modules/index.ts @@ -0,0 +1,118 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Modules, ModulesParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..a1cda9b --- /dev/null +++ b/src_bak/api/system/modules/model/index.ts @@ -0,0 +1,22 @@ +import type { PageParam } from '@/api'; + +/** + * 插件 + */ +export interface Modules { + id?: number; + modules?: string; + modulesUrl?: string; + sortNumber?: number; + comments?: string; + status?: number; +} + +/** + * 插件搜索条件 + */ +export interface ModulesParam extends PageParam { + id: number; + modules: string; + modulesUrl?: string; +} diff --git a/src_bak/api/system/operation-record/index.ts b/src_bak/api/system/operation-record/index.ts new file mode 100644 index 0000000..3a7ce76 --- /dev/null +++ b/src_bak/api/system/operation-record/index.ts @@ -0,0 +1,32 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { OperationRecord, OperationRecordParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..fc1425e --- /dev/null +++ b/src_bak/api/system/operation-record/model/index.ts @@ -0,0 +1,56 @@ +import { PageParam } from '@/api'; + +/** + * 操作日志 + */ +export interface OperationRecord { + // 操作日志id + id?: number; + // 用户id + userId?: number; + // 操作模块 + module: string; + // 操作功能 + description: string; + // 请求地址 + url: string; + // 请求方式 + requestMethod: string; + // 调用方法 + method: string; + // 请求参数 + params: string; + // 返回结果 + result: string; + // 异常信息 + error: string; + // 消耗时间, 单位毫秒 + spendTime: number; + // 操作系统 + os: string; + // 设备名称 + device: string; + // 浏览器类型 + browser: string; + // ip地址 + ip: string; + // 状态, 0成功, 1异常 + status: number; + // 操作时间 + createTime: string; + // 用户昵称 + nickname: string; + // 用户账号 + username: string; +} + +/** + * 操作日志搜索条件 + */ +export interface OperationRecordParam extends PageParam { + username?: string; + module?: string; + createTimeStart?: string; + createTimeEnd?: string; + status?: number; +} diff --git a/src_bak/api/system/order/index.ts b/src_bak/api/system/order/index.ts new file mode 100644 index 0000000..c0237d6 --- /dev/null +++ b/src_bak/api/system/order/index.ts @@ -0,0 +1,105 @@ +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 new file mode 100644 index 0000000..d403932 --- /dev/null +++ b/src_bak/api/system/order/model/index.ts @@ -0,0 +1,93 @@ +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 new file mode 100644 index 0000000..e486800 --- /dev/null +++ b/src_bak/api/system/orderGoods/index.ts @@ -0,0 +1,115 @@ +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 new file mode 100644 index 0000000..948d932 --- /dev/null +++ b/src_bak/api/system/orderGoods/model/index.ts @@ -0,0 +1,58 @@ +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 new file mode 100644 index 0000000..4a1f4af --- /dev/null +++ b/src_bak/api/system/organization/index.ts @@ -0,0 +1,86 @@ +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 new file mode 100644 index 0000000..1f9deaa --- /dev/null +++ b/src_bak/api/system/organization/model/index.ts @@ -0,0 +1,42 @@ +import { PageParam } from '@/api'; + +/** + * 机构 + */ +export interface Organization { + // 机构id + organizationId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 机构名称 + organizationName?: string; + // 机构全称 + organizationFullName?: string; + // 机构代码 + organizationCode?: string; + // 机构类型(字典) + organizationType?: string; + // 排序号 + sortNumber?: number; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 机构类型名称 + organizationTypeName?: string; + // + key?: number; + // + value?: number; + // + title?: string; + children?: Organization[]; +} + +/** + * 机构搜索条件 + */ +export interface OrganizationParam extends PageParam { + organizationName?: string; + parentId?: number; +} diff --git a/src_bak/api/system/parameter/index.ts b/src_bak/api/system/parameter/index.ts new file mode 100644 index 0000000..52e206e --- /dev/null +++ b/src_bak/api/system/parameter/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Parameter, ParameterParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..ae3d159 --- /dev/null +++ b/src_bak/api/system/parameter/model/index.ts @@ -0,0 +1,31 @@ +import type { PageParam } from '@/api'; + +/** + * 应用参数 + */ +export interface Parameter { + // 自增ID + id?: number; + // 参数名称 + name?: string; + // 参数内容 + value?: string; + // 备注 + comments?: string; + // 排序(数字越小越靠前) + sortNumber?: number; + // 状态, 0正常, 1待确认 + status?: number; + // 创建时间 + createTime?: string; + // 租户id + tenantId?: number; +} + +/** + * 应用参数搜索条件 + */ +export interface ParameterParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/payment/index.ts b/src_bak/api/system/payment/index.ts new file mode 100644 index 0000000..98fd2d4 --- /dev/null +++ b/src_bak/api/system/payment/index.ts @@ -0,0 +1,144 @@ +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 new file mode 100644 index 0000000..6a4ecfe --- /dev/null +++ b/src_bak/api/system/payment/model/index.ts @@ -0,0 +1,55 @@ +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 new file mode 100644 index 0000000..997736d --- /dev/null +++ b/src_bak/api/system/plug/index.ts @@ -0,0 +1,125 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Plug, PlugParam } from './model/index'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..e67242f --- /dev/null +++ b/src_bak/api/system/plug/model/index.ts @@ -0,0 +1,67 @@ +import type { PageParam } from '@/api'; + +/** + * 插件 + */ +export interface Plug { + plugId?: number; + plugName?: string; + plugCode?: string; + // 菜单id + menuId?: number; + // 上级id, 0是顶级 + parentId?: number; + // 菜单名称 + title?: string; + // 菜单路由地址 + path?: string; + // 菜单组件地址 + component?: string; + // 菜单类型, 0菜单, 1按钮 + menuType?: number; + // 排序号 + sortNumber?: number; + // 权限标识 + authority?: string; + // 菜单图标 + icon?: string; + // 是否隐藏, 0否,1是(仅注册路由不显示左侧菜单) + hide?: number; + // 路由元信息 + meta?: string; + score?: number; + price?: number; + // 创建时间 + createTime?: string; + // 子菜单 + children?: Plug[]; + // 权限树回显选中状态, 0未选中, 1选中 + checked?: boolean; + shortName?: string; + comments?: string; + content?: string; + // + key?: number; + // + value?: number; + // + parentIds?: number[]; + // + openType?: number; + // + userId?: number; + // + appId?: number; + status?: number; + tenantId?: number; +} + +/** + * 插件搜索条件 + */ +export interface PlugParam extends PageParam { + title?: string; + path?: string; + authority?: string; + parentId?: number; +} diff --git a/src_bak/api/system/role/index.ts b/src_bak/api/system/role/index.ts new file mode 100644 index 0000000..9cadf52 --- /dev/null +++ b/src_bak/api/system/role/index.ts @@ -0,0 +1,119 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Role, RoleParam } from './model'; +import type { Menu } from '../menu/model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..d4c9a50 --- /dev/null +++ b/src_bak/api/system/role/model/index.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api'; + +/** + * 角色 + */ +export interface Role { + // 角色id + roleId?: number; + // 角色标识 + roleCode?: string; + // 角色名称 + roleName?: string; + sortNumber?: any; + // 备注 + comments?: any; + // 创建时间 + createTime?: string; +} + +/** + * 角色搜索条件 + */ +export interface RoleParam extends PageParam { + roleName?: string; + roleCode?: string; + comments?: string; +} diff --git a/src_bak/api/system/setting/index.ts b/src_bak/api/system/setting/index.ts new file mode 100644 index 0000000..3719833 --- /dev/null +++ b/src_bak/api/system/setting/index.ts @@ -0,0 +1,126 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Setting, SettingParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..879a9e9 --- /dev/null +++ b/src_bak/api/system/setting/model/index.ts @@ -0,0 +1,127 @@ +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 new file mode 100644 index 0000000..1d54bf4 --- /dev/null +++ b/src_bak/api/system/tenant/index.ts @@ -0,0 +1,178 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Tenant, TenantParam } from './model'; +import { Menu } from '@/api/system/menu/model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..de007b2 --- /dev/null +++ b/src_bak/api/system/tenant/model/index.ts @@ -0,0 +1,46 @@ +import type { PageParam } from '@/api'; +import { Company } from '@/api/system/company/model'; + +/** + * 租户 + */ +export interface Tenant { + // 租户id + tenantId?: number; + // 租户名称 + tenantName?: string; + // 应用ID + appId?: string; + // 应用秘钥 + appSecret?: string; + // logo + logo?: string; + // 企业名称 + companyName?: string; + // 关联客户ID + companyId?: string; + // 备注 + comments?: string; + // 创建时间 + createTime?: string; + // 状态 + status?: number; + // + password?: string; + // 企业信息 + company?: Company | null; +} + +/** + * 租户搜索条件 + */ +export interface TenantParam extends PageParam { + tenantName?: string; + appId?: string; + companyId?: number; + companyName?: string; + version?: string; + province?: string; + city?: string; + tenantCode?: string; +} diff --git a/src_bak/api/system/url/index.ts b/src_bak/api/system/url/index.ts new file mode 100644 index 0000000..c1724ec --- /dev/null +++ b/src_bak/api/system/url/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Url, UrlParam } from './model'; +import {SERVER_API_URL} from '@/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 new file mode 100644 index 0000000..1564067 --- /dev/null +++ b/src_bak/api/system/url/model/index.ts @@ -0,0 +1,37 @@ +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 new file mode 100644 index 0000000..1459927 --- /dev/null +++ b/src_bak/api/system/user-collection/index.ts @@ -0,0 +1,106 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { UserCollection, UserCollectionParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..ebd88c9 --- /dev/null +++ b/src_bak/api/system/user-collection/model/index.ts @@ -0,0 +1,25 @@ +import type { PageParam } from '@/api'; + +/** + * 我的收藏 + */ +export interface UserCollection { + // 主键ID + id?: number; + // 租户ID + tid?: number; + // 用户ID + userId?: number; + // 租户id + tenantId?: number; + // 注册时间 + createTime?: string; +} + +/** + * 我的收藏搜索条件 + */ +export interface UserCollectionParam extends PageParam { + id?: number; + keywords?: string; +} diff --git a/src_bak/api/system/user-file/index.ts b/src_bak/api/system/user-file/index.ts new file mode 100644 index 0000000..cff199a --- /dev/null +++ b/src_bak/api/system/user-file/index.ts @@ -0,0 +1,89 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { UserFile, UserFileParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..ca51256 --- /dev/null +++ b/src_bak/api/system/user-file/model/index.ts @@ -0,0 +1,39 @@ +import { PageParam } from '@/api'; + +/** + * 用户文件 + */ +export interface UserFile { + // id + id?: number; + // 用户id + userId?: number; + // 文件名称 + name?: string; + // 是否是文件夹, 0否, 1是 + isDirectory?: number; + // 上级id + parentId?: number; + // 文件存储路径 + path?: string; + // 文件大小 + length?: number; + // 文件类型 + contentType?: string; + // 上传时间 + createTime?: string; + // 文件访问地址 + url?: string; + // 文件缩略图访问地址 + thumbnail?: string; + // 文件下载地址 + downloadUrl?: string; +} + +/** + * 用户文件查询参数 + */ +export interface UserFileParam extends PageParam { + name?: string; + parentId?: number; +} diff --git a/src_bak/api/system/user-group/index.ts b/src_bak/api/system/user-group/index.ts new file mode 100644 index 0000000..004db57 --- /dev/null +++ b/src_bak/api/system/user-group/index.ts @@ -0,0 +1,120 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Group, GroupParam } from '@/api/system/user-group/model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..dc858cb --- /dev/null +++ b/src_bak/api/system/user-group/model/index.ts @@ -0,0 +1,23 @@ +import type { PageParam } from '@/api'; + +export interface Group { + groupId?: number; + name?: string; + status?: number; + comments?: any; + sortNumber?: number; + deleted?: number; + tenantId?: number; + createTime?: string; + updateTime?: string; +} + +/** + * 搜索条件 + */ +export interface GroupParam extends PageParam { + groupId?: number; + name?: string; + status?: number; + keywords?: string; +} diff --git a/src_bak/api/system/user/balance-log/index.ts b/src_bak/api/system/user/balance-log/index.ts new file mode 100644 index 0000000..e8c7a57 --- /dev/null +++ b/src_bak/api/system/user/balance-log/index.ts @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..29ea8db --- /dev/null +++ b/src_bak/api/system/user/balance-log/model/index.ts @@ -0,0 +1,23 @@ +/** + * 用户余额日志类型定义 + */ + +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 new file mode 100644 index 0000000..0d47240 --- /dev/null +++ b/src_bak/api/system/user/balance.ts @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..05a8e02 --- /dev/null +++ b/src_bak/api/system/user/index.ts @@ -0,0 +1,261 @@ +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 new file mode 100644 index 0000000..3b0ef49 --- /dev/null +++ b/src_bak/api/system/user/model/count.ts @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..378472b --- /dev/null +++ b/src_bak/api/system/user/model/index.ts @@ -0,0 +1,35 @@ +/** + * 用户余额类型定义 + */ + +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 new file mode 100644 index 0000000..468a671 --- /dev/null +++ b/src_bak/api/system/user/points/index.ts @@ -0,0 +1,44 @@ +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 new file mode 100644 index 0000000..8c2a809 --- /dev/null +++ b/src_bak/api/system/user/points/model/index.ts @@ -0,0 +1,13 @@ +/** + * 用户积分类型定义 + */ + +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 new file mode 100644 index 0000000..08d471c --- /dev/null +++ b/src_bak/api/system/user/withdraw/index.ts @@ -0,0 +1,18 @@ +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 new file mode 100644 index 0000000..29aa100 --- /dev/null +++ b/src_bak/api/system/user/withdraw/model/index.ts @@ -0,0 +1,19 @@ +/** + * 用户提现类型定义 + */ + +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 new file mode 100644 index 0000000..ecaefcc --- /dev/null +++ b/src_bak/api/system/userRole/index.ts @@ -0,0 +1,47 @@ +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 new file mode 100644 index 0000000..835bbae --- /dev/null +++ b/src_bak/api/system/userRole/model/index.ts @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..21416e7 --- /dev/null +++ b/src_bak/api/system/userVerify/index.ts @@ -0,0 +1,130 @@ +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 new file mode 100644 index 0000000..2d52441 --- /dev/null +++ b/src_bak/api/system/userVerify/model/index.ts @@ -0,0 +1,58 @@ +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 new file mode 100644 index 0000000..fdca9dc --- /dev/null +++ b/src_bak/api/system/version/index.ts @@ -0,0 +1,119 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { Version, VersionParam } from './model'; +import type { Menu } from '../menu/model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..8899e2f --- /dev/null +++ b/src_bak/api/system/version/model/index.ts @@ -0,0 +1,26 @@ +import type { PageParam } from '@/api'; + +export interface Version { + id?: number; + versionName?: string; + versionCode?: string; + vueDownloadUrl?: string; + androidDownloadUrl?: string; + iosDownloadUrl?: string; + updateInfo?: any; + isHard?: boolean; + isHot?: boolean; + status?: number; + comments?: string; + tenantId?: number; + createTime?: string; +} + +/** + * 角色搜索条件 + */ +export interface VersionParam extends PageParam { + versionName?: string; + versionCode?: string; + comments?: string; +} diff --git a/src_bak/api/system/white-domain/index.ts b/src_bak/api/system/white-domain/index.ts new file mode 100644 index 0000000..fc68e9f --- /dev/null +++ b/src_bak/api/system/white-domain/index.ts @@ -0,0 +1,146 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import type { WhiteDomain, WhiteDomainParam } from './model'; +import {SERVER_API_URL} from "@/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 new file mode 100644 index 0000000..8a231df --- /dev/null +++ b/src_bak/api/system/white-domain/model/index.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api'; + +/** + * 服务器白名单 + */ +export interface WhiteDomain { + // 自增ID + id?: number; + // 域名 + domain?: string; + // 排序 + sortNumber?: number; + // 备注 + comments?: string; + // 状态 + status?: number; + // 创建时间 + createTime?: string; +} + +/** + * 服务器白名单搜索条件 + */ +export interface WhiteDomainParam extends PageParam { + id?: number; + domain?: string; +} diff --git a/src_bak/app.config.ts b/src_bak/app.config.ts new file mode 100644 index 0000000..da941a2 --- /dev/null +++ b/src_bak/app.config.ts @@ -0,0 +1,168 @@ +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 new file mode 100644 index 0000000..5122105 --- /dev/null +++ b/src_bak/app.scss @@ -0,0 +1,80 @@ +// 全局样式 + +// 导入 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 new file mode 100644 index 0000000..2cdb97e --- /dev/null +++ b/src_bak/app.tsx @@ -0,0 +1,56 @@ +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 new file mode 100644 index 0000000..2069978 Binary files /dev/null and b/src_bak/assets/logo.png differ diff --git a/src_bak/assets/tabbar/README.md b/src_bak/assets/tabbar/README.md new file mode 100644 index 0000000..5ace688 --- /dev/null +++ b/src_bak/assets/tabbar/README.md @@ -0,0 +1,27 @@ +# TabBar 图标目录 + +请将以下图标文件放置在此目录下: + +## 必需图标 + +1. **home.png** - 首页图标(未选中) +2. **home-active.png** - 首页图标(选中) +3. **user.png** - 我的图标(未选中) +4. **user-active.png** - 我的图标(选中) + +## 图标规范 + +- 尺寸: 81px × 81px(推荐) +- 格式: PNG +- 背景: 透明 +- 未选中状态: 灰色(#999999) +- 选中状态: 主题色(#1890ff) + +## 临时解决方案 + +在获取正式图标前,可以使用在线工具生成或使用简单的占位图标。 + +推荐图标库: +- [Iconfont](https://www.iconfont.cn/) +- [Flaticon](https://www.flaticon.com/) +- [Feather Icons](https://feathericons.com/) diff --git a/src_bak/assets/tabbar/category-active.png b/src_bak/assets/tabbar/category-active.png new file mode 100644 index 0000000..febc745 Binary files /dev/null and b/src_bak/assets/tabbar/category-active.png differ diff --git a/src_bak/assets/tabbar/category.png b/src_bak/assets/tabbar/category.png new file mode 100644 index 0000000..987e3dd Binary files /dev/null and b/src_bak/assets/tabbar/category.png differ diff --git a/src_bak/assets/tabbar/home-active.png b/src_bak/assets/tabbar/home-active.png new file mode 100644 index 0000000..474e4bd Binary files /dev/null and b/src_bak/assets/tabbar/home-active.png differ diff --git a/src_bak/assets/tabbar/home.png b/src_bak/assets/tabbar/home.png new file mode 100644 index 0000000..5b916e5 Binary files /dev/null and b/src_bak/assets/tabbar/home.png differ diff --git a/src_bak/assets/tabbar/order-active.png b/src_bak/assets/tabbar/order-active.png new file mode 100644 index 0000000..96f4277 Binary files /dev/null and b/src_bak/assets/tabbar/order-active.png differ diff --git a/src_bak/assets/tabbar/order.png b/src_bak/assets/tabbar/order.png new file mode 100644 index 0000000..ca7a067 Binary files /dev/null and b/src_bak/assets/tabbar/order.png differ diff --git a/src_bak/assets/tabbar/points-active.png b/src_bak/assets/tabbar/points-active.png new file mode 100644 index 0000000..bccaf3e Binary files /dev/null and b/src_bak/assets/tabbar/points-active.png differ diff --git a/src_bak/assets/tabbar/points.png b/src_bak/assets/tabbar/points.png new file mode 100644 index 0000000..6e0e6e3 Binary files /dev/null and b/src_bak/assets/tabbar/points.png differ diff --git a/src_bak/assets/tabbar/user-active.png b/src_bak/assets/tabbar/user-active.png new file mode 100644 index 0000000..c132039 Binary files /dev/null and b/src_bak/assets/tabbar/user-active.png differ diff --git a/src_bak/assets/tabbar/user.png b/src_bak/assets/tabbar/user.png new file mode 100644 index 0000000..4692e10 Binary files /dev/null and b/src_bak/assets/tabbar/user.png differ diff --git a/src_bak/components/ErrorBoundary.scss b/src_bak/components/ErrorBoundary.scss new file mode 100644 index 0000000..bf8371c --- /dev/null +++ b/src_bak/components/ErrorBoundary.scss @@ -0,0 +1,87 @@ +.error-boundary { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 32px; + background: linear-gradient(180deg, #f8fafc 0%, #eef2ff 100%); +} + +.error-boundary__container { + width: 100%; + max-width: 560px; + padding: 32px 24px; + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 50px rgba(15, 23, 42, 0.08); + text-align: center; +} + +.error-boundary__icon { + width: 72px; + height: 72px; + margin: 0 auto 16px; + border-radius: 999px; + background: #fee2e2; + color: #dc2626; + font-size: 32px; + line-height: 72px; + font-weight: 700; +} + +.error-boundary__title { + display: block; + margin-bottom: 12px; + font-size: 32px; + font-weight: 600; + color: #0f172a; +} + +.error-boundary__message { + display: block; + color: #475569; + line-height: 1.6; +} + +.error-boundary__details { + margin-top: 20px; + padding: 16px; + text-align: left; + border-radius: 16px; + background: #f8fafc; +} + +.error-boundary__error-title { + display: block; + margin-bottom: 8px; + font-size: 24px; + font-weight: 600; + color: #0f172a; +} + +.error-boundary__error-message { + display: block; + word-break: break-word; + color: #b91c1c; + font-size: 22px; +} + +.error-boundary__actions { + display: flex; + gap: 16px; + margin-top: 24px; +} + +.error-boundary__button { + flex: 1; +} + +.error-boundary__button--primary { + color: #fff; + background: #2563eb; +} + +.error-boundary__button--secondary { + color: #0f172a; + background: #e2e8f0; +} diff --git a/src_bak/components/ErrorBoundary.tsx b/src_bak/components/ErrorBoundary.tsx new file mode 100644 index 0000000..011d660 --- /dev/null +++ b/src_bak/components/ErrorBoundary.tsx @@ -0,0 +1,75 @@ +import React, { Component, type ReactNode } from 'react' +import Taro from '@tarojs/taro' +import { View, Text, Button } from '@tarojs/components' +import './ErrorBoundary.scss' + +interface ErrorBoundaryState { + hasError: boolean + error?: Error + errorInfo?: React.ErrorInfo +} + +interface ErrorBoundaryProps { + children: ReactNode + fallback?: ReactNode + onError?: (error: Error, errorInfo: React.ErrorInfo) => 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 new file mode 100644 index 0000000..2ba723f --- /dev/null +++ b/src_bak/components/NavBar/index.tsx @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..aad6bd7 --- /dev/null +++ b/src_bak/components/QRLoginScanner.tsx @@ -0,0 +1,135 @@ +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 new file mode 100644 index 0000000..9eea2a2 --- /dev/null +++ b/src_bak/components/business/AddressCard/index.tsx @@ -0,0 +1,121 @@ +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 new file mode 100644 index 0000000..fcc37f7 --- /dev/null +++ b/src_bak/components/business/CouponCard/index.tsx @@ -0,0 +1,113 @@ +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 new file mode 100644 index 0000000..b63db2b --- /dev/null +++ b/src_bak/components/business/CouponSelect/index.tsx @@ -0,0 +1,185 @@ +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 new file mode 100644 index 0000000..a0e67a3 --- /dev/null +++ b/src_bak/components/business/MemberBadge/index.tsx @@ -0,0 +1,27 @@ +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 new file mode 100644 index 0000000..4bf390f --- /dev/null +++ b/src_bak/components/business/PayModal/index.tsx @@ -0,0 +1,123 @@ +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 new file mode 100644 index 0000000..e9c9ee0 --- /dev/null +++ b/src_bak/components/business/SkuSelector/index.tsx @@ -0,0 +1,346 @@ +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 new file mode 100644 index 0000000..2f93925 --- /dev/null +++ b/src_bak/components/common/BottomButton/index.scss @@ -0,0 +1,59 @@ +/* 底部悬浮按钮样式 */ + +.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 new file mode 100644 index 0000000..c52d1af --- /dev/null +++ b/src_bak/components/common/BottomButton/index.tsx @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..4da086e --- /dev/null +++ b/src_bak/components/common/EmptyState/index.tsx @@ -0,0 +1,48 @@ +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 new file mode 100644 index 0000000..f0686bb --- /dev/null +++ b/src_bak/components/common/FixedButton/index.tsx @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..39c093c --- /dev/null +++ b/src_bak/components/common/LazyImage/index.tsx @@ -0,0 +1,57 @@ +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 new file mode 100644 index 0000000..8c3e11e --- /dev/null +++ b/src_bak/components/common/LoadMore/index.tsx @@ -0,0 +1,29 @@ +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 new file mode 100644 index 0000000..15d2396 --- /dev/null +++ b/src_bak/components/common/Loading/index.tsx @@ -0,0 +1,48 @@ +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 new file mode 100644 index 0000000..0b8c057 --- /dev/null +++ b/src_bak/components/common/OrderCard/index.tsx @@ -0,0 +1,137 @@ +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 new file mode 100644 index 0000000..5e020bf --- /dev/null +++ b/src_bak/components/common/Price/index.tsx @@ -0,0 +1,67 @@ +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 new file mode 100644 index 0000000..5f52ae2 --- /dev/null +++ b/src_bak/components/common/ProductCard/index.tsx @@ -0,0 +1,59 @@ +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 new file mode 100644 index 0000000..792be17 --- /dev/null +++ b/src_bak/components/common/VirtualList/index.tsx @@ -0,0 +1,69 @@ +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 new file mode 100644 index 0000000..6b18c33 --- /dev/null +++ b/src_bak/config/app.ts @@ -0,0 +1 @@ +export * from '../../config/app' diff --git a/src_bak/contexts/AppContext.tsx b/src_bak/contexts/AppContext.tsx new file mode 100644 index 0000000..3528475 --- /dev/null +++ b/src_bak/contexts/AppContext.tsx @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..78639eb --- /dev/null +++ b/src_bak/contexts/CartContext.tsx @@ -0,0 +1,233 @@ +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 new file mode 100644 index 0000000..a4d9864 --- /dev/null +++ b/src_bak/contexts/UserContext.tsx @@ -0,0 +1,135 @@ +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 new file mode 100644 index 0000000..4f2ea4e --- /dev/null +++ b/src_bak/hooks/index.ts @@ -0,0 +1,28 @@ +// 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 new file mode 100644 index 0000000..d408c36 --- /dev/null +++ b/src_bak/hooks/useAddress.ts @@ -0,0 +1,98 @@ +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 new file mode 100644 index 0000000..279c7fb --- /dev/null +++ b/src_bak/hooks/useAppContext.ts @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..3924c1c --- /dev/null +++ b/src_bak/hooks/useCountDown.ts @@ -0,0 +1,145 @@ +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 new file mode 100644 index 0000000..35401ba --- /dev/null +++ b/src_bak/hooks/useCountUp.ts @@ -0,0 +1,130 @@ +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 new file mode 100644 index 0000000..f927293 --- /dev/null +++ b/src_bak/hooks/useCoupon.ts @@ -0,0 +1,104 @@ +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 new file mode 100644 index 0000000..d004e1d --- /dev/null +++ b/src_bak/hooks/usePagination.ts @@ -0,0 +1,110 @@ +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 new file mode 100644 index 0000000..6c90aab --- /dev/null +++ b/src_bak/hooks/usePayment.ts @@ -0,0 +1,77 @@ +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 new file mode 100644 index 0000000..d3866b3 --- /dev/null +++ b/src_bak/hooks/useRequest.ts @@ -0,0 +1,325 @@ +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 new file mode 100644 index 0000000..1dd2274 --- /dev/null +++ b/src_bak/hooks/useScrollHeight.ts @@ -0,0 +1,24 @@ +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 new file mode 100644 index 0000000..d128779 --- /dev/null +++ b/src_bak/hooks/useTheme.ts @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..c91c2ea --- /dev/null +++ b/src_bak/hooks/useUser.ts @@ -0,0 +1,81 @@ +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 new file mode 100644 index 0000000..c1d7b6c --- /dev/null +++ b/src_bak/index.html @@ -0,0 +1,12 @@ + + + + + + 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 new file mode 100644 index 0000000..2fd54bd --- /dev/null +++ b/src_bak/pages/activity/detail/index.config.ts @@ -0,0 +1,3 @@ +export default { + navigationBarTitleText: '活动详情', +} diff --git a/src_bak/pages/activity/detail/index.tsx b/src_bak/pages/activity/detail/index.tsx new file mode 100644 index 0000000..9b0c765 --- /dev/null +++ b/src_bak/pages/activity/detail/index.tsx @@ -0,0 +1,245 @@ +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 new file mode 100644 index 0000000..6b10e16 --- /dev/null +++ b/src_bak/pages/activity/list/index.config.ts @@ -0,0 +1,3 @@ +export default { + navigationBarTitleText: '活动列表', +} diff --git a/src_bak/pages/activity/list/index.tsx b/src_bak/pages/activity/list/index.tsx new file mode 100644 index 0000000..c6e4efe --- /dev/null +++ b/src_bak/pages/activity/list/index.tsx @@ -0,0 +1,220 @@ +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 new file mode 100644 index 0000000..716b532 --- /dev/null +++ b/src_bak/pages/after-sale/apply/index.config.ts @@ -0,0 +1,3 @@ +export default { + navigationBarTitleText: '申请售后', +} diff --git a/src_bak/pages/after-sale/apply/index.tsx b/src_bak/pages/after-sale/apply/index.tsx new file mode 100644 index 0000000..593e9f4 --- /dev/null +++ b/src_bak/pages/after-sale/apply/index.tsx @@ -0,0 +1,251 @@ +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} + + + ))} + + + + {/* 问题描述 */} + + 问题描述 +