From 9968883babdfe6fc6bf45d2b518da6014a33d2a6 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Thu, 25 Dec 2025 13:01:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=82=80=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared/KBAPI.h | 1 + .../Localization/en.lproj/Localizable.strings | 2 +- .../zh-Hans.lproj/Localizable.strings | 2 +- keyBoard.xcodeproj/project.pbxproj | 8 ++++++ keyBoard/Class/Me/M/KBInviteCodeModel.h | 20 +++++++++++++++ keyBoard/Class/Me/M/KBInviteCodeModel.m | 17 +++++++++++++ keyBoard/Class/Me/VC/MyVC.m | 2 +- keyBoard/Class/Me/VM/KBMyVM.h | 4 +++ keyBoard/Class/Me/VM/KBMyVM.m | 25 +++++++++++++++++++ 9 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 keyBoard/Class/Me/M/KBInviteCodeModel.h create mode 100644 keyBoard/Class/Me/M/KBInviteCodeModel.m diff --git a/Shared/KBAPI.h b/Shared/KBAPI.h index 6334536..6cf6769 100644 --- a/Shared/KBAPI.h +++ b/Shared/KBAPI.h @@ -32,6 +32,7 @@ #define API_UPDATA_INFO @"/user/updateInfo" // 更新用户 #define KB_API_USER_DETAIL @"/user/detail" // 用户详情 +#define API_USER_INVITE_CODE @"/user/inviteCode" // 查询邀请码 #define API_CHARACTER_LIST @"/character/list" // 排行榜角色列表(综合) #define API_NOT_LOGIN_CHARACTER_LIST @"/character/listWithNotLogin" //未登录用户人设列表 diff --git a/Shared/Localization/en.lproj/Localizable.strings b/Shared/Localization/en.lproj/Localizable.strings index 9b16799..284b68c 100644 --- a/Shared/Localization/en.lproj/Localizable.strings +++ b/Shared/Localization/en.lproj/Localizable.strings @@ -120,7 +120,7 @@ "Personal" = "Personal"; "My Keyboard" = "My Keyboard"; "Notice" = "Notice"; -"Share App" = "Share App"; +"invite" = "invite"; "Feedback" = "Feedback"; "E-mail" = "E-mail"; "Agreement" = "Agreement"; diff --git a/Shared/Localization/zh-Hans.lproj/Localizable.strings b/Shared/Localization/zh-Hans.lproj/Localizable.strings index 0f88bbe..4d33fc6 100644 --- a/Shared/Localization/zh-Hans.lproj/Localizable.strings +++ b/Shared/Localization/zh-Hans.lproj/Localizable.strings @@ -121,7 +121,7 @@ "Personal" = "个人"; "My Keyboard" = "我的键盘"; "Notice" = "通知"; -"Share App" = "分享app"; +"invite" = "邀请"; "Feedback" = "反馈"; "E-mail" = "联系我们"; "Agreement" = "协议"; diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index af13d2c..d4c165b 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -129,6 +129,8 @@ 0498BD8C2EE69E15006CC1D5 /* KBTagItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BD8A2EE69E15006CC1D5 /* KBTagItemModel.m */; }; 0498BD8F2EE6A3BD006CC1D5 /* KBMyMainModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BD8E2EE6A3BD006CC1D5 /* KBMyMainModel.m */; }; 0498BD902EE6A3BD006CC1D5 /* KBMyMainModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BD8E2EE6A3BD006CC1D5 /* KBMyMainModel.m */; }; + A1F0C1C22FABCDEF12345678 /* KBInviteCodeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A1F0C1C12FABCDEF12345678 /* KBInviteCodeModel.m */; }; + A1F0C1C32FABCDEF12345678 /* KBInviteCodeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A1F0C1C12FABCDEF12345678 /* KBInviteCodeModel.m */; }; 0498BDDA2EE7ECEA006CC1D5 /* WJXEventSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BDD82EE7ECEA006CC1D5 /* WJXEventSource.m */; }; 0498BDDE2EE81508006CC1D5 /* KBShopVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BDDD2EE81508006CC1D5 /* KBShopVM.m */; }; 0498BDE12EEA87C9006CC1D5 /* KBShopStyleModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BDE02EEA87C8006CC1D5 /* KBShopStyleModel.m */; }; @@ -455,6 +457,8 @@ 0498BD8A2EE69E15006CC1D5 /* KBTagItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBTagItemModel.m; sourceTree = ""; }; 0498BD8D2EE6A3BD006CC1D5 /* KBMyMainModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBMyMainModel.h; sourceTree = ""; }; 0498BD8E2EE6A3BD006CC1D5 /* KBMyMainModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBMyMainModel.m; sourceTree = ""; }; + A1F0C1C02FABCDEF12345678 /* KBInviteCodeModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBInviteCodeModel.h; sourceTree = ""; }; + A1F0C1C12FABCDEF12345678 /* KBInviteCodeModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBInviteCodeModel.m; sourceTree = ""; }; 0498BDD72EE7ECEA006CC1D5 /* WJXEventSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WJXEventSource.h; sourceTree = ""; }; 0498BDD82EE7ECEA006CC1D5 /* WJXEventSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WJXEventSource.m; sourceTree = ""; }; 0498BDDC2EE81508006CC1D5 /* KBShopVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBShopVM.h; sourceTree = ""; }; @@ -1342,6 +1346,8 @@ 0498BD8A2EE69E15006CC1D5 /* KBTagItemModel.m */, 0498BD8D2EE6A3BD006CC1D5 /* KBMyMainModel.h */, 0498BD8E2EE6A3BD006CC1D5 /* KBMyMainModel.m */, + A1F0C1C02FABCDEF12345678 /* KBInviteCodeModel.h */, + A1F0C1C12FABCDEF12345678 /* KBInviteCodeModel.m */, 7ECBD0E320F971D0FBEDD7BC /* KBMyTheme.h */, 180D662EC4DB3A7FFF83FF18 /* KBMyTheme.m */, A1F0C1A02F1234567890ABCD /* KBConsumptionRecord.h */, @@ -1941,6 +1947,7 @@ 04FC95672EB0546C007BD342 /* KBKey.m in Sources */, A1B2C3F42EB35A9900000001 /* KBFullAccessGuideView.m in Sources */, 0498BD8F2EE6A3BD006CC1D5 /* KBMyMainModel.m in Sources */, + A1F0C1C22FABCDEF12345678 /* KBInviteCodeModel.m in Sources */, 04FEDC222F00020000999999 /* KBKeyboardSubscriptionProduct.m in Sources */, 0450AA742EF013D000B6AF06 /* KBEmojiCollectionCell.m in Sources */, 550CB2630FA4A7B4B9782EFA /* KBMyTheme.m in Sources */, @@ -2004,6 +2011,7 @@ 04A9FE1B2EB892460020DB6D /* KBLocalizationManager.m in Sources */, 048908BC2EBE1FCB00FABA60 /* BaseViewController.m in Sources */, 0498BD902EE6A3BD006CC1D5 /* KBMyMainModel.m in Sources */, + A1F0C1C32FABCDEF12345678 /* KBInviteCodeModel.m in Sources */, 471CAD3574798685B72ADD55 /* KBMyTheme.m in Sources */, A1F0C1B12F1234567890ABCD /* KBConsumptionRecord.m in Sources */, A1F0C1B22F1234567890ABCD /* KBConsumptionRecordCell.m in Sources */, diff --git a/keyBoard/Class/Me/M/KBInviteCodeModel.h b/keyBoard/Class/Me/M/KBInviteCodeModel.h new file mode 100644 index 0000000..84f45e0 --- /dev/null +++ b/keyBoard/Class/Me/M/KBInviteCodeModel.h @@ -0,0 +1,20 @@ +// +// KBInviteCodeModel.h +// keyBoard +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// 邀请码信息 +@interface KBInviteCodeModel : NSObject +@property (nonatomic, copy, nullable) NSString *inviteCode; +@property (nonatomic, copy, nullable) NSString *h5Link; +@property (nonatomic, assign) NSInteger status; +@property (nonatomic, assign) NSInteger usedCount; +@property (nonatomic, strong, nullable) NSNumber *maxUses; +@property (nonatomic, copy, nullable) NSString *expiresAt; +@end + +NS_ASSUME_NONNULL_END diff --git a/keyBoard/Class/Me/M/KBInviteCodeModel.m b/keyBoard/Class/Me/M/KBInviteCodeModel.m new file mode 100644 index 0000000..80811d0 --- /dev/null +++ b/keyBoard/Class/Me/M/KBInviteCodeModel.m @@ -0,0 +1,17 @@ +// +// KBInviteCodeModel.m +// keyBoard +// + +#import "KBInviteCodeModel.h" +#import + +@implementation KBInviteCodeModel + ++ (NSDictionary *)mj_replacedKeyFromPropertyName { + return @{ + @"inviteCode": @"code" + }; +} + +@end diff --git a/keyBoard/Class/Me/VC/MyVC.m b/keyBoard/Class/Me/VC/MyVC.m index 022b14d..c4d35d9 100644 --- a/keyBoard/Class/Me/VC/MyVC.m +++ b/keyBoard/Class/Me/VC/MyVC.m @@ -43,7 +43,7 @@ self.data = @[ @[@{ @"title": KBLocalized(@"Consumption record"), @"icon": @"my_record_icon", @"color": @(0x60A3FF),@"id":@"8" }], @[@{ @"title": KBLocalized(@"Notice"), @"icon": @"my_notice_icon", @"color": @(0x60A3FF),@"id":@"1" }], - @[@{ @"title": KBLocalized(@"Share App"), @"icon": @"my_share_icon", @"color": @(0xF5A623),@"id":@"2" }], + @[@{ @"title": KBLocalized(@"invite"), @"icon": @"my_share_icon", @"color": @(0xF5A623),@"id":@"2" }], @[@{ @"title": KBLocalized(@"Feedback"), @"icon": @"my_feedback_icon", @"color": @(0xB06AFD),@"id":@"3" }, @{ @"title": KBLocalized(@"E-mail"), @"icon": @"my_email_icon", @"color": @(0xFF8A65),@"id":@"4" }, @{ @"title": KBLocalized(@"Agreement"), @"icon": @"my_agreement_icon", @"color": @(0x4CD964),@"id":@"5" }, diff --git a/keyBoard/Class/Me/VM/KBMyVM.h b/keyBoard/Class/Me/VM/KBMyVM.h index 25df2f6..f616723 100644 --- a/keyBoard/Class/Me/VM/KBMyVM.h +++ b/keyBoard/Class/Me/VM/KBMyVM.h @@ -9,6 +9,7 @@ #import "KBCharacter.h" #import "KBMyTheme.h" #import "KBConsumptionRecord.h" +#import "KBInviteCodeModel.h" @class KBUser; NS_ASSUME_NONNULL_BEGIN @@ -28,11 +29,14 @@ typedef void(^KBMyPurchasedThemesCompletion)(NSArray *_Nullable the typedef void(^KBDeleteThemesCompletion)(BOOL success, NSError *_Nullable error); typedef void(^KBSubmitFeedbackCompletion)(BOOL success, NSError *_Nullable error); typedef void(^KBMyPurchaseRecordCompletion)(NSArray *_Nullable records, NSError *_Nullable error); +typedef void(^KBMyInviteCodeCompletion)(KBInviteCodeModel *_Nullable inviteCode, NSError *_Nullable error); @interface KBMyVM : NSObject /// 获取当前用户详情(/user/detail) - (void)fetchUserDetailWithCompletion:(KBMyUserDetailCompletion)completion; +/// 查询邀请码(/user/inviteCode) +- (void)fetchInviteCodeWithCompletion:(KBMyInviteCodeCompletion)completion; /// 用户人设列表(/character/listByUser) - (void)fetchCharacterListByUserWithCompletion:(KBCharacterListCompletion)completion; diff --git a/keyBoard/Class/Me/VM/KBMyVM.m b/keyBoard/Class/Me/VM/KBMyVM.m index 102ea58..2cc7c15 100644 --- a/keyBoard/Class/Me/VM/KBMyVM.m +++ b/keyBoard/Class/Me/VM/KBMyVM.m @@ -51,6 +51,31 @@ NSString * const KBUserCharacterDeletedNotification = @"KBUserCharacterDeletedNo }]; } +- (void)fetchInviteCodeWithCompletion:(KBMyInviteCodeCompletion)completion { + [[KBNetworkManager shared] GET:API_USER_INVITE_CODE + parameters:nil + headers:nil + autoShowBusinessError:NO + completion:^(NSDictionary *jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) { + if (error) { + 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")}]; + if (completion) completion(nil, e); + return; + } + + KBInviteCodeModel *model = [KBInviteCodeModel mj_objectWithKeyValues:(NSDictionary *)dataObj]; + if (completion) completion(model, nil); + }]; +} + - (void)fetchCharacterListByUserWithCompletion:(KBCharacterListCompletion)completion{ [[KBNetworkManager shared] GET:KB_API_CHARACTER_LISTBYUSER parameters:nil