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:
sion
2026-03-22 23:15:23 +08:00
parent a476d0a23b
commit 91227b7e51
21 changed files with 2225 additions and 229 deletions

View File

@@ -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 ==========
// 盈利分析