diff --git a/README.md b/README.md index 5f12dff..4b7cb4a 100644 --- a/README.md +++ b/README.md @@ -22,14 +22,17 @@ full API reference. | :heart: | :fire: | :sparkles: | :ok_hand: | | -----| ---- | ---- | ---- | -| ![](static/screenshot/Screenshot_20210529-133203.jpg) | ![](static/screenshot/Screenshot_20210529-133232.jpg) | ![](static/screenshot/Screenshot_20210529-133246.jpg) | ![](static/screenshot/Screenshot_20210529-133306.jpg) | -| ![](static/screenshot/Screenshot_20210529-133328.jpg) | ![](static/screenshot/Screenshot_20210529-133336.jpg) | ![](static/screenshot/Screenshot_20210529-133349.jpg) | ![](static/screenshot/Screenshot_20210529-133409.jpg) | -| ![](static/screenshot/Screenshot_20210529-140004.jpg) | ![](static/screenshot/Screenshot_20210529-140019.jpg) | ![](static/screenshot/Screenshot_20210529-140052.jpg) | ![](static/screenshot/Screenshot_20210529-141624.jpg) | -| ![](static/screenshot/Screenshot_20210529-141657.jpg) | ![](static/screenshot/Screenshot_20210529-142739.jpg) | ![](static/screenshot/Screenshot_20210529-142758.jpg) | ![](static/screenshot/Screenshot_20210529-142810.jpg) | -| ![](static/screenshot/Screenshot_20210529-142825.jpg) | ![](static/screenshot/Screenshot_20210529-142835.jpg) | ![](static/screenshot/Screenshot_20210529-142851.jpg) | ![](static/screenshot/Screenshot_20210529-142912.jpg) | -| ![](static/screenshot/Screenshot_20210529-142918.jpg) | ![](static/screenshot/Screenshot_20210529-142925.jpg) | ![](static/screenshot/Screenshot_20210529-142929.jpg) | ![](static/screenshot/Screenshot_20210529-143110.jpg) | -| ![](static/screenshot/Screenshot_20210529-143116.jpg) | ![](static/screenshot/Screenshot_20210529-143127.jpg) | ![](static/screenshot/Screenshot_20210529-143215.jpg) | ![](static/screenshot/Screenshot_20210529-143302.jpg) | -| ![](static/screenshot/Screenshot_20210529-143317.jpg) | ![](static/screenshot/Screenshot_20210529-143328.jpg) | ![](static/screenshot/Screenshot_20210529-143342.jpg) | +| ![](static/screenshot/img.png) | ![](static/screenshot/img1.png) | ![](static/screenshot/img2.png) | ![](static/screenshot/img3.png) | +| ![](static/screenshot/img_1.png) | ![](static/screenshot/img_2.png) | ![](static/screenshot/img_3.png) | ![](static/screenshot/img_4.png) | +| ![](static/screenshot/img_5.png) | ![](static/screenshot/img_6.png) | ![](static/screenshot/Screenshot_20210529-133203.jpg) | ![](static/screenshot/Screenshot_20210529-133232.jpg) | +| ![](static/screenshot/Screenshot_20210529-133246.jpg) | ![](static/screenshot/Screenshot_20210529-133306.jpg) | ![](static/screenshot/Screenshot_20210529-133328.jpg) | ![](static/screenshot/Screenshot_20210529-133336.jpg) | +| ![](static/screenshot/Screenshot_20210529-133349.jpg) | ![](static/screenshot/Screenshot_20210529-133409.jpg) | ![](static/screenshot/Screenshot_20210529-140004.jpg) | ![](static/screenshot/Screenshot_20210529-140019.jpg) | +| ![](static/screenshot/Screenshot_20210529-140052.jpg) | ![](static/screenshot/Screenshot_20210529-141624.jpg) | ![](static/screenshot/Screenshot_20210529-141657.jpg) | ![](static/screenshot/Screenshot_20210529-142739.jpg) | +| ![](static/screenshot/Screenshot_20210529-142758.jpg) | ![](static/screenshot/Screenshot_20210529-142810.jpg) | ![](static/screenshot/Screenshot_20210529-142825.jpg) | ![](static/screenshot/Screenshot_20210529-142835.jpg) | +| ![](static/screenshot/Screenshot_20210529-142851.jpg) | ![](static/screenshot/Screenshot_20210529-142912.jpg) | ![](static/screenshot/Screenshot_20210529-142918.jpg) | ![](static/screenshot/Screenshot_20210529-142925.jpg) | +| ![](static/screenshot/Screenshot_20210529-142929.jpg) | ![](static/screenshot/Screenshot_20210529-143110.jpg) | ![](static/screenshot/Screenshot_20210529-143116.jpg) | ![](static/screenshot/Screenshot_20210529-143127.jpg) | +| ![](static/screenshot/Screenshot_20210529-143215.jpg) | ![](static/screenshot/Screenshot_20210529-143302.jpg) | ![](static/screenshot/Screenshot_20210529-143317.jpg) | ![](static/screenshot/Screenshot_20210529-143328.jpg) | +| ![](static/screenshot/Screenshot_20210529-143342.jpg) | ## Dependencies diff --git a/lib/main.dart b/lib/main.dart index 0f8da02..53394d5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,6 +16,7 @@ import 'package:mikan_flutter/providers/firebase_model.dart'; import 'package:mikan_flutter/providers/home_model.dart'; import 'package:mikan_flutter/providers/index_model.dart'; import 'package:mikan_flutter/providers/list_model.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/subscribed_model.dart'; import 'package:mikan_flutter/providers/theme_model.dart'; import 'package:oktoast/oktoast.dart'; @@ -92,6 +93,9 @@ class MikanApp extends StatelessWidget { ChangeNotifierProvider( create: (_) => SubscribedModel(), ), + ChangeNotifierProvider( + create: (_) => OpModel(), + ), ChangeNotifierProvider( create: (context) => IndexModel(context.read()), ), diff --git a/lib/providers/op_model.dart b/lib/providers/op_model.dart new file mode 100644 index 0000000..aaeb32c --- /dev/null +++ b/lib/providers/op_model.dart @@ -0,0 +1,51 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:mikan_flutter/internal/extension.dart'; +import 'package:mikan_flutter/internal/http.dart'; +import 'package:mikan_flutter/internal/repo.dart'; +import 'package:mikan_flutter/providers/base_model.dart'; + +class OpModel extends CancelableBaseModel { + subscribeBangumi( + final String bangumiId, + final bool subscribed, { + final String? subgroupId, + final VoidCallback? onSuccess, + final ValueChanged? onError, + }) async { + if (bangumiId.isNullOrBlank) { + return "番组id为空,忽略当前订阅".toast(); + } + final int? bid = int.tryParse(bangumiId); + if (bid == null) { + return "番组id为空,忽略当前订阅".toast(); + } + int? sid; + if (subgroupId.isNotBlank) { + sid = int.tryParse(subgroupId!); + if (sid == null) { + return "字幕组id解析错误,忽略当前订阅".toast(); + } + } + final Resp resp = await (this + + Repo.subscribeBangumi( + bid, + subscribed, + subgroupId: sid, + )); + if (resp.success) { + onSuccess?.call(); + } else { + onError?.call(resp.msg); + } + } + + String _flag = ""; + + String get flag => _flag; + + subscribeChanged(String flag) { + this._flag = flag; + notifyListeners(); + } +} diff --git a/lib/providers/record_detail_model.dart b/lib/providers/record_detail_model.dart index dd34421..6e428a7 100644 --- a/lib/providers/record_detail_model.dart +++ b/lib/providers/record_detail_model.dart @@ -60,4 +60,8 @@ class RecordDetailModel extends CancelableBaseModel { } notifyListeners(); } + + subscribeChanged() { + notifyListeners(); + } } diff --git a/lib/providers/subscribed_model.dart b/lib/providers/subscribed_model.dart index b4f3580..abda2cd 100644 --- a/lib/providers/subscribed_model.dart +++ b/lib/providers/subscribed_model.dart @@ -1,5 +1,4 @@ import "package:collection/collection.dart"; -import 'package:flutter/foundation.dart'; import 'package:mikan_flutter/internal/extension.dart'; import 'package:mikan_flutter/internal/http.dart'; import 'package:mikan_flutter/internal/repo.dart'; @@ -93,38 +92,4 @@ class SubscribedModel extends CancelableBaseModel { } notifyListeners(); } - - subscribeBangumi( - final String bangumiId, - final bool subscribed, { - final String? subgroupId, - final VoidCallback? onSuccess, - final ValueChanged? onError, - }) async { - if (bangumiId.isNullOrBlank) { - return "番组id为空,忽略当前订阅".toast(); - } - final int? bid = int.tryParse(bangumiId); - if (bid == null) { - return "番组id为空,忽略当前订阅".toast(); - } - int? sid; - if (subgroupId.isNotBlank) { - sid = int.tryParse(subgroupId!); - if (sid == null) { - return "字幕组id解析错误,忽略当前订阅".toast(); - } - } - final Resp resp = await (this + - Repo.subscribeBangumi( - bid, - subscribed, - subgroupId: sid, - )); - if (resp.success) { - onSuccess?.call(); - } else { - onError?.call(resp.msg); - } - } } diff --git a/lib/ui/fragments/bangumi_sliver_grid_fragment.dart b/lib/ui/fragments/bangumi_sliver_grid_fragment.dart index af3a8fa..b4efa63 100644 --- a/lib/ui/fragments/bangumi_sliver_grid_fragment.dart +++ b/lib/ui/fragments/bangumi_sliver_grid_fragment.dart @@ -9,8 +9,10 @@ import 'package:mikan_flutter/internal/delegate.dart'; import 'package:mikan_flutter/internal/extension.dart'; import 'package:mikan_flutter/mikan_flutter_routes.dart'; import 'package:mikan_flutter/model/bangumi.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/widget/tap_scale_container.dart'; +import 'package:provider/provider.dart'; typedef HandleSubscribe = void Function(Bangumi bangumi, String flag); @@ -196,39 +198,45 @@ class BangumiSliverGridFragment extends StatelessWidget { } Widget _buildSubscribeButton(final Bangumi bangumi, final String currFlag) { - return bangumi.subscribed - ? SizedBox( - width: 28.0, - height: 28.0, - child: IconButton( - tooltip: "取消订阅", - padding: edge4, - iconSize: 20.0, - icon: Icon( - FluentIcons.heart_24_filled, - color: Colors.redAccent, - ), - onPressed: () { - this.handleSubscribe.call(bangumi, currFlag); - }, - ), - ) - : SizedBox( - width: 28.0, - height: 28.0, - child: IconButton( - tooltip: "订阅", - padding: edge4, - iconSize: 20.0, - icon: Icon( - FluentIcons.heart_24_regular, - color: Colors.blueGrey, - ), - onPressed: () { - this.handleSubscribe.call(bangumi, currFlag); - }, - ), - ); + return Selector( + selector: (_, model) => model.flag, + shouldRebuild: (_, next) => next == currFlag, + builder: (_, __, ___) { + return bangumi.subscribed + ? SizedBox( + width: 28.0, + height: 28.0, + child: IconButton( + tooltip: "取消订阅", + padding: edge4, + iconSize: 20.0, + icon: Icon( + FluentIcons.heart_24_filled, + color: Colors.redAccent, + ), + onPressed: () { + this.handleSubscribe.call(bangumi, currFlag); + }, + ), + ) + : SizedBox( + width: 28.0, + height: 28.0, + child: IconButton( + tooltip: "订阅", + padding: edge4, + iconSize: 20.0, + icon: Icon( + FluentIcons.heart_24_regular, + color: Colors.blueGrey, + ), + onPressed: () { + this.handleSubscribe.call(bangumi, currFlag); + }, + ), + ); + }, + ); } Widget _buildBangumiItemCover( diff --git a/lib/ui/fragments/index_fragment.dart b/lib/ui/fragments/index_fragment.dart index f64ba9b..2580ccb 100644 --- a/lib/ui/fragments/index_fragment.dart +++ b/lib/ui/fragments/index_fragment.dart @@ -17,7 +17,7 @@ import 'package:mikan_flutter/model/record_item.dart'; import 'package:mikan_flutter/model/season.dart'; import 'package:mikan_flutter/model/user.dart'; import 'package:mikan_flutter/providers/index_model.dart'; -import 'package:mikan_flutter/providers/subscribed_model.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/ui/components/ova_record_item.dart'; import 'package:mikan_flutter/ui/fragments/bangumi_sliver_grid_fragment.dart'; @@ -86,11 +86,14 @@ class IndexFragment extends StatelessWidget { padding: edgeHB16T4, bangumis: bangumiRow.bangumis, handleSubscribe: (bangumi, flag) { - context.read().subscribeBangumi( + context.read().subscribeBangumi( bangumi.id, bangumi.subscribed, onSuccess: () { bangumi.subscribed = !bangumi.subscribed; + context + .read() + .subscribeChanged(flag); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/lib/ui/fragments/subscribed_fragment.dart b/lib/ui/fragments/subscribed_fragment.dart index 43f738f..a850f6d 100644 --- a/lib/ui/fragments/subscribed_fragment.dart +++ b/lib/ui/fragments/subscribed_fragment.dart @@ -15,6 +15,7 @@ import 'package:mikan_flutter/model/bangumi.dart'; import 'package:mikan_flutter/model/record_item.dart'; import 'package:mikan_flutter/model/season_gallery.dart'; import 'package:mikan_flutter/model/year_season.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/subscribed_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/ui/components/rss_record_item.dart'; @@ -179,11 +180,12 @@ class SubscribedFragment extends StatelessWidget { bangumis: bangumis!, padding: edgeH16V8, handleSubscribe: (bangumi, flag) { - context.read().subscribeBangumi( + context.read().subscribeBangumi( bangumi.id, bangumi.subscribed, onSuccess: () { bangumi.subscribed = !bangumi.subscribed; + context.read().subscribeChanged(flag); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/lib/ui/pages/record_detail_page.dart b/lib/ui/pages/record_detail_page.dart index d10fd71..310a8e5 100644 --- a/lib/ui/pages/record_detail_page.dart +++ b/lib/ui/pages/record_detail_page.dart @@ -12,8 +12,8 @@ import 'package:mikan_flutter/internal/delegate.dart'; import 'package:mikan_flutter/internal/extension.dart'; import 'package:mikan_flutter/internal/screen.dart'; import 'package:mikan_flutter/model/record_details.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/record_detail_model.dart'; -import 'package:mikan_flutter/providers/subscribed_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:provider/provider.dart'; import 'package:waterfall_flow/waterfall_flow.dart'; @@ -529,12 +529,12 @@ class RecordDetailPage extends StatelessWidget { color: Colors.redAccent, ), onPressed: () { - context.read().subscribeBangumi( + context.read().subscribeBangumi( recordDetail.id, recordDetail.subscribed, onSuccess: () { recordDetail.subscribed = !recordDetail.subscribed; - context.read().notifyListeners(); + context.read().subscribeChanged(); }, onError: (msg) { "订阅失败:$msg".toast(); @@ -551,12 +551,12 @@ class RecordDetailPage extends StatelessWidget { color: Colors.blueGrey, ), onPressed: () { - context.read().subscribeBangumi( + context.read().subscribeBangumi( recordDetail.id, recordDetail.subscribed, onSuccess: () { recordDetail.subscribed = !recordDetail.subscribed; - context.read().notifyListeners(); + context.read().subscribeChanged(); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/lib/ui/pages/season_list_page.dart b/lib/ui/pages/season_list_page.dart index 571be51..a5efa70 100644 --- a/lib/ui/pages/season_list_page.dart +++ b/lib/ui/pages/season_list_page.dart @@ -8,8 +8,8 @@ import 'package:mikan_flutter/internal/screen.dart'; import 'package:mikan_flutter/model/bangumi_row.dart'; import 'package:mikan_flutter/model/season_bangumi_rows.dart'; import 'package:mikan_flutter/model/year_season.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/season_list_model.dart'; -import 'package:mikan_flutter/providers/subscribed_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/ui/fragments/bangumi_sliver_grid_fragment.dart'; import 'package:mikan_flutter/widget/refresh_indicator.dart'; @@ -116,11 +116,12 @@ class SeasonListPage extends StatelessWidget { padding: edge16, bangumis: bangumiRow.bangumis, handleSubscribe: (bangumi, flag) { - context.read().subscribeBangumi( + context.read().subscribeBangumi( bangumi.id, bangumi.subscribed, onSuccess: () { bangumi.subscribed = !bangumi.subscribed; + context.read().subscribeChanged(flag); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/lib/ui/pages/single_season_page.dart b/lib/ui/pages/single_season_page.dart index b636f6d..5612749 100644 --- a/lib/ui/pages/single_season_page.dart +++ b/lib/ui/pages/single_season_page.dart @@ -6,8 +6,8 @@ import 'package:mikan_flutter/internal/extension.dart'; import 'package:mikan_flutter/internal/screen.dart'; import 'package:mikan_flutter/model/bangumi_row.dart'; import 'package:mikan_flutter/model/season.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/season_model.dart'; -import 'package:mikan_flutter/providers/subscribed_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/ui/fragments/bangumi_sliver_grid_fragment.dart'; import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; @@ -78,13 +78,14 @@ class SingleSeasonPage extends StatelessWidget { padding: edge16, bangumis: bangumiRow.bangumis, handleSubscribe: (bangumi, flag) { - context - .read() - .subscribeBangumi( + context.read().subscribeBangumi( bangumi.id, bangumi.subscribed, onSuccess: () { bangumi.subscribed = !bangumi.subscribed; + context + .read() + .subscribeChanged(flag); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/lib/ui/pages/subgroup_page.dart b/lib/ui/pages/subgroup_page.dart index 0ea06b6..70c9f59 100644 --- a/lib/ui/pages/subgroup_page.dart +++ b/lib/ui/pages/subgroup_page.dart @@ -7,8 +7,8 @@ import 'package:mikan_flutter/internal/extension.dart'; import 'package:mikan_flutter/internal/screen.dart'; import 'package:mikan_flutter/model/season_gallery.dart'; import 'package:mikan_flutter/model/subgroup.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/subgroup_model.dart'; -import 'package:mikan_flutter/providers/subscribed_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/ui/fragments/bangumi_sliver_grid_fragment.dart'; import 'package:provider/provider.dart'; @@ -109,11 +109,12 @@ class SubgroupPage extends StatelessWidget { padding: edgeHB16T4, bangumis: gallery.bangumis, handleSubscribe: (bangumi, flag) { - context.read().subscribeBangumi( + context.read().subscribeBangumi( bangumi.id, bangumi.subscribed, onSuccess: () { bangumi.subscribed = !bangumi.subscribed; + context.read().subscribeChanged(flag); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/lib/ui/pages/subscribed_season_page.dart b/lib/ui/pages/subscribed_season_page.dart index 9ddabf5..8562097 100644 --- a/lib/ui/pages/subscribed_season_page.dart +++ b/lib/ui/pages/subscribed_season_page.dart @@ -10,7 +10,7 @@ import 'package:mikan_flutter/mikan_flutter_routes.dart'; import 'package:mikan_flutter/model/season.dart'; import 'package:mikan_flutter/model/season_gallery.dart'; import 'package:mikan_flutter/model/year_season.dart'; -import 'package:mikan_flutter/providers/subscribed_model.dart'; +import 'package:mikan_flutter/providers/op_model.dart'; import 'package:mikan_flutter/providers/subscribed_season_model.dart'; import 'package:mikan_flutter/topvars.dart'; import 'package:mikan_flutter/ui/fragments/bangumi_sliver_grid_fragment.dart'; @@ -124,11 +124,12 @@ class SubscribedSeasonPage extends StatelessWidget { padding: edge16, bangumis: gallery.bangumis, handleSubscribe: (bangumi, flag) { - context.read().subscribeBangumi( + context.read().subscribeBangumi( bangumi.id, bangumi.subscribed, onSuccess: () { bangumi.subscribed = !bangumi.subscribed; + context.read().subscribeChanged(flag); }, onError: (msg) { "订阅失败:$msg".toast(); diff --git a/pubspec.yaml b/pubspec.yaml index 76af678..cb10e20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: mikan_flutter description: mikanani.me -version: 1.0.0-RC1+23 +version: 1.0.0-RC2+24 publish_to: none @@ -15,7 +15,7 @@ dependencies: firebase_core: ^1.2.0 firebase_analytics: ^8.1.0 firebase_crashlytics: ^2.0.4 - path_provider: ^2.0.1 + path_provider: ^2.0.2 dio: ^4.0.0 dio_cookie_manager: ^2.0.0 dio_http2_adapter: ^2.0.0 @@ -27,7 +27,7 @@ dependencies: hive_flutter: ^1.0.0 palette_generator: ^0.3.0 flutter_spinkit: ^5.0.0 - fluentui_system_icons: ^1.1.124 + fluentui_system_icons: ^1.1.126 clipboard: ^0.1.3 url_launcher: ^6.0.4 share_plus: ^2.1.2 @@ -44,15 +44,15 @@ dependencies: url: https://github.com/iota9star/isolate ref: master flutter_colorpicker: ^0.4.0 - connectivity: ^3.0.4 + connectivity: ^3.0.6 ff_annotation_route_core: ^2.0.2 ff_annotation_route_library: ^2.0.1 sprung: ^3.0.0 sliver_tools: ^0.2.2 dev_dependencies: - build_runner: ^2.0.3 - json_serializable: ^4.1.2 + build_runner: ^2.0.4 + json_serializable: ^4.1.3 hive_generator: ^1.1.0 flutter_launcher_icons: ^0.9.0 yaml: ^3.1.0 diff --git a/static/screenshot/img.png b/static/screenshot/img.png new file mode 100644 index 0000000..9a7974a Binary files /dev/null and b/static/screenshot/img.png differ diff --git a/static/screenshot/img1.png b/static/screenshot/img1.png new file mode 100644 index 0000000..dfaa670 Binary files /dev/null and b/static/screenshot/img1.png differ diff --git a/static/screenshot/img2.png b/static/screenshot/img2.png new file mode 100644 index 0000000..e24c5a9 Binary files /dev/null and b/static/screenshot/img2.png differ diff --git a/static/screenshot/img3.png b/static/screenshot/img3.png new file mode 100644 index 0000000..36094e2 Binary files /dev/null and b/static/screenshot/img3.png differ diff --git a/static/screenshot/img_1.png b/static/screenshot/img_1.png new file mode 100644 index 0000000..feb6155 Binary files /dev/null and b/static/screenshot/img_1.png differ diff --git a/static/screenshot/img_2.png b/static/screenshot/img_2.png new file mode 100644 index 0000000..70769bb Binary files /dev/null and b/static/screenshot/img_2.png differ diff --git a/static/screenshot/img_3.png b/static/screenshot/img_3.png new file mode 100644 index 0000000..1de6b6c Binary files /dev/null and b/static/screenshot/img_3.png differ diff --git a/static/screenshot/img_4.png b/static/screenshot/img_4.png new file mode 100644 index 0000000..2495dcd Binary files /dev/null and b/static/screenshot/img_4.png differ diff --git a/static/screenshot/img_5.png b/static/screenshot/img_5.png new file mode 100644 index 0000000..c701632 Binary files /dev/null and b/static/screenshot/img_5.png differ diff --git a/static/screenshot/img_6.png b/static/screenshot/img_6.png new file mode 100644 index 0000000..449380c Binary files /dev/null and b/static/screenshot/img_6.png differ