2018-03-29

Java中常用工具類

(1)生成隨機(jī)ID和隨機(jī)碼-UUIDUtils

package com.chuang.utils;

import java.util.UUID;

public class UUIDUtils {
    /**
     * 隨機(jī)生成id
     * @return
     */
    public static String getId(){
        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
    }
    
    /**
     * 生成隨機(jī)碼
     * @return
     */
    public static String getCode(){
        return getId();
    }
    
    public static void main(String[] args) {
        System.out.println(getId());
    }
}

(2)生成隨機(jī)驗(yàn)證碼-帶有干擾線效果-VerifyCode

package com.chuang.utils;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class VerifyCode {
    private int w = 70;
    private int h = 35;
    private Random r = new Random();
    // {"宋體", "華文楷體", "黑體", "華文新魏", "華文隸書", "微軟雅黑", "楷體_GB2312"}
    private String[] fontNames  = {"宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312"};
    private String codes  = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
    private Color bgColor  = new Color(255, 255, 255);
    private String text ;
    
    private Color randomColor () {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }
    
    private Font randomFont () {
        int index = r.nextInt(fontNames.length);
        String fontName = fontNames[index];
        int style = r.nextInt(4);
        int size = r.nextInt(5) + 24; 
        return new Font(fontName, style, size);
    }
    
    private void drawLine (BufferedImage image) {
        int num  = 3;
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        for(int i = 0; i < num; i++) {
            int x1 = r.nextInt(w);
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h); 
            g2.setStroke(new BasicStroke(1.5F)); 
            g2.setColor(Color.BLUE); 
            g2.drawLine(x1, y1, x2, y2);
        }
    }
    
    private char randomChar () {
        int index = r.nextInt(codes.length());
        return codes.charAt(index);
    }
    
    private BufferedImage createImage () {
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2 = (Graphics2D)image.getGraphics(); 
        g2.setColor(this.bgColor);
        g2.fillRect(0, 0, w, h);
        return image;
    }
    
    public BufferedImage getImage () {
        BufferedImage image = createImage(); 
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        StringBuilder sb = new StringBuilder();
        // 向圖片中畫4個(gè)字符
        for(int i = 0; i < 4; i++)  {
            String s = randomChar() + ""; 
            sb.append(s); 
            float x = i * 1.0F * w / 4; 
            g2.setFont(randomFont()); 
            g2.setColor(randomColor()); 
            g2.drawString(s, x, h-5); 
        }
        this.text = sb.toString(); 
        drawLine(image); 
        return image;       
    }
    
    public String getText () {
        return text;
    }
    
    public static void output (BufferedImage image, OutputStream out) 
                throws IOException {
        ImageIO.write(image, "JPEG", out);
    }
}

(3)郵件發(fā)送工具-MailUtils

package com.chuang.utils;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

public class MailUtils {

    public static void sendMail(String email, String emailMsg)
            throws AddressException, MessagingException {
        // 1.創(chuàng)建一個(gè)程序與郵件服務(wù)器會(huì)話對(duì)象 Session

        Properties props = new Properties();
        //設(shè)置發(fā)送的協(xié)議
        props.setProperty("mail.transport.protocol", "SMTP");
        
        //設(shè)置發(fā)送郵件的服務(wù)器
        props.setProperty("mail.host", "smtp.163.com");
        props.setProperty("mail.smtp.auth", "true");// 指定驗(yàn)證為true

        // 創(chuàng)建驗(yàn)證器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //設(shè)置發(fā)送人的帳號(hào)和密碼
                return new PasswordAuthentication("15637038571@163.com", "ljc04172530");
            }
        };

        Session session = Session.getInstance(props, auth);

        // 2.創(chuàng)建一個(gè)Message发绢,它相當(dāng)于是郵件內(nèi)容
        Message message = new MimeMessage(session);

        //設(shè)置發(fā)送者
        message.setFrom(new InternetAddress("15637038571@163.com"));

        //設(shè)置發(fā)送方式與接收者
        message.setRecipient(RecipientType.TO, new InternetAddress(email)); 

        //設(shè)置郵件主題
        message.setSubject("用戶激活");
         
        //設(shè)置郵件內(nèi)容
        message.setContent(emailMsg, "text/html;charset=utf-8");

        // 3.創(chuàng)建 Transport用于將郵件發(fā)送
        Transport.send(message);
    }
}

(4)支持事務(wù)的數(shù)據(jù)庫(kù)連接獲取工具-DataSourceUtils

package com.chuang.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {
    private static ComboPooledDataSource ds=new ComboPooledDataSource();
    private static ThreadLocal<Connection> tl=new ThreadLocal<>();
    
    /**
     * 獲取數(shù)據(jù)源
     * @return 連接池
     */
    public static DataSource getDataSource(){
        return ds;
    }
    
    /**
     * 從線程中獲取連接
     * @return 連接
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        Connection conn = tl.get();
        //若是第一次獲取 需要從池中獲取一個(gè)連接,將這個(gè)連接和當(dāng)前線程綁定
        if(conn==null){
            conn=ds.getConnection();
            
            //將這個(gè)連接和當(dāng)前線程綁定
            tl.set(conn);
        }
        
        return conn;
    }
    
    
    
    /**
     * 釋放資源
     * 
     * @param conn
     *            連接
     * @param st
     *            語句執(zhí)行者
     * @param rs
     *            結(jié)果集
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
        closeConn(conn);
    }

    /**
     * 釋放連接
     * 
     * @param conn
     *            連接
     */
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
                //和當(dāng)前線程解綁
                tl.remove();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }

    }

    /**
     * 釋放語句執(zhí)行者
     * 
     * @param st
     *            語句執(zhí)行者
     */
    public static void closeStatement(Statement st) {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            st = null;
        }

    }

    /**
     * 釋放結(jié)果集
     * 
     * @param rs
     *            結(jié)果集
     */
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }

    }
    
    /**
     * 開始事務(wù)
     * @throws SQLException 
     */
    public static void startTransaction() throws SQLException{
        //1.獲取連接
        Connection conn=getConnection();
        
        //2.開始
        conn.setAutoCommit(false);
    }
    
    /**
     * 事務(wù)提交
     */
    public static void commitAndClose(){
        try {
            //0.獲取連接
            Connection conn = getConnection();
            
            //1.提交事務(wù)
            conn.commit();
            
            //2.關(guān)閉且移除
            closeConn(conn);
        } catch (SQLException e) {
        }
        
    }
    
    /**
     * 提交回顧
     */
    public static void rollbackAndClose(){
        try {
            //0.獲取連接
            Connection conn = getConnection();
            
            //1.事務(wù)回顧
            conn.rollback();
            
            //2.關(guān)閉且移除
            closeConn(conn);
        } catch (SQLException e) {
        }
        
    }
}

使用c3p0連接池時(shí)所需的屬性配置文件-c3p0.properties

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/store38
c3p0.user=root
c3p0.password=admin

(5)文件上傳工具-UploadUtils

package cn.chuang.utils;

import java.util.Random;
import java.util.UUID;

public class UploadUtils {
    /**
     * 獲取文件真實(shí)名稱
     * 由于瀏覽器的不同獲取的名稱可能為:c:/upload/1.jpg或者1.jpg 
     * 最終獲取的為  1.jpg
     * @param name 上傳上來的文件名稱
     * @return  真實(shí)名稱
     */
    public static String getRealName(String name){
        //獲取最后一個(gè)"/"
        int index = name.lastIndexOf("\\");
        return name.substring(index+1);
    }
    
    
    /**
     * 獲取隨機(jī)名稱
     * @param realName 真實(shí)名稱
     * @return uuid 隨機(jī)名稱
     */
    public static String getUUIDName(String realName){
        //realname  可能是  1.jpg   也可能是  1
        //獲取后綴名
        int index = realName.lastIndexOf(".");
        if(index==-1){
            return UUID.randomUUID().toString().replace("-", "").toUpperCase();
        }else{
            return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
        }
    }
    
    
    /**
     * 獲取文件目錄,可以獲取256個(gè)隨機(jī)目錄
     * @return 隨機(jī)目錄
     */
    public static String getDir(){
        String s="0123456789ABCDEF";
        Random r = new Random();
        return "/"+s.charAt(r.nextInt(16))+"/"+s.charAt(r.nextInt(16));
    }
    
    public static void main(String[] args) {
        //String s="G:\\day17-基礎(chǔ)加強(qiáng)\\resource\\1.jpg";
        String s="1.jgp";
        String realName = getRealName(s);
        System.out.println(realName);
        
        String uuidName = getUUIDName(realName);
        System.out.println(uuidName);
        
        String dir = getDir();
        System.out.println(dir);
    }
}

(6)銀行支付功能實(shí)現(xiàn)工具-PaymentUtils

package cn.chuang.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class PaymentUtil {

    private static String encodingCharset = "UTF-8";
    
    /**
     * 生成hmac方法
     * 
     * @param p0_Cmd 業(yè)務(wù)類型
     * @param p1_MerId 商戶編號(hào)
     * @param p2_Order 商戶訂單號(hào)
     * @param p3_Amt 支付金額
     * @param p4_Cur 交易幣種
     * @param p5_Pid 商品名稱
     * @param p6_Pcat 商品種類
     * @param p7_Pdesc 商品描述
     * @param p8_Url 商戶接收支付成功數(shù)據(jù)的地址
     * @param p9_SAF 送貨地址
     * @param pa_MP 商戶擴(kuò)展信息
     * @param pd_FrpId 銀行編碼
     * @param pr_NeedResponse 應(yīng)答機(jī)制
     * @param keyValue 商戶密鑰
     * @return
     */
    public static String buildHmac(String p0_Cmd,String p1_MerId,
            String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,
            String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,
            String pr_NeedResponse,String keyValue) {
        StringBuilder sValue = new StringBuilder();
        // 業(yè)務(wù)類型
        sValue.append(p0_Cmd);
        // 商戶編號(hào)
        sValue.append(p1_MerId);
        // 商戶訂單號(hào)
        sValue.append(p2_Order);
        // 支付金額
        sValue.append(p3_Amt);
        // 交易幣種
        sValue.append(p4_Cur);
        // 商品名稱
        sValue.append(p5_Pid);
        // 商品種類
        sValue.append(p6_Pcat);
        // 商品描述
        sValue.append(p7_Pdesc);
        // 商戶接收支付成功數(shù)據(jù)的地址
        sValue.append(p8_Url);
        // 送貨地址
        sValue.append(p9_SAF);
        // 商戶擴(kuò)展信息
        sValue.append(pa_MP);
        // 銀行編碼
        sValue.append(pd_FrpId);
        // 應(yīng)答機(jī)制
        sValue.append(pr_NeedResponse);
        
        return PaymentUtil.hmacSign(sValue.toString(), keyValue);
    }
    
    /**
     * 返回校驗(yàn)hmac方法
     * 
     * @param hmac 支付網(wǎng)關(guān)發(fā)來的加密驗(yàn)證碼
     * @param p1_MerId 商戶編號(hào)
     * @param r0_Cmd 業(yè)務(wù)類型
     * @param r1_Code 支付結(jié)果
     * @param r2_TrxId 易寶支付交易流水號(hào)
     * @param r3_Amt 支付金額
     * @param r4_Cur 交易幣種
     * @param r5_Pid 商品名稱
     * @param r6_Order 商戶訂單號(hào)
     * @param r7_Uid 易寶支付會(huì)員ID
     * @param r8_MP 商戶擴(kuò)展信息
     * @param r9_BType 交易結(jié)果返回類型
     * @param keyValue 密鑰
     * @return
     */
    public static boolean verifyCallback(String hmac, String p1_MerId,
            String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
            String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
            String r8_MP, String r9_BType, String keyValue) {
        StringBuilder sValue = new StringBuilder();
        // 商戶編號(hào)
        sValue.append(p1_MerId);
        // 業(yè)務(wù)類型
        sValue.append(r0_Cmd);
        // 支付結(jié)果
        sValue.append(r1_Code);
        // 易寶支付交易流水號(hào)
        sValue.append(r2_TrxId);
        // 支付金額
        sValue.append(r3_Amt);
        // 交易幣種
        sValue.append(r4_Cur);
        // 商品名稱
        sValue.append(r5_Pid);
        // 商戶訂單號(hào)
        sValue.append(r6_Order);
        // 易寶支付會(huì)員ID
        sValue.append(r7_Uid);
        // 商戶擴(kuò)展信息
        sValue.append(r8_MP);
        // 交易結(jié)果返回類型
        sValue.append(r9_BType);
        String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
        return sNewString.equals(hmac);
    }
    
    /**
     * @param aValue
     * @param aKey
     * @return
     */
    public static String hmacSign(String aValue, String aKey) {
        byte k_ipad[] = new byte[64];
        byte k_opad[] = new byte[64];
        byte keyb[];
        byte value[];
        try {
            keyb = aKey.getBytes(encodingCharset);
            value = aValue.getBytes(encodingCharset);
        } catch (UnsupportedEncodingException e) {
            keyb = aKey.getBytes();
            value = aValue.getBytes();
        }

        Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
        Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
        for (int i = 0; i < keyb.length; i++) {
            k_ipad[i] = (byte) (keyb[i] ^ 0x36);
            k_opad[i] = (byte) (keyb[i] ^ 0x5c);
        }

        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {

            return null;
        }
        md.update(k_ipad);
        md.update(value);
        byte dg[] = md.digest();
        md.reset();
        md.update(k_opad);
        md.update(dg, 0, 16);
        dg = md.digest();
        return toHex(dg);
    }

    public static String toHex(byte input[]) {
        if (input == null)
            return null;
        StringBuffer output = new StringBuffer(input.length * 2);
        for (int i = 0; i < input.length; i++) {
            int current = input[i] & 0xff;
            if (current < 16)
                output.append("0");
            output.append(Integer.toString(current, 16));
        }

        return output.toString();
    }

    /**
     * 
     * @param args
     * @param key
     * @return
     */
    public static String getHmac(String[] args, String key) {
        if (args == null || args.length == 0) {
            return (null);
        }
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < args.length; i++) {
            str.append(args[i]);
        }
        return (hmacSign(str.toString(), key));
    }

    /**
     * @param aValue
     * @return
     */
    public static String digest(String aValue) {
        aValue = aValue.trim();
        byte value[];
        try {
            value = aValue.getBytes(encodingCharset);
        } catch (UnsupportedEncodingException e) {
            value = aValue.getBytes();
        }
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("SHA");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
        return toHex(md.digest(value));

    }
    
//  public static void main(String[] args) {
//      System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp榪?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t"));
//  }
}

(7)Json格式數(shù)據(jù)處理工具-JsonUtils

package cn.chuang.utils;

import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.xml.XMLSerializer;

/**
 * 處理json數(shù)據(jù)格式的工具類
 * 
 * @Date 2013-3-31
 * @version 1.0
 */
public class JsonUtil {
    /**
     * 將數(shù)組轉(zhuǎn)換成String類型的JSON數(shù)據(jù)格式
     * 
     * @param objects
     * @return
     */
    public static String array2json(Object[] objects){
        
        JSONArray jsonArray = JSONArray.fromObject(objects);
        return jsonArray.toString();
        
    }
    
    /**
     * 將list集合轉(zhuǎn)換成String類型的JSON數(shù)據(jù)格式
     * 
     * @param list
     * @return
     */
    public static String list2json(List list){
        
        JSONArray jsonArray = JSONArray.fromObject(list);
        return jsonArray.toString();
        
    }
    
    /**
     * 將map集合轉(zhuǎn)換成String類型的JSON數(shù)據(jù)格式
     * 
     * @param map
     * @return
     */
    public static String map2json(Map map){
        
        JSONObject jsonObject = JSONObject.fromObject(map);
        return jsonObject.toString();
        
    }
    
    /**
     * 將Object對(duì)象轉(zhuǎn)換成String類型的JSON數(shù)據(jù)格式
     * 
     * @param object
     * @return
     */
    public static String object2json(Object object){
        
        JSONObject jsonObject = JSONObject.fromObject(object);
        return jsonObject.toString();
        
    }
    
    /**
     * 將XML數(shù)據(jù)格式轉(zhuǎn)換成String類型的JSON數(shù)據(jù)格式
     * 
     * @param xml
     * @return
     */
    public static String xml2json(String xml){
        
        JSONArray jsonArray = (JSONArray) new XMLSerializer().read(xml);
        return jsonArray.toString();
        
    }
    
    /**
      * 除去不想生成的字段(特別適合去掉級(jí)聯(lián)的對(duì)象)
      *
      * @param excludes
      * @return
    */
    public static JsonConfig configJson(String[] excludes) {
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setExcludes(excludes);
        jsonConfig.setIgnoreDefaultExcludes(true);
        jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
        return jsonConfig;
    }
    
}

(8)Redis緩存方式獲取數(shù)據(jù)庫(kù)連接工具-JedisUtils

package cn.chuang.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisUtils {
    //創(chuàng)建連接池
    private static final JedisPoolConfig config;
    private static final JedisPool pool;
    
    static{
        config=new JedisPoolConfig();
        config.setMaxTotal(30);
        config.setMaxIdle(2);
        
        pool=new JedisPool(config, "192.168.17.136", 6379);
    }
    
    
    //獲取連接的方法
    public static Jedis getJedis(){
        return pool.getResource();
    }
    
    
    //釋放連接
    public static void closeJedis(Jedis j){
        if(j!=null){
            j.close();
        }
    }
}

(9)解耦合思想之工廠方式注入Service和Dao工具-BeanFactory

package cn.chuang.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 獲取javabean的工廠
 * @author Administrator
 *
 */
public class BeanFactory {

    public static Object getBean(String id){
        try {
            //1.獲取document對(duì)象
            Document doc=new SAXReader().read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
            
            //2.調(diào)用api selectSingleNode(表達(dá)式)
            Element beanEle=(Element) doc.selectSingleNode("http://bean[@id='"+id+"']");
            
            //3.獲取元素的class屬性
            String classValue = beanEle.attributeValue("class");
            
            //4.通過反射返回實(shí)現(xiàn)類的對(duì)象
            Object newInstance = Class.forName(classValue).newInstance();
            return newInstance;
        }  catch (Exception e) {
            e.printStackTrace();
            System.out.println("獲取bean失敗");
        }
        return null;
    }
    
    public static void main(String[] args) throws Exception {
        System.out.println(getBean("ProductDao1"));
    }
}

工廠類所需的配置文件-beans.xml(要放在src目錄下沈条,以便編譯時(shí)加載到類路徑中)

<?xml version="1.0" encoding="UTF-8"?>
<beans>
   <bean id="ProductDao" class="cn.chuang.dao.impl.ProductDaoImpl"/>
   <bean id="UserDao" class="cn.chuang.dao.impl.UserDaoImpl"/>
   <bean id="CategoryDao" class="cn.chuang.dao.impl.CategoryDaoImpl"/>
   <bean id="OrderDao" class="cn.chuang.dao.impl.OrderDaoImpl"/>
   
   <bean id="ProductService" class="cn.chuang.service.impl.ProductServiceImpl"/>
   <bean id="UserService" class="cn.chuang.service.impl.UserServiceImpl"/>
   <bean id="CategoryService" class="cn.chuang.service.impl.CategoryServiceImpl"/>
   <bean id="OrderService" class="cn.chuang.service.impl.OrderServiceImpl"/>
</beans>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渡紫,一起剝皮案震驚了整個(gè)濱河市秉氧,隨后出現(xiàn)的幾起案子掖看,更是在濱河造成了極大的恐慌捕发,老刑警劉巖锁右,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件失受,死亡現(xiàn)場(chǎng)離奇詭異讶泰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拂到,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門痪署,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兄旬,你說我怎么就攤上這事狼犯。” “怎么了领铐?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵悯森,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我绪撵,道長(zhǎng)瓢姻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任音诈,我火速辦了婚禮幻碱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘细溅。我一直安慰自己褥傍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布喇聊。 她就那樣靜靜地躺著恍风,像睡著了一般。 火紅的嫁衣襯著肌膚如雪承疲。 梳的紋絲不亂的頭發(fā)上邻耕,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天鸥咖,我揣著相機(jī)與錄音燕鸽,去河邊找鬼。 笑死啼辣,一個(gè)胖子當(dāng)著我的面吹牛啊研,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸥拧,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼党远,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了富弦?” 一聲冷哼從身側(cè)響起沟娱,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腕柜,沒想到半個(gè)月后济似,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矫废,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年砰蠢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓖扑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡台舱,死狀恐怖律杠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竞惋,我是刑警寧澤柜去,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碰声,受9級(jí)特大地震影響诡蜓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胰挑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一蔓罚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞻颂,春花似錦豺谈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盖矫,卻和暖如春丽惭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辈双。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工责掏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湃望。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓换衬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親证芭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞳浦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)废士,斷路器叫潦,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • okHttpUtils(hongyang)的配置及使用(網(wǎng)絡(luò)框架) okHttpUtils很方便,可以直接更新UI...
    夢(mèng)遇懷秋入夢(mèng)閱讀 131評(píng)論 0 0
  • 驀然回首四敞,才發(fā)現(xiàn)時(shí)間已經(jīng)過去了太多,又處于生活中的另一個(gè)起點(diǎn)拔妥。曾經(jīng)少年不知愁滋味忿危,為賦新詞強(qiáng)說愁。喜歡標(biāo)新...
    楚河6閱讀 170評(píng)論 2 1
  • 身體衰老是從什么時(shí)候真正開始的没龙?最近铺厨,最極因(XY-DNA)科學(xué)家通過研究線蟲(C. elegans)發(fā)現(xiàn),當(dāng)...
    科技社閱讀 543評(píng)論 0 0