This commit is contained in:
dengqichen 2025-11-18 23:02:49 +08:00
parent 0b1b5da719
commit 2ec62ebb21
52 changed files with 683 additions and 145 deletions

View File

@ -1,85 +0,0 @@
const WindsurfAdapter = require('./sites/windsurf-adapter');
const logger = require('../shared/logger');
const BrowserManager = require('../tools/account-register/utils/browser-manager');
/**
* 自动化工厂 - 统一入口
*/
class AutomationFactory {
/**
* 使用 AdsPower 注册主要方法
*/
static async registerWithAdsPower(siteName, adspowerUserId) {
logger.info('AutomationFactory', `========================================`);
logger.info('AutomationFactory', `开始 ${siteName} 注册流程`);
logger.info('AutomationFactory', `AdsPower Profile: ${adspowerUserId}`);
logger.info('AutomationFactory', `========================================`);
const browserManager = new BrowserManager({
profileId: adspowerUserId,
siteName: 'AutomationFactory'
});
try {
// 1. 启动并连接到 AdsPower 浏览器
await browserManager.launch();
const browser = browserManager.browser;
const page = browserManager.page;
// 4. 创建上下文
const context = {
page,
browser,
logger,
data: {},
adspowerUserId
};
// 5. 创建适配器
let adapter;
switch (siteName.toLowerCase()) {
case 'windsurf':
adapter = new WindsurfAdapter(context);
break;
default:
throw new Error(`不支持的站点: ${siteName}`);
}
// 6. 执行自动化流程
logger.info('AutomationFactory', '开始执行自动化流程...');
const result = await adapter.execute();
// 7. 返回结果
return {
success: true,
siteName,
accountData: context.data.account,
cardInfo: context.data.card,
result
};
} catch (error) {
logger.error('AutomationFactory', `注册失败: ${error.message}`);
console.error(error);
return {
success: false,
error: error.message
};
} finally {
// 8. 关闭浏览器
try {
await browserManager.close();
} catch (e) {
logger.warn('AutomationFactory', `关闭浏览器失败: ${e.message}`);
}
}
}
}
module.exports = AutomationFactory;

View File

@ -92,6 +92,37 @@ if (registerTool) {
}); });
} }
// 注册automation-framework命令新框架
const autoTool = registry.get('automation-framework');
if (autoTool) {
const autoCommand = program
.command('auto')
.description('基于配置的自动化注册(新框架)')
.option('-s, --site <site>', '网站名称 (windsurf, etc)')
.option('-p, --profile-id <profileId>', 'AdsPower Profile ID')
.option('-o, --output <file>', '保存结果到文件')
.option('--no-validate-config', '跳过配置验证', false)
.option('--no-performance-report', '跳过性能报告', false)
.action(async (options) => {
await autoTool.execute(options);
});
// 添加子命令
autoCommand
.command('list')
.description('列出所有支持的网站')
.action(() => {
autoTool.listSites();
});
autoCommand
.command('validate <site>')
.description('验证站点配置文件')
.action((site) => {
autoTool.validateConfig(site);
});
}
// 列出所有工具 // 列出所有工具
program program
.command('list') .command('list')
@ -116,12 +147,17 @@ program.on('--help', () => {
console.log(' $ aam card -t unionpay -n 10 # 生成10张银联卡'); console.log(' $ aam card -t unionpay -n 10 # 生成10张银联卡');
console.log(' $ aam card list-types # 查看支持的卡类型'); console.log(' $ aam card list-types # 查看支持的卡类型');
console.log(''); console.log('');
console.log(' # 账号注册工具'); console.log(' # 账号注册工具(旧框架)');
console.log(' $ aam register -s windsurf --dry-run # 生成Windsurf账号数据'); console.log(' $ aam register -s windsurf --dry-run # 生成Windsurf账号数据');
console.log(' $ aam register -s windsurf # 执行Windsurf注册'); console.log(' $ aam register -s windsurf # 执行Windsurf注册');
console.log(' $ aam register list # 列出支持的网站'); console.log(' $ aam register list # 列出支持的网站');
console.log(' $ aam register generate # 生成通用账号数据'); console.log(' $ aam register generate # 生成通用账号数据');
console.log(''); console.log('');
console.log(' # 自动化框架(新框架 - 推荐)');
console.log(' $ aam auto -s windsurf -p k7g4ia4 # 使用新框架注册Windsurf');
console.log(' $ aam auto list # 列出支持的网站');
console.log(' $ aam auto validate windsurf # 验证配置文件');
console.log('');
console.log(' # 其他'); console.log(' # 其他');
console.log(' $ aam list # 列出所有工具'); console.log(' $ aam list # 列出所有工具');
console.log(''); console.log('');

View File

@ -0,0 +1,24 @@
/**
* Shared Errors - 通用错误类
*/
class ValidationError extends Error {
constructor(module, message) {
super(`[${module}] ${message}`);
this.name = 'ValidationError';
this.module = module;
}
}
class ConfigurationError extends Error {
constructor(module, message) {
super(`[${module}] ${message}`);
this.name = 'ConfigurationError';
this.module = module;
}
}
module.exports = {
ValidationError,
ConfigurationError
};

View File

@ -2,7 +2,7 @@
* Email Generator - 邮箱生成器 * Email Generator - 邮箱生成器
*/ */
const { randomInt } = require('../../../shared/utils'); const { randomInt } = require('../../utils');
class EmailGenerator { class EmailGenerator {
constructor() { constructor() {

View File

@ -3,12 +3,12 @@
* 统一的数据生成接口 * 统一的数据生成接口
*/ */
const EmailGenerator = require('./generators/email-generator'); const EmailGenerator = require('./email-generator');
const UsernameGenerator = require('./generators/username-generator'); const UsernameGenerator = require('./username-generator');
const PasswordGenerator = require('./generators/password-generator'); const PasswordGenerator = require('./password-generator');
const PhoneGenerator = require('./generators/phone-generator'); const PhoneGenerator = require('./phone-generator');
const NameGenerator = require('./generators/name-generator'); const NameGenerator = require('./name-generator');
const CardGenerator = require('../card-generator/generator'); const CardGenerator = require('../card-generator');
class AccountDataGenerator { class AccountDataGenerator {
constructor() { constructor() {

View File

@ -2,7 +2,7 @@
* Name Generator - 姓名生成器 * Name Generator - 姓名生成器
*/ */
const { randomInt } = require('../../../shared/utils'); const { randomInt } = require('../../utils');
class NameGenerator { class NameGenerator {
constructor() { constructor() {

View File

@ -2,7 +2,7 @@
* Password Generator - 密码生成器 * Password Generator - 密码生成器
*/ */
const { randomInt } = require('../../../shared/utils'); const { randomInt } = require('../../utils');
class PasswordGenerator { class PasswordGenerator {
constructor() { constructor() {

View File

@ -2,7 +2,7 @@
* Phone Generator - 手机号生成器 * Phone Generator - 手机号生成器
*/ */
const { randomInt, padZero } = require('../../../shared/utils'); const { randomInt, padZero } = require('../../utils');
class PhoneGenerator { class PhoneGenerator {
constructor() { constructor() {

View File

@ -2,7 +2,7 @@
* Username Generator - 用户名生成器 * Username Generator - 用户名生成器
*/ */
const { randomInt } = require('../../../shared/utils'); const { randomInt } = require('../../utils');
class UsernameGenerator { class UsernameGenerator {
constructor() { constructor() {

View File

@ -0,0 +1,118 @@
/**
* BaseLib - 所有共享库的基类
* 提供统一的接口日志配置管理
*/
const logger = require('../../logger');
class BaseLib {
/**
* @param {Object} config - 库配置
* @param {string} config.name - 库名称
* @param {string} config.version - 版本号
* @param {Object} config.options - 可选配置
*/
constructor(config = {}) {
// 验证必需配置
if (!config.name) {
throw new Error('Lib must have a name');
}
this.name = config.name;
this.version = config.version || '1.0.0';
this.options = config.options || {};
this.initialized = false;
// 注册到全局注册表
if (global.__libRegistry) {
global.__libRegistry.register(this);
}
}
/**
* 初始化库子类可重写
*/
async initialize() {
if (this.initialized) {
return;
}
this.log('info', `Initializing ${this.name} v${this.version}...`);
// 子类实现具体初始化逻辑
await this.onInitialize();
this.initialized = true;
this.log('info', `${this.name} initialized successfully`);
}
/**
* 子类重写此方法实现初始化逻辑
*/
async onInitialize() {
// 子类实现
}
/**
* 清理资源子类可重写
*/
async cleanup() {
this.log('info', `Cleaning up ${this.name}...`);
await this.onCleanup();
this.initialized = false;
}
/**
* 子类重写此方法实现清理逻辑
*/
async onCleanup() {
// 子类实现
}
/**
* 统一的日志方法
*/
log(level, message) {
const prefix = `[${this.name}]`;
logger[level](prefix, message);
}
/**
* 验证配置
*/
validateConfig(required = []) {
for (const key of required) {
if (!this.options[key]) {
throw new Error(`${this.name}: Missing required config: ${key}`);
}
}
}
/**
* 获取配置项
*/
getConfig(key, defaultValue = null) {
return this.options[key] !== undefined ? this.options[key] : defaultValue;
}
/**
* 设置配置项
*/
setConfig(key, value) {
this.options[key] = value;
}
/**
* 获取库信息
*/
getInfo() {
return {
name: this.name,
version: this.version,
initialized: this.initialized,
options: this.options
};
}
}
module.exports = BaseLib;

View File

@ -0,0 +1,91 @@
/**
* LibConfig - 库配置规范
* 定义所有库的标准配置接口
*/
/**
* 配置模式定义
*/
const CONFIG_SCHEMA = {
// 基础配置
base: {
name: { type: 'string', required: true },
version: { type: 'string', required: false, default: '1.0.0' },
description: { type: 'string', required: false },
author: { type: 'string', required: false }
},
// 运行时配置
runtime: {
logLevel: { type: 'string', required: false, default: 'info' },
timeout: { type: 'number', required: false, default: 30000 },
retries: { type: 'number', required: false, default: 3 }
}
};
/**
* 验证配置
*/
function validateLibConfig(config, schema = CONFIG_SCHEMA.base) {
const errors = [];
for (const [key, spec] of Object.entries(schema)) {
// 检查必需字段
if (spec.required && config[key] === undefined) {
errors.push(`Missing required field: ${key}`);
}
// 检查类型
if (config[key] !== undefined && typeof config[key] !== spec.type) {
errors.push(`Invalid type for ${key}: expected ${spec.type}, got ${typeof config[key]}`);
}
}
return {
valid: errors.length === 0,
errors
};
}
/**
* 应用默认配置
*/
function applyDefaults(config, schema = CONFIG_SCHEMA.base) {
const result = { ...config };
for (const [key, spec] of Object.entries(schema)) {
if (result[key] === undefined && spec.default !== undefined) {
result[key] = spec.default;
}
}
return result;
}
/**
* 创建库配置
*/
function createLibConfig(name, options = {}) {
const baseConfig = {
name,
...options
};
// 应用默认值
const config = applyDefaults(baseConfig);
// 验证配置
const validation = validateLibConfig(config);
if (!validation.valid) {
throw new Error(`Invalid lib config: ${validation.errors.join(', ')}`);
}
return config;
}
module.exports = {
CONFIG_SCHEMA,
validateLibConfig,
applyDefaults,
createLibConfig
};

View File

@ -0,0 +1,79 @@
/**
* LibRegistry - 全局库注册表
* 管理所有共享库的实例
*/
class LibRegistry {
constructor() {
this.libs = new Map();
}
/**
* 注册库
*/
register(lib) {
if (this.libs.has(lib.name)) {
console.warn(`[LibRegistry] Library ${lib.name} already registered, replacing...`);
}
this.libs.set(lib.name, lib);
}
/**
* 获取库实例
*/
get(name) {
return this.libs.get(name);
}
/**
* 检查库是否已注册
*/
has(name) {
return this.libs.has(name);
}
/**
* 获取所有库
*/
getAll() {
return Array.from(this.libs.values());
}
/**
* 获取所有库的信息
*/
getAllInfo() {
return this.getAll().map(lib => lib.getInfo());
}
/**
* 初始化所有库
*/
async initializeAll() {
const libs = this.getAll();
for (const lib of libs) {
if (!lib.initialized) {
await lib.initialize();
}
}
}
/**
* 清理所有库
*/
async cleanupAll() {
const libs = this.getAll();
for (const lib of libs) {
if (lib.initialized) {
await lib.cleanup();
}
}
}
}
// 创建全局单例
if (!global.__libRegistry) {
global.__libRegistry = new LibRegistry();
}
module.exports = global.__libRegistry;

View File

@ -5,7 +5,7 @@
const puppeteer = require('puppeteer'); const puppeteer = require('puppeteer');
const axios = require('axios'); const axios = require('axios');
const logger = require('../../../shared/logger'); const logger = require('../../logger');
class BrowserManager { class BrowserManager {
constructor(options = {}) { constructor(options = {}) {

View File

@ -4,7 +4,7 @@
*/ */
const axios = require('axios'); const axios = require('axios');
const logger = require('../../../shared/logger'); const logger = require('../../logger');
class CapSolverAPI { class CapSolverAPI {
constructor(apiKey) { constructor(apiKey) {

View File

@ -3,7 +3,7 @@
* 通用的Cloudflare人机验证处理支持全自动和半自动模式 * 通用的Cloudflare人机验证处理支持全自动和半自动模式
*/ */
const logger = require('../../../shared/logger'); const logger = require('../../logger');
class CloudflareHandler { class CloudflareHandler {
/** /**

View File

@ -24,7 +24,7 @@
* }); * });
*/ */
const logger = require('../../../shared/logger'); const logger = require('../../logger');
class HCaptchaSolver { class HCaptchaSolver {
constructor(options = {}) { constructor(options = {}) {

View File

@ -3,7 +3,7 @@
* 用于使自动化操作更像真实用户 * 用于使自动化操作更像真实用户
*/ */
const { randomInt } = require('../../../shared/utils'); const { randomInt } = require('../../utils');
class HumanBehavior { class HumanBehavior {
/** /**

View File

@ -1,5 +1,5 @@
const axios = require('axios'); const axios = require('axios');
const logger = require('../../../shared/logger'); const logger = require('../../logger');
/** /**
* YesCaptcha API 封装 * YesCaptcha API 封装

View File

@ -2,9 +2,9 @@
* Card Generator - 核心生成逻辑 * Card Generator - 核心生成逻辑
*/ */
const { randomInt, randomDigits, padZero, generateLuhnNumber } = require('../../shared/utils'); const { randomInt, randomDigits, padZero, generateLuhnNumber } = require('../../utils');
const { CARD_TYPES, EXPIRY_CONFIG } = require('./config'); const { CARD_TYPES, EXPIRY_CONFIG } = require('./config');
const { ValidationError } = require('../../shared/errors'); const { ValidationError } = require('../../errors');
class CardGenerator { class CardGenerator {
constructor() { constructor() {

View File

@ -0,0 +1,7 @@
/**
* Card Generator Lib - 导出接口
*/
const CardGenerator = require('./generator');
module.exports = CardGenerator;

View File

@ -2,7 +2,7 @@
* Account Repository - 账号数据访问层Repository 模式 * Account Repository - 账号数据访问层Repository 模式
*/ */
const logger = require('../../shared/logger'); const logger = require('../../logger');
class AccountRepository { class AccountRepository {
constructor(connection) { constructor(connection) {

View File

@ -3,7 +3,7 @@
*/ */
const mysql = require('mysql2/promise'); const mysql = require('mysql2/promise');
const logger = require('../../shared/logger'); const logger = require('../../logger');
const { connection: defaultConfig } = require('./config'); const { connection: defaultConfig } = require('./config');
class DatabaseConnection { class DatabaseConnection {

View File

@ -0,0 +1,44 @@
/**
* Database Lib - 数据库核心库
*/
const connection = require('./connection');
const AccountRepository = require('./account-repository');
module.exports = {
/**
* 初始化数据库连接
*/
async initialize(config) {
return await connection.initialize(config);
},
/**
* 获取连接
*/
getConnection() {
return connection;
},
/**
* 获取 Repository
*/
getRepository(name) {
const repositories = {
account: new AccountRepository(connection)
};
return repositories[name];
},
/**
* 关闭数据库连接
*/
async close() {
return await connection.close();
},
// 直接导出以便使用
connection,
AccountRepository
};

View File

@ -4,7 +4,7 @@
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const AccountDataGenerator = require('./generator'); const AccountDataGenerator = require('../../shared/libs/account-generator');
const logger = require('../../shared/logger'); const logger = require('../../shared/logger');
const { OUTPUT_FORMATS } = require('./config'); const { OUTPUT_FORMATS } = require('./config');

View File

@ -10,17 +10,17 @@
* ... 根据实际情况继续添加步骤 * ... 根据实际情况继续添加步骤
*/ */
const AccountDataGenerator = require('../generator'); const AccountDataGenerator = require('../../../shared/libs/account-generator');
const HumanBehavior = require('../utils/human-behavior'); const HumanBehavior = require('../../../shared/libs/browser/human-behavior');
const CloudflareHandler = require('../utils/cloudflare-handler'); const CloudflareHandler = require('../../../shared/libs/browser/cloudflare-handler');
const logger = require('../../../shared/logger'); const logger = require('../../../shared/logger');
const EmailVerificationService = require('../email-verification'); const EmailVerificationService = require('../email-verification');
const { DEFAULT_CONFIG } = require('../config'); const { DEFAULT_CONFIG } = require('../config');
const CardGenerator = require('../../card-generator/generator'); const CardGenerator = require('../../../shared/libs/card-generator');
const database = require('../../database'); const database = require('../../../shared/libs/database');
const CapSolverAPI = require('../utils/capsolver-api'); const CapSolverAPI = require('../../../shared/libs/browser/capsolver-api');
const YesCaptchaAPI = require('../utils/yescaptcha-api'); const YesCaptchaAPI = require('../../../shared/libs/browser/yescaptcha-api');
const BrowserManager = require('../utils/browser-manager'); const BrowserManager = require('../../../shared/libs/browser/browser-manager');
const { Solver } = require('2captcha-ts'); const { Solver } = require('2captcha-ts');
class WindsurfRegister { class WindsurfRegister {

View File

@ -0,0 +1,234 @@
/**
* Automation Framework Tool - 基于配置的自动化注册工具
*/
const fs = require('fs');
const path = require('path');
const logger = require('../../shared/logger');
const BrowserManager = require('../../shared/libs/browser/browser-manager');
const TOOL_NAME = 'automation-framework';
class AutomationFramework {
constructor() {
this.sites = new Map();
this.loadSites();
}
/**
* 加载所有站点适配器
*/
loadSites() {
const sitesDir = path.join(__dirname, 'sites');
try {
const files = fs.readdirSync(sitesDir);
files.forEach(file => {
if (file.endsWith('-adapter.js')) {
const siteName = file.replace('-adapter.js', '');
try {
const AdapterClass = require(path.join(sitesDir, file));
this.sites.set(siteName, AdapterClass);
logger.debug(TOOL_NAME, `Loaded site: ${siteName}`);
} catch (error) {
logger.warn(TOOL_NAME, `Failed to load site ${siteName}: ${error.message}`);
}
}
});
} catch (error) {
logger.warn(TOOL_NAME, `Failed to load sites: ${error.message}`);
}
}
/**
* 执行注册
*/
async execute(options) {
const { site, profileId } = options;
try {
if (!site) {
logger.error(TOOL_NAME, '请指定网站名称');
this.listSites();
process.exit(1);
}
if (!profileId) {
logger.error(TOOL_NAME, '请指定 AdsPower Profile ID');
process.exit(1);
}
const AdapterClass = this.sites.get(site);
if (!AdapterClass) {
logger.error(TOOL_NAME, `未知的网站: ${site}`);
this.listSites();
process.exit(1);
}
logger.info(TOOL_NAME, `========================================`);
logger.info(TOOL_NAME, `开始 ${site} 注册流程`);
logger.info(TOOL_NAME, `AdsPower Profile: ${profileId}`);
logger.info(TOOL_NAME, `========================================`);
// 启动浏览器
const browserManager = new BrowserManager({
profileId: profileId,
siteName: TOOL_NAME
});
await browserManager.launch();
const browser = browserManager.browser;
const page = browserManager.page;
// 创建上下文
const context = {
page,
browser,
logger,
data: {},
profileId,
validateConfig: options.validateConfig !== false,
performanceReport: options.performanceReport !== false
};
// 创建适配器并执行
const adapter = new AdapterClass(context);
const result = await adapter.execute();
// 关闭浏览器
await browserManager.close();
if (result.success) {
logger.success(TOOL_NAME, '注册流程完成');
// 保存结果
if (options.output) {
const outputData = {
site,
account: context.data.account,
card: context.data.card,
subscription: context.data.subscription,
timestamp: new Date().toISOString()
};
fs.writeFileSync(
options.output,
JSON.stringify(outputData, null, 2)
);
logger.success(TOOL_NAME, `结果已保存到: ${options.output}`);
}
}
// 返回兼容格式
return {
success: result.success,
siteName: site,
accountData: context.data.account,
cardInfo: context.data.card,
subscription: context.data.subscription,
result,
performance: result.performance
};
} catch (error) {
logger.error(TOOL_NAME, error.message);
console.error(error);
process.exit(1);
}
}
/**
* 列出支持的网站
*/
listSites() {
const sites = Array.from(this.sites.keys());
if (sites.length === 0) {
console.log('\n暂无可用网站\n');
return;
}
console.log('\n支持的网站:\n');
sites.forEach(site => {
console.log(` ${site}`);
});
console.log('');
}
/**
* 验证配置文件
*/
validateConfig(siteName) {
const ConfigValidator = require('./core/config-validator');
const yaml = require('js-yaml');
try {
const configPath = path.join(__dirname, 'configs/sites', `${siteName}.yaml`);
if (!fs.existsSync(configPath)) {
logger.error(TOOL_NAME, `配置文件不存在: ${siteName}.yaml`);
return;
}
const configContent = fs.readFileSync(configPath, 'utf8');
const config = yaml.load(configContent);
const validator = new ConfigValidator();
const result = validator.validate(config);
if (result.valid) {
logger.success(TOOL_NAME, `✓ 配置验证通过: ${siteName}`);
logger.info(TOOL_NAME, ` - 步骤数: ${config.workflow.length}`);
} else {
logger.error(TOOL_NAME, `✗ 配置验证失败: ${siteName}`);
result.errors.forEach(err => {
logger.error(TOOL_NAME, ` - ${err}`);
});
}
} catch (error) {
logger.error(TOOL_NAME, `验证失败: ${error.message}`);
}
}
}
/**
* 兼容旧接口静态方法
*/
class AutomationFactory {
/**
* 使用 AdsPower 注册兼容旧接口
*/
static async registerWithAdsPower(siteName, profileId, options = {}) {
const tool = new AutomationFramework();
return await tool.execute({
site: siteName,
profileId: profileId,
...options
});
}
}
module.exports = {
name: TOOL_NAME,
alias: 'auto',
description: '基于配置的自动化注册工具(新框架)',
execute: async (options) => {
const tool = new AutomationFramework();
await tool.execute(options);
},
listSites: () => {
const tool = new AutomationFramework();
tool.listSites();
},
validateConfig: (siteName) => {
const tool = new AutomationFramework();
tool.validateConfig(siteName);
},
// 导出类以支持旧接口
AutomationFactory,
// 兼容旧的直接调用方式
registerWithAdsPower: AutomationFactory.registerWithAdsPower
};

View File

@ -1,6 +1,6 @@
const SiteAdapter = require('../core/site-adapter'); const SiteAdapter = require('../core/site-adapter');
const AccountDataGenerator = require('../../tools/account-register/generator'); const AccountDataGenerator = require('../../../shared/libs/account-generator');
const CardGenerator = require('../../tools/card-generator/generator'); const CardGenerator = require('../../../shared/libs/card-generator');
/** /**
* Windsurf 站点适配器 * Windsurf 站点适配器
@ -177,7 +177,7 @@ class WindsurfAdapter extends SiteAdapter {
this.log('info', '开始邮箱验证'); this.log('info', '开始邮箱验证');
// 导入邮箱服务 // 导入邮箱服务
const EmailVerificationService = require('../../tools/account-register/email-verification'); const EmailVerificationService = require('../../account-register/email-verification');
if (!this.emailService) { if (!this.emailService) {
this.emailService = new EmailVerificationService(); this.emailService = new EmailVerificationService();
} }
@ -468,7 +468,7 @@ class WindsurfAdapter extends SiteAdapter {
try { try {
// 导入数据库模块 // 导入数据库模块
const database = require('../../tools/account-register/database'); const database = require('../../../shared/libs/database');
// 初始化数据库连接 // 初始化数据库连接
this.log('info', '连接数据库...'); this.log('info', '连接数据库...');

View File

@ -2,8 +2,8 @@
* Card Generator Tool - 工具入口 * Card Generator Tool - 工具入口
*/ */
const CardGenerator = require('./generator'); const CardGenerator = require('../../shared/libs/card-generator');
const Formatter = require('./formatter'); const Formatter = require('../../shared/libs/card-generator/formatter');
const logger = require('../../shared/logger'); const logger = require('../../shared/logger');
const TOOL_NAME = 'card-generator'; const TOOL_NAME = 'card-generator';

View File

@ -1,37 +1,27 @@
/** /**
* Database Tool - 数据库工具入口 * Database Tool - 数据库工具入口
* 直接导出 shared/libs/database 并添加工具元信息
*/ */
const connection = require('./connection'); const database = require('../../shared/libs/database');
const AccountRepository = require('./account-repository');
module.exports = { module.exports = {
name: 'database', name: 'database',
alias: 'db', alias: 'db',
description: 'MySQL数据库工具', description: 'MySQL数据库工具',
/** // 导出所有数据库功能
* 初始化数据库连接 ...database,
*/
async initialize(config) {
return await connection.initialize(config);
},
/** /**
* 获取 Repository * 执行数据库命令CLI 入口
*/ */
getRepository(name) { execute: async (options) => {
const repositories = { // 未来可以添加 CLI 命令,如:
account: new AccountRepository(connection) // aam db init - 初始化数据库
}; // aam db migrate - 运行迁移
// aam db seed - 填充测试数据
return repositories[name]; console.log('Database tool - 功能开发中');
}, console.log('使用 database.initialize() 初始化连接');
/**
* 关闭数据库连接
*/
async close() {
return await connection.close();
} }
}; };

View File

@ -3,7 +3,7 @@
* 测试新框架 * 测试新框架
*/ */
require('dotenv').config(); require('dotenv').config();
const AutomationFactory = require('./src/automation-framework'); const { AutomationFactory } = require('./src/tools/automation-framework');
const logger = require('./src/shared/logger'); const logger = require('./src/shared/logger');
async function test() { async function test() {