JasperReport 中踩過的坑

Mac Book Pro 10.13.6
Jaspersoft Studio community version 6.6.9
JDK 8

安裝 Jaspersoft Studio

Jasper Report 分為專業(yè)版(收費)和社區(qū)版(免費)攀例,如果只是用來設(shè)計一些 基本的報表模板闽寡,社區(qū)版就足夠了鹦筹。從這里可以下載勇皇,選擇 Jaspersoft Studio败徊。

jaspersoft-studio.png

安裝時可能遇到的問題

如果在安裝時一切順利,那么可以直接跳過本小節(jié)鸠删。

install-jasper-studio.png

如果安裝過程中遇到如上錯誤怯屉,可以嘗試一下 解決辦法:

  • Step 1

System Preferences -> Security & Privacy -> General

security-privacy.png
  • Step 2

如果 Step 1 不能解決問題,打開 Terminal附较,執(zhí)行如下命令:

# sudo bash
# xattr -cr "/Applications/TIBCO Jaspersoft Studio 6.6.0.app"

如果你對這個 xattr 感到好奇吃粒,可以執(zhí)行 man xattr 讀一讀解釋。

理解 Report Band

Jasper Studio 內(nèi)置了很多種 Band拒课,不同的 Band 有不同的用途徐勃,也有些不同默認行為事示。除了 Background Band,其他的 Band 的總高度要小于或等于一頁的最大高度減去頂部和底部的邊距僻肖。

Title

默認只會出現(xiàn)在第一頁的最頂部肖爵。也可以像下面這樣控制它顯示在單獨的一頁上。

title-on-new-page.png

Page Header

頁眉默認會出現(xiàn)在每一頁的頂部臀脏。當 Title 和 Summary Band 設(shè)置為顯示在單獨的一頁上時劝堪,頁眉則不會顯示出來。

Detail

Detail Band 比較神奇揉稚,它能夠自動的迭代 DataSource 中的所有元素秒啦,如果 DataSource 為 null,則只有靜態(tài)文本會顯示出來搀玖。默認情況下帝蒿,Main Dataset 的 Query 有多少條記錄,Detail Band 就會重復(fù)多少遍巷怜。

更加詳細一點的解釋看這里葛超。

Page Footer

頁腳默認會出現(xiàn)在每一頁的底部。

Last Page Footer

如果想在最后一頁的頁腳上放一些不同的內(nèi)容延塑,就可以考慮使用這個 Band绣张。

Summary

默認會顯示在報表的最后,和 Title Band 一樣关带,也可以設(shè)置為顯示在單獨的一頁上侥涵。如果是基于統(tǒng)計的報表,一般會放一些計算出來的內(nèi)容宋雏,比如:最大值芜飘,最小值,平均值磨总,總值等嗦明。當然,根據(jù)實際需要蚪燕,也可以放任意內(nèi)容娶牌。

summary-on-new-page.png

Background

顧名思義,這個一般就是放報表的背景的馆纳,比如水印之類的诗良。它的最大高度可以和報表一頁的高度相同。

其他的 Band

Column Header, Group Header, Group Footer, Column Footer, No Data 這些 Band 根據(jù)名字也比較容易理解鲁驶,具體的解釋在這篇文章中講解的比較詳細鉴裹。

全局設(shè)置

在頁面的全局設(shè)置中可以設(shè)置頁面的大小,邊距,尺寸單位径荔,頁面方向等督禽。

page-format.png

一個小建議是,如果設(shè)計稿是什么計量單位猖凛,這里就設(shè)置成什么計量單位赂蠢,然后把尺寸設(shè)置的和設(shè)計稿一樣,避免在設(shè)計模板的時候做繁瑣的尺寸換算辨泳。

關(guān)于頁面邊距需要注意的一點是虱岂,即使將上下左右都設(shè)置為 0,最終導(dǎo)出 PDF 打印出來菠红,邊距也不見得是 0第岖,因為打印機的設(shè)置中可能還會有默認的邊距設(shè)置。

printer-settings.png

頁碼

在報表中试溯,幾乎都會有顯示頁碼的需求蔑滓,比如 Page x of y 這種∮鼋剩看似很簡單键袱,并且 Jasper Studio 中已經(jīng)提供預(yù)設(shè)好的組件。

page-x-of-y.png

這個內(nèi)置的組件是通過兩個 Text Field 實現(xiàn)的摹闽,如果對對齊的精度要求不高蹄咖,直接使用這個組件也是挺方便的。其原理就是使用了兩次 $V{PAGE_NUMBER} 變量付鹿,只是設(shè)置不同的求值時機即可澜汤。對于每一頁的頁碼設(shè)置 Evaluation TimeNow,對于總頁碼設(shè)置為 Report舵匾。

但是如果對精度要求非常高的話俊抵,這個方式就不太合適了,我們需要用一個 Text Field 來實現(xiàn)坐梯,具體的做法參考這里徽诲。

設(shè)置中英文為不同的字體(Font Set)

相信用 Word 軟件進行過中英文排版的可能應(yīng)對過這種需求,就是對一篇文章中的中英文需要設(shè)置不同 的字體烛缔,在 Word 中是有這個菜單項可以設(shè)置的馏段,但是在 Jasper Report 中要實現(xiàn)這個需求就不那么簡單了。

主要涉及到下面這些步驟:

創(chuàng)建 Font Set

創(chuàng)建 Font ExtensionFont Set 的步驟比較直觀践瓷,參考官方文檔即可。

在 Java 代碼中引用字體文件

如果服務(wù)器所在的系統(tǒng)中沒有相應(yīng)的字體亡蓉,在 Jasper Report 嘗試生成 PDF 的時候就會報錯晕翠。需要以下幾步來解決:

  1. 首先需要從 Jasper Studio 中導(dǎo)出包含字體的 Jar 包,一次點擊 Window > Preferences > Jaspersoft Studio > Fonts,選中創(chuàng)建的 Font Set 和其包含的字體并點擊 Export淋肾。

  2. 在導(dǎo)出 Font 到 Jar 包的對話框中寫上名稱并保存硫麻。比如 SampleFontSet.jar。這個 Jar 包和一般普通的 Jar 包不同樊卓,它包含了一些 Jaspersoft 需要的額外信息拿愧。

  3. 在代碼依賴中引入字體 Jar 包。

jasper-font-set.png

將字體嵌入到 PDF 中

有人可能會懷疑將報表中用到的字體嵌入到導(dǎo)出的 PDF 中是否會帶來性能問題碌尔,畢竟一般漢字的字體文件體積都比較大浇辜,大幾十兆。在用 Japser 導(dǎo)出 PDF 的時候唾戚,只會嵌入用到的字體文件的子集柳洋,所以 幾乎不用擔(dān)心導(dǎo)出的 PDF 的體積。

測量 Text Field 的實際寬度(使用 Font Set )

如果在 Text Field 上設(shè)置的字體是自定義的 Font Set叹坦,那么需要注意了熊镣,不是那么容易能夠測量出真實的寬度。目前的解決辦法是先分離出文本中的漢字字符和非漢字字符募书,然后分別設(shè)置成相應(yīng)的字體绪囱,再各自測量出寬度,最后相加即為文本所占的實際寬度莹捡。

  • 分離漢字字符和非漢字字符
    private static Pair<String, String> splitHanAndOthers(String str) {
        StringBuilder hanToken = new StringBuilder();
        StringBuilder othersToken = new StringBuilder();

        for (int i = 0; i < str.length(); ) {
            final int codePoint = str.codePointAt(i);

            if (UnicodeScript.of(codePoint) == UnicodeScript.HAN) {
                hanToken.append(str.charAt(i));
            } else {
                othersToken.append(str.charAt(i));
            }
            i += Character.charCount(codePoint);
        }

        return Pair.of(hanToken.toString(), othersToken.toString());
    }
  • 測量文本的實際寬度
    private static float getWidth(JRPrintText jrPrintText, String text, String fontName) {
        final DefaultJasperReportsContext instance = DefaultJasperReportsContext.getInstance();

        final JRDefaultStyleProvider defaultStyleProvider = jrPrintText.getDefaultStyleProvider();
        JRPrintText printText = new JRBasePrintText(defaultStyleProvider);
        printText.setText(text);
        printText.setFontName(fontName);
        printText.setFontSize(jrPrintText.getFontsize());

        final JRStyledText hanTextFullStyledText = printText.getFullStyledText(JRStyledTextAttributeSelector.getAllSelector(instance));
        final JRTextMeasurer measure = JRTextMeasurerUtil.getInstance(instance).createTextMeasurer(jrPrintText);
        final JRMeasuredText measuredText = measure.measure(hanTextFullStyledText, 0, 0, false);
        return measuredText.getTextWidth();
    }
  • 計算總寬度
    private float getTotalWidth(JRPrintText jrPrintText, String text) {
        final Pair<String, String> hanAndOthers = splitHanAndOthers(text);
        final String han = hanAndOthers.getLeft();
        final String others = hanAndOthers.getRight();

        final float hanWidth = getWidth(jrPrintText, han, "JianSong");
        final float othersWidth = getWidth(jrPrintText, others, "CorporateS");
        return hanWidth + othersWidth;
    }

Image

顯示圖片

  • 路徑問題

在 Jasper Studio 中添加一個 Image 組件鬼吵,正確的設(shè)置一個圖片的路徑,點擊預(yù)覽就可以看到顯示出來的圖片了道盏。但是細心的同學(xué)會發(fā)現(xiàn)在 .jrxml 模板文件中圖片的路徑是一個絕對路徑而柑,這在實際生產(chǎn)過程中肯定是不行的。

因此荷逞,通過搜索找出了一個方法媒咳,可以解決靜態(tài)圖片的路徑問題。在 Image 組件的表達式中寫上這樣的表達式:

this.getClass().getResourceAsStream("/images/logo.png")
image-expression.png

還有幾種其他的場景可能直接寫相對路徑也能工作种远,我沒有驗證過涩澡。

  • 傳參問題

其實,Image 組件的表達式中不僅支持寫圖片的路徑坠敷,也可以在代碼中將圖片讀入內(nèi)存然后直接以 InputStream 的形式傳遞妙同,不過要確保每個 Stream 只能被消費一次,不要復(fù)用同一個 InputStream膝迎,如果想要復(fù)用粥帚,考慮使用 Image 組件的 isUsingCache 屬性。不過 Jasper 支持的類型除此之外限次,還有好幾種:

* java.lang.String
* java.io.File
* java.net.URL
* java.io.InputStream
* java.awt.Image
* net.sf.jasperreports.engine.JRRenderable

例子可以參考這個芒涡。

使用 InputStream 時可能遇到的問題

net.sf.jasperreports.engine.JRException: java.io.IOException: The byte array is not a recognized imageformat.
      at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processImageRetainShape(JRPdfExporter.java:1747)
      at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1604)
      at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access$300(JRPdfExporter.java:1532)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1472)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1090)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportFrame(JRPdfExporter.java:3117)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1098)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1053)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:917)
      at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:537)
      at net.sf.jasperreports.engine.JasperExportManager.exportToPdfFile(JasperExportManager.java:155)
      at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(JasperExportManager.java:503)
      at com.finger.hr.controllers.HRCreatePDFController$2.run(HRCreatePDFController.java:244)
Caused by: java.io.IOException: The byte array is not a recognized imageformat.
      at com.lowagie.text.Image.getInstance(Unknown Source)
      at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processImageRetainShape(JRPdfExporter.java:1742)
      ... 12 more

解決辦法很奇特柴灯,到現(xiàn)在我也不知道為什么。

如果傳遞的參數(shù)是一個獨立的 InputStream 類型的字段费尽,就會有上述錯誤赠群。 解決辦法就是把這個單獨的 字段包到一個 Java 對象中(:D)。

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PhotoDto {
    private InputStream photo;
}

List

List 顯示行號

不管是 List 還是 Table 如果只是想顯示簡單的行號旱幼,最簡單的辦法就是使用 $V{REPORT_COUNT}查描。 如果對行號還有一些比較復(fù)雜的計算邏輯,則最好在代碼中處理好柏卤,然后作為數(shù)據(jù)的一個字段傳遞給 Jasper 直接渲染冬三。

_THIS 大法

如果傳遞給 List 的(或者是 Table)數(shù)據(jù)是一個基本類型(這里姑且把 String 也看做基本類型,其實只要是不包含屬性的對象都滿足條件)的數(shù)據(jù)的集合闷旧,那么在引用單個數(shù)據(jù)的時候就得注意了长豁,因為基本類型的數(shù)據(jù)不存在字段一說,所以需要在 Field 的命名上做點文章忙灼。

比如說 dataSource 是 List<String>匠襟,那么在定義 Field 的時候就沒辦引用對象的字段名了,這時候我們只需要將字段名定義為 _THIS 即可,在引用的地方寫 $F{_THIS}。更多解釋參考這里亲雪。

Table

Dataset

Table 嵌套中的坑

Table 中嵌套 Table 可以實現(xiàn)類似合并單元格的效果,但是如果最外層的 Table 中一行的高度超過了頁面的最大高度就會直接報錯啃勉,而不是分頁。

Table 中實現(xiàn)分組效果

  • Merge Cell双妨?impossible淮阐!

在 Table 組件中不能直接做合并單元格的操作,只能通過嵌套 Table 來實現(xiàn)類似的效果刁品。

  • Table Cell 中的負數(shù)縮進

在使用 Jasper Studio 6.6.0 版的設(shè)計器的時候泣特,在界面上設(shè)置坐標值的時候,會出現(xiàn)保存不成功的情況挑随。只能通過直接修改模板源文件的方式設(shè)置負數(shù)坐標状您。感覺是 IDE 的 Bug,在后續(xù)版本應(yīng)該修復(fù)了兜挨。

設(shè)置 right indent 為負數(shù)的時候膏孟,left indent 不能為 0,如果為 0 right indent 不會生效 :( (至今不知道為什么 :boom:)

  • 利用 Table 組件的特性

如果有分組的需求拌汇,可以考慮使用 Table 的 Group Header 和 Group Footer 來顯示組名和小計之類的數(shù)據(jù)柒桑。

Text Field & Static Text

  • Strech

關(guān)于 Strech,在設(shè)計器里有一個屬性叫做 Strech With Overflow噪舀,當這個屬性被勾選后幕垦,表示當數(shù)據(jù)的長度超過組件的長度時會自動折行丢氢,相當于垂直方向上的 Overflow傅联,而 Jasper 也不支持水平方向的 Overflow先改。

  • Pattern

在 Jasper 中可以很方便的設(shè)置一些特殊文本的顯示格式,比如: 日期蒸走,時間仇奶,貨幣,數(shù)字比驻,百分比等该溯。

pattern.png

SubReport

  • Compile 問題

在 Jasper Studio 的設(shè)計器里可以通過直接引用 *.jasper 文件的方式,在主報表中引用子報表别惦。但是如果在實際的產(chǎn)品代碼中這樣做狈茉,非常不利于對源碼的版本控制,因為這個 *.jasper 文件是一個經(jīng)過編譯之后的臨時文件掸掸。

subreport-expression.png

我們在生產(chǎn)代碼中可以先將子報表的模板預(yù)編譯好氯庆,然后直接以參數(shù)的形式傳遞給主報表(例如如下代碼將編譯好的 “checklist.jrxml” 子報表作為參數(shù)傳給主報表,然后在主報表中的引用表達式寫成$P{checklist})扰付。

    String subreport = "checklist";
    JasperReport jasperReport = null;
    try (InputStream inputStream = getResourceAsStream(subreport + ".jrxml")) {
        jasperReport = JasperCompileManager.compileReport(inputStream);
    } catch (IOException | JRException e) {
        e.printStackTrace();
    }
    params.put(subreport, jasperReport);

Detail Band 重復(fù)多次的問題

Detail Band 被渲染的次數(shù)是由 Main Dataset 中數(shù)據(jù)條數(shù)決定的堤撵,如果發(fā)現(xiàn) Detail Band 被重復(fù)渲染了多次,那么請檢查是否添加了 Main Dataset 的 Query羽莺,并且查詢出來的數(shù)據(jù)不止一條实昨。如果沒有要設(shè)置 Main Dataset 的場景,可以選擇 One Empty Record盐固。

頁面的多列排版

在頁面設(shè)置中的多列設(shè)置荒给,只對 Detail Band,Column Header刁卜,Column Footer 有影響志电。

HTML Markup 的限制

對于 HTML Markup 的使用,其實沒有想象中的那么美好长酗,使用起來功能比較有限溪北。只能支持文本格式相關(guān)的標簽和屬性,不支持布局相關(guān)的標簽夺脾。所以想通過 CSS 實現(xiàn) 一些效果之拨,基本上都行不通。

支持的 HTML 標簽如下:

  • b
  • u
  • i
  • font
  • sup
  • sub
  • li
  • br

這個列表是從源碼中 找出來的咧叭,并沒有什么文檔(也有可能是我沒搜到)明確的列出來蚀乔。 源碼參考這里

Position Type 設(shè)置為 Float 中的誤區(qū)

一開始我不是特別理解這個 Float Position Type 的原理菲茬,走了很多彎路吉挣,經(jīng)過很長時間的摸索才理解 Float Position Type 的用法派撕。其實主要是因為 Jaser Studio 設(shè)計器中顯示出來的樣子容易誤導(dǎo)使用的人。

正常情況下睬魂,在設(shè)計模板的時候我們會把一些組件擺放的規(guī)規(guī)矩矩终吼,整整齊齊的,看著都覺得舒服氯哮。Float 是相對于設(shè)計器里離它最近的元素漂移的际跪,其相對位置在設(shè)計模板的階段就決定好了。而有的組件在設(shè)計器里展示的形狀比較大喉钢,如果要擺放整齊姆打,需要 Float 的元素就會有比較大的相對距離出現(xiàn)。其實肠虽,這個時候我們不能相信我們眼睛看到的幔戏,也不能有強迫癥,在設(shè)計器里税课。因為很多時候需要一些元素看上去是疊在一起的闲延,渲染出來的效果反而是我們需要的。

position-type-float.png

我們在實際項目中有一個模板設(shè)計出來是這樣的伯复,是不是看著感覺很亂慨代,但是要使用 Float 達到我們想要的效果,還必須要設(shè)計成這樣啸如。

時間的時區(qū)問題

解決報表中時區(qū)問題很簡單侍匙,只需要給報表內(nèi)置的一個變量傳入相應(yīng)的時區(qū)就行了。

Map<String, Object> params = new HashMap<>();
params.put("REPORT_TIME_ZONE", TimeZone.getTimeZone(ZoneId.of("Asia/Shanghai")));

通過代碼定位元素坐標(終極大法)

如果在 Jasper Studio 中無法實現(xiàn)組件的動態(tài)定位叮雳,基本上也就只有這么一條路可以走了想暗。如果這條路也實現(xiàn)不了,要么改需求帘不,要么換掉 Jasper Report 解決方案说莫。

參考鏈接

  1. https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v71/getting-started-jaspersoft-studio-0
  2. https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v630/understanding-bands
  3. https://community.jaspersoft.com/wiki/report-structure-jaspersoft-studio
  4. https://communities.ca.com/blogs/rob.ensinger/2015/12/28/how-to-single-textbox-page-x-of-y-page-counts-in-jaspersoft-reports
  5. https://stackoverflow.com/questions/10673263/show-page-x-of-y-using-a-single-text-field
  6. https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v630/working-font-extensions
  7. https://stackoverflow.com/questions/3623420/image-expression-url-in-jasper-reports
  8. https://stackoverflow.com/questions/11949333/passing-the-list-of-primitive-type-objects-as-datasource-for-subreport
  9. https://stackoverflow.com/questions/27903072/print-liststring-each-element-in-new-field
  10. https://stackoverflow.com/questions/11949333/passing-the-list-of-primitive-type-objects-as-datasource-for-subreport
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寞焙,隨后出現(xiàn)的幾起案子储狭,更是在濱河造成了極大的恐慌,老刑警劉巖捣郊,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽狈,死亡現(xiàn)場離奇詭異,居然都是意外死亡呛牲,警方通過查閱死者的電腦和手機刮萌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娘扩,“玉大人着茸,你說我怎么就攤上這事壮锻。” “怎么了涮阔?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵猜绣,是天一觀的道長。 經(jīng)常有香客問我澎语,道長途事,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任擅羞,我火速辦了婚禮,結(jié)果婚禮上义图,老公的妹妹穿的比我還像新娘减俏。我一直安慰自己,他們只是感情好碱工,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布娃承。 她就那樣靜靜地躺著,像睡著了一般怕篷。 火紅的嫁衣襯著肌膚如雪历筝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天廊谓,我揣著相機與錄音梳猪,去河邊找鬼。 笑死蒸痹,一個胖子當著我的面吹牛春弥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叠荠,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼匿沛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了榛鼎?” 一聲冷哼從身側(cè)響起逃呼,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎者娱,沒想到半個月后抡笼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡肺然,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蔫缸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片际起。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡拾碌,死狀恐怖吐葱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情校翔,我是刑警寧澤弟跑,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站防症,受9級特大地震影響孟辑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔫敲,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一饲嗽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈嘿,春花似錦貌虾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叶圃,卻和暖如春袄膏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掺冠。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工沉馆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赫舒。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓悍及,卻偏偏與公主長得像,于是被迫代替她去往敵國和親接癌。 傳聞我的和親對象是個殘疾皇子心赶,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 13,728評論 1 92
  • 1缺猛、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 我來到你的城市缨叫,走過你來時的路。 好喜歡陳奕迅的好久不見袄罅恰耻姥!雖然已經(jīng)算是老歌了!但還是百聽不厭有咨。 那天看到你微笑琐簇,...
    子陌晨曦閱讀 365評論 2 2
  • skfdsjfsfkds;fjsdkldfjdsfs
    林奇思妙想閱讀 124評論 0 0
  • Is it now婉商?(現(xiàn)在是現(xiàn)在嗎似忧?)這個聽起來有點病句的問句,你是不是偶爾也會問起丈秩。也許是在某個午夜夢回盯捌,也許在...
    盧小五閱讀 1,122評論 0 1