iOS【react native】嘗試一

#import "React/RCTEventEmitter.h"
@interface FFRNEventEmitter : RCTEventEmitter

// 導出你所有的方法名字
- (NSArray<NSString *> *)supportedEvents;

-(void)iseCallback:(NSString*)code result:(NSString*) result;
-(void)iseVolume:(NSString*)code result:(NSString*) result;
-(void)playCallback:(NSString*)code result:(NSString*) result;

@property (nonatomic, weak) RCTBridge *bridge;

@end


#import "FFRNEventEmitter.h"


@implementation FFRNEventEmitter
@synthesize bridge = _bridge;

RCT_EXPORT_MODULE()

// 導出你所有的方法名字
- (NSArray<NSString *> *)supportedEvents
{
  return @[@"iseCallback", @"iseVolume", @"playCallback"];//有幾個就寫幾個
}

-(void)iseCallback:(NSString*)code result:(NSString*) result
{
  [self sendEventWithName:@"iseCallback"
                     body:@{
                            @"code": code,
                            @"result": result,
                            }];
}

-(void)iseVolume:(NSString*)code result:(NSString*) result
{
  [self sendEventWithName:@"iseCallback"
                     body:@{
                            @"code": code,
                            @"result": result,
                            }];
}

-(void)playCallback:(NSString*)code result:(NSString*) result
{
  [self sendEventWithName:@"iseCallback"
                     body:@{
                            @"code": code,
                            @"result": result,
                            }];
}
@end
#import <Foundation/Foundation.h>
#import "FFRNCatgoryListCtrl.h"

@interface FFRNSington : NSObject

+ (FFRNSington *)sharedInstance;

@property (nonatomic, weak) FFRNCatgoryListCtrl *RNCatgoryListCtrl;
@end


#import "FFRNSington.h"

@implementation FFRNSington

+ (FFRNSington *)sharedInstance
{
  static FFRNSington *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[self alloc] init];
  });
  return instance;
}

@end
#import <Foundation/Foundation.h>

typedef void (^OperateBlock)(id object);
@interface RNSQLManager : NSObject

@property (nonatomic, copy) OperateBlock operateBlock;
@end


#import "RNSQLManager.h"

@implementation RNSQLManager

- (void)query:(NSString *)queryData successCallback:(OperateBlock)responseSender
{
   
}
@end
#import <UIKit/UIKit.h>
#import "FFEasyLifeCatagoryModel.h"

#import <React/RCTBridgeModule.h>
#import <React/RCTLog.h>

#import "React/RCTEventEmitter.h"
#import "FFRNEventEmitter.h"

@interface FFRNCatgoryListCtrl : UIViewController<RCTBridgeModule>
@property (nonatomic, strong) FFEasyLifeCatagoryModel *selectModel;
@end


#import "FFRNCatgoryListCtrl.h"
#import "FFEasyLifeActivityDetailCtrl.h"
#import "FFEasyLifeCataProduListModel.h"

#import "FFRNSington.h"

#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTBridge.h>
#import <React/RCTEventDispatcher.h>
#import <React/RCTEventEmitter.h>

@interface FFRNCatgoryListCtrl ()

@property (strong, nonatomic) YSTopBarView *topBarView;
@end

@implementation FFRNCatgoryListCtrl


RCT_EXPORT_MODULE()
RCT_EXPORT_METHOD(print:(NSString *)text) {
    
    NSLog(@"---- %@",text);
}

// 接收傳過來的 NSString + NSDictionary
RCT_EXPORT_METHOD(addEventTwo:(NSString *)name details:(NSDictionary *)details)
{
    RCTLogInfo(@"接收傳過來的NSString+NSDictionary: %@ %@", name, details);
    
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        
        FFEasyLifeCataProduListModel *model = [[FFEasyLifeCataProduListModel alloc] initWithDic:details];
        model.title2 = @"";
        
        FFEasyLifeActivityDetailCtrl *vc = [[FFEasyLifeActivityDetailCtrl alloc] initWithNibName:kFFEasyLifeActivityDetailCtrl bundle:nil];
        vc.actType = model.type;
        vc.idx = model.goodsId;
        vc.activityId = model.activityId;
        
        [[FFRNSington sharedInstance].RNCatgoryListCtrl.navigationController pushViewController:vc animated:YES];
    }];
    
}

//回調(diào)函數(shù)愿题,在官方的文檔中是有上面的一個警告,不過在使用過程暫時未發(fā)現(xiàn)問題。在OC中届搁,我們添加一個getNativeClass方法兄渺,將當前模塊的類名回調(diào)給JS。
RCT_EXPORT_METHOD(getNativeClass:(RCTResponseSenderBlock)callback) {
    callback(@[NSStringFromClass([self class])]);
}


+ (NSArray *)__rct_export__230
{
    return @[ @"", @"addEvent:(NSString *)name location:(NSString *)location" ];
}


//原生模塊可以導出一些常量眉睹,這些常量在JavaScript端隨時都可以訪問舞终。用這種方法來傳遞一些靜態(tài)數(shù)據(jù),可以避免通過bridge進行一次來回交互旬薯。
//但是注意這個常量僅僅在初始化的時候?qū)С隽艘淮挝铮约词鼓阍谶\行期間改變constantToExport返回的值,也不會影響到JavaScript環(huán)境下所得到的結(jié)果绊序。
- (NSDictionary *)constantsToExport {
    return @{ @"BGModuleName" : @"BGNativeModuleExample",
              @"TestName": @"我是從原生定義的~",
              };
}


//  對外提供調(diào)用方法,演示Callback
RCT_EXPORT_METHOD(testCallbackEventOne:(NSString *)name callback:(RCTResponseSenderBlock)callback)
{
    NSLog(@"%@",name);
    NSArray *events=@[@"1", @"2", @"3",@"4"]; //準備回調(diào)回去的數(shù)據(jù)
    callback(@[[NSNull null],events]);
}

//  對外提供調(diào)用方法,演示Promise使用
RCT_REMAP_METHOD(testCallbackEventTwo,
                 resolver:(RCTPromiseResolveBlock)resolve
                 rejecter:(RCTPromiseRejectBlock)reject)
{
    NSArray *events =@[@"one ",@"two ",@"three"];//準備回調(diào)回去的數(shù)據(jù)
    if (events) {
        resolve(events);
    } else {
        NSError *error=[NSError errorWithDomain:@"我是Promise回調(diào)錯誤信息..." code:101 userInfo:nil];
        reject(@"no_events", @"There were no events", error);
    }
}

/**
 注:不知道為什么RN所在的類中self的內(nèi)存地址會被修改,意思就是你想要的self跟你在于js交互中用到的self不是同一個self.同時出現(xiàn)的情況就會出現(xiàn)pop不掉我們的RN類的這個界面.
 
 解決辦法:使用單例來保存我們原本要用的self,在viewDidLoad方法中做保存
 */

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.topBarView = [[YSTopBarView alloc] initWithFrame:CGRectMake(0, 0, k_SCREEN_WIDTH, 64)];
    self.topBarView.leftLabel.text = @"RN_分類";
    [_topBarView.leftButton addTarget:self action:@selector(actionBack) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.topBarView];
    
//    http://reactnative.cn
    
    
    [FFRNSington sharedInstance].RNCatgoryListCtrl = self;

    NSDictionary *props = @{@"cid" : [NSString limitStringNotEmpty:self.selectModel.idx]};
    NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                        moduleName:@"EasyLife"
                                                 initialProperties:props
                                                     launchOptions:nil];
    rootView.frame = CGRectMake(0, 64, k_SCREEN_WIDTH, k_SCREEN_HEIGHT - 64);
    [self.view addSubview:rootView];
}

- (void)actionBack {
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end

js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
    SegmentedControlIOS,
    AppRegistry,
    StyleSheet,
    Text,
    Alert,
    FlatList,
    ActivityIndicator,
    Animated,
    ScrollView,
    Image,
    View,
    TouchableOpacity,
} from 'react-native';

var{NativeModules} =require('react-native');
var{NativeEventEmitter} =require('react-native');

var FFRNCatgoryListCtrl=NativeModules.FFRNCatgoryListCtrl;
var FFRNEventEmitter=NativeModules.FFRNEventEmitter;
const myNativeEvt = new NativeEventEmitter(FFRNEventEmitter);  //創(chuàng)建自定義事件接口

var ITEM_HEIGHT = 100;
const AnimatedFlatList = Animated.createAnimatedComponent(FlatList);
// const REQUEST_URL = 'https://api.github.com/search/repositories?q=javascript&sort=stars';
const REQUEST_URL = 'http://192.168.11.23:8086/app-client-web/commodity/searchCommodity.do?&params=%7BcityId:%22%22,sort:%22sales%22,pageSize:20,cid:%227556cb32899248edb5617a722ab0eb53%22,title:%22%22,client_type:2,sys_user_id:%22%22,page:1,desc:1%7D';


const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
    },
    instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
    },
    render: {
        padding: 10,
        paddingTop:20,
        flex: 1,
    },
    icon: {
        marginLeft:10,
        alignItems: 'center',
        width: ITEM_HEIGHT,
        height: ITEM_HEIGHT,
    },
    topicCard: {
        flex: 1,
        flexDirection: 'row',
        padding: 10,
        backgroundColor: '#ffffff',
        borderColor: '#f0f0f0',
        borderStyle: 'solid',
        borderWidth: 1,
        borderRadius: 0
    },
    avatarImg: {
        width: 110,
        height: 110,
        justifyContent:'center',
        borderRadius: 2
    },
    titleMeta: {
        flex: 7,
        marginLeft:15,
        marginRight:10,
        //backgroundColor: 'green',
    },
    topicTitle: {
        marginTop:5,
        fontSize: 16,
        lineHeight: 20,
        fontWeight: 'bold',
        letterSpacing: 1,
        color: '#333333',
        //backgroundColor: '#ff6b13',
    },
    metaarea: {
        flexDirection: 'row',
        marginTop: 10,
        justifyContent: 'flex-start',
        flexWrap: 'wrap',
        //backgroundColor: '#800080',
    },
    metainfo: {
        color: '#999999',
        fontSize: 12,
        lineHeight: 16,
        letterSpacing: 1,
        marginRight: 5
    },
    metaareatag: {
        flexDirection: 'row',
        marginTop: 2,
        justifyContent: 'flex-start',
        flexWrap: 'wrap',
        //backgroundColor: '#556B2F',
    },
    nodename: {
        color: '#999999',
        fontSize: 12,
        lineHeight: 16
    },
    replieCountBg: {
        backgroundColor: '#e74c3c',
        position: 'absolute',
        bottom: 0,
        right: 0,
        paddingBottom: 5,
        paddingTop: 5,
        paddingLeft: 10,
        paddingRight: 10,
        borderRadius: 11
    },
    replieCount: {
        fontSize: 12,
        lineHeight: 12,
        color: '#ffffff',
        fontWeight: 'bold'
    },
});


export default class EasyLife extends Component {

    static navigationOptions = {
        title: 'SegmentedControlIOS',
    };

    constructor(props) {
        super(props);
        this.state = {
            refreshing: true,
            loadMore: false,
            isLoading: true,
            //網(wǎng)絡請求狀態(tài)
            error: false,
            errorInfo: "",
            dataArray: [],
            sort: "sales",
            desc: 1,
            url: REQUEST_URL,
            index: 0,
            cid: "",

        }

        // { (this: any).requestData() = this.requestData().bind(this)}
        // { (this: any)._renderCell() = this._renderCell().bind(this)}
        // { (this: any)._header() = this._header().bind(this)}
        // { (this: any)._footer() = this._footer().bind(this)}

    }

    //渲染完成后調(diào)用一次硕舆,這個時候DOM結(jié)構(gòu)已經(jīng)渲染了。這個時候就可以初始化其他框架的設置了政模,如果利用jQuery綁定事件等等岗宣。
    componentDidMount() {
        //請求數(shù)據(jù)
        this.requestData();
    }


    //在組件中使用
    componentWillMount() {
        this.listener = myNativeEvt.addListener('iseCallback', this.iseCallback.bind(this));  //對應了原生端的名字
    }

    componentWillUnmount() {
        this.listener && this.listener.remove();  //記得remove哦
        this.listener = null;
    }


    /**
     *
     *   一些事件回調(diào)
     *
     * */
    iseCallback(data) {//接受原生傳過來的數(shù)據(jù) data={code:,result:}

        alert('數(shù)據(jù)');
        if (data.code == CB_CODE_RESULT) {
            //
        }
        else {//..真的是未知的錯誤
            logf('傳回其他參數(shù)', data.result);
        }
    }


// 傳原生一個字符串 + 回調(diào)
    callBackOne = () => {
        FFRNCatgoryListCtrl.testCallbackEventOne(('我是RN給原生的'), (error, events) => {
            if (error) {
                console.error(error);
            } else {
                this.state.cid = events;
                this.renderData();
            }
        })
    }


    callErrorBack = () => {
        // try{
        //     var events=await FFRNCatgoryListCtrl.testCallbackEventTwo();
        //     alert(events)
        // }catch(e){
        //     console.error(e);
        // }
    }


    //加載等待的view
    renderLoadingView() {
        return (
            <View style={styles.container}>
                <ActivityIndicator animating={true} style={[styles.gray, {height: 80}]} color='red' size="large"
                />
            </View>
        );
    }


    //加載失敗view
    renderErrorView(error) {
        return (
            <View style={styles.container}>
                <Text> Fail: {error} </Text>
            </View>
        );
    }


    /**
     *
     *  網(wǎng)絡請求
     *
     * */

    requestData() {

        let formData = new FormData();
        var test_url = 'http://192.168.11.23:8086/app-client-web/commodity/searchCommodity.do?';

        formData.append("title":"");
        formData.append("cid":"");
        formData.append("cityId":"");
        formData.append("sort":"");
        formData.append("desc":"");
        formData.append("page":"");
        formData.append("pageSize":"");

        let params = '&params={cityId:"",sort:"'
            + this.state.sort
            + '",pageSize:20,cid:"'
            + this.state.cid
            + '",title:"",client_type:2,sys_user_id:"",page:1,desc:'
            + this.state.desc + '}';

        fetch(test_url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
            body: params,
        })

            .then((response) => response.json())
            .then((responseData) => {
                let data = responseData.resultData.items;
                let dataBlob = [];
                let i = 0;

                //遍歷data數(shù)組中的每個元素,并按照return中的計算方式 形成一個新的元素淋样,放入返回的數(shù)組中 如:dataBlob
                //數(shù)組判斷
                if (Array.isArray(data)) {
                    data.map(function (item) {
                        dataBlob.push({
                            key: i,
                            goodsId: item.goodsId,
                            activityId: item.activityId,
                            type: item.type,
                            name: item.name,
                            imgPath: item.imgPath,
                            discountPrice: item.discountPrice,
                            buycount: item.buycount,
                            tempTest: item.tempTest,
                        })
                        i++;

                    });
                }

                this.setState({
                    //復制數(shù)據(jù)源
                    dataArray: dataBlob,
                    isLoading: false,
                    refreshing: false,
                    loadMore: false,
                })

                data = null;
                dataBlob = null;
            });
    }


    /**
     *
     *  選擇事件
     *
     * */
    changeSegment = (event) => {

        this.state.index = event.nativeEvent.selectedSegmentIndex;

        if (event.nativeEvent.selectedSegmentIndex == 0) {
            this.state.sort = "sales";
            this.state.desc = 1;

        } else if (event.nativeEvent.selectedSegmentIndex == 1) {
            this.state.sort = "price";
            this.state.desc = 1;

        } else {
            this.state.sort = "price";
            this.state.desc = 0;
        }

        //網(wǎng)絡請求
        this.requestData();
    }



    /**
     *
     *  按鈕事件
     *
     * */
    _onPressItem = (item: Object) => {
        FFRNCatgoryListCtrl.addEventTwo('occ', item);
        //FFRNCatgoryListCtrl.print("Hello World");
    };


    /**
     *
     *  列表單元格
     *
     * */
    _renderCell = (item) => {

        var title = '';
        var discountPrice = '';
        var buycount = '';
        var imgPath = '';
        var tempTest;

        var subData;
        if (this.state.dataArray.length > item.index) {
            subData = this.state.dataArray[item.index];
            title = this.state.dataArray[item.index].name;
            discountPrice = '¥' + this.state.dataArray[item.index].discountPrice;
            buycount = '銷售指數(shù)' + this.state.dataArray[item.index].buycount;
            imgPath = this.state.dataArray[item.index].imgPath;
            if (imgPath.includes('size')) {
                imgPath = imgPath.replace('size', 'origin');
            }
            tempTest = this.state.dataArray[item.index].tempTest;
        }

        return (
            <TouchableOpacity onPress={()=>{this._onPressItem(subData)}}  activeOpacity={0.8}>
                <View style={styles.topicCard}>
                    <View>
                        <Image style={styles.avatarImg} source={{uri: imgPath}} resizeMode='cover'/>
                    </View>

                    <View style={styles.titleMeta}>
                        <Text style={styles.topicTitle} numberOfLines={2}>{title}</Text>
                        <View style={styles.metaarea}>
                            <Text style={styles.metainfo}>{discountPrice}</Text>
                            <Text style={styles.metainfo}>{tempTest}</Text>
                        </View>

                        <View style={styles.metaareatag}>
                            {/*<Text style={styles.nodename}>{'occ'}</Text>*/}
                            <View style={styles.replieCountBg}>
                                <Text style={styles.replieCount}>{buycount}</Text>
                            </View>
                        </View>
                    </View>

                </View>
            </TouchableOpacity>
        );
    }

    _header = () => {
        return <Text style={[styles.txt, {backgroundColor: 'white'}]}></Text>;
    }

    _footer = () => {
        return <Text style={[styles.txt, {backgroundColor: 'white'}]}></Text>;
    }

    _separator = () => {
        return <View style={{height: 2, backgroundColor: 'yellow'}}/>;
    }

    /**
     *
     *  刷新事件
     *
     * */
    _onRefresh = () => {
        this.setState({refreshing: true})
        this.requestData();
    }

    /**
     *
     * 加載更多 <未實現(xiàn)耗式,有問題>
     *
     * */
    _loadMoreData = () => {

        // alert("-- 加載更多");
        // this.state.loadMore = true;
        // this.requestData();
    }




    renderData() {
        return (
            <View style={{flex: 1}}>
                <SegmentedControlIOS
                    //enabled={false}
                    selectedIndex={this.state.index}
                    //momentary={true}
                    onChange={this.changeSegment}
                    tintColor=''
                    values={['按銷量排序', '按價格高到低', '按價格低到高']}/>

                <AnimatedFlatList
                    data={this.state.dataArray}
                    ListHeaderComponent={this._header}
                    ListFooterComponent={this._footer}
                    ItemSeparatorComponent={this._separator}
                    renderItem={this._renderCell}

                    //如果設置了此選項,則會在列表頭部添加一個標準的RefreshControl控件趁猴,以便實現(xiàn)“下拉刷新”的功能刊咳。同時你需要正確設置refreshing屬性。
                    onRefresh={this._onRefresh}
                    refreshing={this.state.refreshing}
                    //當所有的數(shù)據(jù)都已經(jīng)渲染過儡司,并且列表被滾動到距離最底部不足onEndReachedThreshold個像素的距離時調(diào)用娱挨。
                    //onEndReached={(info) => { alert("滑動到底部了");}}
                    //onEndReached={this._loadMoreData()}
                    //onEndReachedThreshold={100}
                />
            </View>
        );
    }


    render() {

        //在JS中,我們通過以下方式獲取到原生模塊的類名
        // FFRNCatgoryListCtrl.getNativeClass(name => {
        //     console.log("nativeClass: ", name);
        //     //alert(name);
        // });

        // console.log("FFRNCatgoryListCtrl value is ", FFRNCatgoryListCtrl.TestName);
        //alert(FFRNCatgoryListCtrl.TestName);

        //alert(this.props.cid);

        this.state.cid = this.props.cid;

        //this.callBackOne();

        //this.callErrorBack();


        //第一次加載等待的view
        if (this.state.isLoading && !this.state.error) {
            return this.renderLoadingView();
        } else if (this.state.error) {
            //請求失敗view
            return this.renderErrorView(this.state.errorInfo);
        }
        //加載數(shù)據(jù)
        return this.renderData();
    }
}

AppRegistry.registerComponent('EasyLife', () => EasyLife);


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捕犬,一起剝皮案震驚了整個濱河市跷坝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碉碉,老刑警劉巖柴钻,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垢粮,居然都是意外死亡贴届,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毫蚓,“玉大人占键,你說我怎么就攤上這事≡耍” “怎么了畔乙?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翩概。 經(jīng)常有香客問我啸澡,道長,這世上最難降的妖魔是什么氮帐? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮洛姑,結(jié)果婚禮上上沐,老公的妹妹穿的比我還像新娘。我一直安慰自己楞艾,他們只是感情好参咙,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著硫眯,像睡著了一般蕴侧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上两入,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天净宵,我揣著相機與錄音,去河邊找鬼裹纳。 笑死择葡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的剃氧。 我是一名探鬼主播敏储,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼朋鞍!你這毒婦竟也來了已添?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤滥酥,失蹤者是張志新(化名)和其女友劉穎更舞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恨狈,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡疏哗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片返奉。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贝搁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芽偏,到底是詐尸還是另有隱情雷逆,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布污尉,位于F島的核電站膀哲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏被碗。R本人自食惡果不足惜某宪,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锐朴。 院中可真熱鬧兴喂,春花似錦、人聲如沸焚志。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酱酬。三九已至壶谒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膳沽,已是汗流浹背汗菜。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挑社,地道東北人呵俏。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像滔灶,于是被迫代替她去往敵國和親普碎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容