ios端自己封装的基础库

  • CPX_BaseLib
    ios端组件化开发基本库,所有项目需依赖。(本库只是针对项目作出常用的功能封装以及基本适配处理,有些类可以根据不同项目不同需求再次封装)

传送门:gitHub 链接

基本规范

为了项目的规范,所以我们在开发的时候需要统一一些方法的命名及方法的使用
1. 初始化方法
* - (void)initUI;/**UI初始话*/
* -(void)initDataSource; /**数据源初始话*/
* - (void)loadData;/**加载数据*/
2.  初始化方法第二级,默认放在initUI下
* - (void)initViews;/**初始化View*/
* - (void)initNavigation;/**初始化导航栏*/
* - (void)initOtherViews;/**初始化其他view*/
3.命名以驼峰原则,以功能名字命名,见名思意,并配上注释。

组成部件

  • BaseClass
  • Configration
  • Categories
  • Extensions
  • NetworkManager
  • ThirdPart
  • Utls

BaseClass

 CPXBaseAlertView 用于自定义弹窗的所有父类
 基本使用方法 创建一个View继承CPXBaseAlertView 使用时调用
    -(void)show:(BOOL)animate 即可
    常用属性 removeOnTouchOutside (点击空白区域是否关闭弹窗)
 
 CPXBaseTableView 用于自定义UITableView的所有父类
    初始化方式 [CPXBaseTableView new] 内部已经处理不同系统版本适配问题
 
 CPXBaseView 用于所有自定义视图的父类
    -(CPXBaseViewController*)getViewcontrollerView获取当前的父控制器

BaseVC

一   CPXBaseNavigationController 基类UINavigationController控制器(此类中处理了app因为导航栏的侧滑出现假死的情况以及实现了各种代理方法,所以所有的导航栏必须继承此类)
二   CPXBaseTabBarController 基类UITabBarController控制器(此类是留的一个入口,以便自定义tabBar的时候做一些相应的处理)
三   CPXBaseViewController 用于自定义控制器的所有父类
 1.规范了UI以及data的初始化方法,以及处理了导航栏的统一设置,并留了处理状态栏颜色的api。
 2.初始化了一个继承于CPXBaseTableView的tableiview,用于快速创建tableview并为以后的
 3.初始化了数据源的一些变量:
@property (nonatomic,strong)NSMutableArray * dataArray;/**<所有带有列表的页面全部使用该数据项*/
@property (nonatomic,assign)BOOL isDownRefresh;/**< 是否是下拉刷新 默认NO*/
@property (nonatomic,assign)int page;/**<分页 默认为0*/
@property (nonatomic,assign)int pageSize;/**<每个分页的数据量长度*/
@property(nonatomic,strong)CPXNetworkManagerModel *netConfigmodel;/**<网络请求配置model*/
 4.导航栏的处理:
导航栏返回按钮 - (void)initLeftBackNaviButton
导航栏顶部透明色 - (void)initDefaultNavigation

BaseModel

CPXBaseModel 所有自定义Model的父类

Configration

GlobalDefine.h          常用的一些占位图与通用展示文字宏文件
GlobalPCH.pch           用于引入BaseLib库
Import.h            用于导入创建的自定义类、CateGory、Exrension、第三方工具类
IphoneXConfig.h         用于iPhone机型的UI适配
SystemConfig.h          系统版本适配、启动宏、各类通知相关
UIConfig.h          全局UI配置 颜色设置、app view通用背景颜色、navigationBar颜色、APP主题色等

Categories

UIBarButtonItem+Badge.h

用于UIBarButtonItem的角标设置(常用属性如下:)
@property (nonatomic) UIColor *badgeBGColor;/**< 背景色*/
@property (nonatomic) UIColor *badgeTextColor;/**< 字体颜色*/
@property (nonatomic) UIFont *badgeFont;/**< 字体*/
@property (nonatomic) CGFloat badgePadding;/**< 间隔*/
@property (nonatomic) CGFloat badgeMinSize;/**< 最小size*/
@property (nonatomic) CGFloat badgeOriginX;/**< x偏移*/
@property (nonatomic) CGFloat badgeOriginY;/**<y偏移 */

UIImage+Color.h

用于color转image、image转color、调整图片方向、图片无损压缩、压缩图片到指定文件大小(kb)、将图片裁剪到制定像素、传入需要的占位图尺寸 获取占位图
+ (UIImage *)cpx_imageWithColor:(UIColor *)color;/**<  color转image*/
+ (UIColor *)cpx_imageTocolor:(UIImage *)image withrect:(CGRect)rect; /**< image转color*/
+ (UIImage*)cpx_fixOrientation:(UIImage*)aImage; /**< UIImagePickerController返回的照片带有方向信息,如果直接上传到服务器的话,可能造成旋转了90°(当手机竖直拍照)的情况。而且如果直接取其jpeg数据,或者将UIImage保存到本地的话,就会丢失这个方向信息,导致下一次读取出来图片就是颠倒的*/
+ cpx_reSizeImageData:(UIImage *)sourceImage
               maxImageSize:(CGFloat)maxImageSize
              maxSizeWithKB:(CGFloat) maxSize;/**< 图片无损压缩 */
+(NSData *)cpx_compressOriginalImage:(UIImage *)image
             toMaxDataSizeKBytes:(CGFloat)size; /**<压缩图片到指定文件大小(kb)*/
+ (UIImage*)cpx_imageByScalingAndCroppingForImage:(UIImage *)sourceImage  Size:(CGSize)targetSize;   /**< 将图片裁剪到制定像素 */
+ (UIImage *)cpx_placeholderImageWithSize:(CGSize)size ImageSize:(CGSize )imageSize; /**< 获取不同尺寸的占位图*/

NSDictionary+Basic.h 用于处理不安全字典(null,@“” 等的处理)

+(NSDictionary*)cpx_safeDictionaryByObject:(id)unsaveObj;

NSDictionary+log.h

用于控制台打印中文(因为网络请求的数据在控制台显示出来是UTF-8格式,只需导入该头文件即可打印中文信息)

UIScrollView+Basic.h 用于处理取消scrollview刷新、添加头部刷新(自动处理网络请求配置model,关闭菊花的开关以及打开是手动刷新)、添加尾部刷新(自动处理网络请求配置model,关闭菊花的开关以及打开是手动刷新)

-(void)cpx_endRefresh; /**< 取消一切刷新(包括上拉下拉)*/、
-(void)cpx_addHeaderRefresh:(MJRefreshComponentRefreshingBlock)refreshingBlock withModel:(CPXNetworkManagerModel*)netModel; /**< 添加头部刷新(自动处理网络请求配置model,关闭菊花的开关以及打开是手动刷新)*/
-(void)cpx_addFooterRefresh:(MJRefreshComponentRefreshingBlock)refreshingBlock withModel:(CPXNetworkManagerModel*)netModel; /**< 添加尾部刷新(自动处理网络请求配置model,关闭菊花的开关以及打开是手动刷新)*/

UIButton+Badge.h 用于UIButton的角标设置

用于UIBarButtonItem的角标设置(常用属性如下:)
@property (nonatomic) UIColor *badgeBGColor;/**< 背景色*/
@property (nonatomic) UIColor *badgeTextColor;/**< 字体颜色*/
@property (nonatomic) UIFont *badgeFont;/**< 字体*/
@property (nonatomic) CGFloat badgePadding;/**< 间隔*/
@property (nonatomic) CGFloat badgeMinSize;/**< 最小size*/
@property (nonatomic) CGFloat badgeOriginX;/**< x偏移*/
@property (nonatomic) CGFloat badgeOriginY;/**<y偏移 */

UIButton+ImageTitleSpacing.h 用于设置button的titleLabel和imageView的布局样式,及间距

其中包括了四种样式
MKButtonEdgeInsetsStyleTop, // image在上,label在下
MKButtonEdgeInsetsStyleLeft, // image在左,label在右
MKButtonEdgeInsetsStyleBottom, // image在下,label在上
MKButtonEdgeInsetsStyleRight // image在右,label在左
- (void)cpx_layoutButtonWithEdgeInsetsStyle:(MKButtonEdgeInsetsStyle)style imageTitleSpace:(CGFloat)space;

UIButton+touch.h 用于处理按钮的暴力点击事件(防止过快重复点击多次触发点击事件,默认0.5秒间隔时间)

@property (nonatomic, assign) NSTimeInterval timeInterval;/**设置点击时间间隔*/
@property (nonatomic, assign) BOOL isIgnore;/** 用于设置单个按钮不需要被hook*/

UIButton+TimerFire.h 用于展示倒计时按钮(获取验证码按钮)

-(void)fireForTimerWithTimeCount:(NSInteger)count; /**开始倒计时 */
-(void)setBorderColorAndTitleColor;/**设置按钮边框颜色和圆角、title */

UIView+AZGradient.h 一句代码实现View渐变色

- (void)az_setGradientBackgroundWithColors:(NSArray<UIColor *> *_Nullable)colors locations:(NSArray<NSNumber *> *_Nullable)locations startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint

UIView+Basic.h 主要是高效处理view的圆角以及渐变色问题(响应的layer也添加了对应的api)

/** 渐变色方向
- GradientDirectionHorizontal: 水品方向
- GradientDirectionVertical: 垂直方向
*/
typedef NS_ENUM(NSInteger,GradientDirection) {
GradientDirectionHorizontal = 0,
GradientDirectionVertical  
};
-(UIImage *)cpx_screenShotViewWith:(CGRect)rect;/**对屏幕进行截屏 */
- (BOOL)cpx_isDisplayedInScreen;/** 判断view是否在屏幕上 */
-(void)cpx_addPathCorner:(UIRectCorner)corner cornerRadis:(CGFloat)cornerRadis;/**添加贝塞尔圆角--自动布局必须完成布局才能调用 */
-(void)cpx_setCorner:(CGFloat)cornerRadis;/**普通方式切圆角 */
- (void)cpx_roundedCornerWithRadius:(CGFloat)radius cornerColor:(UIColor *)color;/**绘制一个带背景色的圆角 */
- (void)cpx_roundedCornerWithRadius:(CGFloat)radius cornerColor:(UIColor *)color corners:(UIRectCorner)corners;/**绘制一个带背景色的圆角 ,并可以自己选择圆角的位置*/
- (void)cpx_roundedCornerWithCornerRadii:(CGSize)cornerRadii cornerColor:(UIColor *)color corners:(UIRectCorner)corners borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth;/** 设置一个带边框的圆角,并可设置边框颜色和宽度,以及圆角背景和位置*/
-(void)cpx_addGradientColorWithColor_begin:(UIColor * )color_begin colorEnd:(UIColor * )color_end   gradientDirection:(GradientDirection)direction;/** 添加渐变色 --- 添加backgourdcolor的形式*/

UIView+GetController.h 用于获取view的所在的controller、获取view所在UITableViewCell、根据点击的视图 、获取当前indexPath

    -(UIViewController * )cpx_getSuperControllerOfTheView;/** 获取view的所在的controller*/
    -(UITableViewCell * )cpx_getSuperContainerCell;/**获取view所在UITableViewCell */
    - (NSIndexPath *)cpx_indexPathInTable:(UITableView *)tableView; /**  根据点击的视图 、获取当前indexPath*/

UIView+Storyboard.h 用于给xib和SB增加额外的属性:边界颜色、边界宽度、圆角

@property (nonatomic) IBInspectable UIColor *borderColor;//边界颜色
@property (nonatomic) IBInspectable CGFloat borderWidth;//边界宽度
@property (nonatomic) IBInspectable CGFloat cornerRadius;//圆角

UIBarButtonItem+SXCreate.h 处理自定义导航栏按钮带来的偏移以及点击范围等问题*

 +(UIBarButtonItem *)cpx_itemWithTarget:(id)target
                            action:(SEL)action
                             image:(UIImage *)image;/**   根据图片生成UIBarButtonItem*/
  +(UIBarButtonItem *)cpx_itemWithTarget:(id)target
                        action:(SEL)action
                    nomalImage:(UIImage *)nomalImage
              higeLightedImage:(UIImage *)higeLightedImage
               imageEdgeInsets:(UIEdgeInsets)imageEdgeInsets; /** 根据图片与文字生成UIBarButtonItem*/
  +(UIBarButtonItem *)cpx_itemWithTarget:(id)target
                            action:(SEL)action
                             title:(NSString *)title
                   titleEdgeInsets:(UIEdgeInsets)titleEdgeInsets ;/** 根据文字生成UIBarButtonItem*/
  +(UIBarButtonItem *)cpx_fixedSpaceWithWidth:(CGFloat)width;   /**用作修正位置的UIBarButtonItem */

CPXBaseNavigationController+Smoonth.h 用于处理平滑处理导航栏侧滑渐变效果(其中给UIViewController添加了两个属性,便于快速设置导航栏透明度以及颜色)

@property (nonatomic, assign) CGFloat navBarBgAlpha;//设置导航栏透明度
@property (nonatomic, strong) UIColor *navBarTintColor;//导航栏背景色

UITextView+Placeholder.h 用于为UITextView增加 paceHoder属性(同样适用于xib以及storyboard)

@property (nonatomic, readonly) UILabel *placeholderLabel; /**  只读属性*/              
@property (nonatomic, strong) IBInspectable NSString*placeholder;/** 适用于xib以及storyboard */
@property (nonatomic, strong) NSAttributedString *attributedPlaceholder; /** 富文本格式的占位 */
@property (nonatomic, strong) IBInspectable UIColor *placeholderColor;/** 适用于xib以及storyboard */

UILabel+init.h 用于UILabel的快速创建方式

+(UILabel *)cpx_LabelWithTextNoFrameText:(NSString *)text backgroundColor:(UIColor *)backgroundColor font:(UIFont *)font textColor:(UIColor *)textColor textAlignment:(NSTextAlignment)textAlignment;/** 快速创建UILabel */
+(UILabel *)cpx_LabelWithTextNoFrameText:(NSString *)text textColor:(UIColor *)textColor backgroundColor:(UIColor *)backgroundColor font:(UIFont *)font textAlignment:(NSTextAlignment)textAlignment;/** 快速创建UILabel */
+(UILabel *)cpx_LabelWithText:(NSString *)text textColor:(UIColor *)textColor backgroundColor:(UIColor *)backgroundColor frame:(CGRect)frame font:(UIFont *)font textAlignment:(NSTextAlignment)textAlignment;/** 快速创建UILabel */

UIImageView+Basic.h 用于异步加载图片(对sdwebImage的二次封装)

- (void)cpx_downloadImage:(NSString *)urlStr; /**异步加载图片(默认占位图)  */
- (void)cpx_downloadImage:(NSString *)urlStr placeholder:(NSString *)imageName;/** 异步加载图片(手动设置占位图) */
- (void)cpx_downloadImage:(NSString *)urlStr placeholderImage:(UIImage *)image;/** 异步加载图片(手动设置占位图) */
 -(void)cpx_downloadImage:(NSString *)urlStr placeholderSize:(CGSize)imageSize;/** 异步加载图片(手动设置占位图,并可设置占位图大小) */

NSString+AttributedString.h 用于富文本的处理(快速添加富文本属性)

-(NSAttributedString*)underLineStyleSingle;/**  添加下划线*/
-(NSMutableAttributedString*)centerLineStyleSingle; /**添加中划线 */

NSString+Basic.h 用于不安全的字符串转换为安全字符串、获取字符串的size、字典转字json符串、数组转json字符串、json字符串转数组等

+(NSString*)cpx_safetyStringByObject:(id)unsafeObj; /** 不安全的字符串转换为安全字符串 */
- (CGSize)cpx_sizeWithFont:(UIFont *)font
               maxSize:(CGSize)maxSize;/**获取字符串的宽高  */
- (CGSize)cpx_sizeWithFontSize:(CGFloat )fontSize
                   maxSize:(CGSize)maxSize; /**获取字符串的宽高  */
+ (NSString*)cpx_stringWithJsonDictionary:(NSDictionary *)dic; /**  字典转字json符串 */
+ (NSString *)cpx_StringWithArray:(NSArray *)array;  /** 数组转json字符串  */
+ (NSDictionary *)cpx_dictionaryWithJsonString:(NSString *)jsonString;/** json字符串转数组 */
+ (NSArray*)cpx_arrayWithJsonString:(NSString*)jsonString;/**  json字符串转数组*/
- (NSString *)cpx_pinyin;/** 汉字的拼音 */
-(NSAttributedString*)cpx_underLineStyleSingle;/** 生成带有下划线的富文本*/
-(NSMutableAttributedString*)cpx_centerLineStyleSingle;/**生成带有中划线的富文本 */
+(NSString * )cpx_americaMoneyFormatter:(NSNumber * )number; /**  美国千分位数字*/
+(NSString *)cpx_urlEncode:(NSString * )url_origin; /** 图片urlEncode  */

NSString+STRegex.h 用于正则表达式相关处理

- (BOOL)cpx_isValidEmail; /** 邮箱验证 */
- (BOOL)cpx_isValidPhoneNum;/** 手机号码验证 */
- (BOOL)cpx_isValidCarNo;/** 车牌号验证 */
- (BOOL)cpx_isValidUrl;/** 网址验证 */
- (BOOL)cpx_isValidPostalcode;/** 邮政编码 */
- (BOOL)cpx_isValidChinese;/** 纯汉字 */
- (BOOL)cpx_isValidIP; /** 是否符合IP格式,xxx.xxx.xxx.xxx */
- (BOOL)cpx_isValidIdCardNum; /** 身份证验证 refer to http://blog.csdn.net/afyzgh/article/details/16965107*/ */
- (BOOL)cpx_isValidWithMinLenth:(NSInteger)minLenth
               maxLenth:(NSInteger)maxLenth
         containChinese:(BOOL)containChinese
    firstCannotBeDigtal:(BOOL)firstCannotBeDigtal;/** 是否符合最小长度、最长长度,是否包含中文,首字母是否可以为数字 */
    - (BOOL)cpx_isValidWithMinLenth:(NSInteger)minLenth
               maxLenth:(NSInteger)maxLenth
         containChinese:(BOOL)containChinese
          containDigtal:(BOOL)containDigtal
          containLetter:(BOOL)containLetter
  containOtherCharacter:(NSString *)containOtherCharacter
    firstCannotBeDigtal:(BOOL)firstCannotBeDigtal;/** 是否符合最小长度、最长长度,是否包含中文,数字,字母,其他字符,首字母是否可以为数字 */
    - (NSString *)cpx_stringByTrimmingBlank;/** 去掉两端空格和换行符 */
    - (NSString *)cpx_removeHtmlFormat;/** 去掉html格式 */
    - (BOOL)cpx_isValidTaxNo;/** 工商税号 */
    - (BOOL)cpx_isIncludingEmoji;/** 判断是否包含emoji */

NSString+timer.h 用于时间与字符串之间的相互转换之间的处理

typedef enum  {
timeStampTypeYMDHMS  = 0,   //年月日时分秒
timeStampTypeYMD,           //年月日
timeStampTypeHMS,            //时分秒
timeStampTypeHM    //时
} timeStampType;
+ (NSString *)cpx_timeWithTimeIntervalString:(NSString *)timeString;/**  时间戳转时间 */
+ (NSString *)cpx_getTimeWithTimeIntervalStr:(NSString *)timeStampStr  timeStampType:(timeStampType)timeStampType;/**   时间戳转时间(自定义样式) */
+ (NSString *)cpx_timeToTurnTheTimestamp;/** 当前日期转时间戳(日期NSDate 转 时间戳NSString) */
+(NSString *)cpx_getCureentTime; /**  获取当前时间字符串 */
+ (NSTimeInterval)cpx_getCurrentTimeValue;/**  获取当前时间字符串 */
+(NSString *)cpx_getCureentTimeWithFormatter:(timeStampType)timeStampType;  /**   获取当前时间字符串(需传入时间样式) */
+(NSString *)cpx_turnTheTimestampString:(NSString*) timeStr;/**   日期字符串转时间戳(NSString转时间戳NSString*/
+(NSMutableArray *)cpx_caculateDiffreceMonthFromDate:(NSString *)fromDate;/**  计算两个日期的相差月数,并返回中间间隔的月份 */
+(NSString *)cpx_getYestodayDate;/**  获取昨天的日期 */
+(NSString *)cpx_timeStrChangeWithTime:(NSInteger)timeNum;/** //将时间(s)转换成时间戳(MM:ss) */

NSArray+Basic.h 处理不安全数组

NSArray+log.h 用于控制台打印中文(因为网络请求的数据在控制台显示出来是UTF-8格式,只需导入该头文件即可打印中文信息)

NSObject+Basic.h 数据持久化(单列存储)

 -(void)cpx_saveValue:(NSString*)key Value:(id)value;/** 存储值 */
 -(id)cpx_getValue:(NSString*)key;/** 取值 */
 -(void)cpx_setBoolValue:(BOOL)value forKey:(NSString *)key;/**  存储布尔值*/

Extensions

UIViewExt.h 用于调取UIView的坐标

 @property CGPoint origin;  /** 位置 */
 @property CGSize size;  /** 大小 */
 @property (readonly) CGPoint bottomLeft;  /**坐下  */
 @property (readonly) CGPoint bottomRight;  /**  右下*/
 @property (readonly) CGPoint topRight;  /** 右上*/
 @property CGFloat height;  /** 高 */
 @property CGFloat width;  /** 宽 */
 @property CGFloat top;  /** 上 */
 @property CGFloat left;  /** 左 */
 @property CGFloat bottom;  /**下  */
 @property CGFloat right;  /** 右 */
 @property (nonatomic, assign) CGFloat centerX;/**中心X  */
 @property (nonatomic, assign) CGFloat centerY;/** 中心Y */
 - (void) moveBy: (CGPoint) delta;/**  移动*/
 - (void) scaleBy: (CGFloat) scaleFactor;/** 缩放 */
 - (void) fitInSize: (CGSize) aSize;/** 适应 */
 - (UIView *)gridViewsCustom:(NSArray *)views inColumn:(NSInteger)column size:(CGSize)cellSize margin:(UIEdgeInsets)margin inRect:(CGRect)rect;/**  */

ColorEx.h用于扩展颜色的功能

///******************颜色与16进制RGB的转化*******************//
- (NSString *) stringFromColor;  /**将颜色转化为rgb的字符串  */
+ (UIColor *) colorWithString: (NSString *) stringToConvert; /**  将rgb的字符串转为颜色*/ 
- (NSString *) hexStringFromColor; /** 将16进制颜色转换为rgb字符串 */ 
+ (UIColor *) colorWithHexStringBeta: (NSString *) stringToConvert;/** 将16进制字符串转为颜色 */
+ (UInt32) RGBWithString: (NSString *) stringToRGB;/** 将rgb字符串转为UInt 32 rgb */
+ (UIColor *) colorWithHexString: (NSString *) stringToConvert;/** 将16进制字符串转为color */

HJCornerRadius.h 用于高效设置imageView的圆角,避免maskTobounds

@property (nonatomic, assign) CGFloat aliCornerRadius;/** 圆角数 */    

NetworkManager(核心类)

 在这个类中,我们对网络请求进行了很多封装以应对不同场景不同需求。(其中body数据传输、网络缓存、文件上传下载、断点传输,都进行了封装,一句代码轻松实现功能)

CPXNetCofig.h 网络层宏文件(用于配置网络请求的各种参数及宏)

CPXNetworkCache.h 网络层数据缓存类(存储方式:Cache)

这个类是主要是对YYCache的二次封装,实现了异步缓存数据,不仅用于网络请求,也可以用于其他数据的存储。(注意:不能直接对Model数据进行缓存,必须对model进行转化)
+ (void)setHttpCache:(id)httpData URL:(NSString *)URL parameters:(id)parameters;      /**异步缓存网络数据,根据请求的 URL与parameters,做KEY存储数据, 这样就能缓存多级页面的数据  */
+ (void)setHttpCache:(id)httpData Key:(NSString *)Key;  /**异步缓存数据,不局限与网络请求数据  */
+ (id)httpCacheForURL:(NSString *)URL parameters:(id)parameters; /**根据请求的 URL与parameters 同步取出缓存数据  */
+ (id)httpCacheForKey:(NSString *)Key;/**同步取出缓存数据,不局限与网络请求数据  */
+ (void)removeHttpDataForURL:(NSString *)URL parameters:(id)parameters;/** 删除对应的网络请求缓存数据*/
+ (void)removeHttpDataForKey:(NSString *)key;/** 删除对应key的缓存数据*/
+ (NSInteger)getAllHttpCacheSize;  /** 获取缓存的大小bytes(字节) */
+ (void)removeAllHttpCache; /** 删除所有缓存,清空缓存 */

CPXNetworkManagerModel.h 此Model用于进行网络请求前的各种配置,以便应对各种需求,具体用法请看参数说明

 typedef NS_ENUM(NSInteger, CPXNetWorkReliability) {
//如果没有发送成功,再次请求
CPXNetWorkReliabilityRetry = 0,
//必须要成功的请求,如果不成功就存入DB,然后再网络好的情况下继续发送,参照微信发消息
//需要注意,这类请求是不需要回调的
//类似于发微信成功与否
//必定成功,只要有网的情况下必定成功
CPXNetWorkReliabilityStoreToDB,
//普通请求,成不成功不影响业务,不需要重新发送
//类似统计、后台拉取本地已有的配置之类的请求
CPXNetWorkReliabilityNormal
};  
  /**
网络请求方式
- CPXRequestMethodGET: GET
- CPXRequestMethodPOST: POS
- CPXRequestMethodPUT:  PUT
- CPXRequestMethodPATCH :PATCH
- CPXRequestMethodDELETE: DELETE
*/
typedef NS_ENUM(NSInteger, CPXRequestMethod) {
   CPXRequestMethodGET = 0,
   CPXRequestMethodPOST,
   CPXRequestMethodPUT,
   CPXRequestMethodPATCH,
   CPXRequestMethodDELETE    
}
//网络请求Fail的展示
 typedef NS_ENUM(NSInteger, RequestErrorShowStyle) {
ErrorShowNone = 0,  //无
ErrorShowWithHub,    //展示hub
ErrorShowWithEmptyConfig,    //展示占位图
};  //网络请求失败展示效果
/// 网络状态的Block
typedef void(^CPXNetworkMethodType)(CPXRequestMethod status);
@property (nonatomic, copy) NSString *urlStr;  /**  请求的url(必传) */
@property (nonatomic, copy) NSDictionary *params;  /** 请求参数(可不传) */
@property(nonatomic,strong)NSDictionary *bodyDic;  /**  用于body网络请求传参数 */
@property (nonatomic, assign) BOOL isCache;  /** 缓存开关 YES:打开开关 NO:关闭开关(默认关闭)  */
@property (nonatomic, assign) int expirationTime; /** 缓存过期时间  有网默认600秒 无网30天 */ 
@property (nonatomic, assign) CPXNetWorkReliability reliability;  /**  请求重复策略,默认重发(暂时没用) */ 
@property (nonatomic, assign) int retryCount;  /**网络请求超时时间  */ 
@property (nonatomic,assign) CGFloat retryDelay;      /** 每次retry之间的间隔时间(默认0.1秒)  */
@property (nonatomic, assign) CPXRequestMethod requestMethod;     /** 请求方式(默认get)  */   
@property (nonatomic,assign) BOOL isShowHub; /**  是否展示菊花(默认为NO) */  
@property (nonatomic,strong) UIView *showView; /**  菊花展示的view(配合IsShowHub使用,默认为window) */   
@property (nonatomic,strong) UIScrollView *ScrollView;  /**  传入一个继承于scrollView(tableview和collectionView都可以),用来关闭上拉下拉刷新 */   
@property (nonatomic,assign) BOOL isFreshing;/**  判断是否为手动刷新数据(如果是手动刷新数据就不用判断时间是否过期 :  YES代表手动刷新数据) */
@property(nonatomic,assign)BOOL showNetworkActivityIndicator;  /** 是否展示状态栏小菊花(默认打开)  */ 
@property(nonatomic,assign)RequestErrorShowStyle errorStyle; /**  网络请求错误的展示方式 */
@property(nonatomic,assign)BOOL showCodeMsg;  /**  是否展示错误信息信息 */
@property(nonatomic,assign)BOOL isCancelRequest;  /** 是否取消当前网络请求  */

CPXBaseNetworkManager.h Base网络请求Manger(主要处理一些试图交互逻辑的处理),继承于CPXNetworkManager

/**
不带缓存的网络请求
@param model 网络请求配置model
@param success 成功的回调
@param failure 失败的回调
*/
  + (void)CPXBaseRequestWithNetworkModel:(CPXNetworkManagerModel *)model
                       success:(CPXHttpRequestSuccess)success
                       failure:(CPXHttpRequestFailed)failure;

/**
 带缓存的网络请求
 @param model 网络请求配置model
 @param responseCache 缓存的回调
 @param success 成功的回调
 @param failure 失败的回调
 */
+ (void)CPXBaseRequestWithNetworkModel:(CPXNetworkManagerModel *)model
                 responseCache:(CPXHttpRequestCache)responseCache
                       success:(CPXHttpRequestSuccess)success
                       failure:(CPXHttpRequestFailed)failure;

CPXNetworkManager.h 网络请求,主要处理缓存以及过期问题。对各种请求方法的整合,继承于CPXNetworkHelper

CPXNetworkHelper.h 用于封装AFN

  /**
有网YES, 无网:NO
@return BOOL
*/
+ (BOOL)isNetwork;
/**
手机网络:YES, 反之:NO
@return BOOL
*/
+ (BOOL)isWWANNetwork;
/**
WiFi网络:YES, 反之:NO
@return BOOL
*/
+ (BOOL)isWiFiNetwork;
/**
取消所有HTTP请求
*/
 + (void)cancelAllRequest;
 /**
实时获取网络状态,通过Block回调实时获取(此方法可多次调用)
 @param networkStatus 网络类型枚举值
*/
 + (void)networkStatusWithBlock:(CPXNetworkStatus)networkStatus;
   /**
取消指定URL的HTTP请求
@param URL 指定的URL
 */
+ (void)cancelRequestWithURL:(NSString *)URL;
    /**
 开启日志打印 (Debug级别)
   */
 + (void)openLog;
/**
 关闭日志打印,默认打开
*/
+ (void)closeLog;
  /**
 *  GET请求,无缓存
 *
 *  @param URL        请求地址
 *  @param parameters 请求参数
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)URL
                    parameters:(id)parameters
                       success:(CPXHttpRequestSuccess)success
                       failure:(CPXHttpRequestFailed)failure;
/**
 *  GET请求,自动缓存
 *
 *  @param URL           请求地址
 *  @param parameters    请求参数
 *  @param responseCache 缓存数据的回调
 *  @param success       请求成功的回调
 *  @param failure       请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
+ (__kindof NSURLSessionTask *)GET:(NSString *)URL
                        parameters:(id)parameters
                 responseCache:(CPXHttpRequestCache)responseCache
                       success:(CPXHttpRequestSuccess)success
                       failure:(CPXHttpRequestFailed)failure;
  /**
  *  PUT请求,自动缓存
  *
  *  @param URL           请求地址
  *  @param parameters    请求参数
  *  @param responseCache 缓存数据的回调
  *  @param success       请求成功的回调
  *  @param failure       请求失败的回调
  *
  *  @return 返回的对象可取消请求,调用cancel方法
  */
 + (__kindof NSURLSessionTask *)PUT:(NSString *)URL
                    parameters:(id)parameters
                 responseCache:(CPXHttpRequestCache)responseCache
                       success:(CPXHttpRequestSuccess)success
                       failure:(CPXHttpRequestFailed)failure;
  /**
   *  PATCH请求,自动缓存
   *
   *  @param URL           请求地址
   *  @param parameters    请求参数
   *  @param responseCache 缓存数据的回调
   *  @param success       请求成功的回调
   *  @param failure       请求失败的回调
   *
   *  @return 返回的对象可取消请求,调用cancel方法
   */
  + (__kindof NSURLSessionTask *)PATCH:(NSString *)URL
                    parameters:(id)parameters
                 responseCache:(CPXHttpRequestCache)responseCache
                       success:(CPXHttpRequestSuccess)success
                       failure:(CPXHttpRequestFailed)failure;
  /**
   *  POST请求,自动缓存
   *
   *  @param URL           请求地址
   *  @param parameters    请求参数
   *  @param responseCache 缓存数据的回调
   *  @param success       请求成功的回调
   *  @param failure       请求失败的回调
   *
   *  @return 返回的对象可取消请求,调用cancel方法
   */
  + (__kindof NSURLSessionTask *)POST:(NSString *)URL
                     parameters:(id)parameters
                  responseCache:(CPXHttpRequestCache)responseCache
                        success:(CPXHttpRequestSuccess)success
                        failure:(CPXHttpRequestFailed)failure;
   /***  DELETE请求,自动缓存
   @param URL 请求地址
   @param parameters 请求参数
   @param responseCache 缓存的回调
   @param success 请求成功的回调
   @param failure 请求失败的回调
   @return 返回的对象可取消请求,调用cancel方法
   */
  + (__kindof NSURLSessionTask *)DELETE:(NSString *)URL
                       parameters:(id)parameters
                    responseCache:(CPXHttpRequestCache)responseCache
                          success:(CPXHttpRequestSuccess)success
                          failure:(CPXHttpRequestFailed)failure;

/**  上传文件
  *
  *  @param URL        请求地址
  *  @param parameters 请求参数
  *  @param name       文件对应服务器上的   
  *  @param filePath   文件本地的沙盒路径
  *  @param progress   上传进度信息
  *  @param success    请求成功的回调
  *  @param failure    请求失败的回调
  *
  *  @return 返回的对象可取消请求,调用cancel方法
  */
 + (__kindof NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
                                  parameters:(id)parameters
                                        name:(NSString *)name
                                    filePath:(NSString *)filePath
                                    progress:(CPXHttpProgress)progress
                                     success:(CPXHttpRequestSuccess)success
                                     failure:(CPXHttpRequestFailed)failure;
 /**
 *  上传单/多张图片
 *
 *  @param URL        请求地址
 *  @param parameters 请求参数
 *  @param name       图片对应服务器上的字段
 *  @param images     图片数组
 *  @param fileNames  图片文件名数组, 可以为nil, 数组内的文件名默认为当前日期时间"yyyyMMddHHmmss"
 *  @param imageScale 图片文件压缩比 范围 (0.f ~ 1.f)
 *  @param imageType  图片文件的类型,例:png、jpg(默认类型)....
 *  @param progress   上传进度信息
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *
 *  @return 返回的对象可取消请求,调用cancel方法
 */
 + (__kindof NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
                                    parameters:(id)parameters
                                          name:(NSString *)name
                                        images:(NSArray<UIImage *> *)images
                                     fileNames:(NSArray<NSString *> *)fileNames
                                    imageScale:(CGFloat)imageScale
                                     imageType:(NSString *)imageType
                                      progress:(CPXHttpProgress)progress
                                       success:(CPXHttpRequestSuccess)success
                                       failure:(CPXHttpRequestFailed)failure;
 /**
 *  下载文件(不支持断点下载)
 *
 *  @param URL      请求地址
 *  @param fileDir  文件存储目录(默认存储目录为Download)
 *  @param progress 文件下载的进度信息
 *  @param success  下载成功的回调(回调参数filePath:文件的路径)
 *  @param failure  下载失败的回调
 *
 *  @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,开始下载调用resume方法
 */
 + (__kindof NSURLSessionTask *)downloadWithURL:(NSString          *)URL
                                   fileDir:(NSString *)fileDir
                                  progress:(CPXHttpProgress)progress
                                   success:(void(^)(NSString *filePath))success
                                   failure:(CPXHttpRequestFailed)failure;

 /**
 Description *  下载文件(支持断点下载)

 @param urlHost 请求地址
 @param progress 文件下载的进度信息
 @param fileDir 文件存储目录(默认存储目录为Download)
 @param success 下载成功的回调(回调参数filePath:文件的路径)
 @param failure 下载失败的回调
 @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,开始下载调用resume方法
 */
 + (__kindof NSURLSessionTask *)AFDownLoadFileWithUrl:(NSString*)urlHost
                                        progress:(DowningProgress)progress
                                         fileDir:(NSString *)fileDir
                                         success:(DonwLoadSuccessBlock)success
                                         failure:(DownLoadfailBlock)failure;
 /**
 用body传参数的网络请求

 @param URL url
 @param parameters 参数
 @param body body(字典格式,方法里面自动转换)
 @param requetMetod 请求方式(POST,GET)
 @param responseCache 缓存
 @param success 成功的回调
 @param failure 失败的回调
 */
 +(void )HTTPBody:(NSString *)URL
                    prams:(id)parameters
                     body:(id)body
            requestMethod:(NSString*)requetMetod
            responseCache:(CPXHttpRequestCache)responseCache
                  success:(CPXHttpRequestSuccess)success
                  failure:(CPXHttpRequestFailed)failure;
 /**
 在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置
 (注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)
 @param sessionManager AFHTTPSessionManager的实例
 */
 + (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
 /**
 *  设置网络请求参数的格式:默认为二进制格式
 *
 *  @param requestSerializer PPRequestSerializerJSON(JSON格式),PPRequestSerializerHTTP(二进制格式),
 */
 + (void)setRequestSerializer:(CPXRequestSerializer)requestSerializer;
 /**
 *  设置服务器响应数据格式:默认为JSON格式
 *
 *  @param responseSerializer PPResponseSerializerJSON(JSON格式),PPResponseSerializerHTTP(二进制格式)
 */
 + (void)setResponseSerializer:(CPXResponseSerializer)responseSerializer;
 /**
 *  设置请求超时时间
 *
 *  @param time 时长
 */
+ (void)setRequestTimeoutInterval:(NSTimeInterval)time;
 /// 设置请求头
 + (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
 /**
  *  是否打开网络状态转圈菊花:默认打开
  *
  *  @param open YES(打开), NO(关闭)
  */
 + (void)openNetworkActivityIndicator:(BOOL)open;
 /**
  配置自建证书的Https请求, 参考链接:      http://blog.csdn.net/syg90178aw/article/details/52839103

  @param cerPath 自建Https证书的路径
  @param validatesDomainName 是否需要验证域名,默认为     YES. 如果证书的域名与请求的域名不一致,需设置为NO; 即服     务器使用其他可信任机构颁发
  的证书,也可以建立连接,这个非常危险, 建议打开.validatesDomainName=NO, 主要用于这种情况:客户端请求的是子域名, 而证书上的是另外
  一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com, 那么mail.google.com是无法验证通过的.
  */
 + (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

CPXServerDownLoadTool 此类用于断点下载(当程序意外退出或后台退出会保存下载记录)

/**
 文件下载
 @param urlHost 下载地址
 @param progress 下载进度
 @param localUrl 本地存储路径
 @param success 下载成功
 @param failure 下载失败
 @return downLoadTask
 */
- (NSURLSessionDownloadTask  *)AFDownLoadFileWithUrl:(NSString*)urlHost
                                        progress:(DowningProgress)progress
                                    fileLocalUrl:(NSURL *)localUrl
                                         success:(DonwLoadSuccessBlock)success
                                         failure:(DownLoadfailBlock)failure;
/**
 删除对应key所对应的下载数据(用于数据未下载完删除当前进度,使用方法需先取消当前任务)

 @param key key
 */
- (void)deleteDownLoadHistory:(NSString*)key;
 /** 停止所有的下载任务*/
 - (void)stopAllDownLoadTasks;

  /**  */   

ThirdPart

DYModelMaker                    字典自动生成模型类:支持多层模型嵌套、自动生成两种框架(MJExtension和YYModel)的系统关键字替换和数组中字典转模型代码

Utls

CPXAlertUtils.h MBProgressHUD的封

/**
 备注:
 1. 调用 ok,error,warning 方法时,进行信息提示,有对应图片,当时间到后,会自动消失,并且不管是否有传 toView 参数,在显示的同时还是可以进行交互的.即可以重复点击
 2. 调用 message 方法,只进行信息展示,没有对应图片.当时间到后,会自动消失,并且不管是否有传 toView 参数,在显示的同时还是可以进行交互的.即可以重复点击
 3. 调用 info 方法,显示一个 loading 视图,不会自动消失,需要外界调用对应方法让其消失,并且在展示的时候禁止用户进行其他交互.所以这里添加的图层需要注意,根据需求添加图层
 */
// 成功提示 - 会自动消失
+ (void)success:(NSString *)msg;

+ (void)success:(NSString *)msg duration:(int)duration;

+ (void)success:(NSString *)msg duration:(int)duration toView:(UIView *)toView;

// 错误提示 - 会自动消失
+ (void)error:(NSString *)msg;

+ (void)error:(NSString *)msg duration:(int)duration;

+ (void)error:(NSString *)msg duration:(int)duration toView:(UIView *)toView;

// 警告提示 - 会自动消失
+ (void)warning:(NSString *)msg;

+ (void)warning:(NSString *)msg duration:(int)duration;

+ (void)warning:(NSString *)msg duration:(int)duration toView:(UIView *)toView;

// 信息提示,没有图片
+ (void)message:(NSString *)msg;
+ (void)message:(NSString *)msg duration:(int)duration;

+ (void)message:(NSString *)msg duration:(int)duration toView:(UIView *)toView;

// 转菊花的提示 - 不会自动消失
+ (MBProgressHUD *)loading;

+ (MBProgressHUD *)loading:(NSString *)msg;

+ (MBProgressHUD *)loading:(NSString *)msg toView:(UIView *)toView;

+ (MBProgressHUD *)showTopWinMessage:(NSString *)msg duration:(int)duration;

//停止菊花提示
+ (void)stopLoading:(MBProgressHUD *)hud;
+ (void)stopLoading:(MBProgressHUD *)hud message:(NSString *)msg;
+ (void)stopLoading:(MBProgressHUD *)hud message:(NSString *)msg delay:(CGFloat)seconds completion:(void (^)(void))completion;
/**
 系统提示框(默认带一个确认按钮)
 */
+ (void)alertTitle:(NSString *)title
        andMsg:(NSString *)msg;
/**
 系统提示框(默认带一个确认按钮以及action)
 @param title 标题
 @param msg 提示信息
 @param action 按钮的响应事件
 */
+ (void)alertTitle:(NSString *)title
        andMsg:(NSString *)msg
        action:(CommonVoidBlocks)action;
/**
 系统提示框(可选择按钮个数(最多两个))

 @param title 标题
 @param msg 提示信息
 @param Name 按钮名称数组
 @param tapaAction 第一个按钮响应事件
 @param cacleAction 第二个按钮响应事件
 */
+(void)alertTitle:(NSString *)title
       andMsg:(NSString *)msg
   buttonName:(NSArray*)Name
   fistAction:(void(^)(void))tapaAction
 secondAction:(void(^)(void))cacleAction;

CommonUtls.h 公用的一些工具:获取当前控制器、快速创建model属性(快速创建网络请求返回的字典的属性)、调起相册或相机进行图片选择等

typedef NS_ENUM(NSUInteger, PhotoImagePickerStyle) {
    /// 展示底部选择试图(选择是照相还是选择相册)
      ShowChooseViewStyle,
    ///直接照相
     TakePhotoStyle,
    /// 直接进入相册
    ChooseFromAblumStyle,

};
/**
 调起相册或相机进行图片选择
   参考链接:https://github.com/longitachi/ZLPhotoBrowser
 @param number 图片选择的张数
 @param selectImageBlock 图片选择成功的回调
 */
+(ZLPhotoActionSheet*)presentImagePickControllerWithImageNumber:(NSInteger)number type:(PhotoImagePickerStyle)style complet:(void (^)(NSArray<UIImage *> *__nullable imagesArray))selectImageBlock;

/**
 图片浏览器(可选择样式)
参考链接:https://github.com/CoderXLLau/XLPhotoBrowser
 @param imageArray 图片数组(数组里面可以是url字符串,NSurl对象,image对象、)
 @param index 当前页数
 */
+(void)showPhotoBrowserWithImages:(NSArray *)imageArray
            currentImageIndex:(NSInteger)index;



/**
 获取的当前显示的控制器
  */
+ (UIViewController *)cpx_getCurrentDisplayController;
+ (UIViewController *)cpx_getParentControllerFromView:(UIView *)view;


/**
 获取当前TabBarController
 */
+(UITabBarController *)currentTtabarController;

/**
 获取当前TabBarController持有的NavigationController
 */
+(UINavigationController         *)currentTabbarSelectedNavigationController;

/**
 获取当前导航栏持有的控制器
 */
+(UIViewController*)getCurrentViewController;


/**
 快速创建model属性(快速创建网络请求返回的字典的属性)

 @param dict 网络请求返回的字典
 */
+(void)createModelWithDictionary:(NSDictionary *)dict;


/**
 获取当前app版本号

 */
+(NSString *)getcCurrentAppVersion;


/**
 获取UUID
 */
+ (NSString *)getUUID;
/**
 当前国家代码

 */
+(NSString *)currentCountryCode;

/**
 设置状态栏颜色
 */
+ (void)setStatusBarBackgroundColor:(UIColor *)color;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356