219 lines
7.5 KiB
JavaScript
219 lines
7.5 KiB
JavaScript
|
|
// 交互式数据库连接测试脚本
|
|||
|
|
// 验证4个核心模块的数据库连接和字段映射
|
|||
|
|
|
|||
|
|
const mysql = require('mysql2/promise');
|
|||
|
|
const readline = require('readline');
|
|||
|
|
|
|||
|
|
// 创建readline接口
|
|||
|
|
const rl = readline.createInterface({
|
|||
|
|
input: process.stdin,
|
|||
|
|
output: process.stdout
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 数据库配置
|
|||
|
|
let dbConfig = {
|
|||
|
|
host: 'localhost',
|
|||
|
|
port: 3306,
|
|||
|
|
user: 'root',
|
|||
|
|
password: '',
|
|||
|
|
database: 'wwjcloud'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 询问数据库密码
|
|||
|
|
function askPassword() {
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
rl.question('请输入MySQL root用户密码 (如果没有密码直接回车): ', (password) => {
|
|||
|
|
dbConfig.password = password;
|
|||
|
|
resolve();
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function testDatabaseConnection() {
|
|||
|
|
let connection;
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
console.log('🔌 正在连接数据库...');
|
|||
|
|
console.log(`📊 数据库: ${dbConfig.database}`);
|
|||
|
|
console.log(`🌐 主机: ${dbConfig.host}:${dbConfig.port}`);
|
|||
|
|
console.log(`👤 用户: ${dbConfig.user}`);
|
|||
|
|
|
|||
|
|
// 创建连接
|
|||
|
|
connection = await mysql.createConnection(dbConfig);
|
|||
|
|
console.log('✅ 数据库连接成功!');
|
|||
|
|
|
|||
|
|
// 测试查询各个模块的表结构
|
|||
|
|
await testAdminModule(connection);
|
|||
|
|
await testMemberModule(connection);
|
|||
|
|
await testRbacModule(connection);
|
|||
|
|
await testAuthModule(connection);
|
|||
|
|
|
|||
|
|
console.log('\n🎉 所有模块数据库测试完成!');
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('❌ 数据库连接失败:', error.message);
|
|||
|
|
console.log('\n💡 请检查:');
|
|||
|
|
console.log(' 1. MySQL服务是否启动');
|
|||
|
|
console.log(' 2. 数据库用户名密码是否正确');
|
|||
|
|
console.log(' 3. wwjcloud数据库是否存在');
|
|||
|
|
console.log(' 4. 端口3306是否被占用');
|
|||
|
|
} finally {
|
|||
|
|
if (connection) {
|
|||
|
|
await connection.end();
|
|||
|
|
console.log('🔌 数据库连接已关闭');
|
|||
|
|
}
|
|||
|
|
rl.close();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 测试Admin模块
|
|||
|
|
async function testAdminModule(connection) {
|
|||
|
|
console.log('\n📊 测试Admin模块...');
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 测试sys_user表
|
|||
|
|
const [users] = await connection.execute('SELECT COUNT(*) as count FROM sys_user WHERE is_del = 0');
|
|||
|
|
console.log(` ✅ sys_user表: ${users[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试sys_user_role表
|
|||
|
|
const [userRoles] = await connection.execute('SELECT COUNT(*) as count FROM sys_user_role WHERE delete_time = 0');
|
|||
|
|
console.log(` ✅ sys_user_role表: ${userRoles[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试sys_user_log表
|
|||
|
|
const [userLogs] = await connection.execute('SELECT COUNT(*) as count FROM sys_user_log');
|
|||
|
|
console.log(` ✅ sys_user_log表: ${userLogs[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试字段映射
|
|||
|
|
const [userFields] = await connection.execute('DESCRIBE sys_user');
|
|||
|
|
console.log(` 📋 sys_user表字段数量: ${userFields.length}`);
|
|||
|
|
|
|||
|
|
// 显示关键字段
|
|||
|
|
const keyFields = userFields.map(field => field.Field).filter(field =>
|
|||
|
|
['uid', 'username', 'password', 'real_name', 'status', 'is_del'].includes(field)
|
|||
|
|
);
|
|||
|
|
console.log(` 🔑 关键字段: ${keyFields.join(', ')}`);
|
|||
|
|
|
|||
|
|
// 显示所有字段
|
|||
|
|
const allFields = userFields.map(field => field.Field);
|
|||
|
|
console.log(` 📝 所有字段: ${allFields.join(', ')}`);
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error(` ❌ Admin模块测试失败: ${error.message}`);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 测试Member模块
|
|||
|
|
async function testMemberModule(connection) {
|
|||
|
|
console.log('\n👥 测试Member模块...');
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 测试member表
|
|||
|
|
const [members] = await connection.execute('SELECT COUNT(*) as count FROM member WHERE is_del = 0');
|
|||
|
|
console.log(` ✅ member表: ${members[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试member_address表
|
|||
|
|
const [addresses] = await connection.execute('SELECT COUNT(*) as count FROM member_address');
|
|||
|
|
console.log(` ✅ member_address表: ${addresses[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试member_level表
|
|||
|
|
const [levels] = await connection.execute('SELECT COUNT(*) as count FROM member_level');
|
|||
|
|
console.log(` ✅ member_level表: ${levels[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试字段映射
|
|||
|
|
const [memberFields] = await connection.execute('DESCRIBE member');
|
|||
|
|
console.log(` 📋 member表字段数量: ${memberFields.length}`);
|
|||
|
|
|
|||
|
|
// 显示关键字段
|
|||
|
|
const keyFields = memberFields.map(field => field.Field).filter(field =>
|
|||
|
|
['member_id', 'username', 'password', 'nickname', 'mobile', 'status', 'is_del'].includes(field)
|
|||
|
|
);
|
|||
|
|
console.log(` 🔑 关键字段: ${keyFields.join(', ')}`);
|
|||
|
|
|
|||
|
|
// 显示所有字段
|
|||
|
|
const allFields = memberFields.map(field => field.Field);
|
|||
|
|
console.log(` 📝 所有字段: ${allFields.join(', ')}`);
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error(` ❌ Member模块测试失败: ${error.message}`);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 测试RBAC模块
|
|||
|
|
async function testRbacModule(connection) {
|
|||
|
|
console.log('\n🔐 测试RBAC模块...');
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 测试sys_role表
|
|||
|
|
const [roles] = await connection.execute('SELECT COUNT(*) as count FROM sys_role');
|
|||
|
|
console.log(` ✅ sys_role表: ${roles[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试sys_menu表
|
|||
|
|
const [menus] = await connection.execute('SELECT COUNT(*) as count FROM sys_menu');
|
|||
|
|
console.log(` ✅ sys_menu表: ${menus[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试字段映射
|
|||
|
|
const [roleFields] = await connection.execute('DESCRIBE sys_role');
|
|||
|
|
console.log(` 📋 sys_role表字段数量: ${roleFields.length}`);
|
|||
|
|
|
|||
|
|
const [menuFields] = await connection.execute('DESCRIBE sys_menu');
|
|||
|
|
console.log(` 📋 sys_menu表字段数量: ${menuFields.length}`);
|
|||
|
|
|
|||
|
|
// 显示关键字段
|
|||
|
|
const roleKeyFields = roleFields.map(field => field.Field).filter(field =>
|
|||
|
|
['role_id', 'role_name', 'rules', 'status'].includes(field)
|
|||
|
|
);
|
|||
|
|
console.log(` 🔑 sys_role关键字段: ${roleKeyFields.join(', ')}`);
|
|||
|
|
|
|||
|
|
const menuKeyFields = menuFields.map(field => field.Field).filter(field =>
|
|||
|
|
['id', 'menu_name', 'menu_key', 'parent_key', 'status'].includes(field)
|
|||
|
|
);
|
|||
|
|
console.log(` 🔑 sys_menu关键字段: ${menuKeyFields.join(', ')}`);
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error(` ❌ RBAC模块测试失败: ${error.message}`);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 测试Auth模块
|
|||
|
|
async function testAuthModule(connection) {
|
|||
|
|
console.log('\n🔑 测试Auth模块...');
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// 检查auth_token表是否存在
|
|||
|
|
const [tables] = await connection.execute("SHOW TABLES LIKE 'auth_token'");
|
|||
|
|
|
|||
|
|
if (tables.length > 0) {
|
|||
|
|
// 测试auth_token表
|
|||
|
|
const [tokens] = await connection.execute('SELECT COUNT(*) as count FROM auth_token WHERE is_revoked = 0');
|
|||
|
|
console.log(` ✅ auth_token表: ${tokens[0].count} 条记录`);
|
|||
|
|
|
|||
|
|
// 测试字段映射
|
|||
|
|
const [tokenFields] = await connection.execute('DESCRIBE auth_token');
|
|||
|
|
console.log(` 📋 auth_token表字段数量: ${tokenFields.length}`);
|
|||
|
|
|
|||
|
|
// 显示关键字段
|
|||
|
|
const keyFields = tokenFields.map(field => field.Field).filter(field =>
|
|||
|
|
['id', 'token', 'user_id', 'user_type', 'expires_at'].includes(field)
|
|||
|
|
);
|
|||
|
|
console.log(` 🔑 关键字段: ${keyFields.join(', ')}`);
|
|||
|
|
} else {
|
|||
|
|
console.log(' ⚠️ auth_token表不存在,需要先运行测试数据脚本');
|
|||
|
|
console.log(' 📝 请运行: sql/test-data.sql 创建表和数据');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error(` ❌ Auth模块测试失败: ${error.message}`);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 主函数
|
|||
|
|
async function main() {
|
|||
|
|
console.log('🚀 WWJ Cloud 核心模块数据库测试');
|
|||
|
|
console.log('=====================================');
|
|||
|
|
|
|||
|
|
await askPassword();
|
|||
|
|
await testDatabaseConnection();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 运行测试
|
|||
|
|
main();
|