Przeglądaj źródła

客服查询用户详情

Steven 11 miesięcy temu
rodzic
commit
b150b260a2
17 zmienionych plików z 415 dodań i 38 usunięć
  1. 6 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme
  3. 6 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m
  4. 19 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Controller/KSUserDetailViewController.m
  5. 33 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Model/UserDetailModel.h
  6. 198 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Model/UserDetailModel.m
  7. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.h
  8. 93 9
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.m
  9. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.xib
  10. 7 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupMemberViewController.m
  11. 15 12
      KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ChatAddressBodyView.m
  12. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserInfo.h
  13. 7 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserInfo.m
  14. 3 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserVip.h
  15. 15 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserVip.m
  16. 1 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Model/TeacherInfo.h
  17. 7 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Model/TeacherInfo.m

+ 6 - 0
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -535,6 +535,7 @@
 		BC42CAAF2BEC9CDA001F076E /* RhythmChooseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC42CAAA2BEC9CDA001F076E /* RhythmChooseView.xib */; };
 		BC42CAB02BEC9CDA001F076E /* RhythmView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC42CAAC2BEC9CDA001F076E /* RhythmView.m */; };
 		BC42CAB12BEC9CDA001F076E /* RhythmView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC42CAAD2BEC9CDA001F076E /* RhythmView.xib */; };
+		BC4823D12C4F5F30000E5401 /* UserDetailModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4823D02C4F5F30000E5401 /* UserDetailModel.m */; };
 		BC483231282A646A005F534C /* HomeRecentCourseView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC483230282A646A005F534C /* HomeRecentCourseView.m */; };
 		BC483233282A6473005F534C /* HomeRecentCourseView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC483232282A6473005F534C /* HomeRecentCourseView.xib */; };
 		BC48C3AE28292FB600EE65C5 /* ReceiveHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC48C3AD28292FB600EE65C5 /* ReceiveHeaderView.m */; };
@@ -2035,6 +2036,8 @@
 		BC42CAAB2BEC9CDA001F076E /* RhythmChooseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RhythmChooseView.h; sourceTree = "<group>"; };
 		BC42CAAC2BEC9CDA001F076E /* RhythmView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RhythmView.m; sourceTree = "<group>"; };
 		BC42CAAD2BEC9CDA001F076E /* RhythmView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RhythmView.xib; sourceTree = "<group>"; };
+		BC4823CF2C4F5F30000E5401 /* UserDetailModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserDetailModel.h; sourceTree = "<group>"; };
+		BC4823D02C4F5F30000E5401 /* UserDetailModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UserDetailModel.m; sourceTree = "<group>"; };
 		BC48322F282A646A005F534C /* HomeRecentCourseView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeRecentCourseView.h; sourceTree = "<group>"; };
 		BC483230282A646A005F534C /* HomeRecentCourseView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeRecentCourseView.m; sourceTree = "<group>"; };
 		BC483232282A6473005F534C /* HomeRecentCourseView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeRecentCourseView.xib; sourceTree = "<group>"; };
@@ -5352,6 +5355,8 @@
 		BC4217F32C4E3D0400C70B2F /* Model */ = {
 			isa = PBXGroup;
 			children = (
+				BC4823CF2C4F5F30000E5401 /* UserDetailModel.h */,
+				BC4823D02C4F5F30000E5401 /* UserDetailModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -8368,6 +8373,7 @@
 				BC71DF0B2A89F470003F165E /* TXMainToolView.m in Sources */,
 				BCC408D72AFCE0D700C60249 /* VideoCropImageViewCell.m in Sources */,
 				275E3DFA27F46B340010EC30 /* KSBeautySettingView.m in Sources */,
+				BC4823D12C4F5F30000E5401 /* UserDetailModel.m in Sources */,
 				BC41104528066EF200800BD9 /* EvaluateCourseBodyView.m in Sources */,
 				BC221FB428C82F0500F99802 /* MinePageSortView.m in Sources */,
 				BC84183B2AC2D83700D8F90E /* PasswordCheckViewController.m in Sources */,

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/xcshareddata/xcschemes/KulexiuForTeacher.xcscheme

@@ -52,7 +52,7 @@
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "TEST"
+      buildConfiguration = "DEV"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"

+ 6 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/TXCustom/KSTXBaseChatViewController.m

@@ -48,6 +48,7 @@
 
 #import <KSToolLibrary/RecordCheckManager.h>
 #import "KSPremissionAlert.h"
+#import "UserInfoManager.h"
 
 static UIView *gCustomTopView;
 
@@ -85,9 +86,11 @@ static UIView *gCustomTopView;
     if (userID == nil) {
         return;
     }
-    // 跳转到用户详情
-    BOOL isC2CChat = [NSString isEmptyString:self.conversationData.groupID] ? YES : NO;
-    [self displayUserInfo:userID isFromSingleChat:isC2CChat];
+    if (USER_MANAGER.userInfo.customerService) {
+        // 跳转到用户详情
+        BOOL isC2CChat = [NSString isEmptyString:self.conversationData.groupID] ? YES : NO;
+        [self displayUserInfo:userID isFromSingleChat:isC2CChat];
+    }
 }
 
 - (void)displayUserInfo:(NSString *)imUserId isFromSingleChat:(BOOL)fromSingleChat {

+ 19 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Controller/KSUserDetailViewController.m

@@ -19,6 +19,7 @@
 
 @property (nonatomic, strong) KSUserDetailBodyView *bodyView;
 
+@property (nonatomic, strong) UserDetailModel *sourceModel;
 @end
 
 @implementation KSUserDetailViewController
@@ -27,6 +28,7 @@
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     [self configUI];
+    [self requestData];
 }
 
 - (void)configUI {
@@ -77,6 +79,23 @@
     }];
 }
 
+
+- (void)requestData {
+    [KSNetworkingManager imUserFriendQueryDetail:KS_POST userId:self.imUserId success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSDictionary *result = [dic ks_dictionaryValueForKey:@"data"];
+            UserDetailModel *model = [[UserDetailModel alloc] initWithDictionary:result];
+            [self.bodyView configWithSource:model];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        
+    } faliure:^(NSError * _Nonnull error) {
+        
+    }];
+}
+
 - (void)chatAction {
     if (self.fromSingleChat) {
         [self backAction];

+ 33 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Model/UserDetailModel.h

@@ -0,0 +1,33 @@
+//
+//  UserDetailModel.h
+//
+//  Created by Steven  on 2024/7/23
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "UserVip.h"
+
+@interface UserDetailModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, strong) UserVip *userVip;
+@property (nonatomic, strong) NSString *friendNickname;
+@property (nonatomic, strong) NSString *memo;
+@property (nonatomic, strong) NSString *friendAvatar;
+@property (nonatomic, strong) NSString *roleType;
+@property (nonatomic, assign) double friendGender;
+@property (nonatomic, strong) NSString *friendBirthdate;
+@property (nonatomic, strong) NSString *userId;
+@property (nonatomic, strong) NSString *friendType;
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, strong) NSString *friendId;
+@property (nonatomic, strong) NSString *friendSubjectName;
+@property (nonatomic, strong) NSString *imFriendId;
+@property (nonatomic, strong) NSString *updateTime;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 198 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/Model/UserDetailModel.m

@@ -0,0 +1,198 @@
+//
+//  UserDetailModel.m
+//
+//  Created by Steven  on 2024/7/23
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "UserDetailModel.h"
+
+
+
+NSString *const kUserDetailModelId = @"id";
+NSString *const kUserDetailModelUserVip = @"userVip";
+NSString *const kUserDetailModelFriendNickname = @"friendNickname";
+NSString *const kUserDetailModelMemo = @"memo";
+NSString *const kUserDetailModelFriendAvatar = @"friendAvatar";
+NSString *const kUserDetailModelRoleType = @"roleType";
+NSString *const kUserDetailModelFriendGender = @"friendGender";
+NSString *const kUserDetailModelFriendBirthdate = @"friendBirthdate";
+NSString *const kUserDetailModelUserId = @"userId";
+NSString *const kUserDetailModelFriendType = @"friendType";
+NSString *const kUserDetailModelCreateTime = @"createTime";
+NSString *const kUserDetailModelFriendId = @"friendId";
+NSString *const kUserDetailModelFriendSubjectName = @"friendSubjectName";
+NSString *const kUserDetailModelImFriendId = @"imFriendId";
+NSString *const kUserDetailModelUpdateTime = @"updateTime";
+
+
+@interface UserDetailModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation UserDetailModel
+
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize userVip = _userVip;
+@synthesize friendNickname = _friendNickname;
+@synthesize memo = _memo;
+@synthesize friendAvatar = _friendAvatar;
+@synthesize roleType = _roleType;
+@synthesize friendGender = _friendGender;
+@synthesize friendBirthdate = _friendBirthdate;
+@synthesize userId = _userId;
+@synthesize friendType = _friendType;
+@synthesize createTime = _createTime;
+@synthesize friendId = _friendId;
+@synthesize friendSubjectName = _friendSubjectName;
+@synthesize imFriendId = _imFriendId;
+@synthesize updateTime = _updateTime;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
+{
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict
+{
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if(self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kUserDetailModelId fromDictionary:dict];
+            self.userVip = [UserVip modelObjectWithDictionary:[dict objectForKey:kUserDetailModelUserVip]];
+            self.friendNickname = [self objectOrNilForKey:kUserDetailModelFriendNickname fromDictionary:dict];
+            self.memo = [self objectOrNilForKey:kUserDetailModelMemo fromDictionary:dict];
+            self.friendAvatar = [self objectOrNilForKey:kUserDetailModelFriendAvatar fromDictionary:dict];
+            self.roleType = [self objectOrNilForKey:kUserDetailModelRoleType fromDictionary:dict];
+            self.friendGender = [[self objectOrNilForKey:kUserDetailModelFriendGender fromDictionary:dict] doubleValue];
+            self.friendBirthdate = [self objectOrNilForKey:kUserDetailModelFriendBirthdate fromDictionary:dict];
+            self.userId = [self objectOrNilForKey:kUserDetailModelUserId fromDictionary:dict];
+            self.friendType = [self objectOrNilForKey:kUserDetailModelFriendType fromDictionary:dict];
+            self.createTime = [self objectOrNilForKey:kUserDetailModelCreateTime fromDictionary:dict];
+            self.friendId = [self objectOrNilForKey:kUserDetailModelFriendId fromDictionary:dict];
+            self.friendSubjectName = [self objectOrNilForKey:kUserDetailModelFriendSubjectName fromDictionary:dict];
+            self.imFriendId = [self objectOrNilForKey:kUserDetailModelImFriendId fromDictionary:dict];
+            self.updateTime = [self objectOrNilForKey:kUserDetailModelUpdateTime fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kUserDetailModelId];
+    [mutableDict setValue:[self.userVip dictionaryRepresentation] forKey:kUserDetailModelUserVip];
+    [mutableDict setValue:self.friendNickname forKey:kUserDetailModelFriendNickname];
+    [mutableDict setValue:self.memo forKey:kUserDetailModelMemo];
+    [mutableDict setValue:self.friendAvatar forKey:kUserDetailModelFriendAvatar];
+    [mutableDict setValue:self.roleType forKey:kUserDetailModelRoleType];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.friendGender] forKey:kUserDetailModelFriendGender];
+    [mutableDict setValue:self.friendBirthdate forKey:kUserDetailModelFriendBirthdate];
+    [mutableDict setValue:self.userId forKey:kUserDetailModelUserId];
+    [mutableDict setValue:self.friendType forKey:kUserDetailModelFriendType];
+    [mutableDict setValue:self.createTime forKey:kUserDetailModelCreateTime];
+    [mutableDict setValue:self.friendId forKey:kUserDetailModelFriendId];
+    [mutableDict setValue:self.friendSubjectName forKey:kUserDetailModelFriendSubjectName];
+    [mutableDict setValue:self.imFriendId forKey:kUserDetailModelImFriendId];
+    [mutableDict setValue:self.updateTime forKey:kUserDetailModelUpdateTime];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description
+{
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict
+{
+    id object = [dict objectForKey:aKey];
+    if ([object isKindOfClass:[NSNumber class]]) {
+        NSNumber *number = object;
+        object = [number stringValue];
+    }
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+    self = [super init];
+
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kUserDetailModelId];
+    self.userVip = [aDecoder decodeObjectForKey:kUserDetailModelUserVip];
+    self.friendNickname = [aDecoder decodeObjectForKey:kUserDetailModelFriendNickname];
+    self.memo = [aDecoder decodeObjectForKey:kUserDetailModelMemo];
+    self.friendAvatar = [aDecoder decodeObjectForKey:kUserDetailModelFriendAvatar];
+    self.roleType = [aDecoder decodeObjectForKey:kUserDetailModelRoleType];
+    self.friendGender = [aDecoder decodeDoubleForKey:kUserDetailModelFriendGender];
+    self.friendBirthdate = [aDecoder decodeObjectForKey:kUserDetailModelFriendBirthdate];
+    self.userId = [aDecoder decodeObjectForKey:kUserDetailModelUserId];
+    self.friendType = [aDecoder decodeObjectForKey:kUserDetailModelFriendType];
+    self.createTime = [aDecoder decodeObjectForKey:kUserDetailModelCreateTime];
+    self.friendId = [aDecoder decodeObjectForKey:kUserDetailModelFriendId];
+    self.friendSubjectName = [aDecoder decodeObjectForKey:kUserDetailModelFriendSubjectName];
+    self.imFriendId = [aDecoder decodeObjectForKey:kUserDetailModelImFriendId];
+    self.updateTime = [aDecoder decodeObjectForKey:kUserDetailModelUpdateTime];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kUserDetailModelId];
+    [aCoder encodeObject:_userVip forKey:kUserDetailModelUserVip];
+    [aCoder encodeObject:_friendNickname forKey:kUserDetailModelFriendNickname];
+    [aCoder encodeObject:_memo forKey:kUserDetailModelMemo];
+    [aCoder encodeObject:_friendAvatar forKey:kUserDetailModelFriendAvatar];
+    [aCoder encodeObject:_roleType forKey:kUserDetailModelRoleType];
+    [aCoder encodeDouble:_friendGender forKey:kUserDetailModelFriendGender];
+    [aCoder encodeObject:_friendBirthdate forKey:kUserDetailModelFriendBirthdate];
+    [aCoder encodeObject:_userId forKey:kUserDetailModelUserId];
+    [aCoder encodeObject:_friendType forKey:kUserDetailModelFriendType];
+    [aCoder encodeObject:_createTime forKey:kUserDetailModelCreateTime];
+    [aCoder encodeObject:_friendId forKey:kUserDetailModelFriendId];
+    [aCoder encodeObject:_friendSubjectName forKey:kUserDetailModelFriendSubjectName];
+    [aCoder encodeObject:_imFriendId forKey:kUserDetailModelImFriendId];
+    [aCoder encodeObject:_updateTime forKey:kUserDetailModelUpdateTime];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    UserDetailModel *copy = [[UserDetailModel alloc] init];
+    
+    if (copy) {
+
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.userVip = [self.userVip copyWithZone:zone];
+        copy.friendNickname = [self.friendNickname copyWithZone:zone];
+        copy.memo = [self.memo copyWithZone:zone];
+        copy.friendAvatar = [self.friendAvatar copyWithZone:zone];
+        copy.roleType = [self.roleType copyWithZone:zone];
+        copy.friendGender = self.friendGender;
+        copy.friendBirthdate = [self.friendBirthdate copyWithZone:zone];
+        copy.userId = [self.userId copyWithZone:zone];
+        copy.friendType = [self.friendType copyWithZone:zone];
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.friendId = [self.friendId copyWithZone:zone];
+        copy.friendSubjectName = [self.friendSubjectName copyWithZone:zone];
+        copy.imFriendId = [self.imFriendId copyWithZone:zone];
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.h

@@ -6,6 +6,7 @@
 //
 
 #import <UIKit/UIKit.h>
+#import "UserDetailModel.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -13,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 + (instancetype)shareInstance;
 
-- (void)configWithSource;
+- (void)configWithSource:(UserDetailModel *)sourceModel;
 
 @end
 

+ 93 - 9
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.m

@@ -31,12 +31,13 @@
 @property (weak, nonatomic) IBOutlet UIView *birthdayView;
 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *birthdayHeight;
 
+@property (nonatomic, strong) NSString *currentUserId;
+
 @end
 
 @implementation KSUserDetailBodyView
 - (void)awakeFromNib {
     [super awakeFromNib];
-    [self configWithSource];
 }
 
 + (instancetype)shareInstance {
@@ -44,24 +45,107 @@
     return view;
 }
 
-- (void)configWithSource {
-    NSString *name = @"我的名字很长很长很长很长很…我的名字很长很长很长很长很…";
-    self.userName.text = name;
-    [self.roleTag setImage:[UIImage imageNamed:@"user_tag_student"]];
+- (void)configWithSource:(UserDetailModel *)sourceModel {
+    self.currentUserId = sourceModel.friendId;
+    BOOL isTeacher = NO;
+    if ([sourceModel.friendType isEqualToString:@"TEACHER"]) {
+        isTeacher = YES;
+        self.birthdayView.hidden = YES;
+        self.birthdayHeight.constant = 0.0f;
+    }
+    else {
+        self.birthdayView.hidden = NO;
+        self.birthdayHeight.constant = 59.0f;
+        NSString *birthday = [[sourceModel.friendBirthdate componentsSeparatedByString:@" "] firstObject];
+        self.birthDay.text = [NSString returnNoNullStringWithString:birthday];
+        
+    }
+    self.userName.text = [NSString returnNoNullStringWithString:sourceModel.friendNickname];
+    NSString *roleTagImg = isTeacher ? @"user_tag_teacher" : @"user_tag_student";
+    [self.roleTag setImage:[UIImage imageNamed:roleTagImg]];
+    
     
     
-    NSString *subjectDesc = @"长笛、中音萨克斯、圆号、打击乐(键盘)、上低音号";
+    NSString *subjectDesc = [NSString returnNoNullStringWithString:sourceModel.friendSubjectName];
     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
     [paragraphStyle setLineSpacing:4];//调整行间距
     paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
     NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:subjectDesc attributes:@{NSParagraphStyleAttributeName:paragraphStyle,NSFontAttributeName:[UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium],NSForegroundColorAttributeName:HexRGB(0x131415)}];
     self.subjectLabel.attributedText = attrStr;
+    
+    NSString *sexDesc = sourceModel.friendGender == 1 ? @"男" : @"女";
+    self.sexLabel.text = sexDesc;
+    
+    self.userIdDesc.text = [NSString returnNoNullStringWithString:self.currentUserId];
+    
+    
+    NSMutableDictionary *svipParm = [self queryVipType:sourceModel.userVip isSvip:YES];
+    BOOL isSvipLight = [svipParm ks_boolValueForKey:@"isLight"];
+    NSString *sViperImage = isSvipLight ? @"mineCenter_tagSvip" : @"mineCenter_tagSvipExpired";
+    [self.svipTag setImage:[UIImage imageNamed:sViperImage]];
+    self.svipDesc.text = [svipParm ks_stringValueForKey:@"desc"];
+    self.svipDesc.textColor = isSvipLight ? HexRGB(0xFF623A) : HexRGB(0xAAAAAA);
+    
+    
+    NSMutableDictionary *vipParm = [self queryVipType:sourceModel.userVip isSvip:NO];
+    BOOL isVipLight = [vipParm ks_boolValueForKey:@"isLight"];
+    NSString *viperImage = isVipLight ? @"mineCenter_tagSvip" : @"mineCenter_tagVipExpired";
+    [self.viptag setImage:[UIImage imageNamed:viperImage]];
+    self.vipDesc.text = [vipParm ks_stringValueForKey:@"desc"];
+    self.vipDesc.textColor = isVipLight ? HexRGB(0xFF623A) : HexRGB(0xAAAAAA);
+}
+
+- (NSMutableDictionary *)queryVipType:(UserVip *)userVip isSvip:(BOOL)isSvip {
+    BOOL isLight = NO;
+    NSString *desc = @"";
+    if (isSvip) {
+        if ([userVip.vipType isEqualToString:@"PERMANENT_SVIP"]) {
+            isLight = YES;
+            desc = @"永久有效";
+        }
+        else if ([userVip.vipType isEqualToString:@"SVIP"]) {
+            isLight = YES;
+            desc = [NSString stringWithFormat:@"剩余%zd天",userVip.svipEndDays];
+        }
+        else {
+            isLight = NO;
+            if (userVip.svipExpireDays > 0) {
+                desc = [NSString stringWithFormat:@"已过期%zd天",userVip.svipExpireDays];
+            }
+            else {
+                desc = @"暂未开通";
+            }
+        }
+    }
+    else {
+        if (userVip.vipEndDays > 0) {
+            isLight = YES;
+            desc = [NSString stringWithFormat:@"剩余%zd天",userVip.vipEndDays];
+        }
+        else {
+            isLight = NO;
+            if (userVip.vipExpireDays > 0) {
+                desc = [NSString stringWithFormat:@"已过期%zd天",userVip.vipExpireDays];
+            }
+            else {
+                desc = @"暂未开通";
+            }
+        }
+    }
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:@(isLight) forKey:@"isLight"];
+    [parm setValue:desc forKey:@"desc"];
+    return parm;
 }
 
+
+
 - (IBAction)copyAction:(id)sender {
-    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
-    pasteboard.string = @"123144";
-    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"复制成功"];
+    if (![NSString isEmptyString:self.currentUserId]) {
+        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
+        pasteboard.string = [NSString returnNoNullStringWithString:self.currentUserId];
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"复制成功"];
+    }
 }
 
 /*

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Controller/UserDetail/View/KSUserDetailBodyView.xib

@@ -155,7 +155,7 @@
                                         <constraint firstAttribute="height" constant="22" id="Mff-yR-PhF"/>
                                     </constraints>
                                     <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
-                                    <color key="textColor" red="1" green="0.4745057225" blue="0.28870391849999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                    <color key="textColor" red="0.074509803921568626" green="0.078431372549019607" blue="0.082352941176470587" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                     <nil key="highlightedColor"/>
                                 </label>
                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="复制" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3Vr-QF-h65">

+ 7 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/Group/Controller/GroupMemberViewController.m

@@ -12,6 +12,7 @@
 #import "GroupMemberModel.h"
 #import "KSChatConversationViewController.h"
 #import "KSUserDetailViewController.h"
+#import "UserInfoManager.h"
 
 @interface GroupMemberViewController ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -159,10 +160,12 @@
 }
 
 - (void)showUserDetail:(NSString *)targetId {
-    KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
-    ctrl.imUserId = targetId;
-    ctrl.fromSingleChat = NO;
-    [self.navigationController pushViewController:ctrl animated:YES];
+    if (USER_MANAGER.userInfo.customerService) {
+        KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
+        ctrl.imUserId = targetId;
+        ctrl.fromSingleChat = NO;
+        [self.navigationController pushViewController:ctrl animated:YES];
+    }
 }
 
 - (void)chatUser:(NSString *)targetId {

+ 15 - 12
KulexiuForTeacher/KulexiuForTeacher/Module/Chat/View/ChatAddressBodyView.m

@@ -19,6 +19,7 @@
 #import "KSChatListSearchView.h"
 #import <ImSDK_Plus/V2TIMManager.h>
 #import "KSUserDetailViewController.h"
+#import "UserInfoManager.h"
 
 @interface ChatAddressBodyView ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -382,19 +383,21 @@
 }
 
 - (void)chatUserDetail:(NSString *)imUserId {
-    KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
-    ctrl.imUserId = imUserId;
-    ctrl.fromSingleChat = NO;
-    [self.naviController pushViewController:ctrl animated:YES];
-    /*
-    if (_isShareImage) { // 分享
-        [self sendMessageWithTargetId:imUserId isGroup:NO];
-    }
-    else { // 聊天
-        [self chatConversationWithTargetId:imUserId targetName:@"" isGroup:NO];
-        
+    if ((USER_MANAGER.userInfo.customerService)) {
+        KSUserDetailViewController *ctrl = [[KSUserDetailViewController alloc] init];
+        ctrl.imUserId = imUserId;
+        ctrl.fromSingleChat = NO;
+        [self.naviController pushViewController:ctrl animated:YES];
+    }
+    else {
+        if (_isShareImage) { // 分享
+            [self sendMessageWithTargetId:imUserId isGroup:NO];
+        }
+        else { // 聊天
+            [self chatConversationWithTargetId:imUserId targetName:@"" isGroup:NO];
+            
+        }
     }
-     */
 }
 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserInfo.h

@@ -86,6 +86,7 @@
 
 @property (nonatomic, strong) UserVip *userVip;
 
+@property (nonatomic, assign) BOOL customerService;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;

+ 7 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserInfo.m

@@ -80,6 +80,7 @@ NSString *const kUserInfoEntryStatus = @"entryStatus";
 NSString *const kUserInfoImToken = @"imToken";
 NSString *const kUserInfoTenantAlbumStatus = @"tenantAlbumStatus";
 NSString *const kUserInfoUserVip = @"userVip";
+NSString *const kUserInfoUserCustomerService = @"customerService";
 
 
 @interface UserInfo ()
@@ -162,7 +163,7 @@ NSString *const kUserInfoUserVip = @"userVip";
 @synthesize imToken = _imToken;
 @synthesize tenantAlbumStatus = _tenantAlbumStatus;
 @synthesize userVip = _userVip;
-
+@synthesize customerService = _customerService;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -260,6 +261,7 @@ NSString *const kUserInfoUserVip = @"userVip";
         self.imToken = [self objectOrNilForKey:kUserInfoImToken fromDictionary:dict];
         self.tenantAlbumStatus = [[self objectOrNilForKey:kUserInfoTenantAlbumStatus fromDictionary:dict] integerValue];
         self.userVip = [UserVip modelObjectWithDictionary:[dict objectForKey:kUserInfoUserVip]];
+        self.customerService = [[self objectOrNilForKey:kUserInfoUserCustomerService fromDictionary:dict] boolValue];
     }
     
     return self;
@@ -351,7 +353,7 @@ NSString *const kUserInfoUserVip = @"userVip";
     [mutableDict setValue:self.imToken forKey:kUserInfoImToken];
     [mutableDict setValue:[NSNumber numberWithInteger:self.tenantAlbumStatus] forKey:kUserInfoTenantAlbumStatus];
     [mutableDict setValue:[self.userVip dictionaryRepresentation] forKey:kUserInfoUserVip];
-
+    [mutableDict setValue:[NSNumber numberWithBool:self.customerService] forKey:kUserInfoUserCustomerService];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -450,7 +452,7 @@ NSString *const kUserInfoUserVip = @"userVip";
     self.imToken = [aDecoder decodeObjectForKey:kUserInfoImToken];
     self.tenantAlbumStatus = [aDecoder decodeIntegerForKey:kUserInfoTenantAlbumStatus];
     self.userVip = [aDecoder decodeObjectForKey:kUserInfoUserVip];
-
+    self.customerService = [aDecoder decodeBoolForKey:kUserInfoUserCustomerService];
     return self;
 }
 
@@ -529,6 +531,7 @@ NSString *const kUserInfoUserVip = @"userVip";
     [aCoder encodeObject:_imToken forKey:kUserInfoImToken];
     [aCoder encodeInteger:_tenantAlbumStatus forKey:kUserInfoTenantAlbumStatus];
     [aCoder encodeObject:_userVip forKey:kUserInfoUserVip];
+    [aCoder encodeBool:_customerService forKey:kUserInfoUserCustomerService];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -609,6 +612,7 @@ NSString *const kUserInfoUserVip = @"userVip";
         copy.imToken = [self.imToken copyWithZone:zone];
         copy.tenantAlbumStatus = self.tenantAlbumStatus;
         copy.userVip = [self.userVip copyWithZone:zone];
+        copy.customerService = self.customerService;
     }
     
     return copy;

+ 3 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserVip.h

@@ -18,6 +18,9 @@
 @property (nonatomic, assign) NSInteger svipEndDays;
 @property (nonatomic, strong) NSString *vipEndDate;
 
+@property (nonatomic, assign) NSInteger vipExpireDays;
+@property (nonatomic, assign) NSInteger svipExpireDays;
+
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;
 - (NSDictionary *)dictionaryRepresentation;

+ 15 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Login/Model/UserVip.m

@@ -15,6 +15,8 @@ NSString *const kUserVipVipEndDays = @"vipEndDays";
 NSString *const kUserVipSvipEndDays = @"svipEndDays";
 NSString *const kUserVipVipEndDate = @"vipEndDate";
 
+NSString *const kUserVipSvipExpireDays = @"svipExpireDays";
+NSString *const kUserVipVipExpireDays = @"vipExpireDays";
 
 @interface UserVip ()
 
@@ -30,7 +32,8 @@ NSString *const kUserVipVipEndDate = @"vipEndDate";
 @synthesize vipEndDays = _vipEndDays;
 @synthesize svipEndDays = _svipEndDays;
 @synthesize vipEndDate = _vipEndDate;
-
+@synthesize svipExpireDays = _svipExpireDays;
+@synthesize vipExpireDays = _vipExpireDays;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -50,7 +53,8 @@ NSString *const kUserVipVipEndDate = @"vipEndDate";
             self.vipEndDays = [[self objectOrNilForKey:kUserVipVipEndDays fromDictionary:dict] integerValue];
             self.svipEndDays = [[self objectOrNilForKey:kUserVipSvipEndDays fromDictionary:dict] integerValue];
             self.vipEndDate = [self objectOrNilForKey:kUserVipVipEndDate fromDictionary:dict];
-
+            self.svipExpireDays = [[self objectOrNilForKey:kUserVipSvipExpireDays fromDictionary:dict] integerValue];
+            self.vipExpireDays = [[self objectOrNilForKey:kUserVipVipExpireDays fromDictionary:dict] integerValue];
     }
     
     return self;
@@ -66,7 +70,8 @@ NSString *const kUserVipVipEndDate = @"vipEndDate";
     [mutableDict setValue:[NSNumber numberWithInteger:self.vipEndDays] forKey:kUserVipVipEndDays];
     [mutableDict setValue:[NSNumber numberWithInteger:self.svipEndDays] forKey:kUserVipSvipEndDays];
     [mutableDict setValue:self.vipEndDate forKey:kUserVipVipEndDate];
-
+    [mutableDict setValue:[NSNumber numberWithInteger:self.svipExpireDays] forKey:kUserVipSvipExpireDays];
+    [mutableDict setValue:[NSNumber numberWithInteger:self.vipExpireDays] forKey:kUserVipVipExpireDays];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -99,6 +104,9 @@ NSString *const kUserVipVipEndDate = @"vipEndDate";
     self.vipEndDays = [aDecoder decodeIntegerForKey:kUserVipVipEndDays];
     self.svipEndDays = [aDecoder decodeIntegerForKey:kUserVipSvipEndDays];
     self.vipEndDate = [aDecoder decodeObjectForKey:kUserVipVipEndDate];
+    self.svipExpireDays = [aDecoder decodeIntegerForKey:kUserVipSvipExpireDays];
+    self.vipExpireDays = [aDecoder decodeIntegerForKey:kUserVipVipExpireDays];
+    
     return self;
 }
 
@@ -111,6 +119,8 @@ NSString *const kUserVipVipEndDate = @"vipEndDate";
     [aCoder encodeInteger:_vipEndDays forKey:kUserVipVipEndDays];
     [aCoder encodeInteger:_svipEndDays forKey:kUserVipSvipEndDays];
     [aCoder encodeObject:_vipEndDate forKey:kUserVipVipEndDate];
+    [aCoder encodeInteger:_svipExpireDays forKey:kUserVipSvipExpireDays];
+    [aCoder encodeInteger:_vipExpireDays forKey:kUserVipVipExpireDays];
 }
 
 - (id)copyWithZone:(NSZone *)zone
@@ -125,6 +135,8 @@ NSString *const kUserVipVipEndDate = @"vipEndDate";
         copy.vipEndDays = self.vipEndDays;
         copy.svipEndDays = self.svipEndDays;
         copy.vipEndDate = [self.vipEndDate copyWithZone:zone];
+        copy.svipExpireDays = self.svipExpireDays;
+        copy.vipExpireDays = self.vipExpireDays;
     }
     
     return copy;

+ 1 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Model/TeacherInfo.h

@@ -61,6 +61,7 @@
 @property (nonatomic, strong) NSString *defaultSubjectName;
 
 @property (nonatomic, strong) UserVip *userVip;
+@property (nonatomic, assign) BOOL customerService;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
 - (instancetype)initWithDictionary:(NSDictionary *)dict;

+ 7 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Model/TeacherInfo.m

@@ -52,7 +52,7 @@ NSString *const kTeacherInfoIsSettlement = @"isSettlement";
 NSString *const kTeacherInfoDefaultSubject = @"defaultSubject";
 NSString *const kTeacherInfoDefaultSubjectName = @"defaultSubjectName";
 NSString *const kTeacherInfoUserVip = @"userVip";
-
+NSString *const kTeacherInfoCustomerService = @"customerService";
 
 @interface TeacherInfo ()
 
@@ -106,6 +106,7 @@ NSString *const kTeacherInfoUserVip = @"userVip";
 @synthesize defaultSubject = _defaultSubject;
 @synthesize defaultSubjectName = _defaultSubjectName;
 @synthesize userVip = _userVip;
+@synthesize customerService = _customerService;
 
 + (instancetype)modelObjectWithDictionary:(NSDictionary *)dict
 {
@@ -163,6 +164,7 @@ NSString *const kTeacherInfoUserVip = @"userVip";
         self.defaultSubject = [self objectOrNilForKey:kTeacherInfoDefaultSubject fromDictionary:dict];
         self.defaultSubjectName = [self objectOrNilForKey:kTeacherInfoDefaultSubjectName fromDictionary:dict];
         self.userVip = [UserVip modelObjectWithDictionary:[dict objectForKey:kTeacherInfoUserVip]];
+        self.customerService = [[self objectOrNilForKey:kTeacherInfoCustomerService fromDictionary:dict] boolValue];
     }
     
     return self;
@@ -216,6 +218,7 @@ NSString *const kTeacherInfoUserVip = @"userVip";
     [mutableDict setValue:self.defaultSubject forKey:kTeacherInfoDefaultSubject];
     [mutableDict setValue:self.defaultSubjectName forKey:kTeacherInfoDefaultSubjectName];
     [mutableDict setValue:[self.userVip dictionaryRepresentation] forKey:kTeacherInfoUserVip];
+    [mutableDict setValue:[NSNumber numberWithBool:self.customerService] forKey:kTeacherInfoCustomerService];
     return [NSDictionary dictionaryWithDictionary:mutableDict];
 }
 
@@ -286,6 +289,7 @@ NSString *const kTeacherInfoUserVip = @"userVip";
     self.defaultSubject = [aDecoder decodeObjectForKey:kTeacherInfoDefaultSubject];
     self.defaultSubjectName = [aDecoder decodeObjectForKey:kTeacherInfoDefaultSubjectName];
     self.userVip = [aDecoder decodeObjectForKey:kTeacherInfoUserVip];
+    self.customerService = [aDecoder decodeBoolForKey:kTeacherInfoCustomerService];
     return self;
 }
 
@@ -336,6 +340,7 @@ NSString *const kTeacherInfoUserVip = @"userVip";
     [aCoder encodeObject:_defaultSubject forKey:kTeacherInfoDefaultSubject];
     [aCoder encodeObject:_defaultSubjectName forKey:kTeacherInfoDefaultSubjectName];
     [aCoder encodeObject:_userVip forKey:kTeacherInfoUserVip];
+    [aCoder encodeBool:_customerService forKey:kTeacherInfoCustomerService];
 
 }
 
@@ -389,6 +394,7 @@ NSString *const kTeacherInfoUserVip = @"userVip";
         copy.defaultSubject = [self.defaultSubject copyWithZone:zone];
         copy.defaultSubjectName = [self.defaultSubjectName copyWithZone:zone];
         copy.userVip = [self.userVip copyWithZone:zone];
+        copy.customerService = self.customerService;
     }
     return copy;
 }