├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── lwlizhe
│ │ │ │ └── flutter_novel
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── demo
└── android
│ └── app-release.apk
├── img
├── icon_tab_bookshelf_n.png
├── icon_tab_bookshelf_p.png
├── icon_tab_home_n.png
├── icon_tab_home_p.png
├── icon_tab_me_n.png
├── icon_tab_me_p.png
└── reader
│ └── icon_me_vip.png
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ └── contents.xcworkspacedata
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── lib
├── app
│ ├── api
│ │ ├── api_home.dart
│ │ ├── api_novel.dart
│ │ └── constance
│ │ │ └── const_request_url.dart
│ ├── constant
│ │ └── custom_color.dart
│ ├── main
│ │ └── main_page_view.dart
│ ├── novel
│ │ ├── entity
│ │ │ ├── entity_novel_book_chapter.dart
│ │ │ ├── entity_novel_book_chapter.g.dart
│ │ │ ├── entity_novel_book_key_word_search.dart
│ │ │ ├── entity_novel_book_key_word_search.g.dart
│ │ │ ├── entity_novel_book_recommend.dart
│ │ │ ├── entity_novel_book_recommend.g.dart
│ │ │ ├── entity_novel_book_review.dart
│ │ │ ├── entity_novel_book_review.g.dart
│ │ │ ├── entity_novel_book_source.dart
│ │ │ ├── entity_novel_book_source.g.dart
│ │ │ ├── entity_novel_chapter_info.dart
│ │ │ ├── entity_novel_detail.dart
│ │ │ ├── entity_novel_detail.g.dart
│ │ │ ├── entity_novel_info.dart
│ │ │ ├── entity_novel_short_comment.dart
│ │ │ └── entity_novel_short_comment.g.dart
│ │ ├── helper
│ │ │ ├── helper_cache.dart
│ │ │ ├── helper_db.dart
│ │ │ └── helper_sp.dart
│ │ ├── model
│ │ │ ├── model_novel_cache.dart
│ │ │ └── zssq
│ │ │ │ ├── model_book_db.dart
│ │ │ │ └── model_book_net.dart
│ │ ├── view
│ │ │ ├── novel_about.dart
│ │ │ ├── novel_book_find.dart
│ │ │ ├── novel_book_intro.dart
│ │ │ ├── novel_book_leader_board.dart
│ │ │ ├── novel_book_menu.dart
│ │ │ ├── novel_book_reader.dart
│ │ │ ├── novel_book_search.dart
│ │ │ ├── novel_book_search_result.dart
│ │ │ ├── novel_book_shelf.dart
│ │ │ └── widget
│ │ │ │ ├── novel_book_intro_appbar_header_view.dart
│ │ │ │ ├── novel_book_intro_book_review_view.dart
│ │ │ │ ├── novel_book_intro_bottom_menu_view.dart
│ │ │ │ ├── novel_book_intro_copyright_notice_view.dart
│ │ │ │ ├── novel_book_intro_header_tag_view.dart
│ │ │ │ ├── novel_book_intro_recommend_view.dart
│ │ │ │ └── novel_book_intro_short_comment_view.dart
│ │ ├── view_model
│ │ │ ├── view_model_novel_intro.dart
│ │ │ ├── view_model_novel_reader.dart
│ │ │ ├── view_model_novel_search.dart
│ │ │ └── view_model_novel_shelf.dart
│ │ └── widget
│ │ │ └── reader
│ │ │ ├── cache
│ │ │ ├── novel_config_manager.dart
│ │ │ └── novel_content_cache_manager.dart
│ │ │ ├── content
│ │ │ ├── helper
│ │ │ │ ├── animation
│ │ │ │ │ ├── animation_page_base.dart
│ │ │ │ │ ├── animation_page_cover.dart
│ │ │ │ │ ├── animation_page_simulation_turn.dart
│ │ │ │ │ ├── animation_page_slide.dart
│ │ │ │ │ └── controller_animation_with_listener_number.dart
│ │ │ │ ├── helper_reader_animation.dart
│ │ │ │ ├── helper_reader_content.dart
│ │ │ │ └── manager_reader_page.dart
│ │ │ ├── widget_reader_content.dart
│ │ │ └── widget_reader_painter.dart
│ │ │ ├── manager
│ │ │ └── manager_reader_progress.dart
│ │ │ ├── menu
│ │ │ ├── manager_menu_widget.dart
│ │ │ ├── widget_reader_bottom_menu.dart
│ │ │ ├── widget_reader_catalog_menu.dart
│ │ │ ├── widget_reader_setting_menu.dart
│ │ │ └── widget_reader_top_menu.dart
│ │ │ ├── model
│ │ │ ├── model_reader_config.dart
│ │ │ └── model_reader_content.dart
│ │ │ └── widget
│ │ │ ├── widget_novel_reader_error.dart
│ │ │ └── widget_novel_reader_loadding.dart
│ ├── provider_setup.dart
│ ├── router
│ │ └── manager_router.dart
│ └── widget
│ │ ├── scrollable_positioned_list
│ │ ├── element_registry.dart
│ │ ├── item_positions_listener.dart
│ │ ├── item_positions_notifier.dart
│ │ ├── positioned_list.dart
│ │ ├── post_mount_callback.dart
│ │ └── scrollable_positioned_list.dart
│ │ ├── widget_expand_text_view.dart
│ │ └── widget_tag_view.dart
├── base
│ ├── constant
│ │ └── constant_text_style.dart
│ ├── db
│ │ └── manager_db.dart
│ ├── http
│ │ └── manager_net_request.dart
│ ├── router
│ │ └── base_router_manager.dart
│ ├── sp
│ │ └── manager_sp.dart
│ ├── structure
│ │ ├── base_model.dart
│ │ ├── base_view.dart
│ │ ├── base_view_model.dart
│ │ └── provider
│ │ │ ├── app_provider.dart
│ │ │ ├── base_provider.dart
│ │ │ ├── config_provider.dart
│ │ │ └── state_provider.dart
│ ├── util
│ │ ├── utils_color.dart
│ │ ├── utils_navigator.dart
│ │ ├── utils_screen.dart
│ │ ├── utils_time.dart
│ │ └── utils_toast.dart
│ └── widget
│ │ ├── base_list_item_holder.dart
│ │ ├── base_list_item_holder_builder.dart
│ │ └── view_common_loading.dart
└── main.dart
├── pubspec.lock
├── pubspec.yaml
└── test
└── widget_test.dart
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | .dart_tool/
26 | .flutter-plugins
27 | .packages
28 | .pub-cache/
29 | .pub/
30 | /build/
31 |
32 | # Web related
33 | lib/generated_plugin_registrant.dart
34 |
35 | # Exceptions to above rules.
36 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
37 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 1946fc4da0f80c522d7e3ae7d4f7309908ed86f2
8 | channel: unknown
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2020, lwlizhe
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | 1. Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | 2. Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | 3. Neither the name of the copyright holder nor the names of its
17 | contributors may be used to endorse or promote products derived from
18 | this software without specific prior written permission.
19 |
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | ## 前言
4 |
5 | 项目重构ing,在掘金不定时更新进度;
6 |
7 | [我的掘金账号](https://juejin.cn/user/2735240658304893)
8 |
9 | 现在重构开发分支是:dev_2.0分支;
10 |
11 | flutter版本是2.8.1
12 |
13 |
14 | ## 特别感谢
15 |
16 | [flutter_app](https://github.com/shichunlei/flutter_app)(追书神器的接口以及介绍页来自于这个项目)
17 |
18 | [BookPage](https://github.com/AnliaLee/BookPage)(阅读页的实现思路参考自这个项目)
19 |
20 | ## 免责声明
21 |
22 | 本项目仅用于研究学习,请勿用于商业,否则后果与本人无关。
23 |
24 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 28
30 |
31 | sourceSets {
32 | main.java.srcDirs += 'src/main/kotlin'
33 | }
34 |
35 | lintOptions {
36 | disable 'InvalidPackage'
37 | }
38 |
39 | defaultConfig {
40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
41 | applicationId "com.lwlizhe.flutter_novel"
42 | minSdkVersion 16
43 | targetSdkVersion 28
44 | versionCode flutterVersionCode.toInteger()
45 | versionName flutterVersionName
46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
47 | }
48 |
49 | buildTypes {
50 | release {
51 | // TODO: Add your own signing config for the release build.
52 | // Signing with the debug keys for now, so `flutter run --release` works.
53 | signingConfig signingConfigs.debug
54 | }
55 | }
56 | }
57 |
58 | flutter {
59 | source '../..'
60 | }
61 |
62 | dependencies {
63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
64 | testImplementation 'junit:junit:4.12'
65 | androidTestImplementation 'androidx.test:runner:1.1.1'
66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
67 | }
68 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
9 |
10 |
11 |
15 |
22 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/lwlizhe/flutter_novel/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.lwlizhe.flutter_novel
2 |
3 | import android.os.Bundle
4 | import io.flutter.app.FlutterActivity
5 | import io.flutter.plugins.GeneratedPluginRegistrant
6 |
7 | class MainActivity: FlutterActivity() {
8 | override fun onCreate(savedInstanceState: Bundle?) {
9 | super.onCreate(savedInstanceState)
10 | GeneratedPluginRegistrant.registerWith(this)
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/demo/android/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/demo/android/app-release.apk
--------------------------------------------------------------------------------
/img/icon_tab_bookshelf_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/icon_tab_bookshelf_n.png
--------------------------------------------------------------------------------
/img/icon_tab_bookshelf_p.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/icon_tab_bookshelf_p.png
--------------------------------------------------------------------------------
/img/icon_tab_home_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/icon_tab_home_n.png
--------------------------------------------------------------------------------
/img/icon_tab_home_p.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/icon_tab_home_p.png
--------------------------------------------------------------------------------
/img/icon_tab_me_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/icon_tab_me_n.png
--------------------------------------------------------------------------------
/img/icon_tab_me_p.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/icon_tab_me_p.png
--------------------------------------------------------------------------------
/img/reader/icon_me_vip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/img/reader/icon_me_vip.png
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Generated.xcconfig
20 | Flutter/app.flx
21 | Flutter/app.zip
22 | Flutter/flutter_assets/
23 | Flutter/flutter_export_environment.sh
24 | ServiceDefinitions.json
25 | Runner/GeneratedPluginRegistrant.*
26 |
27 | # Exceptions to above rules.
28 | !default.mode1v3
29 | !default.mode2v3
30 | !default.pbxuser
31 | !default.perspectivev3
32 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | flutter_novel
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
--------------------------------------------------------------------------------
/lib/app/api/api_home.dart:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lwlizhe/flutter_novel/4d16a9d6d0d7c7753578b997b22e0de52f6c1061/lib/app/api/api_home.dart
--------------------------------------------------------------------------------
/lib/app/api/constance/const_request_url.dart:
--------------------------------------------------------------------------------
1 | class RequestApi{
2 |
3 | static const String DMZJ_REFERER_URL="http://images.dmzj.com/";
4 |
5 | static const String BASE_URL="https://v3api.dmzj.com/novel/";
6 |
7 | static const String HOME_RECOMMEND=BASE_URL+"recommend.json";
8 | }
--------------------------------------------------------------------------------
/lib/app/constant/custom_color.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class CustomColor {
4 | static Color primary = Color(0xFfff9a6a);
5 | static Color secondary = Color(0xFfff9a6a);
6 | static Color red = Color(0xFFFF2B45);
7 | static Color orange = Color(0xFFF67264);
8 | static Color white = Color(0xFFFFFFFF);
9 | static Color paper = Color(0xFFF5F5F5);
10 | static Color lightGray = Color(0xFFEEEEEE);
11 | static Color darkGray = Color(0xFF333333);
12 | static Color mediumGray = Color(0xFF666666);
13 | static Color gray = Color(0xFF888888);
14 | static Color blackA99 = Color(0x99000000);
15 | static Color blue = Color(0xFF3688FF);
16 | static Color golden = Color(0xff8B7961);
17 | static Color comicBg = Color.fromARGB(255, 245, 245, 238);
18 | }
19 |
--------------------------------------------------------------------------------
/lib/app/main/main_page_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart' hide NestedScrollView;
2 | import 'package:flutter_novel/app/novel/view/novel_about.dart';
3 | import 'package:flutter_novel/app/novel/view/novel_book_find.dart';
4 | import 'package:flutter_novel/app/novel/view/novel_book_shelf.dart';
5 | import 'package:flutter_novel/app/router/manager_router.dart';
6 | import 'package:flutter_novel/base/structure/base_view.dart';
7 | import 'package:flutter_novel/base/structure/base_view_model.dart';
8 | import 'package:flutter_novel/base/util/utils_toast.dart';
9 |
10 | class MainPageView extends BaseStatefulView {
11 | @override
12 | BaseStatefulViewState, BaseViewModel>
13 | buildState() {
14 | return MainPageViewState();
15 | }
16 | }
17 |
18 | class MainPageViewState
19 | extends BaseStatefulViewState
20 | with SingleTickerProviderStateMixin {
21 | DateTime _lastClickTime;
22 |
23 | TabController primaryTC;
24 |
25 | @override
26 | void initData() {
27 | primaryTC = TabController(length: 3, vsync: this);
28 |
29 | }
30 |
31 | @override
32 | Widget buildView(BuildContext context, BaseViewModel viewModel) {
33 |
34 | return Scaffold(
35 | appBar: AppBar(
36 | title: Text("Flutter Novel"),
37 | bottom: TabBar(
38 | tabs: [
39 | Tab(
40 | text: "书库",
41 | ),
42 | Tab(
43 | text: "发现",
44 | ),
45 | Tab(
46 | text: "关于",
47 | )
48 | ],
49 | controller: primaryTC,
50 | ),
51 | actions: [
52 | Padding(
53 | child: IconButton(icon:Icon(Icons.search),onPressed: (){
54 | APPRouter.instance.route(APPRouterRequestOption(
55 | APPRouter.ROUTER_NAME_NOVEL_SEARCH, context));
56 | },),
57 | padding: EdgeInsets.fromLTRB(10, 5, 10, 5),
58 | ),
59 | Padding(
60 | child: Icon(Icons.menu),
61 | padding: EdgeInsets.fromLTRB(10, 5, 10, 5),
62 | )
63 | ],
64 | ),
65 | backgroundColor: Colors.grey[100],
66 | body: WillPopScope(
67 | child: Container(
68 | child: TabBarView(
69 | children: [
70 | NovelBookShelfView(),
71 | NovelBookFindView(),
72 | NovelAbout(),
73 | ],
74 | controller: primaryTC,
75 | ),
76 | ),
77 | onWillPop: () async {
78 | if (_lastClickTime == null ||
79 | DateTime.now().difference(_lastClickTime) >
80 | Duration(seconds: 1)) {
81 | //两次点击间隔超过1秒则重新计时
82 | _lastClickTime = DateTime.now();
83 | ToastUtils.showToast("再次点击退出应用");
84 | return false;
85 | }
86 | return true;
87 | }),
88 | );
89 | }
90 |
91 | @override
92 | void loadData(BuildContext context, BaseViewModel viewModel) {}
93 |
94 | @override
95 | BaseViewModel buildViewModel(BuildContext context) {
96 | return null;
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_chapter.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_book_chapter.g.dart';
4 |
5 |
6 | @JsonSerializable()
7 | class NovelBookChapter extends Object {
8 |
9 | @JsonKey(name: '_id')
10 | String id;
11 |
12 | @JsonKey(name: 'name')
13 | String name;
14 |
15 | @JsonKey(name: 'source')
16 | String source;
17 |
18 | @JsonKey(name: 'book')
19 | String book;
20 |
21 | @JsonKey(name: 'link')
22 | String link;
23 |
24 | @JsonKey(name: 'chapters')
25 | List chapters;
26 |
27 | @JsonKey(name: 'updated')
28 | String updated;
29 |
30 | @JsonKey(name: 'host')
31 | String host;
32 |
33 | NovelBookChapter(this.id,this.name,this.source,this.book,this.link,this.chapters,this.updated,this.host,);
34 |
35 | factory NovelBookChapter.fromJson(Map srcJson) => _$NovelBookChapterFromJson(srcJson);
36 |
37 | Map toJson() => _$NovelBookChapterToJson(this);
38 |
39 | }
40 |
41 |
42 | @JsonSerializable()
43 | class Chapters extends Object {
44 |
45 | @JsonKey(name: '_id')
46 | String bookId;
47 |
48 | @JsonKey(name: 'title')
49 | String title;
50 |
51 | @JsonKey(name: 'link')
52 | String link;
53 |
54 | @JsonKey(name: 'id')
55 | String id;
56 |
57 | @JsonKey(name: 'time')
58 | int time;
59 |
60 | @JsonKey(name: 'chapterCover')
61 | String chapterCover;
62 |
63 | @JsonKey(name: 'totalpage')
64 | int totalpage;
65 |
66 | @JsonKey(name: 'partsize')
67 | int partsize;
68 |
69 | @JsonKey(name: 'order')
70 | int order;
71 |
72 | @JsonKey(name: 'currency')
73 | int currency;
74 |
75 | @JsonKey(name: 'unreadble')
76 | bool unreadble;
77 |
78 | @JsonKey(name: 'isVip')
79 | bool isVip;
80 |
81 | String novelId;
82 |
83 | Chapters(this.bookId,this.title,this.link,this.id,this.time,this.chapterCover,this.totalpage,this.partsize,this.order,this.currency,this.unreadble,this.isVip,);
84 |
85 | factory Chapters.fromJson(Map srcJson) => _$ChaptersFromJson(srcJson);
86 |
87 | Map toJson() => _$ChaptersToJson(this);
88 |
89 | }
90 |
91 |
92 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_chapter.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_book_chapter.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelBookChapter _$NovelBookChapterFromJson(Map json) {
10 | return NovelBookChapter(
11 | json['_id'] as String,
12 | json['name'] as String,
13 | json['source'] as String,
14 | json['book'] as String,
15 | json['link'] as String,
16 | (json['chapters'] as List)
17 | ?.map((e) =>
18 | e == null ? null : Chapters.fromJson(e as Map))
19 | ?.toList(),
20 | json['updated'] as String,
21 | json['host'] as String,
22 | );
23 | }
24 |
25 | Map _$NovelBookChapterToJson(NovelBookChapter instance) =>
26 | {
27 | '_id': instance.id,
28 | 'name': instance.name,
29 | 'source': instance.source,
30 | 'book': instance.book,
31 | 'link': instance.link,
32 | 'chapters': instance.chapters,
33 | 'updated': instance.updated,
34 | 'host': instance.host,
35 | };
36 |
37 | Chapters _$ChaptersFromJson(Map json) {
38 | return Chapters(
39 | json['_id'] as String,
40 | json['title'] as String,
41 | json['link'] as String,
42 | json['id'] as String,
43 | json['time'] as int,
44 | json['chapterCover'] as String,
45 | json['totalpage'] as int,
46 | json['partsize'] as int,
47 | json['order'] as int,
48 | json['currency'] as int,
49 | json['unreadble'] as bool,
50 | json['isVip'] as bool,
51 | );
52 | }
53 |
54 | Map _$ChaptersToJson(Chapters instance) => {
55 | '_id': instance.bookId,
56 | 'title': instance.title,
57 | 'link': instance.link,
58 | 'id': instance.id,
59 | 'time': instance.time,
60 | 'chapterCover': instance.chapterCover,
61 | 'totalpage': instance.totalpage,
62 | 'partsize': instance.partsize,
63 | 'order': instance.order,
64 | 'currency': instance.currency,
65 | 'unreadble': instance.unreadble,
66 | 'isVip': instance.isVip,
67 | };
68 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_key_word_search.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_book_key_word_search.g.dart';
4 |
5 | @JsonSerializable()
6 | class NovelKeyWordSearch extends Object {
7 |
8 | @JsonKey(name: 'books')
9 | List books;
10 |
11 | @JsonKey(name: 'total')
12 | int total;
13 |
14 | @JsonKey(name: 'ok')
15 | bool ok;
16 |
17 | NovelKeyWordSearch(this.books,this.total,this.ok,);
18 |
19 | factory NovelKeyWordSearch.fromJson(Map srcJson) => _$NovelKeyWordSearchFromJson(srcJson);
20 |
21 | Map toJson() => _$NovelKeyWordSearchToJson(this);
22 |
23 | }
24 |
25 |
26 | @JsonSerializable()
27 | class Books extends Object {
28 |
29 | @JsonKey(name: '_id')
30 | String id;
31 |
32 | @JsonKey(name: 'hasCp')
33 | bool hasCp;
34 |
35 | @JsonKey(name: 'title')
36 | String title;
37 |
38 | @JsonKey(name: 'aliases')
39 | String aliases;
40 |
41 | @JsonKey(name: 'cat')
42 | String cat;
43 |
44 | @JsonKey(name: 'author')
45 | String author;
46 |
47 | @JsonKey(name: 'site')
48 | String site;
49 |
50 | @JsonKey(name: 'cover')
51 | String cover;
52 |
53 | @JsonKey(name: 'shortIntro')
54 | String shortIntro;
55 |
56 | @JsonKey(name: 'lastChapter')
57 | String lastChapter;
58 |
59 | @JsonKey(name: 'retentionRatio')
60 | double retentionRatio;
61 |
62 | @JsonKey(name: 'banned')
63 | int banned;
64 |
65 | @JsonKey(name: 'allowMonthly')
66 | bool allowMonthly;
67 |
68 | @JsonKey(name: 'latelyFollower')
69 | int latelyFollower;
70 |
71 | @JsonKey(name: 'wordCount')
72 | int wordCount;
73 |
74 | @JsonKey(name: 'contentType')
75 | String contentType;
76 |
77 | @JsonKey(name: 'superscript')
78 | String superscript;
79 |
80 | @JsonKey(name: 'sizetype')
81 | int sizetype;
82 |
83 | @JsonKey(name: 'highlight')
84 | Highlight highlight;
85 |
86 | Books(this.id,this.hasCp,this.title,this.aliases,this.cat,this.author,this.site,this.cover,this.shortIntro,this.lastChapter,this.retentionRatio,this.banned,this.allowMonthly,this.latelyFollower,this.wordCount,this.contentType,this.superscript,this.sizetype,this.highlight,);
87 |
88 | factory Books.fromJson(Map srcJson) => _$BooksFromJson(srcJson);
89 |
90 | Map toJson() => _$BooksToJson(this);
91 |
92 | }
93 |
94 |
95 | @JsonSerializable()
96 | class Highlight extends Object {
97 |
98 | @JsonKey(name: 'title')
99 | List title;
100 |
101 | Highlight(this.title,);
102 |
103 | factory Highlight.fromJson(Map srcJson) => _$HighlightFromJson(srcJson);
104 |
105 | Map toJson() => _$HighlightToJson(this);
106 |
107 | }
108 |
109 |
110 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_key_word_search.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_book_key_word_search.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelKeyWordSearch _$NovelKeyWordSearchFromJson(Map json) {
10 | return NovelKeyWordSearch(
11 | (json['books'] as List)
12 | ?.map(
13 | (e) => e == null ? null : Books.fromJson(e as Map))
14 | ?.toList(),
15 | json['total'] as int,
16 | json['ok'] as bool,
17 | );
18 | }
19 |
20 | Map _$NovelKeyWordSearchToJson(NovelKeyWordSearch instance) =>
21 | {
22 | 'books': instance.books,
23 | 'total': instance.total,
24 | 'ok': instance.ok,
25 | };
26 |
27 | Books _$BooksFromJson(Map json) {
28 | return Books(
29 | json['_id'] as String,
30 | json['hasCp'] as bool,
31 | json['title'] as String,
32 | json['aliases'] as String,
33 | json['cat'] as String,
34 | json['author'] as String,
35 | json['site'] as String,
36 | json['cover'] as String,
37 | json['shortIntro'] as String,
38 | json['lastChapter'] as String,
39 | (json['retentionRatio'] as num)?.toDouble(),
40 | json['banned'] as int,
41 | json['allowMonthly'] as bool,
42 | json['latelyFollower'] as int,
43 | json['wordCount'] as int,
44 | json['contentType'] as String,
45 | json['superscript'] as String,
46 | json['sizetype'] as int,
47 | json['highlight'] == null
48 | ? null
49 | : Highlight.fromJson(json['highlight'] as Map),
50 | );
51 | }
52 |
53 | Map _$BooksToJson(Books instance) => {
54 | '_id': instance.id,
55 | 'hasCp': instance.hasCp,
56 | 'title': instance.title,
57 | 'aliases': instance.aliases,
58 | 'cat': instance.cat,
59 | 'author': instance.author,
60 | 'site': instance.site,
61 | 'cover': instance.cover,
62 | 'shortIntro': instance.shortIntro,
63 | 'lastChapter': instance.lastChapter,
64 | 'retentionRatio': instance.retentionRatio,
65 | 'banned': instance.banned,
66 | 'allowMonthly': instance.allowMonthly,
67 | 'latelyFollower': instance.latelyFollower,
68 | 'wordCount': instance.wordCount,
69 | 'contentType': instance.contentType,
70 | 'superscript': instance.superscript,
71 | 'sizetype': instance.sizetype,
72 | 'highlight': instance.highlight,
73 | };
74 |
75 | Highlight _$HighlightFromJson(Map json) {
76 | return Highlight(
77 | (json['title'] as List)?.map((e) => e as String)?.toList(),
78 | );
79 | }
80 |
81 | Map _$HighlightToJson(Highlight instance) => {
82 | 'title': instance.title,
83 | };
84 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_recommend.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_book_recommend.g.dart';
4 |
5 | @JsonSerializable()
6 | class NovelBookRecommend extends Object {
7 |
8 | @JsonKey(name: 'books')
9 | List books;
10 |
11 | @JsonKey(name: 'ok')
12 | bool ok;
13 |
14 | NovelBookRecommend(this.books,this.ok,);
15 |
16 | factory NovelBookRecommend.fromJson(Map srcJson) => _$NovelBookRecommendFromJson(srcJson);
17 |
18 | Map toJson() => _$NovelBookRecommendToJson(this);
19 |
20 | }
21 |
22 |
23 | @JsonSerializable()
24 | class Books extends Object {
25 |
26 | @JsonKey(name: '_id')
27 | String id;
28 |
29 | @JsonKey(name: 'title')
30 | String title;
31 |
32 | @JsonKey(name: 'author')
33 | String author;
34 |
35 | @JsonKey(name: 'site')
36 | String site;
37 |
38 | @JsonKey(name: 'cover')
39 | String cover;
40 |
41 | @JsonKey(name: 'shortIntro')
42 | String shortIntro;
43 |
44 | @JsonKey(name: 'lastChapter')
45 | String lastChapter;
46 |
47 | @JsonKey(name: 'retentionRatio')
48 | double retentionRatio;
49 |
50 | @JsonKey(name: 'latelyFollower')
51 | int latelyFollower;
52 |
53 | @JsonKey(name: 'majorCate')
54 | String majorCate;
55 |
56 | @JsonKey(name: 'minorCate')
57 | String minorCate;
58 |
59 | @JsonKey(name: 'allowMonthly')
60 | bool allowMonthly;
61 |
62 | @JsonKey(name: 'isSerial')
63 | bool isSerial;
64 |
65 | @JsonKey(name: 'contentType')
66 | String contentType;
67 |
68 | @JsonKey(name: 'allowFree')
69 | bool allowFree;
70 |
71 | @JsonKey(name: 'otherReadRatio')
72 | double otherReadRatio;
73 |
74 | Books(this.id,this.title,this.author,this.site,this.cover,this.shortIntro,this.lastChapter,this.retentionRatio,this.latelyFollower,this.majorCate,this.minorCate,this.allowMonthly,this.isSerial,this.contentType,this.allowFree,this.otherReadRatio,);
75 |
76 | factory Books.fromJson(Map srcJson) => _$BooksFromJson(srcJson);
77 |
78 | Map toJson() => _$BooksToJson(this);
79 |
80 | }
81 |
82 |
83 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_recommend.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_book_recommend.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelBookRecommend _$NovelBookRecommendFromJson(Map json) {
10 | return NovelBookRecommend(
11 | (json['books'] as List)
12 | ?.map(
13 | (e) => e == null ? null : Books.fromJson(e as Map))
14 | ?.toList(),
15 | json['ok'] as bool,
16 | );
17 | }
18 |
19 | Map _$NovelBookRecommendToJson(NovelBookRecommend instance) =>
20 | {
21 | 'books': instance.books,
22 | 'ok': instance.ok,
23 | };
24 |
25 | Books _$BooksFromJson(Map json) {
26 | return Books(
27 | json['_id'] as String,
28 | json['title'] as String,
29 | json['author'] as String,
30 | json['site'] as String,
31 | json['cover'] as String,
32 | json['shortIntro'] as String,
33 | json['lastChapter'] as String,
34 | (json['retentionRatio'] as num)?.toDouble(),
35 | json['latelyFollower'] as int,
36 | json['majorCate'] as String,
37 | json['minorCate'] as String,
38 | json['allowMonthly'] as bool,
39 | json['isSerial'] as bool,
40 | json['contentType'] as String,
41 | json['allowFree'] as bool,
42 | (json['otherReadRatio'] as num)?.toDouble(),
43 | );
44 | }
45 |
46 | Map _$BooksToJson(Books instance) => {
47 | '_id': instance.id,
48 | 'title': instance.title,
49 | 'author': instance.author,
50 | 'site': instance.site,
51 | 'cover': instance.cover,
52 | 'shortIntro': instance.shortIntro,
53 | 'lastChapter': instance.lastChapter,
54 | 'retentionRatio': instance.retentionRatio,
55 | 'latelyFollower': instance.latelyFollower,
56 | 'majorCate': instance.majorCate,
57 | 'minorCate': instance.minorCate,
58 | 'allowMonthly': instance.allowMonthly,
59 | 'isSerial': instance.isSerial,
60 | 'contentType': instance.contentType,
61 | 'allowFree': instance.allowFree,
62 | 'otherReadRatio': instance.otherReadRatio,
63 | };
64 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_review.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_book_review.g.dart';
4 |
5 |
6 | @JsonSerializable()
7 | class NovelBookReview extends Object {
8 |
9 | @JsonKey(name: 'total')
10 | int total;
11 |
12 | @JsonKey(name: 'today')
13 | int today;
14 |
15 | @JsonKey(name: 'reviews')
16 | List reviews;
17 |
18 | @JsonKey(name: 'ok')
19 | bool ok;
20 |
21 | NovelBookReview(this.total,this.today,this.reviews,this.ok,);
22 |
23 | factory NovelBookReview.fromJson(Map srcJson) => _$NovelBookReviewFromJson(srcJson);
24 |
25 | Map toJson() => _$NovelBookReviewToJson(this);
26 |
27 | }
28 |
29 |
30 | @JsonSerializable()
31 | class Reviews extends Object {
32 |
33 | @JsonKey(name: '_id')
34 | String id;
35 |
36 | @JsonKey(name: 'rating')
37 | int rating;
38 |
39 | @JsonKey(name: 'author')
40 | Author author;
41 |
42 | @JsonKey(name: 'helpful')
43 | Helpful helpful;
44 |
45 | @JsonKey(name: 'likeCount')
46 | int likeCount;
47 |
48 | @JsonKey(name: 'state')
49 | String state;
50 |
51 | @JsonKey(name: 'updated')
52 | String updated;
53 |
54 | @JsonKey(name: 'created')
55 | String created;
56 |
57 | @JsonKey(name: 'commentCount')
58 | int commentCount;
59 |
60 | @JsonKey(name: 'content')
61 | String content;
62 |
63 | @JsonKey(name: 'title')
64 | String title;
65 |
66 | Reviews(this.id,this.rating,this.author,this.helpful,this.likeCount,this.state,this.updated,this.created,this.commentCount,this.content,this.title,);
67 |
68 | factory Reviews.fromJson(Map srcJson) => _$ReviewsFromJson(srcJson);
69 |
70 | Map toJson() => _$ReviewsToJson(this);
71 |
72 | }
73 |
74 |
75 | @JsonSerializable()
76 | class Author extends Object {
77 |
78 | @JsonKey(name: '_id')
79 | String id;
80 |
81 | @JsonKey(name: 'avatar')
82 | String avatar;
83 |
84 | @JsonKey(name: 'nickname')
85 | String nickname;
86 |
87 | @JsonKey(name: 'activityAvatar')
88 | String activityAvatar;
89 |
90 | @JsonKey(name: 'type')
91 | String type;
92 |
93 | @JsonKey(name: 'lv')
94 | int lv;
95 |
96 | @JsonKey(name: 'gender')
97 | String gender;
98 |
99 | Author(this.id,this.avatar,this.nickname,this.activityAvatar,this.type,this.lv,this.gender,);
100 |
101 | factory Author.fromJson(Map srcJson) => _$AuthorFromJson(srcJson);
102 |
103 | Map toJson() => _$AuthorToJson(this);
104 |
105 | }
106 |
107 |
108 | @JsonSerializable()
109 | class Helpful extends Object {
110 |
111 | @JsonKey(name: 'total')
112 | int total;
113 |
114 | @JsonKey(name: 'yes')
115 | int yes;
116 |
117 | @JsonKey(name: 'no')
118 | int no;
119 |
120 | Helpful(this.total,this.yes,this.no,);
121 |
122 | factory Helpful.fromJson(Map srcJson) => _$HelpfulFromJson(srcJson);
123 |
124 | Map toJson() => _$HelpfulToJson(this);
125 |
126 | }
127 |
128 |
129 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_review.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_book_review.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelBookReview _$NovelBookReviewFromJson(Map json) {
10 | return NovelBookReview(
11 | json['total'] as int,
12 | json['today'] as int,
13 | (json['reviews'] as List)
14 | ?.map((e) =>
15 | e == null ? null : Reviews.fromJson(e as Map))
16 | ?.toList(),
17 | json['ok'] as bool,
18 | );
19 | }
20 |
21 | Map _$NovelBookReviewToJson(NovelBookReview instance) =>
22 | {
23 | 'total': instance.total,
24 | 'today': instance.today,
25 | 'reviews': instance.reviews,
26 | 'ok': instance.ok,
27 | };
28 |
29 | Reviews _$ReviewsFromJson(Map json) {
30 | return Reviews(
31 | json['_id'] as String,
32 | json['rating'] as int,
33 | json['author'] == null
34 | ? null
35 | : Author.fromJson(json['author'] as Map),
36 | json['helpful'] == null
37 | ? null
38 | : Helpful.fromJson(json['helpful'] as Map),
39 | json['likeCount'] as int,
40 | json['state'] as String,
41 | json['updated'] as String,
42 | json['created'] as String,
43 | json['commentCount'] as int,
44 | json['content'] as String,
45 | json['title'] as String,
46 | );
47 | }
48 |
49 | Map _$ReviewsToJson(Reviews instance) => {
50 | '_id': instance.id,
51 | 'rating': instance.rating,
52 | 'author': instance.author,
53 | 'helpful': instance.helpful,
54 | 'likeCount': instance.likeCount,
55 | 'state': instance.state,
56 | 'updated': instance.updated,
57 | 'created': instance.created,
58 | 'commentCount': instance.commentCount,
59 | 'content': instance.content,
60 | 'title': instance.title,
61 | };
62 |
63 | Author _$AuthorFromJson(Map json) {
64 | return Author(
65 | json['_id'] as String,
66 | json['avatar'] as String,
67 | json['nickname'] as String,
68 | json['activityAvatar'] as String,
69 | json['type'] as String,
70 | json['lv'] as int,
71 | json['gender'] as String,
72 | );
73 | }
74 |
75 | Map _$AuthorToJson(Author instance) => {
76 | '_id': instance.id,
77 | 'avatar': instance.avatar,
78 | 'nickname': instance.nickname,
79 | 'activityAvatar': instance.activityAvatar,
80 | 'type': instance.type,
81 | 'lv': instance.lv,
82 | 'gender': instance.gender,
83 | };
84 |
85 | Helpful _$HelpfulFromJson(Map json) {
86 | return Helpful(
87 | json['total'] as int,
88 | json['yes'] as int,
89 | json['no'] as int,
90 | );
91 | }
92 |
93 | Map _$HelpfulToJson(Helpful instance) => {
94 | 'total': instance.total,
95 | 'yes': instance.yes,
96 | 'no': instance.no,
97 | };
98 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_source.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_book_source.g.dart';
4 |
5 |
6 | List getNovelBookSourceList(List list){
7 | List result = [];
8 | list.forEach((item){
9 | result.add(NovelBookSource.fromJson(item));
10 | });
11 | return result;
12 | }
13 | @JsonSerializable()
14 | class NovelBookSource extends Object {
15 |
16 | @JsonKey(name: '_id')
17 | String id;
18 |
19 | @JsonKey(name: 'isCharge')
20 | bool isCharge;
21 |
22 | @JsonKey(name: 'name')
23 | String name;
24 |
25 | @JsonKey(name: 'lastChapter')
26 | String lastChapter;
27 |
28 | @JsonKey(name: 'updated')
29 | String updated;
30 |
31 | @JsonKey(name: 'source')
32 | String source;
33 |
34 | @JsonKey(name: 'link')
35 | String link;
36 |
37 | @JsonKey(name: 'starting')
38 | bool starting;
39 |
40 | @JsonKey(name: 'chaptersCount')
41 | int chaptersCount;
42 |
43 | @JsonKey(name: 'host')
44 | String host;
45 |
46 | NovelBookSource(this.id,this.isCharge,this.name,this.lastChapter,this.updated,this.source,this.link,this.starting,this.chaptersCount,this.host,);
47 |
48 | factory NovelBookSource.fromJson(Map srcJson) => _$NovelBookSourceFromJson(srcJson);
49 |
50 | Map toJson() => _$NovelBookSourceToJson(this);
51 |
52 | }
53 |
54 |
55 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_book_source.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_book_source.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelBookSource _$NovelBookSourceFromJson(Map json) {
10 | return NovelBookSource(
11 | json['_id'] as String,
12 | json['isCharge'] as bool,
13 | json['name'] as String,
14 | json['lastChapter'] as String,
15 | json['updated'] as String,
16 | json['source'] as String,
17 | json['link'] as String,
18 | json['starting'] as bool,
19 | json['chaptersCount'] as int,
20 | json['host'] as String,
21 | );
22 | }
23 |
24 | Map _$NovelBookSourceToJson(NovelBookSource instance) =>
25 | {
26 | '_id': instance.id,
27 | 'isCharge': instance.isCharge,
28 | 'name': instance.name,
29 | 'lastChapter': instance.lastChapter,
30 | 'updated': instance.updated,
31 | 'source': instance.source,
32 | 'link': instance.link,
33 | 'starting': instance.starting,
34 | 'chaptersCount': instance.chaptersCount,
35 | 'host': instance.host,
36 | };
37 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_chapter_info.dart:
--------------------------------------------------------------------------------
1 | class NovelChapterInfo{
2 |
3 | String title;
4 |
5 | int chapterId;
6 | int volumeId;
7 | int bookId;
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_detail.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_detail.g.dart';
4 |
5 | @JsonSerializable()
6 | class NovelDetailInfo extends Object {
7 |
8 | @JsonKey(name: '_id')
9 | String id;
10 |
11 | @JsonKey(name: 'title')
12 | String title;
13 |
14 | @JsonKey(name: 'author')
15 | String author;
16 |
17 | @JsonKey(name: 'majorCate')
18 | String majorCate;
19 |
20 | @JsonKey(name: 'cover')
21 | String cover;
22 |
23 | @JsonKey(name: 'longIntro')
24 | String longIntro;
25 |
26 | @JsonKey(name: 'starRatingCount')
27 | int starRatingCount;
28 |
29 | @JsonKey(name: 'starRatings')
30 | List starRatings;
31 |
32 | @JsonKey(name: 'isMakeMoneyLimit')
33 | bool isMakeMoneyLimit;
34 |
35 | @JsonKey(name: 'contentLevel')
36 | int contentLevel;
37 |
38 | @JsonKey(name: 'isFineBook')
39 | bool isFineBook;
40 |
41 | @JsonKey(name: 'safelevel')
42 | int safelevel;
43 |
44 | @JsonKey(name: 'allowFree')
45 | bool allowFree;
46 |
47 | @JsonKey(name: 'originalAuthor')
48 | String originalAuthor;
49 |
50 | @JsonKey(name: 'anchors')
51 | List anchors;
52 |
53 | @JsonKey(name: 'authorDesc')
54 | String authorDesc;
55 |
56 | @JsonKey(name: 'rating')
57 | Rating rating;
58 |
59 | @JsonKey(name: 'hasCopyright')
60 | bool hasCopyright;
61 |
62 | @JsonKey(name: 'buytype')
63 | int buytype;
64 |
65 | @JsonKey(name: 'sizetype')
66 | int sizetype;
67 |
68 | @JsonKey(name: 'superscript')
69 | String superscript;
70 |
71 | @JsonKey(name: 'currency')
72 | int currency;
73 |
74 | @JsonKey(name: 'contentType')
75 | String contentType;
76 |
77 | @JsonKey(name: '_le')
78 | bool le;
79 |
80 | @JsonKey(name: 'allowMonthly')
81 | bool allowMonthly;
82 |
83 | @JsonKey(name: 'allowVoucher')
84 | bool allowVoucher;
85 |
86 | @JsonKey(name: 'allowBeanVoucher')
87 | bool allowBeanVoucher;
88 |
89 | @JsonKey(name: 'hasCp')
90 | bool hasCp;
91 |
92 | @JsonKey(name: 'banned')
93 | int banned;
94 |
95 | @JsonKey(name: 'postCount')
96 | int postCount;
97 |
98 | @JsonKey(name: 'totalFollower')
99 | int totalFollower;
100 |
101 | @JsonKey(name: 'latelyFollower')
102 | int latelyFollower;
103 |
104 | @JsonKey(name: 'followerCount')
105 | int followerCount;
106 |
107 | @JsonKey(name: 'wordCount')
108 | int wordCount;
109 |
110 | @JsonKey(name: 'serializeWordCount')
111 | int serializeWordCount;
112 |
113 | @JsonKey(name: 'retentionRatio')
114 | String retentionRatio;
115 |
116 | @JsonKey(name: 'updated')
117 | String updated;
118 |
119 | @JsonKey(name: 'isSerial')
120 | bool isSerial;
121 |
122 | @JsonKey(name: 'chaptersCount')
123 | int chaptersCount;
124 |
125 | @JsonKey(name: 'lastChapter')
126 | String lastChapter;
127 |
128 | @JsonKey(name: 'gender')
129 | List gender;
130 |
131 | @JsonKey(name: 'tags')
132 | List tags;
133 |
134 | @JsonKey(name: 'advertRead')
135 | bool advertRead;
136 |
137 | @JsonKey(name: 'donate')
138 | bool donate;
139 |
140 | @JsonKey(name: 'copyright')
141 | String copyright;
142 |
143 | @JsonKey(name: '_gg')
144 | bool gg;
145 |
146 | @JsonKey(name: 'isForbidForFreeApp')
147 | bool isForbidForFreeApp;
148 |
149 | @JsonKey(name: 'isAllowNetSearch')
150 | bool isAllowNetSearch;
151 |
152 | @JsonKey(name: 'limit')
153 | bool limit;
154 |
155 | @JsonKey(name: 'copyrightInfo')
156 | String copyrightInfo;
157 |
158 | @JsonKey(name: 'copyrightDesc')
159 | String copyrightDesc;
160 |
161 | NovelDetailInfo(this.id,this.title,this.author,this.majorCate,this.cover,this.longIntro,this.starRatingCount,this.starRatings,this.isMakeMoneyLimit,this.contentLevel,this.isFineBook,this.safelevel,this.allowFree,this.originalAuthor,this.anchors,this.authorDesc,this.rating,this.hasCopyright,this.buytype,this.sizetype,this.superscript,this.currency,this.contentType,this.le,this.allowMonthly,this.allowVoucher,this.allowBeanVoucher,this.hasCp,this.banned,this.postCount,this.totalFollower,this.latelyFollower,this.followerCount,this.wordCount,this.serializeWordCount,this.retentionRatio,this.updated,this.isSerial,this.chaptersCount,this.lastChapter,this.gender,this.tags,this.advertRead,this.donate,this.copyright,this.gg,this.isForbidForFreeApp,this.isAllowNetSearch,this.limit,this.copyrightInfo,this.copyrightDesc,);
162 |
163 | factory NovelDetailInfo.fromJson(Map srcJson) => _$NovelDetailInfoFromJson(srcJson);
164 |
165 | Map toJson() => _$NovelDetailInfoToJson(this);
166 |
167 | }
168 |
169 |
170 | @JsonSerializable()
171 | class StarRatings extends Object {
172 |
173 | @JsonKey(name: 'count')
174 | int count;
175 |
176 | @JsonKey(name: 'star')
177 | int star;
178 |
179 | StarRatings(this.count,this.star,);
180 |
181 | factory StarRatings.fromJson(Map srcJson) => _$StarRatingsFromJson(srcJson);
182 |
183 | Map toJson() => _$StarRatingsToJson(this);
184 |
185 | }
186 |
187 |
188 | @JsonSerializable()
189 | class Rating extends Object {
190 |
191 | @JsonKey(name: 'score')
192 | double score;
193 |
194 | @JsonKey(name: 'count')
195 | int count;
196 |
197 | @JsonKey(name: 'tip')
198 | String tip;
199 |
200 | @JsonKey(name: 'isEffect')
201 | bool isEffect;
202 |
203 | Rating(this.score,this.count,this.tip,this.isEffect,);
204 |
205 | factory Rating.fromJson(Map srcJson) => _$RatingFromJson(srcJson);
206 |
207 | Map toJson() => _$RatingToJson(this);
208 |
209 | }
210 |
211 |
212 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_detail.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_detail.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelDetailInfo _$NovelDetailInfoFromJson(Map json) {
10 | return NovelDetailInfo(
11 | json['_id'] as String,
12 | json['title'] as String,
13 | json['author'] as String,
14 | json['majorCate'] as String,
15 | json['cover'] as String,
16 | json['longIntro'] as String,
17 | json['starRatingCount'] as int,
18 | (json['starRatings'] as List)
19 | ?.map((e) =>
20 | e == null ? null : StarRatings.fromJson(e as Map))
21 | ?.toList(),
22 | json['isMakeMoneyLimit'] as bool,
23 | json['contentLevel'] as int,
24 | json['isFineBook'] as bool,
25 | json['safelevel'] as int,
26 | json['allowFree'] as bool,
27 | json['originalAuthor'] as String,
28 | json['anchors'] as List,
29 | json['authorDesc'] as String,
30 | json['rating'] == null
31 | ? null
32 | : Rating.fromJson(json['rating'] as Map),
33 | json['hasCopyright'] as bool,
34 | json['buytype'] as int,
35 | json['sizetype'] as int,
36 | json['superscript'] as String,
37 | json['currency'] as int,
38 | json['contentType'] as String,
39 | json['_le'] as bool,
40 | json['allowMonthly'] as bool,
41 | json['allowVoucher'] as bool,
42 | json['allowBeanVoucher'] as bool,
43 | json['hasCp'] as bool,
44 | json['banned'] as int,
45 | json['postCount'] as int,
46 | json['totalFollower'] as int,
47 | json['latelyFollower'] as int,
48 | json['followerCount'] as int,
49 | json['wordCount'] as int,
50 | json['serializeWordCount'] as int,
51 | json['retentionRatio'] as String,
52 | json['updated'] as String,
53 | json['isSerial'] as bool,
54 | json['chaptersCount'] as int,
55 | json['lastChapter'] as String,
56 | json['gender'] as List,
57 | json['tags'] as List,
58 | json['advertRead'] as bool,
59 | json['donate'] as bool,
60 | json['copyright'] as String,
61 | json['_gg'] as bool,
62 | json['isForbidForFreeApp'] as bool,
63 | json['isAllowNetSearch'] as bool,
64 | json['limit'] as bool,
65 | json['copyrightInfo'] as String,
66 | json['copyrightDesc'] as String,
67 | );
68 | }
69 |
70 | Map _$NovelDetailInfoToJson(NovelDetailInfo instance) =>
71 | {
72 | '_id': instance.id,
73 | 'title': instance.title,
74 | 'author': instance.author,
75 | 'majorCate': instance.majorCate,
76 | 'cover': instance.cover,
77 | 'longIntro': instance.longIntro,
78 | 'starRatingCount': instance.starRatingCount,
79 | 'starRatings': instance.starRatings,
80 | 'isMakeMoneyLimit': instance.isMakeMoneyLimit,
81 | 'contentLevel': instance.contentLevel,
82 | 'isFineBook': instance.isFineBook,
83 | 'safelevel': instance.safelevel,
84 | 'allowFree': instance.allowFree,
85 | 'originalAuthor': instance.originalAuthor,
86 | 'anchors': instance.anchors,
87 | 'authorDesc': instance.authorDesc,
88 | 'rating': instance.rating,
89 | 'hasCopyright': instance.hasCopyright,
90 | 'buytype': instance.buytype,
91 | 'sizetype': instance.sizetype,
92 | 'superscript': instance.superscript,
93 | 'currency': instance.currency,
94 | 'contentType': instance.contentType,
95 | '_le': instance.le,
96 | 'allowMonthly': instance.allowMonthly,
97 | 'allowVoucher': instance.allowVoucher,
98 | 'allowBeanVoucher': instance.allowBeanVoucher,
99 | 'hasCp': instance.hasCp,
100 | 'banned': instance.banned,
101 | 'postCount': instance.postCount,
102 | 'totalFollower': instance.totalFollower,
103 | 'latelyFollower': instance.latelyFollower,
104 | 'followerCount': instance.followerCount,
105 | 'wordCount': instance.wordCount,
106 | 'serializeWordCount': instance.serializeWordCount,
107 | 'retentionRatio': instance.retentionRatio,
108 | 'updated': instance.updated,
109 | 'isSerial': instance.isSerial,
110 | 'chaptersCount': instance.chaptersCount,
111 | 'lastChapter': instance.lastChapter,
112 | 'gender': instance.gender,
113 | 'tags': instance.tags,
114 | 'advertRead': instance.advertRead,
115 | 'donate': instance.donate,
116 | 'copyright': instance.copyright,
117 | '_gg': instance.gg,
118 | 'isForbidForFreeApp': instance.isForbidForFreeApp,
119 | 'isAllowNetSearch': instance.isAllowNetSearch,
120 | 'limit': instance.limit,
121 | 'copyrightInfo': instance.copyrightInfo,
122 | 'copyrightDesc': instance.copyrightDesc,
123 | };
124 |
125 | StarRatings _$StarRatingsFromJson(Map json) {
126 | return StarRatings(
127 | json['count'] as int,
128 | json['star'] as int,
129 | );
130 | }
131 |
132 | Map _$StarRatingsToJson(StarRatings instance) =>
133 | {
134 | 'count': instance.count,
135 | 'star': instance.star,
136 | };
137 |
138 | Rating _$RatingFromJson(Map json) {
139 | return Rating(
140 | (json['score'] as num)?.toDouble(),
141 | json['count'] as int,
142 | json['tip'] as String,
143 | json['isEffect'] as bool,
144 | );
145 | }
146 |
147 | Map _$RatingToJson(Rating instance) => {
148 | 'score': instance.score,
149 | 'count': instance.count,
150 | 'tip': instance.tip,
151 | 'isEffect': instance.isEffect,
152 | };
153 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_info.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'dart:ui';
3 |
4 | import 'package:flutter_novel/app/novel/helper/helper_db.dart';
5 |
6 | class NovelBookInfo{
7 | String bookId;
8 | String cover;
9 | String title;
10 |
11 | int currentPageIndex = 0;
12 | int currentChapterIndex = 0;
13 | int currentVolumeIndex = 0;
14 |
15 | Map toDBMap() => {
16 | DBHelper.COLUMN_BOOK_ID: bookId,
17 | DBHelper.COLUMN_IMAGE: cover,
18 | DBHelper.COLUMN_TITLE: title,
19 | DBHelper.COLUMN_CHAPTER_INDEX: currentChapterIndex,
20 | DBHelper.COLUMN_VOLUME_INDEX: currentVolumeIndex,
21 | DBHelper.COLUMN_PAGE_INDEX: currentPageIndex,
22 | };
23 |
24 | static NovelBookInfo fromDBMap(Map dbMap) {
25 | if (dbMap == null) return null;
26 | NovelBookInfo bookInfo = NovelBookInfo();
27 | bookInfo.bookId = dbMap[DBHelper.COLUMN_BOOK_ID];
28 | bookInfo.cover = dbMap[DBHelper.COLUMN_IMAGE];
29 | bookInfo.title = dbMap[DBHelper.COLUMN_TITLE];
30 | bookInfo.currentPageIndex = dbMap[DBHelper.COLUMN_PAGE_INDEX];
31 | bookInfo.currentChapterIndex = dbMap[DBHelper.COLUMN_CHAPTER_INDEX];
32 | bookInfo.currentVolumeIndex = dbMap[DBHelper.COLUMN_VOLUME_INDEX];
33 | return bookInfo;
34 | }
35 | }
36 |
37 | class NovelConfigInfo{
38 |
39 | int currentAnimationMode;
40 | Color currentCanvasBgColor=Color(0xfffff2cc);
41 |
42 | int fontSize = 20;
43 | int lineHeight = 30;
44 | int paragraphSpacing = 10;
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_short_comment.dart:
--------------------------------------------------------------------------------
1 | import 'package:json_annotation/json_annotation.dart';
2 |
3 | part 'entity_novel_short_comment.g.dart';
4 |
5 | @JsonSerializable()
6 | class NovelShortComment extends Object {
7 |
8 | @JsonKey(name: 'today')
9 | int today;
10 |
11 | @JsonKey(name: 'docs')
12 | List docs;
13 |
14 | @JsonKey(name: 'ok')
15 | bool ok;
16 |
17 | NovelShortComment(this.today,this.docs,this.ok,);
18 |
19 | factory NovelShortComment.fromJson(Map srcJson) => _$NovelShortCommentFromJson(srcJson);
20 |
21 | Map toJson() => _$NovelShortCommentToJson(this);
22 |
23 | }
24 |
25 |
26 | @JsonSerializable()
27 | class Docs extends Object {
28 |
29 | @JsonKey(name: '_id')
30 | String id;
31 |
32 | @JsonKey(name: 'rating')
33 | int rating;
34 |
35 | @JsonKey(name: 'type')
36 | String type;
37 |
38 | @JsonKey(name: 'author')
39 | Author author;
40 |
41 | @JsonKey(name: 'book')
42 | Book book;
43 |
44 | @JsonKey(name: 'likeCount')
45 | int likeCount;
46 |
47 | @JsonKey(name: 'priority')
48 | double priority;
49 |
50 | @JsonKey(name: 'block')
51 | String block;
52 |
53 | @JsonKey(name: 'state')
54 | String state;
55 |
56 | @JsonKey(name: 'updated')
57 | String updated;
58 |
59 | @JsonKey(name: 'created')
60 | String created;
61 |
62 | @JsonKey(name: 'content')
63 | String content;
64 |
65 | Docs(this.id,this.rating,this.type,this.author,this.book,this.likeCount,this.priority,this.block,this.state,this.updated,this.created,this.content,);
66 |
67 | factory Docs.fromJson(Map srcJson) => _$DocsFromJson(srcJson);
68 |
69 | Map toJson() => _$DocsToJson(this);
70 |
71 | }
72 |
73 |
74 | @JsonSerializable()
75 | class Author extends Object {
76 |
77 | @JsonKey(name: '_id')
78 | String id;
79 |
80 | @JsonKey(name: 'avatar')
81 | String avatar;
82 |
83 | @JsonKey(name: 'nickname')
84 | String nickname;
85 |
86 | @JsonKey(name: 'activityAvatar')
87 | String activityAvatar;
88 |
89 | @JsonKey(name: 'type')
90 | String type;
91 |
92 | @JsonKey(name: 'lv')
93 | int lv;
94 |
95 | @JsonKey(name: 'gender')
96 | String gender;
97 |
98 | Author(this.id,this.avatar,this.nickname,this.activityAvatar,this.type,this.lv,this.gender,);
99 |
100 | factory Author.fromJson(Map srcJson) => _$AuthorFromJson(srcJson);
101 |
102 | Map toJson() => _$AuthorToJson(this);
103 |
104 | }
105 |
106 |
107 | @JsonSerializable()
108 | class Book extends Object {
109 |
110 | @JsonKey(name: '_id')
111 | String id;
112 |
113 | @JsonKey(name: 'title')
114 | String title;
115 |
116 | @JsonKey(name: 'cover')
117 | String cover;
118 |
119 | Book(this.id,this.title,this.cover,);
120 |
121 | factory Book.fromJson(Map srcJson) => _$BookFromJson(srcJson);
122 |
123 | Map toJson() => _$BookToJson(this);
124 |
125 | }
126 |
127 |
128 |
--------------------------------------------------------------------------------
/lib/app/novel/entity/entity_novel_short_comment.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'entity_novel_short_comment.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | NovelShortComment _$NovelShortCommentFromJson(Map json) {
10 | return NovelShortComment(
11 | json['today'] as int,
12 | (json['docs'] as List)
13 | ?.map(
14 | (e) => e == null ? null : Docs.fromJson(e as Map))
15 | ?.toList(),
16 | json['ok'] as bool,
17 | );
18 | }
19 |
20 | Map _$NovelShortCommentToJson(NovelShortComment instance) =>
21 | {
22 | 'today': instance.today,
23 | 'docs': instance.docs,
24 | 'ok': instance.ok,
25 | };
26 |
27 | Docs _$DocsFromJson(Map json) {
28 | return Docs(
29 | json['_id'] as String,
30 | json['rating'] as int,
31 | json['type'] as String,
32 | json['author'] == null
33 | ? null
34 | : Author.fromJson(json['author'] as Map),
35 | json['book'] == null
36 | ? null
37 | : Book.fromJson(json['book'] as Map),
38 | json['likeCount'] as int,
39 | (json['priority'] as num)?.toDouble(),
40 | json['block'] as String,
41 | json['state'] as String,
42 | json['updated'] as String,
43 | json['created'] as String,
44 | json['content'] as String,
45 | );
46 | }
47 |
48 | Map _$DocsToJson(Docs instance) => {
49 | '_id': instance.id,
50 | 'rating': instance.rating,
51 | 'type': instance.type,
52 | 'author': instance.author,
53 | 'book': instance.book,
54 | 'likeCount': instance.likeCount,
55 | 'priority': instance.priority,
56 | 'block': instance.block,
57 | 'state': instance.state,
58 | 'updated': instance.updated,
59 | 'created': instance.created,
60 | 'content': instance.content,
61 | };
62 |
63 | Author _$AuthorFromJson(Map json) {
64 | return Author(
65 | json['_id'] as String,
66 | json['avatar'] as String,
67 | json['nickname'] as String,
68 | json['activityAvatar'] as String,
69 | json['type'] as String,
70 | json['lv'] as int,
71 | json['gender'] as String,
72 | );
73 | }
74 |
75 | Map _$AuthorToJson(Author instance) => {
76 | '_id': instance.id,
77 | 'avatar': instance.avatar,
78 | 'nickname': instance.nickname,
79 | 'activityAvatar': instance.activityAvatar,
80 | 'type': instance.type,
81 | 'lv': instance.lv,
82 | 'gender': instance.gender,
83 | };
84 |
85 | Book _$BookFromJson(Map json) {
86 | return Book(
87 | json['_id'] as String,
88 | json['title'] as String,
89 | json['cover'] as String,
90 | );
91 | }
92 |
93 | Map _$BookToJson(Book instance) => {
94 | '_id': instance.id,
95 | 'title': instance.title,
96 | 'cover': instance.cover,
97 | };
98 |
--------------------------------------------------------------------------------
/lib/app/novel/helper/helper_cache.dart:
--------------------------------------------------------------------------------
1 | class CacheHelper{
2 |
3 | }
--------------------------------------------------------------------------------
/lib/app/novel/helper/helper_db.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_novel/app/novel/entity/entity_novel_info.dart';
2 | import 'package:flutter_novel/base/db/manager_db.dart';
3 | import 'package:sqflite/sqflite.dart';
4 |
5 | class DBHelper extends BaseDBProvider {
6 | /// DataBase table name
7 | static const String TABLE_NAME = "novel_bookshelf";
8 |
9 | static const String COLUMN_ID = "_id";
10 | static const String COLUMN_BOOK_ID = "bookId";
11 | static const String COLUMN_TITLE = "title";
12 | static const String COLUMN_CHAPTER_INDEX = "chaptersIndex";
13 | static const String COLUMN_VOLUME_INDEX = "volumeIndex";
14 | static const String COLUMN_PAGE_INDEX = "pageIndex";
15 | static const String COLUMN_IMAGE = "image";
16 |
17 | @override
18 | String createSql() =>
19 | baseCreateSql(TABLE_NAME, COLUMN_ID) +
20 | '''
21 | $COLUMN_BOOK_ID TEXT not null,
22 | $COLUMN_TITLE TEXT not null,
23 | $COLUMN_IMAGE TEXT not null,
24 | $COLUMN_CHAPTER_INDEX INTEGER not null,
25 | $COLUMN_VOLUME_INDEX INTEGER not null,
26 | $COLUMN_PAGE_INDEX INTEGER not null)
27 | ''';
28 |
29 | @override
30 | String tableName() => TABLE_NAME;
31 |
32 | /// 根据[bookId]查询某书是否在书架
33 | /// @return true or false
34 | ///
35 | Future isExist(String bookId) async {
36 | if (bookId == null) return false;
37 | Database db = await getDB();
38 | List