Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
book-app
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
book-app
Commits
09c92a44
提交
09c92a44
authored
3月 25, 2024
作者:
岳维路
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'test' 到 'sim'
Test 查看合并请求 kiwitap/zijing-app!18
上级
10f6be1a
34109609
显示空白字符变更
内嵌
并排
正在显示
13 个修改的文件
包含
725 行增加
和
59 行删除
+725
-59
view.dart
lib/pages/book_detail/view.dart
+17
-29
view.dart
lib/pages/book_info/view.dart
+6
-1
controller.dart
lib/pages/library/controller.dart
+185
-14
index.dart
lib/pages/library/index.dart
+4
-0
view.dart
lib/pages/library/view.dart
+4
-3
controller.dart
lib/pages/login/controller.dart
+2
-1
controller.dart
lib/pages/read_web/controller.dart
+7
-9
index.dart
lib/pages/read_web/index.dart
+2
-0
view_offline.dart
lib/pages/read_web/view_offline.dart
+492
-0
controller.dart
lib/pages/user_edit_note/controller.dart
+1
-1
routes.dart
lib/routes/routes.dart
+2
-1
http.dart
lib/services/http.dart
+1
-0
index.dart
lib/services/index.dart
+2
-0
没有找到文件。
lib/pages/book_detail/view.dart
浏览文件 @
09c92a44
...
@@ -108,13 +108,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
...
@@ -108,13 +108,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
});
});
}
else
{
}
else
{
final
PopBackModel
?
backModel
=
await
context
.
pushNamed
(
Routes
.
web
,
queryParameters:
{
'book_id'
:
controller
.
bookDetails
.
bookId
.
toString
(),
'chapter_id'
:
chapterModel
.
id
.
toString
(),
'chapter_name'
:
chapterModel
.
name
.
toString
(),
'note_id'
:
'0'
},
extra:
controller
.
bookDetails
);
pushToReadPage
(
controller:
controller
,
chapterName:
chapterModel
.
name
.
toString
(),
chapterId:
chapterModel
.
id
.
toString
());
if
(
backModel
!.
back
==
true
){
controller
.
getChapters
();
// controller.setCurrentReadChapterId(backModel!.chapterId);
controller
.
currentChapterId
=
int
.
parse
(
backModel
!.
chapterId
);
controller
.
getBookDetails
();
}
}
}
},
},
),
),
...
@@ -209,13 +203,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
...
@@ -209,13 +203,7 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
if
(
controller
.
bookDetails
.
isFree
==
1
){
if
(
controller
.
bookDetails
.
isFree
==
1
){
final
String
chapterId
=
await
controller
.
getCurrentChapterId
();
final
String
chapterId
=
await
controller
.
getCurrentChapterId
();
final
String
chapterName
=
await
controller
.
getCurrentChapterName
();
final
String
chapterName
=
await
controller
.
getCurrentChapterName
();
final
PopBackModel
?
backModel
=
await
context
.
pushNamed
(
Routes
.
web
,
queryParameters:
{
'book_id'
:
controller
.
bookDetails
.
bookId
.
toString
(),
'chapter_id'
:
chapterId
,
'chapter_name'
:
chapterName
,
'note_id'
:
'0'
},
extra:
controller
.
bookDetails
);
pushToReadPage
(
controller:
controller
,
chapterName:
chapterName
,
chapterId:
chapterId
);
if
(
backModel
!.
back
==
true
){
controller
.
getChapters
();
controller
.
currentChapterId
=
int
.
parse
(
backModel
!.
chapterId
);
controller
.
getBookDetails
();
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
}
else
{
else
{
// 没有购买
// 没有购买
...
@@ -243,27 +231,14 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
...
@@ -243,27 +231,14 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
else
{
else
{
final
String
chapterId
=
await
controller
.
getCurrentChapterId
();
final
String
chapterId
=
await
controller
.
getCurrentChapterId
();
final
String
chapterName
=
await
controller
.
getCurrentChapterName
();
final
String
chapterName
=
await
controller
.
getCurrentChapterName
();
final
PopBackModel
?
backModel
=
await
context
.
pushNamed
(
Routes
.
web
,
queryParameters:
{
'book_id'
:
controller
.
bookDetails
.
bookId
.
toString
(),
'chapter_id'
:
chapterId
,
'chapter_name'
:
chapterName
,
'note_id'
:
'0'
},
extra:
controller
.
bookDetails
);
pushToReadPage
(
controller:
controller
,
chapterName:
chapterName
,
chapterId:
chapterId
);
if
(
backModel
!.
back
==
true
){
controller
.
getChapters
();
controller
.
getBookDetails
();
controller
.
currentChapterId
=
int
.
parse
(
backModel
!.
chapterId
);
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
}
}
}
else
{
else
{
final
String
chapterId
=
await
controller
.
getCurrentChapterId
();
final
String
chapterId
=
await
controller
.
getCurrentChapterId
();
final
String
chapterName
=
await
controller
.
getCurrentChapterName
();
final
String
chapterName
=
await
controller
.
getCurrentChapterName
();
pushToReadPage
(
controller:
controller
,
chapterName:
chapterName
,
chapterId:
chapterId
);
final
PopBackModel
?
backModel
=
await
context
.
pushNamed
(
Routes
.
web
,
queryParameters:
{
'book_id'
:
controller
.
bookDetails
.
bookId
.
toString
(),
'chapter_id'
:
chapterId
,
'chapter_name'
:
chapterName
,
'note_id'
:
'0'
},
extra:
controller
.
bookDetails
);
if
(
backModel
!.
back
==
true
){
controller
.
getChapters
();
controller
.
currentChapterId
=
int
.
parse
(
backModel
!.
chapterId
);
controller
.
getBookDetails
();
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
}
}
}
...
@@ -289,5 +264,18 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
...
@@ -289,5 +264,18 @@ class _BookDetailPageState extends State<BookDetailPage> with SingleTickerProvid
}
}
void
pushToReadPage
({
required
BookDetailController
controller
,
required
String
chapterName
,
required
String
chapterId
,
})
async
{
final
PopBackModel
?
backModel
=
await
context
.
pushNamed
(
Routes
.
web
,
queryParameters:
{
'book_id'
:
controller
.
bookDetails
.
bookId
.
toString
(),
'chapter_id'
:
chapterId
,
'chapter_name'
:
chapterName
,
'note_id'
:
'0'
},
extra:
controller
.
bookDetails
);
if
(
backModel
!.
back
==
true
){
controller
.
getChapters
();
controller
.
currentChapterId
=
int
.
parse
(
backModel
!.
chapterId
);
controller
.
getBookDetails
();
// controller.setCurrentReadChapterId(backModel!.chapterId);
}
}
}
}
lib/pages/book_info/view.dart
浏览文件 @
09c92a44
...
@@ -108,14 +108,19 @@ class BookInfoPage extends StatelessWidget {
...
@@ -108,14 +108,19 @@ class BookInfoPage extends StatelessWidget {
{
'name'
:
'上架时间'
,
'value'
:
Tools
.
dateFromMS
(
model
.
onsaleTime
!.
toInt
(),
pattern:
'yyyy年MM月dd日'
)},
{
'name'
:
'上架时间'
,
'value'
:
Tools
.
dateFromMS
(
model
.
onsaleTime
!.
toInt
(),
pattern:
'yyyy年MM月dd日'
)},
].
map
((
item
){
].
map
((
item
){
return
Row
(
return
Row
(
mainAxisAlignment:
MainAxisAlignment
.
start
,
children:
[
Row
(
children:
[
children:
[
Container
(
Container
(
// color: Colors.cyan,
// color: Colors.cyan,
alignment:
Alignment
.
centerRight
,
alignment:
Alignment
.
centerRight
,
width:
6
0
.
w
,
width:
8
0
.
w
,
child:
Text
(
item
[
'name'
].
toString
(),
style:
const
TextStyle
(
fontSize:
15
,
height:
2.1
,
color:
Colours
.
c3
),),
child:
Text
(
item
[
'name'
].
toString
(),
style:
const
TextStyle
(
fontSize:
15
,
height:
2.1
,
color:
Colours
.
c3
),),
),
),
Gaps
.
hGaps20
,
Gaps
.
hGaps20
,
],
),
Expanded
(
Expanded
(
child:
Container
(
child:
Container
(
// color: Colors.red,
// color: Colors.red,
...
...
lib/pages/library/controller.dart
浏览文件 @
09c92a44
...
@@ -2,6 +2,8 @@ part of library;
...
@@ -2,6 +2,8 @@ part of library;
class
LibraryController
extends
GetxController
with
GetTickerProviderStateMixin
{
class
LibraryController
extends
GetxController
with
GetTickerProviderStateMixin
{
final
BuildContext
context
;
LibraryController
(
this
.
context
);
// 分类数据
// 分类数据
List
<
CategoryModel
>
categories
=
[];
List
<
CategoryModel
>
categories
=
[];
// 标签数据
// 标签数据
...
@@ -49,6 +51,8 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
...
@@ -49,6 +51,8 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
late
AnimationController
_controller
;
late
AnimationController
_controller
;
bool
_show
=
false
;
bool
_show
=
false
;
late
UModel
_getModel
;
bool
get
show
=>
_show
;
bool
get
show
=>
_show
;
void
setShow
(
bool
value
)
{
void
setShow
(
bool
value
)
{
_show
=
!
value
;
_show
=
!
value
;
...
@@ -85,21 +89,13 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
...
@@ -85,21 +89,13 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
_getTabs
();
_getTabs
();
// 获取广告数据
// 获取广告数据
_getAds
();
_getAds
();
// 检测版本
// if(Platform.isAndroid){
// _checkUpdates();
// }
// 测试添加数据库数据
// testInsertData();
// Map<String, dynamic> data = {
// 'types': 1,
// 'book_id': 175,
// 'chapter_id': 334,
// 'is_open': 1,
// 'color': 'blue',
// 'content': 'This is a note content',
// 'upload': 0,
// 'positioning': 'top',
// 'note_content': 'This is a note',
// 'node_id': 0,
// };
//
// await SqlManager.insertData(data);
final
result
=
await
Tools
.
checkCurrentNetStatus
();
final
result
=
await
Tools
.
checkCurrentNetStatus
();
// 有网络 并且是登录状态 的时候上传 笔记
// 有网络 并且是登录状态 的时候上传 笔记
...
@@ -378,6 +374,180 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
...
@@ -378,6 +374,180 @@ class LibraryController extends GetxController with GetTickerProviderStateMixin{
}
}
}
}
void
testInsertData
()
async
{
Map
<
String
,
dynamic
>
data
=
{
'types'
:
1
,
'book_id'
:
175
,
'chapter_id'
:
334
,
'is_open'
:
1
,
'color'
:
'blue'
,
'content'
:
'This is a note content'
,
'upload'
:
0
,
'positioning'
:
'top'
,
'note_content'
:
'This is a note'
,
'node_id'
:
0
,
};
await
SqlManager
.
insertData
(
data
);
}
void
_checkUpdates
()
async
{
UModel
model
=
await
MineAPI
.
update
();
_getModel
=
model
;
final
packageInfo
=
await
PackageInfo
.
fromPlatform
();
int
update
=
verifyVersion
(
model
.
version
!,
packageInfo
.
version
);
if
(
update
==
1
)
{
_showUpdateDialog
(
false
);
}
}
int
verifyVersion
(
String
newVersion
,
String
oldVersion
)
{
List
<
String
>
newVersionArr
=
newVersion
.
split
(
'.'
);
List
<
String
>
oldVersionArr
=
oldVersion
.
split
(
'.'
);
for
(
int
i
=
0
;
i
<
3
;
i
++)
{
int
newVersionNumber
=
int
.
parse
(
newVersionArr
[
i
]);
int
oldVersionNumber
=
int
.
parse
(
oldVersionArr
[
i
]);
if
(
newVersionNumber
<
oldVersionNumber
)
{
return
-
1
;
// 新版本小于旧版本
}
else
if
(
newVersionNumber
>
oldVersionNumber
)
{
return
1
;
// 新版本大于旧版本
}
}
return
0
;
// 两个版本号相等
}
_showUpdateDialog
(
bool
forcedUpgrade
)
{
showDialog
(
context:
context
,
barrierDismissible:
!
forcedUpgrade
,
builder:
(
BuildContext
context
)
{
return
WillPopScope
(
onWillPop:
()
=>
Future
.
value
(!
forcedUpgrade
),
child:
AlertDialog
(
insetPadding:
EdgeInsets
.
zero
,
// 设置水平边距
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
8.0
.
w
),
),
// 去除操作按钮区域的内边距
actionsPadding:
EdgeInsets
.
zero
,
actions:
<
Widget
>[
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
Column
(
mainAxisAlignment:
MainAxisAlignment
.
start
,
children:
[
SizedBox
(
height:
25.5
.
w
,
),
SizedBox
(
height:
92
.
w
,
width:
92
.
w
,
child:
Image
.
asset
(
'assets/images/app_update.png'
),
),
SizedBox
(
height:
13
.
w
,
),
Text
(
"版本更新"
,
style:
TextStyle
(
fontSize:
14
.
w
,
color:
Colours
.
c3
,
fontWeight:
Fonts
.
medium
),
),
Padding
(
padding:
EdgeInsets
.
only
(
top:
5.5
.
w
),
child:
Text
(
'发现新版本V
${_getModel.version}
'
,
style:
TextStyle
(
fontSize:
10
.
w
,
color:
Colours
.
c9
,
fontWeight:
Fonts
.
medium
),
),
),
SizedBox
(
height:
22
.
w
,
),
Container
(
height:
1
,
// 设置分割线的高度
width:
216.5
.
w
,
// 设置分割线的宽度
color:
Colours
.
cLine
,
// 设置分割线的颜色
),
Row
(
mainAxisAlignment:
MainAxisAlignment
.
spaceBetween
,
children:
[
if
(!
forcedUpgrade
)
Padding
(
padding:
EdgeInsets
.
only
(
right:
28
.
w
),
child:
GestureDetector
(
child:
Container
(
width:
85
.
w
,
color:
Colours
.
cFF
,
alignment:
Alignment
.
center
,
child:
const
Text
(
'稍后再说'
,
style:
TextStyle
(
color:
Colours
.
c6
,
fontSize:
15
,
fontWeight:
Fonts
.
medium
),
),
),
onTap:
()
=>
Navigator
.
of
(
context
).
pop
(),
),),
Container
(
height:
39.5
.
w
,
// 设置分割线的高度
width:
1
,
// 设置分割线的宽度
color:
Colours
.
cLine
,
// 设置分割线的颜色
),
Padding
(
padding:
EdgeInsets
.
only
(
left:
28
.
w
),
child:
GestureDetector
(
child:
Container
(
width:
85
.
w
,
color:
Colours
.
cFF
,
alignment:
Alignment
.
center
,
child:
const
Text
(
'立即更新'
,
style:
TextStyle
(
color:
Colours
.
cAB1941
,
fontSize:
15
,
fontWeight:
Fonts
.
boldSemi
),
),
),
onTap:
()
{
_appUpdate
();
if
(!
forcedUpgrade
)
{
Navigator
.
of
(
context
).
pop
();
}
},
),
),
],
),
],
),
],
),
],
),
);
},
);
}
/// TODO: 苹果市场app地址
_appUpdate
()
{
UpdateModel
model
=
UpdateModel
(
_getModel
.
url
!,
"zijing.apk"
,
"ic_launcher"
,
'https://itunes.apple.com/cn/app/抖音/id1142110895'
,
);
AzhonAppUpdate
.
update
(
model
).
then
((
value
)
=>
debugPrint
(
'
$value
'
));
}
}
}
\ No newline at end of file
lib/pages/library/index.dart
浏览文件 @
09c92a44
library
library
;
library
library
;
import
'dart:convert'
;
import
'dart:convert'
;
import
'dart:io'
;
import
'package:azlistview/azlistview.dart'
;
import
'package:azlistview/azlistview.dart'
;
import
'package:easy_refresh/easy_refresh.dart'
;
import
'package:easy_refresh/easy_refresh.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_app_update/azhon_app_update.dart'
;
import
'package:flutter_app_update/update_model.dart'
;
import
'package:flutter_book/apis/index.dart'
;
import
'package:flutter_book/apis/index.dart'
;
import
'package:flutter_book/theme.dart'
;
import
'package:flutter_book/theme.dart'
;
import
'package:flutter_book/utils/index.dart'
;
import
'package:flutter_book/utils/index.dart'
;
...
@@ -12,6 +15,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
...
@@ -12,6 +15,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import
'package:get/get.dart'
;
import
'package:get/get.dart'
;
import
'package:go_router/go_router.dart'
;
import
'package:go_router/go_router.dart'
;
import
'package:ionicons/ionicons.dart'
;
import
'package:ionicons/ionicons.dart'
;
import
'package:package_info_plus/package_info_plus.dart'
;
import
'../../models/index.dart'
;
import
'../../models/index.dart'
;
import
'../../routes/index.dart'
;
import
'../../routes/index.dart'
;
...
...
lib/pages/library/view.dart
浏览文件 @
09c92a44
...
@@ -9,10 +9,11 @@ class LibraryPage extends StatefulWidget {
...
@@ -9,10 +9,11 @@ class LibraryPage extends StatefulWidget {
class
_LibraryPageState
extends
State
<
LibraryPage
>
{
class
_LibraryPageState
extends
State
<
LibraryPage
>
{
@override
@override
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
return
GetBuilder
<
LibraryController
>(
return
GetBuilder
<
LibraryController
>(
init:
LibraryController
(),
init:
LibraryController
(
context
),
builder:
(
controller
)
=>
Scaffold
(
builder:
(
controller
)
=>
Scaffold
(
appBar:
AppBar
(
appBar:
AppBar
(
title:
const
Text
(
'图书馆'
),
title:
const
Text
(
'图书馆'
),
...
@@ -131,7 +132,7 @@ class _LibraryPageState extends State<LibraryPage> {
...
@@ -131,7 +132,7 @@ class _LibraryPageState extends State<LibraryPage> {
height:
43
.
w
,
height:
43
.
w
,
color:
Colours
.
cF9
,
color:
Colours
.
cF9
,
child:
GetBuilder
<
LibraryController
>(
child:
GetBuilder
<
LibraryController
>(
init:
LibraryController
(),
init:
LibraryController
(
context
),
// id: 'label',
// id: 'label',
builder:
(
controller
)
=>
ListView
.
builder
(
builder:
(
controller
)
=>
ListView
.
builder
(
scrollDirection:
Axis
.
horizontal
,
scrollDirection:
Axis
.
horizontal
,
...
@@ -153,7 +154,7 @@ class _LibraryPageState extends State<LibraryPage> {
...
@@ -153,7 +154,7 @@ class _LibraryPageState extends State<LibraryPage> {
return
Container
(
return
Container
(
height:
38
.
w
,
height:
38
.
w
,
child:
GetBuilder
<
LibraryController
>(
child:
GetBuilder
<
LibraryController
>(
init:
LibraryController
(),
init:
LibraryController
(
context
),
builder:
(
controller
)
=>
ListView
.
builder
(
builder:
(
controller
)
=>
ListView
.
builder
(
scrollDirection:
Axis
.
horizontal
,
scrollDirection:
Axis
.
horizontal
,
itemBuilder:
(
BuildContext
context
,
int
index
){
itemBuilder:
(
BuildContext
context
,
int
index
){
...
...
lib/pages/login/controller.dart
浏览文件 @
09c92a44
...
@@ -153,7 +153,8 @@ class LoginController extends GetxController {
...
@@ -153,7 +153,8 @@ class LoginController extends GetxController {
// ]);
// ]);
if
(
context
.
mounted
){
if
(
context
.
mounted
){
context
.
goNamed
(
Routes
.
main
);
// context.goNamed(Routes.main);
context
.
pop
();
}
else
{
}
else
{
context
.
goNamed
(
Routes
.
main
);
context
.
goNamed
(
Routes
.
main
);
}
}
...
...
lib/pages/read_web/controller.dart
浏览文件 @
09c92a44
...
@@ -282,8 +282,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
...
@@ -282,8 +282,12 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
// 初始化录音组件
// 初始化录音组件
Future
<
void
>
openTheRecorder
()
async
{
Future
<
void
>
openTheRecorder
()
async
{
// 获取权限
if
(
await
Access
.
microphone
()){
var
status
=
await
Access
.
microphone
();
if
(
status
==
false
)
{
Toast
.
show
(
'录音权限没有开启无法使用该功能'
);
return
;
}
await
_mRecorder
.
openRecorder
();
await
_mRecorder
.
openRecorder
();
final
session
=
await
AudioSession
.
instance
;
final
session
=
await
AudioSession
.
instance
;
await
session
.
configure
(
AudioSessionConfiguration
(
await
session
.
configure
(
AudioSessionConfiguration
(
...
@@ -304,14 +308,9 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
...
@@ -304,14 +308,9 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
androidWillPauseWhenDucked:
true
,
androidWillPauseWhenDucked:
true
,
));
));
}
}
// 没有权限
else
{
}
}
// 开启录音
// 开启录音
void
record
()
async
{
void
record
()
async
{
openTheRecorder
();
await
openTheRecorder
();
startRecording
=
true
;
startRecording
=
true
;
String
filePath
=
await
Tools
.
getDirectory
();
String
filePath
=
await
Tools
.
getDirectory
();
String
fileName
=
Tools
.
generateVoiceFileName
();
String
fileName
=
Tools
.
generateVoiceFileName
();
...
@@ -323,7 +322,6 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
...
@@ -323,7 +322,6 @@ class ReadController extends FullLifeCycleController with GetSingleTickerProvide
codec:
Codec
.
aacMP4
,
codec:
Codec
.
aacMP4
,
);
);
// _mRecorder?.setSubscriptionDuration(Duration(milliseconds: 100));
// _mRecorder?.setSubscriptionDuration(Duration(milliseconds: 100));
// _mRecorder?.onProgress?.listen((e)
// _mRecorder?.onProgress?.listen((e)
// {
// {
...
...
lib/pages/read_web/index.dart
浏览文件 @
09c92a44
...
@@ -51,3 +51,4 @@ part 'discuss_controller.dart';
...
@@ -51,3 +51,4 @@ part 'discuss_controller.dart';
part
'widgets/input_discuss.dart'
;
part
'widgets/input_discuss.dart'
;
part
'widgets/item.dart'
;
part
'widgets/item.dart'
;
part
'widgets/search_all.dart'
;
part
'widgets/search_all.dart'
;
part
'view_offline.dart'
;
\ No newline at end of file
lib/pages/read_web/view_offline.dart
0 → 100644
浏览文件 @
09c92a44
part of
web
;
class
ReadOfflinePage
extends
StatefulWidget
{
final
String
bookId
;
final
String
chapterId
;
final
String
chapterName
;
final
String
noteId
;
final
BookDetailModel
bookDetailModel
;
const
ReadOfflinePage
({
Key
?
key
,
required
this
.
bookId
,
required
this
.
chapterId
,
required
this
.
chapterName
,
required
this
.
bookDetailModel
,
required
this
.
noteId
})
:
super
(
key:
key
);
@override
State
<
ReadPage
>
createState
()
=>
_ReadPageState
();
}
class
_ReadOfflinePageState
extends
State
<
ReadPage
>
{
@override
void
initState
()
{
super
.
initState
();
}
@override
Widget
build
(
BuildContext
context
)
{
return
GetBuilder
(
init:
ReadController
(
bookId:
widget
.
bookId
,
chapterId:
widget
.
chapterId
,
chapterName:
widget
.
chapterName
,
bookDetailModel:
widget
.
bookDetailModel
,
noteId:
widget
.
noteId
),
builder:
(
readController
)
=>
WillPopScope
(
onWillPop:
()
async
{
PopBackModel
backModel
=
PopBackModel
(
chapterId:
readController
.
chapterId
,
back:
true
,
chapterName:
readController
.
chapterId
);
context
.
pop
(
backModel
);
CustomToast
.
dismiss
();
return
false
;
},
child:
Scaffold
(
appBar:
CustomAppBar
(
titleSpacing:
0
,
title:
Align
(
alignment:
Alignment
.
centerLeft
,
child:
Text
(
readController
.
chapterName
),
),
centerTitle:
false
,
actions:
const
[
],
),
resizeToAvoidBottomInset:
false
,
body:
Container
(
color:
Colors
.
white
,
child:
Stack
(
children:
[
InAppWebView
(
initialUrlRequest:
URLRequest
(
// url: Uri.parse(kReadBook),
url:
readController
.
localHtml5Path
.
isNotEmpty
?
WebUri
.
uri
(
Uri
.
parse
(
readController
.
localHtml5Path
)):
WebUri
.
uri
(
Uri
.
parse
(
kReadBook
))
// url: Uri.parse("/storage/emulated/0/Android/data/com.zijin.book.flutter_book/files/174/7-325.html"),
),
initialSettings:
InAppWebViewSettings
(
clearCache:
true
,
// http的请求也不做限制
mixedContentMode:
MixedContentMode
.
MIXED_CONTENT_ALWAYS_ALLOW
),
contextMenu:
ContextMenu
(
// options: ContextMenuOptions(hideDefaultSystemContextMenuItems: true),
settings:
ContextMenuSettings
(
hideDefaultSystemContextMenuItems:
true
,
)
),
onWebViewCreated:
(
InAppWebViewController
controller
){
CustomToast
.
loading
();
readController
.
webViewController
=
controller
;
},
onConsoleMessage:
(
controller
,
consoleMessage
)
{
// 接收从 WebView 发送的消息
Console
.
log
(
"Received message from WebView-----------------------------:
${consoleMessage.message}
"
);
},
onLoadStop:
(
controller
,
url
)
{
CustomToast
.
dismiss
();
// flutter 主动给 js 传参数
Map
<
String
,
dynamic
>
param
=
{
'book_id'
:
readController
.
bookId
,
'chapter_id'
:
readController
.
chapterId
,
'token'
:
UserStore
.
to
.
token
};
String
str
=
'
$kServerUrl
,
${readController.bookId}
,
${readController.chapterId}
,
${UserStore.to.token}
,
${readController.noteId}
,
${readController.sModel.bookId =='0'?'':readController.sModel.combinedContent}
'
;
Console
.
log
(
'传给前端的参数--------------------------------
$str
'
);
controller
.
evaluateJavascript
(
source
:
'callbackInFlutterComponent("
$str
");'
);
// 添加单击事件
controller
.
evaluateJavascript
(
source
:
'''
document.addEventListener('
click
', function() {
window.flutter_inappwebview.callHandler('
onTap
');
});
'''
);
// 监听js单击回调
controller
.
addJavaScriptHandler
(
handlerName:
'onTap'
,
callback:
(
args
){
readController
.
setShow
(
readController
.
show
);
});
// 监听笔记回调
controller
.
addJavaScriptHandler
(
handlerName:
'noteCallBack'
,
callback:
(
args
){
Console
.
log
(
'监听笔记回调------------------------------------------------
$args
'
);
readController
.
noteTitle
=
args
.
first
;
readController
.
setShowChat
(
true
);
readController
.
setChatType
(
1
);
// readController.titleInput.text = args.toString();
});
// 监听百科回调
controller
.
addJavaScriptHandler
(
handlerName:
'baikeCallBack'
,
callback:
(
args
){
Console
.
log
(
'监听百科回调------------------------------------------------
$args
'
);
context
.
pushNamed
(
Routes
.
baiKe
,
queryParameters:
{
'keyword'
:
args
.
first
});
});
// 监听字典回调
controller
.
addJavaScriptHandler
(
handlerName:
'dictCallBack'
,
callback:
(
args
){
Console
.
log
(
'监听字典回调------------------------------------------------
$args
'
);
context
.
pushNamed
(
Routes
.
baiDict
,
queryParameters:
{
'keyword'
:
args
.
first
});
});
// 监听朗读回调
controller
.
addJavaScriptHandler
(
handlerName:
'readCallBack'
,
callback:
(
args
){
Console
.
log
(
'监听朗读回调------------------------------------------------
$args
'
);
readController
.
speak
(
args
.
first
.
toString
());
});
// 监听讨论回调
controller
.
addJavaScriptHandler
(
handlerName:
'discussCallBack'
,
callback:
(
args
){
Console
.
log
(
'监听讨论回调------------------------------------------------
$args
'
);
readController
.
setShowChat
(
true
);
readController
.
setChatType
(
0
);
readController
.
noteTitle
=
args
.
first
.
toString
();
});
controller
.
addJavaScriptHandler
(
handlerName:
'answerResultCallBack'
,
callback:
(
args
){
Console
.
log
(
'监听答题回调------------------------------------------------
$args
'
);
String
chapterId
=
args
.
first
[
0
].
toString
();
String
position
=
args
.
first
[
1
].
toString
();
// 0:未答题 1:答题结果
String
type
=
args
.
first
[
2
].
toString
();
// 测评标题
String
title
=
args
.
first
[
3
].
toString
();
String
url
=
''
;
// 未答题
if
(
type
==
'0'
){
url
=
kAnswer
;
}
else
{
url
=
kAnswerResult
;
}
Map
<
String
,
String
>
params
=
{
'chapter_id'
:
chapterId
,
'position'
:
position
,
'url'
:
url
,
'book_id'
:
readController
.
bookId
,
'token'
:
UserStore
.
to
.
token
,
'title'
:
title
};
Console
.
log
(
'监听答题回调---------------给页面传参---------------------------------
$params
'
);
context
.
pushNamed
(
Routes
.
answer
,
queryParameters:
params
);
// 跳转知识测评界面
});
// 监听 上一节 下一节
controller
.
addJavaScriptHandler
(
handlerName:
'loadChapterCallBack'
,
callback:
(
args
){
String
chapterId
=
args
.
first
[
0
].
toString
();
String
chapterName
=
args
.
first
[
1
].
toString
();
ChapterModel
chapterModel
=
ChapterModel
(
id:
int
.
parse
(
chapterId
),
name:
chapterName
);
// readController.setChapterInfo(id: chapterId, name: chapterName ?? '');
readController
.
selectChapter
(
chapterModel
);
Console
.
log
(
'监听 上一节 下一节------------------------------------------------
$args
'
);
});
// // 监听 双击回调
// controller.addJavaScriptHandler(handlerName: 'dbClickCallBack', callback: (args){
// readController.setShow(readController.show);
// });
// 阅读页内容中的 外部链接
controller
.
addJavaScriptHandler
(
handlerName:
'openLinkCallback'
,
callback:
(
args
){
Console
.
log
(
'监听外部链接------------------------------------------------
$args
'
);
context
.
pushNamed
(
Routes
.
link
,
queryParameters:
{
'url'
:
args
.
first
.
toString
()});
});
// 画廊 扩展于都
controller
.
addJavaScriptHandler
(
handlerName:
'readInfoCallback'
,
callback:
(
args
){
String
position
=
args
.
first
[
0
].
toString
();
String
type
=
args
.
first
[
1
].
toString
();
String
title
=
args
.
first
[
2
].
toString
();
Map
<
String
,
String
>
params
=
{
'chapter_id'
:
readController
.
chapterId
,
'position'
:
position
,
'book_id'
:
readController
.
bookId
,
'token'
:
UserStore
.
to
.
token
,
'title'
:
title
,
'base_url'
:
kServerUrl
,
'type'
:
type
};
Console
.
log
(
'监听画廊 扩展于都---------------给页面传参---------------------------------
$params
'
);
context
.
pushNamed
(
Routes
.
readInfo
,
queryParameters:
params
);
});
// 图片预览
controller
.
addJavaScriptHandler
(
handlerName:
'scaleImageCallback'
,
callback:
(
args
){
String
url
=
args
.
first
[
0
].
toString
();
String
title
=
args
.
first
[
1
].
toString
();
Map
<
String
,
String
>
params
=
{
'url'
:
url
,
'title'
:
title
,
};
Console
.
log
(
'监听图片预览---------------给页面传参---------------------------------
$params
'
);
context
.
pushNamed
(
Routes
.
scaleImage
,
queryParameters:
params
);
});
// 前端 token过去回调
controller
.
addJavaScriptHandler
(
handlerName:
'refreshTokenCallback'
,
callback:
(
args
)
async
{
final
result
=
await
readController
.
refreshToken
();
Map
<
String
,
dynamic
>
param
=
{
'token'
:
result
,
};
String
jsonStr
=
jsonEncode
(
param
);
controller
.
evaluateJavascript
(
source
:
'refreshTokenSuccess(
$jsonStr
)'
);
});
/// 离线需要参数
// //
// Map<String, dynamic> param111 = {
// 'book_id': readController.bookId,
// 'chapter_id': readController.chapterId,
// 'token':UserStore.to.token
// };
// String jsonStr = jsonEncode(param111);
// controller.evaluateJavascript(source: 'offlineCallbackInFlutterComponent($jsonStr)');
// // controller.evaluateJavascript(source: 'callbackInFlutterComponent("$str");');
// 添加高亮划线笔记
controller
.
addJavaScriptHandler
(
handlerName:
'offlineAddNoteCallBack'
,
callback:
(
args
){
Map
<
String
,
dynamic
>
data
=
{};
readController
.
addLocalNote
(
data
);
});
// 删除高亮划线笔记
controller
.
addJavaScriptHandler
(
handlerName:
'offlineDelNoteCallBack'
,
callback:
(
args
){
int
id
=
0
;
readController
.
delLocalNote
(
id:
id
);
});
// 更新高亮划线笔记
controller
.
addJavaScriptHandler
(
handlerName:
'offlineUpdateNoteCallBack'
,
callback:
(
args
){
int
id
=
0
;
Map
<
String
,
dynamic
>
data
=
{};
readController
.
updateLocalNote
(
id:
id
,
data:
data
);
});
// 查询高亮划线笔记
controller
.
addJavaScriptHandler
(
handlerName:
'offlineQueryNoteCallBack'
,
callback:
(
args
){
});
// 上一节下一节
controller
.
addJavaScriptHandler
(
handlerName:
'offlineReadNoteCallBack'
,
callback:
(
args
){
int
type
=
0
;
// 上一节
if
(
type
==
0
){
readController
.
readChapter
(
type:
0
);
}
// 下一节
else
{
readController
.
readChapter
(
type:
1
);
}
});
},
),
Positioned
(
left:
0
,
right:
0
,
top:
0
,
bottom:
69
,
child:
_showContent
(
readController
,
readController
.
toolModel
)
),
/// 底部工具栏布局
Visibility
(
visible:
readController
.
show
,
child:
Positioned
(
left:
0
,
right:
0
,
bottom:
0
,
child:
SafeArea
(
bottom:
false
,
child:
Container
(
height:
69
,
color:
Colors
.
limeAccent
,
alignment:
Alignment
.
center
,
child:
_createToolBar
(
readController
)
),
),
)
),
/// 悬浮按钮点击发起话题布局
Visibility
(
visible:
readController
.
showChat
,
child:
Positioned
(
left:
0
,
right:
0
,
top:
0
,
bottom:
0
,
child:
GestureDetector
(
onTap:
(){
readController
.
setShowChat
(
false
);
readController
.
clearAllDiscussInput
();
},
child:
Container
(
color:
const
Color
(
0xFF000000
).
withOpacity
(
0.5
),
child:
SingleChildScrollView
(
reverse:
true
,
child:
Container
(
color:
Colors
.
white
,
padding:
EdgeInsets
.
only
(
bottom:
MediaQuery
.
of
(
context
).
viewInsets
.
bottom
),
// alignment:Alignment.bottomCenter,
child:
GestureDetector
(
behavior:
HitTestBehavior
.
opaque
,
onTap:
(){},
child:
ReadInputDiscuss
(
controller:
readController
,)
)
),
),
),
)
),
),
],
),
),
),
),
);
}
/// 目录 笔记 讨论 工具栏
Widget
_createToolBar
(
ReadController
controller
){
return
Row
(
mainAxisAlignment:
MainAxisAlignment
.
spaceAround
,
children:
controller
.
tools
.
map
((
model
){
return
Expanded
(
child:
GestureDetector
(
onTap:
(){
controller
.
chooseTool
(
model
);
},
child:
Container
(
color:
Colors
.
white
,
padding:
EdgeInsets
.
only
(
bottom:
15
.
w
),
child:
Column
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
mainAxisSize:
MainAxisSize
.
max
,
children:
[
SizedBox
(
width:
25
,
height:
25
,
child:
Image
.
asset
(
model
.
selected
?
model
.
activeIcon
:
model
.
icon
,
fit:
BoxFit
.
cover
,)
),
SizedBox
(
height:
2.5
.
w
,),
model
.
selected
?
Text
(
model
.
name
,
style:
TextStyle
(
fontSize:
12
.
w
,
height:
1.4
,
fontWeight:
Fonts
.
boldSemi
,
color:
AppTheme
.
primary
),)
:
Text
(
model
.
name
,
style:
TextStyle
(
fontSize:
12
.
w
,
height:
1.4
,
fontWeight:
Fonts
.
medium
,
color:
Colours
.
c6
))
],
),
),
),
);
}).
toList
()
);
}
Widget
detail
(
ReadController
controller
,
ToolModel
model
){
if
(
model
.
tag
==
0
){
return
ReadCategoryPage
(
controller:
controller
,
// 点 x 事件
onTap:
(){
controller
.
chooseTool
(
model
);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem:
(
SearchAllModel
sModel
){
controller
.
chooseTool
(
model
);
// 加载阅读界面 参数:chapter_id text
controller
.
sModel
=
sModel
;
controller
.
selectChapter
(
ChapterModel
(
id:
sModel
.
chapterId
,
name:
sModel
.
chapterName
));
controller
.
webViewController
.
reload
();
},
onTapChapter:
(
ChapterModel
chapterModel
){
// 配置选择的章节
controller
.
selectChapter
(
chapterModel
);
// 取消选中 tool
controller
.
chooseTool
(
model
);
// 选择了新的章节 刷新 webview
controller
.
webViewController
.
reload
();
// controller.setCurrentReadChapterId();
},
);
}
else
if
(
model
.
tag
==
1
){
return
ReadNotePage
(
// 点 x 事件
onTap:
(){
controller
.
chooseTool
(
model
);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem:
(
SearchAllModel
sModel
){
controller
.
chooseTool
(
model
);
// 重新加载阅读界面 参数:chapter_id text
controller
.
sModel
=
sModel
;
controller
.
selectChapter
(
ChapterModel
(
id:
sModel
.
chapterId
,
name:
sModel
.
chapterName
));
controller
.
webViewController
.
reload
();
},
// 删除笔记后 重新刷新web页
delTapCallBack:
(){
controller
.
webViewController
.
reload
();
},
bookDetailModel:
controller
.
bookDetailModel
,
chapterId:
controller
.
chapterId
,
);
}
else
if
(
model
.
tag
==
2
){
return
ReadDiscussPage
(
// 点 x 事件
onTap:
(){
controller
.
chooseTool
(
model
);
},
// 点 搜索全部 列表 某一项 事件
onTapSearchItem:
(
SearchAllModel
sModel
){
controller
.
chooseTool
(
model
);
controller
.
sModel
=
sModel
;
// 重新加载阅读界面 参数:chapter_id text
controller
.
selectChapter
(
ChapterModel
(
id:
sModel
.
chapterId
,
name:
sModel
.
chapterName
));
controller
.
webViewController
.
reload
();
},
bookDetailModel:
controller
.
bookDetailModel
,
chapterId:
controller
.
chapterId
,
);
}
return
const
SizedBox
();
}
/// 目录、评论、笔记 背景
Widget
_showContent
(
ReadController
controller
,
ToolModel
model
)
{
if
(
controller
.
show
){
if
(
model
.
selected
){
return
GestureDetector
(
onTap:
(){
controller
.
chooseTool
(
model
);
},
child:
Container
(
color:
const
Color
(
0xFF000000
).
withOpacity
(
0.5
),
padding:
EdgeInsets
.
only
(
top:
MediaQuery
.
of
(
context
).
size
.
height
*
0.2
),
child:
ClipRRect
(
borderRadius:
BorderRadius
.
only
(
topRight:
Radius
.
circular
(
8
.
w
),
topLeft:
Radius
.
circular
(
8
.
w
)),
child:
Container
(
color:
Colors
.
white
,
child:
GestureDetector
(
behavior:
HitTestBehavior
.
opaque
,
onTap:
(){},
child:
detail
(
controller
,
model
),
)
),
),
// child: ReadCategoryPage(),
),
);
}
else
{
return
const
SizedBox
();
}
}
return
const
SizedBox
();
}
}
lib/pages/user_edit_note/controller.dart
浏览文件 @
09c92a44
...
@@ -116,7 +116,7 @@ class UserEditNoteController extends GetxController {
...
@@ -116,7 +116,7 @@ class UserEditNoteController extends GetxController {
// 开启录音
// 开启录音
void
record
()
async
{
void
record
()
async
{
openTheRecorder
();
await
openTheRecorder
();
update
();
update
();
startRecording
=
true
;
startRecording
=
true
;
String
filePath
=
await
Tools
.
getDirectory
();
String
filePath
=
await
Tools
.
getDirectory
();
...
...
lib/routes/routes.dart
浏览文件 @
09c92a44
...
@@ -134,10 +134,11 @@ abstract class Routes {
...
@@ -134,10 +134,11 @@ abstract class Routes {
// 图片预览
// 图片预览
static
const
imageView
=
'image_view'
;
static
const
imageView
=
'image_view'
;
static
final
GlobalKey
<
NavigatorState
>
navigatorKey
=
GlobalKey
<
NavigatorState
>();
static
final
GoRouter
config
=
GoRouter
(
static
final
GoRouter
config
=
GoRouter
(
navigatorKey:
navigatorKey
,
initialLocation:
'/
$splash
'
,
initialLocation:
'/
$splash
'
,
// initialLocation: '/',
// initialLocation: '/',
observers:
[
observer
],
observers:
[
observer
],
...
...
lib/services/http.dart
浏览文件 @
09c92a44
...
@@ -326,6 +326,7 @@ class _RequestInterceptor extends Interceptor {
...
@@ -326,6 +326,7 @@ class _RequestInterceptor extends Interceptor {
final
String
accessToken
=
result
.
data
[
'access_token'
];
final
String
accessToken
=
result
.
data
[
'access_token'
];
if
(
token
.
isEmpty
&&
accessToken
.
isEmpty
){
if
(
token
.
isEmpty
&&
accessToken
.
isEmpty
){
UserStore
.
to
.
logout
();
UserStore
.
to
.
logout
();
// Routes.config.goNamed(Routes.login);
return
null
;
return
null
;
}
}
await
Future
.
wait
([
await
Future
.
wait
([
...
...
lib/services/index.dart
浏览文件 @
09c92a44
...
@@ -12,7 +12,9 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart';
...
@@ -12,7 +12,9 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import
'package:get/get.dart'
hide
Response
,
FormData
,
MultipartFile
;
import
'package:get/get.dart'
hide
Response
,
FormData
,
MultipartFile
;
import
'package:shared_preferences/shared_preferences.dart'
;
import
'package:shared_preferences/shared_preferences.dart'
;
import
'../main.dart'
;
import
'../models/index.dart'
;
import
'../models/index.dart'
;
import
'../routes/index.dart'
;
export
'package:dio/dio.dart'
;
export
'package:dio/dio.dart'
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论