【手把手】JavaWeb 入門級(jí)項(xiàng)目實(shí)戰(zhàn) -- 文章發(fā)布系統(tǒng) (第六節(jié))

繼續(xù)上一節(jié)的內(nèi)容,首先我們將配置方法寫在static塊里面吧商源,不然每次調(diào)用DataBaseUtils都需要去配置一下代虾,這樣比較麻煩。

static {
    config("jdbc.properties");
}

08 查詢方法:queryForList 實(shí)現(xiàn)

queryForList方法是在實(shí)際開發(fā)中比較常用的一個(gè)方法艇肴,它的意思就是說腔呜,如果你從數(shù)據(jù)庫(kù)里查詢出來10條數(shù)據(jù),那么用一個(gè)List包裹起來再悼,每一條數(shù)據(jù)就是一個(gè)Map育谬。

上代碼

/**
 * 查詢出數(shù)據(jù),并且list返回
 * @param sql
 * @param objects
 * @return
 * @throws SQLException
 */
public static List<Map<String,Object>> queryForList(String sql,Object...objects){
    List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
    Connection connection = getConnection();
    PreparedStatement statement = null;
    ResultSet rs = null;
    try {
        statement = connection.prepareStatement(sql);
        for (int i = 0; i < objects.length; i++) {
            statement.setObject(i+1, objects[i]);
        }
        
        rs = statement.executeQuery();
        while(rs.next()){
            ResultSetMetaData resultSetMetaData = rs.getMetaData();
            int count = resultSetMetaData.getColumnCount(); //獲取列數(shù)
            Map<String,Object> map = new HashMap<String, Object>();
            for (int i = 0; i < count; i++) {
                map.put(resultSetMetaData.getColumnName(i+1), rs.getObject(resultSetMetaData.getColumnName(i+1)));
            }
            result.add(map);
        };
    } catch (SQLException e) {
        e.printStackTrace();
    }finally{
        closeConnection(connection, statement, rs);
    }
    
    return result;
}

測(cè)試:

我剛才又添加了幾條數(shù)據(jù)到數(shù)據(jù)庫(kù)了帮哈,現(xiàn)在我們希望將查出來的結(jié)果集放到一個(gè)list中膛檀。

DataBaseUtils.config("jdbc.properties");
List list = DataBaseUtils.queryForList("select * from t_user");
System.out.println(list);

結(jié)果:

[{id=24cb5136-39cf-4109-a28b-d412efd6ad2d, sex=0, headerPic=null, username=趙六, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}, {id=319600c3-550a-4f9f-80cf-deebe2376528, sex=0, headerPic=null, username=張三, update_time=2016-10-04 22:52:01.0, address=保密, email=null, create_time=2016-10-04 00:00:00.0, is_delete=0, telephone=保密, password=123456}, {id=3fe31336-a792-488f-9445-f3ebd30f9de3, sex=0, headerPic=null, username=王五, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}, {id=5830e229-06d5-463c-b17d-639977f7c60c, sex=0, headerPic=null, username=李四, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}]

成功了。

09 查詢方法:queryForMap 實(shí)現(xiàn)

這個(gè)方法的作用是查詢出一條數(shù)據(jù)娘侍,因?yàn)橐粋€(gè)HashMap實(shí)際上就對(duì)應(yīng)數(shù)據(jù)庫(kù)表的一行數(shù)據(jù)咖刃。剛才,我們已經(jīng)實(shí)現(xiàn)了queryForList方法憾筏,所以嚎杨,現(xiàn)在只需要稍微調(diào)用一下,queryForMap 方法就出來了氧腰。

思路就是我先查出一個(gè)list枫浙,然后取第一條就OK了刨肃。

代碼:

/**
 * 查詢出數(shù)據(jù),并且map返回
 * @param sql
 * @param objects
 * @return
 * @throws SQLException
 */
public static Map<String,Object> queryForMap(String sql,Object...objects) throws SQLException{
    Map<String,Object> result = new HashMap<String,Object>();
    List<Map<String,Object>> list = queryForList(sql, objects);
    if(list.size() != 1){
        return null;
    }
    result = list.get(0);
    return result;
}

測(cè)試箩帚,查詢所有的數(shù)據(jù):

DataBaseUtils.config("jdbc.properties");
Map map = DataBaseUtils.queryForMap("select * from t_user");
System.out.println(map);

運(yùn)行結(jié)果為 null

因?yàn)椴樵兂鰜淼牟恢挂粭l數(shù)據(jù)真友,所以返回了null。

現(xiàn)在我們就查一條數(shù)據(jù)

DataBaseUtils.config("jdbc.properties");
Map map = DataBaseUtils.queryForMap("select * from t_user where username = ?","王五");
System.out.println(map);

運(yùn)行結(jié)果:

{id=3fe31336-a792-488f-9445-f3ebd30f9de3, sex=0, headerPic=null, username=王五, update_time=2016-10-05 13:01:33.0, address=保密, email=null, create_time=2016-10-05 00:00:00.0, is_delete=0, telephone=保密, password=123456}

這樣就對(duì)了紧帕。

10 查詢方法:queryForBean 實(shí)現(xiàn)

終于到queryForBean了盔然,這個(gè)方法的意思就是說,將查詢出來的一條數(shù)據(jù)(注意是嗜,只能是一條數(shù)據(jù))轉(zhuǎn)換成JavaBean,也就是一個(gè)Java對(duì)象愈案。

比如,我從t_user表中查一條數(shù)據(jù)出來鹅搪,然后它就能給我返回一個(gè)User對(duì)象站绪。很顯然,這個(gè)方法肯定需要用到Java的反射API和泛型丽柿。

因?yàn)槲覀冎耙呀?jīng)寫好了queryForMap崇众,所以在這個(gè)方法中,可以直接調(diào)用那個(gè)方法航厚,這樣省去了很多的工作量。

大體的思路就是:

1.拿到map锰蓬。

2.新建一個(gè)JavaBean幔睬,因?yàn)槭孪炔恢繨avaBean的類型,所以要傳進(jìn)來一個(gè)class屬性芹扭,然后方法的返回值需要用到泛型麻顶,不然沒法new。

3.遍歷map中所有的key舱卡,想辦法獲取對(duì)應(yīng)的set方法辅肾。(注意,你的JavaBean必須要符合Bean規(guī)范轮锥,否則會(huì)有問題的)

4.通過反射來調(diào)用set方法矫钓。

5. 返回已經(jīng)注入好的JavaBean。

這個(gè)方法呢舍杜,我大概寫了2個(gè)小時(shí)新娜,因?yàn)閷?shí)在沒有寫過類似的代碼,只能自己在那一點(diǎn)點(diǎn)摸索既绩。

代碼的話呢概龄,肯定還有不足的地方,我大概測(cè)試了一下饲握,不論怎么樣私杜,差不多可以用蚕键。

OK,上代碼:

/**
 * 查詢出數(shù)據(jù)衰粹,并且返回一個(gè)JavaBean
 * @param sql
 * @param clazz
 * @param objects
 * @return
 * @throws NoSuchFieldException
 * @throws SecurityException
 */
public static <T>T queryForBean(String sql,Class clazz,Object...objects){
    T obj = null;
    Map<String,Object> map = null;
    Field field = null;
    try {
        obj = (T) clazz.newInstance();   //創(chuàng)建一個(gè)新的Bean實(shí)例
        map = queryForMap(sql, objects); //先將結(jié)果集放在一個(gè)Map中
    } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    if(map == null){
        return null;
    }
    //遍歷Map
    for (String columnName : map.keySet()) {
        Method method = null;
        String propertyName = StringUtils.columnToProperty(columnName); //屬性名稱
        
        try {
            field = clazz.getDeclaredField(propertyName);
        } catch (NoSuchFieldException e1) {
            e1.printStackTrace();
        } catch (SecurityException e1) {
            e1.printStackTrace();
        } 
        //獲取JavaBean中的字段
        String fieldType = field.toString().split(" ")[1]; //獲取該字段的類型
        //System.out.println(fieldType);
        Object value = map.get(columnName);
        if(value == null){
            continue;
        }
        /**獲取set方法的名字* */
        String setMethodName = "set" + StringUtils.upperCaseFirstCharacter(propertyName);
        //System.out.println(setMethodName);
        try {
            /**獲取值的類型* */
            String valueType = value.getClass().getName();
            
            /**查看類型是否匹配* */
            if(!fieldType.equalsIgnoreCase(valueType)){
                //System.out.println("類型不匹配");
                if(fieldType.equalsIgnoreCase("java.lang.Integer")){
                    value = Integer.parseInt(String.valueOf(value));
                }else if(fieldType.equalsIgnoreCase("java.lang.String")){
                    value = String.valueOf(value);
                }else if(fieldType.equalsIgnoreCase("java.util.Date")){
                    valueType = "java.util.Date";
                    //將value轉(zhuǎn)換成java.util.Date
                    String dateStr = String.valueOf(value);
                    Timestamp ts = Timestamp.valueOf(dateStr);
                    Date date = new Date(ts.getTime());
                    value = date;
                }
            }
            
            /**獲取set方法* */
            //System.out.println(valueType);
            method = clazz.getDeclaredMethod(setMethodName,Class.forName(fieldType));
            /**執(zhí)行set方法* */
            method.invoke(obj, value);
        }catch(Exception e){
            e.printStackTrace();
            /**如果報(bào)錯(cuò)锣光,基本上是因?yàn)轭愋筒黄ヅ? */
        }
    }
    //System.out.println(obj);
    return obj;
}

這段代碼涉及到兩個(gè)方法,我這邊也分享出來吧寄猩,我已經(jīng)把它們放在StringUtils里面了嫉晶。如果你自己也打算寫類似的小框架的話呢,這兩個(gè)方法很可能會(huì)被用到田篇。

Paste_Image.png
/**
 * 把數(shù)據(jù)庫(kù)字段名改為駝峰方式
 * @param column
 * @return
 */
public static String columnToProperty(String column) {
    /**如果字段名為空替废,就返回空字符串* */
    if(isEmpty(column)) return "";
    /**獲取字段的長(zhǎng)度,一般來說字段長(zhǎng)度不可能有幾百個(gè)字節(jié)的泊柬,所以用Byte就行了* */
    Byte length = (byte) column.length();
    
    StringBuilder sb = new StringBuilder(length);
    int i = 0;
    /**遍歷字段的每一個(gè)字符* */
    for (int j = 0; j < length; j++) {
         /**匹配到第一個(gè)_* */
        if (column.charAt(j) == '_') {
            /**如果后面還有_,也就是連續(xù)的_,那么j就需要自增一個(gè)單位椎镣,直到后面不是_為止* */
            while (column.charAt(j + 1) == '_') {
                j += 1;
            }
            sb.append(("" + column.charAt(++j)).toUpperCase());
            
        } else {
             /**如果循環(huán)到的字符不是_,那么就保存下來* */
                sb.append(column.charAt(j));
            }
        }
 
     return sb.toString();
 }
    
/**
 * 將一個(gè)字符串的首字母改成大寫
 * @param str
 * @return
 */
public static String upperCaseFirstCharacter(String str){
    StringBuilder sb = new StringBuilder();
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        if(i==0) sb.append((arr[i] + "").toUpperCase());
        else sb.append((arr[i]+""));
    }
    return sb.toString();
}

測(cè)試

User user = DataBaseUtils.queryForBean("select * from t_user  limit 1", User.class);
System.out.println(user);

結(jié)果(我已經(jīng)給User類改寫了toString方法):

User [id=24cb5136-39cf-4109-a28b-d412efd6ad2d, username=趙六, password=123456, headerPic=null, email=null, sex=0, createTime=2016-10-05 00:00:00.0, updateTime=2016-10-05 13:01:33.0, isDelete=0, address=保密, telephone=保密]

那么,好的兽赁,我們的DataBaseUtils暫時(shí)告一段落了状答。雖然還不完善,可是已經(jīng)有了一個(gè)雛形了刀崖。所以惊科,寫代碼不要怕,只要有時(shí)間亮钦,你肯定能寫出來馆截,最多就是不完善罷了。你也可以利用網(wǎng)絡(luò)上的資源蜂莉,有些東西慢慢琢磨蜡娶,基本上都是可以弄出來的。很多初學(xué)者最大的問題就是不敢去嘗試映穗,僅此而已窖张。

接下來,我們繼續(xù)寫業(yè)務(wù)蚁滋。

11 從controller層到service層

為了方便起見宿接,我們就寫到Service就OK了,省去dao層辕录。反正我經(jīng)歷的幾個(gè)公司都是這么做的澄阳,他們似乎都有意弱化了dao層,直接寫到service層就結(jié)束了踏拜。

我們繼續(xù)編寫controller的代碼碎赢,因?yàn)橐{(diào)用service的方法,所以速梗,我們需要把必要的包導(dǎo)入進(jìn)來肮塞。

<%@ page language="java" import="java.util.*,service.LoginService,util.StringUtils,bean.*" pageEncoding="UTF-8"%>

controller代碼

<%
    //獲取客戶端傳遞過來參數(shù)
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //System.out.println(username);
    //System.out.println(password);
    //如果用戶名和密碼不為空
    if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
        out.print("-1");//錯(cuò)誤碼-1 :   用戶名和密碼不能為空襟齿!
    }else{
        //初始化LoginService
        LoginService loginService = new LoginService();
        //接下來判斷用戶名是否存在
        User user = loginService.getUser(username);
        if(user == null){
            out.print("-2");//錯(cuò)誤碼-2 :   用戶名不存在!
        }else
            //如果用戶名存在枕赵,那么驗(yàn)證用戶名和密碼是否匹配
            if(!username.equals(user.getUsername()) || !password.equals(user.getPassword())){
                out.print("-3");//錯(cuò)誤碼-3 :   用戶名或密碼錯(cuò)誤猜欺!
            }else{
                //如果能到這一步,就說明用戶的確存在拷窜,而且賬號(hào)密碼也正確开皿。那么就把user放在session中
                out.print("1");
                session.setAttribute("user", user);
                session.setAttribute("username", user.getUsername());
            }
    }
    
%>

流程是這樣的,首先判斷用戶名和密碼是否為空篮昧,如果為空赋荆,就直接返回一個(gè)錯(cuò)誤碼-1,接下來依次判斷用戶名是否存在懊昨,以及用戶名密碼是否都正確窄潭。

只要有一個(gè)不符合,就直接返回對(duì)應(yīng)的錯(cuò)誤碼酵颁。out對(duì)象是JSP九大隱式對(duì)象的一員嫉你,可以將某個(gè)值返回給前臺(tái)。

然后躏惋,如果賬號(hào)密碼都正確幽污,那么就返回一個(gè)1,表示登錄成功簿姨,同時(shí)距误,把user對(duì)象和用戶名放到session中。

session的話款熬,就是瀏覽器作用域,只要你瀏覽器開著攘乒,里面的值就存在著贤牛。瀏覽器一關(guān),存在session中的東西就沒了则酝。當(dāng)然殉簸,你也可以自己設(shè)定session失效的時(shí)間。

你可以把session想象成一個(gè)籃子沽讹“惚埃籃子嘛,肯定是用來放東西的爽雄,就這么簡(jiǎn)單蝠检。

service類:

Paste_Image.png

代碼

package service;

import bean.User;
import util.DataBaseUtils;

/**
 * 用戶登錄的服務(wù)類
 * @author lenovo
 *
 */
public class LoginService {
    
    public User getUser(String username){
        String sql = "select * from t_user where username = ?";
        User user = DataBaseUtils.queryForBean(sql, User.class, username);
        if(user == null){
            return null;
        }
        //System.out.println(user);
        return user;
    }
    
}

現(xiàn)在里面只有一個(gè)getUser方法,就是傳入一個(gè)username挚瘟,然后返回一個(gè)User對(duì)象叹谁。

我們剛才編寫的DataBaseUtils終于可以大顯身手啦饲梭! _

讓我們回到login.jsp,現(xiàn)在可以把登錄事件完善一下了焰檩。

Paste_Image.png
Paste_Image.png

代碼

<script>
    
    function login(){
        var username = $('#username').val();
        var password = $('#password').val();
        $.ajax({
            type:"post",//請(qǐng)求方式
            url:"${basePath}/controller/loginController.jsp",//請(qǐng)求地址
            data:{"username":username,"password":password},//傳遞給controller的json數(shù)據(jù)
            error:function(){//如果出錯(cuò)了憔涉,將事件重新綁定
                alert("登陸出錯(cuò)!");
            },
            success:function(data){ //返回成功執(zhí)行回調(diào)函數(shù)析苫。
                if(data == -1){
                    alert('用戶名和密碼不能為空兜叨!');
                }else if(data == -2){
                    alert('用戶名不存在!');
                }else if(data == -3){
                    alert('用戶名或密碼錯(cuò)誤衩侥!');
                }else{
                    //登錄成功后返回首頁
                    window.location.href = "${basePath}"; 
                }
            }
        });
        
        
    }
    
</script>

12 登錄功能完成

Paste_Image.png

點(diǎn)擊登錄国旷。

Paste_Image.png

把用戶名改為張三

Paste_Image.png

點(diǎn)擊登錄。


Paste_Image.png

密碼改為123456顿乒,

點(diǎn)擊登錄议街。

Paste_Image.png

成功了,跳轉(zhuǎn)到了首頁璧榄!

最后說兩句特漩,登錄功能終于做完了,想想還有點(diǎn)小激動(dòng)呢骨杂。_

這也是我第一次封裝一個(gè)自己的DataBaseUtils涂身,雖然不完善,可是畢竟能用搓蚪。其實(shí)蛤售,這已經(jīng)有那么一點(diǎn)點(diǎn)框架的味道了。我的觀點(diǎn)就是這樣妒潭,不管怎么樣悴能,都要去努力嘗試,就算自己的代碼寫得再爛雳灾,也要努力去寫漠酿。

知識(shí)點(diǎn)學(xué)了就是要拿來用的,不然學(xué)它干嘛呢谎亩?

培訓(xùn)的時(shí)候炒嘲,泛型,反射這些知識(shí)點(diǎn)也會(huì)講到匈庭,可是如果我們只是記住了教程里面的那幾個(gè)例子夫凸,多半還是語法級(jí)別的內(nèi)容,是沒有太大的意義的阱持。必須要自己反思夭拌,我能用這些知識(shí)點(diǎn)來做些什么?

俗話說得好,一屋不掃啼止,何以掃天下道逗?尤其是對(duì)于初學(xué)者,不要總想著什么框架献烦,總想著去學(xué)什么新技術(shù)滓窍。關(guān)鍵還是要自己總結(jié)和反思,還有巩那,必須吏夯,一定,毫不猶豫地即横,要自己學(xué)著做項(xiàng)目噪生。什么項(xiàng)目都行,但一定要自己去嘗試东囚。

很多初學(xué)者跺嗽,都有這么一個(gè)思維,就是我一定要做一個(gè)OA页藻,我一定要做一個(gè)ERP桨嫁。似乎在他們眼中,只有這種的才算是項(xiàng)目份帐。

結(jié)果就是璃吧,他們一直在學(xué)甥绿,永遠(yuǎn)也學(xué)不完勇蝙,就是不敢去找工作。

其實(shí)在我看來许饿,OA噩凹,ERP這種巴元,一個(gè)人完成是不太現(xiàn)實(shí)的,這應(yīng)該是一個(gè)團(tuán)隊(duì)的事情驮宴。對(duì)于初學(xué)者而言逮刨,你完全可以自己做一個(gè)小型的項(xiàng)目,比如日記本系統(tǒng)幻赚,學(xué)生管理系統(tǒng)禀忆。

通過做項(xiàng)目臊旭,去把知識(shí)點(diǎn)一個(gè)個(gè)地累積起來落恼。

所謂的OA,不也是這么回事嗎离熏?

一個(gè)業(yè)務(wù)系統(tǒng)佳谦,里面至少有幾十個(gè),甚至幾百個(gè)菜單滋戳∽昝铮總體來看的確很龐大啥刻,但是你只要一細(xì)分,你會(huì)發(fā)現(xiàn)大部分菜單都差不多咪笑,無非業(yè)務(wù)變一下罷了可帽。說穿了還不就是MVC。

所謂的業(yè)務(wù)系統(tǒng)就是這樣的窗怒,就是不斷地加功能映跟,加菜單。

一個(gè)大項(xiàng)目和小項(xiàng)目扬虚,單個(gè)菜單的難度其實(shí)是差不太多的努隙,技術(shù)點(diǎn)無非就那么幾個(gè)。復(fù)雜的是業(yè)務(wù)辜昵,所以你有的時(shí)候會(huì)在面試的時(shí)候聽到:我們不關(guān)心技術(shù)荸镊,只關(guān)心業(yè)務(wù)的言論。

所以堪置,沒必要給自己設(shè)限躬存,總是覺得,哎呀晋柱,我一定做一個(gè)OA系統(tǒng)优构,一定要學(xué)會(huì)工作流,甚至我一定要去學(xué)大數(shù)據(jù)雁竞。

不是這樣的钦椭,我感覺這不是初學(xué)者該考慮的問題。要知道碑诉,那種大型的業(yè)務(wù)系統(tǒng)彪腔,動(dòng)輒幾百個(gè)菜單,本來就不是靠一個(gè)人完成的进栽,多數(shù)情況是一個(gè)團(tuán)隊(duì)開發(fā)一個(gè)月德挣,或者幾個(gè)月的事情。

還有一點(diǎn)就是快毛,不要對(duì)框架產(chǎn)生畏懼心理格嗅,我很明白,很多人初學(xué)Java都會(huì)聽到SSH的大名唠帝,有些人非常迫切地想要一份工作屯掖,于是買了很多SSH的書來看。

不看不要緊襟衰,一看很容易就懵逼了贴铜,因?yàn)楦究床欢?/p>

其實(shí),不是你看不懂,而是你做的東西太少绍坝。

很多人徘意,明明Java基礎(chǔ)挺好的,就是總喜歡把精力放在研究框架的書籍上面轩褐,不肯去自己動(dòng)手寫項(xiàng)目椎咧。

框架只是一個(gè)工具,僅此而已把介。

要真正理解框架邑退,還是要通過做項(xiàng)目的。

無論這個(gè)項(xiàng)目有多小劳澄,都無所謂地技,關(guān)鍵是,你要敢于去嘗試秒拔。而不是說莫矗,只有OA,ERP才是項(xiàng)目砂缩,然后作谚,你覺得哎呀,好難啊庵芭,我做不了了妹懒。我還是繼續(xù)去買書來看吧。接著就是双吆,“你好眨唬,我們是某某培訓(xùn)公司的,我們?cè)诰W(wǎng)上看到你的簡(jiǎn)歷好乐。匾竿。∥低颍”

你看再多的視頻岭妖,買再多的書,都不如自己做個(gè)項(xiàng)目來得快反璃。

就是這樣的昵慌,個(gè)人感慨。

本文結(jié)束淮蜈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斋攀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子礁芦,更是在濱河造成了極大的恐慌蜻韭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柿扣,死亡現(xiàn)場(chǎng)離奇詭異肖方,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)未状,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門俯画,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人司草,你說我怎么就攤上這事艰垂。” “怎么了埋虹?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵猜憎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我搔课,道長(zhǎng)胰柑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任爬泥,我火速辦了婚禮柬讨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袍啡。我一直安慰自己踩官,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布境输。 她就那樣靜靜地躺著蔗牡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗅剖。 梳的紋絲不亂的頭發(fā)上蛋逾,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音窗悯,去河邊找鬼区匣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒋院,可吹牛的內(nèi)容都是我干的亏钩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼欺旧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼姑丑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辞友,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤栅哀,失蹤者是張志新(化名)和其女友劉穎震肮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體留拾,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戳晌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痴柔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沦偎。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咳蔚,靈堂內(nèi)的尸體忽然破棺而出豪嚎,到底是詐尸還是另有隱情,我是刑警寧澤谈火,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布侈询,位于F島的核電站,受9級(jí)特大地震影響糯耍,放射性物質(zhì)發(fā)生泄漏妄荔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一谍肤、第九天 我趴在偏房一處隱蔽的房頂上張望啦租。 院中可真熱鬧,春花似錦荒揣、人聲如沸篷角。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恳蹲。三九已至,卻和暖如春俩滥,著一層夾襖步出監(jiān)牢的瞬間嘉蕾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工霜旧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留错忱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓挂据,卻偏偏與公主長(zhǎng)得像以清,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子崎逃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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