From 8a3ab24e8b0ffbd330160b79cfd2d5eaea580cdf Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sat, 3 Apr 2021 16:25:11 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E8=BF=87=E6=97=B6=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=98=BE=E7=A4=BA=E4=BC=98=E5=8C=96=EF=BC=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=BB=93=E6=9E=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 978944 -> 983040 bytes assets/version.json | 3 + ios/Podfile.lock | 16 +-- lib/app/res/str_unit.dart | 2 +- lib/blocs/global/global_bloc.dart | 10 +- lib/model/widget_model.dart | 18 ++-- lib/repositories/app_start.dart | 91 ++++++++++++++++++ lib/repositories/app_storage.dart | 81 ---------------- lib/repositories/bean/widget_po.dart | 16 ++- lib/repositories/dao/category_dao.dart | 20 +--- lib/repositories/dao/like_dao.dart | 64 ++++++++++++ lib/repositories/dao/node_dao.dart | 11 +-- lib/repositories/dao/widget_dao.dart | 52 ++-------- lib/repositories/local_db.dart | 50 ++++++++++ lib/repositories/{dao => }/local_storage.dart | 9 ++ lib/repositories/rep/category_repository.dart | 1 - .../rep/impl/catagory_db_repository.dart | 14 +-- .../rep/impl/widget_db_repository.dart | 27 +++--- lib/repositories/rep/widget_repository.dart | 2 +- lib/user_system/bloc/authentic/bloc.dart | 2 +- .../items/widget/coupon_widget_list_item.dart | 4 +- .../items/widget/simple_widget_list_item.dart | 4 +- .../items/widget/techno_widget_list_item.dart | 4 +- lib/views/pages/app/bloc_wrapper.dart | 10 +- lib/views/pages/category/category_page.dart | 29 +++--- .../widget_detail/widget_detail_page.dart | 6 +- pubspec.yaml | 3 +- 27 files changed, 318 insertions(+), 231 deletions(-) create mode 100644 assets/version.json create mode 100644 lib/repositories/app_start.dart delete mode 100644 lib/repositories/app_storage.dart create mode 100644 lib/repositories/dao/like_dao.dart create mode 100644 lib/repositories/local_db.dart rename lib/repositories/{dao => }/local_storage.dart (76%) diff --git a/assets/flutter.db b/assets/flutter.db index 42a873058c54680ad96236d4055f7ae8a8714b79..e8fc819fda824bdfd1e23f654b1abfbfc141ab1e 100644 GIT binary patch delta 8607 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 delta 9550 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 2.7.2) + - FMDB (>= 2.7.5) - url_launcher (0.0.1): - Flutter @@ -55,11 +55,11 @@ SPEC CHECKSUMS: FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 - share: bae0a282aab4483288913fc4dc0b935d4b491f2e - shared_preferences: 430726339841afefe5142b9c1f50cb6bd7793e01 - sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0 - url_launcher: a1c0cc845906122c4784c542523d8cacbded5626 + share: 0b2c3e82132f5888bccca3351c504d0003b3b410 + shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c -COCOAPODS: 1.10.0 +COCOAPODS: 1.10.1 diff --git a/lib/app/res/str_unit.dart b/lib/app/res/str_unit.dart index b03b11a..e15c25d 100644 --- a/lib/app/res/str_unit.dart +++ b/lib/app/res/str_unit.dart @@ -5,7 +5,7 @@ class StrUnit { // 小文字大小 - static const String version = 'V1.5.0'; + static const String version = 'V1.5.1'; static const String appName = 'Flutter Unit'; static const String galleryInfo = """ diff --git a/lib/blocs/global/global_bloc.dart b/lib/blocs/global/global_bloc.dart index 13953ba..48ca757 100644 --- a/lib/blocs/global/global_bloc.dart +++ b/lib/blocs/global/global_bloc.dart @@ -1,7 +1,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/res/cons.dart'; import 'package:flutter_unit/app/res/sp.dart'; -import 'package:flutter_unit/repositories/app_storage.dart'; +import 'package:flutter_unit/repositories/app_start.dart'; +import 'package:flutter_unit/repositories/local_storage.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'global_event.dart'; @@ -13,11 +14,11 @@ import 'global_state.dart'; class GlobalBloc extends Bloc { - final AppStorage storage; + final AppStart storage; GlobalBloc(this.storage):super(GlobalState()); - Future get sp => storage.sp; + Future get sp => LocalStorage.sp; @override Stream mapEventToState(GlobalEvent event) async* { @@ -29,8 +30,7 @@ class GlobalBloc extends Bloc { // 切换字体事件处理 : 固化索引 + 产出新状态 if (event is EventSwitchFontFamily) { int familyIndex = Cons.fontFamilySupport.indexOf(event.family); - await sp - ..setInt(SP.fontFamily, familyIndex); + await sp..setInt(SP.fontFamily, familyIndex); yield state.copyWith(fontFamily: event.family); } diff --git a/lib/model/widget_model.dart b/lib/model/widget_model.dart index c3f67c3..406d334 100644 --- a/lib/model/widget_model.dart +++ b/lib/model/widget_model.dart @@ -25,7 +25,7 @@ class WidgetModel extends Equatable { final String name; final String nameCN; final WidgetFamily family; - final bool collected; + final bool deprecated; final WidgetType type; final List links; final double lever; @@ -39,7 +39,7 @@ class WidgetModel extends Equatable { this.name, this.nameCN, this.family, - this.collected, + this.deprecated, this.links, this.type, this.lever, @@ -55,21 +55,23 @@ class WidgetModel extends Equatable { name: po.name, nameCN: po.nameCN, family: Convert.toFamily(po.family), - image: convertImage(po.image), + image: convertImage(po.name), lever: po.lever, - collected: po.collected == 1, + deprecated: po.deprecated == 1, info: po.info, links: formatLinkTo(po.linkWidget), ); } - static convertImage(String image) { - return image.isEmpty ? null : AssetImage(image); + static convertImage(String name) { + // return image.isEmpty ? null : AssetImage(image); + return null; } + @override String toString() { - return 'WidgetModel{id: $id, name: $name,collected: $collected}'; + return 'WidgetModel{id: $id, name: $name, nameCN: $nameCN, family: $family, deprecated: $deprecated, type: $type, links: $links, lever: $lever, image: $image, info: $info}'; } static List formatLinkTo(String links) { @@ -81,6 +83,4 @@ class WidgetModel extends Equatable { } return links.split(',').map((e)=>int.parse(e)).toList(); } - - } diff --git a/lib/repositories/app_start.dart b/lib/repositories/app_start.dart new file mode 100644 index 0000000..6194fea --- /dev/null +++ b/lib/repositories/app_start.dart @@ -0,0 +1,91 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:flutter/services.dart'; +import 'package:flutter_unit/app/res/cons.dart'; +import 'package:flutter_unit/app/res/sp.dart'; +import 'package:flutter_unit/blocs/global/global_state.dart'; +import 'package:flutter_unit/repositories/local_db.dart'; +import 'package:path/path.dart' as path; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sqflite/sqflite.dart'; + +import 'local_storage.dart'; + +/// create by 张风捷特烈 on 2020-03-04 +/// contact me by email 1981462002@qq.com +/// 说明: 本地存储访问对象,用于读取配置数据,及初始化Database和SharedPreferences + +class AppStart { + // 初始化 App 固化的配置数据 + Future initApp() async { + SharedPreferences prefs = await LocalStorage.sp; + //数据库不存在,执行拷贝 + String databasesPath = await getDatabasesPath(); + String dbPath = path.join(databasesPath, "flutter.db"); + + bool shouldCopy = await _checkShouldCopy(dbPath); + + if (shouldCopy) { + await _doCopyAssetsDb(dbPath); + } else { + print("=====flutter.db 已存在===="); + } + + await LocalDb.instance.initDb(); + + bool showBg = prefs.getBool(SP.showBackground) ?? true; + int themeIndex = prefs.getInt(SP.themeColorIndex) ?? 4; + int fontIndex = prefs.getInt(SP.fontFamily) ?? 1; + int codeIndex = prefs.getInt(SP.codeStyleIndex) ?? 0; + int itemStyleIndex = prefs.getInt(SP.itemStyleIndex) ?? 0; + + return GlobalState( + showBackGround: showBg, + themeColor: Cons.themeColorSupport.keys.toList()[themeIndex], + fontFamily: Cons.fontFamilySupport[fontIndex], + itemStyleIndex: itemStyleIndex, + codeStyleIndex: codeIndex); + } + + Future _checkShouldCopy(String dbPath) async { + bool shouldCopy = false; + String versionStr = await rootBundle.loadString('assets/version.json'); + int dbVersion = await json.decode(versionStr)['dbVersion']; + int versionInSP = + await LocalStorage.getInt(LocalStorage.dbVersionKey) ?? -1; + + // 版本升级,执行拷贝 + if (dbVersion > versionInSP) { + shouldCopy = true; + await LocalStorage.saveInt(LocalStorage.dbVersionKey,dbVersion); + } + + //非 release模式,执行拷贝 + const isPro = bool.fromEnvironment('dart.vm.product'); + if (!isPro) { + shouldCopy = true; + } + + //数据库不存在,执行拷贝 + if (!File(dbPath).existsSync()) { + shouldCopy = true; + } + + return shouldCopy; + } + + Future _doCopyAssetsDb(String dbPath) async { + Directory dir = Directory(path.dirname(dbPath)); + if (!dir.existsSync()) { + await dir.create(recursive: true); + } + ByteData data = await rootBundle.load("assets/flutter.db"); + List bytes = + data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + await File(dbPath).writeAsBytes(bytes, flush: true); + + print("=====flutter.db==== assets ======拷贝完成===="); + } +} diff --git a/lib/repositories/app_storage.dart b/lib/repositories/app_storage.dart deleted file mode 100644 index ab0eb23..0000000 --- a/lib/repositories/app_storage.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:flutter/services.dart'; -import 'package:flutter_unit/app/res/cons.dart'; -import 'package:flutter_unit/app/res/sp.dart'; -import 'package:flutter_unit/blocs/global/global_state.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:sqflite/sqflite.dart'; -import 'package:path/path.dart' as path; - -/// create by 张风捷特烈 on 2020-03-04 -/// contact me by email 1981462002@qq.com -/// 说明: 本地存储访问对象,用于读取配置数据,及初始化Database和SharedPreferences - -class AppStorage { - SharedPreferences _sp; - Database _database; - - Future get sp async { - _sp = _sp ?? await SharedPreferences.getInstance(); - return _sp; - } - - Future get db async { - _database = _database ?? await initDb(); - return _database; - } - - // 初始化 App 固化的配置数据 - Future initApp() async { - SharedPreferences prefs = await sp; - _database = await initDb(); - - bool showBg = prefs.getBool(SP.showBackground) ?? true; - int themeIndex = prefs.getInt(SP.themeColorIndex) ?? 4; - int fontIndex = prefs.getInt(SP.fontFamily) ?? 1; - int codeIndex = prefs.getInt(SP.codeStyleIndex) ?? 0; - int itemStyleIndex = prefs.getInt(SP.itemStyleIndex) ?? 0; - - return GlobalState( - showBackGround: showBg, - themeColor: Cons.themeColorSupport.keys.toList()[themeIndex], - fontFamily: Cons.fontFamilySupport[fontIndex], - itemStyleIndex: itemStyleIndex, - codeStyleIndex: codeIndex); - } - - // 初始化数据库 - Future initDb() async { - String databasesPath = await getDatabasesPath(); - String dbPath = path.join(databasesPath, "flutter.db"); - bool exists = await databaseExists(dbPath); - const isPro = bool.fromEnvironment('dart.vm.product'); //是否release模式 - - if (!isPro) { - if (!exists) { - await Directory(path.dirname(dbPath)).create(recursive: true); - } - ByteData data = await rootBundle.load(path.join("assets", "flutter.db")); - List bytes = - data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - await File(dbPath).writeAsBytes(bytes, flush: true); - print("==== debug ===== assets ======拷贝完成===="); - return await openDatabase(dbPath, readOnly: false); - } - - if (!exists) { - await Directory(path.dirname(dbPath)).create(recursive: true); - ByteData data = await rootBundle.load(path.join("assets", "flutter.db")); - List bytes = - data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); - await File(dbPath).writeAsBytes(bytes, flush: true); - print("==== release ===== assets ======拷贝完成===="); - } else { - print("========= 数据库 ======已存在===="); - } - _database = await openDatabase(dbPath, readOnly: false); - return _database; - } -} diff --git a/lib/repositories/bean/widget_po.dart b/lib/repositories/bean/widget_po.dart index 6cddc55..fcb8953 100644 --- a/lib/repositories/bean/widget_po.dart +++ b/lib/repositories/bean/widget_po.dart @@ -9,10 +9,9 @@ class WidgetPo extends Equatable { final int id; final String name; final String nameCN; - final int collected; + final int deprecated; final int family; final double lever; - final String image; final String info; final String linkWidget; @@ -20,11 +19,10 @@ class WidgetPo extends Equatable { {this.id, this.name, this.nameCN, - this.collected, + this.deprecated, this.family, this.lever, this.linkWidget, - this.image, this.info}); factory WidgetPo.fromJson(Map map) { @@ -33,9 +31,8 @@ class WidgetPo extends Equatable { name: map['name'], nameCN: map["nameCN"], family: map["family"], - collected: map["collected"] ?? 0, + deprecated: map["deprecated"] ?? 0, lever: map["lever"].toDouble(), - image: map["image"], linkWidget: map["linkWidget"], info: map["info"]); } @@ -46,9 +43,8 @@ class WidgetPo extends Equatable { "name": this.name, "nameCN": this.nameCN, "family": this.family, - "collected": this.collected, + "deprecated": this.deprecated, "lever": this.lever, - "image": this.image, "linkWidget": this.linkWidget, "info": this.info }; @@ -56,10 +52,10 @@ class WidgetPo extends Equatable { @override String toString() { - return 'WidgetPo{id: $id, name: $name, nameCN: $nameCN, collected: $collected, family: $family, lever: $lever, image: $image, info: $info}'; + return 'WidgetPo{id: $id, name: $name, nameCN: $nameCN, deprecated: $deprecated, family: $family, lever: $lever, info: $info}'; } @override List get props => - [id, name, nameCN, collected, family, lever, image, info]; + [id, name, nameCN, deprecated, family, linkWidget, lever, info]; } diff --git a/lib/repositories/dao/category_dao.dart b/lib/repositories/dao/category_dao.dart index f3274f3..941036b 100644 --- a/lib/repositories/dao/category_dao.dart +++ b/lib/repositories/dao/category_dao.dart @@ -1,7 +1,7 @@ import 'package:sqflite/sqflite.dart'; -import '../app_storage.dart'; +import '../app_start.dart'; import '../bean/category_po.dart'; @@ -19,16 +19,14 @@ import '../bean/category_po.dart'; //"""; class CategoryDao { - final AppStorage storage; + final Database db; - CategoryDao(this.storage); + CategoryDao(this.db); - Future get _db async =>await storage.db; Future insert(CategoryPo category) async { //插入方法 - final db = await _db; String addSql = //插入数据 "INSERT INTO " "category(id,name,color,info,priority,image,created,updated) " @@ -47,7 +45,6 @@ class CategoryDao { Future update(CategoryPo widget) async { //插入方法 - final db = await _db; String updateSql = //插入数据 "UPDATE category SET name=? , color=? ,info=?, priority=?,image=?,updated=? " "WHERE id = ?"; @@ -67,7 +64,6 @@ class CategoryDao { Future addWidget(int categoryId,int widgetId,) async { - final db = await _db; String addSql = //插入数据 "INSERT INTO " "category_widget(widgetId,categoryId) " @@ -79,7 +75,6 @@ class CategoryDao { } Future addWidgets(int categoryId,List widgetIds) async { - final db = await _db; String addSql = //插入数据 "INSERT INTO " "category_widget(widgetId,categoryId) VALUES "; @@ -99,7 +94,6 @@ class CategoryDao { } Future existByName(String name) async { - final db = await _db; String sql = //插入数据 "SELECT COUNT(name) as count FROM category " "WHERE name = ?"; @@ -111,7 +105,6 @@ class CategoryDao { } Future>> queryAll() async { - final db = await _db; List> data = await db.rawQuery( "SELECT c.id,c.name,c.info,c.color,c.image,c.created,c.updated,c.priority,COUNT(cw.categoryId) as `count`" "FROM category AS c " @@ -123,7 +116,6 @@ class CategoryDao { } Future> categoryWidgetIds(int id) async { - final db = await _db; List> data = await db.rawQuery( "SELECT categoryId FROM `category_widget`" "WHERE widgetId = ?", @@ -134,7 +126,6 @@ class CategoryDao { Future deleteCollect(int id) async { - final db = await _db; await db.execute( "DELETE FROM category_widget " "WHERE categoryId = ?", @@ -146,7 +137,6 @@ class CategoryDao { } Future clear() async { - final db = await _db; await db.execute( "DELETE FROM category_widget " "WHERE categoryId >0"); @@ -157,7 +147,6 @@ class CategoryDao { Future removeWidget(int categoryId, int widgetId) async { //插入方法 - final db = await _db; String deleteSql = //插入数据 "DELETE FROM " "category_widget WHERE categoryId = ? AND widgetId = ? "; @@ -169,7 +158,6 @@ class CategoryDao { } Future existWidgetInCollect(int categoryId, int widgetId) async { - final db = await _db; String sql = //插入数据 "SELECT COUNT(id) as count FROM category_widget " "WHERE categoryId = ? AND widgetId = ?"; @@ -199,7 +187,6 @@ class CategoryDao { "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " "ORDER BY lever DESC"; - final db = await _db; return await db.rawQuery(querySql,[categoryId]); } @@ -209,7 +196,6 @@ class CategoryDao { "WHERE id IN (SELECT widgetId FROM category_widget WHERE categoryId = ?) " "ORDER BY lever DESC"; - final db = await _db; var data = await db.rawQuery(querySql,[categoryId]); return data.map((e) => e["id"]).toList(); } diff --git a/lib/repositories/dao/like_dao.dart b/lib/repositories/dao/like_dao.dart new file mode 100644 index 0000000..605ed48 --- /dev/null +++ b/lib/repositories/dao/like_dao.dart @@ -0,0 +1,64 @@ +import 'package:sqflite/sqflite.dart'; + +class LikeDao { + final Database db; + + LikeDao(this.db); + + Future> likeWidgetIds() async { + var result = await db.rawQuery("SELECT widget_id FROM like_widget"); + var ids = result.map((e) => e['widget_id']).toList(); + return ids; + } + + // 如果已喜欢,取消喜欢 + // 如果未喜欢,设为喜欢 + Future toggleCollect(int widgetId) async { + bool liked = await isLiked(widgetId); + + if (liked) { + await unlike(widgetId, check: false); + } else { + await like(widgetId, check: false); + } + } + + Future like(int widgetId, {bool check = true}) async { + if (check) { + // 如果 like ,直接取消,不执行 like 操作 + bool liked = await isLiked(widgetId); + if (liked) return 0; + } + + return await db.rawInsert( + "INSERT INTO " + "like_widget(widget_id) " + "VALUES (?);", + [widgetId]); + } + + Future unlike(int widgetId, {bool check = true}) async { + if (check) { + // 如果未 like ,直接取消,不执行 unlike 操作 + bool liked = await isLiked(widgetId); + if (!liked) return; + } + await db.execute( + "DELETE FROM like_widget " + "WHERE widget_id = ?", + [widgetId]); + } + + // 判断组件是否已 liked + Future isLiked(int widgetId) async { + var data = await db.rawQuery( + "Select count(id) as `count` FROM like_widget " + "WHERE widget_id = ?", + [widgetId]); + if (data.length > 0) { + var result = data[0]; + return result['count'] as int > 0; + } + return false; + } +} diff --git a/lib/repositories/dao/node_dao.dart b/lib/repositories/dao/node_dao.dart index 3e0ae9e..e295f71 100644 --- a/lib/repositories/dao/node_dao.dart +++ b/lib/repositories/dao/node_dao.dart @@ -1,18 +1,19 @@ import 'package:flutter_unit/repositories/bean/node_po.dart'; +import 'package:sqflite/sqflite.dart'; -import '../app_storage.dart'; +import '../app_start.dart'; class NodeDao { - final AppStorage storage; + final Database db; - NodeDao(this.storage); + + NodeDao(this.db); Future insert(NodePo widget) async { //插入方法 - final db = await storage.db; String addSql = //插入数据 "INSERT INTO " "node(widgetId,name,priority,subtitle,code) " @@ -28,14 +29,12 @@ class NodeDao { Future>> queryAll() async { //插入方法 - final db = await storage.db; return await db.rawQuery("SELECT * " "FROM node"); } //根据 id 查询组件 node Future>> queryById(int id) async { - final db = await storage.db; return await db.rawQuery( "SELECT name,subtitle,code " "FROM node " diff --git a/lib/repositories/dao/widget_dao.dart b/lib/repositories/dao/widget_dao.dart index 02e61e9..11b7767 100644 --- a/lib/repositories/dao/widget_dao.dart +++ b/lib/repositories/dao/widget_dao.dart @@ -1,45 +1,40 @@ import 'package:flutter_unit/model/enums.dart'; +import 'package:sqflite/sqflite.dart'; -import '../app_storage.dart'; +import '../app_start.dart'; import '../bean/widget_po.dart'; class WidgetDao { - final AppStorage storage; + final Database db; - - WidgetDao(this.storage); + WidgetDao(this.db); Future insert(WidgetPo widget) async { //插入方法 - final db = await storage.db; String addSql = //插入数据 "INSERT INTO " - "widget(id,name,nameCN,collected,family,lever,image,linkWidget,info) " - "VALUES (?,?,?,?,?,?,?,?,?);"; + "widget(id,name,nameCN,deprecated,family,lever,linkWidget,info) " + "VALUES (?,?,?,?,?,?,?,?);"; return await db.transaction((tran) async => await tran.rawInsert(addSql, [ widget.id, widget.name, widget.nameCN, - widget.collected, + widget.deprecated, widget.family, widget.lever, - widget.image, widget.linkWidget, widget.info ])); } Future>> queryAll() async { - final db = await storage.db; - return await db.rawQuery("SELECT * " - "FROM widget"); + return await db.rawQuery("SELECT * FROM widget"); } Future>> queryByFamily(WidgetFamily family) async { - final db = await storage.db; return await db.rawQuery( "SELECT * " "FROM widget WHERE family = ? ORDER BY lever DESC", @@ -50,8 +45,6 @@ class WidgetDao { if (ids.length == 0) { return []; } - final db = await storage.db; - String sql = "SELECT * " "FROM widget WHERE id in (${'?,' * (ids.length - 1)}?) "; @@ -59,40 +52,11 @@ class WidgetDao { } Future>> search(SearchArgs arguments) async { - final db = await storage.db; return await db.rawQuery( "SELECT * " "FROM widget WHERE name like ? AND lever IN(?,?,?,?,?) ORDER BY lever DESC", ["%${arguments.name}%", ...arguments.stars]); } - - Future>> toggleCollect(int id) async { - final db = await storage.db; - List> data = await db.rawQuery('SELECT collected FROM widget WHERE id = ?', [id]); - bool collected = data.toList()[0]['collected']==1; - return await db.rawQuery( - "UPDATE widget SET collected = ? " - "WHERE id = ?", - [collected ? 0 : 1, id]); - } - - Future>> queryCollect() async { - final db = await storage.db; - return await db.rawQuery("SELECT * " - "FROM widget WHERE collected = 1 ORDER BY family,lever DESC"); - } - - Future collected(int id) async { - final db = await storage.db; - List> data = await db.rawQuery("SELECT collected " - "FROM widget WHERE id = ?"); - - if(data.length>0){ - return data[0]['collected'] == 1; - } - return false; - } - } class SearchArgs { diff --git a/lib/repositories/local_db.dart b/lib/repositories/local_db.dart new file mode 100644 index 0000000..9434647 --- /dev/null +++ b/lib/repositories/local_db.dart @@ -0,0 +1,50 @@ +import 'package:flutter_unit/repositories/dao/like_dao.dart'; +import 'package:path/path.dart' as path; +import 'package:sqflite/sqflite.dart'; + +import 'dao/category_dao.dart'; +import 'dao/node_dao.dart'; +import 'dao/widget_dao.dart'; + +class LocalDb { + Database _database; + + LocalDb._(); + + static LocalDb instance = LocalDb._(); + + WidgetDao _widgetDao; + CategoryDao _categoryDao; + NodeDao _nodeDao; + LikeDao _likeDao; + + WidgetDao get widgetDao => _widgetDao; + + CategoryDao get categoryDao => _categoryDao; + + NodeDao get nodeDao => _nodeDao; + + LikeDao get likeDao => _likeDao; + + Database get db => _database; + + Future initDb({String name = "flutter.db"}) async { + if (_database != null) return; + String databasesPath = await getDatabasesPath(); + String dbPath = path.join(databasesPath, name); + + _database = await openDatabase(dbPath); + + _widgetDao = WidgetDao(_database); + _categoryDao = CategoryDao(_database); + _nodeDao = NodeDao(_database); + _likeDao = LikeDao(_database); + + print('初始化数据库....'); + } + + Future closeDb() async { + await _database.close(); + _database = null; + } +} diff --git a/lib/repositories/dao/local_storage.dart b/lib/repositories/local_storage.dart similarity index 76% rename from lib/repositories/dao/local_storage.dart rename to lib/repositories/local_storage.dart index 1dc574e..3eb9afe 100644 --- a/lib/repositories/dao/local_storage.dart +++ b/lib/repositories/local_storage.dart @@ -8,6 +8,7 @@ class LocalStorage { static String tokenKey= "token_key"; static String userKey= "user_key"; + static String dbVersionKey= "db_version_key"; static SharedPreferences _sp; @@ -27,6 +28,14 @@ class LocalStorage { return (await sp).get(key); } + static Future saveInt(String key, int value) async { + return (await sp).setInt(key, value); + } + + static Future getInt(String key) async { + return (await sp).getInt(key); + } + static Future remove(String key) async { return (await sp).remove(key); } diff --git a/lib/repositories/rep/category_repository.dart b/lib/repositories/rep/category_repository.dart index 49d3f5a..7cac3d2 100644 --- a/lib/repositories/rep/category_repository.dart +++ b/lib/repositories/rep/category_repository.dart @@ -26,7 +26,6 @@ abstract class CategoryRepository { // 根据 Category 数据 同步 收藏集 Future syncCategoryByData(String data,String likeData); - //添加收藏集 Future addCategory(CategoryPo categoryPo); diff --git a/lib/repositories/rep/impl/catagory_db_repository.dart b/lib/repositories/rep/impl/catagory_db_repository.dart index 934912a..ffb0cce 100644 --- a/lib/repositories/rep/impl/catagory_db_repository.dart +++ b/lib/repositories/rep/impl/catagory_db_repository.dart @@ -6,9 +6,11 @@ import 'package:flutter_unit/model/widget_model.dart'; import 'package:flutter_unit/repositories/bean/category_po.dart'; import 'package:flutter_unit/repositories/bean/widget_po.dart'; import 'package:flutter_unit/repositories/dao/category_dao.dart'; +import 'package:flutter_unit/repositories/local_db.dart'; import 'package:flutter_unit/repositories/rep/category_repository.dart'; +import 'package:sqflite/sqflite.dart'; -import '../../app_storage.dart'; +import '../../app_start.dart'; @@ -19,13 +21,10 @@ import '../../app_storage.dart'; /// 说明: class CategoryDbRepository implements CategoryRepository { - final AppStorage storage; - CategoryDao _categoryDao; + CategoryDao get _categoryDao => LocalDb.instance.categoryDao; - CategoryDbRepository(this.storage) { - _categoryDao = CategoryDao(storage); - } + Database get db => LocalDb.instance.db; @override Future addCategory(CategoryPo categoryPo) async { @@ -102,8 +101,6 @@ class CategoryDbRepository implements CategoryRepository { @override Future> loadLikesData() async { - - final db = await storage.db; var likes = await db.rawQuery("SELECT id " "FROM widget WHERE collected = 1 ORDER BY family,lever DESC"); var likesData = likes.map((e) => e['id']).toList(); @@ -114,7 +111,6 @@ class CategoryDbRepository implements CategoryRepository { Future _setLikes(List ids) async { if(ids.isEmpty) return; - final db = await storage.db; String sql = 'UPDATE widget SET collected = 1 WHERE '; for(int i=0;i LocalDb.instance.widgetDao; + NodeDao get _nodeDao => LocalDb.instance.nodeDao; + LikeDao get _likeDao => LocalDb.instance.likeDao; @override Future> loadWidgets(WidgetFamily family) async { @@ -39,10 +36,10 @@ class WidgetDbRepository implements WidgetRepository { @override Future> loadLikeWidgets() async { - List> data = await _widgetDao.queryCollect(); + List likeIds = await _likeDao.likeWidgetIds(); + List> data = await _widgetDao.queryByIds(likeIds); List widgets = data.map((e) => WidgetPo.fromJson(e)).toList(); - List list = widgets.map(WidgetModel.fromPo).toList(); - return list; + return widgets.map(WidgetModel.fromPo).toList(); } @override @@ -71,12 +68,12 @@ class WidgetDbRepository implements WidgetRepository { Future toggleLike( int id, ) { - return _widgetDao.toggleCollect(id); + return _likeDao.toggleCollect(id); } @override - Future collected(int id) async{ - return await _widgetDao.collected(id); + Future collected(int id) async{ + return await _likeDao.like(id); } } diff --git a/lib/repositories/rep/widget_repository.dart b/lib/repositories/rep/widget_repository.dart index c28dbd8..507195c 100644 --- a/lib/repositories/rep/widget_repository.dart +++ b/lib/repositories/rep/widget_repository.dart @@ -19,5 +19,5 @@ abstract class WidgetRepository { Future> loadLikeWidgets(); - Future collected(int id); + Future collected(int id); } diff --git a/lib/user_system/bloc/authentic/bloc.dart b/lib/user_system/bloc/authentic/bloc.dart index 365b1de..3c9328b 100644 --- a/lib/user_system/bloc/authentic/bloc.dart +++ b/lib/user_system/bloc/authentic/bloc.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:bloc/bloc.dart'; import 'package:flutter_unit/app/utils/http_utils/http_util.dart'; -import 'package:flutter_unit/repositories/dao/local_storage.dart'; +import 'package:flutter_unit/repositories/local_storage.dart'; import 'package:flutter_unit/user_system/model/user.dart'; import 'package:jwt_decoder/jwt_decoder.dart'; diff --git a/lib/views/components/project/items/widget/coupon_widget_list_item.dart b/lib/views/components/project/items/widget/coupon_widget_list_item.dart index 882a498..b855f63 100644 --- a/lib/views/components/project/items/widget/coupon_widget_list_item.dart +++ b/lib/views/components/project/items/widget/coupon_widget_list_item.dart @@ -119,9 +119,11 @@ class CouponWidgetListItem extends StatelessWidget { Expanded( child: Text(data.name, overflow: TextOverflow.ellipsis, - style: const TextStyle( + style: TextStyle( fontSize: 17, fontWeight: FontWeight.bold, + decoration: (data.deprecated)?TextDecoration.lineThrough:TextDecoration.none, + decorationThickness: 2, shadows: [ Shadow(color: Colors.white, offset: Offset(.3, .3)) ])), diff --git a/lib/views/components/project/items/widget/simple_widget_list_item.dart b/lib/views/components/project/items/widget/simple_widget_list_item.dart index 1a3fb36..96425c6 100644 --- a/lib/views/components/project/items/widget/simple_widget_list_item.dart +++ b/lib/views/components/project/items/widget/simple_widget_list_item.dart @@ -118,9 +118,11 @@ class SimpleWidgetListItem extends StatelessWidget { Expanded( child: Text(data.name, overflow: TextOverflow.ellipsis, - style: const TextStyle( + style: TextStyle( fontSize: 17, fontWeight: FontWeight.bold, + decoration: (data.deprecated)?TextDecoration.lineThrough:TextDecoration.none, + decorationThickness: 2, shadows: [ Shadow(color: Colors.white, offset: Offset(.3, .3)) ])), diff --git a/lib/views/components/project/items/widget/techno_widget_list_item.dart b/lib/views/components/project/items/widget/techno_widget_list_item.dart index 2a41ce9..3bebbf9 100644 --- a/lib/views/components/project/items/widget/techno_widget_list_item.dart +++ b/lib/views/components/project/items/widget/techno_widget_list_item.dart @@ -112,9 +112,11 @@ class TechnoWidgetListItem extends StatelessWidget { Expanded( child: Text(data.name, overflow: TextOverflow.ellipsis, - style: const TextStyle( + style: TextStyle( fontSize: 17, fontWeight: FontWeight.bold, + decoration: (data.deprecated)?TextDecoration.lineThrough:TextDecoration.none, + decorationThickness: 2, shadows: [ Shadow(color: Colors.white, offset: Offset(.3, .3)) ])), diff --git a/lib/views/pages/app/bloc_wrapper.dart b/lib/views/pages/app/bloc_wrapper.dart index d875881..6fae612 100644 --- a/lib/views/pages/app/bloc_wrapper.dart +++ b/lib/views/pages/app/bloc_wrapper.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_unit/repositories/app_storage.dart'; +import 'package:flutter_unit/repositories/app_start.dart'; +import 'package:flutter_unit/repositories/local_db.dart'; import 'package:flutter_unit/repositories/rep/impl/catagory_db_repository.dart'; import 'package:flutter_unit/repositories/rep/impl/widget_db_repository.dart'; import 'package:flutter_unit/repositories/rep/widget_repository.dart'; @@ -16,7 +17,7 @@ import 'package:flutter_unit/blocs/bloc_exp.dart'; /// contact me by email 1981462002@qq.com /// 说明: Bloc提供器包裹层 -final AppStorage storage = AppStorage(); +final AppStart storage = AppStart(); class BlocWrapper extends StatefulWidget { final Widget child; @@ -28,9 +29,9 @@ class BlocWrapper extends StatefulWidget { } class _BlocWrapperState extends State { - final WidgetRepository repository = WidgetDbRepository(storage); + final WidgetRepository repository = WidgetDbRepository(); - final categoryBloc = CategoryBloc(repository: CategoryDbRepository(storage)); + final categoryBloc = CategoryBloc(repository: CategoryDbRepository()); final authBloc = AuthenticBloc()..add(const AppStarted()); @override @@ -79,6 +80,7 @@ class _BlocWrapperState extends State { void dispose() { categoryBloc.close(); authBloc.close(); + LocalDb.instance.closeDb(); super.dispose(); } } diff --git a/lib/views/pages/category/category_page.dart b/lib/views/pages/category/category_page.dart index 32fe945..3f6596e 100644 --- a/lib/views/pages/category/category_page.dart +++ b/lib/views/pages/category/category_page.dart @@ -3,13 +3,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_unit/app/router/unit_router.dart'; import 'package:flutter_unit/blocs/bloc_exp.dart'; +import 'package:flutter_unit/model/category_model.dart'; import 'package:flutter_unit/views/components/permanent/circle.dart'; import 'package:flutter_unit/views/components/project/default/loading_shower.dart'; -import 'package:flutter_unit/views/components/project/no_more_widget.dart'; - -import 'package:flutter_unit/model/category_model.dart'; import 'package:flutter_unit/views/components/project/dialogs/delete_category_dialog.dart'; import 'package:flutter_unit/views/components/project/items/category_list_item.dart'; +import 'package:flutter_unit/views/components/project/no_more_widget.dart'; import 'edit_category_panel.dart'; import 'empty_category.dart'; @@ -26,7 +25,6 @@ class CategoryPage extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder(builder: (ctx, state) { - print(state); if (state is CategoryLoadedState) { return CustomScrollView( slivers: [ @@ -47,18 +45,21 @@ class CategoryPage extends StatelessWidget { _buildContent(BuildContext context, CategoryLoadedState state) { return SliverPadding( - padding: EdgeInsets.only(top:10, left: 10, right: 10, bottom: 0), + padding: const EdgeInsets.only(top: 10, left: 10, right: 10, bottom: 0), sliver: SliverGrid( delegate: SliverChildBuilderDelegate( - (_, index) => Container( - child: GestureDetector( - onTap: () => _toDetailPage(context, state.categories[index]), - child: CategoryListItem( - data: state.categories[index], - onDeleteItemClick: (model) => _deleteCollect(context, model), - onEditItemClick: (model) => _editCollect(context, model), - )), - ), + (_, index) => Container( + child: GestureDetector( + onTap: () => + _toDetailPage(context, state.categories[index]), + child: CategoryListItem( + data: state.categories[index], + onDeleteItemClick: (model) => + _deleteCollect(context, model), + onEditItemClick: (model) => + _editCollect(context, model), + )), + ), childCount: state.categories.length), gridDelegate: gridDelegate), ); diff --git a/lib/views/pages/widget_detail/widget_detail_page.dart b/lib/views/pages/widget_detail/widget_detail_page.dart index 1487118..f84712c 100644 --- a/lib/views/pages/widget_detail/widget_detail_page.dart +++ b/lib/views/pages/widget_detail/widget_detail_page.dart @@ -203,7 +203,9 @@ class _WidgetDetailPageState extends State { elevation: 2, shadowColor: Colors.orange, backgroundColor: Theme.of(context).primaryColor, - labelStyle: const TextStyle(fontSize: 12, color: Colors.white), + labelStyle: TextStyle(fontSize: 12, color: Colors.white, + decoration: (e.deprecated)?TextDecoration.lineThrough:TextDecoration.none, + decorationThickness: 2,), label: Text('${e.name}'), )) .toList(), @@ -245,6 +247,8 @@ class WidgetDetailTitle extends StatelessWidget { model.nameCN, style: TextStyle( fontSize: 20, + decoration: (model.deprecated)?TextDecoration.lineThrough:TextDecoration.none, + decorationThickness: 2, color: Color(0xff1EBBFD), fontWeight: FontWeight.bold), ), diff --git a/pubspec.yaml b/pubspec.yaml index edc29a7..6c355fb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_unit description: A new Flutter application. -version: 1.5.0 +version: 1.5.1 author: 张风捷特烈 <1981462002@qq.com> homepage: https://juejin.cn/user/149189281194766/posts @@ -41,6 +41,7 @@ flutter: - assets/images/head_icon/ - assets/images/widgets/ - assets/flutter.db + - assets/version.json fonts: # 配置字体,可配置多个,支持ttf和otf,ttc等字体资源 - family: IndieFlower #字体名