ss
Some checks failed
Deploy Website on push / Deploy Push Element Ftp (push) Waiting to run
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CI / CI OK (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Deploy Website on push / Rerun on failure (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
Some checks failed
Deploy Website on push / Deploy Push Element Ftp (push) Waiting to run
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CI / CI OK (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Deploy Website on push / Rerun on failure (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
This commit is contained in:
715
apps/web-antd/src/api/agent/agent.ts
Normal file
715
apps/web-antd/src/api/agent/agent.ts
Normal file
@@ -0,0 +1,715 @@
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace AgentApi {
|
||||
export interface AgentListItem {
|
||||
id: number;
|
||||
user_id: number;
|
||||
level_name: string;
|
||||
region: string;
|
||||
mobile: string;
|
||||
membership_expiry_time: string;
|
||||
balance: number;
|
||||
total_earnings: number;
|
||||
frozen_balance: number;
|
||||
withdrawn_amount: number;
|
||||
create_time: string;
|
||||
is_real_name_verified: boolean;
|
||||
real_name: string;
|
||||
id_card: string;
|
||||
real_name_status: 'approved' | 'pending' | 'rejected';
|
||||
}
|
||||
|
||||
export interface AgentList {
|
||||
total: number;
|
||||
items: AgentListItem[];
|
||||
}
|
||||
|
||||
export interface GetAgentListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
mobile?: string;
|
||||
region?: string;
|
||||
parent_agent_id?: number;
|
||||
id?: number;
|
||||
create_time_start?: string;
|
||||
create_time_end?: string;
|
||||
order_by?: string;
|
||||
order_type?: 'asc' | 'desc';
|
||||
}
|
||||
|
||||
export interface AgentLinkListItem {
|
||||
agent_id: number;
|
||||
product_name: string;
|
||||
price: number;
|
||||
link_identifier: string;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface AgentLinkList {
|
||||
total: number;
|
||||
items: AgentLinkListItem[];
|
||||
}
|
||||
|
||||
export interface GetAgentLinkListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id?: number;
|
||||
product_name?: string;
|
||||
link_identifier?: string;
|
||||
}
|
||||
|
||||
// 代理佣金相关接口
|
||||
export interface AgentCommissionListItem {
|
||||
id: number;
|
||||
agent_id: number;
|
||||
order_id: number;
|
||||
amount: number;
|
||||
product_name: string;
|
||||
status: number;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface AgentCommissionList {
|
||||
total: number;
|
||||
items: AgentCommissionListItem[];
|
||||
}
|
||||
|
||||
export interface GetAgentCommissionListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id?: number;
|
||||
order_id?: number;
|
||||
product_name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
// 代理奖励相关接口
|
||||
export interface AgentRewardListItem {
|
||||
id: number;
|
||||
agent_id: number;
|
||||
relation_agent_id: number;
|
||||
amount: number;
|
||||
type: string;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface AgentRewardList {
|
||||
total: number;
|
||||
items: AgentRewardListItem[];
|
||||
}
|
||||
|
||||
export interface GetAgentRewardListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id?: number;
|
||||
relation_agent_id?: number;
|
||||
type?: string;
|
||||
}
|
||||
|
||||
// 代理提现相关接口
|
||||
export interface AgentWithdrawalListItem {
|
||||
id: number;
|
||||
agent_id: number;
|
||||
withdraw_no: string;
|
||||
amount: number;
|
||||
actual_amount: number; // 实际到账金额(扣税后)
|
||||
tax_amount: number; // 扣税金额
|
||||
status: number;
|
||||
payee_account: string;
|
||||
remark: string;
|
||||
create_time: string;
|
||||
withdraw_type: number; // 提现类型:1-支付宝,2-银行卡
|
||||
bank_card_no?: string; // 银行卡号
|
||||
bank_name?: string; // 开户支行
|
||||
payee_name?: string; // 收款人姓名
|
||||
}
|
||||
|
||||
export interface AgentWithdrawalList {
|
||||
total: number;
|
||||
items: AgentWithdrawalListItem[];
|
||||
}
|
||||
|
||||
export interface GetAgentWithdrawalListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id?: number;
|
||||
status?: number;
|
||||
withdraw_no?: string;
|
||||
}
|
||||
|
||||
// 提现统计数据
|
||||
export interface WithdrawalStatistics {
|
||||
total_withdrawal_amount: number;
|
||||
today_withdrawal_amount: number;
|
||||
total_actual_amount: number;
|
||||
total_tax_amount: number;
|
||||
}
|
||||
|
||||
// 代理订单统计数据
|
||||
export interface AgentOrderStatistics {
|
||||
total_agent_order_count: number; // 总代理订单数
|
||||
today_agent_order_count: number; // 今日代理订单数
|
||||
}
|
||||
|
||||
// 代理统计数据
|
||||
export interface AgentStatistics {
|
||||
total_agent_count: number; // 总代理数
|
||||
today_agent_count: number; // 今日新增代理数
|
||||
}
|
||||
|
||||
// 代理链接产品统计项
|
||||
export interface AgentLinkProductStatisticsItem {
|
||||
product_name: string;
|
||||
link_count: number;
|
||||
}
|
||||
|
||||
// 代理链接产品统计响应
|
||||
export interface AgentLinkProductStatisticsResp {
|
||||
items: AgentLinkProductStatisticsItem[];
|
||||
}
|
||||
|
||||
// 代理链接产品统计请求参数
|
||||
export interface GetAgentLinkProductStatisticsParams {}
|
||||
|
||||
// 代理上级抽佣相关接口
|
||||
export interface AgentCommissionDeductionListItem {
|
||||
id: number;
|
||||
agent_id: number;
|
||||
deducted_agent_id: number;
|
||||
amount: number;
|
||||
product_name: string;
|
||||
type: 'cost' | 'pricing';
|
||||
status: number;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface AgentCommissionDeductionList {
|
||||
total: number;
|
||||
items: AgentCommissionDeductionListItem[];
|
||||
}
|
||||
|
||||
export interface GetAgentCommissionDeductionListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id?: number;
|
||||
product_name?: string;
|
||||
type?: 'cost' | 'pricing';
|
||||
status?: number;
|
||||
}
|
||||
|
||||
// 平台抽佣列表项
|
||||
export interface AgentPlatformDeductionListItem {
|
||||
id: number;
|
||||
agent_id: number;
|
||||
amount: number;
|
||||
type: 'cost' | 'pricing';
|
||||
status: number;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
// 平台抽佣列表响应
|
||||
export interface AgentPlatformDeductionList {
|
||||
total: number;
|
||||
items: AgentPlatformDeductionListItem[];
|
||||
}
|
||||
|
||||
// 获取平台抽佣列表参数
|
||||
export interface GetAgentPlatformDeductionListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id?: number;
|
||||
type?: 'cost' | 'pricing';
|
||||
status?: number;
|
||||
}
|
||||
|
||||
// 代理产品配置列表项
|
||||
export interface AgentProductionConfigItem {
|
||||
id: number;
|
||||
product_name: string;
|
||||
cost_price: number;
|
||||
price_range_min: number;
|
||||
price_range_max: number;
|
||||
pricing_standard: number;
|
||||
overpricing_ratio: number;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
// 代理产品配置列表响应
|
||||
export interface AgentProductionConfigList {
|
||||
total: number;
|
||||
items: AgentProductionConfigItem[];
|
||||
}
|
||||
|
||||
// 获取代理产品配置列表参数
|
||||
export interface GetAgentProductionConfigListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
product_name?: string;
|
||||
id?: number;
|
||||
}
|
||||
|
||||
// 更新代理产品配置参数
|
||||
export interface UpdateAgentProductionConfigParams {
|
||||
id: number;
|
||||
cost_price: number;
|
||||
price_range_min: number;
|
||||
price_range_max: number;
|
||||
pricing_standard: number;
|
||||
overpricing_ratio: number;
|
||||
}
|
||||
|
||||
// 更新代理产品配置响应
|
||||
export interface UpdateAgentProductionConfigResp {
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export interface MembershipRechargeOrderListItem {
|
||||
id: number;
|
||||
user_id: number;
|
||||
agent_id: number;
|
||||
level_name: string;
|
||||
amount: number;
|
||||
payment_method: 'alipay' | 'appleiap' | 'other' | 'wechat';
|
||||
order_no: string;
|
||||
platform_order_id: string;
|
||||
status: 'cancelled' | 'failed' | 'pending' | 'success';
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface GetMembershipRechargeOrderListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
user_id?: number;
|
||||
agent_id?: number;
|
||||
level_name?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface MembershipRechargeOrderList {
|
||||
total: number;
|
||||
items: MembershipRechargeOrderListItem[];
|
||||
}
|
||||
|
||||
// 代理会员配置相关接口
|
||||
export interface AgentMembershipConfigListItem {
|
||||
id: number;
|
||||
level_name: string;
|
||||
price: number;
|
||||
report_commission: number;
|
||||
lower_activity_reward: null | number;
|
||||
new_activity_reward: null | number;
|
||||
lower_standard_count: null | number;
|
||||
new_lower_standard_count: null | number;
|
||||
lower_withdraw_reward_ratio: null | number;
|
||||
lower_convert_vip_reward: null | number;
|
||||
lower_convert_svip_reward: null | number;
|
||||
exemption_amount: number;
|
||||
price_increase_max: null | number;
|
||||
price_ratio: null | number;
|
||||
price_increase_amount: null | number;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface GetAgentMembershipConfigListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
level_name?: string;
|
||||
}
|
||||
|
||||
// 代理会员配置编辑请求参数
|
||||
export interface UpdateAgentMembershipConfigParams {
|
||||
id: number; // 主键
|
||||
level_name: string; // 会员级别名称
|
||||
price: number; // 会员年费
|
||||
report_commission: number; // 直推报告收益
|
||||
lower_activity_reward?: null | number; // 下级活跃奖励金额
|
||||
new_activity_reward?: null | number; // 新增活跃奖励金额
|
||||
lower_standard_count?: null | number; // 活跃下级达标个数
|
||||
new_lower_standard_count?: null | number; // 新增活跃下级达标个数
|
||||
lower_withdraw_reward_ratio?: null | number; // 下级提现奖励比例
|
||||
lower_convert_vip_reward?: null | number; // 下级转化VIP奖励
|
||||
lower_convert_svip_reward?: null | number; // 下级转化SVIP奖励
|
||||
exemption_amount?: null | number; // 免责金额
|
||||
price_increase_max?: null | number; // 提价最高金额
|
||||
price_ratio?: null | number; // 提价区间收取比例
|
||||
price_increase_amount?: null | number; // 在原本成本上加价的金额
|
||||
}
|
||||
|
||||
// 代理钱包信息
|
||||
export interface AgentWalletInfo {
|
||||
balance: number; // 可用余额
|
||||
frozen_balance: number; // 冻结余额
|
||||
total_earnings: number; // 总收益
|
||||
}
|
||||
|
||||
// 修改代理钱包余额请求
|
||||
export interface UpdateAgentWalletBalanceReq {
|
||||
agent_id: number; // 代理ID
|
||||
amount: number; // 修改金额(正数增加,负数减少)
|
||||
}
|
||||
|
||||
// 修改代理钱包余额响应
|
||||
export interface UpdateAgentWalletBalanceResp {
|
||||
success: boolean; // 是否成功
|
||||
balance: number; // 修改后的余额
|
||||
}
|
||||
|
||||
// 代理钱包流水相关接口
|
||||
export interface WalletTransactionListItem {
|
||||
id: number;
|
||||
agent_id: number;
|
||||
transaction_type: string;
|
||||
amount: number;
|
||||
balance_before: number;
|
||||
balance_after: number;
|
||||
frozen_balance_before: number;
|
||||
frozen_balance_after: number;
|
||||
transaction_id?: string;
|
||||
related_user_id?: number;
|
||||
remark?: string;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface WalletTransactionList {
|
||||
total: number;
|
||||
items: WalletTransactionListItem[];
|
||||
}
|
||||
|
||||
export interface GetWalletTransactionListParams {
|
||||
page: number;
|
||||
pageSize: number;
|
||||
agent_id: number;
|
||||
transaction_type?: string;
|
||||
create_time_start?: string;
|
||||
create_time_end?: string;
|
||||
}
|
||||
|
||||
// 系统配置相关接口
|
||||
export interface SystemConfig {
|
||||
commission_safe_mode: boolean; // 佣金安全防御模式
|
||||
}
|
||||
|
||||
export interface UpdateSystemConfigReq {
|
||||
commission_safe_mode: boolean; // 佣金安全防御模式:true-冻结模式,false-直接结算模式
|
||||
}
|
||||
|
||||
export interface UpdateSystemConfigResp {
|
||||
success: boolean; // 是否成功
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理列表数据
|
||||
* @param params 查询参数
|
||||
*/
|
||||
async function getAgentList(params: AgentApi.GetAgentListParams) {
|
||||
return requestClient.get<AgentApi.AgentList>('/agent/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理推广链接列表
|
||||
*/
|
||||
async function getAgentLinkList(params: AgentApi.GetAgentLinkListParams) {
|
||||
return requestClient.get<AgentApi.AgentLinkList>('/agent/agent-link/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理佣金列表
|
||||
*/
|
||||
async function getAgentCommissionList(
|
||||
params: AgentApi.GetAgentCommissionListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.AgentCommissionList>(
|
||||
'/agent/agent-commission/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新代理佣金状态
|
||||
*/
|
||||
async function updateAgentCommissionStatus(
|
||||
id: number,
|
||||
status: number,
|
||||
) {
|
||||
return requestClient.post<{ success: boolean }>(
|
||||
'/agent/agent-commission/update-status',
|
||||
{
|
||||
id,
|
||||
status,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量解冻代理佣金
|
||||
*/
|
||||
async function batchUnfreezeAgentCommission(
|
||||
agentId?: number,
|
||||
) {
|
||||
return requestClient.post<{
|
||||
success: boolean;
|
||||
count: number;
|
||||
amount: number;
|
||||
}>('/agent/agent-commission/batch-unfreeze', {
|
||||
agent_id: agentId,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理奖励列表
|
||||
*/
|
||||
async function getAgentRewardList(params: AgentApi.GetAgentRewardListParams) {
|
||||
return requestClient.get<AgentApi.AgentRewardList>(
|
||||
'/agent/agent-reward/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理提现列表
|
||||
*/
|
||||
async function getAgentWithdrawalList(
|
||||
params: AgentApi.GetAgentWithdrawalListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.AgentWithdrawalList>(
|
||||
'/agent/agent-withdrawal/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理上级抽佣列表
|
||||
*/
|
||||
async function getAgentCommissionDeductionList(
|
||||
params: AgentApi.GetAgentCommissionDeductionListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.AgentCommissionDeductionList>(
|
||||
'/agent/agent-commission-deduction/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取平台抽佣列表
|
||||
*/
|
||||
async function getAgentPlatformDeductionList(
|
||||
params: AgentApi.GetAgentPlatformDeductionListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.AgentPlatformDeductionList>(
|
||||
'/agent/agent-platform-deduction/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理产品配置列表
|
||||
*/
|
||||
async function getAgentProductionConfigList(
|
||||
params: AgentApi.GetAgentProductionConfigListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.AgentProductionConfigList>(
|
||||
'/agent/agent-production-config/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新代理产品配置
|
||||
*/
|
||||
async function updateAgentProductionConfig(
|
||||
params: AgentApi.UpdateAgentProductionConfigParams,
|
||||
) {
|
||||
return requestClient.post<AgentApi.UpdateAgentProductionConfigResp>(
|
||||
'/agent/agent-production-config/update',
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会员充值订单列表
|
||||
*/
|
||||
async function getMembershipRechargeOrderList(
|
||||
params: AgentApi.GetMembershipRechargeOrderListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.MembershipRechargeOrderList>(
|
||||
'/agent/agent-membership-recharge-order/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理会员配置列表
|
||||
*/
|
||||
async function getAgentMembershipConfigList(
|
||||
params: AgentApi.GetAgentMembershipConfigListParams,
|
||||
) {
|
||||
return requestClient.get<{
|
||||
items: AgentApi.AgentMembershipConfigListItem[];
|
||||
total: number;
|
||||
}>('/agent/agent-membership-config/list', { params });
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新代理会员配置
|
||||
*/
|
||||
async function updateAgentMembershipConfig(
|
||||
params: AgentApi.UpdateAgentMembershipConfigParams,
|
||||
) {
|
||||
return requestClient.post<{ success: boolean }>(
|
||||
'/agent/agent-membership-config/update',
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 银行卡提现审核
|
||||
*/
|
||||
export interface ReviewBankCardWithdrawalParams {
|
||||
withdrawal_id: number;
|
||||
action: 1 | 2; // 1-确认, 2-拒绝
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
async function reviewBankCardWithdrawal(
|
||||
params: ReviewBankCardWithdrawalParams,
|
||||
) {
|
||||
return requestClient.post<{ success: boolean }>(
|
||||
'/agent/agent-withdrawal/bank-card/review',
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取提现统计数据
|
||||
*/
|
||||
async function getWithdrawalStatistics() {
|
||||
return requestClient.get<AgentApi.WithdrawalStatistics>(
|
||||
'/agent/agent-withdrawal/statistics',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理订单统计数据
|
||||
*/
|
||||
async function getAgentOrderStatistics() {
|
||||
return requestClient.get<AgentApi.AgentOrderStatistics>(
|
||||
'/agent/agent-order/statistics',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理统计数据
|
||||
*/
|
||||
async function getAgentStatistics() {
|
||||
return requestClient.get<AgentApi.AgentStatistics>(
|
||||
'/agent/statistics',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理链接产品统计数据
|
||||
*/
|
||||
async function getAgentLinkProductStatistics() {
|
||||
return requestClient.get<AgentApi.AgentLinkProductStatisticsResp>(
|
||||
'/agent/agent-link/product-statistics',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理钱包信息
|
||||
*/
|
||||
async function getAgentWallet(agentId: number) {
|
||||
return requestClient.get<AgentApi.AgentWalletInfo>(
|
||||
`/agent/wallet/${agentId}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改代理钱包余额
|
||||
*/
|
||||
async function updateAgentWalletBalance(params: AgentApi.UpdateAgentWalletBalanceReq) {
|
||||
return requestClient.post<AgentApi.UpdateAgentWalletBalanceResp>(
|
||||
'/agent/wallet/update-balance',
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取系统配置
|
||||
*/
|
||||
async function getSystemConfig() {
|
||||
return requestClient.get<AgentApi.SystemConfig>(
|
||||
'/agent/system-config',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新系统配置
|
||||
*/
|
||||
async function updateSystemConfig(params: AgentApi.UpdateSystemConfigReq) {
|
||||
return requestClient.post<AgentApi.UpdateSystemConfigResp>(
|
||||
'/agent/system-config',
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取代理钱包流水列表
|
||||
*/
|
||||
async function getWalletTransactionList(
|
||||
params: AgentApi.GetWalletTransactionListParams,
|
||||
) {
|
||||
return requestClient.get<AgentApi.WalletTransactionList>(
|
||||
'/agent/wallet-transaction/list',
|
||||
{ params },
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
export {
|
||||
batchUnfreezeAgentCommission,
|
||||
getAgentCommissionDeductionList,
|
||||
getAgentCommissionList,
|
||||
getAgentLinkList,
|
||||
getAgentLinkProductStatistics,
|
||||
getAgentList,
|
||||
getAgentMembershipConfigList,
|
||||
getAgentOrderStatistics,
|
||||
getAgentPlatformDeductionList,
|
||||
getAgentProductionConfigList,
|
||||
getAgentRewardList,
|
||||
getAgentStatistics,
|
||||
getAgentWallet,
|
||||
getAgentWithdrawalList,
|
||||
getMembershipRechargeOrderList,
|
||||
getWithdrawalStatistics,
|
||||
reviewBankCardWithdrawal,
|
||||
updateAgentCommissionStatus,
|
||||
updateAgentMembershipConfig,
|
||||
updateAgentProductionConfig,
|
||||
updateAgentWalletBalance,
|
||||
getSystemConfig,
|
||||
updateSystemConfig,
|
||||
getWalletTransactionList,
|
||||
};
|
||||
1
apps/web-antd/src/api/agent/index.ts
Normal file
1
apps/web-antd/src/api/agent/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './agent';
|
||||
52
apps/web-antd/src/api/core/auth.ts
Normal file
52
apps/web-antd/src/api/core/auth.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { baseRequestClient, requestClient } from '#/api/request';
|
||||
|
||||
export namespace AuthApi {
|
||||
/** 登录接口参数 */
|
||||
export interface LoginParams {
|
||||
password?: string;
|
||||
username?: string;
|
||||
}
|
||||
|
||||
/** 登录接口返回值 */
|
||||
export interface LoginResult {
|
||||
access_token: string;
|
||||
}
|
||||
|
||||
export interface RefreshTokenResult {
|
||||
data: string;
|
||||
status: number;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*/
|
||||
export async function loginApi(data: AuthApi.LoginParams) {
|
||||
return requestClient.post<AuthApi.LoginResult>('/auth/login', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新accessToken
|
||||
*/
|
||||
export async function refreshTokenApi() {
|
||||
return baseRequestClient.post<AuthApi.RefreshTokenResult>('/auth/refresh', {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
*/
|
||||
export async function logoutApi() {
|
||||
return baseRequestClient.post('/auth/logout', {
|
||||
withCredentials: true,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户权限码
|
||||
*/
|
||||
export async function getAccessCodesApi() {
|
||||
// return requestClient.get<string[]>('/auth/codes');
|
||||
return [];
|
||||
}
|
||||
3
apps/web-antd/src/api/core/index.ts
Normal file
3
apps/web-antd/src/api/core/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export * from './auth';
|
||||
export * from './menu';
|
||||
export * from './user';
|
||||
10
apps/web-antd/src/api/core/menu.ts
Normal file
10
apps/web-antd/src/api/core/menu.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import type { RouteRecordStringComponent } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
/**
|
||||
* 获取用户所有菜单
|
||||
*/
|
||||
export async function getAllMenusApi() {
|
||||
return requestClient.get<RouteRecordStringComponent[]>('/menu/all');
|
||||
}
|
||||
10
apps/web-antd/src/api/core/user.ts
Normal file
10
apps/web-antd/src/api/core/user.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import type { UserInfo } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
/**
|
||||
* 获取用户信息
|
||||
*/
|
||||
export async function getUserInfoApi() {
|
||||
return requestClient.get<UserInfo>('/user/info');
|
||||
}
|
||||
37
apps/web-antd/src/api/index.ts
Normal file
37
apps/web-antd/src/api/index.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
export * from './agent';
|
||||
export * from './core';
|
||||
export * from './notification';
|
||||
export * from './order';
|
||||
export * from './platform-user';
|
||||
export * from './product-manage';
|
||||
export * from './promotion';
|
||||
export * from './system';
|
||||
export interface ApiResponse<T = any> {
|
||||
code: number;
|
||||
data: T;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface PageResult<T> {
|
||||
items: T[];
|
||||
total: number;
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
$http: {
|
||||
delete<T = any>(url: string, config?: any): Promise<ApiResponse<T>>;
|
||||
get<T = any>(url: string, config?: any): Promise<ApiResponse<T>>;
|
||||
post<T = any>(
|
||||
url: string,
|
||||
data?: any,
|
||||
config?: any,
|
||||
): Promise<ApiResponse<T>>;
|
||||
put<T = any>(
|
||||
url: string,
|
||||
data?: any,
|
||||
config?: any,
|
||||
): Promise<ApiResponse<T>>;
|
||||
};
|
||||
}
|
||||
}
|
||||
105
apps/web-antd/src/api/notification/index.ts
Normal file
105
apps/web-antd/src/api/notification/index.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace NotificationApi {
|
||||
export interface NotificationItem {
|
||||
id: number;
|
||||
title: string;
|
||||
content?: string;
|
||||
notification_page: string;
|
||||
start_date: string;
|
||||
start_time: string;
|
||||
end_date: string;
|
||||
end_time: string;
|
||||
status: number;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface NotificationList {
|
||||
total: number;
|
||||
items: NotificationItem[];
|
||||
}
|
||||
|
||||
export interface CreateNotificationRequest {
|
||||
title: string;
|
||||
content: string;
|
||||
notification_page: string;
|
||||
start_date: string;
|
||||
start_time: string;
|
||||
end_date: string;
|
||||
end_time: string;
|
||||
status: 0 | 1;
|
||||
}
|
||||
|
||||
export interface CreateNotificationResponse {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface UpdateNotificationRequest
|
||||
extends Partial<CreateNotificationRequest> {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface UpdateNotificationResponse {
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export interface DeleteNotificationResponse {
|
||||
success: boolean;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取通知列表
|
||||
*/
|
||||
async function getNotificationList(params: Recordable<any>) {
|
||||
return requestClient.get<NotificationApi.NotificationList>(
|
||||
'/notification/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建通知
|
||||
*/
|
||||
async function createNotification(
|
||||
data: NotificationApi.CreateNotificationRequest,
|
||||
) {
|
||||
return requestClient.post<NotificationApi.CreateNotificationResponse>(
|
||||
'/notification/create',
|
||||
data,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新通知
|
||||
*/
|
||||
async function updateNotification(
|
||||
id: number,
|
||||
data: NotificationApi.UpdateNotificationRequest,
|
||||
) {
|
||||
return requestClient.put<NotificationApi.UpdateNotificationResponse>(
|
||||
`/notification/update/${id}`,
|
||||
data,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除通知
|
||||
*/
|
||||
async function deleteNotification(id: number) {
|
||||
return requestClient.delete<NotificationApi.DeleteNotificationResponse>(
|
||||
`/notification/delete/${id}`,
|
||||
);
|
||||
}
|
||||
|
||||
export {
|
||||
createNotification,
|
||||
deleteNotification,
|
||||
getNotificationList,
|
||||
updateNotification,
|
||||
};
|
||||
1
apps/web-antd/src/api/order/index.ts
Normal file
1
apps/web-antd/src/api/order/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './order';
|
||||
28
apps/web-antd/src/api/order/order-statistics.ts
Normal file
28
apps/web-antd/src/api/order/order-statistics.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace OrderStatisticsApi {
|
||||
// 订单统计数据项
|
||||
export interface OrderStatisticsItem {
|
||||
date: string; // 日期
|
||||
count: number; // 订单数量
|
||||
amount: number; // 订单金额
|
||||
}
|
||||
|
||||
// 订单统计响应
|
||||
export interface OrderStatisticsResponse {
|
||||
items: OrderStatisticsItem[];
|
||||
}
|
||||
|
||||
// 时间维度类型
|
||||
export type TimeDimension = 'day' | 'month' | 'year' | 'all';
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取订单统计数据
|
||||
* @param dimension 时间维度:day-日(当月1号到今天),month-月(今年1月到当月),year-年(过去5年),all-全部(按日统计)
|
||||
*/
|
||||
export function getOrderStatistics(dimension: OrderStatisticsApi.TimeDimension) {
|
||||
return requestClient.get<OrderStatisticsApi.OrderStatisticsResponse>('/order/statistics', {
|
||||
params: { dimension }
|
||||
});
|
||||
}
|
||||
102
apps/web-antd/src/api/order/order.ts
Normal file
102
apps/web-antd/src/api/order/order.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace OrderApi {
|
||||
export interface Order {
|
||||
id: number;
|
||||
order_no: string;
|
||||
platform_order_id: string;
|
||||
product_name: string;
|
||||
payment_platform: 'alipay' | 'appleiap' | 'wechat';
|
||||
payment_scene: 'app' | 'h5' | 'mini_program' | 'public_account';
|
||||
amount: number;
|
||||
sales_cost: number;
|
||||
status: 'closed' | 'failed' | 'paid' | 'pending' | 'refunded';
|
||||
query_state: 'cleaned' | 'failed' | 'pending' | 'processing' | 'success';
|
||||
create_time: string;
|
||||
pay_time: null | string;
|
||||
refund_time: null | string;
|
||||
is_promotion: 0 | 1;
|
||||
}
|
||||
|
||||
export interface OrderList {
|
||||
total: number;
|
||||
items: Order[];
|
||||
}
|
||||
|
||||
export interface RefundOrderRequest {
|
||||
refund_amount: number;
|
||||
refund_reason: string;
|
||||
}
|
||||
|
||||
export interface RefundOrderResponse {
|
||||
status: string;
|
||||
refund_no: string;
|
||||
amount: number;
|
||||
}
|
||||
|
||||
// 退款统计数据
|
||||
export interface RefundStatistics {
|
||||
total_refund_amount: number;
|
||||
today_refund_amount: number;
|
||||
}
|
||||
|
||||
// 收入统计数据
|
||||
export interface IncomeStatistics {
|
||||
total_revenue_amount: number;
|
||||
today_revenue_amount: number;
|
||||
total_profit_amount: number;
|
||||
today_profit_amount: number;
|
||||
}
|
||||
|
||||
// 订单来源统计数据
|
||||
export interface OrderSourceStatistics {
|
||||
product_name: string;
|
||||
order_count: number;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取订单列表数据
|
||||
*/
|
||||
async function getOrderList(params: Recordable<any>) {
|
||||
return requestClient.get<OrderApi.OrderList>('/order/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单退款
|
||||
* @param id 订单 ID
|
||||
* @param data 退款请求数据
|
||||
*/
|
||||
async function refundOrder(id: number, data: OrderApi.RefundOrderRequest) {
|
||||
return requestClient.post<OrderApi.RefundOrderResponse>(
|
||||
`/order/refund/${id}`,
|
||||
data,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取退款统计数据
|
||||
*/
|
||||
async function getRefundStatistics() {
|
||||
return requestClient.get<OrderApi.RefundStatistics>('/order/refund-statistics');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取收入统计数据
|
||||
*/
|
||||
async function getIncomeStatistics() {
|
||||
return requestClient.get<OrderApi.IncomeStatistics>('/order/revenue-statistics');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取订单来源统计数据
|
||||
*/
|
||||
async function getOrderSourceStatistics() {
|
||||
return requestClient.get<{ items: OrderApi.OrderSourceStatistics[] }>('/order/source-statistics');
|
||||
}
|
||||
|
||||
export { getOrderList, refundOrder, getRefundStatistics, getIncomeStatistics, getOrderSourceStatistics };
|
||||
184
apps/web-antd/src/api/order/query.ts
Normal file
184
apps/web-antd/src/api/order/query.ts
Normal file
@@ -0,0 +1,184 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace OrderQueryApi {
|
||||
export interface QueryItem {
|
||||
feature: Recordable<any>;
|
||||
data: Recordable<any>;
|
||||
}
|
||||
|
||||
export interface QueryDetail {
|
||||
id: number;
|
||||
order_id: number;
|
||||
user_id: number;
|
||||
product_name: string;
|
||||
query_params: Recordable<any>;
|
||||
query_data: QueryItem[];
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
query_state: string;
|
||||
}
|
||||
|
||||
export interface GetQueryDetailRequest {
|
||||
order_id: number;
|
||||
}
|
||||
|
||||
export interface GetQueryDetailResponse {
|
||||
id: number;
|
||||
order_id: number;
|
||||
user_id: number;
|
||||
product_name: string;
|
||||
query_params: Recordable<any>;
|
||||
query_data: QueryItem[];
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
query_state: string;
|
||||
}
|
||||
|
||||
// 清理日志相关接口定义
|
||||
export interface GetQueryCleanupLogListRequest {
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
status?: number;
|
||||
start_time?: string;
|
||||
end_time?: string;
|
||||
}
|
||||
|
||||
export interface QueryCleanupLogItem {
|
||||
id: number;
|
||||
cleanup_time: string;
|
||||
cleanup_before: string;
|
||||
status: number;
|
||||
affected_rows: number;
|
||||
error_msg: string;
|
||||
remark: string;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface GetQueryCleanupLogListResponse {
|
||||
total: number;
|
||||
items: QueryCleanupLogItem[];
|
||||
}
|
||||
|
||||
// 清理详情相关接口定义
|
||||
export interface GetQueryCleanupDetailListRequest {
|
||||
log_id: number;
|
||||
page?: number;
|
||||
page_size?: number;
|
||||
}
|
||||
|
||||
export interface QueryCleanupDetailItem {
|
||||
id: number;
|
||||
cleanup_log_id: number;
|
||||
query_id: number;
|
||||
order_id: number;
|
||||
user_id: number;
|
||||
product_id: number;
|
||||
query_state: string;
|
||||
create_time_old: string;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface GetQueryCleanupDetailListResponse {
|
||||
total: number;
|
||||
items: QueryCleanupDetailItem[];
|
||||
}
|
||||
|
||||
// 清理配置相关接口定义
|
||||
export interface GetQueryCleanupConfigListRequest {
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface QueryCleanupConfigItem {
|
||||
id: number;
|
||||
config_key: string;
|
||||
config_value: string;
|
||||
config_desc: string;
|
||||
status: number;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface GetQueryCleanupConfigListResponse {
|
||||
items: QueryCleanupConfigItem[];
|
||||
}
|
||||
|
||||
export interface UpdateQueryCleanupConfigRequest {
|
||||
id: number;
|
||||
config_value: string;
|
||||
status: number;
|
||||
}
|
||||
|
||||
export interface UpdateQueryCleanupConfigResponse {
|
||||
success: boolean;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取订单查询详情
|
||||
* @param orderId 订单ID
|
||||
*/
|
||||
async function getOrderQueryDetail(orderId: number) {
|
||||
return requestClient.get<OrderQueryApi.GetQueryDetailResponse>(
|
||||
`/query/detail/${orderId}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取清理日志列表
|
||||
*/
|
||||
async function getQueryCleanupLogList(
|
||||
params: OrderQueryApi.GetQueryCleanupLogListRequest,
|
||||
) {
|
||||
return requestClient.get<OrderQueryApi.GetQueryCleanupLogListResponse>(
|
||||
'/query/cleanup/logs',
|
||||
{ params },
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取清理详情列表
|
||||
* @param logId 清理日志ID
|
||||
*/
|
||||
async function getQueryCleanupDetailList(
|
||||
logId: number,
|
||||
params: Omit<OrderQueryApi.GetQueryCleanupDetailListRequest, 'log_id'>,
|
||||
) {
|
||||
return requestClient.get<OrderQueryApi.GetQueryCleanupDetailListResponse>(
|
||||
`/query/cleanup/details/${logId}`,
|
||||
{ params },
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取清理配置列表
|
||||
*/
|
||||
async function getQueryCleanupConfigList(
|
||||
params?: OrderQueryApi.GetQueryCleanupConfigListRequest,
|
||||
) {
|
||||
return requestClient.get<OrderQueryApi.GetQueryCleanupConfigListResponse>(
|
||||
'/query/cleanup/configs',
|
||||
{ params },
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新清理配置
|
||||
*/
|
||||
async function updateQueryCleanupConfig(
|
||||
data: OrderQueryApi.UpdateQueryCleanupConfigRequest,
|
||||
) {
|
||||
return requestClient.put<OrderQueryApi.UpdateQueryCleanupConfigResponse>(
|
||||
'/query/cleanup/config',
|
||||
data,
|
||||
);
|
||||
}
|
||||
|
||||
export {
|
||||
getOrderQueryDetail,
|
||||
getQueryCleanupConfigList,
|
||||
getQueryCleanupDetailList,
|
||||
getQueryCleanupLogList,
|
||||
updateQueryCleanupConfig,
|
||||
};
|
||||
53
apps/web-antd/src/api/platform-user/index.ts
Normal file
53
apps/web-antd/src/api/platform-user/index.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace PlatformUserApi {
|
||||
export interface PlatformUserItem {
|
||||
id: number;
|
||||
mobile: string;
|
||||
nickname: string;
|
||||
info: string;
|
||||
inside: number;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface PlatformUserList {
|
||||
total: number;
|
||||
items: PlatformUserItem[];
|
||||
}
|
||||
|
||||
export interface UpdatePlatformUserRequest {
|
||||
mobile: string;
|
||||
nickname: string;
|
||||
info: string;
|
||||
inside: number;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取平台用户列表数据
|
||||
*/
|
||||
async function getPlatformUserList(params: Recordable<any>) {
|
||||
return requestClient.get<PlatformUserApi.PlatformUserList>(
|
||||
'/platform_user/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新平台用户
|
||||
* @param id 用户 ID
|
||||
* @param data 用户数据
|
||||
*/
|
||||
async function updatePlatformUser(
|
||||
id: number,
|
||||
data: PlatformUserApi.UpdatePlatformUserRequest,
|
||||
) {
|
||||
return requestClient.put(`/platform_user/update/${id}`, data);
|
||||
}
|
||||
|
||||
export { getPlatformUserList, updatePlatformUser };
|
||||
140
apps/web-antd/src/api/product-manage/feature.ts
Normal file
140
apps/web-antd/src/api/product-manage/feature.ts
Normal file
@@ -0,0 +1,140 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace FeatureApi {
|
||||
export interface FeatureItem {
|
||||
id: number;
|
||||
api_id: string;
|
||||
name: string;
|
||||
cost_price: number;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface FeatureList {
|
||||
total: number;
|
||||
items: FeatureItem[];
|
||||
}
|
||||
|
||||
export interface CreateFeatureRequest {
|
||||
api_id: string;
|
||||
name: string;
|
||||
cost_price: number;
|
||||
}
|
||||
|
||||
export interface UpdateFeatureRequest {
|
||||
api_id?: string;
|
||||
name?: string;
|
||||
cost_price?: number;
|
||||
}
|
||||
|
||||
export interface FeatureExampleItem {
|
||||
id: number;
|
||||
feature_id: number;
|
||||
api_id: string;
|
||||
data: string;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface ConfigFeatureExampleRequest {
|
||||
feature_id: number;
|
||||
data: string;
|
||||
}
|
||||
|
||||
export interface ConfigFeatureExampleResponse {
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export interface GetFeatureExampleRequest {
|
||||
feature_id: number;
|
||||
}
|
||||
|
||||
export interface GetFeatureExampleResponse {
|
||||
id: number;
|
||||
feature_id: number;
|
||||
api_id: string;
|
||||
data: string;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模块列表数据
|
||||
*/
|
||||
async function getFeatureList(params: Recordable<any>) {
|
||||
return requestClient.get<FeatureApi.FeatureList>('/feature/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取模块详情
|
||||
* @param id 模块ID
|
||||
*/
|
||||
async function getFeatureDetail(id: number) {
|
||||
return requestClient.get<FeatureApi.FeatureItem>(`/feature/detail/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建模块
|
||||
* @param data 模块数据
|
||||
*/
|
||||
async function createFeature(data: FeatureApi.CreateFeatureRequest) {
|
||||
return requestClient.post<{ id: number }>('/feature/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新模块
|
||||
* @param id 模块ID
|
||||
* @param data 模块数据
|
||||
*/
|
||||
async function updateFeature(
|
||||
id: number,
|
||||
data: FeatureApi.UpdateFeatureRequest,
|
||||
) {
|
||||
return requestClient.put<{ success: boolean }>(`/feature/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除模块
|
||||
* @param id 模块ID
|
||||
*/
|
||||
async function deleteFeature(id: number) {
|
||||
return requestClient.delete<{ success: boolean }>(`/feature/delete/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置功能示例数据
|
||||
* @param data 示例数据配置
|
||||
*/
|
||||
async function configFeatureExample(
|
||||
data: FeatureApi.ConfigFeatureExampleRequest,
|
||||
) {
|
||||
return requestClient.post<FeatureApi.ConfigFeatureExampleResponse>(
|
||||
'/feature/config-example',
|
||||
data,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取功能示例数据
|
||||
* @param featureId 功能ID
|
||||
*/
|
||||
async function getFeatureExample(featureId: number) {
|
||||
return requestClient.get<FeatureApi.GetFeatureExampleResponse>(
|
||||
`/feature/example/${featureId}`,
|
||||
);
|
||||
}
|
||||
|
||||
export {
|
||||
configFeatureExample,
|
||||
createFeature,
|
||||
deleteFeature,
|
||||
getFeatureDetail,
|
||||
getFeatureExample,
|
||||
getFeatureList,
|
||||
updateFeature,
|
||||
};
|
||||
2
apps/web-antd/src/api/product-manage/index.ts
Normal file
2
apps/web-antd/src/api/product-manage/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from './feature';
|
||||
export * from './product';
|
||||
148
apps/web-antd/src/api/product-manage/product.ts
Normal file
148
apps/web-antd/src/api/product-manage/product.ts
Normal file
@@ -0,0 +1,148 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace ProductApi {
|
||||
export interface ProductItem {
|
||||
id: number;
|
||||
product_name: string;
|
||||
product_en: string;
|
||||
description: string;
|
||||
notes: string;
|
||||
cost_price: number;
|
||||
sell_price: number;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface ProductList {
|
||||
total: number;
|
||||
items: ProductItem[];
|
||||
}
|
||||
|
||||
export interface CreateProductRequest {
|
||||
product_name: string;
|
||||
product_en: string;
|
||||
description: string;
|
||||
notes?: string;
|
||||
cost_price: number;
|
||||
sell_price: number;
|
||||
}
|
||||
|
||||
export interface UpdateProductRequest {
|
||||
product_name?: string;
|
||||
product_en?: string;
|
||||
description?: string;
|
||||
notes?: string;
|
||||
cost_price?: number;
|
||||
sell_price?: number;
|
||||
}
|
||||
|
||||
export interface ProductFeatureListItem {
|
||||
id: number;
|
||||
product_id: number;
|
||||
feature_id: number;
|
||||
api_id: string;
|
||||
name: string;
|
||||
sort: number;
|
||||
enable: number;
|
||||
is_important: number;
|
||||
create_time: string;
|
||||
update_time: string;
|
||||
}
|
||||
|
||||
export interface ProductFeatureItem {
|
||||
feature_id: number;
|
||||
sort: number;
|
||||
enable: number;
|
||||
is_important: number;
|
||||
}
|
||||
|
||||
export interface UpdateProductFeaturesRequest {
|
||||
features: ProductFeatureItem[];
|
||||
}
|
||||
|
||||
export interface UpdateProductFeaturesResponse {
|
||||
success: boolean;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取产品列表数据
|
||||
*/
|
||||
async function getProductList(params: Recordable<any>) {
|
||||
return requestClient.get<ProductApi.ProductList>('/product/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取产品详情
|
||||
* @param id 产品ID
|
||||
*/
|
||||
async function getProductDetail(id: number) {
|
||||
return requestClient.get<ProductApi.ProductItem>(`/product/detail/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建产品
|
||||
* @param data 产品数据
|
||||
*/
|
||||
async function createProduct(data: ProductApi.CreateProductRequest) {
|
||||
return requestClient.post<{ id: number }>('/product/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新产品
|
||||
* @param id 产品ID
|
||||
* @param data 产品数据
|
||||
*/
|
||||
async function updateProduct(
|
||||
id: number,
|
||||
data: ProductApi.UpdateProductRequest,
|
||||
) {
|
||||
return requestClient.put<{ success: boolean }>(`/product/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除产品
|
||||
* @param id 产品ID
|
||||
*/
|
||||
async function deleteProduct(id: number) {
|
||||
return requestClient.delete<{ success: boolean }>(`/product/delete/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取产品功能列表
|
||||
* @param productId 产品ID
|
||||
*/
|
||||
async function getProductFeatureList(productId: number) {
|
||||
return requestClient.get<ProductApi.ProductFeatureListItem[]>(
|
||||
`/product/feature/list/${productId}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新产品功能关联
|
||||
* @param productId 产品ID
|
||||
* @param data 功能列表数据
|
||||
*/
|
||||
async function updateProductFeatures(
|
||||
productId: number,
|
||||
data: ProductApi.UpdateProductFeaturesRequest,
|
||||
) {
|
||||
return requestClient.put<{ success: boolean }>(
|
||||
`/product/feature/update/${productId}`,
|
||||
data,
|
||||
);
|
||||
}
|
||||
|
||||
export {
|
||||
createProduct,
|
||||
deleteProduct,
|
||||
getProductDetail,
|
||||
getProductFeatureList,
|
||||
getProductList,
|
||||
updateProduct,
|
||||
updateProductFeatures,
|
||||
};
|
||||
45
apps/web-antd/src/api/promotion/analytics.ts
Normal file
45
apps/web-antd/src/api/promotion/analytics.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace PromotionAnalyticsApi {
|
||||
export interface OverviewData {
|
||||
today_click_count: number;
|
||||
today_pay_count: number;
|
||||
today_pay_amount: number;
|
||||
total_click_count: number;
|
||||
total_pay_count: number;
|
||||
total_pay_amount: number;
|
||||
}
|
||||
|
||||
export interface TrendData {
|
||||
id: number;
|
||||
link_id: number;
|
||||
pay_amount: number;
|
||||
click_count: number;
|
||||
pay_count: number;
|
||||
stats_date: string;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取推广数据概览
|
||||
*/
|
||||
async function statsTotal() {
|
||||
return requestClient.get<PromotionAnalyticsApi.OverviewData>(
|
||||
'/promotion/stats/total',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取推广数据趋势
|
||||
* @param params 日期范围参数
|
||||
*/
|
||||
async function statsHistory(params: { end_date: string; start_date: string }) {
|
||||
return requestClient.get<PromotionAnalyticsApi.TrendData[]>(
|
||||
'/promotion/stats/history',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export { statsHistory, statsTotal };
|
||||
2
apps/web-antd/src/api/promotion/index.ts
Normal file
2
apps/web-antd/src/api/promotion/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from './analytics';
|
||||
export * from './link';
|
||||
67
apps/web-antd/src/api/promotion/link.ts
Normal file
67
apps/web-antd/src/api/promotion/link.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace PromotionLinkApi {
|
||||
export interface PromotionLinkItem {
|
||||
id: number;
|
||||
name: string;
|
||||
url: string;
|
||||
create_time: string;
|
||||
}
|
||||
|
||||
export interface PromotionLink {
|
||||
total: number;
|
||||
items: PromotionLinkItem[];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取推广链接列表数据
|
||||
*/
|
||||
async function getPromotionLinkList(params: Recordable<any>) {
|
||||
return requestClient.get<PromotionLinkApi.PromotionLink>(
|
||||
'/promotion/link/list',
|
||||
{
|
||||
params,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建推广链接
|
||||
* @param data 推广链接数据
|
||||
*/
|
||||
async function createPromotionLink(
|
||||
data: Omit<PromotionLinkApi.PromotionLinkItem, 'id'>,
|
||||
) {
|
||||
return requestClient.post('/promotion/link/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新推广链接
|
||||
*
|
||||
* @param id 推广链接 ID
|
||||
* @param data 推广链接数据
|
||||
*/
|
||||
async function updatePromotionLink(
|
||||
id: string,
|
||||
data: Omit<PromotionLinkApi.PromotionLinkItem, 'id'>,
|
||||
) {
|
||||
return requestClient.put(`/promotion/link/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除推广链接
|
||||
* @param id 推广链接 ID
|
||||
*/
|
||||
async function deletePromotionLink(id: string) {
|
||||
return requestClient.delete(`/promotion/link/delete/${id}`);
|
||||
}
|
||||
|
||||
export {
|
||||
createPromotionLink,
|
||||
deletePromotionLink,
|
||||
getPromotionLinkList,
|
||||
updatePromotionLink,
|
||||
};
|
||||
113
apps/web-antd/src/api/request.ts
Normal file
113
apps/web-antd/src/api/request.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
/**
|
||||
* 该文件可自行根据业务逻辑进行调整
|
||||
*/
|
||||
import type { RequestClientOptions } from '@vben/request';
|
||||
|
||||
import { useAppConfig } from '@vben/hooks';
|
||||
import { preferences } from '@vben/preferences';
|
||||
import {
|
||||
authenticateResponseInterceptor,
|
||||
defaultResponseInterceptor,
|
||||
errorMessageResponseInterceptor,
|
||||
RequestClient,
|
||||
} from '@vben/request';
|
||||
import { useAccessStore } from '@vben/stores';
|
||||
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
import { useAuthStore } from '#/store';
|
||||
|
||||
import { refreshTokenApi } from './core';
|
||||
|
||||
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
|
||||
|
||||
function createRequestClient(baseURL: string, options?: RequestClientOptions) {
|
||||
const client = new RequestClient({
|
||||
...options,
|
||||
baseURL,
|
||||
});
|
||||
|
||||
/**
|
||||
* 重新认证逻辑
|
||||
*/
|
||||
async function doReAuthenticate() {
|
||||
console.warn('Access token or refresh token is invalid or expired. ');
|
||||
const accessStore = useAccessStore();
|
||||
const authStore = useAuthStore();
|
||||
accessStore.setAccessToken(null);
|
||||
if (
|
||||
preferences.app.loginExpiredMode === 'modal' &&
|
||||
accessStore.isAccessChecked
|
||||
) {
|
||||
accessStore.setLoginExpired(true);
|
||||
} else {
|
||||
await authStore.logout();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新token逻辑
|
||||
*/
|
||||
async function doRefreshToken() {
|
||||
const accessStore = useAccessStore();
|
||||
const resp = await refreshTokenApi();
|
||||
const newToken = resp.data;
|
||||
accessStore.setAccessToken(newToken);
|
||||
return newToken;
|
||||
}
|
||||
|
||||
function formatToken(token: null | string) {
|
||||
return token ? `Bearer ${token}` : null;
|
||||
}
|
||||
|
||||
// 请求头处理
|
||||
client.addRequestInterceptor({
|
||||
fulfilled: async (config) => {
|
||||
const accessStore = useAccessStore();
|
||||
|
||||
config.headers.Authorization = formatToken(accessStore.accessToken);
|
||||
config.headers['Accept-Language'] = preferences.app.locale;
|
||||
return config;
|
||||
},
|
||||
});
|
||||
|
||||
// 处理返回的响应数据格式
|
||||
client.addResponseInterceptor(
|
||||
defaultResponseInterceptor({
|
||||
codeField: 'code',
|
||||
dataField: 'data',
|
||||
successCode: 200,
|
||||
}),
|
||||
);
|
||||
|
||||
// token过期的处理
|
||||
client.addResponseInterceptor(
|
||||
authenticateResponseInterceptor({
|
||||
client,
|
||||
doReAuthenticate,
|
||||
doRefreshToken,
|
||||
enableRefreshToken: preferences.app.enableRefreshToken,
|
||||
formatToken,
|
||||
}),
|
||||
);
|
||||
|
||||
// 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里
|
||||
client.addResponseInterceptor(
|
||||
errorMessageResponseInterceptor((msg: string, error) => {
|
||||
// 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg
|
||||
// 当前mock接口返回的错误字段是 error 或者 message
|
||||
const responseData = error?.response?.data ?? {};
|
||||
const errorMessage = responseData?.error ?? responseData?.msg ?? '';
|
||||
// 如果没有错误信息,则会根据状态码进行提示
|
||||
message.error(errorMessage || msg);
|
||||
}),
|
||||
);
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
export const requestClient = createRequestClient(apiURL, {
|
||||
responseReturn: 'data',
|
||||
});
|
||||
|
||||
export const baseRequestClient = new RequestClient({ baseURL: apiURL });
|
||||
165
apps/web-antd/src/api/system/api.ts
Normal file
165
apps/web-antd/src/api/system/api.ts
Normal file
@@ -0,0 +1,165 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace SystemApiApi {
|
||||
export interface SystemApiItem {
|
||||
id: number;
|
||||
role_id?: number;
|
||||
api_id?: number;
|
||||
api_name: string;
|
||||
api_code: string;
|
||||
method: string;
|
||||
url: string;
|
||||
status: 0 | 1;
|
||||
description?: string;
|
||||
create_time?: string;
|
||||
update_time?: string;
|
||||
}
|
||||
|
||||
export interface SystemApi {
|
||||
list: SystemApiItem[];
|
||||
total: number;
|
||||
}
|
||||
|
||||
export interface SystemApiAllResponse {
|
||||
items: SystemApiItem[];
|
||||
}
|
||||
|
||||
export interface SystemRoleApiResponse {
|
||||
items: null | SystemApiItem[];
|
||||
}
|
||||
|
||||
export interface RoleApiItem {
|
||||
id: number;
|
||||
role_id: number;
|
||||
api_id: number;
|
||||
api_name: string;
|
||||
api_code: string;
|
||||
method: string;
|
||||
url: string;
|
||||
status: 0 | 1;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface RoleApi {
|
||||
list: RoleApiItem[];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取API列表数据
|
||||
*/
|
||||
async function getApiList(params: Recordable<any>) {
|
||||
return requestClient.get<SystemApiApi.SystemApi>('/api/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取API详情
|
||||
* @param id API ID
|
||||
*/
|
||||
async function getApiDetail(id: number) {
|
||||
return requestClient.get<SystemApiApi.SystemApiItem>(`/api/detail/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建API
|
||||
* @param data API数据
|
||||
*/
|
||||
async function createApi(
|
||||
data: Omit<SystemApiApi.SystemApiItem, 'create_time' | 'id' | 'update_time'>,
|
||||
) {
|
||||
return requestClient.post('/api/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新API
|
||||
* @param id API ID
|
||||
* @param data API数据
|
||||
*/
|
||||
async function updateApi(
|
||||
id: number,
|
||||
data: Omit<SystemApiApi.SystemApiItem, 'create_time' | 'id' | 'update_time'>,
|
||||
) {
|
||||
return requestClient.put(`/api/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除API
|
||||
* @param id API ID
|
||||
*/
|
||||
async function deleteApi(id: number) {
|
||||
return requestClient.delete(`/api/delete/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新API状态
|
||||
* @param data.ids API ID数组
|
||||
* @param data.status 状态值
|
||||
*/
|
||||
async function batchUpdateApiStatus(data: { ids: number[]; status: 0 | 1 }) {
|
||||
return requestClient.put('/api/batch-update-status', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色API权限列表
|
||||
* @param roleId 角色ID
|
||||
*/
|
||||
async function getRoleApiList(roleId: number) {
|
||||
return requestClient.get<SystemApiApi.SystemRoleApiResponse>(
|
||||
`/role/${roleId}/api/list`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分配角色API权限
|
||||
* @param data.api_ids API ID数组
|
||||
* @param data.role_id 角色ID
|
||||
*/
|
||||
async function assignRoleApi(data: { api_ids: number[]; role_id: number }) {
|
||||
return requestClient.post('/role/api/assign', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除角色API权限
|
||||
* @param data.api_ids API ID数组
|
||||
* @param data.role_id 角色ID
|
||||
*/
|
||||
async function removeRoleApi(data: { api_ids: number[]; role_id: number }) {
|
||||
return requestClient.post('/role/api/remove', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新角色API权限(全量更新)
|
||||
* @param data.api_ids API ID数组
|
||||
* @param data.role_id 角色ID
|
||||
*/
|
||||
async function updateRoleApi(data: { api_ids: number[]; role_id: number }) {
|
||||
return requestClient.put('/role/api/update', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有API列表(用于权限分配)
|
||||
* @param params.status 状态过滤
|
||||
*/
|
||||
async function getAllApiList(params?: { status?: number }) {
|
||||
return requestClient.get<SystemApiApi.SystemApiAllResponse>('/api/all', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export {
|
||||
assignRoleApi,
|
||||
batchUpdateApiStatus,
|
||||
createApi,
|
||||
deleteApi,
|
||||
getAllApiList,
|
||||
getApiDetail,
|
||||
getApiList,
|
||||
getRoleApiList,
|
||||
removeRoleApi,
|
||||
updateApi,
|
||||
updateRoleApi,
|
||||
};
|
||||
54
apps/web-antd/src/api/system/dept.ts
Normal file
54
apps/web-antd/src/api/system/dept.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace SystemDeptApi {
|
||||
export interface SystemDept {
|
||||
[key: string]: any;
|
||||
children?: SystemDept[];
|
||||
id: string;
|
||||
name: string;
|
||||
remark?: string;
|
||||
status: 0 | 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部门列表数据
|
||||
*/
|
||||
async function getDeptList() {
|
||||
return requestClient.get<Array<SystemDeptApi.SystemDept>>(
|
||||
'/system/dept/list',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建部门
|
||||
* @param data 部门数据
|
||||
*/
|
||||
async function createDept(
|
||||
data: Omit<SystemDeptApi.SystemDept, 'children' | 'id'>,
|
||||
) {
|
||||
return requestClient.post('/system/dept', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新部门
|
||||
*
|
||||
* @param id 部门 ID
|
||||
* @param data 部门数据
|
||||
*/
|
||||
async function updateDept(
|
||||
id: string,
|
||||
data: Omit<SystemDeptApi.SystemDept, 'children' | 'id'>,
|
||||
) {
|
||||
return requestClient.put(`/system/dept/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除部门
|
||||
* @param id 部门 ID
|
||||
*/
|
||||
async function deleteDept(id: string) {
|
||||
return requestClient.delete(`/system/dept/${id}`);
|
||||
}
|
||||
|
||||
export { createDept, deleteDept, getDeptList, updateDept };
|
||||
5
apps/web-antd/src/api/system/index.ts
Normal file
5
apps/web-antd/src/api/system/index.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export * from './api';
|
||||
export * from './dept';
|
||||
export * from './menu';
|
||||
export * from './role';
|
||||
export * from './user';
|
||||
156
apps/web-antd/src/api/system/menu.ts
Normal file
156
apps/web-antd/src/api/system/menu.ts
Normal file
@@ -0,0 +1,156 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace SystemMenuApi {
|
||||
/** 徽标颜色集合 */
|
||||
export const BadgeVariants = [
|
||||
'default',
|
||||
'destructive',
|
||||
'primary',
|
||||
'success',
|
||||
'warning',
|
||||
] as const;
|
||||
/** 徽标类型集合 */
|
||||
export const BadgeTypes = ['dot', 'normal'] as const;
|
||||
/** 菜单类型集合 */
|
||||
export const MenuTypes = [
|
||||
'catalog',
|
||||
'menu',
|
||||
'embedded',
|
||||
'link',
|
||||
'button',
|
||||
] as const;
|
||||
/** 系统菜单 */
|
||||
export interface SystemMenu {
|
||||
[key: string]: any;
|
||||
/** 后端权限标识 */
|
||||
authCode: string;
|
||||
/** 子级 */
|
||||
children?: SystemMenu[];
|
||||
/** 组件 */
|
||||
component?: string;
|
||||
/** 菜单ID */
|
||||
id: string;
|
||||
/** 菜单元数据 */
|
||||
meta?: {
|
||||
/** 激活时显示的图标 */
|
||||
activeIcon?: string;
|
||||
/** 作为路由时,需要激活的菜单的Path */
|
||||
activePath?: string;
|
||||
/** 固定在标签栏 */
|
||||
affixTab?: boolean;
|
||||
/** 在标签栏固定的顺序 */
|
||||
affixTabOrder?: number;
|
||||
/** 徽标内容(当徽标类型为normal时有效) */
|
||||
badge?: string;
|
||||
/** 徽标类型 */
|
||||
badgeType?: (typeof BadgeTypes)[number];
|
||||
/** 徽标颜色 */
|
||||
badgeVariants?: (typeof BadgeVariants)[number];
|
||||
/** 在菜单中隐藏下级 */
|
||||
hideChildrenInMenu?: boolean;
|
||||
/** 在面包屑中隐藏 */
|
||||
hideInBreadcrumb?: boolean;
|
||||
/** 在菜单中隐藏 */
|
||||
hideInMenu?: boolean;
|
||||
/** 在标签栏中隐藏 */
|
||||
hideInTab?: boolean;
|
||||
/** 菜单图标 */
|
||||
icon?: string;
|
||||
/** 内嵌Iframe的URL */
|
||||
iframeSrc?: string;
|
||||
/** 是否缓存页面 */
|
||||
keepAlive?: boolean;
|
||||
/** 外链页面的URL */
|
||||
link?: string;
|
||||
/** 同一个路由最大打开的标签数 */
|
||||
maxNumOfOpenTab?: number;
|
||||
/** 无需基础布局 */
|
||||
noBasicLayout?: boolean;
|
||||
/** 是否在新窗口打开 */
|
||||
openInNewWindow?: boolean;
|
||||
/** 菜单排序 */
|
||||
order?: number;
|
||||
/** 额外的路由参数 */
|
||||
query?: Recordable<any>;
|
||||
/** 菜单标题 */
|
||||
title?: string;
|
||||
};
|
||||
/** 菜单名称 */
|
||||
name: string;
|
||||
/** 路由路径 */
|
||||
path: string;
|
||||
/** 父级ID */
|
||||
pid: string;
|
||||
/** 重定向 */
|
||||
redirect?: string;
|
||||
/** 菜单类型 */
|
||||
type: (typeof MenuTypes)[number];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取菜单数据列表
|
||||
*/
|
||||
async function getMenuList() {
|
||||
return requestClient.get<Array<SystemMenuApi.SystemMenu>>('/menu/list');
|
||||
}
|
||||
|
||||
async function isMenuNameExists(
|
||||
name: string,
|
||||
id?: SystemMenuApi.SystemMenu['id'],
|
||||
) {
|
||||
return requestClient.get<boolean>('/menu/name-exists', {
|
||||
params: { id, name },
|
||||
});
|
||||
}
|
||||
|
||||
async function isMenuPathExists(
|
||||
path: string,
|
||||
id?: SystemMenuApi.SystemMenu['id'],
|
||||
) {
|
||||
return requestClient.get<boolean>('/menu/path-exists', {
|
||||
params: { id, path },
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建菜单
|
||||
* @param data 菜单数据
|
||||
*/
|
||||
async function createMenu(
|
||||
data: Omit<SystemMenuApi.SystemMenu, 'children' | 'id'>,
|
||||
) {
|
||||
return requestClient.post('/menu/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新菜单
|
||||
*
|
||||
* @param id 菜单 ID
|
||||
* @param data 菜单数据
|
||||
*/
|
||||
async function updateMenu(
|
||||
id: string,
|
||||
data: Omit<SystemMenuApi.SystemMenu, 'children' | 'id'>,
|
||||
) {
|
||||
return requestClient.put(`/menu/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除菜单
|
||||
* @param id 菜单 ID
|
||||
*/
|
||||
async function deleteMenu(id: string) {
|
||||
return requestClient.delete(`/menu/delete/${id}`);
|
||||
}
|
||||
|
||||
export {
|
||||
createMenu,
|
||||
deleteMenu,
|
||||
getMenuList,
|
||||
isMenuNameExists,
|
||||
isMenuPathExists,
|
||||
updateMenu,
|
||||
};
|
||||
61
apps/web-antd/src/api/system/role.ts
Normal file
61
apps/web-antd/src/api/system/role.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace SystemRoleApi {
|
||||
export interface SystemRoleItem {
|
||||
id: number;
|
||||
role_name: string;
|
||||
role_code: string;
|
||||
description?: string;
|
||||
status: 0 | 1;
|
||||
sort: number;
|
||||
create_time: string;
|
||||
menu_ids: number[];
|
||||
}
|
||||
|
||||
export interface SystemRole {
|
||||
total: number;
|
||||
items: SystemRoleItem[];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色列表数据
|
||||
*/
|
||||
async function getRoleList(params: Recordable<any>) {
|
||||
return requestClient.get<SystemRoleApi.SystemRole>('/role/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建角色
|
||||
* @param data 角色数据
|
||||
*/
|
||||
async function createRole(data: Omit<SystemRoleApi.SystemRoleItem, 'id'>) {
|
||||
return requestClient.post('/role/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新角色
|
||||
*
|
||||
* @param id 角色 ID
|
||||
* @param data 角色数据
|
||||
*/
|
||||
async function updateRole(
|
||||
id: number,
|
||||
data: Omit<SystemRoleApi.SystemRoleItem, 'id'>,
|
||||
) {
|
||||
return requestClient.put(`/role/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除角色
|
||||
* @param id 角色 ID
|
||||
*/
|
||||
async function deleteRole(id: string) {
|
||||
return requestClient.delete(`/role/delete/${id}`);
|
||||
}
|
||||
|
||||
export { createRole, deleteRole, getRoleList, updateRole };
|
||||
64
apps/web-antd/src/api/system/user.ts
Normal file
64
apps/web-antd/src/api/system/user.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import type { Recordable } from '@vben/types';
|
||||
|
||||
import { requestClient } from '#/api/request';
|
||||
|
||||
export namespace SystemUserApi {
|
||||
export interface SystemUser {
|
||||
[key: string]: any;
|
||||
id: string;
|
||||
name: string;
|
||||
permissions: string[];
|
||||
remark?: string;
|
||||
status: 0 | 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色列表数据
|
||||
*/
|
||||
async function getUserList(params: Recordable<any>) {
|
||||
return requestClient.get<Array<SystemUserApi.SystemUser>>('/user/list', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建角色
|
||||
* @param data 角色数据
|
||||
*/
|
||||
async function createUser(data: Omit<SystemUserApi.SystemUser, 'id'>) {
|
||||
return requestClient.post('/user/create', data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新角色
|
||||
*
|
||||
* @param id 角色 ID
|
||||
* @param data 角色数据
|
||||
*/
|
||||
async function updateUser(
|
||||
id: string,
|
||||
data: Omit<SystemUserApi.SystemUser, 'id'>,
|
||||
) {
|
||||
return requestClient.put(`/user/update/${id}`, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除角色
|
||||
* @param id 角色 ID
|
||||
*/
|
||||
async function deleteUser(id: string) {
|
||||
return requestClient.delete(`/user/delete/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置用户密码
|
||||
* @param id 用户 ID
|
||||
* @param data 新密码数据
|
||||
* @param data.password 新密码
|
||||
*/
|
||||
async function resetPassword(id: string, data: { password: string }) {
|
||||
return requestClient.post(`/reset-password/${id}`, data);
|
||||
}
|
||||
|
||||
export { createUser, deleteUser, getUserList, resetPassword, updateUser };
|
||||
Reference in New Issue
Block a user