initDb.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. const { pool } = require('./database');
  2. const bcrypt = require('bcryptjs');
  3. const initDatabase = async () => {
  4. try {
  5. // 创建数据库
  6. await pool.query('CREATE DATABASE IF NOT EXISTS notebot');
  7. await pool.query('USE notebot');
  8. // 创建用户表
  9. await pool.query(`
  10. CREATE TABLE IF NOT EXISTS users (
  11. id INT AUTO_INCREMENT PRIMARY KEY,
  12. username VARCHAR(50) NOT NULL UNIQUE,
  13. password VARCHAR(255) NOT NULL,
  14. role ENUM('admin', 'user') DEFAULT 'user',
  15. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  16. )
  17. `);
  18. // 创建群组表
  19. await pool.query(`
  20. CREATE TABLE IF NOT EXISTS groups (
  21. id INT AUTO_INCREMENT PRIMARY KEY,
  22. group_id VARCHAR(255) NOT NULL UNIQUE,
  23. group_name VARCHAR(255) NOT NULL,
  24. group_type ENUM('personal', 'public') NOT NULL,
  25. creator_id VARCHAR(255) NOT NULL,
  26. is_active BOOLEAN DEFAULT true,
  27. last_join_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  28. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  29. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  30. )
  31. `);
  32. // 修改群组表,添加新字段
  33. try {
  34. await pool.query(`
  35. ALTER TABLE groups
  36. ADD COLUMN group_type ENUM('personal', 'public', 'private') NOT NULL DEFAULT 'public' COMMENT '群组类型:个人用户/公开群聊/隐私群聊' AFTER group_name,
  37. ADD COLUMN fee_rate DECIMAL(5,2) DEFAULT 0.00 COMMENT '费率' AFTER group_type,
  38. ADD COLUMN exchange_rate DECIMAL(10,4) DEFAULT 1.0000 COMMENT '汇率' AFTER fee_rate,
  39. ADD COLUMN admin_id INT NOT NULL COMMENT '管理员ID' AFTER exchange_rate,
  40. ADD COLUMN last_join_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '机器人最后加入时间' AFTER is_active
  41. `);
  42. } catch (error) {
  43. // 如果列已存在,忽略错误
  44. if (!error.message.includes('Duplicate column name')) {
  45. throw error;
  46. }
  47. }
  48. // 添加外键约束
  49. // try {
  50. // await pool.query(`
  51. // ALTER TABLE groups
  52. // ADD CONSTRAINT fk_groups_creator
  53. // FOREIGN KEY (creator_id) REFERENCES users(id),
  54. // ADD CONSTRAINT fk_groups_admin
  55. // FOREIGN KEY (admin_id) REFERENCES users(id)
  56. // `);
  57. // } catch (error) {
  58. // // 如果约束已存在,忽略错误
  59. // if (!error.message.includes('Duplicate key name')) {
  60. // throw error;
  61. // }
  62. // }
  63. // 创建入款出款记录表
  64. await pool.query(`
  65. CREATE TABLE IF NOT EXISTS money_records (
  66. id INT AUTO_INCREMENT PRIMARY KEY,
  67. time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  68. amount DECIMAL(10,2) NOT NULL COMMENT '金额',
  69. operator_id INT NOT NULL COMMENT '操作人ID',
  70. responder_id INT NOT NULL COMMENT '回复人ID',
  71. group_id VARCHAR(50) NOT NULL COMMENT '关联群组ID',
  72. type ENUM('deposit', 'withdrawal') NOT NULL COMMENT '类型:入款/出款',
  73. status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending' COMMENT '状态',
  74. FOREIGN KEY (operator_id) REFERENCES users(id),
  75. FOREIGN KEY (responder_id) REFERENCES users(id),
  76. FOREIGN KEY (group_id) REFERENCES groups(group_id),
  77. INDEX idx_group_time (group_id, time)
  78. )
  79. `);
  80. // // 创建交易表
  81. // await pool.query(`
  82. // CREATE TABLE IF NOT EXISTS transactions (
  83. // id INT AUTO_INCREMENT PRIMARY KEY,
  84. // group_id VARCHAR(50) NOT NULL,
  85. // group_name VARCHAR(100) NOT NULL,
  86. // type ENUM('deposit', 'withdrawal') NOT NULL,
  87. // amount DECIMAL(10,2) NOT NULL,
  88. // time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  89. // INDEX idx_group_time (group_id, time)
  90. // )
  91. // `);
  92. // 创建默认管理员账户
  93. const adminPassword = await bcrypt.hash('admin123', 10);
  94. await pool.query(`
  95. INSERT INTO users (username, password, role)
  96. VALUES ('admin', ?, 'admin')
  97. ON DUPLICATE KEY UPDATE id=id
  98. `, [adminPassword]);
  99. console.log('数据库初始化成功');
  100. } catch (error) {
  101. console.error('数据库初始化失败:', error);
  102. throw error;
  103. }
  104. };
  105. module.exports = initDatabase;