From d94a0c8a6c8adaf6706e3c2f485d109f33a653c9 Mon Sep 17 00:00:00 2001 From: wyf <494641114@qq.com> Date: Sat, 21 Jun 2025 08:49:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=BE=E5=A4=87=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/device_bind/device_calibration.dart | 3 + .../controller/mht_bluetooth_controller.dart | 4 + .../device/model/BlueToothDataModel.dart | 2 +- lib/pages/mh_page/test/WebviewTestModel.dart | 110 +++ .../mh_page/user/page/register_page.dart | 698 +++++++++--------- pubspec.yaml | 14 +- 6 files changed, 465 insertions(+), 366 deletions(-) create mode 100644 lib/pages/mh_page/test/WebviewTestModel.dart diff --git a/lib/pages/device_bind/device_calibration.dart b/lib/pages/device_bind/device_calibration.dart index 39c5b34..38d0f37 100644 --- a/lib/pages/device_bind/device_calibration.dart +++ b/lib/pages/device_bind/device_calibration.dart @@ -980,6 +980,9 @@ class _CalibrationPageState extends State { if (deviceCalibrationController.process.value == 1) { if (deviceCalibrationController.inBedTips.value == 0) { + //todo 更改提示文字 + //校准人员已在床 绿色 + //校准人员未在床 红色 return Text( "请校准人员保持在床状态".tr, style: TextStyle( diff --git a/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart b/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart index c014eaa..f674ef5 100644 --- a/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart +++ b/lib/pages/mh_page/device/controller/mht_bluetooth_controller.dart @@ -218,6 +218,10 @@ class MHTBlueToothController extends GetControllerEx { "macA": bleDevice.macA, if (bleDevice.macB != null && bleDevice.macB!.isNotEmpty) "macB": bleDevice.macB, + if (bleDevice.name!=null && bleDevice.name!.isNotEmpty) + 'param':{ + 'name':bleDevice.name, + }, }; var response = diff --git a/lib/pages/mh_page/device/model/BlueToothDataModel.dart b/lib/pages/mh_page/device/model/BlueToothDataModel.dart index 27802e4..b23d194 100644 --- a/lib/pages/mh_page/device/model/BlueToothDataModel.dart +++ b/lib/pages/mh_page/device/model/BlueToothDataModel.dart @@ -1,7 +1,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; class BlueToothDataModel { - String name; + String name;//设备型号 bool bind; String mac; ScanResult scanResult; diff --git a/lib/pages/mh_page/test/WebviewTestModel.dart b/lib/pages/mh_page/test/WebviewTestModel.dart new file mode 100644 index 0000000..4ec7de6 --- /dev/null +++ b/lib/pages/mh_page/test/WebviewTestModel.dart @@ -0,0 +1,110 @@ +import 'package:easyweb/easyweb.dart'; +import 'package:ef/ef.dart'; +import 'package:flutter/material.dart'; +import 'package:easyweb/base/minisdk.dart'; +import 'package:easydevice/easydevice.dart'; + +class WebviewTestModel { + WebviewTestModel(); + + //EasyFlutter Start[Model] + + //EasyFlutter End +} + +class WebviewTestController extends GetControllerEx { + WebviewTestController() : super(WebviewTestModel()) { + web = WebviewHelper( + jsbridge: buildsdk( + father: this, + clientId: '494641114', + //dbgserverUrl: 'ws://192.168.1.2:9001', + ), + settings: buildsettings(), + params: PlatformHeadlessInAppWebViewCreationParams( + initialUrlRequest: URLRequest( + url: WebUri('https://wsl.it.real.he-info.cn:94/webdemo/index.html'), + ), + onLoadStop: (controller, url) => {setState(() => ready.value = true)}, + ), + ); + try { + web.jsbridge!.bind((bridge) { + Minibleapp(bridge: bridge); + }); + web + //.file( + // url: 'https://wsl.it.real.he-info.cn:94/webdemo/web.zip', + // pretag: 'https://wsl.it.real.he-info.cn:94/webdemo/', + //) + .network() + .then((value) { + if (value) { + //资源准备完成.. + setState(() { + ready.value = true; + }); + } + }); + } catch (e, s) { + ef.log('$e,$s'); + } + } + late WebviewHelper web; + var ready = false.obs; + var cnt = 0.obs; + //EasyFlutter End +} + +class WebviewTestView extends GetComponent { + WebviewTestView({super.key, super.oncreate}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black12, + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Align( + alignment: Alignment.topLeft, + child: Padding( + padding: EdgeInsets.all(8), + child: SizedBox( + height: 30, + child: TextButton( + onPressed: () { + setState(() => controller.cnt.value++); + // Get.to( + // () => TestInkWellView( + // oncreate: (x) => TestInkWellController(), + // ), + // ); + }, + child: Text('转跳'), + ), + ), + ), + ), + Expanded( + child: Align( + alignment: Alignment.topLeft, + child: + controller.ready.value + ? ((controller.cnt.value % 2 == 0) + ? controller.web.build( + key: ValueKey("A"), + headless: false, + ) + : controller.web.build( + key: ValueKey("B"), + headless: false, + )) + : Container(), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/mh_page/user/page/register_page.dart b/lib/pages/mh_page/user/page/register_page.dart index 220ab5a..507dfb2 100644 --- a/lib/pages/mh_page/user/page/register_page.dart +++ b/lib/pages/mh_page/user/page/register_page.dart @@ -27,17 +27,15 @@ class RegisterPage extends GetView { bodysize = cc; return GestureDetector( - // onTap: () => FocusScope.of(context).unfocus(), child: Container( decoration: const BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/new_background.png'), // 本地图片 - fit: BoxFit.fill, // 填满整个 Container + image: AssetImage('assets/images/new_background.png'), + fit: BoxFit.fill, ), ), child: Scaffold( backgroundColor: Colors.transparent, - // key: scaffoldKey, appBar: AppBar( backgroundColor: Colors.transparent, automaticallyImplyLeading: false, @@ -49,7 +47,6 @@ class RegisterPage extends GetView { child: Stack( alignment: Alignment.center, children: [ - // 中间居中的标题 Text( '用户注册', textAlign: TextAlign.center, @@ -58,7 +55,6 @@ class RegisterPage extends GetView { fontSize: 30.rpx, ), ), - // 左侧图标 Positioned( left: 20.rpx, child: returnIconButtomNew, @@ -77,9 +73,6 @@ class RegisterPage extends GetView { child: Column( mainAxisSize: MainAxisSize.max, children: [ - // TitleComponentWidget( - // titleName: '用户注册', - // ), Expanded( child: Padding( padding: EdgeInsetsDirectional.fromSTEB( @@ -92,367 +85,356 @@ class RegisterPage extends GetView { height: bodysize!.maxHeight * 1, child: Column( mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 184.rpx, 0, 0), - child: Container( - width: bodysize!.maxWidth, - height: 92.rpx, - decoration: BoxDecoration(), + children: [ + Align( + alignment: AlignmentDirectional(-1, 0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 184.rpx, 0, 0), child: Container( - width: bodysize!.maxWidth, + width: double.infinity, height: bodysize!.maxHeight * 0.06, decoration: BoxDecoration( color: Color(0xFFF3F5F6), borderRadius: BorderRadius.circular(12), ), - child: Align( - alignment: AlignmentDirectional(0, 0), - child: TextFormField( - // autofocus: true, - // focusNode: _focusNode1, - onChanged: (value) { - controller.model.register_phone = - value; - }, - obscureText: false, - decoration: InputDecoration( - labelStyle: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - hintText: '请输入手机号'.tr, - hintStyle: TextStyle( - fontFamily: 'Readex Pro', - color: Color(0xFF929699), - fontSize: 26.rpx, - letterSpacing: 0, - ), - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - errorBorder: InputBorder.none, - focusedErrorBorder: - InputBorder.none, - contentPadding: - EdgeInsetsDirectional.fromSTEB( - 20.rpx, 0, 0, 0.rpx), - ), - style: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - ), + constraints: BoxConstraints( + minHeight: 92.rpx, ), - ), - ), - ), - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 32.rpx, 0, 0), - child: Container( - width: bodysize!.maxWidth, - height: 92.rpx, - decoration: BoxDecoration(), - child: Container( - width: bodysize!.maxWidth, - height: bodysize!.maxHeight * 0.06, - decoration: BoxDecoration( - color: Color(0xFFF3F5F6), - borderRadius: BorderRadius.circular(12), - ), - child: Align( - alignment: AlignmentDirectional(0, 0), - child: Obx(() { - return TextFormField( - // autofocus: true, - // focusNode: _focusNode2, - onChanged: (value) { - controller.model.register_pd = - value; - }, - // obscureText: true, - obscureText: - controller.model.pdshow!, - decoration: InputDecoration( - labelStyle: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - hintText: '请输入密码'.tr, - hintStyle: TextStyle( - fontFamily: 'Readex Pro', - color: Color(0xFF929699), - fontSize: 26.rpx, - letterSpacing: 0, - ), - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - errorBorder: InputBorder.none, - focusedErrorBorder: - InputBorder.none, - contentPadding: - EdgeInsetsDirectional - .fromSTEB( - 10, 26.rpx, 0, 0), - suffixIcon: IconButton( - icon: Icon( - // 根据 pdshow 控制图标 - controller.model.pdshow! - ? Icons.visibility_off - : Icons.visibility, - color: Color(0xFF333333), - size: 16, - ), - onPressed: () { - // 切换 pdshow 状态 - controller.model.pdshow = - !controller - .model.pdshow!; - controller.updateAll(); - }, - ), - ), - style: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - ); - })), - ), - ), - ), - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 32.rpx, 0, 0), - child: Container( - width: bodysize!.maxWidth, - height: 92.rpx, - decoration: BoxDecoration(), - child: Container( - width: bodysize!.maxWidth, - height: bodysize!.maxHeight * 0.06, - decoration: BoxDecoration( - color: Color(0xFFF3F5F6), - borderRadius: BorderRadius.circular(12), - ), - child: Align( - alignment: AlignmentDirectional(0, 0), - child: Obx(() { - return TextFormField( - // autofocus: true, - onChanged: (value) { - controller.model - .register_confirm_pd = - value; - }, - // focusNode: _focusNode3, - // obscureText: true, - obscureText: - controller.model.cpdshow!, - decoration: InputDecoration( - labelStyle: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - hintText: '请输入确认密码'.tr, - hintStyle: TextStyle( - fontFamily: 'Readex Pro', - color: Color(0xFF929699), - fontSize: 26.rpx, - letterSpacing: 0, - ), - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - errorBorder: InputBorder.none, - focusedErrorBorder: - InputBorder.none, - contentPadding: - EdgeInsetsDirectional - .fromSTEB( - 10, 26.rpx, 0, 0), - suffixIcon: IconButton( - icon: Icon( - // 根据 pdshow 控制图标 - controller.model.pdshow! - ? Icons.visibility_off - : Icons.visibility, - color: Color(0xFF333333), - size: 16, - ), - onPressed: () { - // 切换 pdshow 状态 - controller.model.cpdshow = - !controller - .model.cpdshow!; - controller.updateAll(); - }, - ), - ), - style: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - ); - })), - ), - ), - ), - Padding( - padding: EdgeInsetsDirectional.fromSTEB( - 0, 32.rpx, 0, 0), - child: Container( - width: bodysize!.maxWidth, - height: 92.rpx, - decoration: BoxDecoration(), - child: Stack( - children: [ - Align( - alignment: AlignmentDirectional(0, 0), - child: Container( - width: bodysize!.maxWidth, - height: 92.rpx, - decoration: BoxDecoration( - color: Color(0xFFF3F5F6), - borderRadius: - BorderRadius.circular(12), - ), - child: Align( - alignment: - AlignmentDirectional(0, 0), - child: TextFormField( - // autofocus: true, - onChanged: (value) { - controller.model - .register_code = value; - }, - // focusNode: _focusNode4, - obscureText: false, - decoration: InputDecoration( - labelStyle: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - hintText: '请输入验证码', - hintStyle: TextStyle( - fontFamily: 'Readex Pro', - color: Color(0xFF929699), - fontSize: 26.rpx, - letterSpacing: 0, - ), - enabledBorder: - InputBorder.none, - focusedBorder: - InputBorder.none, - errorBorder: InputBorder.none, - focusedErrorBorder: - InputBorder.none, - contentPadding: - EdgeInsetsDirectional - .fromSTEB(20.rpx, 0, - 0, 0.rpx), - ), - style: TextStyle( - fontFamily: 'Readex Pro', - fontSize: 26.rpx, - letterSpacing: 0, - ), - ), - ), - ), - ), - Align( - alignment: - AlignmentDirectional(0.4, 0.1), - child: Container( - width: 1.rpx, - height: 38.rpx, - decoration: BoxDecoration( - color: stringToColor("#929699"), - ), - ), - ), - Align( - alignment: - AlignmentDirectional(1.2, 0), - child: Container( - width: bodysize!.maxWidth * 0.157, - height: bodysize!.maxHeight * 0.014, - constraints: BoxConstraints( - minWidth: 118, - minHeight: 30, - ), - decoration: BoxDecoration(), - child: Align( - alignment: - AlignmentDirectional(0, 0), - child: Obx(() { - final CountdownController - countdownController = - Get.find< - CountdownController>(); - return InkWell( - onTap: () async { - if (countdownController - .countdown.value != - 0) { - return; - } - if (CommonVariables - .isNetWorkOn == - false) { - showToast( - "网络未连接,请开启设备网络后重试" - .tr); - return; - } - String msg = - await controller - .getCode(context); - if (msg.isNotEmpty) { - return; - } - countdownController - .countdown - .value == - 0 - ? countdownController - .startCountdown( - AppConstants - .code_time) - : null; - }, - child: Text( - countdownController - .countdown - .value == - 0 - ? '获取验证码'.tr - : '${countdownController.countdown.value}' + - '秒'.tr, + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 35.rpx, 0, 35.rpx, 0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + child: Align( + alignment: + AlignmentDirectional( + -1, 0), + child: TextFormField( + onChanged: (value) { + controller.model + .register_phone = + value; + }, + decoration: InputDecoration( + isDense: true, + hintText: '请输入手机号'.tr, + hintStyle: TextStyle( + fontFamily: + 'Readex Pro', + color: + Color(0xFF929699), + fontSize: 26.rpx, + ), + border: InputBorder.none, + ), style: TextStyle( fontFamily: 'Readex Pro', - color: Color(0xFF333333), - fontSize: 20.rpx, - letterSpacing: 0, + fontSize: 26.rpx, + color: Colors.black, ), ), - ); - }), + ), + ), ), - ), + ], ), - ], + ), ), ), ), + Align( + alignment: AlignmentDirectional(-1, 0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 32.rpx, 0, 0), + child: Container( + width: double.infinity, + height: bodysize!.maxHeight * 0.06, + decoration: BoxDecoration( + color: Color(0xFFF3F5F6), + borderRadius: BorderRadius.circular(12), + ), + constraints: BoxConstraints( + minHeight: 92.rpx, + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 35.rpx, 0, 35.rpx, 0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + child: Align( + alignment: + AlignmentDirectional( + -1, 0), + child: Obx(() => + TextFormField( + onChanged: (value) { + controller.model + .register_pd = + value; + }, + obscureText: controller + .model.pdshow!, + decoration: + InputDecoration( + isDense: true, + hintText: '请输入密码'.tr, + hintStyle: TextStyle( + fontFamily: + 'Readex Pro', + color: Color( + 0xFF929699), + fontSize: 26.rpx, + ), + border: + InputBorder.none, + suffixIcon: + IconButton( + icon: Icon( + controller.model + .pdshow! + ? Icons + .visibility_off + : Icons + .visibility, + color: Color( + 0xFF333333), + size: 16, + ), + onPressed: () { + controller.model + .pdshow = + !controller + .model + .pdshow!; + controller + .updateAll(); + }, + ), + ), + style: TextStyle( + fontFamily: + 'Readex Pro', + fontSize: 26.rpx, + color: Colors.black, + ), + )), + ), + ), + ), + ], + ), + ), + ), + ), + ), + +// 确认密码输入框 + Align( + alignment: AlignmentDirectional(-1, 0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 32.rpx, 0, 0), + child: Container( + width: double.infinity, + height: bodysize!.maxHeight * 0.06, + decoration: BoxDecoration( + color: Color(0xFFF3F5F6), + borderRadius: BorderRadius.circular(12), + ), + constraints: BoxConstraints( + minHeight: 92.rpx, + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 35.rpx, 0, 35.rpx, 0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + child: Align( + alignment: + AlignmentDirectional( + -1, 0), + child: Obx(() => + TextFormField( + onChanged: (value) { + controller.model + .register_confirm_pd = + value; + }, + obscureText: controller + .model.cpdshow!, + decoration: + InputDecoration( + isDense: true, + hintText: + '请输入确认密码'.tr, + hintStyle: TextStyle( + fontFamily: + 'Readex Pro', + color: Color( + 0xFF929699), + fontSize: 26.rpx, + ), + border: + InputBorder.none, + suffixIcon: + IconButton( + icon: Icon( + controller.model + .pdshow! + ? Icons + .visibility_off + : Icons + .visibility, + color: Color( + 0xFF333333), + size: 16, + ), + onPressed: () { + controller.model + .cpdshow = + !controller + .model + .cpdshow!; + controller + .updateAll(); + }, + ), + ), + style: TextStyle( + fontFamily: + 'Readex Pro', + fontSize: 26.rpx, + color: Colors.black, + ), + )), + ), + ), + ), + ], + ), + ), + ), + ), + ), + +// 验证码输入框 + Align( + alignment: AlignmentDirectional(-1, 0), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0, 32.rpx, 0, 0), + child: Container( + width: double.infinity, + height: bodysize!.maxHeight * 0.06, + decoration: BoxDecoration( + color: Color(0xFFF3F5F6), + borderRadius: BorderRadius.circular(12), + ), + constraints: BoxConstraints( + minHeight: 92.rpx, + ), + child: Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 35.rpx, 0, 35.rpx, 0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + child: Align( + alignment: + AlignmentDirectional( + -1, 0), + child: TextFormField( + onChanged: (value) { + controller.model + .register_code = + value; + }, + decoration: InputDecoration( + isDense: true, + hintText: '请输入验证码', + hintStyle: TextStyle( + fontFamily: + 'Readex Pro', + color: + Color(0xFF929699), + fontSize: 26.rpx, + ), + border: InputBorder.none, + ), + style: TextStyle( + fontFamily: 'Readex Pro', + fontSize: 26.rpx, + color: Colors.black, + ), + ), + ), + ), + ), + Container( + width: 1.rpx, + height: 38.rpx, + color: Color(0xFF929699), + ), + Obx(() { + final countdownController = Get + .find(); + return InkWell( + onTap: () async { + if (countdownController + .countdown.value != + 0) return; + String msg = await controller + .getCode(context); + if (msg.isEmpty) { + countdownController + .startCountdown( + AppConstants + .code_time); + } + }, + child: Text( + countdownController.countdown + .value == + 0 + ? '获取验证码'.tr + : '${countdownController.countdown.value}秒' + .tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: Color(0xFF333333), + fontSize: 20.rpx, + ), + ), + ); + }), + ], + ), + ), + ), + ), + ), + // 其他部分保持不变... Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 19, 0, 0), @@ -526,12 +508,6 @@ class RegisterPage extends GetView { controller .updateAll(); - // 获取设备信息,需要用户点击确认隐私协议与用户协议选择框时才能获取 - // if (newValue == - // true) { - // Deviceconfig - // .initPlatformState(); - // } }, side: BorderSide( width: 1.5, @@ -547,7 +523,7 @@ class RegisterPage extends GetView { horizontal: -4.0, vertical: - -4.0), // 变小 + -4.0), ), )), ), diff --git a/pubspec.yaml b/pubspec.yaml index 347d895..74b49fc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,16 +29,16 @@ dependencies: git: url: http://admin@git.real.he-info.cn:8080/r/~lu/flutterflow-ui.git ref: master - lottie: ^3.2.0 + # lottie: ^3.2.0 flutter_blue_plus: ^1.35.3 permission_handler: ^12.0.0+1 loading_indicator: ^3.1.1 geolocator: ^13.0.1 easydevice: - path: - C:\Users\a\Desktop\blue\easydevice + git: + url: https://gitea.wslpc.real.he-info.cn:94/flutter/easydevice.git # url: http:///enchantedwyf@git.it.real.he-info.cn:90/r/easydevice.git - # ref: main + ref: main localstorage: ^5.0.0 img_picker: ^1.0.2 uuid: ^4.5.1 @@ -61,6 +61,12 @@ dependencies: chewie: ^1.10.0 map_launcher: ^3.5.0 gif: ^2.3.0 + easyweb: + git: + url: https://gitea.wslpc.real.he-info.cn:94/flutter/easyweb.git + ref: main + archive: ^4.0.0 + dev_dependencies: flutter_test: