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
4ffa57f5
Commit
4ffa57f5
authored
Jun 22, 2026
by
张宏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
44444444-ui
parent
29eea2f6
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
180 additions
and
84 deletions
+180
-84
Dart_Packages.xml
.idea/libraries/Dart_Packages.xml
+0
-0
Flutter_Plugins.xml
.idea/libraries/Flutter_Plugins.xml
+7
-0
alert_box_bg_2.png
lib/assets/monitoring/alert_box_bg_2.png
+0
-0
box_border.png
lib/assets/monitoring/box_border.png
+0
-0
monitoring_bo.dart
lib/models/bo/monitoring_bo.dart
+21
-5
monitoring_mock_data.dart
lib/repositories/mock/monitoring_mock_data.dart
+14
-5
patient_info_card.dart
lib/views/home/index/widgets/patient_info_card.dart
+4
-4
monitoring_index_view.dart
lib/views/monitoring/index/monitoring_index_view.dart
+4
-4
monitoring_alert_card.dart
...views/monitoring/index/widgets/monitoring_alert_card.dart
+97
-45
monitoring_metric_card.dart
...iews/monitoring/index/widgets/monitoring_metric_card.dart
+26
-14
monitoring_pet_info_card.dart
...ws/monitoring/index/widgets/monitoring_pet_info_card.dart
+0
-0
monitoring_video_card.dart
...views/monitoring/index/widgets/monitoring_video_card.dart
+4
-4
video_player_widget.dart
lib/views/monitoring/index/widgets/video_player_widget.dart
+3
-3
No files found.
.idea/libraries/Dart_Packages.xml
View file @
4ffa57f5
This diff is collapsed.
Click to expand it.
.idea/libraries/Flutter_Plugins.xml
View file @
4ffa57f5
...
...
@@ -31,6 +31,13 @@
<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/flutter_image_compress_macos-1.0.3"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_image_compress-2.4.0"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_image_compress_ohos-0.0.3"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_image_compress_common-1.0.6"
/>
<root
url=
"file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_image_compress_web-0.1.5"
/>
<root
url=
"file://$PROJECT_DIR$/plugins/vsdk"
/>
<root
url=
"file://$PROJECT_DIR$/plugins/flutter_webrtc"
/>
</CLASSES>
<JAVADOC
/>
<SOURCES
/>
...
...
lib/assets/monitoring/alert_box_bg_2.png
View replaced file @
29eea2f6
View file @
4ffa57f5
This diff is collapsed.
Click to expand it.
lib/assets/monitoring/box_border.png
0 → 100644
View file @
4ffa57f5
346 KB
lib/models/bo/monitoring_bo.dart
View file @
4ffa57f5
...
...
@@ -52,8 +52,8 @@ class PatientInfoBO extends Equatable {
/// 患者名称
final
String
name
;
///
家长信息
final
String
owner
;
///
宠物类型(猫/狗等)
final
String
type
;
/// 联系电话
final
String
phone
;
...
...
@@ -67,28 +67,44 @@ class PatientInfoBO extends Equatable {
/// 患者头像地址
final
String
avatarUrl
;
/// 宠物病因
final
String
disease
;
/// 入住时间
final
String
checkInDate
;
/// 护理等级
final
String
careLevel
;
const
PatientInfoBO
({
required
this
.
name
,
required
this
.
owner
,
required
this
.
type
,
required
this
.
phone
,
required
this
.
breed
,
required
this
.
doctor
,
required
this
.
disease
,
required
this
.
checkInDate
,
required
this
.
careLevel
,
this
.
avatarUrl
=
''
,
});
factory
PatientInfoBO
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
return
PatientInfoBO
(
name:
json
[
'name'
]
as
String
?
??
''
,
owner:
json
[
'owner
'
]
as
String
?
??
''
,
type:
json
[
'type
'
]
as
String
?
??
''
,
phone:
json
[
'phone'
]
as
String
?
??
''
,
breed:
json
[
'breed'
]
as
String
?
??
''
,
doctor:
json
[
'doctor'
]
as
String
?
??
''
,
disease:
json
[
'disease'
]
as
String
?
??
''
,
checkInDate:
json
[
'checkInDate'
]
as
String
?
??
''
,
careLevel:
json
[
'careLevel'
]
as
String
?
??
''
,
avatarUrl:
json
[
'avatarUrl'
]
as
String
?
??
''
,
);
}
@override
List
<
Object
?>
get
props
=>
[
name
,
owner
,
phone
,
breed
,
doctor
,
avatarUrl
];
List
<
Object
?>
get
props
=>
[
name
,
type
,
phone
,
breed
,
doctor
,
disease
,
checkInDate
,
careLevel
,
avatarUrl
];
}
/// 用途:首页监护舱告警信息展示数据
...
...
lib/repositories/mock/monitoring_mock_data.dart
View file @
4ffa57f5
...
...
@@ -50,11 +50,14 @@ class MonitoringMockData {
static
PatientInfoBO
getMockPatientInfo
()
{
return
const
PatientInfoBO
(
name:
'妮蔻 Niko'
,
owner:
'家长:王女士'
,
phone:
'联系电话:15845310589'
,
breed:
'品种:长毛三花'
,
doctor:
'医生:程医生'
,
name:
'妮蔻'
,
type:
'猫'
,
phone:
'130-1111-3333'
,
breed:
'长毛三花'
,
doctor:
'张医生'
,
disease:
'胃炎'
,
checkInDate:
'2025-6-15'
,
careLevel:
'特级'
,
avatarUrl:
''
,
);
}
...
...
@@ -67,6 +70,12 @@ class MonitoringMockData {
time:
'2026-05-04 16:22:49'
,
status:
'待处理'
,
),
AlertInfoBO
(
title:
'温度异常'
,
description:
'温度高于阈值26℃,当前温度29℃,请立即检查温度传感器,字…'
,
time:
'2026-05-04 16:22:49'
,
status:
'已处理'
,
),
];
}
...
...
lib/views/home/index/widgets/patient_info_card.dart
View file @
4ffa57f5
...
...
@@ -63,13 +63,13 @@ class PatientInfoCard extends StatelessWidget {
),
),
SizedBox
(
height:
8
.
h
),
_buildInfoText
(
patientInfo
.
owner
),
_buildInfoText
(
'类型:
${patientInfo.type}
'
),
SizedBox
(
height:
4
.
h
),
_buildInfoText
(
patientInfo
.
phone
),
_buildInfoText
(
'电话:
${patientInfo.phone}
'
),
SizedBox
(
height:
4
.
h
),
_buildInfoText
(
patientInfo
.
breed
),
_buildInfoText
(
'品种:
${patientInfo.breed}
'
),
SizedBox
(
height:
4
.
h
),
_buildInfoText
(
patientInfo
.
doctor
),
_buildInfoText
(
'医生:
${patientInfo.doctor}
'
),
],
),
),
...
...
lib/views/monitoring/index/monitoring_index_view.dart
View file @
4ffa57f5
...
...
@@ -95,7 +95,7 @@ class _MonitoringIndexContentState extends State<MonitoringIndexContent> {
Container
(
height:
topHeight
.
clamp
(
80.0
,
104.0
),
decoration:
BoxDecoration
(
border:
BoxBorder
.
all
(
width:
1
.
w
,
color:
Colors
.
red
)
//
border: BoxBorder.all(width: 1.w,color: Colors.red)
),
child:
const
MonitoringTopStatusBar
(),
),
...
...
@@ -103,7 +103,7 @@ class _MonitoringIndexContentState extends State<MonitoringIndexContent> {
child:
Container
(
padding:
EdgeInsets
.
zero
,
decoration:
BoxDecoration
(
border:
BoxBorder
.
all
(
width:
1
.
w
,
color:
Colors
.
red
)
//
border: BoxBorder.all(width: 1.w,color: Colors.red)
),
child:
_buildMainArea
(
state
,
gap
),
),
...
...
@@ -111,7 +111,7 @@ class _MonitoringIndexContentState extends State<MonitoringIndexContent> {
Container
(
height:
bottomHeight
.
clamp
(
92.0
,
134.0
),
decoration:
BoxDecoration
(
border:
BoxBorder
.
all
(
width:
1
.
w
,
color:
Colors
.
red
)
//
border: BoxBorder.all(width: 1.w,color: Colors.red)
),
child:
MonitoringBottomMenu
(
menuItems:
state
.
menuItems
),
),
...
...
@@ -190,7 +190,7 @@ class _MonitoringIndexContentState extends State<MonitoringIndexContent> {
child:
Container
(
padding:
EdgeInsets
.
zero
,
decoration:
BoxDecoration
(
border:
BoxBorder
.
all
(
width:
1
.
w
,
color:
Colors
.
red
)
//
border: BoxBorder.all(width: 1.w,color: Colors.red)
),
// padding: EdgeInsets.only(
// right: metric == displayMetrics.last ? 0 : gap,
...
...
lib/views/monitoring/index/widgets/monitoring_alert_card.dart
View file @
4ffa57f5
...
...
@@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import
'package:flutter_screenutil/flutter_screenutil.dart'
;
import
'package:laki_icu_app/models/bo/monitoring_bo.dart'
;
import
'monitoring_panel.dart'
;
class
MonitoringAlertCard
extends
StatelessWidget
{
final
List
<
AlertInfoBO
>
alerts
;
...
...
@@ -14,44 +12,39 @@ class MonitoringAlertCard extends StatelessWidget {
@override
Widget
build
(
BuildContext
context
)
{
final
hasPending
=
alerts
.
any
((
item
)
=>
item
.
status
.
contains
(
'待处理'
));
return
Container
(
padding:
EdgeInsets
.
zero
,
padding:
EdgeInsets
.
symmetric
(
horizontal:
32
.
w
,
vertical:
20
.
h
)
,
decoration:
BoxDecoration
(
image:
DecorationImage
(
image:
AssetImage
(
'lib/assets/monitoring/alert_box_bg_2.png'
),
image:
AssetImage
(
hasPending
?
'lib/assets/monitoring/alert_box_bg_2.png'
:
'lib/assets/monitoring/alert_box_bg_1.png'
,
),
fit:
BoxFit
.
fill
,
),
border:
Border
.
all
(
color:
Colors
.
red
,
width:
1
.
w
)
),
// backgroundAsset: alerts.any((item) => item.status.contains('待处理'))
// ? 'lib/assets/monitoring/alert_box_bg_2.png'
// : 'lib/assets/monitoring/alert_box_bg_1.png',
// padding: EdgeInsets.symmetric(horizontal: 24.w),
child:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Container
(
width:
double
.
infinity
,
height:
100
.
h
,
decoration:
BoxDecoration
(
border:
Border
.
all
(
color:
Colors
.
red
,
width:
1
.
w
)
Text
(
'告警信息'
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
20
.
sp
,
fontWeight:
FontWeight
.
bold
,
),
),
SizedBox
(
height:
12
.
h
),
Expanded
(
child:
_buildEmpty
()
//
alerts.isEmpty ? _buildEmpty() : _buildList(),
child:
alerts
.
isEmpty
?
_buildEmpty
()
:
_buildList
(),
),
],
),
);
}
Widget
_buildEmpty
()
{
return
Center
(
child:
Text
(
...
...
@@ -63,44 +56,103 @@ class MonitoringAlertCard extends StatelessWidget {
Widget
_buildList
()
{
return
ListView
.
separated
(
padding:
EdgeInsets
.
zero
,
padding:
EdgeInsets
.
symmetric
(
vertical:
6
.
h
)
,
itemCount:
alerts
.
length
,
separatorBuilder:
(
_
,
__
)
=>
SizedBox
(
height:
1
2
.
h
),
separatorBuilder:
(
_
,
__
)
=>
SizedBox
(
height:
1
6
.
h
),
itemBuilder:
(
context
,
index
)
{
final
item
=
alerts
[
index
];
final
pending
=
item
.
status
.
contains
(
'待处理'
);
return
Container
(
height:
170
.
h
,
padding:
EdgeInsets
.
symmetric
(
horizontal:
16
.
w
,
vertical:
14
.
h
),
decoration:
BoxDecoration
(
border:
Border
.
all
(
width:
1
.
w
,
color:
Colors
.
red
)
// color: pending ? const Color(0x24FFB800) : const Color(0x1820E5FF),
// borderRadius: BorderRadius.circular(14.r),
// border: Border.all(
// color:
// pending ? const Color(0x99FFB800) : const Color(0x6639D8FF),
// width: 1,
// ),
),
return
_buildAlertItem
(
item
,
pending
);
},
);
}
Widget
_buildAlertItem
(
AlertInfoBO
item
,
bool
pending
)
{
return
IntrinsicHeight
(
child:
Row
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
_buildIconBlock
(
pending
),
SizedBox
(
width:
20
.
w
),
Expanded
(
child:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
Text
(
item
.
title
,
style:
TextStyle
(
color:
pending
?
const
Color
(
0xFFF26522
)
:
const
Color
(
0xFFFFC14A
),
fontSize:
16
.
sp
,
fontWeight:
FontWeight
.
bold
,
),
),
SizedBox
(
height:
10
.
h
),
Text
(
item
.
description
,
maxLines:
2
,
overflow:
TextOverflow
.
ellipsis
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
20
.
sp
,
fontWeight:
FontWeight
.
bold
fontSize:
12
.
sp
,
),
),
// SizedBox(height: 10.h),
Text
(
item
.
time
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
12
.
sp
,
),
),
],
),
),
],
),
);
},
}
Widget
_buildIconBlock
(
bool
pending
)
{
return
Container
(
width:
100
.
w
,
height:
160
.
h
,
alignment:
Alignment
.
topLeft
,
child:
Stack
(
children:
[
Container
(
// width: 160.w,
// height: 160.h,
decoration:
BoxDecoration
(
color:
const
Color
(
0xFF2A2E3B
),
borderRadius:
BorderRadius
.
only
(
topLeft:
Radius
.
circular
(
18
.
r
),
topRight:
Radius
.
circular
(
18
.
r
),
bottomLeft:
Radius
.
circular
(
18
.
r
),
bottomRight:
Radius
.
circular
(
18
.
r
),
),
),
),
Container
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
16
.
w
,
vertical:
6
.
h
),
decoration:
BoxDecoration
(
color:
pending
?
const
Color
(
0xFFFBB03B
)
:
const
Color
(
0xFF6FA8DC
),
borderRadius:
BorderRadius
.
only
(
topLeft:
Radius
.
circular
(
18
.
r
),
bottomRight:
Radius
.
circular
(
18
.
r
),
),
),
child:
Text
(
pending
?
'待处理'
:
'已处理'
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
12
.
sp
,
// fontWeight: FontWeight.bold,
),
),
),
],
),
);
}
}
lib/views/monitoring/index/widgets/monitoring_metric_card.dart
View file @
4ffa57f5
import
'package:flutter/material.dart'
;
import
'package:flutter_screenutil/flutter_screenutil.dart'
;
import
'package:flutter_switch/flutter_switch.dart'
;
import
'package:laki_icu_app/models/bo/monitoring_bo.dart'
;
import
'monitoring_panel.dart'
;
...
...
@@ -7,9 +8,17 @@ import 'monitoring_panel.dart';
class
MonitoringMetricCard
extends
StatelessWidget
{
final
MonitoringMetricBO
metric
;
/// 开关状态
final
bool
switchValue
;
/// 开关切换回调
final
ValueChanged
<
bool
>?
onSwitchToggle
;
const
MonitoringMetricCard
({
super
.
key
,
required
this
.
metric
,
this
.
switchValue
=
false
,
this
.
onSwitchToggle
,
});
@override
...
...
@@ -32,7 +41,7 @@ class MonitoringMetricCard extends StatelessWidget {
SizedBox
(
width:
20
.
w
),
Expanded
(
flex:
2
,
flex:
3
,
child:
Text
(
displayLabel
,
maxLines:
1
,
...
...
@@ -45,15 +54,18 @@ class MonitoringMetricCard extends StatelessWidget {
),
),
Expanded
(
flex:
1
,
child:
Text
(
"开关"
,
maxLines:
1
,
overflow:
TextOverflow
.
ellipsis
,
style:
TextStyle
(
color:
Colors
.
white
,
fontSize:
19
.
sp
,
fontWeight:
FontWeight
.
w600
,
flex:
2
,
child:
Align
(
alignment:
Alignment
.
topLeft
,
child:
FlutterSwitch
(
width:
30
.
w
,
height:
30
.
h
,
value:
switchValue
,
onToggle:
onSwitchToggle
??
(
_
)
{},
activeColor:
const
Color
(
0xFF75C1DD
),
inactiveColor:
Color
(
0xFF0A1B34
),
toggleSize:
12
.
w
,
padding:
2
.
w
,
),
),
),
...
...
@@ -95,10 +107,10 @@ class MonitoringMetricCard extends StatelessWidget {
width:
100
.
w
,
margin:
EdgeInsets
.
only
(
left:
20
.
w
),
decoration:
BoxDecoration
(
border:
Border
.
all
(
color:
Colors
.
red
,
width:
1
.
w
)
//
border: Border.all(
//
color: Colors.red,
//
width: 1.w
//
)
),
child:
Stack
(
clipBehavior:
Clip
.
none
,
...
...
lib/views/monitoring/index/widgets/monitoring_pet_info_card.dart
View file @
4ffa57f5
This diff is collapsed.
Click to expand it.
lib/views/monitoring/index/widgets/monitoring_video_card.dart
View file @
4ffa57f5
...
...
@@ -11,10 +11,10 @@ class MonitoringVideoCard extends StatelessWidget {
return
Container
(
decoration:
BoxDecoration
(
image:
DecorationImage
(
image:
AssetImage
(
'lib/assets/monitoring/box_bg_674x509.png'
),
fit:
BoxFit
.
fill
),
border:
Border
.
all
(
color:
Colors
.
red
,
width:
1
.
w
)
//
border: Border.all(
//
color: Colors.red,
//
width: 1.w
//
)
),
child:
Stack
(
children:
[
...
...
lib/views/monitoring/index/widgets/video_player_widget.dart
View file @
4ffa57f5
...
...
@@ -66,13 +66,13 @@ class VideoPlayerWidget extends StatelessWidget {
Widget
build
(
BuildContext
context
)
{
return
ClipRRect
(
child:
Container
(
padding:
EdgeInsets
.
only
(
top:
15
.
h
,
bottom:
35
.
h
,
left:
1
8
.
w
,
right:
18
.
w
),
padding:
EdgeInsets
.
only
(
top:
15
.
h
,
bottom:
35
.
h
,
left:
1
0
.
w
,
right:
15
.
w
),
decoration:
BoxDecoration
(
image:
const
DecorationImage
(
image:
AssetImage
(
'lib/assets/monitoring/box_b
g_674x509
.png'
),
image:
AssetImage
(
'lib/assets/monitoring/box_b
order
.png'
),
fit:
BoxFit
.
fill
,
),
border:
Border
.
all
(
color:
Colors
.
red
,
width:
1
),
//
border: Border.all(color: Colors.red, width: 1),
),
child:
Stack
(
fit:
StackFit
.
expand
,
...
...
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