Browse Source

设置签名

Melon 1 năm trước cách đây
mục cha
commit
60a80b5a5d

+ 6 - 3
lib/components/side_nav/side_bar.dart

@@ -25,6 +25,7 @@ class _SideBarState extends State<_SideBar> {
     return Scrollbar(
       thumbVisibility: true,
       child: ListView(
+        padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12),
         children: _buildChildren(context),
       ),
     );
@@ -67,9 +68,11 @@ class _SideBarState extends State<_SideBar> {
       leadingIconWidth: 32,
       label: item.title,
       onTap: () {
-        //
-        var a = 0;
-        print(a is double);
+        if (item.onTap != null) {
+          item.onTap!.call();
+        } else if (item.route != null) {
+          Get.offAllNamed(item.route!.name, id: widget.navId);
+        }
       },
     );
   }

+ 1 - 0
lib/components/side_nav/side_nav.dart

@@ -47,6 +47,7 @@ class VSideNavView extends StatelessWidget {
             flex: 4,
             child: sideView,
           ),
+          const VerticalDivider(width: 1),
           Expanded(
             flex: 6,
             child: navView,

+ 1 - 0
lib/managers/doctor.dart

@@ -22,6 +22,7 @@ class DoctorManager implements IDoctorManager {
   Future<bool> setSignature(String signature) async {
     try {
       final request = SetSignatureRequest(
+        token: Store.user.token,
         code: Store.user.userCode,
         signature: signature,
       );

+ 8 - 2
lib/pages/doctor/signature_setting/controller.dart

@@ -20,7 +20,7 @@ class DoctorSignatureSettingController extends GetxController {
     if (result != null) {
       final saved = await Get.find<IDoctorManager>().setSignature(result);
       if (saved) {
-        state.signaturBase64 = result;
+        _updateSignature(result);
       } else {
         PromptBox.toast("设置签名失败");
       }
@@ -28,6 +28,12 @@ class DoctorSignatureSettingController extends GetxController {
   }
 
   void _loadData() {
-    state.signaturBase64 = Store.user.signature;
+    _updateSignature(Store.user.signature);
+  }
+
+  void _updateSignature(String value) {
+    if (value.startsWith('data:image')) {
+      state.signaturBase64 = value.split(',')[1];
+    }
   }
 }

+ 26 - 13
lib/pages/doctor/signature_setting/view.dart

@@ -2,6 +2,7 @@ import 'dart:convert';
 
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:vnoteapp/components/button.dart';
 
 import 'controller.dart';
 
@@ -12,18 +13,19 @@ class DoctorSignatureSettingPage
   @override
   Widget build(BuildContext context) {
     return Column(
+      mainAxisAlignment: MainAxisAlignment.center,
       children: [
         _buildPreview(),
+        const SizedBox(height: 20),
         _buildOperateRow(),
       ],
     );
   }
 
   Widget _buildOperateRow() {
-    return Row(
-      children: [
-        //TODO: 操作按钮
-      ],
+    return VButton(
+      label: "设  置",
+      onTap: controller.rewrite,
     );
   }
 
@@ -33,9 +35,12 @@ class DoctorSignatureSettingPage
           ? _buildBase64Preview()
           : _buildEmptyPreview();
       return Container(
-        color: Colors.grey,
-        width: 400,
-        height: 300,
+        decoration: BoxDecoration(
+          color: Colors.white,
+          border: Border.all(color: Colors.grey),
+        ),
+        width: 420,
+        height: 270,
         child: imageWidget,
       );
     });
@@ -51,12 +56,20 @@ class DoctorSignatureSettingPage
   }
 
   Widget _buildEmptyPreview() {
-    return const Center(
-      child: SizedBox(
-        width: 100,
-        height: 100,
-        child: Icon(Icons.person_4_outlined),
-      ),
+    return const Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        Icon(
+          Icons.person_4_outlined,
+          size: 56,
+        ),
+        SizedBox(height: 12),
+        Text(
+          "未设置",
+          style: TextStyle(fontSize: 32),
+        ),
+      ],
     );
   }
 }

+ 24 - 0
lib/pages/settings/about/view.dart

@@ -0,0 +1,24 @@
+import 'package:flutter/material.dart';
+
+class AboutPage extends StatelessWidget {
+  const AboutPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return const Column(
+      mainAxisAlignment: MainAxisAlignment.center,
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: [
+        Text(
+          "当前版本:2.0.0",
+          style: TextStyle(color: Colors.black, fontSize: 18),
+        ),
+        SizedBox(height: 20),
+        Text(
+          "技术支持:Vinno",
+          style: TextStyle(color: Colors.black, fontSize: 18),
+        ),
+      ],
+    );
+  }
+}

+ 12 - 0
lib/pages/settings/center/controller.dart

@@ -0,0 +1,12 @@
+import 'package:get/get.dart';
+import 'package:vnoteapp/managers/interfaces/account.dart';
+
+class SettingCenterController extends GetxController {
+  /// 登出
+  Future<void> logOut() async {
+    final result = await Get.find<IAccountManager>().logout();
+    if (result) {
+      Get.offAllNamed("/login");
+    }
+  }
+}

+ 86 - 0
lib/pages/settings/center/view.dart

@@ -0,0 +1,86 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:vnoteapp/components/alert_dialog.dart';
+import 'package:vnoteapp/components/side_nav/defines.dart';
+import 'package:vnoteapp/components/side_nav/side_nav.dart';
+import 'package:vnoteapp/pages/doctor/signature_setting/controller.dart';
+import 'package:vnoteapp/pages/doctor/signature_setting/view.dart';
+import 'package:vnoteapp/pages/settings/about/view.dart';
+import 'package:vnoteapp/routes/nav_ids.dart';
+import 'package:vnoteapp/routes/route_setting.dart';
+
+import 'controller.dart';
+
+class SettingCenterPage extends GetView<SettingCenterController> {
+  const SettingCenterPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return VSideNavView(
+      navId: NavIds.SETTINGS,
+      items: _buildItems(),
+    );
+  }
+
+  List<VSideNavMenuItem> _buildItems() {
+    final items = <VSideNavMenuItem>[];
+    items.add(_buildSignatureItem());
+    items.add(_buildAboutItem());
+    items.add(_buildLogOutItem());
+    return items;
+  }
+
+  VSideNavMenuItem _buildSignatureItem() {
+    return VSideNavMenuItem(
+      title: "签名设置",
+      icon: const Icon(Icons.edit_document),
+      route: VRouteSetting(
+        "/signature",
+        () => const DoctorSignatureSettingPage(),
+        binding: BindingsBuilder(
+          () {
+            Get.lazyPut(() => DoctorSignatureSettingController());
+          },
+        ),
+      ),
+    );
+  }
+
+  VSideNavMenuItem _buildAboutItem() {
+    return VSideNavMenuItem(
+      title: "关于我们",
+      icon: const Icon(Icons.info_outline),
+      route: VRouteSetting("/about", () => const AboutPage()),
+    );
+  }
+
+  VSideNavMenuItem _buildLogOutItem() {
+    return VSideNavMenuItem(
+      title: "退出登录",
+      icon: const Icon(Icons.exit_to_app),
+      onTap: () {
+        // TODO: 用confirm组件替换
+        Get.dialog(
+          VAlertDialog(
+            title: "提示",
+            width: 260,
+            content: Container(
+              height: 32,
+              padding: const EdgeInsets.symmetric(horizontal: 24),
+              alignment: Alignment.center,
+              child: const Text(
+                "确定退出登录?",
+                style: TextStyle(fontSize: 20),
+              ),
+            ),
+            onConfirm: () {
+              controller.logOut();
+            },
+          ),
+          barrierDismissible: false,
+          barrierColor: Colors.black.withOpacity(.4),
+        );
+      },
+    );
+  }
+}

+ 13 - 2
lib/routes/routes.dart

@@ -7,6 +7,8 @@ import 'package:vnoteapp/pages/contract/package_list/widgets/service_information
 import 'package:vnoteapp/pages/from_page/controller.dart';
 import 'package:vnoteapp/pages/check/follow_up_record/controller.dart';
 import 'package:vnoteapp/pages/check/follow_up_record/view.dart';
+import 'package:vnoteapp/pages/settings/center/controller.dart';
+import 'package:vnoteapp/pages/settings/center/view.dart';
 import 'package:vnoteapp/routes/route_setting.dart';
 import 'package:vnoteapp/pages/check/examination/controller.dart';
 import 'package:vnoteapp/pages/check/examination/view.dart';
@@ -98,12 +100,21 @@ class Routes {
         },
       ),
     ),
+    // VRouteSetting(
+    //   "/settings",
+    //   () => const SettingsPage(),
+    //   binding: BindingsBuilder(
+    //     () {
+    //       Get.put(SettingsController());
+    //     },
+    //   ),
+    // ),
     VRouteSetting(
       "/settings",
-      () => const SettingsPage(),
+      () => const SettingCenterPage(),
       binding: BindingsBuilder(
         () {
-          Get.put(SettingsController());
+          Get.put(SettingCenterController());
         },
       ),
     ),

+ 1 - 1
lib/store/modules/user.dart

@@ -43,7 +43,7 @@ class UserState extends StateModuleBase {
   String get organizationPhone => _userInfo?.organizationPhone ?? "";
 
   /// 医生签名
-  String get signature => _userInfo?.organizationPhone ?? "";
+  String get signature => _userInfo?.signature ?? "";
 
   /// 负责区域(村)集合
   List<StringKVModel> get residence =>