feat: 本次提交更新内容如下

存一版基础的
This commit is contained in:
笔记本里的永平
2025-07-10 15:05:10 +08:00
parent 306ed4c413
commit e9f5fd1613
6 changed files with 1306 additions and 858 deletions

View File

@@ -55,7 +55,7 @@
"clsx": "^2.1.1",
"cmdk": "1.0.4",
"crypto-js": "^4.2.0",
"date-fns": "latest",
"date-fns": "^4.1.0",
"embla-carousel-react": "8.5.1",
"input-otp": "1.4.1",
"lucide-react": "^0.525.0",
@@ -9224,7 +9224,7 @@
},
"node_modules/date-fns": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/date-fns/-/date-fns-4.1.0.tgz",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
"integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
"license": "MIT",
"funding": {

View File

@@ -50,7 +50,7 @@
"clsx": "^2.1.1",
"cmdk": "1.0.4",
"crypto-js": "^4.2.0",
"date-fns": "latest",
"date-fns": "^4.1.0",
"embla-carousel-react": "8.5.1",
"input-otp": "1.4.1",
"lucide-react": "^0.525.0",

View File

@@ -1,125 +1,174 @@
import { get, post, put, del } from './request';
import type { ApiResponse } from '@/types/common';
// 工作台任务类型
export enum WorkbenchTaskType {
MOMENTS_SYNC = 1, // 朋友圈同步
GROUP_PUSH = 2, // 社群推送
AUTO_LIKE = 3, // 自动点赞
AUTO_GROUP = 4, // 自动建群
TRAFFIC_DISTRIBUTION = 5, // 流量分发
}
// 工作台任务状态
export enum WorkbenchTaskStatus {
PENDING = 0, // 待处理
RUNNING = 1, // 运行中
PAUSED = 2, // 已暂停
COMPLETED = 3, // 已完成
FAILED = 4, // 失败
}
// 流量分发规则类型
export interface DistributionRule {
id: string;
name: string;
status: number;
deviceCount: number;
totalTraffic: number;
distributedTraffic: number;
lastDistributionTime: string;
createTime: string;
creator: string;
distributionInterval: number;
maxDistributionPerDay: number;
timeRange: { start: string; end: string };
targetChannels?: string[];
distributionRatio?: Record<string, number>;
priority?: 'high' | 'medium' | 'low';
filterConditions?: string[];
}
// 流量分发列表响应类型
export interface TrafficDistributionListResponse {
list: DistributionRule[];
total: number;
page: number;
limit: number;
}
/**
* 获取流量分发规则列表
* @param params 查询参数
* @returns 流量分发规则列表
*/
export const fetchDistributionRules = async (params: {
page?: number;
limit?: number;
keyword?: string;
} = {}): Promise<ApiResponse<TrafficDistributionListResponse>> => {
const { page = 1, limit = 10, keyword = "" } = params;
const queryParams = new URLSearchParams();
queryParams.append('type', WorkbenchTaskType.TRAFFIC_DISTRIBUTION.toString());
queryParams.append('page', page.toString());
queryParams.append('limit', limit.toString());
if (keyword) {
queryParams.append('keyword', keyword);
}
return get<ApiResponse<TrafficDistributionListResponse>>(`/v1/workbench/list?${queryParams.toString()}`);
};
/**
* 获取流量分发规则详情
* @param id 规则ID
* @returns 流量分发规则详情
*/
export const fetchDistributionRuleDetail = async (id: string): Promise<ApiResponse<DistributionRule>> => {
return get<ApiResponse<DistributionRule>>(`/v1/workbench/detail/${id}`);
};
/**
* 创建流量分发规则
* @param params 创建参数
* @returns 创建结果
*/
export const createDistributionRule = async (params: any): Promise<ApiResponse<{ id: string }>> => {
return post<ApiResponse<{ id: string }>>('/v1/workbench/create', {
...params,
type: WorkbenchTaskType.TRAFFIC_DISTRIBUTION
});
};
/**
* 更新流量分发规则
* @param id 规则ID
* @param params 更新参数
* @returns 更新结果
*/
export const updateDistributionRule = async (id: string, params: any): Promise<ApiResponse<any>> => {
return put<ApiResponse<any>>(`/v1/workbench/update/${id}`, {
...params,
type: WorkbenchTaskType.TRAFFIC_DISTRIBUTION
});
};
/**
* 删除流量分发规则
* @param id 规则ID
* @returns 删除结果
*/
export const deleteDistributionRule = async (id: string): Promise<ApiResponse<any>> => {
return del<ApiResponse<any>>(`/v1/workbench/delete/${id}`);
};
/**
* 启动/暂停流量分发规则
* @param id 规则ID
* @param status 状态1-启动0-暂停
* @returns 操作结果
*/
export const toggleDistributionRuleStatus = async (id: string, status: 0 | 1): Promise<ApiResponse<any>> => {
return post<ApiResponse<any>>('/v1/workbench/update-status', { id, status });
import { get, post, put, del } from './request';
import type { ApiResponse } from '@/types/common';
// 工作台任务类型
export enum WorkbenchTaskType {
MOMENTS_SYNC = 1, // 朋友圈同步
GROUP_PUSH = 2, // 社群推送
AUTO_LIKE = 3, // 自动点赞
AUTO_GROUP = 4, // 自动建群
TRAFFIC_DISTRIBUTION = 5, // 流量分发
}
// 工作台任务状态
export enum WorkbenchTaskStatus {
PENDING = 0, // 待处理
RUNNING = 1, // 运行中
PAUSED = 2, // 已暂停
COMPLETED = 3, // 已完成
FAILED = 4, // 失败
}
// 账号类型
export interface Account {
id: string;
userName: string;
realName: string;
nickname: string;
memo: string;
}
// 账号列表响应类型
export interface AccountListResponse {
list: Account[];
total: number;
page: number;
limit: number;
}
// 流量分发规则类型
export interface DistributionRule {
id: string;
name: string;
status: number;
deviceCount: number;
totalTraffic: number;
distributedTraffic: number;
lastDistributionTime: string;
createTime: string;
creator: string;
distributionInterval: number;
maxDistributionPerDay: number;
timeRange: { start: string; end: string };
targetChannels?: string[];
distributionRatio?: Record<string, number>;
priority?: 'high' | 'medium' | 'low';
filterConditions?: string[];
config?: {
total?: {
dailyAverage: number; // 日均分发量
deviceCount: number; // 分发设备
poolCount: string; // 流量池
totalAccounts: number; // 分发账户
totalUsers: number; // 总用户数
}
};
}
// 流量分发列表响应类型
export interface TrafficDistributionListResponse {
list: DistributionRule[];
total: number;
page: number;
limit: number;
}
/**
* 获取账号列表
* @param params 查询参数
* @returns 账号列表
*/
export const fetchAccountList = async (params: {
page?: number; // 页码
limit?: number; // 每页数量
keyword?: string; // 搜索关键词
} = {}): Promise<ApiResponse<AccountListResponse>> => {
const { page = 1, limit = 10, keyword = "" } = params;
const queryParams = new URLSearchParams();
queryParams.append('page', page.toString());
queryParams.append('limit', limit.toString());
if (keyword) {
queryParams.append('keyword', keyword);
}
return get<ApiResponse<AccountListResponse>>(`/v1/workbench/account-list?${queryParams.toString()}`);
};
/**
* 获取流量分发规则列表
* @param params 查询参数
* @returns 流量分发规则列表
*/
export const fetchDistributionRules = async (params: {
page?: number;
limit?: number;
keyword?: string;
} = {}): Promise<ApiResponse<TrafficDistributionListResponse>> => {
const { page = 1, limit = 10, keyword = "" } = params;
const queryParams = new URLSearchParams();
queryParams.append('type', WorkbenchTaskType.TRAFFIC_DISTRIBUTION.toString());
queryParams.append('page', page.toString());
queryParams.append('limit', limit.toString());
if (keyword) {
queryParams.append('keyword', keyword);
}
return get<ApiResponse<TrafficDistributionListResponse>>(`/v1/workbench/list?${queryParams.toString()}`);
};
/**
* 获取流量分发规则详情
* @param id 规则ID
* @returns 流量分发规则详情
*/
export const fetchDistributionRuleDetail = async (id: string): Promise<ApiResponse<DistributionRule>> => {
return get<ApiResponse<DistributionRule>>(`/v1/workbench/detail/${id}`);
};
/**
* 创建流量分发规则
* @param params 创建参数
* @returns 创建结果
*/
export const createDistributionRule = async (params: any): Promise<ApiResponse<{ id: string }>> => {
return post<ApiResponse<{ id: string }>>('/v1/workbench/create', {
...params,
type: WorkbenchTaskType.TRAFFIC_DISTRIBUTION
});
};
/**
* 更新流量分发规则
* @param id 规则ID
* @param params 更新参数
* @returns 更新结果
*/
export const updateDistributionRule = async (id: string, params: any): Promise<ApiResponse<any>> => {
return put<ApiResponse<any>>(`/v1/workbench/update/${id}`, {
...params,
type: WorkbenchTaskType.TRAFFIC_DISTRIBUTION
});
};
/**
* 删除流量分发规则
* @param id 规则ID
* @returns 删除结果
*/
export const deleteDistributionRule = async (id: string): Promise<ApiResponse<any>> => {
return del<ApiResponse<any>>(`/v1/workbench/delete/${id}`);
};
/**
* 启动/暂停流量分发规则
* @param id 规则ID
* @param status 状态1-启动0-暂停
* @returns 操作结果
*/
export const toggleDistributionRuleStatus = async (id: string, status: 0 | 1): Promise<ApiResponse<any>> => {
return post<ApiResponse<any>>('/v1/workbench/update-status', { id, status });
};

View File

@@ -336,26 +336,26 @@ export default function TrafficDistribution() {
<div className="grid grid-cols-3 gap-4 mt-4 border-b pb-4">
<div className="text-center">
<div className="text-2xl font-semibold">{rule.deviceCount || 2}</div>
<div className="text-2xl font-semibold">{rule.config?.total?.totalAccounts || 2}</div>
<div className="text-xs text-gray-500"></div>
</div>
<div className="text-center">
<div className="text-2xl font-semibold">{rule.totalTraffic || 7}</div>
<div className="text-2xl font-semibold">{rule.config?.total?.deviceCount || 7}</div>
<div className="text-xs text-gray-500"></div>
</div>
<div className="text-center">
<div className="text-2xl font-semibold">ALL</div>
<div className="text-2xl font-semibold">{rule.config?.total?.totalAccounts || "ALL"}</div>
<div className="text-xs text-gray-500"></div>
</div>
</div>
<div className="grid grid-cols-2 gap-4 mt-4">
<div className="text-center">
<div className="text-2xl font-semibold">{rule.distributedTraffic || 119}</div>
<div className="text-2xl font-semibold">{rule.config?.total?.dailyAverage || 119}</div>
<div className="text-xs text-gray-500"></div>
</div>
<div className="text-center">
<div className="text-2xl font-semibold">{rule.totalTraffic || 2}</div>
<div className="text-2xl font-semibold">{rule.config?.total?.totalUsers || 2}</div>
<div className="text-xs text-gray-500"></div>
</div>
</div>

File diff suppressed because it is too large Load Diff