From 9651ae7ad702631db1399394414f6bd54fff69a0 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Wed, 3 Dec 2025 20:14:14 +0800 Subject: [PATCH] 1 --- Shared/KBAPI.h | 1 + keyBoard/Class/Me/V/KBMyHeaderView.h | 5 ++++ keyBoard/Class/Me/V/KBMyHeaderView.m | 14 ++++++++++ keyBoard/Class/Me/VC/MyVC.m | 16 +++++++++++ keyBoard/Class/Me/VM/KBMyVM.h | 9 +++++++ keyBoard/Class/Me/VM/KBMyVM.m | 33 +++++++++++++++++++++++ keyBoard/Class/Network/KBNetworkManager.m | 3 ++- 7 files changed, 80 insertions(+), 1 deletion(-) diff --git a/Shared/KBAPI.h b/Shared/KBAPI.h index 604141a..29c5cc5 100644 --- a/Shared/KBAPI.h +++ b/Shared/KBAPI.h @@ -19,6 +19,7 @@ // 兼容旧命名(如有使用 API_APPLE_LOGIN 的位置,映射到统一命名) #define API_APPLE_LOGIN @"/user/appleLogin" // Apple 登录 #define API_LOGOUT @"/user/logout" // 退出登录 +#define KB_API_USER_DETAIL @"/user/detail" // 用户详情 #define KB_API_CHARACTER_LIST @"/character/list" // 排行榜角色列表(综合) #define KB_API_CHARACTER_LIST_BY_TAG @"/character/listByTag" // 根据 tagId 获取角色列表 #define KB_API_TAG_LIST @"/tag/list" // 排行榜标签列表 diff --git a/keyBoard/Class/Me/V/KBMyHeaderView.h b/keyBoard/Class/Me/V/KBMyHeaderView.h index 45c2fe4..1e8f43a 100644 --- a/keyBoard/Class/Me/V/KBMyHeaderView.h +++ b/keyBoard/Class/Me/V/KBMyHeaderView.h @@ -9,6 +9,8 @@ NS_ASSUME_NONNULL_BEGIN +@class KBUser; + @interface KBMyHeaderView : UIView @property (nonatomic, strong, readonly) UILabel *titleLabel; // “Settings” 标题 @property (nonatomic, strong, readonly) UIButton *keyboardBtn; // 右上角“ My Keyboard ”按钮 @@ -22,6 +24,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy) void (^onAvatarTapped)(void); @property (nonatomic, copy) void (^onLeftCardTapped)(void); @property (nonatomic, copy) void (^onRightCardTapped)(void); + +/// 使用用户模型更新头像与昵称 +- (void)configureWithUser:(KBUser *)user; @end NS_ASSUME_NONNULL_END diff --git a/keyBoard/Class/Me/V/KBMyHeaderView.m b/keyBoard/Class/Me/V/KBMyHeaderView.m index 3ed58fa..f3db9ac 100644 --- a/keyBoard/Class/Me/V/KBMyHeaderView.m +++ b/keyBoard/Class/Me/V/KBMyHeaderView.m @@ -10,6 +10,8 @@ #import "KBMyKeyBoardVC.h" #import "KBJfPay.h" #import "KBVipPay.h" +#import "UIImageView+KBWebImage.h" +#import "KBUser.h" @interface KBMyHeaderView () @property (nonatomic, strong) UILabel *titleLabel; @@ -87,6 +89,18 @@ self.avatarView.layer.masksToBounds = YES; } +- (void)configureWithUser:(KBUser *)user { + // 名称:优先昵称,兜底展示本地化的“Settings”或固定提示 + NSString *name = user.nickName; + if (name.length == 0) { + name = KBLocalized(@"Settings"); + } + self.nameLabel.text = name; + + // 头像:使用通用占位图 + [self.avatarView kb_setAvatarURL:user.avatarUrl placeholder:KBPlaceholderImage]; +} + + (void)kb_applyGradientTo:(UIView *)view colors:(NSArray *)colors { // 删除旧的渐变层,重复 setNeedsLayout 时避免叠加 NSMutableArray *remove = [NSMutableArray array]; diff --git a/keyBoard/Class/Me/VC/MyVC.m b/keyBoard/Class/Me/VC/MyVC.m index 30efa78..3b9cd2e 100644 --- a/keyBoard/Class/Me/VC/MyVC.m +++ b/keyBoard/Class/Me/VC/MyVC.m @@ -13,12 +13,14 @@ #import "KBTestVC.h" #import "KBNoticeVC.h" #import "KBFeedBackVC.h" +#import "KBMyVM.h" @interface MyVC () @property (nonatomic, strong) BaseTableView *tableView; // 列表 @property (nonatomic, strong) KBMyHeaderView *header; // 顶部视图 @property (nonatomic, strong) NSArray *> *data; // 分组数据 @property (nonatomic, strong) UIImageView *bgImageView; // 全屏背景图 +@property (nonatomic, strong) KBMyVM *viewModel; // 我的页面 VM @end @implementation MyVC @@ -59,6 +61,20 @@ self.tableView.tableHeaderView = self.header; } +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + // 每次进入“我的”页面时请求用户详情 + if (!self.viewModel) { + self.viewModel = [[KBMyVM alloc] init]; + } + __weak typeof(self) weakSelf = self; + [self.viewModel fetchUserDetailWithCompletion:^(KBUser * _Nullable user, NSError * _Nullable error) { + if (user) { + [weakSelf.header configureWithUser:user]; + } + }]; +} + // 系统导航栏的显隐由 BaseViewController 统一处理(始终隐藏),此处无需再设置。 #pragma mark - UITableView diff --git a/keyBoard/Class/Me/VM/KBMyVM.h b/keyBoard/Class/Me/VM/KBMyVM.h index 761ced9..9b17cb2 100644 --- a/keyBoard/Class/Me/VM/KBMyVM.h +++ b/keyBoard/Class/Me/VM/KBMyVM.h @@ -7,9 +7,18 @@ #import +@class KBUser; + NS_ASSUME_NONNULL_BEGIN +typedef void(^KBMyUserDetailCompletion)(KBUser *_Nullable user, NSError *_Nullable error); + @interface KBMyVM : NSObject + +/// 获取当前用户详情(/user/detail) +- (void)fetchUserDetailWithCompletion:(KBMyUserDetailCompletion)completion; + +/// 退出登录 - (void)logout; @end diff --git a/keyBoard/Class/Me/VM/KBMyVM.m b/keyBoard/Class/Me/VM/KBMyVM.m index adc3f86..94e7ba7 100644 --- a/keyBoard/Class/Me/VM/KBMyVM.m +++ b/keyBoard/Class/Me/VM/KBMyVM.m @@ -7,8 +7,41 @@ #import "KBMyVM.h" #import "AppDelegate.h" +#import "KBNetworkManager.h" +#import "KBUser.h" @implementation KBMyVM + +- (void)fetchUserDetailWithCompletion:(KBMyUserDetailCompletion)completion { + [KBHUD show]; + [[KBNetworkManager shared] GET:KB_API_USER_DETAIL + parameters:nil + headers:nil + autoShowBusinessError:NO + completion:^(NSDictionary *jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) { + [KBHUD dismiss]; + + if (error) { + NSString *msg = KBBizMessageFromJSONObject(jsonOrData) ?: error.localizedDescription ?: KBLocalized(@"Network error"); + [KBHUD showInfo:msg]; + if (completion) completion(nil, error); + return; + } + + id dataObj = jsonOrData[KBData] ?: jsonOrData[@"data"]; + if (![dataObj isKindOfClass:[NSDictionary class]]) { + NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain + code:KBNetworkErrorInvalidResponse + userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid response")}]; + [KBHUD showInfo:e.localizedDescription]; + if (completion) completion(nil, e); + return; + } + + KBUser *user = [KBUser mj_objectWithKeyValues:(NSDictionary *)dataObj]; + if (completion) completion(user, nil); + }]; +} - (void)logout{ [KBHUD show]; [[KBNetworkManager shared] GET:API_LOGOUT diff --git a/keyBoard/Class/Network/KBNetworkManager.m b/keyBoard/Class/Network/KBNetworkManager.m index 724d0c3..9dd4781 100644 --- a/keyBoard/Class/Network/KBNetworkManager.m +++ b/keyBoard/Class/Network/KBNetworkManager.m @@ -45,7 +45,8 @@ NSErrorDomain const KBNetworkErrorDomain = @"com.company.keyboard.network"; NSString *lang = [KBLocalizationManager shared].currentLanguageCode ?: KBLanguageCodeEnglish; _defaultHeaders = @{ @"Accept": @"*/*", - @"Accept-Language": lang + @"Accept-Language": lang, + @"auth-token" : @"" }; // 设置基础域名,路径可相对该地址拼接 _baseURL = [NSURL URLWithString:KB_BASE_URL];