init-complete.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #!/usr/bin/env node
  2. /**
  3. * 系统初始化和配置脚本
  4. */
  5. const fs = require('fs').promises;
  6. const path = require('path');
  7. const logger = require('../logger');
  8. // 颜色输出
  9. const chalk = require('chalk');
  10. async function initializeSystem() {
  11. console.log(chalk.blue('🚀 正在初始化 HubCmdUI 系统...\n'));
  12. try {
  13. // 1. 检查并创建必要目录
  14. console.log(chalk.yellow('📁 创建必要目录...'));
  15. await createDirectories();
  16. // 2. 检查数据库是否已初始化
  17. const database = require('../database/database');
  18. try {
  19. await database.connect();
  20. const isInitialized = await database.isInitialized();
  21. if (isInitialized) {
  22. console.log(chalk.green(' ✓ 数据库已初始化,跳过初始化步骤'));
  23. console.log(chalk.green('\n✅ 系统检查完成!'));
  24. console.log(chalk.cyan('💡 使用 npm start 启动服务'));
  25. console.log(chalk.cyan('🌐 默认访问地址: http://localhost:3000'));
  26. return;
  27. }
  28. } catch (error) {
  29. // 数据库连接失败,继续初始化流程
  30. }
  31. // 3. 检查配置文件
  32. console.log(chalk.yellow('⚙️ 检查配置文件...'));
  33. await checkConfigFiles();
  34. // 4. 询问用户是否要启用SQLite
  35. const useDatabase = await askUserChoice();
  36. if (useDatabase) {
  37. // 5. 迁移数据到SQLite
  38. console.log(chalk.yellow('📊 初始化SQLite数据库...'));
  39. await initializeSQLite();
  40. // 6. 设置环境变量
  41. console.log(chalk.yellow('🔧 配置数据库模式...'));
  42. await setDatabaseMode(true);
  43. } else {
  44. console.log(chalk.yellow('📁 使用文件存储模式...'));
  45. await setDatabaseMode(false);
  46. }
  47. // 7. 创建默认用户
  48. console.log(chalk.yellow('👤 创建默认用户...'));
  49. await createDefaultUser();
  50. // 8. 配置HTTP代理
  51. console.log(chalk.yellow('🌐 配置HTTP代理服务...'));
  52. await configureHttpProxy();
  53. console.log(chalk.green('\n✅ 系统初始化完成!'));
  54. console.log(chalk.cyan('💡 使用 npm start 启动服务'));
  55. console.log(chalk.cyan('🌐 默认访问地址: http://localhost:3000'));
  56. console.log(chalk.cyan('👤 默认用户: root / admin@123'));
  57. } catch (error) {
  58. console.error(chalk.red('❌ 初始化失败:'), error.message);
  59. process.exit(1);
  60. }
  61. }
  62. /**
  63. * 创建必要目录
  64. */
  65. async function createDirectories() {
  66. const dirs = [
  67. 'data', // 数据库文件目录
  68. 'documentation', // 文档目录(静态文件)
  69. 'logs', // 日志目录
  70. 'temp' // 临时文件目录
  71. ];
  72. for (const dir of dirs) {
  73. const dirPath = path.join(__dirname, '..', dir);
  74. try {
  75. await fs.mkdir(dirPath, { recursive: true });
  76. } catch (error) {
  77. if (error.code !== 'EEXIST') {
  78. throw error;
  79. }
  80. }
  81. }
  82. console.log(chalk.green(' ✓ 目录创建完成'));
  83. }
  84. /**
  85. * 检查配置文件 - 简化版,不再创建config.json
  86. */
  87. async function checkConfigFiles() {
  88. console.log(chalk.green(' ✓ 使用SQLite数据库存储配置'));
  89. }
  90. /**
  91. * 询问用户选择
  92. */
  93. async function askUserChoice() {
  94. // 简化处理,默认使用SQLite
  95. const useDatabase = process.env.USE_SQLITE !== 'false';
  96. if (useDatabase) {
  97. console.log(chalk.green(' ✓ 将使用SQLite数据库存储'));
  98. } else {
  99. console.log(chalk.yellow(' ⚠ 将使用文件存储模式'));
  100. }
  101. return useDatabase;
  102. }
  103. /**
  104. * 初始化SQLite数据库
  105. */
  106. async function initializeSQLite() {
  107. try {
  108. const database = require('../database/database');
  109. await database.connect();
  110. await database.createTables();
  111. // 初始化数据库(创建默认数据)
  112. await database.createDefaultAdmin();
  113. await database.createDefaultDocuments();
  114. await database.createDefaultMenuItems();
  115. // 初始化默认配置
  116. const configServiceDB = require('../services/configServiceDB');
  117. await configServiceDB.initializeDefaultConfig();
  118. // 标记数据库已初始化
  119. await database.markAsInitialized();
  120. console.log(chalk.green(' ✓ SQLite数据库初始化完成'));
  121. } catch (error) {
  122. console.log(chalk.red(' ❌ SQLite初始化失败:'), error.message);
  123. throw error;
  124. }
  125. }
  126. /**
  127. * 设置数据库模式
  128. */
  129. async function setDatabaseMode(useDatabase) {
  130. const envPath = path.join(__dirname, '../.env');
  131. const envContent = `# 数据库配置
  132. USE_DATABASE=${useDatabase}
  133. AUTO_MIGRATE=true
  134. # HTTP代理配置
  135. PROXY_PORT=8080
  136. PROXY_HOST=0.0.0.0
  137. `;
  138. await fs.writeFile(envPath, envContent);
  139. console.log(chalk.green(` ✓ 数据库模式已设置为: ${useDatabase ? 'SQLite' : '文件存储'}`));
  140. }
  141. /**
  142. * 创建默认用户 - 简化版,数据库已处理
  143. */
  144. async function createDefaultUser() {
  145. console.log(chalk.green(' ✓ 默认管理员用户由数据库处理 (root/admin@123)'));
  146. }
  147. /**
  148. * 配置HTTP代理服务信息
  149. */
  150. async function configureHttpProxy() {
  151. try {
  152. console.log(chalk.green(' ✓ HTTP代理服务需要通过环境变量配置'));
  153. console.log(chalk.cyan(' 配置方式: 设置 PROXY_PORT 和 PROXY_HOST 环境变量'));
  154. console.log(chalk.cyan(' 示例: PROXY_PORT=8080 PROXY_HOST=0.0.0.0 npm start'));
  155. } catch (error) {
  156. console.log(chalk.yellow(' ⚠ HTTP代理服务配置提示显示失败'));
  157. }
  158. }
  159. // 如果直接运行此脚本
  160. if (require.main === module) {
  161. initializeSystem().then(() => {
  162. process.exit(0);
  163. }).catch((error) => {
  164. console.error(chalk.red('初始化失败:'), error);
  165. process.exit(1);
  166. });
  167. }
  168. module.exports = { initializeSystem };