From c75a68dacc2cf4ae2a5b0d25fafbcfb39d50bea1 Mon Sep 17 00:00:00 2001 From: My-Responsitories <107370289+My-Responsitories@users.noreply.github.com> Date: Sat, 9 Aug 2025 13:32:52 +0800 Subject: [PATCH] opt: log page (#967) --- lib/models_new/login_log/list.dart | 14 +-- lib/pages/coin_log/controller.dart | 25 ++-- lib/pages/coin_log/view.dart | 140 --------------------- lib/pages/exp_log/controller.dart | 25 ++-- lib/pages/log_table/controller.dart | 15 +++ lib/pages/{exp_log => log_table}/view.dart | 36 +++--- lib/pages/login_log/controller.dart | 26 ++-- lib/pages/login_log/view.dart | 140 --------------------- lib/pages/member/view.dart | 22 +++- 9 files changed, 104 insertions(+), 339 deletions(-) delete mode 100644 lib/pages/coin_log/view.dart create mode 100644 lib/pages/log_table/controller.dart rename lib/pages/{exp_log => log_table}/view.dart (79%) delete mode 100644 lib/pages/login_log/view.dart diff --git a/lib/models_new/login_log/list.dart b/lib/models_new/login_log/list.dart index 28a6d1028..032c7141a 100644 --- a/lib/models_new/login_log/list.dart +++ b/lib/models_new/login_log/list.dart @@ -1,12 +1,12 @@ class LoginLogItem { - String ip; - int? time; - String timeAt; - bool? status; - int? type; - String geo; + final String ip; + final int? time; + final String timeAt; + final bool? status; + final int? type; + final String geo; - LoginLogItem({ + const LoginLogItem({ required this.ip, this.time, required this.timeAt, diff --git a/lib/pages/coin_log/controller.dart b/lib/pages/coin_log/controller.dart index 82f5d4030..69de0fa1f 100644 --- a/lib/pages/coin_log/controller.dart +++ b/lib/pages/coin_log/controller.dart @@ -2,15 +2,9 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models_new/coin_log/data.dart'; import 'package:PiliPlus/models_new/coin_log/list.dart'; -import 'package:PiliPlus/pages/common/common_list_controller.dart'; - -class CoinLogController extends CommonListController { - @override - void onInit() { - super.onInit(); - queryData(); - } +import 'package:PiliPlus/pages/log_table/controller.dart'; +class CoinLogController extends LogController { @override List? getDataList(CoinLogData response) { return response.list; @@ -18,4 +12,19 @@ class CoinLogController extends CommonListController { @override Future> customGetData() => UserHttp.coinLog(); + + @override + List<(int, String)> getFlexAndText(CoinLogItem item) { + return [(3, item.time), (1, item.delta), (4, item.reason)]; + } + + @override + final CoinLogItem header = const CoinLogItem( + time: '时间', + delta: '变化', + reason: '原因', + ); + + @override + final String title = '硬币记录'; } diff --git a/lib/pages/coin_log/view.dart b/lib/pages/coin_log/view.dart deleted file mode 100644 index 8f1f368ad..000000000 --- a/lib/pages/coin_log/view.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; -import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; -import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models_new/coin_log/list.dart'; -import 'package:PiliPlus/pages/coin_log/controller.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -class CoinLogPage extends StatefulWidget { - const CoinLogPage({super.key}); - - @override - State createState() => _CoinLogPageState(); -} - -class _CoinLogPageState extends State { - late final _controller = Get.put(CoinLogController()); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('硬币记录')), - body: SafeArea( - top: false, - bottom: false, - child: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 680), - child: CustomScrollView( - slivers: [ - SliverPadding( - padding: EdgeInsets.only( - left: 10, - right: 10, - bottom: MediaQuery.paddingOf(context).bottom + 80, - ), - sliver: Obx(() => _buildBody(_controller.loadingState.value)), - ), - ], - ), - ), - ), - ), - ); - } - - Widget _buildBody(LoadingState?> loadingState) { - return switch (loadingState) { - Loading() => linearLoading, - Success(:var response) => - response?.isNotEmpty == true - ? Builder( - builder: (context) { - final them = Theme.of(context); - final outline = them.colorScheme.outline.withValues( - alpha: 0.1, - ); - final divider = Divider( - height: 1, - color: outline, - ); - final sliverDivider = SliverToBoxAdapter( - child: divider, - ); - final dividerV = VerticalDivider( - width: 1, - color: outline, - ); - return SliverMainAxisGroup( - slivers: [ - sliverDivider, - SliverToBoxAdapter( - child: ColoredBox( - color: them.colorScheme.onInverseSurface, - child: _item( - const CoinLogItem( - time: '时间', - delta: '变化', - reason: '原因', - ), - dividerV, - isHeader: true, - ), - ), - ), - sliverDivider, - SliverList.separated( - itemCount: response!.length, - itemBuilder: (context, index) { - return _item(response[index], dividerV); - }, - separatorBuilder: (context, index) => divider, - ), - sliverDivider, - ], - ); - }, - ) - : HttpError(onReload: _controller.onReload), - Error(:var errMsg) => HttpError( - errMsg: errMsg, - onReload: _controller.onReload, - ), - }; - } - - Widget _item(CoinLogItem item, Widget divider, {bool isHeader = false}) { - Widget text(int flex, String text) => Expanded( - flex: flex, - child: Padding( - padding: isHeader - ? const EdgeInsets.symmetric(vertical: 6) - : const EdgeInsets.symmetric(vertical: 8), - child: Center( - child: Text( - text, - textAlign: TextAlign.center, - style: isHeader - ? const TextStyle(fontSize: 13, fontWeight: FontWeight.bold) - : const TextStyle(fontSize: 13), - ), - ), - ), - ); - Widget content = Row( - children: [ - divider, - text(3, item.time), - divider, - text(1, item.delta), - divider, - text(4, item.reason), - divider, - ], - ); - return IntrinsicHeight( - child: isHeader ? content : SelectionArea(child: content), - ); - } -} diff --git a/lib/pages/exp_log/controller.dart b/lib/pages/exp_log/controller.dart index 42e293008..933009597 100644 --- a/lib/pages/exp_log/controller.dart +++ b/lib/pages/exp_log/controller.dart @@ -2,15 +2,9 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models_new/coin_log/data.dart'; import 'package:PiliPlus/models_new/coin_log/list.dart'; -import 'package:PiliPlus/pages/common/common_list_controller.dart'; - -class ExpLogController extends CommonListController { - @override - void onInit() { - super.onInit(); - queryData(); - } +import 'package:PiliPlus/pages/log_table/controller.dart'; +class ExpLogController extends LogController { @override List? getDataList(CoinLogData response) { return response.list; @@ -18,4 +12,19 @@ class ExpLogController extends CommonListController { @override Future> customGetData() => UserHttp.expLog(); + + @override + List<(int, String)> getFlexAndText(CoinLogItem item) { + return [(2, item.time), (1, item.delta), (2, item.reason)]; + } + + @override + final CoinLogItem header = const CoinLogItem( + time: '时间', + delta: '变化', + reason: '原因', + ); + + @override + final String title = '经验记录'; } diff --git a/lib/pages/log_table/controller.dart b/lib/pages/log_table/controller.dart new file mode 100644 index 000000000..b9f67263b --- /dev/null +++ b/lib/pages/log_table/controller.dart @@ -0,0 +1,15 @@ +import 'package:PiliPlus/pages/common/common_list_controller.dart'; + +abstract class LogController extends CommonListController { + @override + void onInit() { + super.onInit(); + queryData(); + } + + String get title; + + T get header; + + List<(int, String)> getFlexAndText(T item); +} diff --git a/lib/pages/exp_log/view.dart b/lib/pages/log_table/view.dart similarity index 79% rename from lib/pages/exp_log/view.dart rename to lib/pages/log_table/view.dart index 37aa9ddd3..def044c55 100644 --- a/lib/pages/exp_log/view.dart +++ b/lib/pages/log_table/view.dart @@ -1,25 +1,24 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models_new/coin_log/list.dart'; -import 'package:PiliPlus/pages/exp_log/controller.dart'; +import 'package:PiliPlus/pages/log_table/controller.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -class ExpLogPage extends StatefulWidget { - const ExpLogPage({super.key}); +class LogPage extends StatefulWidget { + const LogPage({super.key}); @override - State createState() => _ExpLogPageState(); + State> createState() => _LogPageState(); } -class _ExpLogPageState extends State { - late final _controller = Get.put(ExpLogController()); +class _LogPageState extends State> { + final _controller = Get.put>(Get.arguments); @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('经验记录')), + appBar: AppBar(title: Text(_controller.title)), body: SafeArea( top: false, bottom: false, @@ -44,7 +43,7 @@ class _ExpLogPageState extends State { ); } - Widget _buildBody(LoadingState?> loadingState) { + Widget _buildBody(LoadingState?> loadingState) { return switch (loadingState) { Loading() => linearLoading, Success(:var response) => @@ -73,11 +72,7 @@ class _ExpLogPageState extends State { child: ColoredBox( color: them.colorScheme.onInverseSurface, child: _item( - const CoinLogItem( - time: '时间', - delta: '变化', - reason: '原因', - ), + _controller.header, dividerV, isHeader: true, ), @@ -104,7 +99,7 @@ class _ExpLogPageState extends State { }; } - Widget _item(CoinLogItem item, Widget divider, {bool isHeader = false}) { + Widget _item(T item, Widget divider, {bool isHeader = false}) { Widget text(int flex, String text) => Expanded( flex: flex, child: Padding( @@ -122,15 +117,14 @@ class _ExpLogPageState extends State { ), ), ); + Widget content = Row( children: [ divider, - text(2, item.time), - divider, - text(1, item.delta), - divider, - text(2, item.reason), - divider, + for (var (i, j) in _controller.getFlexAndText(item)) ...[ + text(i, j), + divider, + ], ], ); return IntrinsicHeight( diff --git a/lib/pages/login_log/controller.dart b/lib/pages/login_log/controller.dart index 72b17a0c4..ec2348ff5 100644 --- a/lib/pages/login_log/controller.dart +++ b/lib/pages/login_log/controller.dart @@ -2,16 +2,9 @@ import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/models_new/login_log/data.dart'; import 'package:PiliPlus/models_new/login_log/list.dart'; -import 'package:PiliPlus/pages/common/common_list_controller.dart'; - -class LoginLogController - extends CommonListController { - @override - void onInit() { - super.onInit(); - queryData(); - } +import 'package:PiliPlus/pages/log_table/controller.dart'; +class LoginLogController extends LogController { @override List? getDataList(LoginLogData response) { return response.list; @@ -19,4 +12,19 @@ class LoginLogController @override Future> customGetData() => UserHttp.loginLog(); + + @override + List<(int, String)> getFlexAndText(LoginLogItem item) { + return [(3, item.timeAt), (2, item.ip), (3, item.geo)]; + } + + @override + final LoginLogItem header = const LoginLogItem( + timeAt: '时间', + ip: '变化', + geo: '地理位置', + ); + + @override + final String title = '登录记录'; } diff --git a/lib/pages/login_log/view.dart b/lib/pages/login_log/view.dart deleted file mode 100644 index 841fe4095..000000000 --- a/lib/pages/login_log/view.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart'; -import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; -import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/models_new/login_log/list.dart'; -import 'package:PiliPlus/pages/login_log/controller.dart'; -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; - -class LoginLogPage extends StatefulWidget { - const LoginLogPage({super.key}); - - @override - State createState() => _LoginLogPageState(); -} - -class _LoginLogPageState extends State { - late final _controller = Get.put(LoginLogController()); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: const Text('登录记录')), - body: SafeArea( - top: false, - bottom: false, - child: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 680), - child: CustomScrollView( - slivers: [ - SliverPadding( - padding: EdgeInsets.only( - left: 10, - right: 10, - bottom: MediaQuery.paddingOf(context).bottom + 80, - ), - sliver: Obx(() => _buildBody(_controller.loadingState.value)), - ), - ], - ), - ), - ), - ), - ); - } - - Widget _buildBody(LoadingState?> loadingState) { - return switch (loadingState) { - Loading() => linearLoading, - Success(:var response) => - response?.isNotEmpty == true - ? Builder( - builder: (context) { - final them = Theme.of(context); - final outline = them.colorScheme.outline.withValues( - alpha: 0.1, - ); - final divider = Divider( - height: 1, - color: outline, - ); - final sliverDivider = SliverToBoxAdapter( - child: divider, - ); - final dividerV = VerticalDivider( - width: 1, - color: outline, - ); - return SliverMainAxisGroup( - slivers: [ - sliverDivider, - SliverToBoxAdapter( - child: ColoredBox( - color: them.colorScheme.onInverseSurface, - child: _item( - LoginLogItem( - timeAt: '时间', - ip: '变化', - geo: '地理位置', - ), - dividerV, - isHeader: true, - ), - ), - ), - sliverDivider, - SliverList.separated( - itemCount: response!.length, - itemBuilder: (context, index) { - return _item(response[index], dividerV); - }, - separatorBuilder: (context, index) => divider, - ), - sliverDivider, - ], - ); - }, - ) - : HttpError(onReload: _controller.onReload), - Error(:var errMsg) => HttpError( - errMsg: errMsg, - onReload: _controller.onReload, - ), - }; - } - - Widget _item(LoginLogItem item, Widget divider, {bool isHeader = false}) { - Widget text(int flex, String text) => Expanded( - flex: flex, - child: Padding( - padding: isHeader - ? const EdgeInsets.symmetric(vertical: 6) - : const EdgeInsets.symmetric(vertical: 8), - child: Center( - child: Text( - text, - textAlign: TextAlign.center, - style: isHeader - ? const TextStyle(fontSize: 13, fontWeight: FontWeight.bold) - : const TextStyle(fontSize: 13), - ), - ), - ), - ); - Widget content = Row( - children: [ - divider, - text(3, item.timeAt), - divider, - text(2, item.ip), - divider, - text(3, item.geo), - divider, - ], - ); - return IntrinsicHeight( - child: isHeader ? content : SelectionArea(child: content), - ); - } -} diff --git a/lib/pages/member/view.dart b/lib/pages/member/view.dart index 106b6faf6..437456c49 100644 --- a/lib/pages/member/view.dart +++ b/lib/pages/member/view.dart @@ -4,9 +4,10 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/space/space/data.dart'; -import 'package:PiliPlus/pages/coin_log/view.dart'; -import 'package:PiliPlus/pages/exp_log/view.dart'; -import 'package:PiliPlus/pages/login_log/view.dart'; +import 'package:PiliPlus/pages/coin_log/controller.dart'; +import 'package:PiliPlus/pages/exp_log/controller.dart'; +import 'package:PiliPlus/pages/log_table/view.dart'; +import 'package:PiliPlus/pages/login_log/controller.dart'; import 'package:PiliPlus/pages/member/controller.dart'; import 'package:PiliPlus/pages/member/widget/user_info_card.dart'; import 'package:PiliPlus/pages/member_cheese/view.dart'; @@ -172,7 +173,10 @@ class _MemberPageState extends State { ), ), PopupMenuItem( - onTap: () => Get.to(const LoginLogPage()), + onTap: () => Get.to( + const LogPage(), + arguments: LoginLogController(), + ), child: const Row( mainAxisSize: MainAxisSize.min, children: [ @@ -183,7 +187,10 @@ class _MemberPageState extends State { ), ), PopupMenuItem( - onTap: () => Get.to(const CoinLogPage()), + onTap: () => Get.to( + const LogPage(), + arguments: CoinLogController(), + ), child: const Row( mainAxisSize: MainAxisSize.min, children: [ @@ -194,7 +201,10 @@ class _MemberPageState extends State { ), ), PopupMenuItem( - onTap: () => Get.to(const ExpLogPage()), + onTap: () => Get.to( + const LogPage(), + arguments: ExpLogController(), + ), child: const Row( mainAxisSize: MainAxisSize.min, children: [