1. 新增 pnpm start:dev / pnpm start:stop 命令 - scripts/dev.mjs: 跨平台启动脚本(后端+管理端+学生端) - scripts/stop.mjs: 端口清理停止脚本 - 根 package.json 定义 pnpm 脚本 2. 修复 Flutter Web 编译(Isar 3.x + flutter_secure_storage 不兼容) - isar_database: 条件导出,Web 用空 stub - isar_journal_repository: 条件导出,Web 用空 stub - sync_engine: 条件导出,Web 用内存队列(无 Isar 持久化) - 移除 flutter_secure_storage(v9 web 插件用 dart:html) - 新增 SecureTokenStore 接口 + shared_preferences 实现 - auth_repository 改用 SecureTokenStore 接口
71 lines
1.9 KiB
Dart
71 lines
1.9 KiB
Dart
// Isar 数据库初始化 — 原生平台实现 (Android/iOS/Desktop)
|
||
//
|
||
// 在原生平台上使用 Isar 3.x 本地数据库。
|
||
// Web 平台使用 isar_database_web.dart stub。
|
||
|
||
import 'package:isar/isar.dart';
|
||
import 'package:path_provider/path_provider.dart';
|
||
|
||
import 'collections/journal_entry_collection.dart';
|
||
import 'collections/journal_element_collection.dart';
|
||
import 'collections/pending_operation_collection.dart';
|
||
|
||
/// Isar 数据库单例管理(原生平台实现)
|
||
class IsarDatabase {
|
||
IsarDatabase._();
|
||
|
||
static Isar? _instance;
|
||
static bool _initialized = false;
|
||
|
||
/// 所有 Collection Schema(由 build_runner 生成)
|
||
static final List<CollectionSchema<dynamic>> schemas = [
|
||
JournalEntryCollectionSchema,
|
||
JournalElementCollectionSchema,
|
||
PendingOperationCollectionSchema,
|
||
];
|
||
|
||
/// 是否已初始化
|
||
static bool get isInitialized => _initialized;
|
||
|
||
/// 原生平台 Isar 可用
|
||
static bool get isAvailable => true;
|
||
|
||
/// 初始化数据库
|
||
static Future<void> init() async {
|
||
if (_initialized) return;
|
||
|
||
final dir = await getApplicationDocumentsDirectory();
|
||
_instance = await Isar.open(
|
||
schemas,
|
||
directory: dir.path,
|
||
inspector: true, // 开发模式,发布时关闭
|
||
);
|
||
_initialized = true;
|
||
}
|
||
|
||
/// 获取 Isar 实例(必须先调用 [init])
|
||
static Isar get instance {
|
||
if (_instance == null || !_instance!.isOpen) {
|
||
throw StateError('IsarDatabase 未初始化,请先调用 IsarDatabase.init()');
|
||
}
|
||
return _instance!;
|
||
}
|
||
|
||
/// 关闭数据库连接
|
||
static Future<void> close() async {
|
||
if (_instance != null && _instance!.isOpen) {
|
||
await _instance!.close();
|
||
_instance = null;
|
||
_initialized = false;
|
||
}
|
||
}
|
||
|
||
/// 清空所有数据(仅用于测试)
|
||
static Future<void> clearAll() async {
|
||
if (_instance == null || !_instance!.isOpen) return;
|
||
await _instance!.writeTxn(() async {
|
||
await _instance!.clear();
|
||
});
|
||
}
|
||
}
|