feat: 完成易经64卦数据补全和本地化改造

- 完全按照logic/yijing.txt补全所有64卦的完整数据结构
- 包含每卦的卦辞、象传、六爻详解和人生指导
- 重建八字、易经、紫微斗数三个核心分析器
- 实现完整的本地SQLite数据库替代Supabase
- 添加本地Express.js后端服务器
- 更新前端API调用为本地接口
- 实现JWT本地认证系统
- 完善历史记录和用户管理功能
This commit is contained in:
patdelphi
2025-08-18 22:34:39 +08:00
parent 29bc9d8c4a
commit d9c57dedb7
53 changed files with 6493 additions and 498 deletions

View File

@@ -0,0 +1,196 @@
const { dbManager } = require('../database/index.cjs');
const path = require('path');
const fs = require('fs');
// 数据库初始化脚本
async function initializeDatabase() {
try {
console.log('🚀 开始初始化数据库...');
// 初始化数据库连接和结构
const db = dbManager.init();
console.log('✅ 数据库结构创建成功');
// 检查是否需要创建管理员用户
const adminExists = db.prepare('SELECT id FROM users WHERE email = ?').get('admin@localhost');
if (!adminExists) {
const bcrypt = require('bcryptjs');
const adminPassword = await bcrypt.hash('admin123', 12);
// 创建管理员用户
const insertAdmin = db.prepare(
'INSERT INTO users (email, password_hash) VALUES (?, ?)'
);
const adminResult = insertAdmin.run('admin@localhost', adminPassword);
// 创建管理员档案
const insertAdminProfile = db.prepare(
'INSERT INTO user_profiles (user_id, full_name, username) VALUES (?, ?, ?)'
);
insertAdminProfile.run(adminResult.lastInsertRowid, '系统管理员', 'admin');
console.log('✅ 管理员用户创建成功');
console.log(' 邮箱: admin@localhost');
console.log(' 密码: admin123');
} else {
console.log(' 管理员用户已存在');
}
// 创建示例数据(可选)
await createSampleData(db);
console.log('🎉 数据库初始化完成!');
console.log(`📍 数据库文件位置: ${path.resolve('./numerology.db')}`);
} catch (error) {
console.error('❌ 数据库初始化失败:', error);
process.exit(1);
} finally {
dbManager.close();
}
}
// 创建示例数据
async function createSampleData(db) {
try {
// 检查是否已有示例数据
const existingReadings = db.prepare('SELECT COUNT(*) as count FROM numerology_readings').get();
if (existingReadings.count > 0) {
console.log(' 示例数据已存在,跳过创建');
return;
}
// 创建示例用户
const bcrypt = require('bcryptjs');
const testPassword = await bcrypt.hash('test123', 12);
const insertTestUser = db.prepare(
'INSERT INTO users (email, password_hash) VALUES (?, ?)'
);
const testUserResult = insertTestUser.run('test@example.com', testPassword);
const testUserId = testUserResult.lastInsertRowid;
// 创建测试用户档案
const insertTestProfile = db.prepare(
'INSERT INTO user_profiles (user_id, full_name, birth_date, gender) VALUES (?, ?, ?, ?)'
);
insertTestProfile.run(testUserId, '测试用户', '1990-01-01', 'male');
// 创建示例分析记录
const sampleAnalysis = {
analysis_type: 'bazi',
analysis_date: new Date().toISOString().split('T')[0],
basic_info: {
personal_data: {
name: '测试用户',
birth_date: '1990-01-01',
birth_time: '12:00',
gender: '男性'
}
},
wuxing_analysis: {
element_distribution: { '木': 2, '火': 1, '土': 2, '金': 2, '水': 1 },
balance_analysis: '五行分布较为均匀,整体平衡良好',
personal_traits: '性格温和平衡,具有良好的适应能力',
suggestions: '建议保持现有的平衡状态,继续稳步发展'
}
};
const insertSampleReading = db.prepare(`
INSERT INTO numerology_readings (
user_id, reading_type, name, birth_date, birth_time, gender,
input_data, analysis, status
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
`);
insertSampleReading.run(
testUserId,
'bazi',
'测试用户',
'1990-01-01',
'12:00',
'male',
JSON.stringify({ name: '测试用户', birth_date: '1990-01-01', birth_time: '12:00', gender: 'male' }),
JSON.stringify(sampleAnalysis),
'completed'
);
console.log('✅ 示例数据创建成功');
console.log(' 测试用户邮箱: test@example.com');
console.log(' 测试用户密码: test123');
} catch (error) {
console.error('创建示例数据失败:', error);
// 不抛出错误,允许继续初始化
}
}
// 数据库备份功能
function backupDatabase() {
try {
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
const backupPath = path.join(__dirname, `../../backups/numerology_${timestamp}.db`);
// 确保备份目录存在
const backupDir = path.dirname(backupPath);
if (!fs.existsSync(backupDir)) {
fs.mkdirSync(backupDir, { recursive: true });
}
dbManager.backup(backupPath);
console.log(`✅ 数据库备份成功: ${backupPath}`);
} catch (error) {
console.error('❌ 数据库备份失败:', error);
}
}
// 数据库清理功能
function cleanupDatabase() {
try {
const db = dbManager.getDatabase();
// 清理过期会话
const cleanupSessions = db.prepare('DELETE FROM user_sessions WHERE expires_at < ?');
const sessionResult = cleanupSessions.run(new Date().toISOString());
console.log(`✅ 清理了 ${sessionResult.changes} 个过期会话`);
// 可以添加更多清理逻辑
// 例如:清理超过一年的分析记录等
} catch (error) {
console.error('❌ 数据库清理失败:', error);
}
}
// 命令行参数处理
const args = process.argv.slice(2);
const command = args[0];
switch (command) {
case 'backup':
backupDatabase();
break;
case 'cleanup':
cleanupDatabase();
break;
case 'init':
default:
initializeDatabase();
break;
}
// 如果直接运行此脚本
if (require.main === module) {
// 脚本被直接执行
}
module.exports = {
initializeDatabase,
backupDatabase,
cleanupDatabase
};