import 'package:flutter/foundation.dart'; import '../../models/data_models.dart'; import '../database_helper.dart'; /// 书籍数据访问对象 class BookDao { final DatabaseHelper _dbHelper = DatabaseHelper.instance; Future _wrap(String op, Future Function() fn) async { try { return await fn(); } catch (e) { debugPrint('[BookDao] $op error: $e'); rethrow; } } // 获取所有未删除的书籍记录 Future> getAllBooks() => _wrap('getAllBooks', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: 'is_deleted = ?', whereArgs: [0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // 分页查询书籍记录 Future> getBooksPaged({String? status, int limit = 20, int offset = 0}) => _wrap('getBooksPaged', () async { final db = await _dbHelper.database; String where = 'is_deleted = 0'; List whereArgs = []; if (status != null && status.isNotEmpty) { where += ' AND status = ?'; whereArgs.add(status); } final maps = await db.query('books', where: where, whereArgs: whereArgs, orderBy: 'created_at DESC', limit: limit, offset: offset); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // 根据状态筛选书籍记录 Future> getBooksByStatus(String status) => _wrap('getBooksByStatus', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: 'status = ? AND is_deleted = ?', whereArgs: [status, 0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // 根据ID获取书籍 Future getBookById(String id) => _wrap('getBookById', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: 'id = ? AND is_deleted = ?', whereArgs: [id, 0], ); if (maps.isEmpty) return null; return Book.fromJson(maps.first); }); // 添加书籍记录 Future insertBook(Book book) => _wrap('insertBook', () async { final db = await _dbHelper.database; return await db.insert('books', book.toJson()); }); // 更新书籍记录 Future updateBook(Book book) => _wrap('updateBook', () async { final db = await _dbHelper.database; return await db.update( 'books', book.toJson(), where: 'id = ?', whereArgs: [book.id], ); }); // 仅更新封面偏移量(不触发全量刷新) Future updateCoverOffset(String bookId, double offset) => _wrap('updateCoverOffset', () async { final db = await _dbHelper.database; await db.update('books', {'cover_offset': offset}, where: 'id = ?', whereArgs: [bookId]); }); // 软删除书籍记录(移入回收站) Future deleteBook(String id) => _wrap('deleteBook', () async { final db = await _dbHelper.database; return await db.update( 'books', { 'is_deleted': 1, 'updated_at': DateTime.now().toIso8601String(), }, where: 'id = ?', whereArgs: [id], ); }); // 搜索书籍(标题、别名) Future> searchBooks(String query) => _wrap('searchBooks', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: '(title LIKE ? OR alternate_titles LIKE ?) AND is_deleted = ?', whereArgs: ['%$query%', '%$query%', 0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // 根据作者筛选 Future> getBooksByAuthor(String author) => _wrap('getBooksByAuthor', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: 'authors LIKE ? AND is_deleted = ?', whereArgs: ['%$author%', 0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // 根据类型筛选 Future> getBooksByGenre(String genre) => _wrap('getBooksByGenre', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: 'genres LIKE ? AND is_deleted = ?', whereArgs: ['%$genre%', 0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // ========== 回收站相关方法 ========== // 获取已删除的书籍 Future> getDeletedBooks() => _wrap('getDeletedBooks', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'books', where: 'is_deleted = ?', whereArgs: [1], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Book.fromJson(maps[i])); }); // 恢复已删除的书籍 Future restoreBook(String id) => _wrap('restoreBook', () async { final db = await _dbHelper.database; return await db.update( 'books', {'is_deleted': 0, 'updated_at': DateTime.now().toIso8601String()}, where: 'id = ?', whereArgs: [id], ); }); // 彻底删除书籍 Future permanentDeleteBook(String id) => _wrap('permanentDeleteBook', () async { final db = await _dbHelper.database; return await db.delete( 'books', where: 'id = ?', whereArgs: [id], ); }); }