React.js學習筆記(19) 前后端聯調 + ( proxy代理 ) + ( axios攔截器 ) + ( css Modules模塊化方案 ) + ( css-loader ) + ( 非路由組件如何使用history ) + ( bodyParser,cookieParser中間件 ) + ( utility MD5加密庫 ) + ( nodemon自動重啟node ) + ( Array.find() 和 Array.findIndex() ) + ( browser-cookies庫 )

(1) proxy

前端的端口在:localhost:3000
后端的端口在:localhost:1234
所以要在webpack中配置proxy選項 (proxy是代理的意思)

在package.json中添加如下配置-------這里用的是create-react-app腳手架eject后的項目


  "proxy":"http://localhost:1234"  // 把前端的請求都代理到1234端口姨伤,和后端一致,即可訪問后端接口


(2) axios

配置好proxy后乍楚,就可以用axios跨域了

在組件中



import React,{Component} from 'react';
import { Redirect } from 'react-router-dom';
import axios from 'axios';                                   // 引入axios


export default class Login extends Component {
    goLog = () => {
        this.props.goLogin();
    }
    goGetData = () => {
        axios.get('/data')                                   // 使用axios
            .then(res => 
                { console.log(res,'res')} 
            )
    }
    render() {
        return (
            <div>
                登陸頁面
                {
                this.props.login && this.props.login.isLogin ? <Redirect to="/user" /> : null
                }
                <div onClick={this.goLog}>
                    點擊登陸
                </div>
                <div onClick={this.goGetData}>
                    點擊---用axios獲取后端數據
                </div>
            </div>
        )
    }
}

(axios中文文檔) https://www.kancloud.cn/yunye/axios/234845

(3)axios攔截器

作用:當一個請求發(fā)出的時候,會先流過 interceptors 的 request 部分徒溪,接著請求會發(fā)出忿偷,當接受到響應時臊泌,會先流過 interceptors 的 response 部分鲤桥,最后返回

  • interceptor是攔截器的意思
  • 作用:在請求或響應被 then 或 catch 處理前攔截它們。

// 添加請求攔截器
axios.interceptors.request.use(function (config) {
    // 在發(fā)送請求之前做些什么
    return config;
  }, function (error) {
    // 對請求錯誤做些什么
    return Promise.reject(error);
  });

// 添加響應攔截器
axios.interceptors.response.use(function (response) {
    // 對響應數據做點什么
    return response;
  }, function (error) {
    // 對響應錯誤做點什么
    return Promise.reject(error);
  });



如果你想在稍后移除攔截器渠概,可以這樣:
var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);



可以為自定義 axios 實例添加攔截器
var instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

  • 實例:如下
(1) config.js文件


import axios from 'axios';

import {Toast} from 'antd-mobile';         // antd-mobile輕提示組件Toast

// 攔截請求
axios.interceptors.request.use(config => {
    Toast.loading('加載中'茶凳,1)              // loading組件播揪,顯示文字加載中贮喧,自動關閉延時1s
    console.log('request go');
    return config;
}, err => {
    console.log('請求失敗')
    return Promise.reject(err)
})

//攔截響應
axios.interceptors.response.use(config => {
    Toast.hide()                             // 銷毀Toast組件
    console.log('response get')
    return config;
}, err => {
    console.log('響應失敗')
    return Promise.reject(err)
})




-------------------------------------------------------------
(2) 在入口文件index.js文件中引入上面的cofig.js文件


import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import {Provider} from 'react-redux';
import {store} from './store/store.js';
// import UserContainer from './component/user/container.js';
import './config/config.js';

import {BrowserRouter} from 'react-router-dom'

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <App></App>
        </BrowserRouter>
    </Provider>
, document.getElementById('root'));
registerServiceWorker();

antd-mobile https://mobile.ant.design/components/toast-cn/

(4) css Modules模塊化方案

  • 支持less和sass的語法
  • 解決命名沖突污染等問題
  • 使用JS和CSS分離的寫法塞淹,不會改變大家的書寫習慣
  • 解決依賴管理不徹底状共,無法共享變量套耕,代碼壓縮不徹底
    使用webpack項目中,只需要簡單的配置,如下:
webpack.config.dev.js

注意:這里需要提前安裝css-loader插件!!

{
    module: {
       rules:[
          {
            test: /\.css$/,
            use: [
              {
                loader: 'style-loader'
              },
              {
                loader: 'css-loader?modules',     // 在css-loader后添加 ?modules即可
                 // loader: 'css-loader?modules&localIdentName=[name]-[hash:base64:5]'
                 // modules后面還可以跟具體的命名規(guī)則
                 // localIdentName 是設置生成樣式的命名規(guī)則康愤。
              }
            ]
  
          }
       ]
    }
}
------------------------------------------------------------------------------
換一中寫法:(一樣的)


      {
        test: /\.css$/,
        exclude: /node_modules\/antd/,
        use: [
          require.resolve('style-loader'),
          {
            loader: require.resolve('css-loader'),
            options: {
             importLoaders: 1,  // 在css-loader前應用的loader的數目, 默認為0
             modules:true,  // 開啟css-modules模式, 默認值為flase
             localIdentName:'[name]-[local]-[hash:base64:8]',//css-modules模式下local類名的命名
            },
          },
        ]
      },

https://segmentfault.com/a/1190000010301977
(詳細)https://www.cnblogs.com/kugeliu/p/7889018.html
(阮一峰)http://www.ruanyifeng.com/blog/2016/06/css_modules.html

(5) Ant Design Mobile (antd-mobile)

  • 按需加載
    除了安裝 ( antd-mobile ) 之外,還需要安裝 ( babel-plugin-import )
  • 這里有個坑:在package.json中配置babel的時候(babel-plugin-import插件在安裝后舶吗,需要配置babel )征冷,配置完,引入ant組件使用誓琼,樣式會失效<旒ぁk茸健!而在未使用css-modules模塊化方案的時候叔收,ant-mobile能正常使用齿穗,( 要使用css-modules的話,要在webpack.config.json中做如下配置:(!)
    (踩坑與填坑) https://segmentfault.com/q/1010000011965218
(!)


 {
        test: /\.css$/,
        include: /node_modules\/antd/,
        use: [
          require.resolve('style-loader'),
          {
            loader: require.resolve('css-loader'),
            options: {
              modules:false
            },
          },
        ]
      },
      {
        test: /\.css$/,
        exclude: /node_modules\/antd/,
        use: [
          require.resolve('style-loader'),
          {
            loader: require.resolve('css-loader'),
            options: {
              importLoaders: 1,
              modules:true,
              localIdentName:'[name]-[local]-[hash:base64:8]',
            },
          },
        ]
      },

安裝:
cnpm install antd-mobile --save



使用:
import { Button } from 'antd-mobile';
import 'antd-mobile/dist/antd-mobile.css'; 



按需加載:
(1)安裝babel按需加載插件 babel-plugin-import

cnpm install babel-plugin-import --save-dev

(2)在create-react-app腳手架eject后饺律,package.json文件中窃页,配置如下:
// 自己搭建可以寫在.babelrc中
 "babel": {
    "presets": [
      "react-app"
    ],
    "plugins": [
      "transform-decorators-legacy",
     ["import", { "libraryName": "antd-mobile", "style": "css" }]
    ]
  }



(3) 使用
import { Button } from 'antd-mobile';
...
...



(4) 因為使用了css-modules模塊化方案,所以在配置packageg.json中babel的時候蓝晒,要修改成如下配置:


 {
        test: /\.css$/,
        include: /node_modules\/antd/,
        use: [
          require.resolve('style-loader'),
          {
            loader: require.resolve('css-loader'),
            options: {
              modules:false
            },
          },
        ]
      },
      {
        test: /\.css$/,
        exclude: /node_modules\/antd/,
        use: [
          require.resolve('style-loader'),
          {
            loader: require.resolve('css-loader'),
            options: {
              importLoaders: 1,
              modules:true,
              localIdentName:'[name]-[local]-[hash:base64:8]',
            },
          },
        ]
      },

(6) css-loader 和 ( style-loader, postcss-loader )

  • css-loader: 在js中加載css
  • style-loader: 把加載的css作為style標簽內容插入到html中
  • postcss-loader:
    如果某些css要考慮到瀏覽器的兼容性(比如css3中的flex)腮出,我們要webpack在打包的過程中自動為這些css屬性加上瀏覽器前綴,這時就用到了postcss-loader和它對應的插件autoprefixer芝薇。
    http://blog.csdn.net/szu_aker/article/details/72588857

(7) 非路由組件如何使用this.props.history

如果是路由組件胚嘲,訪問history一般都是通過this.props.history來操作history

  • 而非路由組件通過 {withRouter} 來使用this.props.history
import React from "react";
import {withRouter} from "react-router-dom";  // 引入withRouter

class MyComponent extends React.Component {
  ...
  myFunction() {
    this.props.history.push("/some/Path");
  }
  ...
}
export default withRouter(MyComponent);  // 用withRouter包裹該class


----------------------------------------------------------------------------

this.props.location.pathname  獲取當前的url

如何使用history跳轉路由(全):https://segmentfault.com/a/1190000011137828

(8) body-parser中間件

可以通過body-parser對象創(chuàng)建中間件,當接受到客戶端請求時所有的中間件都會給req.body添加屬性洛二,請求內容為空時馋劈,解析為空或者錯誤。

  • body-parser是非常常用的一個express中間件晾嘶,作用是對post請求的請求體 ( req ) 進行解析妓雾。

https://www.cnblogs.com/chyingp/p/nodejs-learning-express-body-parser.html
(詳細) https://www.cnblogs.com/taiyanghua0522/p/7054781.html

server.js


const express = require('express');
const bodyParser = require('body-parser');      // 引入body-parser
const cookieParser = require('cookie-parser');  // 引入cookie-parser

const app = express();
const user = require('./user.js');


app.use(bodyParser.json())                   // 使用body-parser
app.use(cookieParser())                      // 使用cookie-parser

app.use('/one', user)
app.get('/', function(req, res){
    res.send('<p>后端頁面</p>')
})


app.listen(3333, function() {
    console.log('express port 1212 is going')
})





----------------------------------------------------
(存入cookie)

user.js


Router.post('/login', function(req,res){
    const {user, password} = req.body;    // req.body是body-parser解析的請求體
    console.log(req.body, 'req.body')
    User.findOne({user,password: MD5PASSWORD(password)}, function(err,doc){
       if(!doc){
           return res.json({
               code:1,
               msg: '用戶名或密碼錯誤'
           })
       }
       res.cookie('userId', doc._id)   // cookie-parser的使用--------寫入cookie
                                      // login接口存入一個cookie,name是userId,value是res._id 

                                      // 存cookie是在res中
                                      // 取cookie是在req中
       return res.json({
           code:0,
           data: doc
       })
    })
})




----------------------------------------------------
(取出cookie)

Router.get('/info',function(req,res){
    // 用戶有沒有cookie
    const {userId} = req.cookies;   // 取出cookie垒迂,中的userId-------取出cookie,注意是復數!!!!

    if(!userId) {
        return res.json({
            code:1
        })
    }

    User.findOne({_id: userId}, function(err,doc){
        if(err) {
            return res.json({
                code:1,
                msg: '后端出錯'
            })
        }
        return res.json({
            code:0,
            data: doc    
        })
    })
    
})


(9) cookie-parser中間件

cookies最常用在‘記住密碼’和‘自動登錄’械姻。
cookies 存在于客戶端,安全性較低机断,一般要存入加密后的信息楷拳,并且大部分情況下需要設置過期時間或不使用刪除。

  • cookie類似于一張身份卡吏奸,登陸后欢揖,由服務端返回,帶著cookie即可訪問受限資源

  • 存cookie


res.cookie('userId', doc._id)     // name是userId奋蔚,value是doc._id

  • 取cookie-------------注意:是復數 req.cookies


const {userId} = req.cookies
// const userId = req.cookies.userId

(10) utility

md5加密庫


安裝:
cnpm install utility --save

引入和使用:
const utility = require('utility');

Router.post('/register', function(req,res){

    console.log(req.body,'req.body');

    const {user, password, type} = req.body;
    User.findOne({'user':user},function(err,doc){
        if(doc){
            return res.json({
                code:1,
                msg: '用戶名存在'
            })
        }
        User.create({
            'user': user,
            'password':utility.md5(password),     // 使用--------------
            'type':type
        },function(err,doc){
            if(err){
                return res.json({
                    code:1,
                    msg:'后端出錯了'
                })
            }
            console.log('用戶名不存在她混,已添加到數據庫')
            return res.json({
                code:0
            })
        })
    })
})

----------------------------------------------------

后端比較合格的加密函數:


function MD5PASSWORD(password) {
    const salt = 'more_complex_passWord187873871~@!@@@##$$%%DAxiao';
    return utility.md5( utility.md5(password + salt) );
}

(11) nodemon

原始node中的express框架,每次修改js代碼后泊碑,都要重新手動啟動才能看到改動后的效果坤按,調試起來十分不方便。所以我引入了nodemon模塊了彌補這樣缺點馒过。

  • 全局安裝
 cnpm install nodemon -g
  • 修改配置


在package中配置的script中配置的代碼 :

“node”: "node server/server.js"

------
修改為

"node": "nodemon server/server.js"


(12) Route組件中的component可以是一個函數

import React from 'react';
import ReactDOM from 'react-dom';


function Boss() {
    return (
        <div>
            boss頁面
        </div>
    )
}

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <div>
                <AuthRoute></AuthRoute> 

                <Route path='/boss' component={Boss}></Route>   
                // 這里的Boss是一個函數臭脓,(不管是function還是class,都是return返回值)

                <Route path='/register' component={Register}></Route> 
                <Route path='/login' component={Login}></Route>
            </div>
        </BrowserRouter>
    </Provider>
, document.getElementById('root'));
registerServiceWorker();

(13) 登陸跳轉的邏輯

(1) 注冊時拿到注冊的所有信息,把信息傳到redux中沉桌,先做前端判斷(用戶名和密碼是否為空谢鹊,密碼輸入是否一致 等),然后在redux的action請求后端user/login接口,傳入注冊信息到請求體中留凭,規(guī)定如果后端返回res.status===200&&res.data.code=0就表示注冊成功,把注冊信息寫入redux的reduce中,否則表示注冊失敗累提,并且由后端返回錯誤信息品嚣,并且存入redux,然后取出顯示在前端頁面 。 ----后端注冊接口的邏輯:拿到前端傳過來的請求數據求冷,然后查找數據庫時候存在瘤运,如果存在,表示已經注冊匠题,返回code===1,和msg=已經注冊過了拯坟。否則表示未注冊,則把前段數據存入數據庫韭山。并返回code表示注冊成功
(2) 注冊后的跳轉邏輯:根據注冊時的身份(genius或者boss) 和 (是否有頭像) 決定跳轉到 boss頁面郁季,genius頁面, bossinfo頁面钱磅,geniusinfo頁面

(3) 登陸時梦裂,拿到登陸的所有信息,然后做前端判斷(用戶名盖淡,密碼是否為空)年柠,然后請求后端user/login接口,傳入如果返回 res.status===200 && res.data.code ===0表示登陸成功褪迟,然后拿到后端返回的數據冗恨,存入redux的reducer中。否則表示登陸失敗牵咙,吧后端返回的錯誤信息派近,存入redux,返回給前端頁面洁桌。--------后端接口:拿到前段給到的請求體渴丸,然后查找數據庫,如果doc不存在另凌,就返回res.jsoln({code:1}),否則表示用戶信息在數據庫中存在谱轨,這是存入cookie,res.cookie('名字'吠谢,doc._id)土童,然后返回數據庫中存在的用戶信息,返回給前段接口使用
(4) 登陸后的跳轉邏輯:和注冊時候一樣
(5) 如果是其他頁面工坊,不在login,和register兩個頁面中献汗,則在前段請求另一個接口敢订,ingo接口,罢吃,如果后端返回code是0楚午,res.status是200,表示有用戶信息尿招,則拿到后端返回的數據存入redux矾柜, 否則表示沒有用戶信息,路由跳轉到登陸頁面就谜。-------后端接口邏輯:首先在該接口驗證cookie是否存在怪蔑,cost {usrId} = req.cookies,如果不存在返回res.json({code:1}), 然后查找數據庫丧荐,有數據返回數據缆瓣,沒有返回相應的狀態(tài)碼

(14) mongoose添加的兩種方式

(1) create方式 
缺點: 不能存儲id

User.create({
            user,
            password: MD5PASSWORD(password),
            type
        }, function(err,doc){
            if(err) {
                return res.json({
                    code:1,
                    msg: '后端出錯'
                })
            }
            return res.json({
                code:0
            })
        })


--------------------------------------------


(2) new mongoose.model().save方式:




Router.post('/register', function(req,res) {
    console.log(req.body)
    const { user, password, type } = req.body;
    
    User.findOne({user}, function(err,doc){
        if(doc) {
            return res.json({
                code: 1,
                msg: '已經注冊過了'
            })
        }
        const userModel = new User({         // new mongoose.model('user')
            user,
            password: MD5PASSWORD(password),
            type
        })
        userModel.save(function(err,doc){    // .save
            if(err){
                return res.json({
                    code:1,
                    msg:'后端出錯'
                })
            }
            const {user, type, _id} = doc
            res.cookie('userId', _id)       // 在注冊頁面存cookie
            return res.json({
                code:0,
                data:doc
            })

        })
        

    })
   
    
})

Entity結構 http://blog.csdn.net/sinat_25127047/article/details/50560167

(15) mongoose相關語法

  • findByIdAndUpdate

Router.post('/update', function(req,res) {
    const {userId} = req.cookies;
    console.log(req.cookies,'req.cookies');
    if(!userId) {
        return json.dumps({
            code:1
        })
    }
    const body = req.body
    // findByIdAndUpdate(需要查找的id,需要更新的數據,回掉)
    User.findByIdAndUpdate(userId,body,function(err, doc){      --------------------- 
        const data = Object.assign({},{
            user: doc.user,
            type: doc.type
        },body); // 把body對象 和user type 合并賦值給data------body是前端請求的實時更新的請求體
        return res.json({
            code:0,
            data
        })
    })
})

(16) Array.find()

數組實例的find方法虹统,用于找出第一個符合條件的數組成員捆愁。它的參數是一個回調函數,所有數組成員依次執(zhí)行該回調函數窟却,直到找出第一個返回值為true的成員昼丑,然后返回該成員。如果沒有符合條件的成員夸赫,則返回undefined菩帝。

  • 找出第一個符合條件的數組成員,返回該成員
  • 參數是回調函數fallback(value,index,array)
  • 沒有找到符合的成員茬腿,返回undefined
  • 還可以接受除fallback回調函數之外的呼奢,第二個參數,用來綁定回調函數的this對象切平。

[1, 4, -5, 10].find(n => n < 0)

// -5

---------------------------------------------------

[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) // 10

find方法的回調函數可以接受三個參數握础,依次為當前的值、當前的位置和原數組悴品。


---------------------------------------------------

function f(v){
  return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);    // 26

(17) Array.findIndex()

數組實例的findIndex方法返回第一個符合條件的數組成員的位置禀综,如果所有成員都不符合條件,則返回-1苔严。

  • 找出第一個符合條件的數組成員定枷,返回該成員的位置
  • 參數是回調函數fallback(value,index,array)
  • 沒有找到符合數組成員的位置,返回-1
  • 還可以接受除fallback回調函數之外的届氢,第二個參數欠窒,用來綁定回調函數的this對象。

[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;
}) 

// 2

(18) nodeJS 取參

  • req.body ----------是post請求退子,獲取參數
  • req.query----------是get 請求岖妄,獲取參數
  • req.params
  • req.param()

(19) browser-cookies

git地址:https://github.com/voltace/browser-cookies
安裝:cnpm isntall browser-cookies -S

  • cookies.set 設置cookie
  • cookies.get 獲取cookie
  • cookies.erase 清除cookie ------------- erase是清除型将,抹去的意思
var cookies = require('browser-cookies');

cookies.set('firstName', 'Lisa');
cookies.set('firstName', 'Lisa', {expires: 365}); // Expires after 1 year
cookies.set('firstName', 'Lisa', {secure: true, domain: 'www.example.org'});

cookies.get('firstName'); // Returns cookie value (or null)

cookies.erase('firstName'); // Removes cookie

(20) window.location.href = window.location.href強制刷新頁面

http://blog.csdn.net/github_37483541/article/details/59481084


    注銷登陸:

    logout =() => {
        // erase是清除,抹掉的意思
        // browserCookies.erase('userId');
        // window.location.href = window.location.href
        const alert = Modal.alert 
        alert('注銷','確定要注銷登陸嗎荐虐?',[
            {text:'取消', onPress: () => console.log('canscel')},
            {text:'確定', onPress: () => {
                browserCookies.erase('userId');
                // window.location.href = window.location.href
                this.props.logoutAll(); // 該方法清除redux中register存著的數據
            }}
        ])
    }

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末茶敏,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子缚俏,更是在濱河造成了極大的恐慌,老刑警劉巖贮乳,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忧换,死亡現場離奇詭異,居然都是意外死亡向拆,警方通過查閱死者的電腦和手機亚茬,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浓恳,“玉大人刹缝,你說我怎么就攤上這事【苯” “怎么了梢夯?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晴圾。 經常有香客問我颂砸,道長,這世上最難降的妖魔是什么死姚? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任人乓,我火速辦了婚禮,結果婚禮上都毒,老公的妹妹穿的比我還像新娘色罚。我一直安慰自己,他們只是感情好账劲,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布戳护。 她就那樣靜靜地躺著,像睡著了一般瀑焦。 火紅的嫁衣襯著肌膚如雪姑尺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天蝠猬,我揣著相機與錄音切蟋,去河邊找鬼。 笑死榆芦,一個胖子當著我的面吹牛柄粹,可吹牛的內容都是我干的喘鸟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驻右,長吁一口氣:“原來是場噩夢啊……” “哼什黑!你這毒婦竟也來了?” 一聲冷哼從身側響起堪夭,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愕把,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后森爽,有當地人在樹林里發(fā)現了一具尸體恨豁,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年爬迟,在試婚紗的時候發(fā)現自己被綠了橘蜜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡付呕,死狀恐怖计福,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情徽职,我是刑警寧澤象颖,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站姆钉,受9級特大地震影響力麸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜育韩,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一克蚂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筋讨,春花似錦埃叭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壁袄,卻和暖如春类早,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗜逻。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工涩僻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓逆日,卻偏偏與公主長得像嵌巷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子室抽,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容