sql.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // SQLite 数据库操作模块
  2. const Database = require('better-sqlite3');
  3. const path = require('path');
  4. const fs = require('fs');
  5. const { promisify } = require('util');
  6. const mkdir = promisify(fs.mkdir);
  7. const access = promisify(fs.access);
  8. class DatabaseManager {
  9. constructor() {
  10. this.dbPath = path.join(__dirname, 'data.db');
  11. this.db = null;
  12. }
  13. // 初始化数据库连接
  14. async init() {
  15. try {
  16. this.db = new Database(this.dbPath);
  17. console.log('[SQL] 数据库连接成功');
  18. this.createTables();
  19. } catch (err) {
  20. console.error('[SQL] 数据库连接失败:', err);
  21. throw err;
  22. }
  23. }
  24. // 创建表
  25. createTables() {
  26. try {
  27. const createUsersTable = `
  28. CREATE TABLE IF NOT EXISTS users (
  29. id INTEGER PRIMARY KEY AUTOINCREMENT,
  30. username TEXT UNIQUE NOT NULL,
  31. phone TEXT UNIQUE NOT NULL,
  32. password TEXT NOT NULL,
  33. avatar TEXT,
  34. created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  35. updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
  36. )
  37. `;
  38. this.db.exec(createUsersTable);
  39. console.log('[SQL] users表已创建或已存在');
  40. } catch (err) {
  41. console.error('[SQL] 创建users表失败:', err);
  42. throw err;
  43. }
  44. }
  45. // 根据用户名查找用户(不区分大小写)
  46. findUserByUsername(username) {
  47. // 将输入转换为小写进行查询,但返回原始数据
  48. const normalizedUsername = username.toLowerCase();
  49. const sql = 'SELECT * FROM users WHERE LOWER(username) = ?';
  50. return this.db.prepare(sql).get(normalizedUsername) || null;
  51. }
  52. // 根据手机号查找用户
  53. findUserByPhone(phone) {
  54. const sql = 'SELECT * FROM users WHERE phone = ?';
  55. return this.db.prepare(sql).get(phone) || null;
  56. }
  57. // 根据ID查找用户
  58. findUserById(id) {
  59. const sql = 'SELECT * FROM users WHERE id = ?';
  60. return this.db.prepare(sql).get(id) || null;
  61. }
  62. // 创建新用户
  63. createUser(userData) {
  64. const { username, phone, password, avatar } = userData;
  65. const sql = `
  66. INSERT INTO users (username, phone, password, avatar)
  67. VALUES (?, ?, ?, ?)
  68. `;
  69. const stmt = this.db.prepare(sql);
  70. const result = stmt.run(username, phone, password, avatar || null);
  71. return { id: result.lastInsertRowid, ...userData };
  72. }
  73. // 更新用户信息
  74. updateUser(id, updates) {
  75. const fields = [];
  76. const values = [];
  77. if (updates.username !== undefined) {
  78. fields.push('username = ?');
  79. values.push(updates.username);
  80. }
  81. if (updates.phone !== undefined) {
  82. fields.push('phone = ?');
  83. values.push(updates.phone);
  84. }
  85. if (updates.password !== undefined) {
  86. fields.push('password = ?');
  87. values.push(updates.password);
  88. }
  89. if (updates.avatar !== undefined) {
  90. fields.push('avatar = ?');
  91. values.push(updates.avatar);
  92. }
  93. fields.push('updated_at = CURRENT_TIMESTAMP');
  94. values.push(id);
  95. const sql = `UPDATE users SET ${fields.join(', ')} WHERE id = ?`;
  96. const stmt = this.db.prepare(sql);
  97. const result = stmt.run(...values);
  98. return { changes: result.changes };
  99. }
  100. // 关闭数据库连接
  101. close() {
  102. if (this.db) {
  103. this.db.close();
  104. console.log('[SQL] 数据库连接已关闭');
  105. }
  106. }
  107. }
  108. // 创建单例
  109. let dbInstance = null;
  110. async function getDatabase() {
  111. if (!dbInstance) {
  112. dbInstance = new DatabaseManager();
  113. await dbInstance.init();
  114. }
  115. return dbInstance;
  116. }
  117. module.exports = {
  118. Database: DatabaseManager,
  119. getDatabase
  120. };