Files
cunkebao_v3/Cunkebao/lib/migration/github-adapter.ts
笔记本里的永平 5ff15472f5 feat: 本次提交更新内容如下
场景获客列表搞定
2025-07-07 17:08:27 +08:00

233 lines
7.7 KiB
TypeScript
Raw 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.

"use client"
/**
* API路径映射 - 将GitHub项目的API路径映射到当前项目
*/
export const API_PATH_MAPPING = {
// GitHub项目 -> 当前项目
"/api/v1/scenarios": "/api/scenarios",
"/api/v1/devices": "/api/devices",
"/api/v1/wechat": "/api/wechat",
"/api/v1/traffic": "/api/traffic",
"/api/v1/content": "/api/content",
"/api/v1/auth": "/api/auth",
"/api/v1/dashboard": "/api/dashboard",
"/api/v1/analytics": "/api/analytics",
"/api/v1/upload": "/api/upload",
}
/**
* 数据格式适配器 - 将GitHub项目的数据格式适配到当前项目
*/
export class DataAdapter {
/**
* 适配场景数据格式
*/
static adaptScenarioData(githubData: any) {
return {
id: githubData.scenario_id || githubData.id,
name: githubData.scenario_name || githubData.name,
type: githubData.scenario_type || githubData.type,
status: githubData.scenario_status || githubData.status,
deviceCount: githubData.device_count || githubData.deviceCount || 0,
wechatCount: githubData.wechat_count || githubData.wechatCount || 0,
todayAcquisition: githubData.today_acquisition || githubData.todayAcquisition || 0,
totalAcquisition: githubData.total_acquisition || githubData.totalAcquisition || 0,
successRate: githubData.success_rate || githubData.successRate || 0,
createTime: githubData.create_time || githubData.createTime,
updateTime: githubData.update_time || githubData.updateTime,
lastRunTime: githubData.last_run_time || githubData.lastRunTime,
deviceNames: githubData.device_names || githubData.deviceNames || [],
tags: githubData.tags || [],
settings: githubData.settings || {},
}
}
/**
* 适配设备数据格式
*/
static adaptDeviceData(githubData: any) {
return {
id: githubData.device_id || githubData.id,
name: githubData.device_name || githubData.name,
type: githubData.device_type || githubData.type,
status: githubData.device_status || githubData.status,
platform: githubData.platform || "android",
version: githubData.version || "unknown",
battery: githubData.battery_level || githubData.battery || 0,
memory: githubData.memory_usage || githubData.memory || 0,
cpu: githubData.cpu_usage || githubData.cpu || 0,
network: githubData.network_status || githubData.network || "unknown",
location: githubData.location || "",
lastOnlineTime: githubData.last_online_time || githubData.lastOnlineTime,
createTime: githubData.create_time || githubData.createTime,
updateTime: githubData.update_time || githubData.updateTime,
}
}
/**
* 适配微信账号数据格式
*/
static adaptWechatData(githubData: any) {
return {
id: githubData.wechat_id || githubData.id,
nickname: githubData.wechat_nickname || githubData.nickname,
wxid: githubData.wechat_wxid || githubData.wxid,
phone: githubData.wechat_phone || githubData.phone,
avatar: githubData.wechat_avatar || githubData.avatar,
status: githubData.wechat_status || githubData.status,
deviceId: githubData.device_id || githubData.deviceId,
friendCount: githubData.friend_count || githubData.friendCount || 0,
groupCount: githubData.group_count || githubData.groupCount || 0,
todayAddCount: githubData.today_add_count || githubData.todayAddCount || 0,
addLimit: githubData.add_limit || githubData.addLimit || 50,
remainingQuota: githubData.remaining_quota || githubData.remainingQuota || 0,
lastLoginTime: githubData.last_login_time || githubData.lastLoginTime,
createTime: githubData.create_time || githubData.createTime,
updateTime: githubData.update_time || githubData.updateTime,
}
}
/**
* 适配流量池数据格式
*/
static adaptTrafficPoolData(githubData: any) {
return {
id: githubData.pool_id || githubData.id,
name: githubData.pool_name || githubData.name,
description: githubData.pool_description || githubData.description,
type: githubData.pool_type || githubData.type,
userCount: githubData.user_count || githubData.userCount || 0,
activeCount: githubData.active_count || githubData.activeCount || 0,
conversionRate: githubData.conversion_rate || githubData.conversionRate || 0,
tags: githubData.tags || [],
createTime: githubData.create_time || githubData.createTime,
updateTime: githubData.update_time || githubData.updateTime,
}
}
}
/**
* API请求适配器 - 将GitHub项目的API调用适配到当前项目
*/
export class ApiAdapter {
/**
* 适配API请求路径
*/
static adaptApiPath(githubPath: string): string {
return API_PATH_MAPPING[githubPath] || githubPath
}
/**
* 适配请求参数
*/
static adaptRequestParams(githubParams: any) {
// 将下划线命名转换为驼峰命名
const adaptedParams: any = {}
Object.keys(githubParams).forEach((key) => {
const camelKey = key.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())
adaptedParams[camelKey] = githubParams[key]
})
return adaptedParams
}
/**
* 适配响应数据
*/
static adaptResponseData(githubResponse: any) {
// GitHub项目的响应格式
if (githubResponse.status === "success" || githubResponse.code === 200) {
return {
code: 200,
message: githubResponse.message || "success",
data: githubResponse.data || githubResponse.result,
timestamp: Date.now(),
}
} else {
return {
code: githubResponse.code || 500,
message: githubResponse.message || "error",
data: null,
timestamp: Date.now(),
}
}
}
}
/**
* 组件适配器 - 将GitHub项目的Vue组件逻辑适配到React组件
*/
export class ComponentAdapter {
/**
* 适配Vue的data到React的useState
*/
static adaptVueDataToReactState(vueData: any) {
const stateInitializers: string[] = []
Object.keys(vueData).forEach((key) => {
const value = JSON.stringify(vueData[key])
stateInitializers.push(`const [${key}, set${key.charAt(0).toUpperCase() + key.slice(1)}] = useState(${value})`)
})
return stateInitializers.join("\n ")
}
/**
* 适配Vue的methods到React的函数
*/
static adaptVueMethodsToReactFunctions(vueMethods: any) {
const functions: string[] = []
Object.keys(vueMethods).forEach((methodName) => {
const methodBody = vueMethods[methodName].toString()
// 简单的转换实际项目中需要更复杂的AST转换
const adaptedMethod = methodBody
.replace(/this\./g, "")
.replace(/\$emit/g, "emit")
.replace(/\$router/g, "router")
functions.push(`const ${methodName} = ${adaptedMethod}`)
})
return functions.join("\n ")
}
/**
* 适配Vue的computed到React的useMemo
*/
static adaptVueComputedToReactMemo(vueComputed: any) {
const memoHooks: string[] = []
Object.keys(vueComputed).forEach((computedName) => {
const computedBody = vueComputed[computedName].toString()
const dependencies = this.extractDependencies(computedBody)
memoHooks.push(`const ${computedName} = useMemo(() => {
${computedBody.replace(/this\./g, "")}
}, [${dependencies.join(", ")}])`)
})
return memoHooks.join("\n ")
}
/**
* 提取依赖项(简化版本)
*/
private static extractDependencies(code: string): string[] {
const dependencies: string[] = []
const regex = /\b([a-zA-Z_$][a-zA-Z0-9_$]*)\b/g
let match
while ((match = regex.exec(code)) !== null) {
const variable = match[1]
if (!["return", "function", "const", "let", "var"].includes(variable)) {
dependencies.push(variable)
}
}
return [...new Set(dependencies)]
}
}