This commit is contained in:
2026-03-22 13:55:23 +08:00
parent c3f196ded4
commit 69099986e0
616 changed files with 38942 additions and 3 deletions

View File

@@ -0,0 +1,90 @@
import type { AxiosError } from 'axios'
import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query'
// import { useAxios } from '@/composables/use-axios'
import type { IResponse } from '../types/response.type'
interface ISystemConfig {
key: string
value: string // JSON string
description?: string
}
const mockData: ISystemConfig[] = [
{
key: 'appearance_config',
value: JSON.stringify({ theme: 'dark', font: 'inter' }),
description: 'Appearance configuration for the application, including theme color, border radius, and content layout.',
},
]
function generateReturnData(data: ISystemConfig, success: boolean = true): IResponse<ISystemConfig> {
return {
data,
extra: {},
code: 200,
message: 'success',
success,
}
}
export function useGetSystemConfigByKeyQuery(key: string) {
// const { axiosInstance } = useAxios()
return useQuery<IResponse<ISystemConfig>, AxiosError>({
queryKey: ['useGetSystemConfigByKeyQuery', key],
queryFn: async () => {
const response = await new Promise<ISystemConfig | undefined>((resolve, reject) => {
setTimeout(() => {
const config = mockData.find(item => item.key === key)
if (!config)
reject(new Error('Config not found'))
resolve(config)
}, 1000)
})
if (!response) {
throw new Error('Config not found')
}
return generateReturnData(response)
},
})
}
export function useUpdateSystemConfigByKeyMutation(key: string) {
// const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<IResponse<ISystemConfig>, AxiosError, ISystemConfig>({
mutationKey: ['useUpdateSystemConfigByKeyMutation', key],
mutationFn: async (data: ISystemConfig) => {
return await new Promise<IResponse<ISystemConfig>>((resolve) => {
setTimeout(() => {
resolve(generateReturnData(data))
}, 100)
},
)
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetSystemConfigByKeyQuery', key] })
},
})
}
export function useCreateSystemMutation() {
// const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<IResponse<ISystemConfig>, AxiosError, ISystemConfig>({
mutationKey: ['useCreateTaskMutation'],
mutationFn: async (data: ISystemConfig) => {
return new Promise<IResponse<ISystemConfig>>((resolve) => {
setTimeout(() => {
resolve(generateReturnData(data))
}, 100)
})
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetSystemConfigByKeyQuery'] })
},
})
}

View File

@@ -0,0 +1,83 @@
import type { AxiosError } from 'axios'
import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query'
import { useAxios } from '@/composables/use-axios'
import type { IResponse } from '../types/response.type'
export interface ITask {
title: string
description: string
status: 'pending' | 'in-progress' | 'completed'
}
export function useGetTasksQuery() {
const { axiosInstance } = useAxios()
return useQuery<IResponse<ITask[]>, AxiosError>({
queryKey: ['useGetTasksQuery'],
queryFn: async () => {
const response = await axiosInstance.get('/tasks')
return response.data
},
})
}
export function useGetTaskByIdQuery(id: number) {
const { axiosInstance } = useAxios()
return useQuery<IResponse<ITask>, AxiosError>({
queryKey: ['useGetTaskQuery', id],
queryFn: async () => {
const response = await axiosInstance.get(`/tasks/${id}`)
return response.data
},
})
}
export function useUpdateTaskMutation(id: number) {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<IResponse<boolean>, AxiosError, Partial<ITask>>({
mutationKey: ['useUpdateTaskMutation', id],
mutationFn: async (data: Partial<ITask>) => {
return await axiosInstance.put(`/tasks/${id}`, data)
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetTaskQuery', id] })
queryClient.invalidateQueries({ queryKey: ['useGetTasksQuery'] })
},
})
}
export function useCreateTaskMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<IResponse<ITask>, AxiosError, ITask>({
mutationKey: ['useCreateTaskMutation'],
mutationFn: async (data: ITask) => {
return await axiosInstance.post('/tasks', data)
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetTasksQuery'] })
},
})
}
export function useDeleteTaskMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<IResponse<boolean>, AxiosError, number>({
mutationKey: ['useDeleteTaskMutation'],
mutationFn: async (id: number) => {
return await axiosInstance.delete(`/tasks/${id}`)
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetTasksQuery'] })
},
})
}

View File

@@ -0,0 +1,378 @@
import type { AxiosError } from 'axios'
import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query'
import { useAxios } from '@/composables/use-axios'
// Types
export interface AdminLoginParams {
username: string
password: string
}
export interface AdminInfo {
id: number
username: string
nickname: string
role: number
}
export interface LoginResponse {
token: string
adminInfo: AdminInfo
}
export interface ApiResult<T> {
code: string
msg: string
data: T
}
export interface User {
id: number
username: string
nickname: string
phone: string
email: string
status: number
createTime: string
updateTime: string
}
export interface Coin {
id: number
code: string
name: string
price: number
priceType: number // 1: 实时 2: 手动
status: number
createTime: string
}
export interface OrderFund {
id: number
orderNo: string
userId: number
username: string
type: number // 1: 充值 2: 提现
amount: number
status: number // 1: 待审批 2: 已通过 3: 已驳回
createTime: string
rejectReason?: string
adminRemark?: string
}
export interface FinanceOverview {
totalDeposit: number
totalWithdraw: number
fundBalance: number
tradeValue: number
pendingCount: number
userCount: number
}
// Auth API
export function useAdminLoginMutation() {
const { axiosInstance } = useAxios()
return useMutation<ApiResult<LoginResponse>, AxiosError, AdminLoginParams>({
mutationKey: ['useAdminLoginMutation'],
mutationFn: async (params) => {
const response = await axiosInstance.post('/admin/login', params)
return response.data
},
})
}
// User Management API
export function useGetUserListQuery(params: { username?: string, status?: number, pageNum: number, pageSize: number }) {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{ list: User[], total: number }>, AxiosError>({
queryKey: ['useGetUserListQuery', params],
queryFn: async () => {
const response = await axiosInstance.get('/admin/user/list', { params })
return response.data
},
})
}
export function useGetUserDetailQuery(userId: number) {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<any>, AxiosError>({
queryKey: ['useGetUserDetailQuery', userId],
queryFn: async () => {
const response = await axiosInstance.get('/admin/user/detail', { params: { userId } })
return response.data
},
enabled: !!userId,
})
}
export function useUpdateUserStatusMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<ApiResult<void>, AxiosError, { userId: number, status: number }>({
mutationKey: ['useUpdateUserStatusMutation'],
mutationFn: async (params) => {
const response = await axiosInstance.post('/admin/user/status', params)
return response.data
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetUserListQuery'] })
},
})
}
// Coin Management API
export function useGetCoinListQuery() {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{ list: Coin[] }>, AxiosError>({
queryKey: ['useGetCoinListQuery'],
queryFn: async () => {
const response = await axiosInstance.get('/admin/coin/list')
return response.data
},
})
}
export function useSaveCoinMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<ApiResult<void>, AxiosError, Coin>({
mutationKey: ['useSaveCoinMutation'],
mutationFn: async (coin) => {
const response = await axiosInstance.post('/admin/coin/save', coin)
return response.data
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetCoinListQuery'] })
},
})
}
export function useUpdateCoinPriceMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<ApiResult<void>, AxiosError, { code: string, price: number }>({
mutationKey: ['useUpdateCoinPriceMutation'],
mutationFn: async (params) => {
const response = await axiosInstance.post('/admin/coin/price', params)
return response.data
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetCoinListQuery'] })
},
})
}
export function useUpdateCoinStatusMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<ApiResult<void>, AxiosError, { coinId: number, status: number }>({
mutationKey: ['useUpdateCoinStatusMutation'],
mutationFn: async (params) => {
const response = await axiosInstance.post('/admin/coin/status', params)
return response.data
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetCoinListQuery'] })
},
})
}
// Order Management API
export function useGetPendingOrdersQuery(params: { pageNum: number, pageSize: number }) {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{ list: OrderFund[], total: number }>, AxiosError>({
queryKey: ['useGetPendingOrdersQuery', params],
queryFn: async () => {
const response = await axiosInstance.get('/admin/order/pending', { params })
return response.data
},
})
}
export function useGetAllOrdersQuery(params: { type?: number, status?: number, pageNum: number, pageSize: number }) {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{ list: OrderFund[], total: number }>, AxiosError>({
queryKey: ['useGetAllOrdersQuery', params],
queryFn: async () => {
const response = await axiosInstance.get('/admin/order/list', { params })
return response.data
},
})
}
export function useApproveOrderMutation() {
const { axiosInstance } = useAxios()
const queryClient = useQueryClient()
return useMutation<ApiResult<void>, AxiosError, { orderNo: string, status: number, rejectReason?: string, adminRemark?: string }>({
mutationKey: ['useApproveOrderMutation'],
mutationFn: async (params) => {
const response = await axiosInstance.post('/admin/order/approve', params)
return response.data
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['useGetPendingOrdersQuery'] })
queryClient.invalidateQueries({ queryKey: ['useGetAllOrdersQuery'] })
},
})
}
// Finance Overview API
export function useGetFinanceOverviewQuery() {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<FinanceOverview>, AxiosError>({
queryKey: ['useGetFinanceOverviewQuery'],
queryFn: async () => {
const response = await axiosInstance.get('/admin/finance/overview')
return response.data
},
})
}
// ========== 分析相关 API ==========
// 盈利分析
export function useGetProfitAnalysisQuery(range: string = 'month') {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{
tradeFee: number
tradeFeeRate: string
fundFee: number
fundFeeRate: string
interestProfit: number
interestRate: string
totalProfit: number
}>, AxiosError>({
queryKey: ['useGetProfitAnalysisQuery', range],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/profit', { params: { range } })
return response.data
},
})
}
// 资金流动趋势
export function useGetCashFlowTrendQuery(months: number = 6) {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<Array<{
month: string
deposit: number
withdraw: number
netInflow: number
}>>, AxiosError>({
queryKey: ['useGetCashFlowTrendQuery', months],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/cash-flow', { params: { months } })
return response.data
},
})
}
// 交易分析
export function useGetTradeAnalysisQuery(range: string = 'week') {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{
buyAmount: number
buyCount: number
sellAmount: number
sellCount: number
netBuy: number
trend: Array<{ date: string, buy: number, sell: number }>
}>, AxiosError>({
queryKey: ['useGetTradeAnalysisQuery', range],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/trade', { params: { range } })
return response.data
},
})
}
// 币种交易分布
export function useGetCoinDistributionQuery(range: string = 'month') {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<Array<{
coinCode: string
coinName: string
amount: number
}>>, AxiosError>({
queryKey: ['useGetCoinDistributionQuery', range],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/coin-distribution', { params: { range } })
return response.data
},
})
}
// 用户增长分析
export function useGetUserGrowthQuery(months: number = 6) {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{
totalUsers: number
monthNewUsers: number
activeUsersToday: number
trend: Array<{ month: string, newUsers: number, activeUsers: number }>
}>, AxiosError>({
queryKey: ['useGetUserGrowthQuery', months],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/user-growth', { params: { months } })
return response.data
},
})
}
// 风险指标
export function useGetRiskMetricsQuery() {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{
largeTransactions: number
largeTransactionThreshold: string
abnormalWithdrawals: number
abnormalWithdrawalThreshold: string
pendingKyc: number
frozenAccounts: number
}>, AxiosError>({
queryKey: ['useGetRiskMetricsQuery'],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/risk')
return response.data
},
})
}
// 健康度评分
export function useGetHealthScoreQuery() {
const { axiosInstance } = useAxios()
return useQuery<ApiResult<{
overallScore: number
liquidityScore: number
riskScore: number
stabilityScore: number
grade: string
}>, AxiosError>({
queryKey: ['useGetHealthScoreQuery'],
queryFn: async () => {
const response = await axiosInstance.get('/admin/analysis/health')
return response.data
},
})
}