IDEA統(tǒng)一CodeStyle

IDEA 配置統(tǒng)一的方法注釋和類注釋

最近覺得建立統(tǒng)一的代碼風格檢查很有必要萨西,主要有以下原因

  • 沒有良好的注釋和返回說明妄壶,有些不能見名知意霞扬;往往代碼經(jīng)過多人修改佑笋,就會無法溯源翼闹,扯皮的事兒就會多

  • 風格差異太大,只要每個人的IDE不同蒋纬,提交后自動格式化后就會有版本沖突

類注釋

image-20200615183353699.png

在File->Settings->Editor->File and Code Templates下分別修改Class猎荠,Interface坚弱,Enum等注釋模板

/**
 * FileName: ${NAME}
 * Author:   ${USER}
 * Date:     ${DATE} ${TIME}
 * Description: ${DESCRIPTION}
 */
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")
 package ${PACKAGE_NAME};
#end
?
/**
 * 〈${DESCRIPTION}〉
 * @author ${USER}
 * @create ${DATE}
 * @since 1.0.0
 */
public class ${NAME} {
?
}

方法注釋模板

  • 新建方法注釋模板


    image.png
  • 設置注釋模板
 * @Author $user$
 * @Description
 * @date $date$ $time$ $params$ $return$
 **/
  • 編輯注釋模板的環(huán)境變量(groovy腳本)
image.png
  • @param自動獲取腳本
groovyScript("if(\"${_1}\".length() == 2){
 return '';
 }else{
 def result=''; 
 def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList();
 for(i = 0; i < params.size(); i++) {
 if(params[i]=='null'){
 return;
 }else{
 result+='\\n' + ' * @param ' + params[i] 
 }
 }; 
 return result;
 }", methodParameters());
  • @return注釋模板腳本
    • 不帶泛型參數(shù)(本次使用這個)
groovyScript("def result=''; def params=\"${_1}\"; 
         if(params.indexOf('<')!=-1){
         result=params.substring(0, params.indexOf('<')); 
         return '\\n * @return ' +'{@link '+result+'}';
         }
         else{
         if(params=='null'||params=='void'){
         return;
         }
         else{
         return '\\n * @return ' +'{@link ' + params+'}';
         }
         }", methodReturnType());
  • 返回參數(shù)帶泛型(不建議使用)
         if(returnType=='null'||returnType=='void'){
         return;
         }else{
         result += '\\n * @return ' + \"{@link \"+returnType+\"}\"; return result;
         }", methodReturnType());

IDEA配置GoogleCodeStyle

導入官方配置文件

image-20200616144738276.png

IDEA修改

intellij-java-google-style.xml導入后,根據(jù)個人習慣修改部分設置关摇,以下是示例

備注:你也可以直接修改intellij-java-google-style.xml文件后導入IDEA就可以了

  • 修改每行字符限制
image-20200616145130828.png
  • 縮進調(diào)整
image-20200616145248178.png
  • 對齊
image-20200616145504306.png

IDEA 配置GoogleCodeStyleCheck

intellij-java-google-style.xml可以控制你的代碼格式荒叶,但是對于方法是否有doc文檔注釋,類名是否合法输虱,導入無效的包等些楣,需要能夠對這些不符合規(guī)定風格的代碼進行檢查,CheckStyle插件就是專門做這個的宪睹。

安裝CheckStyle-IEEA插件

image-20200615180636252.png

配置CheckStyle.xml

  • CheckStyle.xml文件修改

CheckStyle官方參考

以下是基于官方配置修改后內(nèi)容

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
 "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
 "https://checkstyle.org/dtds/configuration_1_3.dtd">
?
<!--
 Checkstyle configuration that checks the Google coding conventions from Google Java Style
 that can be found at https://google.github.io/styleguide/javaguide.html
 Checkstyle is very configurable. Be sure to read the documentation at
 http://checkstyle.org (or in your downloaded distribution).
 To completely disable a check, just comment it out or delete it from the file.
 To suppress certain violations please review suppression filters.
 Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
 -->
?
<module name = "Checker">
 <property name="charset" value="UTF-8"/>
?
 <property name="severity" value="warning"/>
?
 <property name="fileExtensions" value="java, properties, xml"/>
 <!-- Excludes all 'module-info.java' files              -->
 <!-- See https://checkstyle.org/config_filefilters.html -->
 <module name="BeforeExecutionExclusionFileFilter">
 <property name="fileNamePattern" value="module\-info\.java$"/>
 </module>
 <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
 <module name="SuppressionFilter">
 <property name="file" value="${org.checkstyle.google.suppressionfilter.config}"
 default="checkstyle-suppressions.xml" />
 <property name="optional" value="true"/>
 </module>
?
 <!-- Checks for whitespace                               -->
 <!-- See http://checkstyle.org/config_whitespace.html -->
 <module name="FileTabCharacter">
 <property name="eachLine" value="true"/>
 </module>
?
 <!--每行不超過120字-->
 <module name="LineLength">
 <property name="fileExtensions" value="java"/>
 <property name="max" value="120"/>
 <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
 </module>
?
 <module name="TreeWalker">
 <module name="OuterTypeFilename"/>
 <module name="IllegalTokenText">
 <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
 <property name="format"
 value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
 <property name="message"
 value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
 </module>
 <module name="AvoidEscapedUnicodeCharacters">
 <property name="allowEscapesForControlCharacters" value="true"/>
 <property name="allowByTailComment" value="true"/>
 <property name="allowNonPrintableEscapes" value="true"/>
 </module>
 <module name="AvoidStarImport"/>
 <module name="RedundantImport"/>
 <module name="UnusedImports"/>
 <module name="OneTopLevelClass"/>
 <module name="NoLineWrap">
 <property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
 </module>
 <module name="EmptyBlock">
 <property name="option" value="TEXT"/>
 <property name="tokens"
 value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
 </module>
 <module name="NeedBraces">
 <property name="tokens"
 value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
 </module>
 <!--<module name="LeftCurly">
 <property name="tokens"
 value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
 INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
 LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
 LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
 OBJBLOCK, STATIC_INIT"/>
 </module>-->
 <module name="RightCurly">
 <property name="id" value="RightCurlySame"/>
 <property name="tokens"
 value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
 LITERAL_DO"/>
 </module>
 <!--<module name="RightCurly">
 <property name="id" value="RightCurlyAlone"/>
 <property name="option" value="alone"/>
 <property name="tokens"
 value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
 INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF, INTERFACE_DEF"/>
 </module>-->
 <module name="SuppressionXpathSingleFilter">
 <!-- suppresion is required till https://github.com/checkstyle/checkstyle/issues/7541 -->
 <property name="id" value="RightCurlyAlone"/>
 <property name="query" value="http://RCURLY[parent::SLIST[count(./*)=1]
 or preceding-sibling::*[last()][self::LCURLY]]"/>
 </module>
 <module name="WhitespaceAfter">
 <property name="tokens"
 value="COMMA, SEMI, TYPECAST, LITERAL_IF, LITERAL_ELSE,
 LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, DO_WHILE"/>
 </module>
 <module name="WhitespaceAround">
 <property name="allowEmptyConstructors" value="true"/>
 <property name="allowEmptyLambdas" value="true"/>
 <property name="allowEmptyMethods" value="true"/>
 <property name="allowEmptyTypes" value="true"/>
 <property name="allowEmptyLoops" value="true"/>
 <property name="tokens"
 value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
 BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
 LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
 LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
 LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
 NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
 SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
 <message key="ws.notFollowed"
 value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
 <message key="ws.notPreceded"
 value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
 </module>
 <module name="OneStatementPerLine"/>
 <module name="MultipleVariableDeclarations"/>
 <module name="ArrayTypeStyle"/>
 <module name="MissingSwitchDefault"/>
 <module name="FallThrough"/>
 <module name="UpperEll"/>
 <module name="ModifierOrder"/>
 <!-- <module name="EmptyLineSeparator">
 <property name="tokens"
 value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
 STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
 <property name="allowNoEmptyLineBetweenFields" value="true"/>
 </module>-->
 <module name="SeparatorWrap">
 <property name="id" value="SeparatorWrapDot"/>
 <property name="tokens" value="DOT"/>
 <property name="option" value="nl"/>
 </module>
 <module name="SeparatorWrap">
 <property name="id" value="SeparatorWrapComma"/>
 <property name="tokens" value="COMMA"/>
 <property name="option" value="EOL"/>
 </module>
 <module name="SeparatorWrap">
 <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
 <property name="id" value="SeparatorWrapEllipsis"/>
 <property name="tokens" value="ELLIPSIS"/>
 <property name="option" value="EOL"/>
 </module>
 <module name="SeparatorWrap">
 <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
 <property name="id" value="SeparatorWrapArrayDeclarator"/>
 <property name="tokens" value="ARRAY_DECLARATOR"/>
 <property name="option" value="EOL"/>
 </module>
 <module name="SeparatorWrap">
 <property name="id" value="SeparatorWrapMethodRef"/>
 <property name="tokens" value="METHOD_REF"/>
 <property name="option" value="nl"/>
 </module>
 <module name="PackageName">
 <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
 <message key="name.invalidPattern"
 value="Package name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <!--類名-->
 <module name="TypeName">
 <property name="format" value="(^[A-Z][a-zA-Z0-9]*$)"/>
 </module>
 <module name="MemberName">
 <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
 <message key="name.invalidPattern"
 value="Member name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="ParameterName">
 <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
 <message key="name.invalidPattern"
 value="Parameter name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="LambdaParameterName">
 <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
 <message key="name.invalidPattern"
 value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="CatchParameterName">
 <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
 <message key="name.invalidPattern"
 value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="LocalVariableName">
 <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
 <message key="name.invalidPattern"
 value="Local variable name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="ClassTypeParameterName">
 <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
 <message key="name.invalidPattern"
 value="Class type name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="MethodTypeParameterName">
 <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
 <message key="name.invalidPattern"
 value="Method type name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="InterfaceTypeParameterName">
 <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
 <message key="name.invalidPattern"
 value="Interface type name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <module name="NoFinalizer"/>
 <module name="GenericWhitespace">
 <message key="ws.followed"
 value="GenericWhitespace ''{0}'' is followed by whitespace."/>
 <message key="ws.preceded"
 value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
 <message key="ws.illegalFollow"
 value="GenericWhitespace ''{0}'' should followed by whitespace."/>
 <message key="ws.notPreceded"
 value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
 </module>
 <!--代碼縮進-->
 <module name="Indentation">
 <property name="basicOffset" value="4"/>
 <property name="braceAdjustment" value="0"/>
 <property name="caseIndent" value="2"/>
 <property name="throwsIndent" value="2"/>
 <property name="lineWrappingIndentation" value="8"/>
 <property name="arrayInitIndent" value="2"/>
 </module>
 <module name="AbbreviationAsWordInName">
 <property name="ignoreFinal" value="false"/>
 <property name="allowedAbbreviationLength" value="1"/>
 </module>
 <module name="OverloadMethodsDeclarationOrder"/>
 <module name="VariableDeclarationUsageDistance"/>
 <module name="CustomImportOrder">
 <property name="sortImportsInGroupAlphabetically" value="true"/>
 <property name="separateLineBetweenGroups" value="true"/>
 <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
 <property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
 </module>
 <module name="MethodParamPad">
 <property name="tokens"
 value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
 SUPER_CTOR_CALL, ENUM_CONSTANT_DEF"/>
 </module>
 <module name="NoWhitespaceBefore">
 <property name="tokens"
 value="COMMA, SEMI, POST_INC, POST_DEC, DOT,
 LABELED_STAT, METHOD_REF"/>
 <property name="allowLineBreaks" value="true"/>
 </module>
 <module name="ParenPad">
 <property name="tokens"
 value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF,
 EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW,
 LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL,
 METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA"/>
 </module>
 <module name="OperatorWrap">
 <property name="option" value="NL"/>
 <property name="tokens"
 value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
 LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/>
 </module>
 <!-- <module name="AnnotationLocation">
 <property name="id" value="AnnotationLocationMostCases"/>
 <property name="tokens"
 value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
 </module>-->
 <module name="AnnotationLocation">
 <property name="id" value="AnnotationLocationVariables"/>
 <property name="tokens" value="VARIABLE_DEF"/>
 <property name="allowSamelineMultipleAnnotations" value="true"/>
 </module>
 <module name="NonEmptyAtclauseDescription"/>
 <module name="InvalidJavadocPosition"/>
 <module name="JavadocTagContinuationIndentation"/>
 <!--<module name="SummaryJavadoc">
 <property name="forbiddenSummaryFragments"
 value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
 </module>-->
 <module name="JavadocParagraph"/>
 <!-- <module name="AtclauseOrder">
 <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
 <property name="target"
 value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
 </module>-->
 <module name="JavadocType">
 <property name="allowUnknownTags" value="true"/>
 <message key="javadoc.missing" value="類注釋:缺少Javadoc注釋"/>
 </module>
 <module name="JavadocMethod">
 <property name="scope" value="public"/>
 <property name="allowMissingParamTags" value="false"/>
 <property name="allowMissingReturnTag" value="false"/>
 <property name="allowedAnnotations" value="Override, Test"/>
 <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
 </module>
 <module name="MissingJavadocMethod">
 <property name="scope" value="public"/>
 <property name="minLineCount" value="2"/>
 <property name="allowedAnnotations" value="Override, Test"/>
 <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
 </module>
 <module name="MethodName">
 <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
 <message key="name.invalidPattern"
 value="Method name ''{0}'' must match pattern ''{1}''."/>
 </module>
 <!--忽略行內(nèi)的標簽-->
 <!-- <module name="SingleLineJavadoc">
 <property name="ignoreInlineTags" value="true"/>
 </module>-->
 <module name="EmptyCatchBlock">
 <property name="exceptionVariableName" value="expected"/>
 </module>
 <module name="CommentsIndentation">
 <property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
 </module>
 <!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
 <module name="SuppressionXpathFilter">
 <property name="file" value="${org.checkstyle.google.suppressionxpathfilter.config}"
 default="checkstyle-xpath-suppressions.xml" />
 <property name="optional" value="true"/>
 </module>
 </module>
</module>
  • 加入CheckStyle.xml

    image-20200615181710608.png
image-20200615182417378.png
image-20200615182529011.png

掃描一下試試愁茁,看看當前代碼有哪些問題

image-20200615182739875.png

后續(xù):其實我們只做到了本地代碼的檢查,沒有強制的約束亭病。其實應該配合sonarqube+jenkins自動檢查鹅很,sonarqube是可以導入checkstyle.xml來進行代碼檢查的,所以只需要我們把本次的checkstyle.xml導入即可罪帖。只有通過自動檢查的才可以提交編譯(這個是個好的思路促煮,希望大家可以一起探討)。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末整袁,一起剝皮案震驚了整個濱河市菠齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坐昙,老刑警劉巖绳匀,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異民珍,居然都是意外死亡,警方通過查閱死者的電腦和手機盗飒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門嚷量,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逆趣,你說我怎么就攤上這事蝶溶。” “怎么了宣渗?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵抖所,是天一觀的道長。 經(jīng)常有香客問我痕囱,道長田轧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任鞍恢,我火速辦了婚禮傻粘,結果婚禮上每窖,老公的妹妹穿的比我還像新娘。我一直安慰自己弦悉,他們只是感情好窒典,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稽莉,像睡著了一般瀑志。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上污秆,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天劈猪,我揣著相機與錄音,去河邊找鬼混狠。 笑死岸霹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的将饺。 我是一名探鬼主播贡避,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼予弧!你這毒婦竟也來了刮吧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掖蛤,失蹤者是張志新(化名)和其女友劉穎杀捻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚓庭,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡致讥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了器赞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垢袱。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖港柜,靈堂內(nèi)的尸體忽然破棺而出请契,到底是詐尸還是另有隱情,我是刑警寧澤夏醉,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布爽锥,位于F島的核電站,受9級特大地震影響畔柔,放射性物質(zhì)發(fā)生泄漏氯夷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一靶擦、第九天 我趴在偏房一處隱蔽的房頂上張望肠槽。 院中可真熱鬧擎淤,春花似錦、人聲如沸秸仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂纪。三九已至席吴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捞蛋,已是汗流浹背孝冒。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拟杉,地道東北人庄涡。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像搬设,于是被迫代替她去往敵國和親穴店。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355