圖模版引擎是 Ruby 框架中的重要組成部分。它們用于將數據轉換為 HTML 頁面。通過使用視圖模版引擎,您可以將代碼分解成可重用的部分,從而簡化開發過程。
常見的視圖模版引擎
* ERB:Rails 框架中的內建引擎。
* Liquid:用于 Ruby 和 Rails 的模板引擎。
* Tilt:用于 Rack 和 Ruby 的模板引擎。
視圖模版引擎的工作原理
視圖模版引擎將模板文件和數據進行解析,并生成 HTML 頁面。模板文件包含變量、條件和循環,用于在頁面中嵌入數據。
使用視圖模版引擎的優點
* 可重用:模板可以被多個控制器和動作重復使用。
* 可讀性:模板語言易于理解和使用。
* 可維護:模板可以輕松地更新以更改頁面外觀。
如何使用視圖模版引擎
* 選擇一個視圖模版引擎。
* 創建一個模板文件。
* 在控制器中加載模板并傳遞數據。
* 將生成的 HTML 頁面返回給客戶端。
常見的問題
* 模板錯誤:檢查模板文件的語法和邏輯。
* 數據綁定錯誤:確保數據與模板中使用的變量匹配。
* 性能問題:檢查模板文件的復雜程度。
結論
視圖模版引擎是 Ruby 開發的寶貴工具,可以簡化開發過程。通過使用視圖模版引擎,您可以重用代碼、提高可讀性并輕松更新頁面外觀。
建議
* 選擇適合項目需求的模板引擎。
* 組織模板文件以提高可維護性。
* 定期檢查和更新您的模板引擎以確保最佳性能。
1、常規的Web頁面實現方法
早期的Web應用系統開發中的Web頁面內的信息定位和Web頁面布局一般是采用HTML表格<table>標簽實現的,但由于HTML標簽本身是將數據和顯示風格混合在一起的——請見下面的表格標簽示例:
<table><tr><td>表格中的某個單元格需要顯示的數據</td></tr></table>
當每個用戶請求訪問后臺服務器時,服務器端程序都必須要將整個頁面文件的全部顯示格式控制的HTML標簽內容向客戶端的Web瀏覽器發出。如下示圖為傳統的頁面設計中利用表格定位和布局頁面內容的設計效果的示例圖
這種利用<table>標簽實現Web頁面信息定位和布局的頁面設計方法不便于Web頁面的維護修改和功能擴展,基于MVC的系統架構模式的基本思想要求將頁面中的數據和顯示風格兩者相互分離——也就是MVC體系架構設計模式中所倡導的表示和模型相互分離的設計原則。
2、J2EE Web 表示層組件JSP
JSP(Java Server Pages)是由Sun Microsystem公司(現在改為Oracle公司)于1999年6月推出的動態網站實現技術,并且是基于Java Servlet以及整個Java技術體系的Web開發技術。
而且JSP技術具有簡便和高性能、服務器無關性和可重用性等技術實現方面的特點。但JSP技術在應用方面也暴露出一些不足之處:Web頁面開發實現的人員職責不清晰、HTML標簽與JSP腳本程序混合在一起而導致Web頁面不便于維護升級和功能擴展,因為Web頁面的內容("數據")和表現("HTML標簽")耦合在一起。
如下示圖為某個JSP頁面示例,在該JSP頁面中包含有服務器端的Java程序腳本代碼、JSP標簽和HTML標簽,整個JSP頁面內容顯得比較"凌亂",可讀性比較低。
正是由于JSP技術本身存在有這些方面的問題,能否將面向對象Java編程技術中所倡導的"封裝"、"隔離"等OOP設計思想應用于JSP Web頁面的應用開發中?目前在J2EE應用開發平臺中出現了許多完善、甚至代替JSP作為表示層的新技術。
3、采用"CSS+Div"分離J2EE Web表示層組件中的數據和表現
(1)"CSS+Div"中的CSS是頁面層疊樣式表技術
CSS(Cascading Style Sheet)是Web頁面層疊樣式表技術,利用CSS中的各種規則定義可以統一規范Web應用系統中的整體網頁的格式,而不再需要分別給每個Web頁面中的目標標簽單獨進行顯示風格的屬性設置。從而大大地減少了對Web頁面顯示風格的重復編輯、也提高了Web頁面功能的可擴展性
(2)"CSS+Div"中的Div代表<div>標簽
Div其實也就是HTML超文本標簽語言中的<div>標簽,<div>標簽主要用于構建Web頁面中區域的定義——簡單地說,也就是它能夠將Web頁面劃分為不同的功能區塊。每個功能區塊的顯示風格和其中的數據本身是相互分離的。
(3)采用"CSS+Div"分離Web表示層頁面中的數據處理邏輯和表現邏輯
由于CSS主要是實現Web頁面中的數據顯示風格,而利用<div>標簽可以包裝和定位其中的數據。因此,"CSS+Div"相互組合在一起就能夠分離Web表示層頁面文件中的數據處理邏輯和表現邏輯。
Web應用系統的表示層開發人員首先應用<div>標簽構建好每個功能區塊,之后再用CSS樣式單給各個<div>標簽統一配置相應的顯示風格——<div>標簽不僅能夠定位頁面中的文字內容,也能夠包裝圖片(圖片以背景的形式出現)或者其它形式的標簽。
<div>標簽代表要顯示的Web頁面數據的一個容器,而CSS層疊樣式表技術則能夠控制這個容器的各種顯示元素——比如高度和寬度、邊框的顏色、背景顏色以及其中的文字大小、文字顏色等等這些顯示信息。
"CSS+Div"是目前比較流行的Web頁面版面布局方式,能夠分離Web表示層頁面中的數據處理邏輯和表現邏輯、并且還能夠減少Web頁面中HTML標簽的數量、減少網絡數據的傳送量;也更便于Web頁面的維護修改和功能擴展;而且還可以為同一個Web頁面或者一組Web頁面統一定義一個CSS層疊樣式表文件或者為不同的功能區塊定義不同的CSS層疊樣式表文件,并且可以動態切換和應用不同的CSS層疊樣式表文件而產生出Web頁面"換皮膚"的應用效果。
4、為什么要應用"CSS+Div"構建Web應用系統表示層組件
(1)減少Web頁面中的重復HTML標簽和提高Web頁面的響應性能
由于采用CSS層疊樣式表技術能夠全局定義各個不同Web頁面的顯示風格,從而避免了在每個Web頁面中都內嵌有這些顯示風格的控制標簽,這樣的Web頁面設計方法能夠大大地減少Web頁面中的重復標簽的數量和提高Web頁面的響應性能。
另外,CSS層疊樣式表技術的兼容性也比較高——目前各個不同廠商的瀏覽器也都支持CSS層疊樣式表技術。一個采用"CSS+Div"技術實現的Web頁面布局可以在不同的Web瀏覽器、不同的網絡設備上都能夠正常地顯示。因此,它也方便了基于"CSS+Div"構建的Web應用系統的可擴展性和可移植性——Web頁面中需要顯示的數據及其它形式的內容與顯示設備無關。
(2)分離Web頁面的表現邏輯與數據結構定義
在實際企業應用系統的Web頁面開發中,一般再配合采用JavaScript腳本語言進行行為控制——也就是采用"CSS+Div+JavaScript"三種技術相互結合進行Web頁面開發,其中的CSS層疊樣式表技術實現Web頁面風格的顯示、Div(<div>標簽)則實現其中數據的包裝和定位、而JavaScript腳本程序代碼則實現與用戶相互交互的事件等行為的控制。
因此,采用"CSS+Div+JavaScript"三種技術相互配合進行Web頁面開發,基本上能夠達到模型視圖控制器(MVC)體系架構設計模式所倡導的"結構"、"表現"、"行為"三者相互分離的效果。
如果應用該技術,首先,將能夠使得Web頁面中的各個部分的耦合性更小、更易于維護和擴展。比如,如果希望調整Web頁面的顯示風格,設計和開發實現人員只需要改變相關的CSS層疊樣式表文件中有關的樣式表定義,而Web頁面文件本身并不需要被動地修改;其次,Web頁面的結構清晰,設計和開發實現相關的人員分工也非常明確。
5、在銀行賬戶信息管理系統頁面開發中應用CSS+Div+JavaScript技術
在示例項目銀行賬戶信息管理系統Web頁面開發中,作者應用了"CSS+Div+JavaScript"三種技術,不僅減少了每個Web頁面中的標簽總量,也將Web頁面中的格式、內容和行為三者相互分離。
另外,在銀行賬戶信息管理系統中還應用了Tiles模板技術將整個Web頁面分為不同的版塊(Tiles),而每個版塊中的Web頁面文件又采用"CSS+Div+JavaScript"技術實現,最終使得整個Web應用系統中的每個Web頁面內的HTML標簽數量都比較少,而且可重用度也都比較高。
下面的代碼示例中的Web頁面內容為示例項目銀行賬戶信息管理系統中版權信息頁面內容的示例,其中的JavaScript腳本程序實現Web頁面內容的防拷貝控制、而Web頁面的顯示風格定義由style.css樣式表文件定義——請見黑體標識的部分代碼——應用CSS+Div+JavaScript技術實現版權信息頁面內容的示例
<%@ page contentType="text/html; charset=gb2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href='<c:url value="/css/style.css" />' type=text/css rel=stylesheet />
<title>藍夢網上銀行系統版權信息顯示頁</title>
</head>
<body>
<script type="text/javascript">
document.body.oncopy=function (){
setTimeout( function () {
var text=clipboardData.getData("text");
if (text) {
text=text + "\r\n所復制的內容來源于"藍夢網上銀行系統"
www.webbank.com ,原文的鏈接為:"+location.href;
clipboardData.setData("text", text);
}}, 100 )
}
</script>
<div id="globalMenuBar">
<a href='<c:url value="/pageForwordAction.action?action=forwardIndex" />'
class="hrefstyle">返回首頁</a> -
<a href="#" class="hrefstyle">關于本站</a> -
<a href="#" class="hrefstyle">網站幫助</a> -
<a href="#" class="hrefstyle">網站聲明</a> -
<a href="#" class="hrefstyle">服務網點</a> -
<a href="#" class="hrefstyle">服務熱線</a> -
<a href="#" class="hrefstyle">廣告合作</a> -
<a href="#" class="hrefstyle">下載聲明</a> -
<a href="#" class="hrefstyle">友情連接</a> -
<a href="#" class="hrefstyle">網站地圖</a> -
<a href="#" class="hrefstyle">聯系我們</a>
</div>
</body>
</html>
為了減少本書的篇幅,在上面的代碼示例中省略了各個超鏈接中的目標URL地址的顯示。該頁面在Macromedia Dreamweaver工具軟件中的預覽效果請見下圖示例圖所示。
6、應用支持"CSS+Div"的可視化軟件工具提高頁面開發的效率
(1)CSS Tab Designer是一款使用CSS設計導航菜單的可視化軟件
由于在"CSS Tab Designer"可視化軟件中內置有高達60多種不同風格的樣式,Web頁面開發人員只需修改現成樣式的模版文件,就能快速地生成滿足自己的Web應用系統需要的CSS菜單。如下示圖為"CSS Tab Designer"官方網站對該軟件的功能特性的介紹文字的局部截圖,讀者可以在此網站中下載該軟件,為開源共享軟件。
并且該軟件生成的XHTML標簽嚴格遵循W3C網頁標準,所創建出的CSS菜單也能夠兼容于各種主流的瀏覽器(如Internet Explorer、Firefox、Opera、Netscape等)。
讀者在成功下載該開源軟件后,在CSS Tab Designer的系統文件及目錄結構中的tab.exe文件為它的啟動程序。而在Help目錄中的文件為操作幫助指南,samples目錄內的文件為示例樣式文件,styles目錄內的文件為CSS Tab Designer內帶的各個樣式模板文件。
(2)啟動CSS Tab Designe導航菜單可視化軟件
讀者點擊所下載的CSS Tab Designe文件目錄中的tab.exe文件就可以啟動CSS Tab Designe導航菜單可視化軟件,下圖所示為啟動后的初始界面的截圖。其中在左面【項目】視圖中顯示所創建的各個頁面文件;而在中間的【標簽樣式表】視圖中提供有CSS Tab Designe可視化軟件內帶的各個模板樣式,開發人員可以直接選擇;在右面的【預覽】視圖中直接顯示開發人員所設計的結果、并能夠采用"所見即所得"方式進行開發實現。
(3)瀏覽CSS Tab Designe導航菜單可視化軟件的操作幫助指南
在CSS Tab Designe導航菜單可視化軟件提供有操作幫助指南,并且文檔的技術說明內容寫的也比較詳細和易懂——請見下圖所示的幫助文檔的局部內容的截圖。讀者可以瀏覽和閱讀CSS Tab Designe導航菜單可視化軟件的幫助文檔掌握對該軟件的使用,以提高應用CSS+Div技術進行頁面設計時的效率。
如何應用策略設計模式的思想設計通用的數據庫連接類
如何應用策略設計模式分離JDBC數據庫連接中的外部環境信息
如何應用GOF設計模式中的構建者模式創建復合對象實例
如何應用GOF設計模式中的創建型模式實現松耦合地創建對象實例
如何應用觀察者設計模式重構系統中日志處理功能實現的程序代碼
為開發人員,我們依賴于靜態分析工具來檢查、lint(分析)和轉換我們的代碼。我們使用這些工具來幫助我們提高生產效率并生成更好的代碼。然而,當我們使用markdown編寫內容時,可用的工具就很少。
在本文中,我們將介紹如何開發一個Markdown擴展來解決在使用Markdown管理Django站點中的內容時遇到的挑戰。
你認為他們有linter嗎?
照片來自Pexels,由mali maeder拍攝
像每個網站一樣,我們在主頁、FAQ部分和“關于”頁面等地方都有不同類型的(大部分)靜態內容。很長一段時間以來,我們都是在Django模板中直接管理這些內容的。
當我們最終決定是時候將這些內容從模板轉移到數據庫中時,我們認為最好使用Markdown。從Markdown生成HTML更安全,它提供了一定程度的控制和一致性,并且對于非技術用戶來說更容易處理。隨著我們轉移過程的進展,我們注意到我們遺漏了一些東西:
當URL更改時,鏈接到內部頁面的鏈接可能會中斷。在Django模板和視圖中,我們使用了reverseand {% url %},但是這在普通的Markdown中是不可用的。
絕對內部連接不能在不同環境之間進行復制。這可以使用相對鏈接來解決,不過目前沒有開箱即用的增強這一點的方法。
無效鏈接會損害用戶體驗,并導致用戶質疑整個內容的可靠性。這并不是Markdown獨有的東西,只不過HTML模板是由對URL有一定了解的開發人員維護的。另一方面,Markdown文檔是為非技術寫作人員設計的。
當我研究這個問題時,我搜索了Python linters、Markdown預處理器和擴展來幫助生成更好的Markdown。結果都不是很好。一個引人注目的方法是使用Django模板來生成Markdown文檔。
使用Django模板,你可以使用諸如url之類的模板標記來反向查詢URL名稱,并配合使用條件、變量、日期格式和所有其他Django模板特性。這種方法本質上是使用Django模板作為Markdown文檔的預處理程序。
我個人認為這可能不是非技術作家的最佳解決方案。另外,我擔心提供對Django模板標記的訪問可能是危險的。
對這個問題有了更好的理解之后,我們準備在Python中更深入地研究Markdown。
要在Python中開始使用Markdown,我們先安裝markdown包:
接著,創建一個Markdown對象并使用其函數將一些Markdown轉換成HTML:
你現在可以在你的模板中使用這個HTML代碼片段。
基本的Markdown處理器提供了生成HTML內容的基本要素。對于更“新奇”的選項,Python markdown包包含了一些內置擴展。一個流行的擴展是“extra”擴展,除了其他東西之外,它增加了對隔離代碼塊的支持:
為了使用我們獨特的Django功能擴展Markdown,我們將開發自己的擴展。
如果你查看源代碼,你將看到要將markdown轉換為HTML, Markdown會使用多種不同的處理器。一種類型的處理器是內聯處理器。內聯處理器會匹配特定的內聯模式,如鏈接、反引號、粗體文本和帶下劃線的文本,并將它們轉換為HTML。
我們的Markdown擴展的主要目的是驗證和轉換鏈接。因此,我們最感興趣的內聯處理器是LinkInlineProcessor。這個處理器以[Haki的網站](https://hakibenito.com)的形式獲取markdown ,解析它并返回一個包含鏈接和文本的元組。
為了擴展該功能,我們擴展了LinkInlineProcessor并創建了一個Markdown.Extension, 我們用它來處理鏈接:
我們來將這段代碼分解一下::
DjangoUrlExtension擴展注冊了一個名為DjangoLinkInlineProcessor的內聯鏈接處理器。這個處理器將取代任何其他現有的鏈接處理器。
內聯處理器DjangoLinkInlineProcessor擴展了內置的LinkInlineProcessor,并在它處理的每個鏈接上調用clean_link函數。
clean_link函數接收一個鏈接和一個域名,并返回一個轉換后的鏈接。這就是我們要插入我們的實現的地方。
如何獲得網站域名
要識別到你自己網站的鏈接,你必須知道你的網站的域名。如果你正在使用Django的sites框架,那么你可以使用它來獲取當前域名。
我沒有把它包含在我的實現中,因為我們沒有使用sites框架。相反,我們在Django設置中設置了一個變量。
獲取當前域名的另一種方法是使用HttpRequest對象。如果內容只在你自己的站點中被編輯,你可以嘗試從請求對象中插入站點域名。這可能需要對你的實現進行一些更改。
要使用該擴展,請在初始化一個新的Markdown實例時添加它:
太好了,這個擴展已經被使用了,我們準備進入有趣的部分了!
既然我們得到了在所有鏈接上調用clean_link的擴展,那我們可以來實現我們的驗證和轉換邏輯。
要開始工作,我們將從一個簡單的驗證開始。mailto鏈接對于使用預定義的收件人地址、主題甚至消息正文打開用戶的電子郵件客戶端非常有用。
一個常見的mailto鏈接是這樣的:
這個鏈接將打開你的電子郵件客戶端,并設置成撰寫一封主題行為“我需要幫助!”的新電子郵件給“support@service.com”。
mailto鏈接不一定非要包含電子郵件地址。如果你看一看這篇文章底部的“分享”按鈕,你會發現像這樣的一個mailto鏈接:
這個mailto鏈接沒有包含收件人,僅包含了主題行和消息正文。
既然我們已經很好地理解了mailto鏈接是什么樣子的,我們就可以向clean_link函數添加第一個驗證:
為了驗證mailto鏈接,我們向clean_link中添加了以下代碼:
檢查鏈接是否以mailto:開頭,以識別相關鏈接。
使用正則表達式將鏈接分割到它的組件。
從mailto鏈接中刪除實際的電子郵件地址,并使用Django的EmailValidator驗證它。
注意,我們還添加了一種名為InvalidMarkdown的新異常類型。我們定義了自己的自定義異常類型,以將它與markdown本身所引發的其他錯誤區分開來。
自定義錯誤類
我曾經寫過關于自定義錯誤類的文章,為什么它們是有用的,以及你什么時候應該使用它們。
在我們繼續之前,讓我們添加一些測試,看看它的實際效果:
太棒了!按預期的運行了。
既然我們已經了解了mailto鏈接,我們也可以處理其他類型的鏈接:
外部鏈接
我們的Django應用程序外部的鏈接。
必須包含一個頁面跳轉協議(scheme):http或https。
理想情況下,我們還希望確保這些鏈接沒有被破壞,但我們現在不會這樣做。
內部鏈接
到我們的Django應用程序中的頁面的鏈接。
鏈接必須是相對的:這將允許我們在不同環境之間移動內容。
使用Django的URL名稱而不是一個URL路徑:這將允許我們安全地來回移動視圖,而不必擔心markdown內容中的失效鏈接。
鏈接可能包含查詢參數(?)和片段(#)。
SEO
從SEO的角度來看,公共URL不應該改變。當他們這樣做的時候,你應該使用重定向正確地處理它,否則你可能會受到搜索引擎的懲罰。
有了這個需求列表,我們就可以開始工作了。
解析URL名稱
要鏈接到內部頁面,我們希望編寫者提供一個URL名稱,而不是URL路徑。例如,假設我們有這個視圖:
這個頁面的URL路徑是https://example.com/, URL名稱是home。我們想要在我們的markdown鏈接中使用這個URL名稱home,就像這樣:
這將渲染到:
我們還想支持查詢參數和散列:
這將渲染到以下HTML:
在使用URL名稱時,如果我們更改了URL路徑,內容中的鏈接將不會被破壞。要檢查作者提供的href是否是一個有效的url_name,我們可以嘗試reverse它:
URL名稱“home”指向URL路徑“/”。當沒有匹配項時,將會引發一個異常:
在我們繼續之前,當URL名稱包含查詢參數或散列時,會發生什么:
這是有意義的,因為查詢參數和散列不是URL名稱的一部分。
要使用reverse并支持查詢參數和散列,我們首先需要清除值。然后,檢查它是一個有效的URL名稱,并返回包含查詢參數和散列的URL路徑,如果提供了的話:
這個代碼段使用一個正則表達式來以?或#的出現對href進行分割,并返回各部分。
請確保它可以工作:
太了不起了!作者們現在可以在Markdown中使用URL名稱了。它們還可以包括要添加到該URL的查詢參數和片段。
處理外部鏈接
要正確處理外部鏈接,我們需要檢查兩件事:
1.外部鏈接總是提供一個跳轉協議,http:或者https:。
2.阻止到我們自己網站的絕對鏈接。內部鏈接應該使用URL名稱。
到目前為止,我們已經處理了URL名稱和mailto鏈接。如果我們通過了這兩個檢查,這意味著href是一個URL。讓我們從檢查鏈接是否是鏈接到我們自己的網站開始:
函數urlparse會返回一個命名元組,該元組包含URL的不同部分。如果netloc屬性等于site_domain,那么該鏈接就確實是一個內部鏈接。
如果URL實際上是內部的,我們就需要終止。但是,請記住,作者們不一定是技術人員,因此我們希望幫助他們,并提供一個有用的錯誤消息。我們要求該內部鏈接使用URL名稱而不是URL路徑,所以最好讓作者們知道他們提供的路徑的URL名稱。
要獲得一個URL路徑的URL名稱,Django為我們提供了一個名為resolve的函數:
當找到匹配項時,resolve會返回一個ResolverMatch對象,其中包含URL名稱和其他信息。當沒有找到匹配項時,它就會引發一個錯誤:
這實際上就是Django在底層所做的工作,用來確定在一個新請求到來時執行哪個視圖函數。
為了給作者們提供更好的錯誤信息,我們可以使用來自ResolverMatch對象的URL名稱:
當我們識別出內部鏈接時,我們要處理兩種情況:
我們沒有識別出這個URL:這個URL很可能是不正確的。請作者檢查該URL是否有錯誤。
我們識別出了這個URL: 這個URL是正確的,所以就告訴作者應該使用什么URL名稱。
我們來實際地看一下它:
漂亮!外部鏈接被接受,內部鏈接被拒絕,并帶有一個有用的消息。
要求跳轉協議
我們要做的最后一件事是確保外部鏈接包含一個跳轉協議,要么是http:,要么是https:。讓我們將這最后一部分添加到函數clean_link:
使用解析后的URL,我們可以很容易地檢查跳轉協議。讓我們確保它正在工作:
我們向這個函數提供了一個沒有跳轉協議的鏈接,但是它運行失敗了,并顯示了一條有用的消息。太酷了!
這是clean_link函數的全部代碼:
要了解所有這些特性的一個實際用例是什么樣子的,請看下面的內容:
這將產生以下HTML:
不錯!
我們現在有一個很不錯的擴展,它可以驗證和轉換Markdown文檔中的鏈接!現在,在不同環境之間移動文檔和保持內容整潔要容易多了,最重要的是,可以保持正確和最新!
源碼
你可以在這個gist中找到全部源代碼。(地址:https://gist.github.com/hakib/73fccc340e855bb65f42197e298c0c7d )
本文中所描述的功能對我們很有用,但是你可能需要根據自己的需求對它進行調整。
如果你需要一些想法,那么除了這個擴展之外,我們還創建了一個markdown Preprocessor,它允許作者們在markdown中使用常量。例如,我們定義了一個名為SUPPORT_EMAIL的常量,我們像這樣使用它:
該預處理程序將用我們定義的文本替換字符串$SUPPORT_EMAIL,然后才渲染Markdown。
英文原文:https://hakibenita.com/django-markdown
譯者:Nothing
*請認真填寫需求信息,我們會在24小時內與您取得聯系。