Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
laki_icu_app
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张宏
laki_icu_app
Commits
35fee5c6
Commit
35fee5c6
authored
Jun 18, 2026
by
张宏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
111
parent
cf1809a5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
259 additions
and
133 deletions
+259
-133
.flutter-plugins-dependencies
.flutter-plugins-dependencies
+0
-0
.gitignore
.gitignore
+1
-0
Dart_Packages.xml
.idea/libraries/Dart_Packages.xml
+0
-0
Flutter_Plugins.xml
.idea/libraries/Flutter_Plugins.xml
+7
-6
dev.json
env/dev.json
+1
-1
test.json
env/test.json
+1
-1
auth_bloc.dart
lib/blocs/auth/auth_bloc.dart
+12
-4
auth_event.dart
lib/blocs/auth/auth_event.dart
+5
-5
auth_state.dart
lib/blocs/auth/auth_state.dart
+2
-2
login_model.dart
lib/models/bo/login_model.dart
+25
-0
user_model.dart
lib/models/bo/user_model.dart
+66
-0
auth_repository.dart
lib/repositories/auth_repository.dart
+17
-16
auth_mock_data.dart
lib/repositories/mock/auth_mock_data.dart
+15
-22
auth_service.dart
lib/services/auth_service.dart
+17
-15
storage_service.dart
lib/utils/storage/storage_service.dart
+41
-26
home_index_view.dart
lib/views/home/index/home_index_view.dart
+7
-5
login_cubit.dart
lib/views/login/cubit/login_cubit.dart
+9
-9
login_state.dart
lib/views/login/cubit/login_state.dart
+10
-10
login_view.dart
lib/views/login/login_view.dart
+11
-11
generated_plugin_registrant.cc
linux/flutter/generated_plugin_registrant.cc
+4
-0
generated_plugins.cmake
linux/flutter/generated_plugins.cmake
+1
-0
GeneratedPluginRegistrant.swift
macos/Flutter/GeneratedPluginRegistrant.swift
+2
-0
pubspec.yaml
pubspec.yaml
+1
-0
generated_plugin_registrant.cc
windows/flutter/generated_plugin_registrant.cc
+3
-0
generated_plugins.cmake
windows/flutter/generated_plugins.cmake
+1
-0
No files found.
.flutter-plugins-dependencies
View file @
35fee5c6
This diff is collapsed.
Click to expand it.
.gitignore
View file @
35fee5c6
...
...
@@ -5,6 +5,7 @@
# claude code
.claude/
.trae/
.idea/
.dart_tool/
build/
...
...
.idea/libraries/Dart_Packages.xml
View file @
35fee5c6
This diff is collapsed.
Click to expand it.
.idea/libraries/Flutter_Plugins.xml
View file @
35fee5c6
...
...
@@ -2,7 +2,9 @@
<library
name=
"Flutter Plugins"
type=
"FlutterPluginsLibraryType"
>
<CLASSES>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_usbcamera-0.0.1"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/fluttertoast-9.0.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/share_plus-12.0.2"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1"
/>
...
...
@@ -14,22 +16,21 @@
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher-6.3.2"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_ios-6.4.1"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.1.5"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.1.6"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler-11.4.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/vibration-3.1.8"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.23"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/jni-1.0.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/share_plus-12.0.2"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler-11.4.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/vibration-3.2.0"
/>
</CLASSES>
<JAVADOC
/>
<SOURCES
/>
...
...
env/dev.json
View file @
35fee5c6
{
"APP_ENV"
:
"dev"
,
"SERVICE_URL"
:
"http://121.41.
57.178:9090
"
"SERVICE_URL"
:
"http://121.41.
173.189/laki-merchant-service
"
}
env/test.json
View file @
35fee5c6
{
"APP_ENV"
:
"test"
,
"SERVICE_URL"
:
"http://
localhost:8080
"
"SERVICE_URL"
:
"http://
121.41.173.189/laki-merchant-service
"
}
lib/blocs/auth/auth_bloc.dart
View file @
35fee5c6
...
...
@@ -27,11 +27,17 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
emit
(
AuthLoading
());
try
{
await
_authService
.
login
(
event
.
username
,
event
.
password
);
// 新接口在登录响应中直接返回用户信息
final
loginModel
=
await
_authService
.
login
(
event
.
phone
,
event
.
smsCode
);
// 登录成功后获取用户信息
final
userInfo
=
await
_authService
.
getUserInfo
();
emit
(
AuthSuccess
(
userInfo
));
if
(
loginModel
.
user
!=
null
)
{
emit
(
AuthSuccess
(
loginModel
.
user
!));
}
else
{
// 如果登录响应中没有用户信息,则单独请求
final
userInfo
=
await
_authService
.
getUserInfo
();
emit
(
AuthSuccess
(
userInfo
));
}
}
catch
(
e
)
{
emit
(
AuthFailure
(
e
.
toString
()));
}
...
...
@@ -45,6 +51,7 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
if
(
state
is
AuthTokenExpired
||
state
is
AuthLoggedOut
)
return
;
await
_storageService
.
deleteToken
();
await
_storageService
.
deleteRefreshToken
();
await
_storageService
.
deleteUserInfo
();
await
_storageService
.
deleteClientId
();
emit
(
const
AuthTokenExpired
());
...
...
@@ -60,6 +67,7 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
// 即使接口调用失败也继续执行本地登出
}
await
_storageService
.
deleteToken
();
await
_storageService
.
deleteRefreshToken
();
await
_storageService
.
deleteUserInfo
();
await
_storageService
.
deleteClientId
();
emit
(
const
AuthLoggedOut
());
...
...
lib/blocs/auth/auth_event.dart
View file @
35fee5c6
...
...
@@ -8,16 +8,16 @@ abstract class AuthEvent extends Equatable {
}
class
AuthLoginRequested
extends
AuthEvent
{
final
String
usernam
e
;
final
String
password
;
final
String
phon
e
;
final
String
smsCode
;
const
AuthLoginRequested
({
required
this
.
usernam
e
,
required
this
.
password
,
required
this
.
phon
e
,
required
this
.
smsCode
,
});
@override
List
<
Object
?>
get
props
=>
[
username
,
password
];
List
<
Object
?>
get
props
=>
[
phone
,
smsCode
];
}
class
AuthTokenExpiredEvent
extends
AuthEvent
{
...
...
lib/blocs/auth/auth_state.dart
View file @
35fee5c6
import
'package:equatable/equatable.dart'
;
import
'package:laki_icu_app/models/bo/user_
info_bo
.dart'
;
import
'package:laki_icu_app/models/bo/user_
model
.dart'
;
abstract
class
AuthState
extends
Equatable
{
const
AuthState
();
...
...
@@ -13,7 +13,7 @@ class AuthInitial extends AuthState {}
class
AuthLoading
extends
AuthState
{}
class
AuthSuccess
extends
AuthState
{
final
User
InfoBO
userInfo
;
final
User
Model
userInfo
;
const
AuthSuccess
(
this
.
userInfo
);
...
...
lib/models/bo/login_model.dart
0 → 100644
View file @
35fee5c6
import
'package:equatable/equatable.dart'
;
import
'user_model.dart'
;
class
LoginModel
extends
Equatable
{
final
String
?
accessToken
;
final
String
?
refreshToken
;
final
UserModel
?
user
;
const
LoginModel
({
this
.
accessToken
,
this
.
refreshToken
,
this
.
user
,
});
factory
LoginModel
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
return
LoginModel
(
accessToken:
json
[
'accessToken'
]
as
String
?,
refreshToken:
json
[
'refreshToken'
]
as
String
?,
user:
UserModel
.
fromJson
(
json
),
);
}
@override
List
<
Object
?>
get
props
=>
[
accessToken
,
refreshToken
,
user
];
}
lib/models/bo/user_model.dart
0 → 100644
View file @
35fee5c6
import
'package:equatable/equatable.dart'
;
class
UserModel
extends
Equatable
{
final
int
id
;
final
String
?
nickname
;
final
String
?
phone
;
final
String
?
avatar
;
final
int
?
type
;
final
dynamic
canControlDevice
;
final
dynamic
canViewOperation
;
final
dynamic
hospitalId
;
final
String
?
hospitalName
;
const
UserModel
({
required
this
.
id
,
this
.
nickname
,
this
.
phone
,
this
.
avatar
,
this
.
type
,
this
.
canControlDevice
,
this
.
canViewOperation
,
this
.
hospitalId
,
this
.
hospitalName
,
});
factory
UserModel
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
return
UserModel
(
id:
json
[
'id'
]
as
int
?
??
0
,
nickname:
json
[
'nickname'
]
as
String
?,
phone:
json
[
'phone'
]
as
String
?,
avatar:
json
[
'avatar'
]
as
String
?,
type:
json
[
'type'
]
as
int
?,
canControlDevice:
json
[
'canControlDevice'
],
canViewOperation:
json
[
'canViewOperation'
],
hospitalId:
json
[
'hospitalId'
],
hospitalName:
json
[
'hospitalName'
]
as
String
?,
);
}
Map
<
String
,
dynamic
>
toJson
()
{
return
{
'id'
:
id
,
'nickname'
:
nickname
,
'phone'
:
phone
,
'avatar'
:
avatar
,
'type'
:
type
,
'canControlDevice'
:
canControlDevice
,
'canViewOperation'
:
canViewOperation
,
'hospitalId'
:
hospitalId
,
'hospitalName'
:
hospitalName
,
};
}
@override
List
<
Object
?>
get
props
=>
[
id
,
nickname
,
phone
,
avatar
,
type
,
canControlDevice
,
canViewOperation
,
hospitalId
,
hospitalName
,
];
}
lib/repositories/auth_repository.dart
View file @
35fee5c6
import
'../utils/constants.dart'
;
import
'../utils/http/response_model.dart'
;
import
'../utils/http/dio_request.dart'
;
import
'../models/bo/login_
bo
.dart'
;
import
'../models/bo/user_
info_bo
.dart'
;
import
'../models/bo/login_
model
.dart'
;
import
'../models/bo/user_
model
.dart'
;
import
'mock/auth_mock_data.dart'
;
class
AuthRepository
{
Future
<
ResponseModel
<
LoginBO
>>
login
(
Map
<
String
,
dynamic
>
params
)
{
Future
<
ResponseModel
<
LoginModel
>>
login
(
String
phone
,
String
smsCode
)
{
if
(
Constants
.
useMockData
)
{
return
_mockLogin
();
}
return
DioRequest
.
instance
.
post
<
Login
BO
>(
'/
app/auth/login/password
'
,
data:
params
,
fromJsonT:
(
data
)
=>
Login
BO
.
fromJson
(
data
as
Map
<
String
,
dynamic
>),
return
DioRequest
.
instance
.
post
<
Login
Model
>(
'/
merchant/account/sms-login
'
,
data:
{
'phone'
:
phone
,
'smsCode'
:
smsCode
}
,
fromJsonT:
(
data
)
=>
Login
Model
.
fromJson
(
data
as
Map
<
String
,
dynamic
>),
);
}
Future
<
ResponseModel
<
User
InfoBO
>>
getUserInfo
()
{
Future
<
ResponseModel
<
User
Model
>>
getUserInfo
()
{
if
(
Constants
.
useMockData
)
{
return
_mockGetUserInfo
();
}
return
DioRequest
.
instance
.
get
<
User
InfoBO
>(
return
DioRequest
.
instance
.
get
<
User
Model
>(
'/app/auth/user-info'
,
fromJsonT:
(
data
)
=>
User
InfoBO
.
fromJson
(
data
as
Map
<
String
,
dynamic
>),
fromJsonT:
(
data
)
=>
User
Model
.
fromJson
(
data
as
Map
<
String
,
dynamic
>),
);
}
...
...
@@ -36,26 +37,26 @@ class AuthRepository {
// ==================== Mock 实现 ====================
Future
<
ResponseModel
<
Login
BO
>>
_mockLogin
()
async
{
Future
<
ResponseModel
<
Login
Model
>>
_mockLogin
()
async
{
// 模拟网络延迟,便于测试 loading 状态
await
Future
.
delayed
(
const
Duration
(
milliseconds:
500
));
final
login
BO
=
AuthMockData
.
mockLogin
();
return
ResponseModel
<
Login
BO
>(
final
login
Model
=
AuthMockData
.
mockLogin
();
return
ResponseModel
<
Login
Model
>(
code:
200
,
msg:
'登录成功(mock)'
,
data:
login
BO
,
data:
login
Model
,
uuid:
'mock_uuid_
${DateTime.now().millisecondsSinceEpoch}
'
,
success:
true
,
timestamp:
DateTime
.
now
().
millisecondsSinceEpoch
,
);
}
Future
<
ResponseModel
<
User
InfoBO
>>
_mockGetUserInfo
()
async
{
Future
<
ResponseModel
<
User
Model
>>
_mockGetUserInfo
()
async
{
await
Future
.
delayed
(
const
Duration
(
milliseconds:
300
));
final
userInfo
=
AuthMockData
.
mockUserInfo
();
return
ResponseModel
<
User
InfoBO
>(
return
ResponseModel
<
User
Model
>(
code:
200
,
msg:
'获取用户信息成功(mock)'
,
data:
userInfo
,
...
...
lib/repositories/mock/auth_mock_data.dart
View file @
35fee5c6
import
'../../models/bo/login_
bo
.dart'
;
import
'../../models/bo/user_
info_bo
.dart'
;
import
'../../models/bo/login_
model
.dart'
;
import
'../../models/bo/user_
model
.dart'
;
/// Auth 模块本地 mock 数据。
///
...
...
@@ -9,31 +9,24 @@ import '../../models/bo/user_info_bo.dart';
class
AuthMockData
{
AuthMockData
.
_
();
/// Mock 登录响应 - 直接构造 LoginBO 实例
static
LoginBO
mockLogin
()
{
return
const
LoginBO
(
scope:
'server'
,
openid:
'mock_openid_abc123'
,
/// Mock 登录响应 - 直接构造 LoginModel 实例
static
LoginModel
mockLogin
()
{
return
LoginModel
(
accessToken:
'mock_access_token_eyJhbGciOiJIUzI1NiJ9'
,
refreshToken:
'mock_refresh_token_xyz789'
,
expireIn:
86400
,
refreshExpireIn:
604800
,
clientId:
'mock_client_id_001'
,
user:
mockUserInfo
(),
);
}
/// Mock 用户信息响应 - 直接构造 UserInfoBO 实例
static
UserInfoBO
mockUserInfo
()
{
return
const
UserInfoBO
(
userId:
10001
,
userName:
'admin'
,
nickName:
'管理员'
,
phonenumber:
'13800138000'
,
email:
'admin@laki-icu.com'
,
sex:
'1'
,
avatarUrl:
'https://qialg.com/avatar/default.png'
,
deptName:
'技术部'
,
tenantId:
'tenant_001'
,
/// Mock 用户信息响应 - 直接构造 UserModel 实例
static
UserModel
mockUserInfo
()
{
return
const
UserModel
(
id:
1
,
nickname:
'张老师'
,
phone:
'138****0001'
,
avatar:
'https://qi-ai.oss-cn-hangzhou.aliyuncs.com/upload/2026/05/30/0f79ec34-ae2e-462b-a80e-2e8d46ebc145.jpg'
,
type:
1
,
);
}
}
lib/services/auth_service.dart
View file @
35fee5c6
import
'../models/bo/login_
bo
.dart'
;
import
'../models/bo/user_
info_bo
.dart'
;
import
'../models/bo/login_
model
.dart'
;
import
'../models/bo/user_
model
.dart'
;
import
'../repositories/auth_repository.dart'
;
import
'../utils/constants.dart'
;
import
'../utils/storage/storage_service.dart'
;
...
...
@@ -14,29 +14,31 @@ class AuthService {
})
:
_authRepository
=
authRepository
,
_storageService
=
storageService
;
Future
<
LoginBO
>
login
(
String
username
,
String
password
)
async
{
final
result
=
await
_authRepository
.
login
({
'username'
:
username
,
'password'
:
password
,
});
Future
<
LoginModel
>
login
(
String
phone
,
String
smsCode
)
async
{
final
result
=
await
_authRepository
.
login
(
phone
,
smsCode
);
if
(
result
.
success
&&
result
.
data
!=
null
)
{
final
loginBO
=
result
.
data
!;
if
(
loginBO
.
accessToken
!=
null
&&
loginBO
.
accessToken
!.
isNotEmpty
)
{
final
loginModel
=
result
.
data
!;
if
(
loginModel
.
accessToken
!=
null
&&
loginModel
.
accessToken
!.
isNotEmpty
)
{
await
_storageService
.
saveToken
(
login
BO
.
accessToken
!,
login
Model
.
accessToken
!,
expiryHours:
Constants
.
tokenExpiryHours
,
);
}
if
(
loginBO
.
clientId
!=
null
&&
loginBO
.
clientId
!.
isNotEmpty
)
{
await
_storageService
.
saveClientId
(
loginBO
.
clientId
!);
if
(
loginModel
.
refreshToken
!=
null
&&
loginModel
.
refreshToken
!.
isNotEmpty
)
{
await
_storageService
.
saveRefreshToken
(
loginModel
.
refreshToken
!);
}
return
loginBO
;
if
(
loginModel
.
user
!=
null
)
{
await
_storageService
.
saveUserInfo
(
loginModel
.
user
!);
}
return
loginModel
;
}
throw
Exception
(
result
.
msg
);
}
Future
<
User
InfoBO
>
getUserInfo
()
async
{
Future
<
User
Model
>
getUserInfo
()
async
{
final
result
=
await
_authRepository
.
getUserInfo
();
if
(
result
.
success
&&
result
.
data
!=
null
)
{
final
userInfo
=
result
.
data
!;
...
...
@@ -46,7 +48,7 @@ class AuthService {
throw
Exception
(
result
.
msg
);
}
Future
<
User
InfoBO
?>
getStoredUserInfo
()
async
{
Future
<
User
Model
?>
getStoredUserInfo
()
async
{
return
_storageService
.
getUserInfo
();
}
...
...
lib/utils/storage/storage_service.dart
View file @
35fee5c6
import
'package:flutter_secure_storage/flutter_secure_storage.dart'
;
import
'package:laki_icu_app/models/bo/user_
info_bo
.dart'
;
import
'package:laki_icu_app/models/bo/user_
model
.dart'
;
class
StorageService
{
static
const
String
_keyToken
=
'auth_token'
;
static
const
String
_keyTokenExpiry
=
'auth_token_expiry'
;
static
const
String
_keyRememberUsername
=
'remember_username'
;
static
const
String
_keyRememberPassword
=
'remember_password'
;
static
const
String
_keyRefreshToken
=
'auth_refresh_token'
;
static
const
String
_keyRememberPhone
=
'remember_phone'
;
static
const
String
_keyRememberSmsCode
=
'remember_sms_code'
;
static
const
String
_keyRememberEnabled
=
'remember_enabled'
;
static
const
String
_keyUserInfo
=
'user_info'
;
static
const
String
_keyClientId
=
'client_id'
;
...
...
@@ -51,29 +52,43 @@ class StorageService {
return
token
!=
null
&&
token
.
isNotEmpty
;
}
// ==================== RefreshToken 相关 ====================
Future
<
void
>
saveRefreshToken
(
String
refreshToken
)
async
{
await
_storage
.
write
(
key:
_keyRefreshToken
,
value:
refreshToken
);
}
Future
<
String
?>
getRefreshToken
()
async
{
return
await
_storage
.
read
(
key:
_keyRefreshToken
);
}
Future
<
void
>
deleteRefreshToken
()
async
{
await
_storage
.
delete
(
key:
_keyRefreshToken
);
}
// ==================== 用户信息相关 ====================
Future
<
void
>
saveUserInfo
(
User
InfoBO
userInfo
)
async
{
Future
<
void
>
saveUserInfo
(
User
Model
userInfo
)
async
{
final
jsonStr
=
'
${userInfo.
userId}
|
${userInfo.userName}
|
${userInfo.nickName}
|
${userInfo.phonenumber}
|
${userInfo.email}
|
${userInfo.sex}
|
${userInfo.avatarUrl}
|
${userInfo.deptName}
|
${userInfo.tenantId
}
'
;
'
${userInfo.
id}
|
${userInfo.nickname ?? ''}
|
${userInfo.phone ?? ''}
|
${userInfo.avatar ?? ''}
|
${userInfo.type ?? ''}
|
${userInfo.canControlDevice ?? ''}
|
${userInfo.canViewOperation ?? ''}
|
${userInfo.hospitalId ?? ''}
|
${userInfo.hospitalName ?? ''
}
'
;
await
_storage
.
write
(
key:
_keyUserInfo
,
value:
jsonStr
);
}
Future
<
User
InfoBO
?>
getUserInfo
()
async
{
Future
<
User
Model
?>
getUserInfo
()
async
{
final
value
=
await
_storage
.
read
(
key:
_keyUserInfo
);
if
(
value
==
null
||
value
.
isEmpty
)
return
null
;
final
parts
=
value
.
split
(
'|'
);
if
(
parts
.
length
<
9
)
return
null
;
return
User
InfoBO
(
userI
d:
int
.
tryParse
(
parts
[
0
])
??
0
,
userName
:
parts
[
1
],
nickName
:
parts
[
2
],
phonenumber
:
parts
[
3
],
email:
parts
[
4
]
,
sex
:
parts
[
5
],
avatarUrl
:
parts
[
6
],
deptName
:
parts
[
7
],
tenantId
:
parts
[
8
],
return
User
Model
(
i
d:
int
.
tryParse
(
parts
[
0
])
??
0
,
nickname:
parts
[
1
].
isEmpty
?
null
:
parts
[
1
],
phone:
parts
[
2
].
isEmpty
?
null
:
parts
[
2
],
avatar:
parts
[
3
].
isEmpty
?
null
:
parts
[
3
],
type:
parts
[
4
].
isEmpty
?
null
:
int
.
tryParse
(
parts
[
4
])
,
canControlDevice:
parts
[
5
].
isEmpty
?
null
:
parts
[
5
],
canViewOperation:
parts
[
6
].
isEmpty
?
null
:
parts
[
6
],
hospitalId:
parts
[
7
].
isEmpty
?
null
:
parts
[
7
],
hospitalName:
parts
[
8
].
isEmpty
?
null
:
parts
[
8
],
);
}
...
...
@@ -98,27 +113,27 @@ class StorageService {
// ==================== 记住密码相关 ====================
Future
<
void
>
saveRememberCredentials
({
required
String
usernam
e
,
required
String
password
,
required
String
phon
e
,
required
String
smsCode
,
})
async
{
await
_storage
.
write
(
key:
_keyRemember
Username
,
value:
usernam
e
);
await
_storage
.
write
(
key:
_keyRemember
Password
,
value:
password
);
await
_storage
.
write
(
key:
_keyRemember
Phone
,
value:
phon
e
);
await
_storage
.
write
(
key:
_keyRemember
SmsCode
,
value:
smsCode
);
await
_storage
.
write
(
key:
_keyRememberEnabled
,
value:
'true'
);
}
Future
<
Map
<
String
,
String
?>>
getRememberCredentials
()
async
{
final
enabled
=
await
_storage
.
read
(
key:
_keyRememberEnabled
);
if
(
enabled
!=
'true'
)
{
return
{
'
username'
:
null
,
'password
'
:
null
};
return
{
'
phone'
:
null
,
'smsCode
'
:
null
};
}
final
username
=
await
_storage
.
read
(
key:
_keyRememberUsernam
e
);
final
password
=
await
_storage
.
read
(
key:
_keyRememberPassword
);
return
{
'
username'
:
username
,
'password'
:
password
};
final
phone
=
await
_storage
.
read
(
key:
_keyRememberPhon
e
);
final
smsCode
=
await
_storage
.
read
(
key:
_keyRememberSmsCode
);
return
{
'
phone'
:
phone
,
'smsCode'
:
smsCode
};
}
Future
<
void
>
clearRememberCredentials
()
async
{
await
_storage
.
delete
(
key:
_keyRemember
Usernam
e
);
await
_storage
.
delete
(
key:
_keyRemember
Password
);
await
_storage
.
delete
(
key:
_keyRemember
Phon
e
);
await
_storage
.
delete
(
key:
_keyRemember
SmsCode
);
await
_storage
.
delete
(
key:
_keyRememberEnabled
);
}
...
...
lib/views/home/index/home_index_view.dart
View file @
35fee5c6
...
...
@@ -175,11 +175,13 @@ class _HomeIndexContentState extends State<HomeIndexContent> {
// 监控画面模块(2/3宽度、100%高度)
Expanded
(
flex:
2
,
child:
MonitoringScreen
(
onRefresh:
()
=>
_homeIndexCubit
.
refreshData
(),
onSnapshot:
()
{},
onRecord:
()
{},
),
child:
Text
(
"1234"
)
// MonitoringScreen(
// onRefresh: () => _homeIndexCubit.refreshData(),
// onSnapshot: () {},
// onRecord: () {},
// ),
),
SizedBox
(
width:
24
.
w
),
// 右侧(1/3宽度):患者信息卡片 + 告警信息卡片
...
...
lib/views/login/cubit/login_cubit.dart
View file @
35fee5c6
...
...
@@ -38,33 +38,33 @@ class LoginCubit extends Cubit<LoginState> {
}
void
login
({
required
String
usernam
e
,
required
String
password
,
required
String
phon
e
,
required
String
smsCode
,
bool
rememberPassword
=
false
,
})
{
if
(
rememberPassword
)
{
storageService
.
saveRememberCredentials
(
username:
usernam
e
,
password:
password
,
phone:
phon
e
,
smsCode:
smsCode
,
);
}
else
{
storageService
.
clearRememberCredentials
();
}
authBloc
.
add
(
AuthLoginRequested
(
username:
usernam
e
,
password:
password
,
phone:
phon
e
,
smsCode:
smsCode
,
));
}
Future
<
void
>
loadRememberCredentials
()
async
{
final
credentials
=
await
storageService
.
getRememberCredentials
();
if
(
isClosed
)
return
;
if
(
credentials
[
'
usernam
e'
]
!=
null
)
{
if
(
credentials
[
'
phon
e'
]
!=
null
)
{
emit
(
state
.
copyWith
(
rememberPassword:
true
,
saved
Username:
credentials
[
'usernam
e'
],
saved
Password:
credentials
[
'password
'
],
saved
Phone:
credentials
[
'phon
e'
],
saved
SmsCode:
credentials
[
'smsCode
'
],
));
}
}
...
...
lib/views/login/cubit/login_state.dart
View file @
35fee5c6
...
...
@@ -4,30 +4,30 @@ class LoginState extends Equatable {
final
bool
rememberPassword
;
final
bool
isLoading
;
final
String
?
error
;
final
String
?
saved
Usernam
e
;
final
String
?
saved
Password
;
final
String
?
saved
Phon
e
;
final
String
?
saved
SmsCode
;
const
LoginState
({
this
.
rememberPassword
=
false
,
this
.
isLoading
=
false
,
this
.
error
,
this
.
saved
Usernam
e
,
this
.
saved
Password
,
this
.
saved
Phon
e
,
this
.
saved
SmsCode
,
});
LoginState
copyWith
({
bool
?
rememberPassword
,
bool
?
isLoading
,
String
?
error
,
String
?
saved
Usernam
e
,
String
?
saved
Password
,
String
?
saved
Phon
e
,
String
?
saved
SmsCode
,
})
{
return
LoginState
(
rememberPassword:
rememberPassword
??
this
.
rememberPassword
,
isLoading:
isLoading
??
this
.
isLoading
,
error:
error
,
saved
Username:
savedUsername
??
this
.
savedUsernam
e
,
saved
Password:
savedPassword
??
this
.
savedPassword
,
saved
Phone:
savedPhone
??
this
.
savedPhon
e
,
saved
SmsCode:
savedSmsCode
??
this
.
savedSmsCode
,
);
}
...
...
@@ -36,7 +36,7 @@ class LoginState extends Equatable {
rememberPassword
,
isLoading
,
error
,
saved
Usernam
e
,
saved
Password
,
saved
Phon
e
,
saved
SmsCode
,
];
}
lib/views/login/login_view.dart
View file @
35fee5c6
...
...
@@ -19,8 +19,8 @@ class LoginView extends StatelessWidget {
LoginView
({
super
.
key
});
final
_frmGlobalKey
=
GlobalKey
<
FormState
>();
final
_txt
UserNam
eController
=
TextEditingController
();
final
_txt
Pwd
Controller
=
TextEditingController
();
final
_txt
Phon
eController
=
TextEditingController
();
final
_txt
SmsCode
Controller
=
TextEditingController
();
@override
Widget
build
(
BuildContext
context
)
{
...
...
@@ -64,11 +64,11 @@ class LoginView extends StatelessWidget {
builder:
(
context
,
state
)
{
final
cubit
=
context
.
read
<
LoginCubit
>();
if
(
state
.
saved
Usernam
e
!=
null
)
{
_txt
UserNameController
.
text
=
state
.
savedUsernam
e
!;
if
(
state
.
saved
Phon
e
!=
null
)
{
_txt
PhoneController
.
text
=
state
.
savedPhon
e
!;
}
if
(
state
.
saved
Password
!=
null
)
{
_txt
PwdController
.
text
=
state
.
savedPassword
!;
if
(
state
.
saved
SmsCode
!=
null
)
{
_txt
SmsCodeController
.
text
=
state
.
savedSmsCode
!;
}
return
Column
(
...
...
@@ -126,11 +126,11 @@ class LoginView extends StatelessWidget {
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
UsernameField
(
controller:
_txt
UserNam
eController
,
controller:
_txt
Phon
eController
,
),
SizedBox
(
height:
20
.
h
),
PasswordField
(
controller:
_txt
Pwd
Controller
,
controller:
_txt
SmsCode
Controller
,
),
SizedBox
(
height:
30
.
h
),
RememberPasswordRow
(
...
...
@@ -162,10 +162,10 @@ class LoginView extends StatelessWidget {
if
(
_frmGlobalKey
.
currentState
!
.
validate
())
{
cubit
.
login
(
username:
_txtUserNam
eController
.
text
phone:
_txtPhon
eController
.
text
.
trim
(),
password
:
_txt
Pwd
Controller
.
text
.
trim
(),
smsCode
:
_txt
SmsCode
Controller
.
text
.
trim
(),
rememberPassword:
state
.
rememberPassword
,
);
...
...
linux/flutter/generated_plugin_registrant.cc
View file @
35fee5c6
...
...
@@ -7,12 +7,16 @@
#include "generated_plugin_registrant.h"
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void
fl_register_plugins
(
FlPluginRegistry
*
registry
)
{
g_autoptr
(
FlPluginRegistrar
)
flutter_secure_storage_linux_registrar
=
fl_plugin_registry_get_registrar_for_plugin
(
registry
,
"FlutterSecureStorageLinuxPlugin"
);
flutter_secure_storage_linux_plugin_register_with_registrar
(
flutter_secure_storage_linux_registrar
);
g_autoptr
(
FlPluginRegistrar
)
flutter_webrtc_registrar
=
fl_plugin_registry_get_registrar_for_plugin
(
registry
,
"FlutterWebRTCPlugin"
);
flutter_web_r_t_c_plugin_register_with_registrar
(
flutter_webrtc_registrar
);
g_autoptr
(
FlPluginRegistrar
)
url_launcher_linux_registrar
=
fl_plugin_registry_get_registrar_for_plugin
(
registry
,
"UrlLauncherPlugin"
);
url_launcher_plugin_register_with_registrar
(
url_launcher_linux_registrar
);
...
...
linux/flutter/generated_plugins.cmake
View file @
35fee5c6
...
...
@@ -4,6 +4,7 @@
list
(
APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_linux
flutter_webrtc
url_launcher_linux
)
...
...
macos/Flutter/GeneratedPluginRegistrant.swift
View file @
35fee5c6
...
...
@@ -7,6 +7,7 @@ import Foundation
import
device_info_plus
import
flutter_secure_storage_macos
import
flutter_webrtc
import
share_plus
import
shared_preferences_foundation
import
url_launcher_macos
...
...
@@ -14,6 +15,7 @@ import url_launcher_macos
func
RegisterGeneratedPlugins
(
registry
:
FlutterPluginRegistry
)
{
DeviceInfoPlusMacosPlugin
.
register
(
with
:
registry
.
registrar
(
forPlugin
:
"DeviceInfoPlusMacosPlugin"
))
FlutterSecureStoragePlugin
.
register
(
with
:
registry
.
registrar
(
forPlugin
:
"FlutterSecureStoragePlugin"
))
FlutterWebRTCPlugin
.
register
(
with
:
registry
.
registrar
(
forPlugin
:
"FlutterWebRTCPlugin"
))
SharePlusMacosPlugin
.
register
(
with
:
registry
.
registrar
(
forPlugin
:
"SharePlusMacosPlugin"
))
SharedPreferencesPlugin
.
register
(
with
:
registry
.
registrar
(
forPlugin
:
"SharedPreferencesPlugin"
))
UrlLauncherPlugin
.
register
(
with
:
registry
.
registrar
(
forPlugin
:
"UrlLauncherPlugin"
))
...
...
pubspec.yaml
View file @
35fee5c6
...
...
@@ -52,6 +52,7 @@ dependencies:
permission_handler
:
^11.3.1
flutter_usbcamera
:
^0.0.1
path_provider
:
^2.1.2
flutter_webrtc
:
1.4.1
# flutter_usbcamera: ^0.0.1
# fl_chart: ^0.71.0
# fl_chart: ^1.1.0
...
...
windows/flutter/generated_plugin_registrant.cc
View file @
35fee5c6
...
...
@@ -7,6 +7,7 @@
#include "generated_plugin_registrant.h"
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <share_plus/share_plus_windows_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h>
...
...
@@ -14,6 +15,8 @@
void
RegisterPlugins
(
flutter
::
PluginRegistry
*
registry
)
{
FlutterSecureStorageWindowsPluginRegisterWithRegistrar
(
registry
->
GetRegistrarForPlugin
(
"FlutterSecureStorageWindowsPlugin"
));
FlutterWebRTCPluginRegisterWithRegistrar
(
registry
->
GetRegistrarForPlugin
(
"FlutterWebRTCPlugin"
));
PermissionHandlerWindowsPluginRegisterWithRegistrar
(
registry
->
GetRegistrarForPlugin
(
"PermissionHandlerWindowsPlugin"
));
SharePlusWindowsPluginCApiRegisterWithRegistrar
(
...
...
windows/flutter/generated_plugins.cmake
View file @
35fee5c6
...
...
@@ -4,6 +4,7 @@
list
(
APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_windows
flutter_webrtc
permission_handler_windows
share_plus
url_launcher_windows
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment