فهرست منبع

创建VIP定制课方案

Steven 5 ماه پیش
والد
کامیت
f89eae5af8
15فایلهای تغییر یافته به همراه484 افزوده شده و 50 حذف شده
  1. 6 0
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 16 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h
  3. 33 3
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m
  4. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/LiveCourseGroup/MyLiveCourseGroupView.m
  5. 113 8
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Controller/MineVipProgramViewController.m
  6. 29 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Model/CoursePargramListModel.h
  7. 162 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Model/CoursePargramListModel.m
  8. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageLiveCourse/MinePageLiveCourseView.m
  9. 3 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VIPProgramCreate/MineVipProgramMainView.h
  10. 9 3
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VIPProgramCreate/MineVipProgramMainView.m
  11. 5 4
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VIPProgramCreate/MineVipProgramMainView.xib
  12. 41 20
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVIPCourseView.m
  13. 3 2
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVipProgramCell.h
  14. 46 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVipProgramCell.m
  15. 16 7
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVipProgramCell.xib

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

@@ -724,6 +724,7 @@
 		BC71DF2A2A8A0432003F165E /* KSWhiteboardRefreshView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC71DF272A8A0432003F165E /* KSWhiteboardRefreshView.xib */; };
 		BC71DF2B2A8A0432003F165E /* KSWhiteboardRefreshView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC71DF292A8A0432003F165E /* KSWhiteboardRefreshView.m */; };
 		BC71DF2E2A8A2233003F165E /* KSNewWhiteBoard.m in Sources */ = {isa = PBXBuildFile; fileRef = BC71DF2C2A8A2233003F165E /* KSNewWhiteBoard.m */; };
+		BC7354612CEDF05200C2B35C /* CoursePargramListModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7354602CEDF05200C2B35C /* CoursePargramListModel.m */; };
 		BC73A1F42809693F00FA8F6F /* EvaluateSortView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BC73A1F32809693F00FA8F6F /* EvaluateSortView.xib */; };
 		BC76146A280D4F670080FD1F /* HomeworkDetailModel.m in Sources */ = {isa = PBXBuildFile; fileRef = BC761468280D4F660080FD1F /* HomeworkDetailModel.m */; };
 		BC76146D280D571B0080FD1F /* HomeworkVideoView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC76146C280D571B0080FD1F /* HomeworkVideoView.m */; };
@@ -2402,6 +2403,8 @@
 		BC71DF292A8A0432003F165E /* KSWhiteboardRefreshView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSWhiteboardRefreshView.m; sourceTree = "<group>"; };
 		BC71DF2C2A8A2233003F165E /* KSNewWhiteBoard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KSNewWhiteBoard.m; sourceTree = "<group>"; };
 		BC71DF2D2A8A2233003F165E /* KSNewWhiteBoard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KSNewWhiteBoard.h; sourceTree = "<group>"; };
+		BC73545F2CEDF05200C2B35C /* CoursePargramListModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoursePargramListModel.h; sourceTree = "<group>"; };
+		BC7354602CEDF05200C2B35C /* CoursePargramListModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoursePargramListModel.m; sourceTree = "<group>"; };
 		BC73A1F32809693F00FA8F6F /* EvaluateSortView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EvaluateSortView.xib; sourceTree = "<group>"; };
 		BC761468280D4F660080FD1F /* HomeworkDetailModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeworkDetailModel.m; sourceTree = "<group>"; };
 		BC761469280D4F660080FD1F /* HomeworkDetailModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeworkDetailModel.h; sourceTree = "<group>"; };
@@ -3379,6 +3382,8 @@
 			children = (
 				BCA193BD282B9866004A585D /* MinePageGroupModel.h */,
 				BCA193BC282B9866004A585D /* MinePageGroupModel.m */,
+				BC73545F2CEDF05200C2B35C /* CoursePargramListModel.h */,
+				BC7354602CEDF05200C2B35C /* CoursePargramListModel.m */,
 			);
 			path = Model;
 			sourceTree = "<group>";
@@ -8757,6 +8762,7 @@
 				BC71DF002A89F470003F165E /* MainDisplayView.m in Sources */,
 				BCC408E62AFCE11900C60249 /* MusicPublicContentView.m in Sources */,
 				BC7CFFA92817E3BD00CAEB21 /* IncomeCountTopView.m in Sources */,
+				BC7354612CEDF05200C2B35C /* CoursePargramListModel.m in Sources */,
 				BC965AE82925D1D700AB90B0 /* ClassroomCoursewarePlayView.m in Sources */,
 				BCA353D82858B18100377661 /* StudentHomeworkList.m in Sources */,
 				BC433E622CE6F80E002870EC /* MinePageVipProgramCell.m in Sources */,

+ 16 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.h

@@ -1610,6 +1610,22 @@ NS_ASSUME_NONNULL_BEGIN
 /// @param faliure 失败
 + (void)teacherSubjectPriceSaveRequest:(NSString *)post courseType:(NSString *)courseType subjectName:(NSString *)subjectName subjectId:(NSString *)subjectId subjectPrice:(NSString *)subjectPrice courseMinutes:(NSString *)courseMinutes success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
 
+// /teacher-server/sysConfig/queryByParamNameList
+
+/// 查询课程时间配置参数
+/// @param get get
+/// @param parms 配置参数查询
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryConfigLimit:(NSString *)get parms:(NSString *)parms success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+// teacher/querySubject
+
+/// 查询老师声部
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryTeacherSubject:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure;
+
 #pragma mark ---- 我的课程组
 
 // courseGroup/myCourseGroup

+ 33 - 3
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSNetworkingManager.m

@@ -2927,8 +2927,8 @@
     NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-teacher/teacherSubjectPrice/list"];
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
     [parm setValue:courseType forKey:@"courseType"];
-    [parm setValue:@(page) forKey:@"page"];
-    [parm setValue:@(rows) forKey:@"rows"];
+//    [parm setValue:@(page) forKey:@"page"];
+//    [parm setValue:@(rows) forKey:@"rows"];
     
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
@@ -2941,7 +2941,7 @@
 /// @param success 成功
 /// @param faliure 失败
 + (void)teacherSubjectPriceDeleteRequest:(NSString *)post programId:(NSString *)programId success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
-    [self configRequestMethodJSON];
+    [self configRequestMethodForm];
     NSString *url = [NSString stringWithFormat:@"%@%@",hostURL, @"/api-teacher/teacherSubjectPrice/delete"];
     NSMutableDictionary *parm = [NSMutableDictionary dictionary];
     [parm setValue:programId forKey:@"id"];
@@ -2971,6 +2971,36 @@
     [self request:post andWithUrl:url and:parm success:success faliure:faliure];
 }
 
+// /teacher-server/sysConfig/queryByParamNameList
+
+/// 查询课程调整时间配置参数
+/// @param get get
+/// @param parms 配置参数查询
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryConfigLimit:(NSString *)get parms:(NSString *)parms success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    
+    [self configRequestHeader];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/sysConfig/queryByParamNameList"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [parm setValue:parms forKey:@"paramNames"];
+    [self request:get andWithUrl:url and:parm success:success faliure:faliure];
+}
+
+// teacher/querySubject
+
+/// 查询老师声部
+/// @param post post
+/// @param success 成功
+/// @param faliure 失败
++ (void)queryTeacherSubject:(NSString *)post success:(void(^)(NSDictionary *dic))success faliure:(void(^)(NSError *error))faliure {
+    
+    [self configRequestMethodJSON];
+    NSString *url = [NSString stringWithFormat:@"%@%@", hostURL, @"/api-teacher/teacher/querySubject"];
+    NSMutableDictionary *parm = [NSMutableDictionary dictionary];
+    [self request:post andWithUrl:url and:parm success:success faliure:faliure];
+}
+
 #pragma mark ---- 我的课程组
 
 // courseGroup/myCourseGroup

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Home/MyCourse/View/LiveCourseGroup/MyLiveCourseGroupView.m

@@ -45,7 +45,7 @@
     if (self) {
         self.backgroundColor = [UIColor clearColor];
         UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
-        layout.sectionInset = UIEdgeInsetsMake(12, 14, 12, 14);
+        layout.sectionInset = UIEdgeInsetsMake(0, 14, 12, 14);
         
         self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) collectionViewLayout:layout];
         self.collectionView.backgroundColor = [UIColor clearColor];

+ 113 - 8
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Controller/MineVipProgramViewController.m

@@ -15,6 +15,20 @@
 
 @property (nonatomic, strong) MineVipProgramMainView *settingView;
 
+@property (nonatomic, strong) NSMutableArray *subjectNames;
+
+@property (nonatomic, strong) NSMutableArray *subjectIds;
+
+@property (nonatomic, strong) NSMutableArray *timeArray;
+
+@property (nonatomic, strong) dispatch_group_t requestGroup;
+
+@property (nonatomic, assign) float feeNum;
+
+@property (nonatomic, assign) NSInteger minPrice;
+
+@property (nonatomic, assign) NSInteger maxPrice;
+
 @end
 
 @implementation MineVipProgramViewController
@@ -46,15 +60,95 @@
     }];
 }
 
+- (void)queryTeacherSubject {
+    
+    dispatch_group_enter(self.requestGroup);
+    [KSNetworkingManager queryTeacherSubject:KS_POST success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSArray *dataArray = [dic ks_arrayValueForKey:@"data"];
+            for (NSDictionary *parm in dataArray) {
+                [self.subjectIds addObject:[parm ks_stringValueForKey:@"id"]];
+                [self.subjectNames addObject:[parm ks_stringValueForKey:@"name"]];
+            }
+        }
+        else{
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        dispatch_group_leave(self.requestGroup);
+    } faliure:^(NSError * _Nonnull error) {
+        dispatch_group_leave(self.requestGroup);
+    }];
+}
 
-
-- (void)requestData {
-    [self.settingView configSubjectNameArray:@[@"长笛",@"口风琴",@"葫芦丝",@"长号"] subjectIds:@[@"1",@"2",@"3",@"4"] durationArray:@[@"25",@"45",@"60"] minPrice:200 maxPrice:500];
+- (void)requsetConfig {
+    
+    dispatch_group_enter(self.requestGroup);
+    [KSNetworkingManager queryConfigLimit:KS_GET parms:@"vip_course_times_setting,vip_course_service_fee" success:^(NSDictionary * _Nonnull dic) {
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            NSArray *result = [dic ks_arrayValueForKey:@"data"];
+            for (NSDictionary *parm in result) {
+                if ([[parm ks_stringValueForKey:@"paramName"] isEqualToString:@"vip_course_service_fee"]) { // fee
+                    self.feeNum = [parm ks_doubleValueForKey:@"paramValue"] / 100.0f;
+                    self.settingView.feeRate = self.feeNum;
+                }
+                else if ([[parm ks_stringValueForKey:@"paramName"] isEqualToString:@"vip_course_times_setting"]) { // 时间
+                    NSString *values = [parm ks_stringValueForKey:@"paramValue"];
+                    NSData *valueData = [values dataUsingEncoding:NSUTF8StringEncoding];
+                    if (![NSString isEmptyString:values]) {
+                        NSArray *valueArray = [NSJSONSerialization JSONObjectWithData:valueData options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
+                        if (valueArray) {
+                            for (NSDictionary *subParm in valueArray) {
+                                self.minPrice = [subParm ks_integerValueForKey:@"lowestPrice"];
+                                self.maxPrice = [subParm ks_intValueForKey:@"highestPrice"];
+                                [self.timeArray addObject:[subParm ks_stringValueForKey:@"courseMinutes"]];
+                            }
+                        }
+                    }
+                    else {
+                        [self configDefaultValue];
+                    }
+                }
+            }
+        }
+        else {
+            [self configDefaultValue];
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+        dispatch_group_leave(self.requestGroup);
+    } faliure:^(NSError * _Nonnull error) {
+        [self configDefaultValue];
+        dispatch_group_leave(self.requestGroup);
+    }];
 }
 
+- (void)configDefaultValue {
+    self.minPrice = 200.0f;
+    self.maxPrice = 500.0f;
+    self.timeArray = [NSMutableArray arrayWithArray:@[@"25"]];
+}
 
+- (void)requestData {
+    [LOADING_MANAGER showHUD];
+    self.subjectNames = [NSMutableArray array];
+    self.subjectIds = [NSMutableArray array];
+    self.timeArray = [NSMutableArray array];
+    
+    [self queryTeacherSubject];
+    [self requsetConfig];
+    dispatch_group_notify(self.requestGroup, dispatch_get_main_queue(), ^{
+        [LOADING_MANAGER removeHUD];
+        [self.settingView configSubjectNameArray:self.subjectNames subjectIds:self.subjectIds durationArray:self.timeArray minPrice:self.minPrice maxPrice:self.maxPrice];
+    });
+}
 
 
+#pragma mark ---- lazying
+- (dispatch_group_t)requestGroup {
+    if (!_requestGroup) {
+        _requestGroup = dispatch_group_create();
+    }
+    return _requestGroup;
+}
 - (MineVipProgramNavView *)navView {
     if (!_navView) {
         _navView = [MineVipProgramNavView sharedInstance];
@@ -70,16 +164,27 @@
     if (!_settingView) {
         _settingView = [MineVipProgramMainView sharedInstanace];
         MJWeakSelf;
-        [_settingView settingCallback:^(PROGRAM_SETTING type, NSString * _Nullable subjectId, NSString * _Nullable duration, NSString * _Nullable priceNum) {
-            [weakSelf submitProgram:type subjectId:subjectId duration:duration price:priceNum];
+        [_settingView settingCallback:^(PROGRAM_SETTING type, NSString * _Nullable subjectId, NSString * _Nullable subjectName, NSString * _Nullable duration, NSString * _Nullable priceNum) {
+            if (type == PROGRAM_SETTING_SURE) {
+                [weakSelf submitProgramWithSubjectId:subjectId subjectName:subjectName duration:duration price:priceNum];
+            }
         }];
-        
     }
     return _settingView;
 }
 
-- (void)submitProgram:(PROGRAM_SETTING)type subjectId:(NSString *)subjectId duration:(NSString *)duration price:(NSString *)price {
-    
+- (void)submitProgramWithSubjectId:(NSString *)subjectId subjectName:(NSString *)subjectName duration:(NSString *)duration price:(NSString *)price {
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager teacherSubjectPriceSaveRequest:KS_POST courseType:@"VIP" subjectName:subjectName subjectId:subjectId subjectPrice:price courseMinutes:duration success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [LOADING_MANAGER KSShowProgressMsg:@"创建成功" promptCompletion:^{
+                [self backAction];
+            }];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
 }
 
 /*

+ 29 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Model/CoursePargramListModel.h

@@ -0,0 +1,29 @@
+//
+//  CoursePargramListModel.h
+//
+//  Created by Steven  on 2024/11/20
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface CoursePargramListModel : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *createTime;
+@property (nonatomic, strong) NSString *internalBaseClassIdentifier;
+@property (nonatomic, strong) NSString *updateTime;
+@property (nonatomic, assign) double subjectPrice;
+@property (nonatomic, strong) NSString *subjectId;
+@property (nonatomic, strong) NSString *subjectName;
+@property (nonatomic, assign) double courseMinutes;
+@property (nonatomic, assign) double freeMinutes;
+@property (nonatomic, strong) NSString *teacherId;
+@property (nonatomic, strong) NSString *courseType;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 162 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/Model/CoursePargramListModel.m

@@ -0,0 +1,162 @@
+//
+//  CoursePargramListModel.m
+//
+//  Created by Steven  on 2024/11/20
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "CoursePargramListModel.h"
+
+
+NSString *const kCoursePargramListModelCreateTime = @"createTime";
+NSString *const kCoursePargramListModelId = @"id";
+NSString *const kCoursePargramListModelUpdateTime = @"updateTime";
+NSString *const kCoursePargramListModelSubjectPrice = @"subjectPrice";
+NSString *const kCoursePargramListModelSubjectId = @"subjectId";
+NSString *const kCoursePargramListModelSubjectName = @"subjectName";
+NSString *const kCoursePargramListModelCourseMinutes = @"courseMinutes";
+NSString *const kCoursePargramListModelFreeMinutes = @"freeMinutes";
+NSString *const kCoursePargramListModelTeacherId = @"teacherId";
+NSString *const kCoursePargramListModelCourseType = @"courseType";
+
+
+@interface CoursePargramListModel ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation CoursePargramListModel
+
+@synthesize createTime = _createTime;
+@synthesize internalBaseClassIdentifier = _internalBaseClassIdentifier;
+@synthesize updateTime = _updateTime;
+@synthesize subjectPrice = _subjectPrice;
+@synthesize subjectId = _subjectId;
+@synthesize subjectName = _subjectName;
+@synthesize courseMinutes = _courseMinutes;
+@synthesize freeMinutes = _freeMinutes;
+@synthesize teacherId = _teacherId;
+@synthesize courseType = _courseType;
+
+
++ (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.createTime = [self objectOrNilForKey:kCoursePargramListModelCreateTime fromDictionary:dict];
+            self.internalBaseClassIdentifier = [self objectOrNilForKey:kCoursePargramListModelId fromDictionary:dict];
+            self.updateTime = [self objectOrNilForKey:kCoursePargramListModelUpdateTime fromDictionary:dict];
+            self.subjectPrice = [[self objectOrNilForKey:kCoursePargramListModelSubjectPrice fromDictionary:dict] doubleValue];
+            self.subjectId = [self objectOrNilForKey:kCoursePargramListModelSubjectId fromDictionary:dict];
+            self.subjectName = [self objectOrNilForKey:kCoursePargramListModelSubjectName fromDictionary:dict];
+            self.courseMinutes = [[self objectOrNilForKey:kCoursePargramListModelCourseMinutes fromDictionary:dict] doubleValue];
+            self.freeMinutes = [[self objectOrNilForKey:kCoursePargramListModelFreeMinutes fromDictionary:dict] doubleValue];
+            self.teacherId = [self objectOrNilForKey:kCoursePargramListModelTeacherId fromDictionary:dict];
+            self.courseType = [self objectOrNilForKey:kCoursePargramListModelCourseType fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation
+{
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.createTime forKey:kCoursePargramListModelCreateTime];
+    [mutableDict setValue:self.internalBaseClassIdentifier forKey:kCoursePargramListModelId];
+    [mutableDict setValue:self.updateTime forKey:kCoursePargramListModelUpdateTime];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.subjectPrice] forKey:kCoursePargramListModelSubjectPrice];
+    [mutableDict setValue:self.subjectId forKey:kCoursePargramListModelSubjectId];
+    [mutableDict setValue:self.subjectName forKey:kCoursePargramListModelSubjectName];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.courseMinutes] forKey:kCoursePargramListModelCourseMinutes];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.freeMinutes] forKey:kCoursePargramListModelFreeMinutes];
+    [mutableDict setValue:self.teacherId forKey:kCoursePargramListModelTeacherId];
+    [mutableDict setValue:self.courseType forKey:kCoursePargramListModelCourseType];
+
+    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.createTime = [aDecoder decodeObjectForKey:kCoursePargramListModelCreateTime];
+    self.internalBaseClassIdentifier = [aDecoder decodeObjectForKey:kCoursePargramListModelId];
+    self.updateTime = [aDecoder decodeObjectForKey:kCoursePargramListModelUpdateTime];
+    self.subjectPrice = [aDecoder decodeDoubleForKey:kCoursePargramListModelSubjectPrice];
+    self.subjectId = [aDecoder decodeObjectForKey:kCoursePargramListModelSubjectId];
+    self.subjectName = [aDecoder decodeObjectForKey:kCoursePargramListModelSubjectName];
+    self.courseMinutes = [aDecoder decodeDoubleForKey:kCoursePargramListModelCourseMinutes];
+    self.freeMinutes = [aDecoder decodeDoubleForKey:kCoursePargramListModelFreeMinutes];
+    self.teacherId = [aDecoder decodeObjectForKey:kCoursePargramListModelTeacherId];
+    self.courseType = [aDecoder decodeObjectForKey:kCoursePargramListModelCourseType];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_createTime forKey:kCoursePargramListModelCreateTime];
+    [aCoder encodeObject:_internalBaseClassIdentifier forKey:kCoursePargramListModelId];
+    [aCoder encodeObject:_updateTime forKey:kCoursePargramListModelUpdateTime];
+    [aCoder encodeDouble:_subjectPrice forKey:kCoursePargramListModelSubjectPrice];
+    [aCoder encodeObject:_subjectId forKey:kCoursePargramListModelSubjectId];
+    [aCoder encodeObject:_subjectName forKey:kCoursePargramListModelSubjectName];
+    [aCoder encodeDouble:_courseMinutes forKey:kCoursePargramListModelCourseMinutes];
+    [aCoder encodeDouble:_freeMinutes forKey:kCoursePargramListModelFreeMinutes];
+    [aCoder encodeObject:_teacherId forKey:kCoursePargramListModelTeacherId];
+    [aCoder encodeObject:_courseType forKey:kCoursePargramListModelCourseType];
+}
+
+- (id)copyWithZone:(NSZone *)zone
+{
+    CoursePargramListModel *copy = [[CoursePargramListModel alloc] init];
+    
+    if (copy) {
+
+        copy.createTime = [self.createTime copyWithZone:zone];
+        copy.internalBaseClassIdentifier = [self.internalBaseClassIdentifier copyWithZone:zone];
+        copy.updateTime = [self.updateTime copyWithZone:zone];
+        copy.subjectPrice = self.subjectPrice;
+        copy.subjectId = [self.subjectId copyWithZone:zone];
+        copy.subjectName = [self.subjectName copyWithZone:zone];
+        copy.courseMinutes = self.courseMinutes;
+        copy.freeMinutes = self.freeMinutes;
+        copy.teacherId = [self.teacherId copyWithZone:zone];
+        copy.courseType = [self.courseType copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/MinePageLiveCourse/MinePageLiveCourseView.m

@@ -47,7 +47,7 @@
     if (self) {
         self.backgroundColor = HexRGB(0xf8f9fc);
         UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
-        layout.sectionInset = UIEdgeInsetsMake(12, 14, 12, 14);
+        layout.sectionInset = UIEdgeInsetsMake(0, 14, 12, 14);
         
         self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) collectionViewLayout:layout];
         self.collectionView.backgroundColor = HexRGB(0xf8f9fc);

+ 3 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VIPProgramCreate/MineVipProgramMainView.h

@@ -12,12 +12,14 @@ typedef NS_ENUM(NSInteger, PROGRAM_SETTING) {
     PROGRAM_SETTING_SURE,  // 确认
 };
 
-typedef void(^ProgramSettingCallback)(PROGRAM_SETTING type, NSString * _Nullable subjectId, NSString * _Nullable duration, NSString * _Nullable priceNum);
+typedef void(^ProgramSettingCallback)(PROGRAM_SETTING type, NSString * _Nullable subjectId, NSString * _Nullable subjectName,NSString * _Nullable duration, NSString * _Nullable priceNum);
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface MineVipProgramMainView : UIView
 
+@property (nonatomic, assign) double feeRate;
+
 + (instancetype)sharedInstanace;
 
 - (void)configSubjectNameArray:(NSArray *)subjectNameArray subjectIds:(NSArray *)subjectIdArray durationArray:(NSArray *)timesArray minPrice:(NSInteger)minPrice maxPrice:(NSInteger)maxPrice;

+ 9 - 3
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VIPProgramCreate/MineVipProgramMainView.m

@@ -9,6 +9,7 @@
 #import "ProgramAddButton.h"
 
 @interface MineVipProgramMainView ()<UITextFieldDelegate>
+@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
 
 @property (weak, nonatomic) IBOutlet UIView *subjectContainer;
 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *subjectContainerHeight;
@@ -22,6 +23,8 @@
 
 @property (nonatomic, strong) NSString *subjectId;
 
+@property (nonatomic, strong) NSString *subjectName;
+
 @property (nonatomic, strong) NSString *duration;
 
 @property (nonatomic, strong) NSString *price;
@@ -74,11 +77,13 @@
     
     CGFloat buttonWidth = ((KPortraitWidth - 14 * 2) - buttonLeft * 2 - buttonSpace * 2) / 3.0f;
     CGFloat buttonHeight = 26.0f;
-    CGFloat subjectColumn = self.subjectNameArray.count / 3 + self.subjectNameArray.count % 3;
+    NSInteger addSubjectRow = self.subjectNameArray.count % 3 > 0 ? 1 : 0;
+    CGFloat subjectColumn = self.subjectNameArray.count / 3 + addSubjectRow;
     CGFloat subjectViewHeight = buttonHeight * subjectColumn + buttonSpace * (subjectColumn - 1) + 12;
     self.subjectContainerHeight.constant = subjectViewHeight;
     
-    CGFloat durationColumn = self.timesArray.count / 3 + self.timesArray.count % 3;
+    NSInteger addTimeRow = self.timesArray.count % 3 > 0 ? 1 : 0;
+    CGFloat durationColumn = self.timesArray.count / 3 + addTimeRow;
     CGFloat durationViewHeight = buttonHeight * durationColumn + buttonSpace * (durationColumn - 1) + 12;
     self.durationContainerHeight.constant = durationViewHeight;
     // 声部设置
@@ -178,9 +183,10 @@
         return;
     }
     self.subjectId = self.subjectIdArray[self.subjectChooseIndex - 1000];
+    self.subjectName = self.subjectNameArray[self.subjectChooseIndex - 1000];
     self.duration = self.timesArray[self.durationChooseIndex - 2000];
     if (self.callback) {
-        self.callback(PROGRAM_SETTING_SURE, self.subjectId, self.duration, self.price);
+        self.callback(PROGRAM_SETTING_SURE, self.subjectId, self.subjectName,self.duration, self.price);
     }
 }
 

+ 5 - 4
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VIPProgramCreate/MineVipProgramMainView.xib

@@ -222,7 +222,7 @@
                                 <fragment content="您的课程预计收入为:单课时">
                                     <attributes>
                                         <color key="NSColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        <font key="NSFont" metaFont="system" size="14"/>
+                                        <font key="NSFont" size="14" name=".PingFangUITextSC-Regular"/>
                                         <font key="NSOriginalFont" metaFont="system" size="14"/>
                                         <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                     </attributes>
@@ -234,7 +234,7 @@
                                         <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                     </attributes>
                                 </fragment>
-                                <fragment content="224.00">
+                                <fragment content="0.00">
                                     <attributes>
                                         <color key="NSColor" red="1" green="0.30588235294117649" blue="0.098039215686274508" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                                         <font key="NSFont" size="14" name="PingFangSC-Semibold"/>
@@ -251,7 +251,7 @@
                                 <fragment content="元">
                                     <attributes>
                                         <color key="NSColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        <font key="NSFont" metaFont="system" size="14"/>
+                                        <font key="NSFont" size="14" name=".PingFangUITextSC-Regular"/>
                                         <font key="NSOriginalFont" metaFont="system" size="14"/>
                                         <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                     </attributes>
@@ -266,7 +266,7 @@
                                 <fragment content="节">
                                     <attributes>
                                         <color key="NSColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        <font key="NSFont" metaFont="system" size="14"/>
+                                        <font key="NSFont" size="14" name=".PingFangUITextSC-Regular"/>
                                         <font key="NSOriginalFont" metaFont="system" size="14"/>
                                         <paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
                                     </attributes>
@@ -379,6 +379,7 @@
             <connections>
                 <outlet property="durationContainer" destination="rxq-ZU-nkf" id="hl9-ZB-u7j"/>
                 <outlet property="durationContainerHeight" destination="ooA-7L-hHZ" id="ByT-lR-Val"/>
+                <outlet property="priceLabel" destination="Ob3-72-Iij" id="FCN-zb-51c"/>
                 <outlet property="priceTextField" destination="79J-f2-acm" id="PKK-S3-wXS"/>
                 <outlet property="subjectContainer" destination="4nG-HF-YhK" id="N9y-lr-HBR"/>
                 <outlet property="subjectContainerHeight" destination="yJD-Eb-G9D" id="zH7-mE-KHA"/>

+ 41 - 20
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVIPCourseView.m

@@ -10,6 +10,8 @@
 #import "MineCourseSettingView.h"
 #import "MinePageVipProgramCell.h"
 #import "MineVipProgramViewController.h"
+#import "CoursePargramListModel.h"
+#import "KSConfirmAlertView.h"
 
 @interface MinePageVIPCourseView ()<UITableViewDelegate,UITableViewDataSource>
 
@@ -60,15 +62,6 @@
             [weakSelf resetParamenter];
             [weakSelf requestData];
         }];
-        self.tableView.mj_footer = [KSGifRefreshFooter footerWithRefreshingBlock:^{
-            if (weakSelf.isLoadMore) {
-                weakSelf.pages += 1;
-                [weakSelf requestData];
-            }
-            else {
-                [weakSelf.tableView.mj_footer endRefreshingWithNoMoreData];
-            }
-        }];
     }
     return self;
 }
@@ -94,7 +87,6 @@
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         @strongObj(self);
         [self.tableView.mj_header endRefreshing];
-        [self.tableView.mj_footer endRefreshing];
     });
 }
 
@@ -102,14 +94,11 @@
     [KSNetworkingManager teacherSubjectPriceRequest:KS_POST courseType:@"VIP" page:self.pages rows:self.rows success:^(NSDictionary * _Nonnull dic) {
         [self endRefresh];
         if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
-            NSArray *sourceArray = [[dic ks_dictionaryValueForKey:@"data"] ks_arrayValueForKey:@"rows"];
-//            for (NSDictionary *parm in sourceArray) {
-//                VideoCourseModel *model = [[VideoCourseModel alloc] initWithDictionary:parm];
-//                [self.dataArray addObject:model];
-//            }
-//            if (sourceArray.count < self.rows) {
-//                self.isLoadMore = NO;
-//            }
+            NSArray *sourceArray = [dic ks_arrayValueForKey:@"data"];
+            for (NSDictionary *parm in sourceArray) {
+                CoursePargramListModel *model = [[CoursePargramListModel alloc] initWithDictionary:parm];
+                [self.dataArray addObject:model];
+            }
         }
         else {
             [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
@@ -218,18 +207,50 @@
 #pragma mark - UITableViewDataSource
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return self.dataArray.count;
-//    return 10;
 }
 
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
-    return 88.0f;
+    return 86.0f;
 }
 
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    CoursePargramListModel *model = self.dataArray[indexPath.row];
     MinePageVipProgramCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MinePageVipProgramCell"];
+    MJWeakSelf;
+    [cell configWithSource:model callback:^(NSString * _Nonnull programId) {
+        [weakSelf showAlert:programId];
+    }];
     return cell;
 }
 
+- (void)showAlert:(NSString *)programId {
+    KSConfirmAlertView *alert = [KSConfirmAlertView shareInstance];
+    [alert configWithTitle:@"提示" subTitle:@"确认删除该课程方案吗?"];
+    [alert configLeftTitle:@"取消" rightTitle:@"确认"];
+    MJWeakSelf;
+    [alert opreationSure:^{
+        [weakSelf removeProgram:programId];
+    } cancel:^{
+        
+    }];
+    [alert showAlert];
+}
+
+- (void)removeProgram:(NSString *)programId {
+    [LOADING_MANAGER showHUD];
+    [KSNetworkingManager teacherSubjectPriceDeleteRequest:KS_POST programId:programId success:^(NSDictionary * _Nonnull dic) {
+        [LOADING_MANAGER removeHUD];
+        if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
+            [self refreshAndRequestData];
+        }
+        else {
+            [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
+        }
+    } faliure:^(NSError * _Nonnull error) {
+        [LOADING_MANAGER removeHUD];
+    }];
+}
+
 #pragma mark ----- lazying
 - (UIView *)headView {
     if (!_headView) {

+ 3 - 2
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVipProgramCell.h

@@ -6,14 +6,15 @@
 //
 
 #import <UIKit/UIKit.h>
+#import "CoursePargramListModel.h"
 
-//typedef void(^editAction)(<#arguments#>);
+typedef void(^EditPragamAction)(NSString * _Nonnull programId);
 
 NS_ASSUME_NONNULL_BEGIN
 
 @interface MinePageVipProgramCell : UITableViewCell
 
-//@property (nonatomic, strong) 
+- (void)configWithSource:(CoursePargramListModel *)model callback:(EditPragamAction)callback;
 
 @end
 

+ 46 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVipProgramCell.m

@@ -7,6 +7,22 @@
 
 #import "MinePageVipProgramCell.h"
 
+@interface MinePageVipProgramCell ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *subjectImage;
+
+@property (weak, nonatomic) IBOutlet UILabel *programName;
+
+@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
+
+@property (weak, nonatomic) IBOutlet UILabel *durationLabel;
+
+@property (nonatomic, copy) EditPragamAction callback;
+
+@property (nonatomic, strong) CoursePargramListModel *sourceModel;
+
+@end
+
 @implementation MinePageVipProgramCell
 
 - (void)awakeFromNib {
@@ -15,6 +31,36 @@
     self.selectionStyle = UITableViewCellSelectionStyleNone;
 }
 
+- (void)configWithSource:(CoursePargramListModel *)model callback:(EditPragamAction)callback {
+    if (callback) {
+        self.callback = callback;
+    }
+    self.sourceModel = model;
+    NSString *courseType = @"";
+    if ([model.courseType isEqualToString:@"VIP"]) {
+        courseType = @"VIP定制课";
+    }
+    else {
+        courseType = @"趣纠课";
+    }
+    self.programName.text = [NSString stringWithFormat:@"%@%@", [NSString returnNoNullStringWithString:model.subjectName], courseType];
+    self.durationLabel.text = [NSString stringWithFormat:@"/%.0f分钟", model.courseMinutes];
+    self.priceLabel.text = [NSString stringWithFormat:@""];
+    
+    NSString *mountMsg = [NSString formatDoubleNum:model.subjectPrice];
+    NSString *descMsg = [NSString stringWithFormat:@"¥%@",mountMsg];
+    
+    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:descMsg attributes:@{NSFontAttributeName:[UIFont fontWithName:@"DIN Alternate Bold" size:14.0f],NSForegroundColorAttributeName:HexRGB(0xF44541)}];
+    [attr addAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"DIN Alternate Bold" size:18.0f]} range:[descMsg rangeOfString:mountMsg]];
+    self.priceLabel.attributedText = attr;
+}
+
+- (IBAction)deleteProgram:(id)sender {
+    if (self.callback) {
+        NSString *programId = self.sourceModel.internalBaseClassIdentifier;
+        self.callback(programId);
+    }
+}
 
 
 - (void)setSelected:(BOOL)selected animated:(BOOL)animated {

+ 16 - 7
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/MinePage/View/VipCourse/MinePageVipProgramCell.xib

@@ -10,17 +10,17 @@
         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="88" id="KGk-i7-Jjw" customClass="MinePageVipProgramCell">
-            <rect key="frame" x="0.0" y="0.0" width="320" height="88"/>
+            <rect key="frame" x="0.0" y="0.0" width="320" height="86"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
             <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
-                <rect key="frame" x="0.0" y="0.0" width="320" height="88"/>
+                <rect key="frame" x="0.0" y="0.0" width="320" height="86"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nbw-m5-dtr">
-                        <rect key="frame" x="14" y="0.0" width="292" height="76"/>
+                        <rect key="frame" x="14" y="0.0" width="292" height="74"/>
                         <subviews>
                             <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="lj2-cE-uvp">
-                                <rect key="frame" x="12" y="12" width="52" height="52"/>
+                                <rect key="frame" x="12" y="12" width="50" height="50"/>
                                 <constraints>
                                     <constraint firstAttribute="width" secondItem="lj2-cE-uvp" secondAttribute="height" id="W1n-Cs-zAF"/>
                                 </constraints>
@@ -31,7 +31,7 @@
                                 </userDefinedRuntimeAttributes>
                             </imageView>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="长笛VIP定制课" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="geC-8C-ZFK">
-                                <rect key="frame" x="74" y="12" width="173" height="21"/>
+                                <rect key="frame" x="72" y="12" width="175" height="21"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="21" id="Eku-Bp-WDg"/>
                                 </constraints>
@@ -63,9 +63,12 @@
                                     <constraint firstAttribute="width" constant="35" id="ZbS-4S-niS"/>
                                 </constraints>
                                 <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                <connections>
+                                    <action selector="deleteProgram:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="rwy-pb-wPy"/>
+                                </connections>
                             </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="¥ 100.00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nwI-CN-eRd">
-                                <rect key="frame" x="74" y="40" width="48" height="24"/>
+                                <rect key="frame" x="72" y="38" width="48" height="24"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="24" id="sS5-HV-SNL"/>
                                 </constraints>
@@ -74,7 +77,7 @@
                                 <nil key="highlightedColor"/>
                             </label>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="/25分钟" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hwq-i8-T3E">
-                                <rect key="frame" x="122" y="40" width="51" height="24"/>
+                                <rect key="frame" x="120" y="38" width="51" height="24"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="24" id="jYu-SH-8zG"/>
                                 </constraints>
@@ -115,6 +118,12 @@
                 </constraints>
             </tableViewCellContentView>
             <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <connections>
+                <outlet property="durationLabel" destination="hwq-i8-T3E" id="U7s-4V-TNK"/>
+                <outlet property="priceLabel" destination="nwI-CN-eRd" id="mfh-xQ-DRQ"/>
+                <outlet property="programName" destination="geC-8C-ZFK" id="7qz-Z9-uu8"/>
+                <outlet property="subjectImage" destination="lj2-cE-uvp" id="cps-mN-qoa"/>
+            </connections>
             <point key="canvasLocation" x="120.61068702290076" y="42.253521126760567"/>
         </tableViewCell>
     </objects>