show user name

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-10-09 16:40:52 +08:00
parent 41768656b4
commit 3d49529272
9 changed files with 115 additions and 12 deletions

View File

@@ -953,4 +953,6 @@ class Api {
'/x/web-interface/popular/series/list'; '/x/web-interface/popular/series/list';
static const String popularPrecious = '/x/web-interface/popular/precious'; static const String popularPrecious = '/x/web-interface/popular/precious';
static const String userRealName = '/x/member/app/up/realname';
} }

View File

@@ -11,9 +11,11 @@ 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';
import 'package:PiliPlus/models_new/user_real_name/data.dart';
import 'package:PiliPlus/models_new/video/video_tag/data.dart'; import 'package:PiliPlus/models_new/video/video_tag/data.dart';
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/accounts/account.dart';
import 'package:PiliPlus/utils/app_sign.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/wbi_sign.dart'; import 'package:PiliPlus/utils/wbi_sign.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
@@ -475,4 +477,23 @@ class UserHttp {
return Error(res.data['message']); return Error(res.data['message']);
} }
} }
static Future<LoadingState<UserRealNameData>> getUserRealName(
Object mid,
) async {
final params = {
'access_key': Accounts.main.accessKey,
'up_mid': mid,
};
AppSign.appSign(params);
final res = await Request().get(
Api.userRealName,
queryParameters: params,
);
if (res.data['code'] == 0) {
return Success(UserRealNameData.fromJson(res.data['data']));
} else {
return Error(res.data['message']);
}
}
} }

View File

@@ -169,7 +169,7 @@ class SpaceCard {
json['live_fans_wearing'] as Map<String, dynamic>, json['live_fans_wearing'] as Map<String, dynamic>,
), ),
spaceTag: (json['space_tag'] as List<dynamic>?) spaceTag: (json['space_tag'] as List<dynamic>?)
?.where((e) => (e?['title'] as String?)?.startsWith('IP') == true) ?.where((e) => const ['location', 'real_name'].contains(e['type']))
.map((e) => SpaceTag.fromJson(e as Map<String, dynamic>)) .map((e) => SpaceTag.fromJson(e as Map<String, dynamic>))
.toList(), .toList(),
faceNftNew: json['face_nft_new'] as int?, faceNftNew: json['face_nft_new'] as int?,

View File

@@ -0,0 +1,20 @@
import 'package:PiliPlus/models_new/user_real_name/reject_page.dart';
class UserRealNameData {
String? name;
String? namePrefix;
bool? show;
RejectPage? rejectPage;
UserRealNameData({this.name, this.namePrefix, this.show, this.rejectPage});
factory UserRealNameData.fromJson(Map<String, dynamic> json) =>
UserRealNameData(
name: json['name'] as String?,
namePrefix: json['name_prefix'] as String?,
show: json['show'] as bool?,
rejectPage: json['reject_page'] == null
? null
: RejectPage.fromJson(json['reject_page'] as Map<String, dynamic>),
);
}

View File

@@ -0,0 +1,19 @@
class RejectPage {
String? title;
String? text;
String? img;
RejectPage({this.title, this.text, this.img});
factory RejectPage.fromJson(Map<String, dynamic> json) => RejectPage(
title: json['title'] as String?,
text: json['text'] as String?,
img: json['img'] as String?,
);
Map<String, dynamic> toJson() => {
'title': title,
'text': text,
'img': img,
};
}

View File

@@ -10,6 +10,7 @@ import 'package:PiliPlus/models_new/space/space/images.dart';
import 'package:PiliPlus/models_new/space/space/live.dart'; import 'package:PiliPlus/models_new/space/space/live.dart';
import 'package:PiliPlus/models_new/space/space/pr_info.dart'; import 'package:PiliPlus/models_new/space/space/pr_info.dart';
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/app_scheme.dart';
import 'package:PiliPlus/utils/context_ext.dart'; import 'package:PiliPlus/utils/context_ext.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart';
@@ -240,9 +241,9 @@ class UserInfoCard extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.only(left: 20, top: 6, right: 20), padding: const EdgeInsets.only(left: 20, top: 6, right: 20),
child: Wrap( child: Wrap(
spacing: 8, spacing: 10,
runSpacing: 8, runSpacing: 8,
crossAxisAlignment: WrapCrossAlignment.end, crossAxisAlignment: WrapCrossAlignment.center,
children: [ children: [
GestureDetector( GestureDetector(
onTap: () => Utils.copyText(card.mid.toString()), onTap: () => Utils.copyText(card.mid.toString()),
@@ -255,13 +256,23 @@ class UserInfoCard extends StatelessWidget {
), ),
), ),
...?card.spaceTag?.map( ...?card.spaceTag?.map(
(item) => Text( (item) {
item.title ?? '', final hasUri = item.uri?.isNotEmpty == true;
style: TextStyle( final child = Text(
fontSize: 12, item.title ?? '',
color: colorScheme.outline, style: TextStyle(
), fontSize: 12,
), color: hasUri ? colorScheme.secondary : colorScheme.outline,
),
);
if (hasUri) {
return GestureDetector(
onTap: () => PiliScheme.routePushFromUrl(item.uri!),
child: child,
);
}
return child;
},
), ),
], ],
), ),

View File

@@ -195,8 +195,8 @@ class _UgcIntroPanelState extends State<UgcIntroPanel> {
if (introController.enableAi) _aiBtn, if (introController.enableAi) _aiBtn,
], ],
), ),
if (videoDetail.argueInfo?.argueMsg?.isNotEmpty == true && if (introController.showArgueMsg &&
introController.showArgueMsg) ...[ videoDetail.argueInfo?.argueMsg?.isNotEmpty == true) ...[
const SizedBox(height: 2), const SizedBox(height: 2),
Text.rich( Text.rich(
TextSpan( TextSpan(

View File

@@ -11,6 +11,7 @@ import 'package:PiliPlus/pages/video/reply_reply/view.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/request_utils.dart';
import 'package:PiliPlus/utils/url_utils.dart'; import 'package:PiliPlus/utils/url_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:app_links/app_links.dart'; import 'package:app_links/app_links.dart';
@@ -102,6 +103,10 @@ abstract class PiliScheme {
// bilibili://space/12345678?frommodule=XX&h5awaken=random // bilibili://space/12345678?frommodule=XX&h5awaken=random
String? mid = uriDigitRegExp.firstMatch(path)?.group(1); String? mid = uriDigitRegExp.firstMatch(path)?.group(1);
if (mid != null) { if (mid != null) {
if (path.startsWith('/realname')) {
RequestUtils.showUserRealName(mid);
return true;
}
PageUtils.toDupNamed('/member?mid=$mid', off: off); PageUtils.toDupNamed('/member?mid=$mid', off: off);
return true; return true;
} }

View File

@@ -24,6 +24,7 @@ import 'package:PiliPlus/pages/group_panel/view.dart';
import 'package:PiliPlus/pages/later/controller.dart'; import 'package:PiliPlus/pages/later/controller.dart';
import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/context_ext.dart'; import 'package:PiliPlus/utils/context_ext.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_key.dart';
@@ -618,4 +619,28 @@ abstract class RequestUtils {
) )
..startCaptcha(registerData); ..startCaptcha(registerData);
} }
static Future<void> showUserRealName(String mid) async {
final res = await UserHttp.getUserRealName(mid);
if (res.isSuccess) {
final data = res.data;
final show = !data.name.isNullOrEmpty;
Get.dialog(
AlertDialog(
title: SelectableText(
show ? data.name! : data.rejectPage?.title ?? '',
),
content: show ? null : Text(data.rejectPage?.text ?? ''),
actions: [
TextButton(
onPressed: Get.back,
child: const Text('关闭'),
),
],
),
);
} else {
res.toast();
}
}
} }