Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
book-app
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
book-app
Commits
883b112b
提交
883b112b
authored
12月 30, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
f3019c68
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
321 行增加
和
303 行删除
+321
-303
settings.json
.vscode/settings.json
+3
-0
common.css
assets/html/assets/css/common.css
+115
-115
github.css
assets/html/assets/css/github.css
+118
-117
Podfile.lock
ios/Podfile.lock
+29
-34
controller.dart
lib/pages/login/controller.dart
+6
-3
vip.dart
lib/pages/user_coin_recharge/vip.dart
+0
-0
user.dart
lib/store/user.dart
+13
-10
assets_picker.dart
lib/utils/assets_picker.dart
+1
-1
console.dart
lib/utils/console.dart
+1
-0
constants.dart
lib/utils/constants.dart
+1
-1
oss.dart
lib/utils/oss.dart
+3
-3
sign.dart
lib/utils/sign.dart
+1
-0
sql.dart
lib/utils/sql.dart
+15
-15
toast_utils.dart
lib/utils/toast_utils.dart
+2
-0
tools.dart
lib/utils/tools.dart
+7
-2
validator.dart
lib/utils/validator.dart
+6
-2
没有找到文件。
.vscode/settings.json
0 → 100644
浏览文件 @
883b112b
{
"dart.flutterSdkPath"
:
"~/flutter"
}
assets/html/assets/css/common.css
浏览文件 @
883b112b
html
,
body
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
p
,
div
,
table
,
tr
,
td
,
tbody
,
tfoot
,
th
,
dl
,
dt
,
dd
,
ol
,
ul
,
li
,
a
,
sub
,
sup
,
strong
,
b
,
em
,
i
,
code
,
pre
,
img
,
section
,
article
,
input
,
textarea
,
span
,
blockquote
{
margin
:
0
;
padding
:
0
;
margin-block
:
0
;
outline
:
none
;
}
*
{
-webkit-touch-callout
:
none
;
}
input
,
textarea
,
span
{
outline
:
none
;
resize
:
none
;
}
a
,
a
:hover
{
text-decoration
:
none
;
border
:
none
;
-webkit-tap-highlight-color
:
rgba
(
0
,
0
,
0
,
0
);
-webkit-tap-highlight-color
:
transparent
;
outline
:
none
;
}
input
[
type
=
radio
],
input
[
type
=
checkbox
]
{
display
:
none
;
}
sub
,
pre
,
code
{
user-select
:
none
;
-webkit-user-select
:
none
;
}
line
{
border-bottom
:
2px
solid
#AB1941
;
font-weight
:
normal
;
cursor
:
pointer
;
}
light
{
font-weight
:
normal
;
cursor
:
pointer
;
}
light
.c-feff00
{
background-color
:
#feff00
;
}
light
.c-feff00
::selection
{
background-color
:
#feff00
;
}
light
.c-00ff00
{
background-color
:
#00ff00
;
}
light
.c-00ff00
::selection
{
background-color
:
#00ff00
;
}
light
.c-00ffff
{
background-color
:
#00ffff
;
}
light
.c-00ffff
::selection
{
background-color
:
#00ffff
;
}
light
.c-ff00ff
{
background-color
:
#ff00ff
;
}
light
.c-ff00ff
::selection
{
background-color
:
#ff00ff
;
}
light
.c-d2b3fa
{
background-color
:
#d2b3fa
;
}
light
.c-d2b3fa
::selection
{
background-color
:
#d2b3fa
;
}
light
.c-ff4500
{
background-color
:
#ff4500
;
}
light
.c-ff4500
::selection
{
background-color
:
#ff4500
;
}
html
,
body
,
h1
,
h2
,
h3
,
h4
,
h5
,
h6
,
p
,
div
,
table
,
tr
,
td
,
tbody
,
tfoot
,
th
,
dl
,
dt
,
dd
,
ol
,
ul
,
li
,
a
,
sub
,
sup
,
strong
,
b
,
em
,
i
,
code
,
pre
,
img
,
section
,
article
,
input
,
textarea
,
span
,
blockquote
{
margin
:
0
;
padding
:
0
;
margin-block
:
0
;
outline
:
none
;
}
*
{
-webkit-touch-callout
:
none
;
}
input
,
textarea
,
span
{
outline
:
none
;
resize
:
none
;
}
a
,
a
:hover
{
text-decoration
:
none
;
border
:
none
;
-webkit-tap-highlight-color
:
rgba
(
0
,
0
,
0
,
0
);
-webkit-tap-highlight-color
:
transparent
;
outline
:
none
;
}
input
[
type
=
radio
],
input
[
type
=
checkbox
]
{
display
:
none
;
}
sub
,
pre
,
code
{
user-select
:
none
;
-webkit-user-select
:
none
;
}
line
{
border-bottom
:
2px
solid
#AB1941
;
font-weight
:
normal
;
cursor
:
pointer
;
}
light
{
font-weight
:
normal
;
cursor
:
pointer
;
}
light
.c-feff00
{
background-color
:
#feff00
;
}
light
.c-feff00
::selection
{
background-color
:
#feff00
;
}
light
.c-00ff00
{
background-color
:
#00ff00
;
}
light
.c-00ff00
::selection
{
background-color
:
#00ff00
;
}
light
.c-00ffff
{
background-color
:
#00ffff
;
}
light
.c-00ffff
::selection
{
background-color
:
#00ffff
;
}
light
.c-ff00ff
{
background-color
:
#ff00ff
;
}
light
.c-ff00ff
::selection
{
background-color
:
#ff00ff
;
}
light
.c-d2b3fa
{
background-color
:
#d2b3fa
;
}
light
.c-d2b3fa
::selection
{
background-color
:
#d2b3fa
;
}
light
.c-ff4500
{
background-color
:
#ff4500
;
}
light
.c-ff4500
::selection
{
background-color
:
#ff4500
;
}
assets/html/assets/css/github.css
浏览文件 @
883b112b
pre
code
.hljs
{
display
:
block
;
overflow-x
:
auto
;
padding
:
1em
}
code
.hljs
{
padding
:
3px
5px
}
/*!
Theme: GitHub
Description: Light theme as seen on github.com
Author: github.com
Maintainer: @Hirse
Updated: 2021-05-15
Outdated base version: https://github.com/primer/github-syntax-light
Current colors taken from GitHub's CSS
*/
.hljs
{
color
:
#24292e
;
background
:
#ffffff
}
.hljs-doctag
,
.hljs-keyword
,
.hljs-meta
.hljs-keyword
,
.hljs-template-tag
,
.hljs-template-variable
,
.hljs-type
,
.hljs-variable.language_
{
/* prettylights-syntax-keyword */
color
:
#d73a49
}
.hljs-title
,
.hljs-title.class_
,
.hljs-title.class_.inherited__
,
.hljs-title.function_
{
/* prettylights-syntax-entity */
color
:
#6f42c1
}
.hljs-attr
,
.hljs-attribute
,
.hljs-literal
,
.hljs-meta
,
.hljs-number
,
.hljs-operator
,
.hljs-variable
,
.hljs-selector-attr
,
.hljs-selector-class
,
.hljs-selector-id
{
/* prettylights-syntax-constant */
color
:
#005cc5
}
.hljs-regexp
,
.hljs-string
,
.hljs-meta
.hljs-string
{
/* prettylights-syntax-string */
color
:
#032f62
}
.hljs-built_in
,
.hljs-symbol
{
/* prettylights-syntax-variable */
color
:
#e36209
}
.hljs-comment
,
.hljs-code
,
.hljs-formula
{
/* prettylights-syntax-comment */
color
:
#6a737d
}
.hljs-name
,
.hljs-quote
,
.hljs-selector-tag
,
.hljs-selector-pseudo
{
/* prettylights-syntax-entity-tag */
color
:
#22863a
}
.hljs-subst
{
/* prettylights-syntax-storage-modifier-import */
color
:
#24292e
}
.hljs-section
{
/* prettylights-syntax-markup-heading */
color
:
#005cc5
;
font-weight
:
bold
}
.hljs-bullet
{
/* prettylights-syntax-markup-list */
color
:
#735c0f
}
.hljs-emphasis
{
/* prettylights-syntax-markup-italic */
color
:
#24292e
;
font-style
:
italic
}
.hljs-strong
{
/* prettylights-syntax-markup-bold */
color
:
#24292e
;
font-weight
:
bold
}
.hljs-addition
{
/* prettylights-syntax-markup-inserted */
color
:
#22863a
;
background-color
:
#f0fff4
}
.hljs-deletion
{
/* prettylights-syntax-markup-deleted */
color
:
#b31d28
;
background-color
:
#ffeef0
}
.hljs-char.escape_
,
.hljs-link
,
.hljs-params
,
.hljs-property
,
.hljs-punctuation
,
.hljs-tag
{
/* purposely ignored */
pre
code
.hljs
{
display
:
block
;
overflow-x
:
auto
;
padding
:
1em
}
code
.hljs
{
padding
:
3px
5px
}
/*!
Theme: GitHub
Description: Light theme as seen on github.com
Author: github.com
Maintainer: @Hirse
Updated: 2021-05-15
Outdated base version: https://github.com/primer/github-syntax-light
Current colors taken from GitHub's CSS
*/
.hljs
{
color
:
#24292e
;
background
:
#ffffff
}
.hljs-doctag
,
.hljs-keyword
,
.hljs-meta
.hljs-keyword
,
.hljs-template-tag
,
.hljs-template-variable
,
.hljs-type
,
.hljs-variable.language_
{
/* prettylights-syntax-keyword */
color
:
#d73a49
}
.hljs-title
,
.hljs-title.class_
,
.hljs-title.class_.inherited__
,
.hljs-title.function_
{
/* prettylights-syntax-entity */
color
:
#6f42c1
}
.hljs-attr
,
.hljs-attribute
,
.hljs-literal
,
.hljs-meta
,
.hljs-number
,
.hljs-operator
,
.hljs-variable
,
.hljs-selector-attr
,
.hljs-selector-class
,
.hljs-selector-id
{
/* prettylights-syntax-constant */
color
:
#005cc5
}
.hljs-regexp
,
.hljs-string
,
.hljs-meta
.hljs-string
{
/* prettylights-syntax-string */
color
:
#032f62
}
.hljs-built_in
,
.hljs-symbol
{
/* prettylights-syntax-variable */
color
:
#e36209
}
.hljs-comment
,
.hljs-code
,
.hljs-formula
{
/* prettylights-syntax-comment */
color
:
#6a737d
}
.hljs-name
,
.hljs-quote
,
.hljs-selector-tag
,
.hljs-selector-pseudo
{
/* prettylights-syntax-entity-tag */
color
:
#22863a
}
.hljs-subst
{
/* prettylights-syntax-storage-modifier-import */
color
:
#24292e
}
.hljs-section
{
/* prettylights-syntax-markup-heading */
color
:
#005cc5
;
font-weight
:
bold
}
.hljs-bullet
{
/* prettylights-syntax-markup-list */
color
:
#735c0f
}
.hljs-emphasis
{
/* prettylights-syntax-markup-italic */
color
:
#24292e
;
font-style
:
italic
}
.hljs-strong
{
/* prettylights-syntax-markup-bold */
color
:
#24292e
;
font-weight
:
bold
}
.hljs-addition
{
/* prettylights-syntax-markup-inserted */
color
:
#22863a
;
background-color
:
#f0fff4
}
.hljs-deletion
{
/* prettylights-syntax-markup-deleted */
color
:
#b31d28
;
background-color
:
#ffeef0
}
.hljs-char.escape_
,
.hljs-link
,
.hljs-params
,
.hljs-property
,
.hljs-punctuation
,
.hljs-tag
{
/* purposely ignored */
}
\ No newline at end of file
ios/Podfile.lock
浏览文件 @
883b112b
PODS:
- audio_session (0.0.1):
- Flutter
- Bugly (2.6.1)
- connectivity_plus (0.0.1):
- Flutter
- ReachabilitySwift
...
...
@@ -9,6 +10,9 @@ PODS:
- Flutter (1.0.0)
- flutter_app_update (0.0.1):
- Flutter
- flutter_bugly (0.0.1):
- Bugly
- Flutter
- flutter_inapp_purchase (0.0.1):
- Flutter
- flutter_inappwebview_ios (0.0.1):
...
...
@@ -47,13 +51,6 @@ PODS:
- Flutter
- ScreenProtectorKit (~> 1.3.1)
- ScreenProtectorKit (1.3.1)
- Sentry/HybridSDK (8.21.0):
- SentryPrivate (= 8.21.0)
- sentry_flutter (7.19.0):
- Flutter
- FlutterMacOS
- Sentry/HybridSDK (= 8.21.0)
- SentryPrivate (8.21.0)
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
...
...
@@ -73,6 +70,7 @@ DEPENDENCIES:
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- Flutter (from `Flutter`)
- flutter_app_update (from `.symlinks/plugins/flutter_app_update/ios`)
- flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
- flutter_inapp_purchase (from `.symlinks/plugins/flutter_inapp_purchase/ios`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- flutter_sound (from `.symlinks/plugins/flutter_sound/ios`)
...
...
@@ -84,19 +82,17 @@ DEPENDENCIES:
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- screen_protector (from `.symlinks/plugins/screen_protector/ios`)
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
- tobias (from `.symlinks/plugins/tobias/ios`)
SPEC REPOS:
trunk:
- Bugly
- flutter_sound_core
- OrderedSet
- ReachabilitySwift
- ScreenProtectorKit
- Sentry
- SentryPrivate
- WechatOpenSDK-XCFramework
EXTERNAL SOURCES:
...
...
@@ -110,6 +106,8 @@ EXTERNAL SOURCES:
:path: Flutter
flutter_app_update:
:path: ".symlinks/plugins/flutter_app_update/ios"
flutter_bugly:
:path: ".symlinks/plugins/flutter_bugly/ios"
flutter_inapp_purchase:
:path: ".symlinks/plugins/flutter_inapp_purchase/ios"
flutter_inappwebview_ios:
...
...
@@ -132,8 +130,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/permission_handler_apple/ios"
screen_protector:
:path: ".symlinks/plugins/screen_protector/ios"
sentry_flutter:
:path: ".symlinks/plugins/sentry_flutter/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite:
...
...
@@ -142,34 +138,33 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/tobias/ios"
SPEC CHECKSUMS:
audio_session: 4f3e461722055d21515cf3261b64c973c062f345
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
audio_session: 9bdd3bf46960d4322cb8c3cb6138295dcfe84eee
Bugly: 217ac2ce5f0f2626d43dbaa4f70764c953a26a31
connectivity_plus: 481668c94744c30c53b8895afb39159d1e619bdf
device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_app_update: 65f61da626cb111d1b24674abc4b01728d7723bc
flutter_inapp_purchase: 5c6a1ac3f11b11d0c8c0321c0c41c1f05805e4c8
flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0
flutter_sound: c60effa2a350fb977885f0db2fbc4c1ad5160900
flutter_app_update: 816fdb2e30e4832a7c45e3f108d391c42ef040a9
flutter_bugly: 12197049262a692eab0bd2834d465a5647d920c2
flutter_inapp_purchase: 722da12971a50f306f37e62fc1aaf576b1cbecf6
flutter_inappwebview_ios: 25b61a1b550d1068e4ddaf490fc1d03c2ce6828d
flutter_sound: 49be32081884d275fe91d48262f4b1fcd86e10d3
flutter_sound_core: 26c10e5832e76aaacfae252d8925232281c486ae
flutter_tts:
0f492aab6accf87059b72354fcb4ba934304771d
fluwx:
3c7b6df42f83d444d4538f3eaeae079f12d30c37
image_picker_ios:
99dfe1854b4fa34d0364e74a78448a0151025425
just_audio:
baa7252489dbcf47a4c7cc9ca663e9661c99aafa
flutter_tts:
b88dbc8655d3dc961bc4a796e4e16a4cc1795833
fluwx:
70e62e0330c46b988a1c79ce9731f0d4bc4b26fb
image_picker_ios:
85f2b3c9fb98c09d63725c4d12ebd585b56ec35d
just_audio:
6c031bb61297cf218b4462be616638e81c058e97
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
package_info_plus:
115f4ad11e0698c8c1c5d8a689390df880f47e85
path_provider_foundation:
3784922295ac71e43754bd15e0653ccfd36a147c
permission_handler_apple:
e76247795d700c14ea09e3a2d8855d41ee80a2e6
package_info_plus:
566e1b7a2f3900e4b0020914ad3fc051dcc95596
path_provider_foundation:
608fcb11be570ce83519b076ab6a1fffe2474f05
permission_handler_apple:
3787117e48f80715ff04a3830ca039283d6a4f29
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
screen_protector:
6f92086bd2f2f4b54f54913289b9d1310610140b
screen_protector:
3d90d44ac886b25335aebd93230b454aef45794a
ScreenProtectorKit: 83a6281b02c7a5902ee6eac4f5045f674e902ae4
Sentry: ebc12276bd17613a114ab359074096b6b3725203
sentry_flutter: 88ebea3f595b0bc16acc5bedacafe6d60c12dcd5
SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
tobias: 22f69183b14af82a2ac8ff698af084c352744e5f
shared_preferences_foundation: 0b09b969fb36da5551c0bc4a2dbd9d0ff9387478
sqflite: c35dad70033b8862124f8337cc994a809fcd9fa3
tobias: 50b529c2501d277c83fef9976803a001eb58a057
WechatOpenSDK-XCFramework: acdeeda129efbef9532bca8a10c24e1b4b8c7d69
PODFILE CHECKSUM: 293dca100fbb3eb6a866f640cf85127844630abc
COCOAPODS: 1.1
1
.2
COCOAPODS: 1.1
6
.2
lib/pages/login/controller.dart
浏览文件 @
883b112b
...
...
@@ -37,8 +37,10 @@ class LoginController extends GetxController {
/// 测试账号
if
(
kDebugMode
)
{
phoneInput
.
text
=
'18810760819'
;
passwordInput
.
text
=
'1234567m'
;
phoneInput
.
text
=
'13811534871'
;
passwordInput
.
text
=
'wpf123456*'
;
// phoneInput.text = '18810760819';
// passwordInput.text = '1234567m';
// phoneInput.text = '17311837355';
// passwordInput.text = '12345678';
}
...
...
@@ -128,7 +130,8 @@ class LoginController extends GetxController {
}
final
result
=
await
AccountAPI
.
login
(
phone:
phoneInput
.
text
,
password:
EncryptUtil
.
encodeMd5
(
EncryptUtil
.
encodeMd5
(
passwordInput
.
text
)),
password:
EncryptUtil
.
encodeMd5
(
EncryptUtil
.
encodeMd5
(
passwordInput
.
text
)),
code:
codeInput
.
text
,
type:
type
);
...
...
lib/pages/user_coin_recharge/vip.dart
0 → 100644
浏览文件 @
883b112b
差异被折叠。
点击展开。
lib/store/user.dart
浏览文件 @
883b112b
...
...
@@ -6,21 +6,21 @@ class UserStore extends GetxController {
// 是否登录
bool
_isLogin
=
false
;
// token
String
_token
=
''
;
// 获取token
String
get
token
=>
_token
;
// 刷新token
String
_accessToken
=
''
;
// 获取刷新token
String
get
accessToken
=>
_accessToken
;
// 是否登录
bool
get
isLogin
=>
_isLogin
;
// 是否有token
bool
get
hasToken
=>
_token
.
isNotEmpty
;
// 用户信息模型
UserModel
_info
=
UserModel
();
// 获取用户信息模型
UserModel
get
info
=>
_info
;
// 是否需要登录
...
...
@@ -34,6 +34,7 @@ class UserStore extends GetxController {
_token
=
StorageService
.
to
.
getString
(
kLocalToken
);
}
/// 登录
Future
<
void
>
login
(
UserModel
value
)
async
{
_token
=
value
.
token
??
''
;
_accessToken
=
value
.
accessToken
??
''
;
...
...
@@ -48,16 +49,18 @@ class UserStore extends GetxController {
update
();
}
/// 设置token
Future
<
void
>
setToken
(
String
value
)
async
{
await
StorageService
.
to
.
setString
(
kLocalToken
,
value
);
_token
=
value
;
}
/// 设置刷新token
Future
<
void
>
setAccessToken
(
String
value
)
async
{
await
StorageService
.
to
.
setString
(
kLocalAccessToken
,
value
);
_accessToken
=
value
;
}
/// 设置用户信息
Future
<
void
>
setInfo
(
UserModel
value
)
async
{
await
StorageService
.
to
.
setString
(
kLocalUserInfo
,
jsonEncode
(
value
.
toJson
()));
...
...
@@ -65,7 +68,7 @@ class UserStore extends GetxController {
_info
=
value
;
}
// 登出
//
/
登出
Future
<
void
>
logout
()
async
{
await
StorageService
.
to
.
remove
(
kLocalToken
);
await
StorageService
.
to
.
remove
(
kLocalAccessToken
);
...
...
lib/utils/assets_picker.dart
浏览文件 @
883b112b
...
...
@@ -50,7 +50,7 @@ abstract class AssetsPicker {
// maxHeight: maxHeight,
);
}
/// 展示设置弹窗
static
_showSettingDialog
(
BuildContext
context
,
String
content
)
{
showDialog
(
context:
context
,
...
...
lib/utils/console.dart
浏览文件 @
883b112b
part of
utils
;
/// 打印类
abstract
class
Console
{
static
final
_log
=
Logger
(
filter:
_LogFilter
());
...
...
lib/utils/constants.dart
浏览文件 @
883b112b
...
...
@@ -3,7 +3,7 @@ part of utils;
// 服务器地址
// const String kServerUrl = 'http://192.168.11.88:81';
// const String kServerUrl = 'http://8.141.148.247:7421';
const
String
kServerUrl
=
'http
://1507.superge.cn:81
'
;
const
String
kServerUrl
=
'http
s://ebook-app.ezijing.com
'
;
const
String
kHtmlBaseServer
=
'http://150.158.138.40:9200'
;
const
String
kLocalToken
=
'local_token'
;
const
String
kLocalAccessToken
=
'local_access_token'
;
...
...
lib/utils/oss.dart
浏览文件 @
883b112b
...
...
@@ -15,7 +15,7 @@ class OssTool {
Client
.
init
(
ossEndpoint:
'oss-cn-beijing.aliyuncs.com'
,
bucketName:
bucketName
,
authGetter:
_authGetter
);
}
// 获取临时凭证
//
/
获取临时凭证
Future
<
Auth
>
_authGetter
()
async
{
final
result
=
await
CommonAPI
.
oss
();
return
Auth
(
...
...
@@ -26,7 +26,7 @@ class OssTool {
);
}
// 本地文件上传
//
/
本地文件上传
Future
<
Response
<
dynamic
>>
putObjectFile
(
String
filePath
)
async
{
List
<
String
>
parts
=
filePath
.
split
(
'/'
);
String
fileName
=
parts
.
last
;
...
...
@@ -38,7 +38,7 @@ class OssTool {
return
resp
;
}
// 批量本地文件上传
//
/
批量本地文件上传
Future
<
List
<
Response
>>
putObjectFiles
(
List
<
String
>
filePaths
){
return
Client
().
putObjectFiles
(
filePaths
.
map
((
e
){
...
...
lib/utils/sign.dart
浏览文件 @
883b112b
part of
utils
;
class
SignTool
{
/// 创建签名
static
String
createSign
(
Map
<
String
,
dynamic
>
params
)
{
Map
<
String
,
dynamic
>
tempParams
=
keySort
(
params
);
List
<
String
>
tempArr
=
[];
...
...
lib/utils/sql.dart
浏览文件 @
883b112b
...
...
@@ -58,13 +58,13 @@ class SqlManager {
return
_database
;
}
// 关闭数据库
//
/
关闭数据库
static
Future
<
void
>
closeDatabase
()
async
{
await
_database
?.
close
();
}
// 查询划线高亮笔记
//
/
查询划线高亮笔记
static
Future
<
Map
<
String
,
dynamic
>>
queryLocalNote
({
required
int
bookId
,
required
int
chapterId
})
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
...
...
@@ -89,7 +89,7 @@ class SqlManager {
return
returnMap
;
}
// 添加划线高亮笔记
//
/
添加划线高亮笔记
static
Future
<
int
>
addLocalNote
(
Map
<
String
,
dynamic
>
data
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
final
result
=
await
db
?.
insert
(
...
...
@@ -100,7 +100,7 @@ class SqlManager {
return
result
??
0
;
}
// 删除划线高亮笔记
//
/
删除划线高亮笔记
static
Future
<
int
>
delLocalNote
({
required
int
noteId
,
required
int
id
})
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
if
(
noteId
==
0
){
...
...
@@ -124,7 +124,7 @@ class SqlManager {
}
// 修改划线高亮笔记
//
/
修改划线高亮笔记
static
Future
<
int
>
updateLocalNote
({
required
int
notesId
,
required
int
id
,
required
Map
<
String
,
dynamic
>
data
})
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
if
(
notesId
==
0
){
...
...
@@ -148,7 +148,7 @@ class SqlManager {
}
// 查询所有没有上传的数据
//
/
查询所有没有上传的数据
static
Future
<
List
<
Map
<
String
,
dynamic
>>>
queryNoUploadData
()
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
List
<
Map
<
String
,
dynamic
>>?
results
=
await
db
?.
query
(
...
...
@@ -164,7 +164,7 @@ class SqlManager {
return
results
??[];
}
// 将所有 upload 为 0 的数据的 upload 字段值更新为 1
//
/
将所有 upload 为 0 的数据的 upload 字段值更新为 1
static
Future
<
void
>
updateUploadStatus
()
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
final
result
=
await
db
?.
update
(
...
...
@@ -175,7 +175,7 @@ class SqlManager {
);
Console
.
log
(
'Sql---------------更新数据----------------
$result
'
);
}
// 将上传成功的id数据的notes_id 更新为服务器对应数值 并设置upload 为1
//
/
将上传成功的id数据的notes_id 更新为服务器对应数值 并设置upload 为1
static
Future
<
void
>
updateNotesId
(
List
<
Map
<
String
,
dynamic
>>
data
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
// 构建批量更新的SQL语句
...
...
@@ -205,7 +205,7 @@ class SqlManager {
db
?.
delete
(
kNoteTable
);
db
?.
delete
(
kReadTable
);
}
// 根据 book_id 查询当前读到的 章节
//
/
根据 book_id 查询当前读到的 章节
static
Future
<
String
>
queryReadHistoryByBookId
(
int
bookId
)
async
{
try
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
...
...
@@ -226,7 +226,7 @@ class SqlManager {
}
// 根据 book_id 写入当前读到的 章节
//
/
根据 book_id 写入当前读到的 章节
static
Future
<
int
>
updateReadHistoryByBookId
(
int
bookId
,
int
chapterId
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
...
...
@@ -256,7 +256,7 @@ class SqlManager {
// 插入数据
//
/
插入数据
static
Future
<
bool
>
insertData
(
Map
<
String
,
dynamic
>
data
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
final
result
=
await
db
?.
insert
(
...
...
@@ -271,13 +271,13 @@ class SqlManager {
}
// 查询所有数据
//
/
查询所有数据
static
Future
<
List
<
Map
<
String
,
dynamic
>>?>
queryAllData
()
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
return
await
db
?.
query
(
'members_book_notes'
);
}
// 根据 ID 查询数据
//
/
根据 ID 查询数据
static
Future
<
Map
<
String
,
dynamic
>?>
queryDataById
(
int
id
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
List
<
Map
<
String
,
dynamic
>>?
results
=
await
db
?.
query
(
...
...
@@ -288,7 +288,7 @@ class SqlManager {
return
results
?.
first
??{};
}
// 更新数据
//
/
更新数据
static
Future
<
void
>
updateData
(
int
id
,
Map
<
String
,
dynamic
>
newData
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
await
db
?.
update
(
...
...
@@ -299,7 +299,7 @@ class SqlManager {
);
}
// 删除数据
//
/
删除数据
static
Future
<
void
>
deleteData
(
int
id
)
async
{
Database
?
db
=
await
SqlManager
.
getCurrentDatabase
();
await
db
?.
delete
(
...
...
lib/utils/toast_utils.dart
浏览文件 @
883b112b
...
...
@@ -2,6 +2,7 @@ part of utils;
/// Toast工具类
class
Toast
{
/// 展示toast
static
void
show
(
String
msg
,
{
int
duration
=
2000
})
{
if
(
msg
==
null
)
{
return
;
...
...
@@ -13,6 +14,7 @@ class Toast {
);
}
/// 取消toast
static
void
cancelToast
()
{
dismissAllToast
();
}
...
...
lib/utils/tools.dart
浏览文件 @
883b112b
...
...
@@ -2,10 +2,12 @@ part of utils;
abstract
class
Tools
{
/// 取消焦点
static
void
unfocus
()
{
WidgetsBinding
.
instance
.
focusManager
.
primaryFocus
?.
unfocus
();
}
/// 格式化日期
static
String
dateFromMS
(
int
timestamp
,
{
String
pattern
=
'yyyy-MM-dd'
,
...
...
@@ -29,6 +31,7 @@ abstract class Tools {
return
DateFormat
(
pattern
).
format
(
dateTime
);
}
/// 格式化时间
static
String
formatDuration
(
Duration
duration
)
{
String
twoDigits
(
int
n
)
=>
n
.
toString
().
padLeft
(
2
,
'0'
);
String
twoDigitMinutes
=
twoDigits
(
duration
.
inMinutes
.
remainder
(
60
));
...
...
@@ -36,26 +39,28 @@ abstract class Tools {
return
"
${duration.inHours}
:
$twoDigitMinutes
:
$twoDigitSeconds
"
;
}
/// 获取存储目录
static
Future
<
String
>
getDirectory
()
async
{
// getTemporaryDirectory
final
directory
=
await
getTemporaryDirectory
();
return
directory
!.
path
;
}
// 语音文件名称
//
/
语音文件名称
static
String
generateVoiceFileName
(){
DateTime
now
=
DateTime
.
now
();
String
formattedDate
=
DateFormat
(
'yyyyMMddHHmmss'
).
format
(
now
);
return
'voice_
$formattedDate
.mp4'
;
}
/// 清理数据
static
Future
<
void
>
clearData
()
async
{
await
SqlManager
.
clear
();
ClearCache
().
clearApplicationCache
();
Console
.
log
(
'-------------清除数据-------------------'
);
}
// 判断当前网络状态
//
/
判断当前网络状态
static
Future
<
bool
>
checkCurrentNetStatus
()
async
{
final
connectivityResult
=
await
(
Connectivity
().
checkConnectivity
());
if
(
connectivityResult
==
ConnectivityResult
.
none
){
...
...
lib/utils/validator.dart
浏览文件 @
883b112b
...
...
@@ -29,6 +29,7 @@ class RequiredValidator extends Validator<String?> {
bool
isValid
(
String
?
value
)
=>
(
value
??
''
).
isNotEmpty
;
}
/// 邮箱验证
class
EmailValidator
extends
Validator
<
String
?>
{
final
Pattern
_pattern
=
r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'
;
...
...
@@ -42,6 +43,7 @@ class EmailValidator extends Validator<String?> {
}
}
/// 密码验证
class
PasswordValidator
extends
Validator
<
String
?>
{
final
Pattern
_pattern
=
r'(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$'
;
...
...
@@ -55,6 +57,7 @@ class PasswordValidator extends Validator<String?> {
}
}
/// 是否一致
class
EqualValidator
extends
Validator
<
String
?>
{
final
TextEditingController
input
;
...
...
@@ -83,19 +86,20 @@ class AmountValidator extends Validator<String?> {
class
ValidatorTool
{
// 验证手机号
//
/
验证手机号
static
bool
isValidPhoneNumber
(
String
value
)
{
RegExp
phonePattern
=
RegExp
(
r'^1[3-9]\d{9}$'
);
return
phonePattern
.
hasMatch
(
value
);
}
// 密码
//
/
密码
static
bool
isValidPassword
(
String
value
)
{
RegExp
passwordPattern
=
RegExp
(
r'^((?=.*\d)(?=.*[A-Z])(?=.*[a-z]))|((?=.*\d)(?=.*[A-Z])(?=.*[\W_]))|((?=.*\d)(?=.*[a-z])(?=.*[\W_]))|((?=.*[A-Z])(?=.*[a-z])(?=.*[\W_]))[a-zA-Z\d\W_]{8,12}$'
);
// 密码必须是数字、字母、特殊符号三种及以上8-12位的组合
return
passwordPattern
.
hasMatch
(
value
);
}
/// 验证码位数
static
bool
isValidCode
(
String
value
)
{
RegExp
passwordPattern
=
RegExp
(
r'^\d{6}$'
);
return
passwordPattern
.
hasMatch
(
value
);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论