mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-21 09:37:02 +08:00
login/exp log
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -929,4 +929,10 @@ class Api {
|
|||||||
static const String updateReserve = '/x/new-reserve/up/reserve/update';
|
static const String updateReserve = '/x/new-reserve/up/reserve/update';
|
||||||
|
|
||||||
static const String reserveInfo = '/x/new-reserve/up/reserve/info';
|
static const String reserveInfo = '/x/new-reserve/up/reserve/info';
|
||||||
|
|
||||||
|
static const String loginLog = '/x/member/web/login/log';
|
||||||
|
|
||||||
|
static const String expLog = '/x/member/web/exp/log';
|
||||||
|
|
||||||
|
static const String moralLog = '/x/member/web/moral/log';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import 'package:PiliPlus/models/user/stat.dart';
|
|||||||
import 'package:PiliPlus/models_new/coin_log/data.dart';
|
import 'package:PiliPlus/models_new/coin_log/data.dart';
|
||||||
import 'package:PiliPlus/models_new/history/data.dart';
|
import 'package:PiliPlus/models_new/history/data.dart';
|
||||||
import 'package:PiliPlus/models_new/later/data.dart';
|
import 'package:PiliPlus/models_new/later/data.dart';
|
||||||
|
import 'package:PiliPlus/models_new/login_log/data.dart';
|
||||||
import 'package:PiliPlus/models_new/media_list/data.dart';
|
import 'package:PiliPlus/models_new/media_list/data.dart';
|
||||||
import 'package:PiliPlus/models_new/space_setting/data.dart';
|
import 'package:PiliPlus/models_new/space_setting/data.dart';
|
||||||
import 'package:PiliPlus/models_new/sub/sub/data.dart';
|
import 'package:PiliPlus/models_new/sub/sub/data.dart';
|
||||||
@@ -413,4 +414,34 @@ class UserHttp {
|
|||||||
return Error(res.data['message']);
|
return Error(res.data['message']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<LoadingState<LoginLogData>> loginLog() async {
|
||||||
|
final res = await Request().get(
|
||||||
|
Api.loginLog,
|
||||||
|
queryParameters: {
|
||||||
|
'jsonp': 'jsonp',
|
||||||
|
'web_location': '333.33',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (res.data['code'] == 0) {
|
||||||
|
return Success(LoginLogData.fromJson(res.data['data']));
|
||||||
|
} else {
|
||||||
|
return Error(res.data['message']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<LoadingState<CoinLogData>> expLog() async {
|
||||||
|
final res = await Request().get(
|
||||||
|
Api.expLog,
|
||||||
|
queryParameters: {
|
||||||
|
'jsonp': 'jsonp',
|
||||||
|
'web_location': '333.33',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
if (res.data['code'] == 0) {
|
||||||
|
return Success(CoinLogData.fromJson(res.data['data']));
|
||||||
|
} else {
|
||||||
|
return Error(res.data['message']);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
lib/models_new/login_log/data.dart
Normal file
15
lib/models_new/login_log/data.dart
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import 'package:PiliPlus/models_new/login_log/list.dart';
|
||||||
|
|
||||||
|
class LoginLogData {
|
||||||
|
int? count;
|
||||||
|
List<LoginLogItem>? list;
|
||||||
|
|
||||||
|
LoginLogData({this.count, this.list});
|
||||||
|
|
||||||
|
factory LoginLogData.fromJson(Map<String, dynamic> json) => LoginLogData(
|
||||||
|
count: json['count'] as int?,
|
||||||
|
list: (json['list'] as List<dynamic>?)
|
||||||
|
?.map((e) => LoginLogItem.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
}
|
||||||
26
lib/models_new/login_log/list.dart
Normal file
26
lib/models_new/login_log/list.dart
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
class LoginLogItem {
|
||||||
|
String ip;
|
||||||
|
int? time;
|
||||||
|
String timeAt;
|
||||||
|
bool? status;
|
||||||
|
int? type;
|
||||||
|
String geo;
|
||||||
|
|
||||||
|
LoginLogItem({
|
||||||
|
required this.ip,
|
||||||
|
this.time,
|
||||||
|
required this.timeAt,
|
||||||
|
this.status,
|
||||||
|
this.type,
|
||||||
|
required this.geo,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory LoginLogItem.fromJson(Map<String, dynamic> json) => LoginLogItem(
|
||||||
|
ip: json['ip'] ?? '',
|
||||||
|
time: json['time'] as int?,
|
||||||
|
timeAt: json['time_at'] ?? '',
|
||||||
|
status: json['status'] as bool?,
|
||||||
|
type: json['type'] as int?,
|
||||||
|
geo: json['geo'] ?? '',
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -59,6 +59,7 @@ class _BlackListPageState extends State<BlackListPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildBody(LoadingState<List<BlackListItem>?> loadingState) {
|
Widget _buildBody(LoadingState<List<BlackListItem>?> loadingState) {
|
||||||
|
late final style = TextStyle(color: Theme.of(context).colorScheme.outline);
|
||||||
return switch (loadingState) {
|
return switch (loadingState) {
|
||||||
Loading() => SliverList.builder(
|
Loading() => SliverList.builder(
|
||||||
itemCount: 12,
|
itemCount: 12,
|
||||||
@@ -89,10 +90,9 @@ class _BlackListPageState extends State<BlackListPage> {
|
|||||||
style: const TextStyle(fontSize: 14),
|
style: const TextStyle(fontSize: 14),
|
||||||
),
|
),
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
DateUtil.dateFormat(item.mtime),
|
'添加时间: ${DateUtil.format(item.mtime, format: DateUtil.longFormatDs)}',
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
style:
|
style: style,
|
||||||
TextStyle(color: Theme.of(context).colorScheme.outline),
|
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
dense: true,
|
dense: true,
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import 'package:PiliPlus/models_new/coin_log/data.dart';
|
|||||||
import 'package:PiliPlus/models_new/coin_log/list.dart';
|
import 'package:PiliPlus/models_new/coin_log/list.dart';
|
||||||
import 'package:PiliPlus/pages/common/common_list_controller.dart';
|
import 'package:PiliPlus/pages/common/common_list_controller.dart';
|
||||||
|
|
||||||
class MemberCoinLogController
|
class CoinLogController extends CommonListController<CoinLogData, CoinLogItem> {
|
||||||
extends CommonListController<CoinLogData, CoinLogItem> {
|
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
@@ -2,19 +2,19 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
||||||
import 'package:PiliPlus/http/loading_state.dart';
|
import 'package:PiliPlus/http/loading_state.dart';
|
||||||
import 'package:PiliPlus/models_new/coin_log/list.dart';
|
import 'package:PiliPlus/models_new/coin_log/list.dart';
|
||||||
import 'package:PiliPlus/pages/member_coin_log/controller.dart';
|
import 'package:PiliPlus/pages/coin_log/controller.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class MemberCoinLogPage extends StatefulWidget {
|
class CoinLogPage extends StatefulWidget {
|
||||||
const MemberCoinLogPage({super.key});
|
const CoinLogPage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<MemberCoinLogPage> createState() => _MemberCoinLogPageState();
|
State<CoinLogPage> createState() => _CoinLogPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _MemberCoinLogPageState extends State<MemberCoinLogPage> {
|
class _CoinLogPageState extends State<CoinLogPage> {
|
||||||
late final _controller = Get.put(MemberCoinLogController());
|
late final _controller = Get.put(CoinLogController());
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
21
lib/pages/exp_log/controller.dart
Normal file
21
lib/pages/exp_log/controller.dart
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
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<CoinLogData, CoinLogItem> {
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
queryData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<CoinLogItem>? getDataList(CoinLogData response) {
|
||||||
|
return response.list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<LoadingState<CoinLogData>> customGetData() => UserHttp.expLog();
|
||||||
|
}
|
||||||
137
lib/pages/exp_log/view.dart
Normal file
137
lib/pages/exp_log/view.dart
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
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:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class ExpLogPage extends StatefulWidget {
|
||||||
|
const ExpLogPage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<ExpLogPage> createState() => _ExpLogPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ExpLogPageState extends State<ExpLogPage> {
|
||||||
|
late final _controller = Get.put(ExpLogController());
|
||||||
|
|
||||||
|
@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<List<CoinLogItem>?> 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(2, item.time),
|
||||||
|
divider,
|
||||||
|
text(1, item.delta),
|
||||||
|
divider,
|
||||||
|
text(2, item.reason),
|
||||||
|
divider,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
return IntrinsicHeight(
|
||||||
|
child: isHeader ? content : SelectionArea(child: content),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
lib/pages/login_log/controller.dart
Normal file
22
lib/pages/login_log/controller.dart
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
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<LoginLogData, LoginLogItem> {
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
queryData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<LoginLogItem>? getDataList(LoginLogData response) {
|
||||||
|
return response.list;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<LoadingState<LoginLogData>> customGetData() => UserHttp.loginLog();
|
||||||
|
}
|
||||||
137
lib/pages/login_log/view.dart
Normal file
137
lib/pages/login_log/view.dart
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
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<LoginLogPage> createState() => _LoginLogPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LoginLogPageState extends State<LoginLogPage> {
|
||||||
|
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<List<LoginLogItem>?> 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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,9 +4,11 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
|
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
|
||||||
import 'package:PiliPlus/http/loading_state.dart';
|
import 'package:PiliPlus/http/loading_state.dart';
|
||||||
import 'package:PiliPlus/models_new/space/space/data.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/member/controller.dart';
|
import 'package:PiliPlus/pages/member/controller.dart';
|
||||||
import 'package:PiliPlus/pages/member/widget/user_info_card.dart';
|
import 'package:PiliPlus/pages/member/widget/user_info_card.dart';
|
||||||
import 'package:PiliPlus/pages/member_coin_log/view.dart';
|
|
||||||
import 'package:PiliPlus/pages/member_contribute/view.dart';
|
import 'package:PiliPlus/pages/member_contribute/view.dart';
|
||||||
import 'package:PiliPlus/pages/member_dynamics/view.dart';
|
import 'package:PiliPlus/pages/member_dynamics/view.dart';
|
||||||
import 'package:PiliPlus/pages/member_favorite/view.dart';
|
import 'package:PiliPlus/pages/member_favorite/view.dart';
|
||||||
@@ -158,16 +160,38 @@ class _MemberPageState extends State<MemberPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
onTap: () => Get.to(const MemberCoinLogPage()),
|
onTap: () => Get.to(const LoginLogPage()),
|
||||||
child: const Row(
|
child: const Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(FontAwesomeIcons.b, size: 18),
|
Icon(Icons.login, size: 18),
|
||||||
|
SizedBox(width: 10),
|
||||||
|
Text('登录记录'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PopupMenuItem(
|
||||||
|
onTap: () => Get.to(const CoinLogPage()),
|
||||||
|
child: const Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Icon(FontAwesomeIcons.b, size: 16),
|
||||||
SizedBox(width: 10),
|
SizedBox(width: 10),
|
||||||
Text('硬币记录'),
|
Text('硬币记录'),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
PopupMenuItem(
|
||||||
|
onTap: () => Get.to(const ExpLogPage()),
|
||||||
|
child: const Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Icon(Icons.linear_scale, size: 18),
|
||||||
|
SizedBox(width: 10),
|
||||||
|
Text('经验记录'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
onTap: () => Get.toNamed('/spaceSetting'),
|
onTap: () => Get.toNamed('/spaceSetting'),
|
||||||
child: const Row(
|
child: const Row(
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ class _EditProfilePageState extends State<EditProfilePage> {
|
|||||||
onTap: () => showDatePicker(
|
onTap: () => showDatePicker(
|
||||||
context: context,
|
context: context,
|
||||||
initialDate: DateTime.parse(response.birthday!),
|
initialDate: DateTime.parse(response.birthday!),
|
||||||
firstDate: DateTime(1900, 1, 1),
|
firstDate: DateTime(0001, 1, 1),
|
||||||
lastDate: DateTime.now(),
|
lastDate: DateTime.now(),
|
||||||
).then((res) {
|
).then((res) {
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user