Yii快速入門(二)使用表單

在 Yii 中處理表單時莺琳,通常需要以下步驟:

1 創(chuàng)建用于表現(xiàn)所要收集數(shù)據(jù)字段的模型類暮屡。
2 創(chuàng)建一個控制器動作,響應(yīng)表單提交温眉。
3 在視圖腳本中創(chuàng)建與控制器動作相關(guān)的表單缸匪。

一、創(chuàng)建模型

在編寫表單所需的 HTML 代碼之前类溢,我們應(yīng)該先確定來自最終用戶輸入的數(shù)據(jù)的類型凌蔬,以及這些數(shù)據(jù)應(yīng)符合什么樣的規(guī)則。模型類可用于記錄這些信息闯冷。正如模型章節(jié)所定義的砂心,模型是保存用戶輸入和驗證這些輸入的中心位置。
取決于使用用戶所輸入數(shù)據(jù)的方式蛇耀,我們可以創(chuàng)建兩種類型的模型辩诞。如果用戶輸入被收集、使用然后丟棄纺涤,我們應(yīng)該創(chuàng)建一個表單模型; 如果用戶的輸入被收集后要保存到數(shù)據(jù)庫译暂,我們應(yīng)使用一個Active Record抠忘。兩種類型的模型共享同樣的基類 CModel ,它定義了表單所需的通用接口外永。

1崎脉、定義模型類

例如創(chuàng)建為一個表單模型:

class LoginForm extends CFormModel
{
    public $username;
    public $password;
    public $rememberMe=false;
}

LoginForm 中定義了三個屬性: $username, $password 和 $rememberMe。他們用于保存用戶輸入的用戶名和密碼伯顶,還有用戶是否想記住他的登錄的選項荧嵌。由于 $rememberMe 有一個默認(rèn)的值 false,相應(yīng)的選項在初始化顯示在登錄表單中時將是未勾選狀態(tài)砾淌。
我們將這些成員變量稱為特性(attributes)而不是屬性(properties)啦撮,以區(qū)別于普通的屬性(properties)。
特性(attribute)是一個主要用于存儲來自用戶輸入或數(shù)據(jù)庫數(shù)據(jù)的屬性(propertiy)汪厨。

2赃春、聲明驗證規(guī)則

一旦用戶提交了他的輸入,模型被填充劫乱,我們就需要在使用前確保用戶的輸入是有效的织中。這是通過將用戶的輸入和一系列規(guī)則執(zhí)行驗證實現(xiàn)的。我們在 rules() 方法中指定這些驗證規(guī)則衷戈,此方法應(yīng)返回一個規(guī)則配置數(shù)組狭吼。

class LoginForm extends CFormModel
{
    public $username;
    public $password;
    public $rememberMe=false;
 
    private $_identity;
 
    public function rules()
    {
        return array(
            array('username, password', 'required'), //username 和 password 為必填項
            array('rememberMe', 'boolean'), //rememberMe 應(yīng)該是一個布爾值
            array('password', 'authenticate'), //password 應(yīng)被驗證(authenticated)
        );
    }
 
    public function authenticate($attribute,$params)
    {
        $this->_identity=new UserIdentity($this->username,$this->password);
        if(!$this->_identity->authenticate())
            $this->addError('password','錯誤的用戶名或密碼疙赠。');
    }
}

rules() 返回的每個規(guī)則必須是以下格式:
array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加選項)
其中:
AttributeList(特性列表)是需要通過此規(guī)則驗證的特性列表字符串唤衫,每個特性名字由逗號分隔;
Validator(驗證器) 指定要執(zhí)行驗證的種類;
on 參數(shù)是可選的滋尉,它指定此規(guī)則應(yīng)被應(yīng)用到的場景列表谦趣;
附加選項 是一個名值對數(shù)組疲吸,用于初始化相應(yīng)驗證器的屬性值。

有三種方式可在驗證規(guī)則中指定 Validator:
第一前鹅, Validator 可以是模型類中一個方法的名字摘悴,就像上面示例中的 authenticate 。驗證方法必須是下面的結(jié)構(gòu):
public function 驗證器名稱($attribute,$params) { ... }
第二舰绘,Validator可以是一個驗證器類的名字蹂喻,當(dāng)此規(guī)則被應(yīng)用時,一個驗證器類的實例將被創(chuàng)建以執(zhí)行實際驗證捂寿。規(guī)則中的附加選項用于初始化實例的屬性值口四。驗證器類必須繼承自 CValidator。
第三者蠕,Validator 可以是一個預(yù)定義的驗證器類的別名窃祝。在上面的例子中,required 名字是 CRequiredValidator 的別名踱侣,它用于確保所驗證的特性值不為空粪小。下面是預(yù)定義的驗證器別名的完整列表:

boolean: CBooleanValidator 的別名,確保特性有一個                  
         CBooleanValidator::trueValue 
         或 CBooleanValidator::falseValue 值抡句。
captcha: CCaptchaValidator 的別名探膊,確保特性值等于 CAPTCHA 中顯示的驗證碼。
compare: CCompareValidator 的別名待榔,確保特性等于另一個特性或常量逞壁。
email:   CEmailValidator 的別名,確保特性是一個有效的Email地址锐锣。
default: CDefaultValueValidator 的別名腌闯,指定特性的默認(rèn)值。
exist:   CExistValidator 的別名雕憔,確保特性值可以在指定表的列中可以找到姿骏。
file:    CFileValidator 的別名,確保特性含有一個上傳文件的名字斤彼。
filter:  CFilterValidator 的別名分瘦,通過一個過濾器改變此特性。
in:      CRangeValidator 的別名琉苇,確保數(shù)據(jù)在一個預(yù)先指定的值的范圍之內(nèi)嘲玫。
length:  CStringValidator 的別名,確保數(shù)據(jù)的長度在一個指定的范圍之內(nèi)并扇。
match:   CRegularExpressionValidator 的別名去团,確保數(shù)據(jù)可以匹配一個正則表達(dá)式。
numerical: CNumberValidator 的別名穷蛹,確保數(shù)據(jù)是一個有效的數(shù)字渗勘。
required: CRequiredValidator 的別名,確保特性不為空俩莽。
type:    CTypeValidator 的別名旺坠,確保特性是指定的數(shù)據(jù)類型。
unique:  CUniqueValidator 的別名扮超,確保數(shù)據(jù)在數(shù)據(jù)表的列中是唯一的取刃。
url:     CUrlValidator 的別名,確保數(shù)據(jù)是一個有效的 URL出刷。

下面我們列出了幾個只用這些預(yù)定義驗證器的示例:

// 用戶名為必填項
array('username', 'required'),
// 用戶名必須在 3 到 12 個字符之間
array('username', 'length', 'min'=>3, 'max'=>12),
// 在注冊場景中璧疗,密碼password必須和password2一致。
array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),
// 在登錄場景中馁龟,密碼必須接受驗證崩侠。
array('password', 'authenticate', 'on'=>'login'),

3、安全的特性賦值

在一個類的實例被創(chuàng)建后坷檩,我們通常需要用最終用戶提交的數(shù)據(jù)填充它的特性却音。這可以通過如下塊賦值(massive assignment)方式輕松實現(xiàn):

$model=new LoginForm;
if(isset($_POST['LoginForm']))
    $model->attributes=$_POST['LoginForm'];

最后的表達(dá)式被稱作 塊賦值(massive assignment) 改抡,它將 $_POST['LoginForm'] 中的每一項復(fù)制到相應(yīng)的模型特性中。這相當(dāng)于如下賦值方法:

foreach($_POST['LoginForm'] as $name=>$value)
{
    if($name 是一個安全的特性)
        $model->$name=$value;
}

檢測特性的安全非常重要系瓢,例如阿纤,如果我們以為一個表的主鍵是安全的而暴露了它,那么攻擊者可能就獲得了一個修改記錄的主鍵的機(jī)會夷陋,從而篡改未授權(quán)給他的內(nèi)容欠拾。
特性如果出現(xiàn)在相應(yīng)場景的一個驗證規(guī)則中,即被認(rèn)為是安全的骗绕。例如:

array('username, password', 'required', 'on'=>'login, register'),
array('email', 'required', 'on'=>'register'),

如上所示藐窄, username 和 password 特性在 login 場景中是必填項。而 username, password 和 email 特性在 register 場景中是必填項酬土。于是荆忍,如果我們在 login 場景中執(zhí)行塊賦值,就只有 username 和 password 會被塊賦值诺凡。因為只有它們出現(xiàn)在 login 的驗證規(guī)則中东揣。另一方面,如果場景是 register 腹泌,這三個特性就都可以被塊賦值嘶卧。

// 在登錄場景中
$model=new User('login');
if(isset($_POST['User']))
    $model->attributes=$_POST['User'];
// 在注冊場景中
$model=new User('register');
if(isset($_POST['User']))
    $model->attributes=$_POST['User'];

那么為什么我們使用這樣一種策略來檢測特性是否安全呢?背后的基本原理就是:如果一個特性已經(jīng)有了一個或多個可檢測有效性的驗證規(guī)則凉袱,那我們還擔(dān)心什么呢芥吟?
請記住,驗證規(guī)則是用于檢查用戶輸入的數(shù)據(jù)专甩,而不是檢查我們在代碼中生成的數(shù)據(jù)(例如時間戳钟鸵,自動產(chǎn)生的主鍵)。因此涤躲,不要為那些不接受最終用戶輸入的特性添加驗證規(guī)則棺耍。
有時候,我們想聲明一個特性是安全的种樱,即使我們沒有為它指定任何規(guī)則蒙袍。例如,一篇文章的內(nèi)容可以接受用戶的任何輸入嫩挤。我們可以使用特殊的 safe 規(guī)則實現(xiàn)此目的:
array('content', 'safe')
還有一個用于聲明一個屬性為不安全的 unsafe 規(guī)則:
array('permission', 'unsafe')
unsafe 規(guī)則并不常用害幅,它是我們之前定義的安全特性的一個例外。

4岂昭、觸發(fā)驗證

一旦模型被用戶提交的數(shù)據(jù)填充以现,我們就可以調(diào)用 CModel::validate() 觸發(fā)數(shù)據(jù)驗證進(jìn)程。此方法返回一個指示驗證是否成功的值。對 CActiveRecord 模型來說邑遏,驗證也可以在我們調(diào)用其 CActiveRecord::save() 方法時自動觸發(fā)佣赖。
我們可以通過設(shè)置scenario屬性來設(shè)置場景屬性,這樣无宿,相應(yīng)場景的驗證規(guī)則就會被應(yīng)用茵汰。
驗證是基于場景執(zhí)行的枢里。 scenario屬性指定了模型當(dāng)前用于的場景和當(dāng)前使用的驗證規(guī)則集孽鸡。例如,在 login 場景中栏豺,我們只想驗證用戶模型中的 username 和 password 輸入彬碱;而在 register 場景中,我們需要驗證更多的輸入奥洼,例如 email, address, 等巷疼。下面的例子演示了如何在 register 場景中執(zhí)行驗證:

// 在注冊場景中創(chuàng)建一個  User 模型。等價于:
// $model=new User;
// $model->scenario='register';
$model=new User('register'); //給模型類添加參數(shù)灵奖,該參數(shù)就是要觸發(fā)的驗證場景
// 將輸入的值填充到模型
$model->attributes=$_POST['User'];
// 執(zhí)行驗證
if($model->validate())   // 如果輸入有效
    ...
else
    ...

規(guī)則關(guān)聯(lián)的場景可以通過規(guī)則中的 on 選項指定嚼沿。如果 on 選項未設(shè)置,則此規(guī)則會應(yīng)用于所有場景瓷患。例如:

public function rules()
{
    return array(
        array('username, password', 'required'),
        array('password_repeat', 'required', 'on'=>'register'),
        array('password', 'compare', 'on'=>'register'),
    );
}

第一個規(guī)則將應(yīng)用于所有場景骡尽,而第二個將只會應(yīng)用于 register 場景。

5擅编、提取驗證錯誤

驗證完成后攀细,任何可能產(chǎn)生的錯誤將被存儲在模型對象中。我們可以通過調(diào)用 CModel::getErrors() 和CModel::getError()提取這些錯誤信息爱态。這兩個方法的不同點在于第一個方法將返回 所有 模型特性的錯誤信息谭贪,而第二個將只返回 第一個 錯誤信息。

6锦担、特性標(biāo)簽

當(dāng)設(shè)計表單時俭识,我們通常需要為每個表單域顯示一個標(biāo)簽。標(biāo)簽告訴用戶他應(yīng)該在此表單域中填寫什么樣的信息洞渔。雖然我們可以在視圖中硬編碼一個標(biāo)簽套媚,但如果我們在相應(yīng)的模型中指定(標(biāo)簽),則會更加靈活方便痘煤。
默認(rèn)情況下 CModel 將簡單的返回特性的名字作為其標(biāo)簽凑阶。這可以通過覆蓋 attributeLabels() 方法自定義。正如在接下來的小節(jié)中我們將看到的衷快,在模型中指定標(biāo)簽會使我們能夠更快的創(chuàng)建出更強(qiáng)大的表單宙橱。

二、創(chuàng)建動作

有了模型,我們就可以開始編寫用于操作此模型的邏輯了师郑。我們將此邏輯放在一個控制器的動作中环葵。對登錄表單的例子來講,相應(yīng)的代碼就是:

public function actionLogin()
{
    $model=new LoginForm;
    if(isset($_POST['LoginForm']))
    {
        // 收集用戶輸入的數(shù)據(jù)
        $model->attributes=$_POST['LoginForm'];
        // 驗證用戶輸入宝冕,并在判斷輸入正確后重定向到前一頁
        if($model->validate())
           //重定向到之前需要身份驗證的頁面URL     
           $this->redirect(Yii::app()->user->returnUrl); 
    }
    // 顯示登錄表單
    $this->render('login',array('model'=>$model));
}

如上所示张遭,我們首先創(chuàng)建了一個 LoginForm 模型示例;如果請求是一個 POST 請求(意味著這個登錄表單被提交了)地梨,我們則使用提交的數(shù)據(jù) $_POST['LoginForm']填充 $model 菊卷;然后我們驗證此輸入,如果驗證成功宝剖,重定向用戶瀏覽器到之前需要身份驗證的頁面洁闰。如果驗證失敗,或者此動作被初次訪問万细,我們則渲染 login 視圖扑眉,此視圖的內(nèi)容我們在下一節(jié)中講解。
提示: 在 login 動作中赖钞,我們使用 Yii::app()->user->returnUrl 獲取之前需要身份驗證的頁面URL腰素。 組件Yii::app()->user 是一種 CWebUser (或其子類),它表示用戶會話信息(例如 用戶名雪营,狀態(tài))弓千。
讓我們特別留意一下 login 動作中出現(xiàn)的下面的 PHP 語句:
$model->attributes=$_POST['LoginForm'];
正如我們在 安全的特性賦值 中所講的,這行代碼使用用戶提交的數(shù)據(jù)填充模型卓缰。 attributes 屬性由 CModel 定義计呈,它接受一個名值對數(shù)組并將其中的每個值賦給相應(yīng)的模型特性。因此如果 $_POST['LoginForm']給了我們這樣的一個數(shù)組征唬,上面的那段代碼也就等同于下面冗長的這段 (假設(shè)數(shù)組中存在所有所需的特性):

$model->username=$_POST['LoginForm']['username'];
$model->password=$_POST['LoginForm']['password'];
$model->rememberMe=$_POST['LoginForm']['rememberMe'];

注意: 為了使 $_POST['LoginForm'] 傳遞給我們的是一個數(shù)組而不是字符串捌显, 我們需要在命名表單域時遵守一個規(guī)范。具體的总寒,對應(yīng)于模型類 C 中的特性 a 的表單域扶歪,我們將其命名為 C[a] 。例如摄闸,我們可使用 LoginForm[username] 命名 username 特性相應(yīng)的表單域善镰。
現(xiàn)在剩下的工作就是創(chuàng)建 login 視圖了,它應(yīng)該包含一個帶有所需輸入項的 HTML 表單年枕。

三炫欺、創(chuàng)建表單

編寫 login 視圖是很簡單的,我們以一個 form 標(biāo)記開始熏兄,它的 action 屬性應(yīng)該是前面講述的 login 動作的URL品洛。然后我們需要為 LoginForm 類中聲明的屬性插入標(biāo)簽和表單域树姨。最后,我們插入一個可由用戶點擊提交此表單的提交按鈕桥状。所有這些都可以用純HTML代碼完成帽揪。
Yii 提供了幾個助手(helper)類簡化視圖編寫。例如辅斟,要創(chuàng)建一個文本輸入域转晰,我們可以調(diào)用CHtml::textField();要創(chuàng)建一個下拉列表士飒,則調(diào)用 CHtml::dropDownList()查邢。
例如, 如下代碼將生成一個文本輸入域变汪,它可以在用戶修改了其值時觸發(fā)表單提交動作侠坎。
CHtml::textField($name,$value,array('submit'=>''));
下面蚁趁,我們使用 CHtml 創(chuàng)建一個登錄表單裙盾。我們假設(shè)變量 $model 是 LoginForm 的實例。

<div class="form">
<?php echo CHtml::beginForm(); ?>
 
    <?php echo CHtml::errorSummary($model); ?>
 
    <div class="row">
        <?php echo CHtml::activeLabel($model,'username'); ?>
        <?php echo CHtml::activeTextField($model,'username') ?>
    </div>
 
    <div class="row">
        <?php echo CHtml::activeLabel($model,'password'); ?>
        <?php echo CHtml::activePasswordField($model,'password') ?>
    </div>
 
    <div class="row rememberMe">
        <?php echo CHtml::activeCheckBox($model,'rememberMe'); ?>
        <?php echo CHtml::activeLabel($model,'rememberMe'); ?>
    </div>
 
    <div class="row submit">
        <?php echo CHtml::submitButton('Login'); ?>
    </div>
 
<?php echo CHtml::endForm(); ?>
</div><!-- form -->

上述代碼生成了一個更加動態(tài)的表單他嫡,例如番官,CHtml::activeLabel() 生成一個與指定模型的特性相關(guān)的標(biāo)簽。如果此特性有一個輸入錯誤钢属,此標(biāo)簽的CSS class 將變?yōu)?error徘熔,通過 CSS 樣式改變了標(biāo)簽的外觀。相似的淆党, CHtml::activeTextField()為指定模型的特性生成一個文本輸入域酷师,并會在錯誤發(fā)生時改變它的 CSS class。
我們還可以使用一個新的小物件 CActiveForm 以簡化表單創(chuàng)建染乌。這個小物件可同時提供客戶端及服務(wù)器端無縫的山孔、一致的驗證。使用 CActiveForm, 上面的代碼可重寫為:

<div class="form">
<?php $form=$this->beginWidget('CActiveForm'); ?>
    <?php echo $form->errorSummary($model); ?>
    <div class="row">
        <?php echo $form->label($model,'username'); ?>
        <?php echo $form->textField($model,'username') ?>
    </div>
    <div class="row">
        <?php echo $form->label($model,'password'); ?>
        <?php echo $form->passwordField($model,'password') ?>
    </div>
    <div class="row rememberMe">
        <?php echo $form->checkBox($model,'rememberMe'); ?>
        <?php echo $form->label($model,'rememberMe'); ?>
    </div>
    <div class="row submit">
        <?php echo CHtml::submitButton('Login'); ?>
    </div>
<?php $this->endWidget(); ?>
</div><!-- form -->

四荷憋、收集表格輸入

有時我們想通過批量模式收集用戶輸入台颠。也就是說,用戶可以為多個模型實例輸入信息并將它們一次性提交勒庄。我們將此稱為 表格輸入(tabular input) 串前,因為這些輸入項通常以 HTML 表格的形式呈現(xiàn)。
要使用表格輸入实蔽,我們首先需要創(chuàng)建或填充一個模型實例數(shù)組荡碾,取決于我們是想插入還是更新數(shù)據(jù)。然后我們從 $_POST 變量中提取用戶輸入的數(shù)據(jù)并將其賦值到每個模型局装。和單模型輸入稍有不同的一點就是:我們要使用 $_POST['ModelClass'][$i] 提取輸入的數(shù)據(jù)而不是使用 $_POST['ModelClass']坛吁。

public function actionBatchUpdate()
{
    // 假設(shè)每一項(item)是一個 'Item' 類的實例漆腌,
    // 提取要通過批量模式更新的項
    $items=$this->getItemsToUpdate();
    if(isset($_POST['Item']))
    {
        $valid=true;
        foreach($items as $i=>$item)
        {
            if(isset($_POST['Item'][$i]))
                $item->attributes=$_POST['Item'][$i];
            $valid=$valid && $item->validate();
        }
        if($valid)  // 如果所有項目有效
            // ...則在此處做一些操作
    }
    // 顯示視圖收集表格輸入
    $this->render('batchUpdate',array('items'=>$items));
}

準(zhǔn)備好了這個動作,我們需要繼續(xù) batchUpdate 視圖的工作以在一個 HTML 表格中顯示輸入項阶冈。

<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
<?php foreach($items as $i=>$item): ?>
<tr>
<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php echo CHtml::submitButton('Save'); ?>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->

注意闷尿,在上面的代碼中我們使用了 "[$i]name" 而不是 "name" 作為調(diào)用 CHtml::activeTextField時的第二個參數(shù)。
如果有任何驗證錯誤女坑,相應(yīng)的輸入項將會自動高亮顯示填具,就像前面我們講解的單模型輸入一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匆骗,一起剝皮案震驚了整個濱河市劳景,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碉就,老刑警劉巖盟广,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓮钥,居然都是意外死亡筋量,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門碉熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桨武,“玉大人,你說我怎么就攤上這事锈津⊙剿幔” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵琼梆,是天一觀的道長性誉。 經(jīng)常有香客問我,道長茎杂,這世上最難降的妖魔是什么错览? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮蛉顽,結(jié)果婚禮上蝗砾,老公的妹妹穿的比我還像新娘。我一直安慰自己携冤,他們只是感情好悼粮,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曾棕,像睡著了一般扣猫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翘地,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天申尤,我揣著相機(jī)與錄音癌幕,去河邊找鬼。 笑死昧穿,一個胖子當(dāng)著我的面吹牛勺远,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播时鸵,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼胶逢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饰潜?” 一聲冷哼從身側(cè)響起初坠,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彭雾,沒想到半個月后碟刺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡薯酝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年半沽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜托。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡抄囚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄务,到底是詐尸還是另有隱情,我是刑警寧澤穴亏,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布蜂挪,位于F島的核電站,受9級特大地震影響嗓化,放射性物質(zhì)發(fā)生泄漏棠涮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一刺覆、第九天 我趴在偏房一處隱蔽的房頂上張望严肪。 院中可真熱鬧,春花似錦谦屑、人聲如沸驳糯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酝枢。三九已至,卻和暖如春悍手,著一層夾襖步出監(jiān)牢的瞬間帘睦,已是汗流浹背袍患。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留竣付,地道東北人诡延。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像古胆,于是被迫代替她去往敵國和親孕暇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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