Browse Source

店铺信息

zwp 7 months ago
parent
commit
52468be7ab

+ 26 - 0
BuguLive.xcodeproj/project.pbxproj

@@ -592,6 +592,9 @@
 		347EA83D2E532A7C0068B4F6 /* MerchantLegalInfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA82C2E532A7C0068B4F6 /* MerchantLegalInfoView.m */; };
 		347EA83E2E532A7C0068B4F6 /* MerchantBusinessLicenseView.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA8242E532A7C0068B4F6 /* MerchantBusinessLicenseView.m */; };
 		347EA83F2E532A7C0068B4F6 /* MerchantBaseEnrollContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA8222E532A7C0068B4F6 /* MerchantBaseEnrollContentView.m */; };
+		347EA84D2E55D6240068B4F6 /* NetHttpsManager+Store.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA84C2E55D6240068B4F6 /* NetHttpsManager+Store.m */; };
+		347EA8522E56B7B30068B4F6 /* IndustryCategoryModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA8512E56B7B30068B4F6 /* IndustryCategoryModel.m */; };
+		347EA8552E56BD970068B4F6 /* CategoryPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 347EA8542E56BD970068B4F6 /* CategoryPickerView.m */; };
 		380034E328F6B365007C0FFC /* BGReadPackTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 380034CB28F6B365007C0FFC /* BGReadPackTableViewCell.xib */; };
 		380034E428F6B365007C0FFC /* BGRedPackResultList.m in Sources */ = {isa = PBXBuildFile; fileRef = 380034CC28F6B365007C0FFC /* BGRedPackResultList.m */; };
 		380034E528F6B365007C0FFC /* BGReadPackResultTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 380034CD28F6B365007C0FFC /* BGReadPackResultTableViewCell.xib */; };
@@ -3515,6 +3518,12 @@
 		347EA8302E532A7C0068B4F6 /* MerchantStoreInfoView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MerchantStoreInfoView.m; sourceTree = "<group>"; };
 		347EA8312E532A7C0068B4F6 /* NavigationBarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NavigationBarView.h; sourceTree = "<group>"; };
 		347EA8322E532A7C0068B4F6 /* NavigationBarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NavigationBarView.m; sourceTree = "<group>"; };
+		347EA84B2E55D6240068B4F6 /* NetHttpsManager+Store.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NetHttpsManager+Store.h"; sourceTree = "<group>"; };
+		347EA84C2E55D6240068B4F6 /* NetHttpsManager+Store.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NetHttpsManager+Store.m"; sourceTree = "<group>"; };
+		347EA8502E56B7B30068B4F6 /* IndustryCategoryModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IndustryCategoryModel.h; sourceTree = "<group>"; };
+		347EA8512E56B7B30068B4F6 /* IndustryCategoryModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IndustryCategoryModel.m; sourceTree = "<group>"; };
+		347EA8532E56BD970068B4F6 /* CategoryPickerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CategoryPickerView.h; sourceTree = "<group>"; };
+		347EA8542E56BD970068B4F6 /* CategoryPickerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CategoryPickerView.m; sourceTree = "<group>"; };
 		380034CB28F6B365007C0FFC /* BGReadPackTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BGReadPackTableViewCell.xib; sourceTree = "<group>"; };
 		380034CC28F6B365007C0FFC /* BGRedPackResultList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BGRedPackResultList.m; sourceTree = "<group>"; };
 		380034CD28F6B365007C0FFC /* BGReadPackResultTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BGReadPackResultTableViewCell.xib; sourceTree = "<group>"; };
@@ -9339,6 +9348,7 @@
 		347EA7BA2E531B490068B4F6 /* Store */ = {
 			isa = PBXGroup;
 			children = (
+				347EA84A2E55D5F10068B4F6 /* Model */,
 				347EA7CF2E531B720068B4F6 /* Base */,
 				347EA81B2E532A7C0068B4F6 /* MerchantEnrollViewController.h */,
 				347EA81C2E532A7C0068B4F6 /* MerchantEnrollViewController.m */,
@@ -9365,6 +9375,8 @@
 		347EA8332E532A7C0068B4F6 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				347EA8532E56BD970068B4F6 /* CategoryPickerView.h */,
+				347EA8542E56BD970068B4F6 /* CategoryPickerView.m */,
 				347EA81D2E532A7C0068B4F6 /* MerchantAdminSetupView.h */,
 				347EA81E2E532A7C0068B4F6 /* MerchantAdminSetupView.m */,
 				347EA81F2E532A7C0068B4F6 /* MerchantBankInfoView.h */,
@@ -9391,6 +9403,17 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		347EA84A2E55D5F10068B4F6 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				347EA8502E56B7B30068B4F6 /* IndustryCategoryModel.h */,
+				347EA8512E56B7B30068B4F6 /* IndustryCategoryModel.m */,
+				347EA84B2E55D6240068B4F6 /* NetHttpsManager+Store.h */,
+				347EA84C2E55D6240068B4F6 /* NetHttpsManager+Store.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
 		380034CA28F6B365007C0FFC /* RedPack */ = {
 			isa = PBXGroup;
 			children = (
@@ -16738,6 +16761,7 @@
 				C1C7EC7624C185520020AAF4 /* MGShopView.m in Sources */,
 				492F50371F0E50DA00A3D51F /* ULGView.m in Sources */,
 				3860D97A28AF788C001B4FE2 /* BogoCommodityDetailModel.m in Sources */,
+				347EA8552E56BD970068B4F6 /* CategoryPickerView.m in Sources */,
 				3882999E28801CF900C8A9C3 /* XYColor+UIColor.m in Sources */,
 				04E8A0E31E77911F0072C471 /* MessageView.m in Sources */,
 				3860D93A28AF788C001B4FE2 /* BogoOrderManageViewController.m in Sources */,
@@ -17191,6 +17215,7 @@
 				493E48971F5555ED00416FFD /* PublishLiveShareView.m in Sources */,
 				38649DA428F29ADE00DB3C98 /* RoomUserListCell.m in Sources */,
 				C16AFDBB26EC598700858276 /* BogoYounthModePopView.m in Sources */,
+				347EA84D2E55D6240068B4F6 /* NetHttpsManager+Store.m in Sources */,
 				9165DEF32BAAC9BC00FA24A5 /* FDUMengPushModel.m in Sources */,
 				C13AA7F2246A4BAA003AB2A2 /* TWMessageBarManager.m in Sources */,
 				4938800C1F3D8EFD00C4D0A7 /* STTableRewardCell.m in Sources */,
@@ -17835,6 +17860,7 @@
 				974651DD1EEF6EBB002E8D46 /* BGEditTCell.m in Sources */,
 				047E201E1EC1538D001B874D /* areaModel.m in Sources */,
 				047E221D1EC153BB001B874D /* PlayingCardView.m in Sources */,
+				347EA8522E56B7B30068B4F6 /* IndustryCategoryModel.m in Sources */,
 				047E1FF41EC1538C001B874D /* ConverDiamondsViewController.m in Sources */,
 				38649DFA28F2A57000DB3C98 /* CXSideButton.swift in Sources */,
 				917CD8722394F7CB0010D030 /* GuiZuRightsCollectCell.m in Sources */,

+ 4 - 1
BuguLive/Class/General/en.lproj/ASLocalized.strings

@@ -2775,7 +2775,6 @@ You can create your own guild or choose to join a guild";
 "店铺信息" = "Store Information";
 "店铺名称" = "Store Name";
 "请输入店铺名称" = "Please enter store name";
-"跳跳自营农场" = "Tiaotiao Self-operated Farm";
 "✓ 名称可使用" = "✓ Name available";
 "店铺Logo" = "Store Logo";
 "不大于10M的jpg或png格式的图片" = "JPG or PNG format image no larger than 10M";
@@ -2885,4 +2884,8 @@ You can create your own guild or choose to join a guild";
 "管理员信息:" = "Administrator Info:";
 "管理员姓名\n管理员电话" = "Administrator name\nAdministrator phone";
 "已准备好以上资料,立即入驻" = "I have prepared all materials, enroll now";
+"该类目保证金为: ¥%@,佣金比例为: %@。" = "Deposit for this category: ¥%@, commission rate: %@.";
+"✓ 已选 %@" = "✓ Selected %@";
+"店铺简介" = "Store Description";
+"请输入店铺简介" = "Please enter store description";
 

+ 4 - 1
BuguLive/Class/General/zh-Hans.lproj/ASLocalized.strings

@@ -3377,7 +3377,6 @@
 "店铺信息" = "店铺信息";
 "店铺名称" = "店铺名称";
 "请输入店铺名称" = "请输入店铺名称";
-"跳跳自营农场" = "跳跳自营农场";
 "✓ 名称可使用" = "✓ 名称可使用";
 "店铺Logo" = "店铺Logo";
 "不大于10M的jpg或png格式的图片" = "不大于10M的jpg或png格式的图片";
@@ -3385,6 +3384,10 @@
 "服饰" = "服饰";
 "✓ 已选 服饰" = "✓ 已选 服饰";
 "该类目保证金为: ¥6000.00,佣金比例为: 15%。" = "该类目保证金为: ¥6000.00,佣金比例为: 15%。";
+"该类目保证金为: ¥%@,佣金比例为: %@。" = "该类目保证金为: ¥%@,佣金比例为: %@。";
+"✓ 已选 %@" = "✓ 已选 %@";
+"店铺简介" = "店铺简介";
+"请输入店铺简介" = "请输入店铺简介";
 "店铺地址" = "店铺地址";
 "请输入店铺地址" = "请输入店铺地址";
 "下一步" = "下一步";

+ 11 - 0
BuguLive/Class/Sections/Store/MerchantEnrollViewController.m

@@ -50,6 +50,8 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.view.backgroundColor = [UIColor whiteColor];
+    [IQKeyboardManager sharedManager].enable = YES;
+    [IQKeyboardManager sharedManager].enableAutoToolbar = YES;
     [self setupNavigationBar];
     [self setupStepsUI];
     [self showCurrentStep];
@@ -347,6 +349,15 @@
         _navBar = [[NavigationBarView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, STATUS_BAR_HEIGHT+44)];
         _navBar.backgroundColor = UIColor.clearColor;
         _navBar.contentView.backgroundColor = UIColor.clearColor;
+        
+        WeakSelf
+        [_navBar setOnBackButtonkAction:^{
+            [weakSelf.navigationController popViewControllerAnimated:YES];
+        }];
+        
+        [_navBar setOnRightButtonkAction:^{
+            
+        }];
     }
     return _navBar;
 }

+ 27 - 0
BuguLive/Class/Sections/Store/Model/IndustryCategoryModel.h

@@ -0,0 +1,27 @@
+//
+//  IndustryCategoryModel.h
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface IndustryCategoryModel : NSObject
+
+@property (nonatomic, assign) NSInteger categoryId;
+@property (nonatomic, strong) NSString *name;
+@property (nonatomic, strong) NSString *depositAmount;
+@property (nonatomic, strong) NSString *commissionRate;
+@property (nonatomic, assign) NSTimeInterval createTime;
+@property (nonatomic, strong) NSString *createTimeText;
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
++ (NSArray<IndustryCategoryModel *> *)modelsFromArray:(NSArray *)array;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 37 - 0
BuguLive/Class/Sections/Store/Model/IndustryCategoryModel.m

@@ -0,0 +1,37 @@
+//
+//  IndustryCategoryModel.m
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import "IndustryCategoryModel.h"
+
+@implementation IndustryCategoryModel
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    if (self) {
+        _categoryId = [dict[@"id"] integerValue];
+        _name = dict[@"name"] ?: @"";
+        _depositAmount = dict[@"deposit_amount"] ?: @"0.00";
+        _commissionRate = dict[@"commission_rate"] ?: @"0.00";
+        _createTime = [dict[@"create_time"] doubleValue];
+        _createTimeText = dict[@"create_time_text"] ?: @"";
+    }
+    return self;
+}
+
++ (NSArray<IndustryCategoryModel *> *)modelsFromArray:(NSArray *)array {
+    NSMutableArray *models = [NSMutableArray array];
+    for (NSDictionary *dict in array) {
+        if ([dict isKindOfClass:[NSDictionary class]]) {
+            IndustryCategoryModel *model = [[IndustryCategoryModel alloc] initWithDictionary:dict];
+            [models addObject:model];
+        }
+    }
+    return [models copy];
+}
+
+@end

+ 20 - 0
BuguLive/Class/Sections/Store/Model/NetHttpsManager+Store.h

@@ -0,0 +1,20 @@
+//
+//  NetHttpsManager+Store.h
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import "NetHttpsManager.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NetHttpsManager (Store)
+
+- (void)storeGETWithPath:(NSString *)path SuccessBlock:(SuccessBlock)GetSuccess FailureBlock:(FailureBlock)GetFailure;
+- (void)storePOSTWithPath:(NSString *)path paramDict:(NSMutableDictionary *)paramDict SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 72 - 0
BuguLive/Class/Sections/Store/Model/NetHttpsManager+Store.m

@@ -0,0 +1,72 @@
+//
+//  NetHttpsManager+Store.m
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import "NetHttpsManager+Store.h"
+#import "AFNetworking.h"
+#import "AFHTTPSessionManager+Singlton.h"
+
+@implementation NetHttpsManager (Store)
+
+
+- (void)storeGETWithPath:(NSString *)path SuccessBlock:(SuccessBlock)GetSuccess FailureBlock:(FailureBlock)GetFailure {
+    NSMutableDictionary *headers = [self getHeader];
+    NSString *url = [self URLWithPath:path];
+    [self GETWithUrl:url headers:headers SuccessBlock:GetSuccess FailureBlock:GetFailure];
+}
+
+- (void)storePOSTWithPath:(NSString *)path paramDict:(NSMutableDictionary *)paramDict SuccessBlock:(SuccessBlock)PostSuccess FailureBlock:(FailureBlock)PostFailure {
+    
+    if (![NetWorkManager isExistenceNetwork])
+    {
+        NSLog(@"请检查当前网络");
+    }
+    else
+    {
+        NSString *urlStr = [self URLWithPath:path];
+        paramDict = [NetWorkManager getLocalParm:paramDict url:urlStr];
+        
+        [NetWorkManager myCookieStorage];
+        
+        AFHTTPSessionManager *manager = [AFHTTPSessionManager defaultNetManager];
+        manager.requestSerializer.timeoutInterval = 30;
+
+        [manager POST:urlStr parameters:paramDict headers:[self getHeader] progress:^(NSProgress * _Nonnull uploadProgress) {
+            
+        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
+//            NSLog(@"responseObject");
+//            NSLog(@"%@",responseObject);
+            [NetWorkManager doResult:responseObject url:urlStr paramDict:paramDict successBlock:PostSuccess successBlock2:nil failureBlock:PostFailure failureBlock2:nil];
+            
+        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
+            
+            [NetWorkManager updateErrorToServiceWithUrl:urlStr paramDict:paramDict errorString:[NSString stringWithFormat:@"%@",error]];
+            if (PostFailure)
+            {
+                PostFailure(error);
+            }
+            
+        }];
+    }
+}
+
+- (NSString *)URLWithPath:(NSString *)path {
+    NSString *domain = @"http://goods.dynasty168.com/shopapi/merchants";
+    return [NSString stringWithFormat:@"%@%@", domain, path];
+}
+
+- (NSMutableDictionary *)getHeader {
+    NSString *token = [BogoNetwork shareInstance].token ?: @"";
+    NSMutableDictionary *headers = [[NSMutableDictionary alloc] initWithDictionary:@{
+        @"token":token
+    }];
+    
+    [NetWorkManager tryAddLangParamDict2:headers];
+    return headers;
+}
+
+@end

+ 30 - 0
BuguLive/Class/Sections/Store/View/CategoryPickerView.h

@@ -0,0 +1,30 @@
+//
+//  CategoryPickerView.h
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "IndustryCategoryModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol CategoryPickerViewDelegate <NSObject>
+
+- (void)categoryPickerView:(UIView *)pickerView didSelectCategory:(IndustryCategoryModel *)category;
+
+@end
+
+@interface CategoryPickerView : UIView
+
+@property (nonatomic, weak) id<CategoryPickerViewDelegate> delegate;
+@property (nonatomic, strong) NSArray<IndustryCategoryModel *> *categories;
+
+- (void)showInView:(UIView *)parentView fromRect:(CGRect)rect;
+- (void)hide;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 167 - 0
BuguLive/Class/Sections/Store/View/CategoryPickerView.m

@@ -0,0 +1,167 @@
+//
+//  CategoryPickerView.m
+//  BuguLive
+//
+//  Created by qitewei on 2025/8/20.
+//  Copyright © 2025 xfg. All rights reserved.
+//
+
+#import "CategoryPickerView.h"
+#import "UIView+Extention.h"
+#import <Masonry/Masonry.h>
+
+@interface CategoryPickerView () <UITableViewDataSource, UITableViewDelegate>
+
+@property (nonatomic, strong) UIView *backgroundView;
+@property (nonatomic, strong) UIView *containerView;
+@property (nonatomic, strong) UITableView *tableView;
+
+@end
+
+@implementation CategoryPickerView
+
+- (instancetype)initWithFrame:(CGRect)frame {
+    self = [super initWithFrame:frame];
+    if (self) {
+        [self setupUI];
+    }
+    return self;
+}
+
+- (void)setupUI {
+    self.backgroundColor = [UIColor clearColor];
+    
+    // 背景遮罩
+    [self addSubview:self.backgroundView];
+    
+    // 容器视图
+    [self addSubview:self.containerView];
+    
+    // 表格视图
+    [self.containerView addSubview:self.tableView];
+    
+    [self setupConstraints];
+}
+
+- (void)setupConstraints {
+    [self.backgroundView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self);
+    }];
+    
+    [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.right.bottom.equalTo(self);
+        make.height.mas_equalTo(kRealValue(300));
+    }];
+    
+    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.containerView);
+    }];
+}
+
+- (void)showInView:(UIView *)parentView fromRect:(CGRect)rect {
+    self.frame = parentView.bounds;
+    [parentView addSubview:self];
+    
+    // 初始状态
+    self.alpha = 0;
+    self.containerView.transform = CGAffineTransformMakeTranslation(0, kRealValue(300));
+    
+    // 动画显示
+    [UIView animateWithDuration:0.3 animations:^{
+        self.alpha = 1;
+        self.containerView.transform = CGAffineTransformIdentity;
+    }];
+}
+
+- (void)hide {
+    [UIView animateWithDuration:0.3 animations:^{
+        self.alpha = 0;
+        self.containerView.transform = CGAffineTransformMakeTranslation(0, kRealValue(300));
+    } completion:^(BOOL finished) {
+        [self removeFromSuperview];
+    }];
+}
+
+- (void)backgroundTapped:(UITapGestureRecognizer *)gesture {
+    [self hide];
+}
+
+#pragma mark - UITableViewDataSource
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    return self.categories.count;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    static NSString *cellIdentifier = @"CategoryCell";
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
+    if (!cell) {
+        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
+        cell.selectionStyle = UITableViewCellSelectionStyleNone;
+        cell.backgroundColor = [UIColor whiteColor];
+        cell.textLabel.font = [UIFont systemFontOfSize:16];
+        cell.textLabel.textColor = [UIColor blackColor];
+    }
+    
+    IndustryCategoryModel *category = self.categories[indexPath.row];
+    cell.textLabel.text = category.name;
+    
+    return cell;
+}
+
+#pragma mark - UITableViewDelegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    [tableView deselectRowAtIndexPath:indexPath animated:YES];
+    
+    IndustryCategoryModel *selectedCategory = self.categories[indexPath.row];
+    if ([self.delegate respondsToSelector:@selector(categoryPickerView:didSelectCategory:)]) {
+        [self.delegate categoryPickerView:self didSelectCategory:selectedCategory];
+    }
+    
+    [self hide];
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    return kRealValue(50);
+}
+
+#pragma mark - Lazy Loading
+
+- (UIView *)backgroundView {
+    if (!_backgroundView) {
+        _backgroundView = [[UIView alloc] init];
+        _backgroundView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3];
+        
+        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgroundTapped:)];
+        [_backgroundView addGestureRecognizer:tapGesture];
+    }
+    return _backgroundView;
+}
+
+- (UIView *)containerView {
+    if (!_containerView) {
+        _containerView = [[UIView alloc] init];
+        _containerView.backgroundColor = [UIColor whiteColor];
+        _containerView.layer.cornerRadius = kRealValue(12);
+        _containerView.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner;
+        _containerView.clipsToBounds = YES;
+    }
+    return _containerView;
+}
+
+- (UITableView *)tableView {
+    if (!_tableView) {
+        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
+        _tableView.dataSource = self;
+        _tableView.delegate = self;
+        _tableView.backgroundColor = [UIColor whiteColor];
+        _tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
+        _tableView.separatorColor = [UIColor colorWithHexString:@"#E5E5E5"];
+        _tableView.showsVerticalScrollIndicator = YES;
+        _tableView.bounces = YES;
+    }
+    return _tableView;
+}
+
+@end

+ 15 - 2
BuguLive/Class/Sections/Store/View/MerchantBaseEnrollContentView.h

@@ -7,6 +7,8 @@
 
 #import <UIKit/UIKit.h>
 #import <JXCategoryView.h>
+#import "NetHttpsManager+Store.h"
+#import "UIView+TUIToast.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -40,7 +42,14 @@ typedef enum : NSUInteger {
 @end
 
 
-@interface MerchantBaseEnrollContentView : UIView<JXCategoryListContentViewDelegate>
+@protocol MerchantEnrollParametersDataSource <NSObject>
+
+- (NSDictionary *)getMerchantEnrollParameters;
+
+@end
+
+
+@interface MerchantBaseEnrollContentView : UIView<JXCategoryListContentViewDelegate, MerchantEnrollParametersDataSource>
 @property (nonatomic, strong) UILabel *titleLabel;
 
 @property (nonatomic, strong) UIScrollView *scrollView;
@@ -50,7 +59,11 @@ typedef enum : NSUInteger {
 
 @property (nonatomic, weak) id<MerchantEnrollContentViewDelegate> delegate;
 
-- (void)nextButtonTapped:(UIButton *)sender;
+@property (nonatomic, strong) NetHttpsManager *netManager;
+
+@property (readonly, nullable) UIViewController *viewController;
+
+- (void)goNext;
 
 @end
 

+ 28 - 0
BuguLive/Class/Sections/Store/View/MerchantBaseEnrollContentView.m

@@ -64,6 +64,10 @@
 
 
 - (void)nextButtonTapped:(UIButton *)sender {
+    [self goNext];
+}
+
+- (void)goNext {
     if (self.delegate && [self.delegate respondsToSelector:@selector(onMerchantEnrollGotoNextButtonClick)]) {
         [self.delegate onMerchantEnrollGotoNextButtonClick];
     }
@@ -115,6 +119,15 @@
             _titleLabel.text = ASLocalizedString(@"支付保证金");
             [_nextButton setTitle:ASLocalizedString(@"已完成支付,下一步") forState:UIControlStateNormal];
 
+            break;
+        case MerchantEnrollStepWatingForReview:
+            
+            break;
+        case MerchantEnrollStepReviewFail:
+            
+            break;
+        case MerchantEnrollStepComplete:
+            
             break;
     }
 }
@@ -169,4 +182,19 @@
     return _nextButton;
 }
 
+- (NetHttpsManager *)netManager {
+    if (!_netManager) {
+        _netManager = [NetHttpsManager manager];
+    }
+    return _netManager;
+}
+
+- (UIViewController *)viewController {
+    return (UIViewController *)self.delegate;
+}
+
+- (NSDictionary *)getMerchantEnrollParameters {
+    return @{};
+}
+
 @end

+ 6 - 5
BuguLive/Class/Sections/Store/View/MerchantEnrollGuideView.m

@@ -126,11 +126,12 @@
     
     // 连接线
     UIImageView *lineImageView = [[UIImageView alloc] init];
+    lineImageView.contentMode = UIViewContentModeScaleAspectFit;
     if ([stepNumber isEqualToString:@"03"]) {
         // 第三步不需要连接线
         lineImageView.hidden = YES;
     } else {
-        lineImageView.image = [UIImage imageNamed:@"store_line_blue"];
+        lineImageView.image = [UIImage imageNamed:@"store_01_line"];
     }
     [stepView addSubview:lineImageView];
     
@@ -181,8 +182,8 @@
         [lineImageView mas_makeConstraints:^(MASConstraintMaker *make) {
             make.left.equalTo(iconImageView).offset(kRealValue(20));
             make.top.equalTo(iconImageView.mas_bottom).offset(kRealValue(8));
-            make.width.equalTo(@(kRealValue(2)));
-            make.height.equalTo(@(kRealValue(40)));
+            make.width.equalTo(@(kRealValue(8)));
+            make.height.equalTo(@(kRealValue(70)));
         }];
     }
     
@@ -297,14 +298,14 @@
     [self updateSubmitButtonState];
 }
 
-- (void)nextButtonTapped:(UIButton *)sender {
+- (void)goNext {
     if (!self.isAgreementChecked) {
         // TODO: 显示提示信息
         NSLog(@"Please agree to the agreement first");
         return;
     }
     
-    [super nextButtonTapped:sender];
+    [super goNext];
 }
 
 - (void)agreementLabelTapped:(UITapGestureRecognizer *)gesture {

+ 1 - 1
BuguLive/Class/Sections/Store/View/MerchantEnrollResultView.m

@@ -153,7 +153,7 @@
 }
 
 #pragma mark - Actions
-- (void)nextButtonTapped:(UIButton *)sender {
+- (void)goNext {
     
     switch (self.resultType) {
         case MerchantEnrollResultSuccess:

+ 13 - 1
BuguLive/Class/Sections/Store/View/MerchantStoreInfoView.h

@@ -8,10 +8,12 @@
 
 #import <UIKit/UIKit.h>
 #import "MerchantBaseEnrollContentView.h"
+#import "IndustryCategoryModel.h"
+#import "CategoryPickerView.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
-@interface MerchantStoreInfoView : MerchantBaseEnrollContentView
+@interface MerchantStoreInfoView : MerchantBaseEnrollContentView <CategoryPickerViewDelegate>
 
 
 // 店铺名称
@@ -32,10 +34,20 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, strong) UILabel *categoryStatusLabel;
 @property (nonatomic, strong) UILabel *categoryTipLabel;
 
+// 店铺简介
+@property (nonatomic, strong) UILabel *descriptionLabel;
+@property (nonatomic, strong) UITextView *descriptionTextView;
+@property (nonatomic, strong) UILabel *descriptionCountLabel;
+
 // 店铺地址
 @property (nonatomic, strong) UILabel *addressLabel;
 @property (nonatomic, strong) UITextField *addressTextField;
 
+// 行业分类数据
+@property (nonatomic, strong) NSArray<IndustryCategoryModel *> *categories;
+@property (nonatomic, strong) IndustryCategoryModel *selectedCategory;
+@property (nonatomic, strong) CategoryPickerView *categoryPickerView;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 347 - 43
BuguLive/Class/Sections/Store/View/MerchantStoreInfoView.m

@@ -8,15 +8,42 @@
 
 #import "MerchantStoreInfoView.h"
 #import "UIView+Extention.h"
+#import "IndustryCategoryModel.h"
+#import "CategoryPickerView.h"
+
+@interface MerchantStoreInfoView ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
+@property (nonatomic, copy, nullable) NSString *logoURL;
+@end
 
 @implementation MerchantStoreInfoView
 
+- (void)dealloc {
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (NSDictionary *)getMerchantEnrollParameters {
+    // 获取店铺简介内容,排除占位符文本
+    NSString *description = @"";
+    if (![self.descriptionTextView.text isEqualToString:ASLocalizedString(@"请输入店铺简介")]) {
+        description = self.descriptionTextView.text ?: @"";
+    }
+    
+    return @{
+        @"shop_name": self.storeNameTextField.text ?: @"",
+        @"shop_logo": self.logoURL ?: @"",
+        @"shop_desc": description,
+        @"cate_id":@(self.selectedCategory.categoryId),
+        @"shop_address":self.addressTextField.text ?: @""
+    };
+}
+
 - (instancetype)initWithFrame:(CGRect)frame
 {
     self = [super initWithFrame:frame];
     if (self) {
         [self setupUI];
         [self setupConstraints];
+        [self initData];
     }
     return self;
 }
@@ -35,6 +62,9 @@
     // 添加经营类别区域
     [self setupCategorySection];
     
+    // 添加店铺简介区域
+    [self setupDescriptionSection];
+    
     // 添加店铺地址区域
     [self setupAddressSection];
     
@@ -63,6 +93,12 @@
     [self.contentView addSubview:self.categoryTipLabel];
 }
 
+- (void)setupDescriptionSection {
+    [self.contentView addSubview:self.descriptionLabel];
+    [self.contentView addSubview:self.descriptionTextView];
+    [self.contentView addSubview:self.descriptionCountLabel];
+}
+
 - (void)setupAddressSection {
     [self.contentView addSubview:self.addressLabel];
     [self.contentView addSubview:self.addressTextField];
@@ -138,10 +174,28 @@
         make.top.equalTo(self.categoryStatusLabel.mas_bottom).offset(kRealValue(4));
     }];
     
+    // 店铺简介
+    [self.descriptionLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.storeNameLabel);
+        make.top.equalTo(self.categoryTipLabel.mas_bottom).offset(kRealValue(24));
+    }];
+    
+    [self.descriptionTextView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.descriptionLabel);
+        make.right.equalTo(self.contentView).offset(-kRealValue(24));
+        make.top.equalTo(self.descriptionLabel.mas_bottom).offset(kRealValue(12));
+        make.height.mas_equalTo(kRealValue(100));
+    }];
+    
+    [self.descriptionCountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.right.equalTo(self.descriptionTextView);
+        make.top.equalTo(self.descriptionTextView.mas_bottom).offset(kRealValue(8));
+    }];
+    
     // 店铺地址
     [self.addressLabel mas_makeConstraints:^(MASConstraintMaker *make) {
         make.left.equalTo(self.storeNameLabel);
-        make.top.equalTo(self.categoryTipLabel.mas_bottom).offset(kRealValue(24));
+        make.top.equalTo(self.descriptionCountLabel.mas_bottom).offset(kRealValue(24));
     }];
     
     [self.addressTextField mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -160,21 +214,121 @@
     }];
 }
 
+- (void)initData {
+    NSString *path = @"/industrycategory";
+    [self.netManager storeGETWithPath:path SuccessBlock:^(NSDictionary *responseJson) {
+        // 解析接口返回数据
+        if ([responseJson[@"code"] integerValue] == 1) {
+            NSArray *dataArray = responseJson[@"data"];
+            if ([dataArray isKindOfClass:[NSArray class]]) {
+                self.categories = [IndustryCategoryModel mj_objectArrayWithKeyValuesArray:dataArray];
+                
+                // 如果有数据,默认选择第一个
+                if (self.categories.count > 0) {
+                    self.selectedCategory = self.categories.firstObject;
+                    [self updateCategoryDisplay];
+                }
+            }
+        }
+    } FailureBlock:^(NSError *error) {
+        NSLog(@"获取行业分类失败: %@", error.localizedDescription);
+    }];
+}
+
+- (void)checkShopNameIsCanUse {
+    
+    [[BGHUDHelper sharedInstance] syncLoading];
+    NSString *path = @"/checkShopNameIsCanUse";
+    NSMutableDictionary *dict = @{
+        @"shop_name":self.storeNameTextField.text
+    }.mutableCopy;
+    [self.netManager storePOSTWithPath:path paramDict:dict SuccessBlock:^(NSDictionary *responseJson) {
+        [[BGHUDHelper sharedInstance] syncStopLoading];
+        NSInteger is_can_use = [responseJson[@"is_can_use"] integerValue];
+        if (is_can_use == 1) {
+            [self goNext];
+        } else {
+            [self makeToast:@""];
+        }
+        
+    } FailureBlock:^(NSError *error) {
+        [[BGHUDHelper sharedInstance] tipMessage:error.localizedDescription];
+    }];
+}
+
+- (void)uploadImage:(UIImage *)image {
+
+    [[BGHUDHelper sharedInstance] syncLoading];
+    NSMutableDictionary *parmDict = [NSMutableDictionary dictionary];
+    [parmDict setObject:@"avatar" forKey:@"ctl"];
+    [parmDict setObject:@"uploadImage" forKey:@"act"];
+    NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
+    [self.netManager POSTWithDict:parmDict andFileData:imageData AndFileName:@"logo.png" SuccessBlock:^(NSDictionary *responseJson) {
+        [[BGHUDHelper sharedInstance] syncStopLoading];
+        [[BGHUDHelper sharedInstance] tipMessage:ASLocalizedString(@"上传成功")];
+        self.logoURL = responseJson[@"server_full_path"];
+    } FailureBlock:^(NSError *error) {
+        [[BGHUDHelper sharedInstance] syncStopLoading];
+        [[BGHUDHelper sharedInstance] tipMessage:error.localizedDescription];
+    }];
+    
+}
+
 #pragma mark - Actions
 
+- (void)goNext {
+    NSString *shop_name = self.storeNameTextField.text;
+    NSString *address = self.addressTextField.text;
+    
+    if (shop_name.length == 0) {
+        [self makeToast:self.storeNameTextField.placeholder];
+        return;
+    }
+    
+    if (![self.logoURL hasPrefix:@"http"]) {
+        [self makeToast:ASLocalizedString(@"请上传图片")];
+        return;
+    }
+    
+    if (address.length == 0) {
+        [self makeToast:self.addressTextField.placeholder];
+        return;
+    }
+    
+    [self checkShopNameIsCanUse];
+}
+
 - (void)logoUploadTapped:(UITapGestureRecognizer *)gesture {
-    // TODO: 实现图片选择功能
-    NSLog(@"Logo upload tapped");
+    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
+    {
+        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
+        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
+        picker.delegate = self;
+        picker.modalPresentationStyle = UIModalPresentationFullScreen;
+        [self.viewController presentViewController:picker animated:YES completion:nil];
+    }
+    
 }
 
 - (void)logoCloseButtonTapped:(UIButton *)sender {
-    // TODO: 移除已选择的图片
-    NSLog(@"Logo close button tapped");
+    self.logoImageView.image = nil;
+    sender.hidden = YES;
 }
 
 - (void)categoryButtonTapped:(UIButton *)sender {
-    // TODO: 实现类别选择功能
-    NSLog(@"Category button tapped");
+    if (self.categories.count == 0) {
+        NSLog(@"暂无行业分类数据");
+        return;
+    }
+    
+    // 显示类别选择器
+    if (!self.categoryPickerView) {
+        self.categoryPickerView = [[CategoryPickerView alloc] init];
+        self.categoryPickerView.delegate = self;
+    }
+    
+    self.categoryPickerView.categories = self.categories;
+    [self.categoryPickerView showInView:self.superview fromRect:sender.frame];
 }
 
 - (void)storeNameTextFieldChanged:(UITextField *)textField {
@@ -189,6 +343,112 @@
     }
 }
 
+- (void)descriptionTextViewDidChange:(NSNotification *)notification {
+    UITextView *textView = notification.object;
+    NSString *text = textView.text;
+    NSInteger currentLength = text.length;
+    NSInteger maxLength = 200;
+    
+    // 限制字数不超过200字
+    if (currentLength > maxLength) {
+        textView.text = [text substringToIndex:maxLength];
+        currentLength = maxLength;
+    }
+    
+    // 更新字数显示
+    self.descriptionCountLabel.text = [NSString stringWithFormat:@"%ld/200", (long)currentLength];
+    
+    // 根据字数变化颜色
+    if (currentLength >= maxLength) {
+        self.descriptionCountLabel.textColor = [UIColor colorWithHexString:@"#FF5722"];
+    } else {
+        self.descriptionCountLabel.textColor = [UIColor colorWithHexString:@"#999999"];
+    }
+}
+
+- (void)descriptionTextViewDidBeginEditing:(NSNotification *)notification {
+    UITextView *textView = notification.object;
+    if ([textView.text isEqualToString:ASLocalizedString(@"请输入店铺简介")]) {
+        textView.text = @"";
+        textView.textColor = [UIColor blackColor];
+    }
+}
+
+- (void)descriptionTextViewDidEndEditing:(NSNotification *)notification {
+    UITextView *textView = notification.object;
+    if (textView.text.length == 0) {
+        textView.text = ASLocalizedString(@"请输入店铺简介");
+        textView.textColor = [UIColor colorWithHexString:@"#999999"];
+        self.descriptionCountLabel.text = @"0/200";
+    }
+}
+
+- (void)updateCategoryDisplay {
+    if (self.selectedCategory) {
+        // 更新按钮显示
+        [self.categoryButton setTitle:self.selectedCategory.name forState:UIControlStateNormal];
+        [self.categoryButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
+        
+        // 更新状态标签
+        self.categoryStatusLabel.text = [NSString stringWithFormat:ASLocalizedString(@"✓ 已选 %@"), self.selectedCategory.name];
+        self.categoryStatusLabel.textColor = [UIColor colorWithHexString:@"#00C853"];
+        
+        // 更新提示标签
+        NSString *depositText = [NSString stringWithFormat:@"%.2f", [self.selectedCategory.depositAmount floatValue]];
+        NSString *commissionText = [NSString stringWithFormat:@"%.0f%%", [self.selectedCategory.commissionRate floatValue] * 100];
+        
+        NSString *tipText = [NSString stringWithFormat:ASLocalizedString(@"该类目保证金为: ¥%@,佣金比例为: %@。"), depositText, commissionText];
+        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:tipText];
+        
+        // 设置整体样式
+        [attributedText addAttribute:NSFontAttributeName
+                               value:[UIFont systemFontOfSize:12]
+                               range:NSMakeRange(0, tipText.length)];
+        [attributedText addAttribute:NSForegroundColorAttributeName
+                               value:[UIColor colorWithHexString:@"#FF9800"]
+                               range:NSMakeRange(0, tipText.length)];
+        
+        // 设置金额和百分比的颜色
+        NSRange moneyRange = [tipText rangeOfString:[NSString stringWithFormat:@"¥%@", depositText]];
+        NSRange percentRange = [tipText rangeOfString:commissionText];
+        
+        if (moneyRange.location != NSNotFound) {
+            [attributedText addAttribute:NSForegroundColorAttributeName
+                                   value:[UIColor colorWithHexString:@"#FF5722"]
+                                   range:moneyRange];
+        }
+        
+        if (percentRange.location != NSNotFound) {
+            [attributedText addAttribute:NSForegroundColorAttributeName
+                                   value:[UIColor colorWithHexString:@"#FF5722"]
+                                   range:percentRange];
+        }
+        
+        self.categoryTipLabel.attributedText = attributedText;
+    }
+}
+
+#pragma mark - UINavigationControllerDelegate,UIImagePickerControllerDelegate
+- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
+    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
+    self.logoImageView.image = image;
+    self.logoCloseButton.hidden = NO;
+    [picker dismissViewControllerAnimated:YES completion:^{
+        [self uploadImage:image];
+    }];
+}
+
+- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
+    [picker dismissViewControllerAnimated:YES completion:nil];
+}
+
+#pragma mark - CategoryPickerViewDelegate
+
+- (void)categoryPickerView:(UIView *)pickerView didSelectCategory:(IndustryCategoryModel *)category {
+    self.selectedCategory = category;
+    [self updateCategoryDisplay];
+}
+
 #pragma mark - Lazy Loading
 
 - (UILabel *)storeNameLabel {
@@ -232,8 +492,6 @@
         
         [_storeNameTextField addTarget:self action:@selector(storeNameTextFieldChanged:) forControlEvents:UIControlEventEditingChanged];
         
-        // 设置默认文本
-        _storeNameTextField.text = ASLocalizedString(@"跳跳自营农场");
     }
     return _storeNameTextField;
 }
@@ -270,7 +528,7 @@
 - (UIView *)logoUploadView {
     if (!_logoUploadView) {
         _logoUploadView = [[UIView alloc] init];
-        _logoUploadView.backgroundColor = [UIColor clearColor];
+        _logoUploadView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.8];
         _logoUploadView.layer.cornerRadius = kRealValue(8);
         _logoUploadView.clipsToBounds = YES;
         
@@ -286,8 +544,6 @@
         _logoImageView = [[UIImageView alloc] init];
         _logoImageView.contentMode = UIViewContentModeScaleAspectFill;
         _logoImageView.clipsToBounds = YES;
-        // 这里使用一个默认的示例图片
-        _logoImageView.image = [UIImage imageNamed:@"store_header_icon"]; // 临时使用现有图片
     }
     return _logoImageView;
 }
@@ -297,8 +553,7 @@
         _logoCloseButton = [UIButton buttonWithType:UIButtonTypeCustom];
         [_logoCloseButton setImage:[UIImage imageNamed:@"store_close"] forState:UIControlStateNormal];
         [_logoCloseButton addTarget:self action:@selector(logoCloseButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
-        _logoCloseButton.backgroundColor = [UIColor whiteColor];
-        _logoCloseButton.layer.cornerRadius = kRealValue(10);
+        _logoCloseButton.hidden = YES;
     }
     return _logoCloseButton;
 }
@@ -335,8 +590,8 @@
 - (UIButton *)categoryButton {
     if (!_categoryButton) {
         _categoryButton = [UIButton buttonWithType:UIButtonTypeCustom];
-        [_categoryButton setTitle:ASLocalizedString(@"服饰") forState:UIControlStateNormal];
-        [_categoryButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
+        [_categoryButton setTitle:ASLocalizedString(@"请选择经营类别") forState:UIControlStateNormal];
+        [_categoryButton setTitleColor:[UIColor colorWithHexString:@"#999999"] forState:UIControlStateNormal];
         _categoryButton.titleLabel.font = [UIFont systemFontOfSize:16];
         _categoryButton.backgroundColor = [UIColor whiteColor];
         _categoryButton.layer.cornerRadius = kRealValue(8);
@@ -358,7 +613,7 @@
 - (UILabel *)categoryStatusLabel {
     if (!_categoryStatusLabel) {
         _categoryStatusLabel = [[UILabel alloc] init];
-        _categoryStatusLabel.text = ASLocalizedString(@"✓ 已选 服饰");
+        _categoryStatusLabel.text = @""; // 初始为空,等待选择后更新
         _categoryStatusLabel.font = [UIFont systemFontOfSize:12];
         _categoryStatusLabel.textColor = [UIColor colorWithHexString:@"#00C853"];
     }
@@ -368,38 +623,78 @@
 - (UILabel *)categoryTipLabel {
     if (!_categoryTipLabel) {
         _categoryTipLabel = [[UILabel alloc] init];
+        _categoryTipLabel.text = @""; // 初始为空,等待选择后更新
+        _categoryTipLabel.font = [UIFont systemFontOfSize:12];
+        _categoryTipLabel.textColor = [UIColor colorWithHexString:@"#FF9800"];
+        _categoryTipLabel.numberOfLines = 0;
+    }
+    return _categoryTipLabel;
+}
+
+- (UILabel *)descriptionLabel {
+    if (!_descriptionLabel) {
+        _descriptionLabel = [[UILabel alloc] init];
+        _descriptionLabel.text = ASLocalizedString(@"店铺简介");
+        _descriptionLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
+        _descriptionLabel.textColor = [UIColor blackColor];
         
-        NSString *text = ASLocalizedString(@"该类目保证金为: ¥6000.00,佣金比例为: 15%。");
-        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:text];
-        
-        // 设置整体样式
-        [attributedText addAttribute:NSFontAttributeName
-                               value:[UIFont systemFontOfSize:12]
-                               range:NSMakeRange(0, text.length)];
-        [attributedText addAttribute:NSForegroundColorAttributeName
-                               value:[UIColor colorWithHexString:@"#FF9800"]
-                               range:NSMakeRange(0, text.length)];
+        // 添加红色星号
+        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:_descriptionLabel.text];
+        NSAttributedString *redStar = [[NSAttributedString alloc] initWithString:@" *" attributes:@{
+            NSForegroundColorAttributeName: [UIColor redColor],
+            NSFontAttributeName: [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]
+        }];
+        [attributedText appendAttributedString:redStar];
+        _descriptionLabel.attributedText = attributedText;
+    }
+    return _descriptionLabel;
+}
+
+- (UITextView *)descriptionTextView {
+    if (!_descriptionTextView) {
+        _descriptionTextView = [[UITextView alloc] init];
+        _descriptionTextView.font = [UIFont systemFontOfSize:16];
+        _descriptionTextView.textColor = [UIColor blackColor];
+        _descriptionTextView.backgroundColor = [UIColor whiteColor];
+        _descriptionTextView.layer.cornerRadius = kRealValue(8);
+        _descriptionTextView.layer.borderWidth = 1;
+        _descriptionTextView.layer.borderColor = [UIColor colorWithHexString:@"#E5E5E5"].CGColor;
+        _descriptionTextView.textContainerInset = UIEdgeInsetsMake(kRealValue(12), kRealValue(12), kRealValue(12), kRealValue(12));
+        _descriptionTextView.showsVerticalScrollIndicator = YES;
         
-        // 设置金额和百分比的颜色
-        NSRange moneyRange = [text rangeOfString:@"¥6000.00"];
-        NSRange percentRange = [text rangeOfString:@"15%"];
+        // 设置占位符
+        _descriptionTextView.text = ASLocalizedString(@"请输入店铺简介");
+        _descriptionTextView.textColor = [UIColor colorWithHexString:@"#999999"];
         
-        if (moneyRange.location != NSNotFound) {
-            [attributedText addAttribute:NSForegroundColorAttributeName
-                                   value:[UIColor colorWithHexString:@"#FF5722"]
-                                   range:moneyRange];
-        }
+        // 添加文本变化监听
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(descriptionTextViewDidChange:)
+                                                     name:UITextViewTextDidChangeNotification
+                                                   object:_descriptionTextView];
         
-        if (percentRange.location != NSNotFound) {
-            [attributedText addAttribute:NSForegroundColorAttributeName
-                                   value:[UIColor colorWithHexString:@"#FF5722"]
-                                   range:percentRange];
-        }
+        // 添加开始和结束编辑监听
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(descriptionTextViewDidBeginEditing:)
+                                                     name:UITextViewTextDidBeginEditingNotification
+                                                   object:_descriptionTextView];
         
-        _categoryTipLabel.attributedText = attributedText;
-        _categoryTipLabel.numberOfLines = 0;
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(descriptionTextViewDidEndEditing:)
+                                                     name:UITextViewTextDidEndEditingNotification
+                                                   object:_descriptionTextView];
     }
-    return _categoryTipLabel;
+    return _descriptionTextView;
+}
+
+- (UILabel *)descriptionCountLabel {
+    if (!_descriptionCountLabel) {
+        _descriptionCountLabel = [[UILabel alloc] init];
+        _descriptionCountLabel.text = @"0/200";
+        _descriptionCountLabel.font = [UIFont systemFontOfSize:12];
+        _descriptionCountLabel.textColor = [UIColor colorWithHexString:@"#999999"];
+        _descriptionCountLabel.textAlignment = NSTextAlignmentRight;
+    }
+    return _descriptionCountLabel;
 }
 
 - (UILabel *)addressLabel {
@@ -409,6 +704,15 @@
         _addressLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
         _addressLabel.textColor = [UIColor blackColor];
         _addressLabel.numberOfLines = 0;
+        
+        // 添加红色星号
+        NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:_addressLabel.text];
+        NSAttributedString *redStar = [[NSAttributedString alloc] initWithString:@" *" attributes:@{
+            NSForegroundColorAttributeName: [UIColor redColor],
+            NSFontAttributeName: [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]
+        }];
+        [attributedText appendAttributedString:redStar];
+        _addressLabel.attributedText = attributedText;
     }
     return _addressLabel;
 }