Files
makemd/dashboard/src/services/instanceDataSource.ts
wurenzhi 22308fe042 refactor: 重构项目结构并优化代码
- 删除无用的文件和错误日志
- 创建统一的 imports 模块集中管理依赖
- 重构组件使用新的 imports 方式
- 修复文档路径大小写问题
- 优化类型定义和接口导出
- 更新依赖版本
- 改进错误处理和API配置
- 统一组件导出方式
2026-03-27 16:56:06 +08:00

295 lines
7.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* [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);