feat: 重构充值提现功能,添加冷钱包管理
后端改动: - 新增冷钱包管理模块(ColdWallet实体、Mapper、Service、Controller) - 充值流程:创建订单→显示钱包地址→用户确认打款→管理员审核 - 提现流程:用户输入地址和联系方式→冻结余额→管理员审核 - OrderFund新增字段:walletId, walletAddress, withdrawContact, payTime, confirmTime 前端改动(monisuo-admin): - 新增冷钱包管理页面(wallets.vue) - 优化订单管理页面,支持新的状态流转 - 添加调试日志帮助排查登录问题 前端改动(flutter_monisuo): - 更新OrderFund模型支持新字段 - 充值成功后显示钱包地址弹窗 - 提现时收集提现地址和联系方式 - 新增资金订单页面 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -57,12 +57,27 @@ export interface OrderFund {
|
||||
username: string
|
||||
type: number // 1: 充值 2: 提现
|
||||
amount: number
|
||||
status: number // 1: 待审批 2: 已通过 3: 已驳回
|
||||
status: number // 充值: 1待付款 2待确认 3已完成 4已驳回 5已取消; 提现: 1待审批 2已完成 3已驳回 4已取消
|
||||
walletId?: number
|
||||
walletAddress?: string
|
||||
withdrawContact?: string
|
||||
payTime?: string
|
||||
confirmTime?: string
|
||||
createTime: string
|
||||
rejectReason?: string
|
||||
adminRemark?: string
|
||||
}
|
||||
|
||||
export interface ColdWallet {
|
||||
id: number
|
||||
name: string
|
||||
address: string
|
||||
network: string
|
||||
isDefault: boolean
|
||||
status: number // 0: 禁用 1: 启用
|
||||
createTime: string
|
||||
}
|
||||
|
||||
export interface FinanceOverview {
|
||||
totalDeposit: number
|
||||
totalWithdraw: number
|
||||
@@ -189,7 +204,7 @@ export function useUpdateCoinStatusMutation() {
|
||||
}
|
||||
|
||||
// Order Management API
|
||||
export function useGetPendingOrdersQuery(params: { pageNum: number, pageSize: number }) {
|
||||
export function useGetPendingOrdersQuery(params: { type?: number, status?: number, pageNum: number, pageSize: number }) {
|
||||
const { axiosInstance } = useAxios()
|
||||
|
||||
return useQuery<ApiResult<{ list: OrderFund[], total: number }>, AxiosError>({
|
||||
@@ -243,6 +258,99 @@ export function useGetFinanceOverviewQuery() {
|
||||
})
|
||||
}
|
||||
|
||||
// Cold Wallet Management API
|
||||
export function useGetWalletListQuery() {
|
||||
const { axiosInstance } = useAxios()
|
||||
|
||||
return useQuery<ApiResult<ColdWallet[]>, AxiosError>({
|
||||
queryKey: ['useGetWalletListQuery'],
|
||||
queryFn: async () => {
|
||||
const response = await axiosInstance.get('/admin/wallet/list')
|
||||
return response.data
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useCreateWalletMutation() {
|
||||
const { axiosInstance } = useAxios()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation<ApiResult<void>, AxiosError, Partial<ColdWallet>>({
|
||||
mutationKey: ['useCreateWalletMutation'],
|
||||
mutationFn: async (wallet) => {
|
||||
const response = await axiosInstance.post('/admin/wallet/create', wallet)
|
||||
return response.data
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['useGetWalletListQuery'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useUpdateWalletMutation() {
|
||||
const { axiosInstance } = useAxios()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation<ApiResult<void>, AxiosError, Partial<ColdWallet>>({
|
||||
mutationKey: ['useUpdateWalletMutation'],
|
||||
mutationFn: async (wallet) => {
|
||||
const response = await axiosInstance.post('/admin/wallet/update', wallet)
|
||||
return response.data
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['useGetWalletListQuery'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useDeleteWalletMutation() {
|
||||
const { axiosInstance } = useAxios()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation<ApiResult<void>, AxiosError, { id: number }>({
|
||||
mutationKey: ['useDeleteWalletMutation'],
|
||||
mutationFn: async (params) => {
|
||||
const response = await axiosInstance.post('/admin/wallet/delete', params)
|
||||
return response.data
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['useGetWalletListQuery'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useSetDefaultWalletMutation() {
|
||||
const { axiosInstance } = useAxios()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation<ApiResult<void>, AxiosError, { id: number }>({
|
||||
mutationKey: ['useSetDefaultWalletMutation'],
|
||||
mutationFn: async (params) => {
|
||||
const response = await axiosInstance.post('/admin/wallet/setDefault', params)
|
||||
return response.data
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['useGetWalletListQuery'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useToggleWalletStatusMutation() {
|
||||
const { axiosInstance } = useAxios()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation<ApiResult<void>, AxiosError, { id: number }>({
|
||||
mutationKey: ['useToggleWalletStatusMutation'],
|
||||
mutationFn: async (params) => {
|
||||
const response = await axiosInstance.post('/admin/wallet/toggleStatus', params)
|
||||
return response.data
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['useGetWalletListQuery'] })
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// ========== 分析相关 API ==========
|
||||
|
||||
// 盈利分析
|
||||
|
||||
Reference in New Issue
Block a user