refactor: 重构项目结构并优化代码
- 删除无用的文件和错误日志 - 创建统一的 imports 模块集中管理依赖 - 重构组件使用新的 imports 方式 - 修复文档路径大小写问题 - 优化类型定义和接口导出 - 更新依赖版本 - 改进错误处理和API配置 - 统一组件导出方式
This commit is contained in:
294
dashboard/src/services/instanceDataSource.ts
Normal file
294
dashboard/src/services/instanceDataSource.ts
Normal file
@@ -0,0 +1,294 @@
|
||||
/**
|
||||
* [MOCK-INSTANCE] 实例购买模块DataSource
|
||||
* AI注意: 这是Mock实现,不是真实业务逻辑
|
||||
* 仅在USE_MOCK=true时启用 */
|
||||
|
||||
import { BaseDataSource, DataSourceFactory } from './baseDataSource';
|
||||
|
||||
// ============================================// 类型定义// ============================================
|
||||
|
||||
export interface InstanceType {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
icon: string;
|
||||
defaultConfig: InstanceConfig;
|
||||
priceMultiplier: number;
|
||||
recommended: boolean;
|
||||
popular: boolean;
|
||||
category: 'mini' | 'small' | 'medium' | 'large' | 'xlarge';
|
||||
cupSize: '小杯' | '中杯' | '大杯' | '超大杯' | '特大杯';
|
||||
}
|
||||
|
||||
export interface InstanceConfig {
|
||||
cpu: number; // CPU核心数
|
||||
memory: number; // 内存(GB)
|
||||
storage: number; // 存储(GB)
|
||||
bandwidth: number; // 带宽(Mbps)
|
||||
}
|
||||
|
||||
export interface InstancePrice {
|
||||
monthly: number;
|
||||
yearly: number;
|
||||
discount: number;
|
||||
}
|
||||
|
||||
export interface InstanceOrder {
|
||||
id: string;
|
||||
instanceType: string;
|
||||
config: InstanceConfig;
|
||||
billingCycle: 'monthly' | 'yearly';
|
||||
price: number;
|
||||
status: 'pending' | 'active' | 'cancelled';
|
||||
createdAt: string;
|
||||
expiresAt: string;
|
||||
}
|
||||
|
||||
export interface InstanceDataSource {
|
||||
getInstanceTypes(): Promise<InstanceType[]>;
|
||||
getInstanceConfigOptions(): Promise<{
|
||||
cpuOptions: number[];
|
||||
memoryOptions: number[];
|
||||
storageOptions: number[];
|
||||
bandwidthOptions: number[];
|
||||
}>;
|
||||
calculatePrice(instanceType: string, config: InstanceConfig, billingCycle: 'monthly' | 'yearly'): Promise<InstancePrice>;
|
||||
createOrder(instanceType: string, config: InstanceConfig, billingCycle: 'monthly' | 'yearly', paymentMethod: string): Promise<InstanceOrder>;
|
||||
getOrders(): Promise<InstanceOrder[]>;
|
||||
}
|
||||
|
||||
// ============================================// Mock数据// ============================================
|
||||
|
||||
const MOCK_INSTANCE_TYPES: InstanceType[] = [
|
||||
{
|
||||
id: 'mini',
|
||||
name: '小杯实例',
|
||||
description: '适合个人开发者和小型应用',
|
||||
icon: '🖥️',
|
||||
defaultConfig: {
|
||||
cpu: 1,
|
||||
memory: 2,
|
||||
storage: 50,
|
||||
bandwidth: 10
|
||||
},
|
||||
priceMultiplier: 1,
|
||||
recommended: false,
|
||||
popular: false,
|
||||
category: 'mini',
|
||||
cupSize: '小杯'
|
||||
},
|
||||
{
|
||||
id: 'small',
|
||||
name: '中杯实例',
|
||||
description: '适合小型团队和中等应用',
|
||||
icon: '💻',
|
||||
defaultConfig: {
|
||||
cpu: 2,
|
||||
memory: 4,
|
||||
storage: 100,
|
||||
bandwidth: 20
|
||||
},
|
||||
priceMultiplier: 2,
|
||||
recommended: false,
|
||||
popular: false,
|
||||
category: 'small',
|
||||
cupSize: '中杯'
|
||||
},
|
||||
{
|
||||
id: 'medium',
|
||||
name: '大杯实例',
|
||||
description: '适合中型团队和大型应用',
|
||||
icon: '🚀',
|
||||
defaultConfig: {
|
||||
cpu: 4,
|
||||
memory: 8,
|
||||
storage: 200,
|
||||
bandwidth: 50
|
||||
},
|
||||
priceMultiplier: 4,
|
||||
recommended: true,
|
||||
popular: true,
|
||||
category: 'medium',
|
||||
cupSize: '大杯'
|
||||
},
|
||||
{
|
||||
id: 'large',
|
||||
name: '超大杯实例',
|
||||
description: '适合大型企业和高负载应用',
|
||||
icon: '🛰️',
|
||||
defaultConfig: {
|
||||
cpu: 8,
|
||||
memory: 16,
|
||||
storage: 400,
|
||||
bandwidth: 100
|
||||
},
|
||||
priceMultiplier: 8,
|
||||
recommended: false,
|
||||
popular: false,
|
||||
category: 'large',
|
||||
cupSize: '超大杯'
|
||||
},
|
||||
{
|
||||
id: 'xlarge',
|
||||
name: '特大杯实例',
|
||||
description: '适合超大型企业和极高负载应用',
|
||||
icon: '⚡',
|
||||
defaultConfig: {
|
||||
cpu: 16,
|
||||
memory: 32,
|
||||
storage: 800,
|
||||
bandwidth: 200
|
||||
},
|
||||
priceMultiplier: 16,
|
||||
recommended: false,
|
||||
popular: false,
|
||||
category: 'xlarge',
|
||||
cupSize: '特大杯'
|
||||
}
|
||||
];
|
||||
|
||||
const MOCK_CONFIG_OPTIONS = {
|
||||
cpuOptions: [1, 2, 4, 8, 16],
|
||||
memoryOptions: [2, 4, 8, 16, 32, 64],
|
||||
storageOptions: [50, 100, 200, 400, 800, 1600],
|
||||
bandwidthOptions: [10, 20, 50, 100, 200]
|
||||
};
|
||||
|
||||
const BASE_PRICE = 99; // 小杯实例月付价格
|
||||
|
||||
// ============================================// 数据源实现// ============================================
|
||||
|
||||
export class InstanceDataSourceImpl extends BaseDataSource implements InstanceDataSource {
|
||||
async getInstanceTypes(): Promise<InstanceType[]> {
|
||||
try {
|
||||
await this.delay(300);
|
||||
return MOCK_INSTANCE_TYPES;
|
||||
} catch (error) {
|
||||
return this.handleError(error, []);
|
||||
}
|
||||
}
|
||||
|
||||
async getInstanceConfigOptions(): Promise<{
|
||||
cpuOptions: number[];
|
||||
memoryOptions: number[];
|
||||
storageOptions: number[];
|
||||
bandwidthOptions: number[];
|
||||
}> {
|
||||
try {
|
||||
await this.delay(200);
|
||||
return MOCK_CONFIG_OPTIONS;
|
||||
} catch (error) {
|
||||
return this.handleError(error, {
|
||||
cpuOptions: [],
|
||||
memoryOptions: [],
|
||||
storageOptions: [],
|
||||
bandwidthOptions: []
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async calculatePrice(instanceType: string, config: InstanceConfig, billingCycle: 'monthly' | 'yearly'): Promise<InstancePrice> {
|
||||
try {
|
||||
await this.delay(100);
|
||||
const instance = MOCK_INSTANCE_TYPES.find(t => t.id === instanceType);
|
||||
if (!instance) {
|
||||
throw new Error('Instance type not found');
|
||||
}
|
||||
|
||||
// 计算价格因子
|
||||
const cpuFactor = config.cpu / instance.defaultConfig.cpu;
|
||||
const memoryFactor = config.memory / instance.defaultConfig.memory;
|
||||
const storageFactor = config.storage / instance.defaultConfig.storage;
|
||||
const bandwidthFactor = config.bandwidth / instance.defaultConfig.bandwidth;
|
||||
|
||||
// 综合因子
|
||||
const totalFactor = (cpuFactor + memoryFactor + storageFactor + bandwidthFactor) / 4;
|
||||
const baseMonthlyPrice = BASE_PRICE * instance.priceMultiplier * totalFactor;
|
||||
|
||||
// 计算月付和年付价格
|
||||
const monthlyPrice = Math.round(baseMonthlyPrice);
|
||||
const yearlyPrice = Math.round(monthlyPrice * 12 * 0.8); // 年付8折
|
||||
const discount = 20; // 年付折扣百分比
|
||||
|
||||
return {
|
||||
monthly: monthlyPrice,
|
||||
yearly: yearlyPrice,
|
||||
discount
|
||||
};
|
||||
} catch (error) {
|
||||
return this.handleError(error, {
|
||||
monthly: 0,
|
||||
yearly: 0,
|
||||
discount: 0
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async createOrder(instanceType: string, config: InstanceConfig, billingCycle: 'monthly' | 'yearly', paymentMethod: string): Promise<InstanceOrder> {
|
||||
try {
|
||||
await this.delay(500);
|
||||
const price = await this.calculatePrice(instanceType, config, billingCycle);
|
||||
const orderId = `order-${Date.now()}`;
|
||||
const now = new Date();
|
||||
const expiresAt = new Date(now);
|
||||
expiresAt.setMonth(expiresAt.getMonth() + (billingCycle === 'yearly' ? 12 : 1));
|
||||
|
||||
return {
|
||||
id: orderId,
|
||||
instanceType,
|
||||
config,
|
||||
billingCycle,
|
||||
price: billingCycle === 'yearly' ? price.yearly : price.monthly,
|
||||
status: 'pending',
|
||||
createdAt: now.toISOString(),
|
||||
expiresAt: expiresAt.toISOString()
|
||||
};
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async getOrders(): Promise<InstanceOrder[]> {
|
||||
try {
|
||||
await this.delay(300);
|
||||
// 返回模拟订单数据
|
||||
return [
|
||||
{
|
||||
id: 'order-1',
|
||||
instanceType: 'medium',
|
||||
config: {
|
||||
cpu: 4,
|
||||
memory: 8,
|
||||
storage: 200,
|
||||
bandwidth: 50
|
||||
},
|
||||
billingCycle: 'monthly',
|
||||
price: 399,
|
||||
status: 'active',
|
||||
createdAt: '2026-02-01T00:00:00Z',
|
||||
expiresAt: '2026-03-01T00:00:00Z'
|
||||
},
|
||||
{
|
||||
id: 'order-2',
|
||||
instanceType: 'large',
|
||||
config: {
|
||||
cpu: 8,
|
||||
memory: 16,
|
||||
storage: 400,
|
||||
bandwidth: 100
|
||||
},
|
||||
billingCycle: 'yearly',
|
||||
price: 6384,
|
||||
status: 'active',
|
||||
createdAt: '2025-12-01T00:00:00Z',
|
||||
expiresAt: '2026-12-01T00:00:00Z'
|
||||
}
|
||||
];
|
||||
} catch (error) {
|
||||
return this.handleError(error, []);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const instanceDataSource = new InstanceDataSourceImpl();
|
||||
DataSourceFactory.register('instance', instanceDataSource);
|
||||
Reference in New Issue
Block a user