# DriverTerminal **Repository Path**: sunyix/driver-terminal ## Basic Information - **Project Name**: DriverTerminal - **Description**: 货运物流 - **Primary Language**: Objective-C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-21 - **Last Updated**: 2025-08-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 无车承运人-iOS-货主端 ## 项目框架整体结构 ,如图 ![Alt text](./1.jpg) * 1 > Classes 包含工具模块、基础vc模块、分类模块、公用View模块、异常模块 * 2 > AppConfig App配置、获取App存储数据等 * 3 > AppDelegate * 4 > NetworkModule 网络模块 * 5 > BusinessModule 业务模块 * 6 > DataBaseModule 数据库模块 * 7 > HandlerModule 处理器模块 * 8 > MapLocationModule 定位模块 * 9 > ResourcesFile 资源文件 * 10 > Vendor 库类 * 11 > Macro 宏类 ## 编写规范 > ### 1. 命名 1.1 采用大驼峰命名法 (一般用作控制器,工具类的名字) 1.2 采用小驼峰命名 (属性,变量,方法等) > ### 2. 注释 2.1 局部变量 只需要加//注释清楚 2.2 属性 用文档注释,方便调用时显示作用 (全局属性并在.h文件中,一定要使用文档注释表明属性的作用) 2.3 方法 用文档注释,如有必要添加 #pragma mark 注释 如有多行参数,需要在注释中表明参数含义参数较多时需要换行 2.4 判断 每个判断条件加//注释表明判断条件 > ### 3. 结构 3.1 首先是 头文件导入 3.2 全局属性定义 相关宏定义 常量定义 3.3 声命周期函数 3.4 用户交互事件操作(各种点击事件,刷新事件,界面跳转事件) 3.5 子视图初始化 > ### 4. 其他 4.1 判断语句都要带大括号 4.2 init方法应遵循Apple生成代码模板的命名规则返回类型为instancetype 4.3 判断语句不要过多的套用 4.4 单例对象使用线程安全模式来创建共享实例 4.5 每个方法或者功能模块之间有且只有一行空格来区分 4.6 Getters and Setters放在最底部 ## 三方集成 ### 1. [高德地图](https://lbs.amap.com "高德地图") ### 2. [友盟分享](https://www.umeng.com "友盟分享") ### 3. [微信支付](https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F "微信支付") ### 4. [支付宝支付](https://open.alipay.com/platform/home.htm "支付宝支付") ### 5. [讯飞语音](https://www.xfyun.cn "讯飞语音") ### 6. [Bugly](https://bugly.qq.com/docs/ "Bugly") ### 7. [MQTT](https://baike.baidu.com/item/MQTT/3618851?fr=aladdin "MQTT") ### 8. [七牛云](https://www.qiniu.com/?hmsr=baidu&hmpl=SEM&hmcu=pinzhuan_title&hmkw=&hmci= "七牛云") > ### XKPush 为小咖自主研发的推送SDK > ### 剩余三方 为非注册三方 如图 ![Alt text](./2.jpg) ## 更新数据库 ### 1. DriverPraiseModel(司机好评DB) ### 2. PersonalModel(个人资料DB) ### 3. LocationModel(定位点DB) ### 4. OrderModel(订单DB) ## 基础,公共 模块 > ### 1. SQPrefixHeader.pch 宏 1.1 预编译头文件,其作用就是,方便一次性导入在多个文件中同时用到的头文件、宏或者URL地址等(全局使用),有效的约时间,提高开发效率 1.2 导入了所有的三方库头文件, 配置数据,基础宏等. > ### 2. MainNsobject 工具类 SQRecordTheClassNSObject 次级工具类 2.1 编写了大量的公共方法 如: 时间戳转换,视图跳转,图片链接拼接,数据存储等(有详细注释) > ### 3. SQHttpsNSObject 请求接口类 3.1 处理接口请求 get请求 post请求 PUT请求 > ### 4. SQPayNsobject 支付拉起 SQpayZFView 支付选择页面 4.1 SQPayNsobject 用于拉起支付宝,微信 4.2 SQpayZFView 用于展示余额,支付宝,微信支付选择页面,继承于UIView > ### 5. TabbarView 顶部导航栏 5.1 所有控制器都添加该类用作顶部导航 5.2 TabbarViewDelegate代理回调,用作返回处理等,两种创建方式,可满足左右显示按钮需求等. > ### 6. CountDownButton 带图片的按钮 6.1 自带图片,文字的按钮 可以图片左边,右边,顶部,代码中大量运用,需要注意 > ### 7. 单例类 7.1 SQMQTTHeader MQTT单例类 7.2 SQcxdwNsobject 持续定位单例类 7.3 ZQCountdownTime 倒计时单例类 7.4 SVProgressHUD HUD单例类,项目中所有的提示语都使用该类完成 7.5 XKZCMessageCenter 专车消息听单单例类 7.6 AFHTTPSessionManager单例(AFNetworking使用时,如果一直创建AFHTTPSessionManager而不释放会造成系统崩溃,单例之后则解决该问题) >### 8. SQConfig.plist 公司配置类 8.1 APPKEY 公司key 8.2 MQTThost MQTT地址 8.3 MQTTpassword MQTT密码 8.4 MQTTusername MQTT账号 8.5 AMapapiKey 高德地图key 8.6 SQImage 七牛云地址 8.7 APPHTTP 接口地址 8.8 WXinapiKey 微信appkey 8.9 APPH5 文章地址 8.10 APPColor APP主题颜色 8.11 QQapiKey QQ appKey ## 各类方法 > ### 1. 数据存取方式 ,该项目数据基本使用NSUserDefaults 存储 ```objc 1.1存数据代码示例: [MainNsobject SQSTring:@"10086" String:@"Newphones"]; ``` ```objc 1.2 存储数据的提取: [MainNsobject SQnssTring:@"Newphones"]; ``` ```objc 1.3 存储数据的删除: [MainNsobject SQremoveTring:@"Newphones"]; ``` > ### 2. 接口请求 ,使用 AFNetworking 三方 ,封装了三个请求方法在 SQHttpsNSObject类中 #### 2.1 Get 请求示例: ```objc //创建字典 NSMutableDictionary*dic=[[NSMutableDictionary alloc]init]; //加入接口需要的参数 [dic setValue:@"30" forKey:@"size"]; [dic setValue:@"1" forKey:@"page"]; //类拉起get请求,传入字典 nsstring: 为接口名 [SQHttpsNSObject requestUserInfoWithdic:dic nsstring:@"api/v1/public/orders" Complation:^(id responseObject, NSError *error) { //接口回调 responseObject 成功数据 error失败数据 if (!error) { if ([MainNsobject SQCodeIsOne:responseObject]) { [self.JsonArray removeAllObjects]; [self.JsonArray addObjectsFromArray:[MainNsobject SQ_addObjectsFromArray:responseObject Key:@"data"]]; }else { [MainNsobject SQshowMessag:responseObject]; } } }]; ``` #### 2.2 Post 请求示例: ```objc //创建字典 NSMutableDictionary*dic=[[NSMutableDictionary alloc]init]; //加入接口需要的参数 [dic setValue:@"30" forKey:@"size"]; [dic setValue:@"1" forKey:@"page"]; //类拉起get请求,传入字典 nsstring: 为接口名 [SQHttpsNSObject requestTowUserInfoWithdic:param nsstring:url Complation:^(id responseObject, NSError *error){ //接口回调 responseObject 成功数据 error失败数据 if (!error) { if ([MainNsobject SQCodeIsOne:responseObject]) { [self.JsonArray removeAllObjects]; [self.JsonArray addObjectsFromArray:[MainNsobject SQ_addObjectsFromArray:responseObject Key:@"data"]]; }else { [MainNsobject SQshowMessag:responseObject]; } } }]; ``` #### 2.3 PUT 请求示例: ```objc //创建字典 NSMutableDictionary*dic=[[NSMutableDictionary alloc]init]; //加入接口需要的参数 [dic setValue:@"30" forKey:@"size"]; [dic setValue:@"1" forKey:@"page"]; //类拉起get请求,传入字典 nsstring: 为接口名 [SQHttpsNSObject requestPUTUserInfoWithdic:param nsstring:url Complation:^(id responseObject, NSError *error){ //接口回调 responseObject 成功数据 error失败数据 if (!error) { if ([MainNsobject SQCodeIsOne:responseObject]) { [self.JsonArray removeAllObjects]; [self.JsonArray addObjectsFromArray:[MainNsobject SQ_addObjectsFromArray:responseObject Key:@"data"]]; }else { [MainNsobject SQshowMessag:responseObject]; } } }]; ``` > ### 3. 通知 项目中使用了 NSNotificationCenter 通知来处理MQTT消息,现整理如下: 3.1 MESSAGE_CENTER_DRIVER_LOCATION_NOTIFICATION 专车司机位置通知 3.2 MESSAGE_CENTER_UPDATE_STATUS_NOTIFICATION 专车订单状态改变推送 3.3 BHChangeaddressNFName 出租车 司机位置推送 3.4 BHChangeOrderIdNFName 出租车 订单状态变化 BHChangeCZCOrderIdNFName 订单被接取通知 3.5 BHChangeZXaddressNFName 专线 司机位置推送 3.6 BHChangeZXOrderIdNFName 专线 订单状态推送 3.7 BHDZBCOrderIdNFName 定制包车 订单状态推送 3.8 BHChangeDZBCaddressNFName 定制包车预约状态变化通知 3.9 SQ_BCZCorderid 包车租车 订单状态推送 3.10 BHChangeBCZCaddressNFName 包车租车预约状态变化通知 3.11 SQ_KYBCorderid 客运班车 订单状态推送 3.12 SQKybcBtn 选择客运班车站点的按钮通知 3.13 SQPayCodeListening 微信,支付宝 支付状态通知 3.14 SQzxxdcgViewbtnClick 下单完成,跳转用 3.15 SGReachabilityChangedNotification 网络监测 ### 4. 请求加解密 #### 4.1 使用 GTMBase64 NSString+AES RSA 加解密 注 : 这三个接口不参与加密 > * 获取公司id接口 api/v1/public/system/company/enclosure > * 首页广告位接口 api/v1/public/sales/advertisement/app/list > * 获取手机短信验证码 api/v1/public/app/captcha/send_sms #### 4.2 RSA加密 使用了第三方RSA进行加解密,使用了Extension 封装了String的RSA加解密,公钥以常量字符串publicKeys保存 ```objc ///RSA公钥加密字符串 /** 字典进行加密 @param dic 需要加密的参数 @return 返回加密后的字典 */ + (NSMutableDictionary*)SQ_NSDictionaryEncryptionRSA64OrLanAES:(NSMutableDictionary*)dic uri:(NSString*)uri { NSMutableDictionary*dics=[[NSMutableDictionary alloc]init]; NSArray*arrakey=[dic allKeys]; NSArray*arraVAlues=[dic allValues]; if ([MainNsobject SQDeterminesIfTheStringHasAValue:[MainNsobject SQnssTring:@"randomStr"]] || [uri isEqualToString:@"api/v1/public/system/company/enclosure"] ||[uri isEqualToString:@"api/v1/public/sales/advertisement/app/list"] || [uri isEqualToString:@"api/v1/public/app/captcha/send_sms"]) { for (int x =0; x