From 9591234e70260d50d6e573e7c6c162ade98ca66f Mon Sep 17 00:00:00 2001 From: FlowerWater <9579043+flowerwater2@user.noreply.gitee.com> Date: Fri, 19 Dec 2025 12:04:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=95=86=E5=AE=B6=E7=AB=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages.config.ts | 6 + src/pagesMerchant/api/index.ts | 273 ++++++++ src/pagesMerchant/dashboard/index.vue | 102 ++- src/pagesMerchant/finance/index.vue | 281 ++++++-- src/pagesMerchant/finance/settlement.vue | 168 +++++ src/pagesMerchant/finance/withdraw.vue | 376 ++++++++++ src/pagesMerchant/goods/edit.vue | 844 +++++++++++++++++++++++ src/pagesMerchant/goods/list.vue | 443 ++++++++++-- src/pagesMerchant/me/account.vue | 185 +++++ src/pagesMerchant/me/index.vue | 196 ++++-- src/pagesMerchant/me/shop.vue | 246 +++++++ src/pagesMerchant/mock/finance.ts | 92 +++ src/pagesMerchant/mock/goods.ts | 82 +++ src/pagesMerchant/mock/index.ts | 8 + src/pagesMerchant/mock/order.ts | 150 ++++ src/pagesMerchant/mock/shop.ts | 14 + src/pagesMerchant/mock/stats.ts | 13 + src/pagesMerchant/order/detail.vue | 742 ++++++++++++++++++++ src/pagesMerchant/order/list.vue | 339 +++++++-- src/store/merchant.ts | 164 +++++ src/tabbar/index.vue | 13 +- src/typings/merchant.ts | 249 +++++++ 22 files changed, 4776 insertions(+), 210 deletions(-) create mode 100644 src/pagesMerchant/api/index.ts create mode 100644 src/pagesMerchant/finance/settlement.vue create mode 100644 src/pagesMerchant/finance/withdraw.vue create mode 100644 src/pagesMerchant/goods/edit.vue create mode 100644 src/pagesMerchant/me/account.vue create mode 100644 src/pagesMerchant/me/shop.vue create mode 100644 src/pagesMerchant/mock/finance.ts create mode 100644 src/pagesMerchant/mock/goods.ts create mode 100644 src/pagesMerchant/mock/index.ts create mode 100644 src/pagesMerchant/mock/order.ts create mode 100644 src/pagesMerchant/mock/shop.ts create mode 100644 src/pagesMerchant/mock/stats.ts create mode 100644 src/pagesMerchant/order/detail.vue create mode 100644 src/store/merchant.ts create mode 100644 src/typings/merchant.ts diff --git a/pages.config.ts b/pages.config.ts index 9dbee5e..17c16b9 100644 --- a/pages.config.ts +++ b/pages.config.ts @@ -28,9 +28,15 @@ export default defineUniPages({ pages: [ { path: 'dashboard/index', style: { navigationBarTitleText: '商家工作台' } }, { path: 'order/list', style: { navigationBarTitleText: '订单管理' } }, + { path: 'order/detail', style: { navigationBarTitleText: '订单详情' } }, { path: 'goods/list', style: { navigationBarTitleText: '商品管理' } }, + { path: 'goods/edit', style: { navigationBarTitleText: '编辑商品' } }, { path: 'finance/index', style: { navigationBarTitleText: '财务中心' } }, + { path: 'finance/settlement', style: { navigationBarTitleText: '结算记录' } }, + { path: 'finance/withdraw', style: { navigationBarTitleText: '申请提现' } }, { path: 'me/index', style: { navigationBarTitleText: '商家中心' } }, + { path: 'me/shop', style: { navigationBarTitleText: '店铺设置' } }, + { path: 'me/account', style: { navigationBarTitleText: '账号安全' } }, ], }, { diff --git a/src/pagesMerchant/api/index.ts b/src/pagesMerchant/api/index.ts new file mode 100644 index 0000000..5d1e481 --- /dev/null +++ b/src/pagesMerchant/api/index.ts @@ -0,0 +1,273 @@ +/** + * 商户端 API 接口 + */ +import type { + MerchantOrder, + MerchantGoods, + MerchantStats, + FinanceOverview, + Transaction, + Settlement, + WithdrawRecord, + ShopInfo, + GoodsFormData, +} from '@/typings/merchant' +import { OrderStatus, GoodsStatus } from '@/typings/merchant' +import { + mockMerchantStats, + mockMerchantOrders, + mockMerchantGoods, + mockFinanceOverview, + mockTransactions, + mockSettlements, + mockWithdrawRecords, + mockShopInfo, +} from '../mock' + +// ==================== 统计 API ==================== + +/** 获取商户统计数据 */ +export function getMerchantStats(): Promise { + return new Promise((resolve) => { + setTimeout(() => { + resolve(mockMerchantStats) + }, 300) + }) +} + +// ==================== 订单 API ==================== + +/** 订单查询参数 */ +interface OrderQueryParams { + status?: OrderStatus | 'all' + keyword?: string + page?: number + pageSize?: number +} + +/** 获取订单列表 */ +export function getMerchantOrders(params: OrderQueryParams = {}): Promise<{ list: MerchantOrder[]; total: number }> { + return new Promise((resolve) => { + setTimeout(() => { + let list = [...mockMerchantOrders] + + // 状态筛选 + if (params.status && params.status !== 'all') { + list = list.filter(item => item.status === params.status) + } + + // 关键词搜索 + if (params.keyword) { + const keyword = params.keyword.toLowerCase() + list = list.filter(item => + item.orderNo.toLowerCase().includes(keyword) || + item.customerName.toLowerCase().includes(keyword) + ) + } + + resolve({ list, total: list.length }) + }, 300) + }) +} + +/** 获取订单详情 */ +export function getMerchantOrderDetail(id: string): Promise { + return new Promise((resolve) => { + setTimeout(() => { + const order = mockMerchantOrders.find(item => item.id === id) + resolve(order || null) + }, 300) + }) +} + +/** 确认订单 */ +export function confirmOrder(id: string): Promise { + return new Promise((resolve) => { + setTimeout(() => { + const order = mockMerchantOrders.find(item => item.id === id) + if (order) { + order.status = OrderStatus.SHIPPING + } + resolve(true) + }, 500) + }) +} + +/** 发货 */ +export function shipOrder(id: string, data: { company: string; trackingNo: string }): Promise { + return new Promise((resolve) => { + setTimeout(() => { + const order = mockMerchantOrders.find(item => item.id === id) + if (order) { + order.status = OrderStatus.SHIPPED + order.shipTime = new Date().toISOString() + order.logistics = { + company: data.company, + trackingNo: data.trackingNo, + status: '已发货', + traces: [{ time: new Date().toISOString(), content: '商家已发货' }], + } + } + resolve(true) + }, 500) + }) +} + +/** 添加商家备注 */ +export function addMerchantRemark(id: string, remark: string): Promise { + return new Promise((resolve) => { + setTimeout(() => { + const order = mockMerchantOrders.find(item => item.id === id) + if (order) { + order.merchantRemark = remark + } + resolve(true) + }, 300) + }) +} + +// ==================== 商品 API ==================== + +/** 商品查询参数 */ +interface GoodsQueryParams { + status?: GoodsStatus | 'all' | 'lowStock' + keyword?: string + page?: number + pageSize?: number +} + +/** 获取商品列表 */ +export function getMerchantGoodsList(params: GoodsQueryParams = {}): Promise<{ list: MerchantGoods[]; total: number }> { + return new Promise((resolve) => { + setTimeout(() => { + let list = [...mockMerchantGoods] + + // 状态筛选 + if (params.status) { + if (params.status === 'lowStock') { + list = list.filter(item => item.stock <= 10) + } else if (params.status !== 'all') { + list = list.filter(item => item.status === params.status) + } + } + + // 关键词搜索 + if (params.keyword) { + const keyword = params.keyword.toLowerCase() + list = list.filter(item => item.name.toLowerCase().includes(keyword)) + } + + resolve({ list, total: list.length }) + }, 300) + }) +} + +/** 获取商品详情 */ +export function getMerchantGoodsDetail(id: string): Promise { + return new Promise((resolve) => { + setTimeout(() => { + const goods = mockMerchantGoods.find(item => item.id === id) + resolve(goods || null) + }, 300) + }) +} + +/** 保存商品 */ +export function saveMerchantGoods(data: GoodsFormData): Promise<{ id: string }> { + return new Promise((resolve) => { + setTimeout(() => { + const id = data.id || `goods_${Date.now()}` + resolve({ id }) + }, 500) + }) +} + +/** 更新商品状态 */ +export function updateGoodsStatus(id: string, status: GoodsStatus): Promise { + return new Promise((resolve) => { + setTimeout(() => { + const goods = mockMerchantGoods.find(item => item.id === id) + if (goods) { + goods.status = status + } + resolve(true) + }, 300) + }) +} + +/** 删除商品 */ +export function deleteMerchantGoods(id: string): Promise { + return new Promise((resolve) => { + setTimeout(() => { + resolve(true) + }, 300) + }) +} + +// ==================== 财务 API ==================== + +/** 获取财务概览 */ +export function getFinanceOverview(): Promise { + return new Promise((resolve) => { + setTimeout(() => { + resolve(mockFinanceOverview) + }, 300) + }) +} + +/** 获取交易记录 */ +export function getTransactions(page = 1, pageSize = 20): Promise<{ list: Transaction[]; total: number }> { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ list: mockTransactions, total: mockTransactions.length }) + }, 300) + }) +} + +/** 获取结算记录 */ +export function getSettlements(page = 1, pageSize = 20): Promise<{ list: Settlement[]; total: number }> { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ list: mockSettlements, total: mockSettlements.length }) + }, 300) + }) +} + +/** 获取提现记录 */ +export function getWithdrawRecords(page = 1, pageSize = 20): Promise<{ list: WithdrawRecord[]; total: number }> { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ list: mockWithdrawRecords, total: mockWithdrawRecords.length }) + }, 300) + }) +} + +/** 申请提现 */ +export function applyWithdraw(data: { amount: number; bankAccount: string }): Promise<{ id: string }> { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ id: `withdraw_${Date.now()}` }) + }, 500) + }) +} + +// ==================== 店铺 API ==================== + +/** 获取店铺信息 */ +export function getShopInfo(): Promise { + return new Promise((resolve) => { + setTimeout(() => { + resolve(mockShopInfo) + }, 300) + }) +} + +/** 更新店铺信息 */ +export function updateShopInfo(data: Partial): Promise { + return new Promise((resolve) => { + setTimeout(() => { + Object.assign(mockShopInfo, data) + resolve(true) + }, 500) + }) +} diff --git a/src/pagesMerchant/dashboard/index.vue b/src/pagesMerchant/dashboard/index.vue index 2cb737a..9867f38 100644 --- a/src/pagesMerchant/dashboard/index.vue +++ b/src/pagesMerchant/dashboard/index.vue @@ -1,5 +1,6 @@