The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          #

          關于怎么寫商業策劃書的,解讀的非常詳盡,包括商業策劃書的內容、撰寫格式、思路等,僅供商業愛好者參考。

          商業策劃書怎么寫| jiaren.org

          商業策劃書的目的很簡單,它就是創業者手中的武器,是提供給投資者和一切對創業者的項目感興趣的人,向他們展現創業的潛力和價值,說服他們對項目進行投資和支持。因此,一份好的商業計劃書,要使人讀后,對下列問題非常清楚:、

          1、公司的商業機會;

          2、創立公司,把握這一機會的進程 ;

          3、所需要的資源;

          4、風險和預期回報;

          5、對你采取的行動的建議。

          商業計劃不是學術論文,它可能面對的是非技術背景但對計劃有興趣的人,比如可能的團隊成員,可能的投資人和合作伙伴,供應商,顧客,政策機構等,因此,一份好的商業計劃書,應該寫得讓人明白,避免使用過多的專業詞匯,聚焦于特定的策略、目標、計劃和行動。商業計劃的篇幅要適當,太短,容易讓人不相信項目的成功;太長,則會被認為太羅嗦,表達不清楚。適合的篇幅一般為20-40頁長(包括附錄在內)。

          從總體來看,寫商業策劃的原則是:簡明扼要;條理清晰;內容完整;語言通暢易懂;意思表述精確。商業計劃書一般包括如下十大部分的內容:

          一、執行總結

          是商業計劃的一到兩頁的概括。包括:

          1、本商業(business)的簡單描述(亦即“電梯間陳詞”)

          2、機會概述

          3、目標市場的描述和預測

          4、競爭優勢

          5、經濟狀況和盈利能力預測

          6、團隊概述

          7、提供的利益

          二、產業背景和公司概述

          1、詳細的市場描述,主要的競爭對手,市場驅動力

          2、公司概述應包括詳細的產品/服務描述以及它如何滿足一個關鍵的顧客需求。

          3、一定要描述你的進入策略和市場開發策略

          三、市場調查和分析

          這是表明你對市場了解程度的窗口。一定要闡釋以下問題:

          1、顧客

          2、市場容量和趨勢

          3、競爭和各自的競爭優勢

          4、估計的市場份額和銷售額

          5、市場發展的走勢(對于新市場而言,這一點相當困難,但一定要力爭貼近真實)

          四、公司戰略

          闡釋公司如何進行競爭,它包括三個問題

          1、營銷計劃 (定價和分銷;廣告和提升)

          2、規劃和開發計劃(開發狀態和目標;困難和風險)

          3、制造和操作計劃 (操作周期;設備和改進)

          五、總體進度安排

          公司的進度安排,包括以下領域的重要事件

          1、收入

          2、收支平衡點和正現金流

          3、市場份額

          4、產品開發介紹

          5、主要合作伙伴

          6、融資

          六、關鍵的風險、問題和假定

          1、創業者常常對于公司的假定和將面臨的風險不夠現實

          2、說明你將如何應付風險和問題(緊急計劃)

          3、在眼光的務實性和對公司的潛力的樂觀之間達成仔細的平衡

          七、管理團隊

          1、介紹公司的管理團隊。一定要介紹各成員與管理公司有關的教育和工作背景

          2、注意管理分工和互補

          3、最后,要介紹領導層成員,商業顧問以及主要的投資人和持股情況

          八、企業經濟狀況

          介紹公司的財務計劃,討論關鍵的財務表現驅動因素。一定要討論如下幾個杠桿:

          1、毛利和凈利

          2、盈利能力和持久性

          3、固定的、可變的和半可變的成本

          4、達到收支平衡所需的月數

          5、達到正現金流所需的月數

          九、財務預測

          1、包括收入報告,平衡報表,前兩年為季度報表,前五年為年度報表

          2、同一時期的估價現金流分析

          3、突出成本控制系統

          十、假定公司能夠提供的利益

          這是你的“賣點”,包括

          1、總體的資金需求

          2、在這一輪融資中你需要的是哪一級

          3、你如何使用這些資金

          4、投資人可以得到的回報

          5、你還可以討論可能的投資人退出策略

          當你在寫商業計劃的時候,應該達到下列目標:

          1、力求表述清楚簡潔。

          2、關注市場,用事實說話,因此需展示市場調查和市場容量。

          3、解釋潛在顧客為什么會掏錢買你的產品或服務。

          4、站在顧客的角度考慮問題,提出引導他們進入你的銷售體系的策略。

          5、在頭腦中要形成一個相對比較成熟的投資退出策略。

          6、充分說明為什么你和你的團隊最合適作這件事。

          7、請你的讀者做出反饋。

          當你做商業計劃并向投資者提交時,必須避免下列問題:

          1、對產品/服務的前景過分樂觀,令人產生不信任感。

          2、數據沒有說服力,比如拿出一些與產業標準相去甚遠的數據。

          3、導向是產品或服務,而不是市場。

          4、對競爭沒有清醒的認識,忽視競爭威脅。

          5、選擇進入的是一個擁塞的市場,企圖后來居上。

          6、商業計劃顯得非常不專業,比如缺乏應有的數據、過分簡單或冗長。

          7、不是仔細尋求最有可能的投資者,而是濫發材料。

          商業策劃書形式與內容

          目 錄

          執行概要 …………………………………………………

          第一部分 公司基本情況…………………………………

          第二部分 公司管理層……………………………………

          第三部分 產品/服務………………………………………

          第四部分 研究與開發……………………………………

          第五部分 行業及市場情況………………………………

          第六部分 營銷策略………………………………………

          第七部分 產品制造………………………………………

          第八部分 管理……………………………………………

          第九部分 融資說明………………………………………

          第十部分 財務計劃………………………………………

          第十一部分 風險控制………………………………………

          第十二部分 項目實施進度…………………………………

          第十三部分 其它……………………………………………

          備查資料清單……………………………………………………

          1.創辦企業的目的?為什么要冒風險,花精力、時間、資源、資金去創辦風險企業?

          2.創辦企業所需的資金?為什么要這么多的錢?為什么投資人值得為此注入資金?

          一、怎樣寫好商業計劃書

          1.關注產品 2.敢于競爭 3.了解市場 4.表明行動的方針 5.展示你的管理隊伍 6.出色的計劃摘要

          二、商業計劃書的內容

          1.計劃摘要

          計劃摘要一般要有包括以下內容:公司介紹、主要產品和業務范圍、市場概貌、營銷策略、銷售計劃、生產管理計劃、管理者及其組織、財務計劃、資金需求狀況等。

          在介紹企業時,首先要說明創辦新企業的思路,新思想的形成過程以及企業的目標和發展戰略。其次,要交待企業現狀、過去的背景和企業的經營范圍

          企業家的素質對企業的成績往往起關鍵性的作用。在這里,企業家應盡量突出自己的優點并表示自己強烈的進取精神,以給投資者留下一個好印象。

          在計劃摘要中,企業還必須要回答下列問題:

          (1)企業所處的行業,企業經營的性質和范圍;

          (2)企業主要產品的內容;

          (3)企業的市場在那里,誰是企業的顧客,他們有哪些需求;

          (4)企業的合伙人、投資人是誰;

          (5)企業的競爭對手是誰,競爭對手對企業的發展有何影響。

          摘要要盡量簡明、生動。特別要詳細說明自身企業的不同之處以及企業獲取成功的市場因素。

          2.產品(服務)介紹

          在進行投資項目評估時,投資人最關心的問題之一就是,風險企業的產品、技術或服務能否以及在多大程度上解決現實生活中的問題,或者,風險企業的產品(服務)能否幫助顧客節約開支,增加收入。

          (1)顧客希望企業的產品能解決什么問題,顧客能從企業的產品中獲得什么好處?

          (2)企業的產品與競爭對手的產品相比有哪些優缺點,顧客為什么會選擇本企業的產品?

          (3)企業為自己的產品采取了何種保護措施,企業擁有哪些專利、許可證,或與已申請專利的廠家達成了哪些協議?

          (4)為什么企業的產品定價可以使企業產生足夠的利潤,為什么用戶會大批量地購買企業的產品?

          (5)企業采用何種方式去改進產品的質量、性能,企業對發展新產品有哪些計劃等等。

          3.人員及組織結構

          有了產品之后,創業者第二步要做的就是結成一支有戰斗力的管理隊伍。

          企業的管理人員應該是互補型的,而且要具有團隊精神。

          4.市場預測

          當企業要開發一種新產品或向新的市場擴展時,首先就要進行市場預測。

          市場預測首先要對需求進行預測:市場是否存在對這種產品的需求?需求程度是否可以給企業帶來所期望的利益?新的市場規模有多大?需求發展的未來趨向及其狀態如何?影響需求都有哪些因素。其次,市場預測還要包括對市場競爭的情況??企業所面對的競爭格局進行分析:市場中主要的競爭者有哪些?是否存在有利于本企業產品的市場空檔?本企業預計的市場占有率是多少?本企業進入市場會引起競爭者怎樣的反應,這些反應對企業會有什么影響?等等。

          在商業計劃書中,市場預測應包括以下內容:市場現狀綜述;競爭廠商概覽;目標顧客和目標市場;本企業產品的市場地位;市場區域和特征等等。

          5.營銷策略

          營銷是企業經營中最富挑戰性的環節,影響營銷策略的主要因素有:

          (1)消費者的特點;

          (2)產品的特性;

          (3)企業自身的狀況;

          (4)市場環境方面的因素。最終影響營銷策略的則是營銷成本和營銷效益因素。

          在商業計劃書中,營銷策略應包括以下內容:

          (1)市場機構和營銷渠道的選擇;

          (2)營銷隊伍和管理;

          (3)促銷計劃和廣告策略;

          (4)價格決策。

          6.制造計劃

          商業計劃書中的生產制造計劃應包括以下內容:產品制造和技術設備現狀;新產品投產計劃;技術提升和設備更新的要求;質量控制和質量改進計劃。

          在尋求資金的過程中,為了增大企業在投資前的評估價值,風險企業家應盡量使生產制造計劃更加詳細、可靠。一般地,生產制造計劃應回答以下問題:企業生產制造所需的廠房、設備情況如何;怎樣保證新產品在進入規模生產時的穩定性和可靠性;設備的引進和安裝情況,誰是供應商;生產線的設計與產品組裝是怎樣的;供貨者的前置期和資源的需求量;生產周期標準的制定以及生產作業計劃的編制;物料需求計劃及其保證措施;質量控制的方法是怎樣的;相關的其他問題。

          7.財務規劃

          財務規劃需要花費較多的精力來做具體分析,其中就包括現金流量表,資產負債表以及損益表的制備。流動資金是企業的生命線,因此企業在初創或擴張時,對流動資金需要有預先周詳的計劃和進行過程中的嚴格控制;損益表反映的是企業的贏利狀況,它是企業在一段時間運作后的經營結果;資產負債表則反映在某一時刻的企業狀況,投資者可以用資產負債表中的數據得到的比率指標來衡量企業的經營狀況以及可能的投資回報率。

          財務規劃一般要包括以下內容:

          (1)商業計劃書的條件假設;

          (2)預計的資產負債表;預計的損益表;現金收支分析;資金的來源和使用。

          企業的財務規劃應保證和商業計劃書的假設相一致。事實上,財務規劃和企業的生產計劃、人力資源計劃、營銷計劃等都是密不可分的。要完成財務規劃,必須要明確下列問題:

          (1)產品在每一個期間的發出量有多大?

          (2)什么時候開始產品線擴張?

          (3)每件產品的生產費用是多少?

          (4)每件產品的定價是多少?

          (5)使用什么分銷渠道,所預期的成本和利潤是多少?

          (6)需要雇傭那幾種類型的人?

          (7)雇傭何時開始,工資預算是多少?等等

          商業策劃書的撰寫

          美國的一位著名風險投資家曾說過,“風險企業邀人投資或加盟,就象向離過婚的女人求婚,而不像和女孩子初戀。雙方各有打算,僅靠空口許諾是無濟于事的”。商業計劃書對那些正在尋求資金的風險企業來說,就是“金鑰匙”,決定著投資的成敗。對剛開始創業的風險企業來說,商業計劃書的作用尤為重要,通過制訂商業計劃書,把正反理由都書寫下來,然后再逐條推敲,會發現原本還在“雛型”的項目已經變得清晰可辨,也更利于風險企業家認識和把握該項目。

          商業計劃書首先是把計劃中要創立的企業推銷給了風險企業家自己。其次,商業計劃書還能幫助把計劃中的風險企業推銷給風險投資家,公司商業計劃書的主要目的之一就是為了籌集資金。因此,商業計劃書必須要說明:

          (1)創辦企業的目的??為什么要冒風險,花精力、時間、資源、資金去創辦風險企業?

          (2)創辦企業所需的資金??為什么要這么多的錢?為什么投資人值得為此注入資金?

          對已建的風險企業來說,商業計劃書可以為企業的發展定下比較具體的方向和重點,從而使員工了解企業的經營目標,并激勵他們為共同的目標而努力。更重要的是,它可以使企業的出資者以及供應商、銷售商等了解企業的經營狀況和經營目標,說服出資者(原有的或新來的)為企業的進一步發展提供資金。正是基于上述理由,商業計劃書將是風險企業家所寫的商業文件中最主要的一個。那么,如何制訂商業計劃書呢?

          第一部分:摘要

          摘要是風險投資者首先看到的部分。通過摘要,風險投資者對你和你的計劃書形成第一印象,所以摘要必須形式完美,敘述清楚流暢。

          第二部分:公司及未來

          這部分要使風險投資者對你公司的幾個主要項目及未來的發展戰略有一定程度的了解,各專題既要獨具特色,又要構成一個相關的整體。

          1.概述:只要你提供的公司名稱、地址、電話號碼、聯系人等資料皆清楚無誤,則風險投資者將不會提出任何問題。如果可能,可提出行業分類標準,請注意,千萬不要給人無法收到的電話號碼,如果你不在,應建立接轉電話的服務機構或請朋友代轉。

          2.公司的自然情況:這里,你要力求用最簡練的一段話描述公司的業務情況。更重要的是,要用最簡短的一句話使風險投資者可以概略認識你的公司。如果你公司已是計算機網絡成員,則你對公司的描述應與在計算機中的描述一致,這樣,風險投資者可以依據你的行業分類目錄概略認識你公司,如果你的文字欠簡明扼要,則對方可能要求你解釋,以確認你公司所屬行業。

          3.歷史情況:這里,風險投資者主要尋求一個概略性的認識。即使對方已讀過公司歷史這節,他可能還要求你描述公司的歷史,他們欲詳細了解過去發生了哪些事件。這節似乎很難確定問題的基本類型,但對方很可能提出與公司特殊歷史事件相關的問題。其中一類典型問題可能是:”為什么你人幫了這件事或做了那件事?” 另一類典型問題則可能是:”你公司發展歷史上有哪些重要的里程碑?為什么有實現這些歷史轉折?”

          4.公司管理:該部分主要介紹公司的管理情況,領導者及其他對公司業務有關鍵影響的人。通常,小公司不超過三個關鍵人物。風險投資對關鍵人物十分關心。你應該從最高層起,依次介紹,而且注意,關鍵人物不等于有成就者。主要包括董事和高級職員、關鍵雇員、管理者之職業道德、薪金等方面。

          5.公司未來的發展規劃:這里,風險投資者還是尋求有關公司未來可完成的里程碑的信息。他們可能提出涉及及未來關鍵階段的問題,其基本問題可能是:”你如何完成計劃書規定的關鍵指標?”

          6.唯一性(管理唯一、產品服務唯一或投資基礎唯一等):這里,你必須回答的問題是:”本公司獨特的原因何在?”這個問題變換說法為:”與世界上所有小公司比較,有哪些因素使你公司興旺發達?”在公司總體范疇之內,大公司通常優越于小公司,如果認為這條規律有一定道理,那么,在你不得不與大公司競爭時,如何保證你公司必勝?為使風險投資者滿意放心,你必須明確提出本公司之不尋常的優勢,可以確保成功。如果你只是”此外,我也差不多”式的回答,對方很可能聽聽睡著了。

          7.產品或服務介紹:這里,風險投資者要了解你出售什么,以及市場上需要什么樣的產品和滿意的服務;他要努力評估你產品的可銷售程度和創新程度;他還關心你公司產品處于產品生命周期的哪一階段。他的問題可能是:”為什么這種產品或服務有實用價值?它為用戶提供哪些功能?用戶的購買動機是什么”本產品壽命周期如何?何時可能被新產品取低?有無計劃出新產品或以現存的產品沖出你的產品市場?這種沖出有利還是有害?你的產品責任是什么?若用戶使用你的產品而受到傷害,你要承擔哪些責任?你的產品價格受到哪些限制?價格彈性多少?產品耐用性如何?如何進行產品技術改進?在產品生命周期曲線中,你產品處于哪個階段?”

          8.行業情況:這里,風險投資者鈄千方百計分析認識你的行業。他的問題可能是:”你在你行業中成功之關鍵何在?如何保證你公司和產品與你行業協調一致?此外還有一些基本問題,像”你如何了解確認你行業之總銷售額與增長速率?你行業基本發展趨勢如何?哪些行業變化對你公司盈利水準影響最大?你行業有哪些貿易壁壘?第三者初次進入你所屬的行業圈難度如何?與同行其它產品比較,你的產品新穎處何在?本行業銷售受哪些季節性因素影響?你的銷售范圍圈有多廣,是地方、地區、全國還是全世界?”

          應該注意的是,你所介紹的本行業一定時期內的銷售額,不能包括未被你產品占領的領域的銷售額。例如:若一個公司只制造微型電腦,則不能說已占領了全部電腦市場。微型電腦市場只是整個電腦市場的一部分,對應的行業只是微電腦市場,而不是全部電腦市場,事實上,目前的微電腦市場已很廣闊了。

          9.競爭者:這里,風險投資者希望了解:誰是競爭者,其實力如何,有何優勢,以及你自身有哪些優勢。其典型的問題可能是:”你有哪些超過競爭對手的優勢?關于價格、性能、服務和保證措施,你公司與競爭對手優劣如何?競爭對手有哪些超過你的優勢?誰是你最主要的競爭對手? 誰是你的行業伙伴?你與誰在高層次基礎上競爭?你的產品有無替代品?如果有,誰制造這種產品?其地替代頻繁程度怎樣?你與競爭對手的價格差異如何?有無競爭對手加入你的行業?如果你打算選擇某一市場與競爭對手共享,你的具體措施如何?希望競爭對手如何做出反應?你的競爭對手有股票公開上市的公司嗎?”

          10.銷售策略:這里,風險投資者將集中精力分析研究你的市場行銷戰略,它希望了解你產品從生產現場最終轉到用戶手中的全部過程。某些基本問題可能為:” 描述你的產品的分銷管道,即說明你產品從生產現場轉到最終用戶的全過程。你的產品有哪些行銷環節?是本公司直接零售,還是通過行業銷售網銷售?廣告在市場行銷戰略中地位如何?你的基本廣告策略是什么?其成本怎樣?你的銷售對廣告的敏感程度怎樣?你曾采用過哪些市場滲透策略?現計劃采用哪些市場滲透策略?若你的產品和行業進入成熟期計劃采用何種市場戰略?目前銷售難度如何?需要直接推銷否?即銷售人員是否需要直接對用戶叫賣?銷售復雜且周期長;還是相當簡單且直接推銷?購買單件產品費用是高還是低?用戶購買產品時是否一定要事前做預算?從與購買者簽約到最終銷售的時間長短如何?政府對市場交易是否有嚴格管制?”。

          第三部分:投資說明

          關于投資,你應該提出自己的融資方案,即對貸款、認股權、優先股、普通股等多種投資形式闡明自己的意見,意見要盡可能具體,使對方全面準確了解己方到底準備采用何種融資方式,并愿意付出多大代價。

          第四部分:風險因素

          投資者向你公司投資可能會遇到何種風險?你應從政策、經營、資源、財務等各方面加以敘述。在說明過程中,只正面敘述,不做評論性說明,主要包括:經營歷史的限制、資源限制、管理經驗限制、市場不確定性限制、生產不確定性限制、破產對關鍵管理者的依賴程度等。

          第五部分:投資回報與退身之路

          這是投資者非常關心的問題。因為大多數風險投資者并無真正意愿想長期持有公司的股權,而是希望能在條件成熟時“金蟬脫殼”,從而通過股票的增值獲取收益。一般來說風險投資者可提出三種投資變現方式,主要包括股票上市,出售公司和買回等。你應指出自己希望采用何種方式。

          第六部分:經營分析與預測

          該部分主要基于公司歷史的經營業績分析,據以預測未來的經營情況,這里主要應以公司過去財務數據為基礎,預測未來經營可能的收入、成本與費用,同時,通過比率分析預測出未來經營效率的高低及經營成果的好壞。

          第七部分:財務報告

          計劃書中應包含你公司當前的財務報告,并附有適當的說明。無論如何,無當前財務報表的計劃書是無法讓人接受的。一份沒有當年財務報告的項目是難以引起風險投資者的興趣的。

          第八部分:財務預測

          對公司未來5 年的財務狀況進行預測,還需預測以年的資金流量表,以便每個讀者能確切了解公司資金流動狀態。

          第八部分:關于產品的報道、介紹、樣品與圖片

          為增加計劃書的說服力,你可以收集一些自己公司的綜合介紹文獻、搜集行業產品目錄、收集某些產品圖片等情況等。這些對爭取投資均有一定作用,但不宜過多,否則會起喧賓奪主的反作用。需要聲明的是,這些只能作為計劃書的附件。

          總述:

          以上介紹的是計劃書的全部內容,根據公司及項目的具體情況,可以結合實際情況在此基礎上增添或刪改,這都是為了滿足項目的需要。

          后記:

          商業地產的策劃要從策劃的本源上說起,即什么是“策劃”。按照中國文字的意思進行理解:策劃就是運用謀略和計策去取得一種超出常規的良好結果。如果這個詮釋能被接受的話,那么商業地產的策劃就易于理解了。

          首先商業地產策劃是一種智慧的創造,它能在商業地產的開發活動中創造出新的價值;如“海上海”的建筑創意,就使“上實”多收二三斗。如“巴比倫生活”的策劃,使得物業的區域價值被凸現出來,“金點子”或者單純的靈感或創意活動;創建性、系統性、完整性、可導入性,更重要的是可以執行才是策劃的本質,它能改變項目,產品的形象市場地位,解決或排除某些商業地產開發過程中某些阻礙和難題。策劃不能等同于“包裝”,“包裝”是策劃活動中經常運用的一種常規手段,它只能起到“錦上添花”的作用,如果通過包裝手段把不利條件變成有利條件了,那么這種包裝行為是有欺詐嫌疑的。

          商業地產策劃活動沒有公式(否則就不是策劃了),但有以下幾條策劃的規律是需要掌據的。一是價值發現,就是要在商業地產的價值挖掘方面要獨具慧眼,找出別人沒有看到的價值;二是以理服人,商業地產不相信煽情。商業地產是投資性物業,是固化的資本,投資者比消費者理性,過分熱炒概念是沒有作用的,有用的是完美演繹盈利模式,合理推導要符合商業邏輯,這才是商鋪市場樂于接受的引導;三是以品牌策劃的手法去策劃商業地產;商業地產開發的過程就是這個項目商業品牌樹立的過程,有了市場廣泛的認可,商業就會繁榮,商業繁榮的結果就是這個商業物業升值或價值兌現快捷。



          posted @ 2014-11-17 12:54 Eric_jiang 閱讀(171) | 評論 (0)編輯 收藏

          Nodejs給Javascript賦予了服務端應用的生命,Jquery讓Javascript成為瀏覽中開發的利器。 最近學習了Nodejs的Express3.0的開發框架,本來是按照“node.js開發指南”書中介紹,但“node.js開發指南”講的是Express2.x的,從Express2.x到Express3.0自己模索中還是走了不少彎路的。寫篇文章總結一下。

          關于作者

          張丹(Conan), 程序員Java,R,PHP,Javacript
          weibo:@Conan_Z
          blog: http://blog.fens.me
          email: bsspirit@gmail.com

          轉載請注明出處:
          http://blog.fens.me/nodejs-express3/

          程序代碼已經上傳到github有需要的同學,自行下載。
          https://github.com/bsspirit/nodejs-demo

          nodejs intro

          從零開始nodejs系列文章

          從零開始nodejs系列文章,將介紹如何利Javascript做為服務端腳本,通過Nodejs框架web開發。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome瀏覽器就基于V8,同時打開20-30個網頁都很流暢。Nodejs標準的web開發框架Express,可以幫助我們迅速建立web站點,比起PHP的開發效率更高,而且學習曲線更低。非常適合小型網站,個性化網站,我們自己的Geek網站??!

          目錄

          此文重點介紹Express3.0的開發框架,其中還會涉及到Mongoose,Ejs,Bootstrap等相關內容。

          1. 建立工程
          2. 目錄結構
          3. Express3.0配置文件
          4. Ejs模板使用
          5. Bootstrap界面框架
          6. 路由功能
          7. Session使用
          8. 頁面提示
          9. 頁面訪問控制

          開發環境:

          Win7旗艦版 64bit

          MonogoDB: v2.4.3

          
          Tue May 14 09:24:50.118 [initandlisten] MongoDB starting : pid=1716 port=27017 dbpath=./data 64-bit host=PC201304202140
          Tue May 14 09:24:50.119 [initandlisten] db version v2.4.3
          Tue May 14 09:24:50.119 [initandlisten] git version: fe1743177a5ea03e91e0052fb5e2cb2945f6d95f
          Tue May 14 09:24:50.119 [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49
          Tue May 14 09:24:50.119 [initandlisten] allocator: system
          Tue May 14 09:24:50.119 [initandlisten] options: { dbpath: "./data" }
          Tue May 14 09:24:50.188 [initandlisten] journal dir=./data\journal
          Tue May 14 09:24:50.189 [initandlisten] recover : no journal files present, no recovery needed
          Tue May 14 09:24:50.441 [initandlisten] preallocateIsFaster=true 3.26
          Tue May 14 09:24:50.778 [initandlisten] preallocateIsFaster=true 5.88
          Tue May 14 09:24:51.827 [initandlisten] waiting for connections on port 27017
          Tue May 14 09:24:51.827 [websvr] admin web console waiting for connections on port 28017
          

          nodejs: v0.10.5, npm 1.2.19

          node -v
          v0.10.5
          npm -v
          1.2.19
          

          1. 建立工程

          進入工程目錄

          
          cd D:\workspace\project
          

          全局安裝express,express作為命令被安裝到了系統中

          
          npm install -g express
          

          查看express版本

          
          express -V
          3.2.2
          

          使用express命令創建工程,并支持ejs

          
          D:\workspace\project>express -e nodejs-demo
          
          create : nodejs-demo
          create : nodejs-demo/package.json
          create : nodejs-demo/app.js
          create : nodejs-demo/public
          create : nodejs-demo/public/javascripts
          create : nodejs-demo/public/images
          create : nodejs-demo/public/stylesheets
          create : nodejs-demo/public/stylesheets/style.css
          create : nodejs-demo/routes
          create : nodejs-demo/routes/index.js
          create : nodejs-demo/routes/user.js
          create : nodejs-demo/views
          create : nodejs-demo/views/index.ejs
          
          install dependencies:
          $ cd nodejs-demo && npm install
          run the app:
          $ node app
          

          根據提示,下載依賴包

          
          cd nodejs-demo && npm install
          
          express@3.2.2 node_modules\express
          ├── methods@0.0.1
          ├── fresh@0.1.0
          ├── buffer-crc32@0.2.1
          ├── range-parser@0.0.4
          ├── cookie-signature@1.0.1
          ├── cookie@0.0.5
          ├── qs@0.6.3
          ├── commander@0.6.1
          ├── debug@0.7.2
          ├── mkdirp@0.3.4
          ├── send@0.1.0 (mime@1.2.6)
          └── connect@2.7.8 (pause@0.0.1, bytes@0.2.0, formidable@1.0.13)
          

          模板項目建立成功,啟動模板項目。

          
          D:\workspace\project\nodejs-demo>node app.js
          Express server listening on port 3000
          

          本地的3000端口被打開,通過瀏覽器訪問: localhost:3000

          通過node啟動程序,每次代碼修改都需要重新啟動。 有一個工具supervisor,每次修改代碼后會自動重啟,會我們開發省很多的時間。

          
          npm install supervisor
          

          再啟動服務

          
          D:\workspace\project\nodejs-demo>supervisor app.js
          
          DEBUG: Running node-supervisor with
          DEBUG: program 'app.js'
          DEBUG: --watch '.'
          DEBUG: --ignore 'undefined'
          DEBUG: --extensions 'node|js'
          DEBUG: --exec 'node'
          
          DEBUG: Starting child process with 'node app.js'
          DEBUG: Watching directory 'D:\workspace\project\nodejs-demo' for changes.
          Express server listening on port 3000
          

           

          2. 目錄結構

          D:\workspace\project\nodejs-demo>dir

          2013/05/14 09:42 877 app.js
          2013/05/14 09:48 <DIR> node_modules
          2013/05/14 09:42 184 package.json
          2013/05/14 09:42 <DIR> public
          2013/05/14 09:42 <DIR> routes
          2013/05/14 09:42 <DIR> views

          目錄介紹:

          • node_modules, 存放所有的項目依賴庫。(每個項目管理自己的依賴,與Maven,Gradle等不同)
          • package.json,項目依賴配置及開發者信息
          • app.js,程序啟動文件
          • public,靜態文件(css,js,img)
          • routes,路由文件(MVC中的C,controller)
          • Views,頁面文件(Ejs模板)

          3. Express3.0配置文件

          打開app.js文件

          
          /**
          * 模塊依賴
          */
          var express = require('express')
          , routes = require('./routes')
          , user = require('./routes/user')
          , http = require('http')
          , path = require('path');
          
          var app = express();
          
          //環境變量
          app.set('port', process.env.PORT || 3000);
          app.set('views', __dirname + '/views');
          app.set('view engine', 'ejs');
          app.use(express.favicon());
          app.use(express.logger('dev'));
          app.use(express.bodyParser());
          app.use(express.methodOverride());
          app.use(app.router);
          app.use(express.static(path.join(__dirname, 'public')));
          
          // 開發模式
          if ('development' == app.get('env')) {
          app.use(express.errorHandler());
          }
          
          // 路徑解析
          app.get('/', routes.index);
          app.get('/users', user.list);
          
          // 啟動及端口
          http.createServer(app).listen(app.get('port'), function(){
          console.log('Express server listening on port ' + app.get('port'));
          });
          

           

          4. Ejs模板使用

          讓ejs模板文件,使用擴展名為html的文件。

          修改:app.js

          
          app.engine('.html', ejs.__express);
          app.set('view engine', 'html');// app.set('view engine', 'ejs');
          

          修改后,ejs變量沒有定義,supervisor的程序會一直報錯

          
          ReferenceError: ejs is not defined
          at Object. (D:\workspace\project\nodejs-demo\app.js:17:21)
          at Module._compile (module.js:456:26)
          at Object.Module._extensions..js (module.js:474:10)
          at Module.load (module.js:356:32)
          at Function.Module._load (module.js:312:12)
          at Function.Module.runMain (module.js:497:10)
          at startup (node.js:119:16)
          at node.js:901:3
          DEBUG: Program node app.js exited with code 8
          

          在app.js中增加ejs變量

          
          var express = require('express')
          , routes = require('./routes')
          , user = require('./routes/user')
          , http = require('http')
          , path = require('path')
          , ejs = require('ejs');
          

          訪問localhost:3000,程序報錯

          
          Error: Failed to lookup view "index"
          at Function.app.render (D:\workspace\project\nodejs-demo\node_modules\express\lib\application.js:495:17)
          at ServerResponse.res.render (D:\workspace\project\nodejs-demo\node_modules\express\lib\response.js:756:7)
          at exports.index (D:\workspace\project\nodejs-demo\routes\index.js:7:7)
          at callbacks (D:\workspace\project\nodejs-demo\node_modules\express\lib\router\index.js:161:37)
          at param (D:\workspace\project\nodejs-demo\node_modules\express\lib\router\index.js:135:11)
          at pass (D:\workspace\project\nodejs-demo\node_modules\express\lib\router\index.js:142:5)
          at Router._dispatch (D:\workspace\project\nodejs-demo\node_modules\express\lib\router\index.js:170:5)
          at Object.router (D:\workspace\project\nodejs-demo\node_modules\express\lib\router\index.js:33:10)
          at next (D:\workspace\project\nodejs-demo\node_modules\express\node_modules\connect\lib\proto.js:190:15)
          at Object.methodOverride [as handle] (D:\workspace\project\nodejs-demo\node_modules\express\node_modules\connect\lib\middleware\methodOverride.js:37:5)
          GET / 500 26ms
          

          重命名:views/indes.ejs 為 views/index.html

          訪問localhost:3000正確

           

          5. 增加Bootstrap界面框架

          其實就是把js,css文件復制到項目中對應該的目錄里。 包括4個文件:

          復制到public/stylesheets目錄

          
          bootstrap.min.css
          bootstrap-responsive.min.css
          

          復制到public/javascripts目錄

          
          bootstrap.min.js
          jquery-1.9.1.min.js
          

          接下來,我們把index.html頁面切分成3個部分:header.html, index.html, footer.html

          header.html, 為html頁面的頭部區域
          index.html, 為內容顯示區域
          footer.html,為頁面底部區域

          header.html

          
          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="utf-8">
          <title><%=: title %></title>
          <!-- Bootstrap -->
          <link href="/stylesheets/bootstrap.min.css" rel="stylesheet" media="screen">
          <!-- <link href="css/bootstrap-responsive.min.css" rel="stylesheet" media="screen"> -->
          </head>
          <body screen_capture_injected="true">
          

          index.html

          
          <% include header.html %>
          <h1><%= title %></h1>
          <p>Welcome to <%= title %></p>
          <% include footer.html %>
          

          注:express3.0時,ejs嵌入其他頁面時使用include,express2.x用法不一樣。

          footer.html

          
          <script src="/javascripts/jquery-1.9.1.min.js"></script>
          <script src="/javascripts/bootstrap.min.js"></script>
          </body>
          </html>
          

          訪問localhost:3000正確。

          我們已經成功的使用了EJS模板的功能,把公共的頭部和底部從頁面中分離出來了。

          并已經引入了bootstrap界面框架,后面講到“登陸界面”的時候,就會看到bootstrap界面效果了。

           

          6. 路由功能

          我們設計一下用戶登陸業務需求。

          訪問路徑:/,頁面:index.html,不需要登陸,可以直接訪問。
          訪問路徑:/home,頁面:home.html,必須用戶登陸后,才可以訪問。
          訪問路徑:/login,頁面:login.html,登陸頁面,用戶名密碼輸入正確,自動跳轉到home.html
          訪問路徑:/logout,頁面:無,退出登陸后,自動回到index.html頁面
          打開app.js文件,在增加路由配置

          
          app.get('/', routes.index);
          app.get('/login', routes.login);
          app.post('/login', routes.doLogin);
          app.get('/logout', routes.logout);
          app.get('/home', routes.home);
          

          注:get為get請求,post為post請求,all為所有針對這個路徑的請求

          我們打開routes/index.js文件,增加對應的方法。

          
          exports.index = function(req, res){
          res.render('index', { title: 'Index' });
          };
          exports.login = function(req, res){
          res.render('login', { title: '用戶登陸'});
          };
          exports.doLogin = function(req, res){
          var user={
          username:'admin',
          password:'admin'
          }
          if(req.body.username===user.username && req.body.password===user.password){
          res.redirect('/home');
          }
          res.redirect('/login');
          };
          exports.logout = function(req, res){
          res.redirect('/');
          };
          exports.home = function(req, res){
          var user={
          username:'admin',
          password:'admin'
          }
          res.render('home', { title: 'Home',user: user});
          };
          

          創建views/login.html和views/home.html兩個文件

          login.html

          
          <% include header.html %>
          <div class="container-fluid">
          <form class="form-horizontal" method="post">
          <fieldset>
          <legend>用戶登陸</legend>
          <div class="control-group">
          <label class="control-label" for="username">用戶名</label>
          <div class="controls">
          <input type="text" class="input-xlarge" id="username" name="username">
          </div>
          </div>
          <div class="control-group">
          <label class="control-label" for="password">密碼</label>
          <div class="controls">
          <input type="password" class="input-xlarge" id="password" name="password">
          </div>
          </div>
          <div class="form-actions">
          <button type="submit" class="btn btn-primary">登陸</button>
          </div>
          </fieldset>
          </form>
          </div>
          <% include footer.html %>
          

          login
          注:使用了bootstrap界面框架,效果還不錯吧.

          home.html

          
          <% include header.html %>
          <h1>Welcome <%= user.username %>, 歡迎登陸?。?lt;/h1>
          <a claa="btn" href="/logout">退出</a>
          <% include footer.html %>
          

          修改index.html,增加登陸鏈接
          index.html

          
          <% include header.html %>
          <h1>Welcome to <%= title %></h1>
          <p><a href="/login">登陸</a></p>
          <% include footer.html %>
          

          路由及頁面我們都寫好了,快去網站上試試吧。

           

          7. Session使用

          從剛來的例子上面看,執行exports.doLogin時,如果用戶名和密碼正確,我們使用redirect方法跳轉到的home

          res.redirect('/home');

          執行exports.home時,我們又用render渲染頁面,并把user對象傳給home.html頁面

          res.render('home', { title: 'Home',user: user});

          為什么不能在doLogin時,就把user對象賦值給session,每個頁面就不再傳值了。

          session這個問題,其實是涉及到服務器的底層處理方式。

          像Java的web服務器,是多線程調用模型。每用戶請求會打開一個線程,每個線程在內容中維護著用戶的狀態。

          像PHP的web服務器,是交行CGI的程序處理,CGI是無狀態的,所以一般用cookie在客戶的瀏覽器是維護用戶的狀態。但cookie在客戶端維護的信息是不夠的,所以CGI應用要模仿用戶session,就需要在服務器端生成一個session文件存儲起來,讓原本無狀態的CGI應用,通過中間文件的方式,達到session的效果。

          Nodejs的web服務器,也是CGI的程序無狀態的,與PHP不同的地方在于,單線程應用,所有請求都是異步響應,通過callback方式返回數據。如果我們想保存session數據,也是需要找到一個存儲,通過文件存儲,redis,Mongdb都可以。

          接下來,我將演示如何通過mongodb來保存session,并實現登陸后用戶對象傳遞。

          app.js文件

          
          var express = require('express')
          , routes = require('./routes')
          , user = require('./routes/user')
          , http = require('http')
          , path = require('path')
          , ejs = require('ejs')
          , SessionStore = require("session-mongoose")(express);
          var store = new SessionStore({
          url: "mongodb://localhost/session",
          interval: 120000
          });
          ....
          app.use(express.favicon());
          app.use(express.logger('dev'));
          app.use(express.bodyParser());
          app.use(express.methodOverride());
          app.use(express.cookieParser());
          app.use(express.cookieSession({secret : 'fens.me'}));
          app.use(express.session({
          secret : 'fens.me',
          store: store,
          cookie: { maxAge: 900000 }
          }));
          app.use(function(req, res, next){
          res.locals.user = req.session.user;
          next();
          });
          app.use(app.router);
          app.use(express.static(path.join(__dirname, 'public')));
          

          注:app.js文件有順序要求,一定要注意?。。?/strong>

          安裝session-mongoose依賴庫

          
          D:\workspace\project\nodejs-demo>npm install session-mongoose
          D:\workspace\project\nodejs-demo\node_modules\session-mongoose\node_modules\mongoose\node_modules\mongodb\node_modules\bson>node "D:\toolkit\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild
          C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.InvalidPlatform.Targets(23,7): error MSB8007: 項目“kerberos.vcxproj”的平臺無效。平臺為“x64”。您會看到此消息的可能原因是,您嘗試在沒有解決方案文件的情況下生成項目,并且為
          oose\node_modules\mongoose\node_modules\mongodb\node_modules\bson\build\bson.vcxproj]
          session-mongoose@0.2.2 node_modules\session-mongoose
          └── mongoose@3.6.10 (mpath@0.1.1, ms@0.1.0, hooks@0.2.1, sliced@0.0.3, muri@0.3.1, mpromise@0.2.1, mongodb@1.3.3)
          

          安裝有錯誤但是沒關系。

          訪問:http://localhost:3000/login,正常

          修改routes/index.js文件

          exports.doLogin方法

          
          exports.doLogin = function(req, res){
          var user={
          username:'admin',
          password:'admin'
          }
          if(req.body.username===user.username && req.body.password===user.password){
          req.session.user=user;
          return res.redirect('/home');
          } else {
          return res.redirect('/login');
          }
          };
          

          exports.logout方法

          
          exports.logout = function(req, res){
          req.session.user=null;
          res.redirect('/');
          };
          

          exports.home方法

          
          exports.home = function(req, res){
          res.render('home', { title: 'Home'});
          };
          

          這個時候session已經起作用了,exports.home的user顯示傳值已經被去掉了。 是通過app.js中app.use的res.locals變量,通過框架進行的賦值。

          
          app.use(function(req, res, next){
          res.locals.user = req.session.user;
          next();
          });
          

          注:這個session是express3.0的寫法,與express2.x是不一樣的。原理是在框架內每次賦值,把我們剛才手動傳值的過程,讓框架去完成了。

           

          8. 頁面提示

          登陸的大體我們都已經講完了,最后看一下登陸失敗的情況。

          我們希望如果用戶登陸時,用戶名或者密碼出錯了,會給用戶提示,應該如何去實現。

          打開app.js的,增加res.locals.message

          
          app.use(function(req, res, next){
          res.locals.user = req.session.user;
          var err = req.session.error;
          delete req.session.error;
          res.locals.message = '';
          if (err) res.locals.message = '<div class="alert alert-error">' + err + '</div>';
          next();
          });
          

          修改login.html頁面,<%- message %>

          
          <% include header.html %>
          <div class="container-fluid">
          <form class="form-horizontal" method="post">
          <fieldset>
          <legend>用戶登陸</legend>
          <%- message %>
          <div class="control-group">
          <label class="control-label" for="username">用戶名</label>
          <div class="controls">
          <input type="text" class="input-xlarge" id="username" name="username" value="admin">
          </div>
          </div>
          <div class="control-group">
          <label class="control-label" for="password">密碼</label>
          <div class="controls">
          <input type="password" class="input-xlarge" id="password" name="password" value="admin">
          </div>
          </div>
          <div class="form-actions">
          <button type="submit" class="btn btn-primary">登陸</button>
          </div>
          </fieldset>
          </form>
          </div>
          <% include footer.html %>
          

          修改routes/index.js,增加req.session.error

          
          exports.doLogin = function(req, res){
          var user={
          username:'admin',
          password:'admin'
          }
          if(req.body.username===user.username && req.body.password===user.password){
          req.session.user=user;
          return res.redirect('/home');
          } else {
          req.session.error='用戶名或密碼不正確';
          return res.redirect('/login');
          }
          };
          

          讓我們來看看效果: http://localhost:3000/login 輸入錯誤的和密碼, 用戶名:adminfe,密碼:12121

          loginErr

           

          9. 頁面訪問控制

          網站登陸部分按照我們的求已經完成了,但網站并不安全。

          localhost:3000/home,頁面本來是登陸以后才訪問的,現在我們不要登陸,直接在瀏覽器輸入也可訪問。

          頁面報錯了,提示<%= user.username %> 變量出錯。

           GET /home?user==a 500 15ms TypeError: D:\workspace\project\nodejs-demo\views\home.html:2 1| <% include header.html %> >> 2| <h1>Welcome <%= user.username %>, 歡迎登陸??!</h1> 3| <a claa="btn" href="/logout">退出</a> 4| <% include header.html %> Cannot read property 'username' of null at eval (eval at <anonymous> (D:\workspace\project\nodejs-demo\node_modules\ejs\lib\ejs.js: at eval (eval at <anonymous> (D:\workspace\project\nodejs-demo\node_modules\ejs\lib\ejs.js: at D:\workspace\project\nodejs-demo\node_modules\ejs\lib\ejs.js:249:15 at Object.exports.render (D:\workspace\project\nodejs-demo\node_modules\ejs\lib\ejs.js:287: at View.exports.renderFile [as engine] (D:\workspace\project\nodejs-demo\node_modules\ejs\l at View.render (D:\workspace\project\nodejs-demo\node_modules\express\lib\view.js:75:8) at Function.app.render (D:\workspace\project\nodejs-demo\node_modules\express\lib\applicati at ServerResponse.res.render (D:\workspace\project\nodejs-demo\node_modules\express\lib\res at exports.home (D:\workspace\project\nodejs-demo\routes\index.js:36:8) at callbacks (D:\workspace\project\nodejs-demo\node_modules\express\lib\router\index.js:161 

          這個頁面被打開發,因為沒有user.username參數。我們避免這樣的錯誤發生。

          還記錄路由部分里說的get,post,all的作用嗎?我現在要回到路由配置中,再做點事情。

          修改app.js文件

           app.all('/login', notAuthentication); app.get('/login', routes.login); app.post('/login', routes.doLogin); app.get('/logout', authentication); app.get('/logout', routes.logout); app.get('/home', authentication); app.get('/home', routes.home); 

          訪問控制:

          • / ,誰訪問都行,沒有任何控制
          • /login,用all攔截所有訪問/login的請求,先調用authentication,用戶登陸檢查
          • /logout,用get攔截訪問/login的請求,先調用notAuthentication,用戶不登陸檢查
          • /home,用get攔截訪問/home的請求,先調用Authentication,用戶登陸檢查

          修改app.js文件,增加authentication,notAuthentication兩個方法

           function authentication(req, res, next) { if (!req.session.user) { req.session.error='請先登陸'; return res.redirect('/login'); } next(); } function notAuthentication(req, res, next) { if (req.session.user) { req.session.error='已登陸'; return res.redirect('/'); } next(); } 

          配置好后,我們未登陸,直接訪問localhost:3000/home時,就會跳到/login頁面

          loginHome

          如果你也出現圖片顯示的內容,那么恭喜你了。

          Nodejs使用Express3.0框架的第一步你已經完成了,并且還使用了ejs,bootstrap,mongoose庫的使用。

          希望此文對大家有所幫助。

          posted @ 2014-11-14 16:18 Eric_jiang 閱讀(399) | 評論 (1)編輯 收藏

          從零開始nodejs系列文章,將介紹如何利Javascript做為服務端腳本,通過Nodejs框架web開發。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome瀏覽器就基于V8,同時打開20-30個網頁都很流暢。Nodejs標準的web開發框架Express,可以幫助我們迅速建立web站點,比起PHP的開發效率更高,而且學習曲線更低。非常適合小型網站,個性化網站,我們自己的Geek網站?。?/p>

          關于作者

          • 張丹(Conan), 程序員Java,R,PHP,Javascript
          • weibo:@Conan_Z
          • blog: http://blog.fens.me
          • email: bsspirit@gmail.com

          轉載請注明出處:
          http://blog.fens.me/nodejs-bower-intro/

          bower

          前言
          一個新的web項目開始,我們總是很自然地去下載需要用到的js類庫文件,比如jQuery,去官網下載名為jquery-1.10.2.min.js文件,放到我們的項目里。當項目又需要bootstrap的時候,我們會重復剛才的工作,去bootstrap官網下載對應的類庫。如果bootstrap所依賴的jQuery并不是1.10.2,而是2.0.3時,我們會再重新下載一個對應版本的jQuery替換原來的。

          包管理是個復雜的問題,我們要知道誰依賴誰,還要明確哪個版本依賴哪個版本。這些對于開發人員來說,負擔過重了。bower作為一個js依賴管理的工具,提供一種理想包管理方式,借助了npm的一些思想,為我們提供一個舒服的開發環境。

          你要還不動起手來試試bower,那你一定不會知道,前端開發是件多么享受的事。

          目錄

          1. bower介紹
          2. bower安裝
          3. bower命令
          4. bower使用
          5. 用bower提交自己類庫

          1. bower介紹

          Bower 是 twitter 推出的一款包管理工具,基于nodejs的模塊化思想,把功能分散到各個模塊中,讓模塊和模塊之間存在聯系,通過 Bower 來管理模塊間的這種聯系。

          包管理工具一般有以下的功能:

          • 注冊機制:每個包需要確定一個唯一的 ID 使得搜索和下載的時候能夠正確匹配,所以包管理工具需要維護注冊信息,可以依賴其他平臺。
          • 文件存儲:確定文件存放的位置,下載的時候可以找到,當然這個地址在網絡上是可訪問的。
          • 上傳下載:這是工具的主要功能,能提高包使用的便利性。比如想用 jquery 只需要 install 一下就可以了,不用到處找下載。上傳并不是必備的,根據文件存儲的位置而定,但需要有一定的機制保障。
          • 依賴分析:這也是包管理工具主要解決的問題之一,既然包之間是有聯系的,那么下載的時候就需要處理他們之間的依賴。下載一個包的時候也需要下載依賴的包。

          功能介紹,摘自文章:http://chuo.me/2013/02/twitter-bower.html

          2. bower安裝

          bower插件是通過npm, Node.js包管理器安裝和管理的.

          我的系統環境

          • win7 64bit
          • Nodejs:v0.10.5
          • Npm:1.2.19
          ~ D:\workspace\javascript>node -v
          v0.10.5
          
          ~ D:\workspace\javascript>npm -v
          1.2.19
          

          在系統中,我們已經安裝好了Nodejs和npm。win7安裝nodejs請參考文章:Nodejs開發框架Express3.0開發手記–從零開始

          安裝bower 
          全局安裝bower

          
          ~ D:\workspace\javascript>npm install bower -g
          

          新建一個express3的項目nodejs-bower

          
          ~ D:\workspace\javascript>express -e nodejs-bower
          ~ D:\workspace\javascript>cd nodejs-bower && npm install
          

          3. bower命令

          bower安裝后,我們就可以用bower這個命令了。

          ~ D:\workspace\javascript\nodejs-bower>bower
          Usage:
              bower  [] []
          Commands:
              cache                   Manage bower cache
              help                    Display help information about Bower
              home                    Opens a package homepage into your favorite browser
              info                    Info of a particular package
              init                    Interactively create a bower.json file
              install                 Install a package locally
              link                    Symlink a package folder
              list                    List local packages
              lookup                  Look up a package URL by name
              prune                   Removes local extraneous packages
              register                Register a package
              search                  Search for a package by name
              update                  Update a local package
              uninstall               Remove a local package
          Options:
              -f, --force             Makes various commands more forceful
              -j, --json              Output consumable JSON
              -l, --log-level         What level of logs to report
              -o, --offline           Do not hit the network
              -q, --quiet             Only output important information
              -s, --silent            Do not output anything, besides errors
              -V, --verbose           Makes output more verbose
              --allow-root            Allows running commands as root
          See 'bower help ' for more information on a specific command.
          

          Commands,列出了bower支持的各種命令。

          • cache:bower緩存管理
          • help:顯示Bower命令的幫助信息
          • home:通過瀏覽器打開一個包的github發布頁
          • info:查看包的信息
          • init:創建bower.json文件
          • install:安裝包到項目
          • link:在本地bower庫建立一個項目鏈接
          • list:列出項目已安裝的包
          • lookup:根據包名查詢包的URL
          • prune:刪除項目無關的包
          • register:注冊一個包
          • search:搜索包
          • update:更新項目的包
          • uninstall:刪除項目的包

          4. bower使用

          1). 安裝jQuery到項目nodejs-bower

          
          ~ D:\workspace\javascript\nodejs-bower>bower install jquery
          bower jquery#*              not-cached git://github.com/components/jquery.git#*
          bower jquery#*                 resolve git://github.com/components/jquery.git#*
          bower jquery#*                download https://github.com/components/jquery/archive/2.0.3.tar.gz
          bower jquery#*                 extract archive.tar.gz
          bower jquery#*                resolved git://github.com/components/jquery.git#2.0.3
          bower jquery#~2.0.3            install jquery#2.0.3
          
          jquery#2.0.3 bower_components\jquery
          

          通過執行命令,我們可以看到jQuery的最新版本被下載,并安裝到項目的bower_components\jquery目錄

          查看bower_components/jquery目錄,發現了3個文件。

          
          ~ D:\workspace\javascript\nodejs-bower>ls bower_components/jquery -a
          .  ..  .bower.json  component.json  jquery.js
          

          同樣地,我們的項目還需要d3的類庫

          
          ~ D:\workspace\javascript\nodejs-bower>bower install d3
          bower d3#*                  not-cached git://github.com/mbostock/d3.git#*
          bower d3#*                     resolve git://github.com/mbostock/d3.git#*
          bower d3#*                    download https://github.com/mbostock/d3/archive/v3.2.8.tar.gz
          bower d3#*                     extract archive.tar.gz
          bower d3#*                    resolved git://github.com/mbostock/d3.git#3.2.8
          bower d3#~3.2.8                install d3#3.2.8
          
          d3#3.2.8 bower_components\d3
          

          非常方便,下載并安裝完成!

          2). 查看項目中已導入的類庫

          
          ~ D:\workspace\javascript\nodejs-bower>bower list
          bower check-new     Checking for new versions of the project dependencies..
          nodejs-bower#0.0.0 D:\workspace\javascript\nodejs-bower
          ├── d3#3.2.8
          └── jquery#2.0.3
          

          3). 安裝bootstrap庫,并查看依賴情況

          
          ~ D:\workspace\javascript\nodejs-bower>bower install bootstrap
          bower bootstrap#*               cached git://github.com/twbs/bootstrap.git#3.0.0-rc1
          bower bootstrap#*             validate 3.0.0-rc1 against git://github.com/twbs/bootstrap.git#*
          bower jquery#>= 1.9.0           cached git://github.com/components/jquery.git#2.0.3
          bower jquery#>= 1.9.0         validate 2.0.3 against git://github.com/components/jquery.git#>= 1.9.0
          bower bootstrap#~3.0.0-rc1     install bootstrap#3.0.0-rc1
          
          bootstrap#3.0.0-rc1 bower_components\bootstrap
          └── jquery#2.0.3
          
          ~ D:\workspace\javascript\nodejs-bower>bower list
          bower check-new     Checking for new versions of the project dependencies..
          nodejs-bower#0.0.0 D:\workspace\javascript\nodejs-bower
          ├─┬ bootstrap#3.0.0-rc1 extraneous
          │ └── jquery#2.0.3
          ├── d3#3.2.8
          └── jquery#2.0.3
          

          我們發現bootstrap,對jquery是有依賴的。

          4). 刪除jQuery庫,破壞依賴關系

          
          ~ D:\workspace\javascript\nodejs-bower>bower uninstall jquery
          bower conflict      bootstrap depends on jquery
          Continue anyway? (y/n) y
          bower uninstall     jquery
          
          ~ D:\workspace\javascript\nodejs-bower>bower list
          bower check-new     Checking for new versions of the project dependencies..
          nodejs-bower#0.0.0 D:\workspace\javascript\nodejs-bower
          ├─┬ bootstrap#3.0.0-rc1 extraneous
          │ └── jquery missing
          ├── d3#3.2.8
          └── jquery missing
          

          5). 安裝低版本的jQuery,制造不版本兼容

          
          ~ D:\workspace\javascript\nodejs-bower>bower install jquery#1.7.2
          bower jquery#~2.0.3             cached git://github.com/components/jquery.git#2.0.3
          bower jquery#~2.0.3           validate 2.0.3 against git://github.com/components/jquery.git#~2.0.3
          bower jquery#>= 1.9.0           cached git://github.com/components/jquery.git#2.0.3
          bower jquery#>= 1.9.0         validate 2.0.3 against git://github.com/components/jquery.git#>= 1.9.0
          bower jquery#1.7.2              cached git://github.com/components/jquery.git#1.7.2
          bower jquery#1.7.2            validate 1.7.2 against git://github.com/components/jquery.git#1.7.2
          
          Unable to find a suitable version for jquery, please choose one:
              1) jquery#1.7.2 which resolved to 1.7.2
              2) jquery#~2.0.3 which resolved to 2.0.3 and has nodejs-bower as dependants
              3) jquery#>= 1.9.0 which resolved to 2.0.3 and has bootstrap#3.0.0-rc1 as dependants
          
          Prefix the choice with ! to persist it to bower.json
          
          Choice: 1
          bower jquery#1.7.2             install jquery#1.7.2
          
          jquery#1.7.2 bower_components\jquery
          
          ~ D:\workspace\javascript\nodejs-bower>bower list
          bower check-new     Checking for new versions of the project dependencies..
          nodejs-bower#0.0.0 D:\workspace\javascript\nodejs-bower
          ├─┬ bootstrap#3.0.0-rc1 extraneous
          │ └── jquery#1.7.2 incompatible with >= 1.9.0 (2.0.3 available)
          ├── d3#3.2.8
          └── jquery#1.7.2 incompatible with ~2.0.3 (2.0.3 available)
          

          我們可以清楚的看到bower,很明確的告訴了我們,jquery和bootstrap是不兼容的,強大之處大家應該有所體會。

          6).升級jQuery,讓版本兼容

          
          ~ D:\workspace\javascript\nodejs-bower>bower update jquery
          bower jquery#~2.0.3             cached git://github.com/components/jquery.git#2.0.3
          bower jquery#~2.0.3           validate 2.0.3 against git://github.com/components/jquery.git#~2.0.3
          bower jquery#>= 1.9.0           cached git://github.com/components/jquery.git#2.0.3
          bower jquery#>= 1.9.0         validate 2.0.3 against git://github.com/components/jquery.git#>= 1.9.0
          bower jquery#~2.0.3            install jquery#2.0.3
          
          jquery#2.0.3 bower_components\jquery
          
          ~ D:\workspace\javascript\nodejs-bower>bower list
          bower check-new     Checking for new versions of the project dependencies..
          nodejs-bower#0.0.0 D:\workspace\javascript\nodejs-bower
          ├─┬ bootstrap#3.0.0-rc1 extraneous
          │ └── jquery#2.0.3
          ├── d3#3.2.8
          └── jquery#2.0.3
          

          多么智能,一鍵搞定,這才是高效的開發。

          7). 查看本地bower已經緩存的類庫

          
          ~ D:\workspace\javascript\nodejs-bower>bower cache list
          bootstrap=git://github.com/twbs/bootstrap.git#3.0.0-rc1
          d3=git://github.com/mbostock/d3.git#3.2.8
          jquery=git://github.com/components/jquery.git#1.7.2
          jquery=git://github.com/components/jquery.git#2.0.3
          

          8). 查看D3庫信息

          
          ~ D:\workspace\javascript\nodejs-bower>bower info d3
          d3
          
            Versions:
              - 3.2.8
              - 3.2.7
              - 3.2.6
              - 3.2.5
              - 3.2.4
              - 3.2.3
              ...
          

          9). 查看dojo庫的url

          
          ~ D:\workspace\javascript\nodejs-bower>bower lookup dojo
          dojo git://github.com/dojo/dojo.git
          

          10). 用瀏覽器打開dojo的發布主頁

          
          ~ D:\workspace\javascript\nodejs-bower>bower home dojo
          bower dojo#*                not-cached git://github.com/dojo/dojo.git#*
          bower dojo#*                   resolve git://github.com/dojo/dojo.git#*
          bower dojo#*                  download https://github.com/dojo/dojo/archive/1.9.1.tar.gz
          bower dojo#*                   extract archive.tar.gz
          bower dojo#*                  resolved git://github.com/dojo/dojo.git#1.9.1
          

          瀏覽器自動打開:https://github.com/dojo/dojo

          11). 查詢包含dojo的類庫

          
          ~ D:\workspace\javascript\nodejs-bower>bower search dojo
          Search results:
          
              dojo git://github.com/dojo/dojo.git
              dojox git://github.com/dojo/dojox.git
              dojo-util git://github.com/dojo/util.git
              dojo-bootstrap git://github.com/samvdb/Dojo-Bootstrap
          

          真是方便實用的技術。

          5. 用bower提交自己類庫

          1). 生成bower.json配置文件

           ~ D:\workspace\javascript\nodejs-bower>bower init bower existing      The existing bower.json file will be used and filled in [?] name: nodejs-bower [?] version: 0.0.0 [?] main file: [?] set currently installed components as dependencies? No [?] add commonly ignored files to ignore list? Yes 

          查看生成的文件bower.json

           {   "name": "nodejs-bower",   "version": "0.0.0",   "ignore": [     "**/.*",     "node_modules",     "bower_components",     "test",     "tests"   ],   "dependencies": {     "d3": "git://github.com/mbostock/d3.git#~3.2.8",     "jquery": "git://github.com/components/jquery.git#~2.0.3"   } } 

          2). 在github創建一個資源庫:nodejs-bower
          3). 本地工程綁定github

           ~ D:\workspace\javascript\nodejs-bower>git init Initialized empty Git repository in D:/workspace/javascript/nodejs-bower/.git/  ~ D:\workspace\javascript\nodejs-bower>git add . ~ D:\workspace\javascript\nodejs-bower>git commit -m "first commit" # On branch master # # Initial commit # # Untracked files: #   (use "git add ..." to include in what will be committed) # #       app.js #       bower.json #       bower_components/ #       node_modules/ #       package.json #       public/ #       routes/ #       views/ nothing added to commit but untracked files present (use "git add" to track)  ~ D:\workspace\javascript\nodejs-bower>git remote add origin https://github.com/bsspirit/nodejs-bower  ~ D:\workspace\javascript\nodejs-bower>git push -u origin master Counting objects: 565, done. Delta compression using up to 4 threads. Compressing objects: 100% (516/516), done. Writing objects: 100% (565/565), 803.08 KiB, done. Total 565 (delta 26), reused 0 (delta 0) To https://github.com/bsspirit/nodejs-bower  * [new branch]      master -> master Branch master set up to track remote branch master from origin. 

          4). 注冊到bower官方類庫

           ~ D:\workspace\javascript\nodejs-bower>bower register nodejs-bower git@github.com:bsspirit/nodejs-bower.git bower                          convert Converted git@github.com:bsspirit/nodejs-bower.git to git://github.com/bsspirit/n odejs-bower.git bower nodejs-bower#*           resolve git://github.com/bsspirit/nodejs-bower.git#* bower nodejs-bower#*          checkout master bower nodejs-bower#*          resolved git://github.com/bsspirit/nodejs-bower.git#af3ceaac07 Registering a package will make it visible and installable via the registry (https://bower.herokuapp.com), continue? (y/ n)                    y bower nodejs-bower            register git://github.com/bsspirit/nodejs-bower.git  Package nodejs-bower registered successfully! All valid semver tags on git://github.com/bsspirit/nodejs-bower.git will be available as versions. To publish a new version, you just need release a valid semver tag.  Run bower info nodejs-bower to list the package versions. 

          5). 查詢我們自己的包

           D:\workspace\javascript\nodejs-bower>bower search nodejs-bower Search results:      nodejs-bower git://github.com/bsspirit/nodejs-bower.git 

          6). 安裝我們自己的包

           D:\workspace\javascript\nodejs-bower>bower install nodejs-bower bower nodejs-bower#*            cached git://github.com/bsspirit/nodejs-bower.git#af3ceaac07 bower nodejs-bower#*          validate af3ceaac07 against git://github.com/bsspirit/nodejs-bower.git#* bower nodejs-bower#*           install nodejs-bower#af3ceaac07  nodejs-bower#af3ceaac07 bower_components\nodejs-bower ├── d3#3.2.8 └── jquery#2.0.3 

          其實模塊化,版本依賴,開發類庫,發布類庫,安裝類庫,都是一條命令!還能再簡單一點么!快把項目模塊化,然后分享給大家吧??!未來是屬于開發者的。

          posted @ 2014-11-14 13:50 Eric_jiang 閱讀(1928) | 評論 (0)編輯 收藏

          Windows平臺下的node.js安裝
          直接去nodejs的官網http://nodejs.org/上下載nodejs安裝程序,雙擊安裝就可以了
          測試安裝是否成功:
          在命令行輸入 node –v 應該可以查看到當前安裝的nodejs版本號
          簡單的例子
          寫一段簡短的代碼,保存為helloworld.js,大致看下nodejs是怎么用的。
          如下:該代碼主要是創建一個http服務器。
           
          var http = require("http");  
          http.createServer(function(request, response) {  
              response.writeHead(200, {"Content-Type": "text/html"});  
              response.write("Hello World!");  
              response.end();  
          }).listen(8080);  
          console.log("Server running at http://localhost:8080/");  
          打開命令行,轉到當前文件所存放的路徑下,運行 node helloworld.js命令即可
          如果一切正常,可以看到命令行輸出:Server running at http://localhost:8080/
          同時,在瀏覽器輸入http://localhost:8080/,可以看到一個寫著helloworld的網頁。
          安裝npm
          npm上有很多優秀的nodejs包,來解決常見的一些問題,比如用node-mysql,就可以方便通過nodejs鏈接到mysql,進行數據庫的操作
          在開發過程往往會需要用到其他的包,使用npm就可以下載這些包來供程序調用
          a) 如果系統沒有安裝過Git,可以直接到https://github.com/isaacs/npm下載npm所需要的文件。
          b) 如果有Git 可以使用git下載。
           
          git clone --recursive git://github.com/isaacs/npm.git  
          下載到NPM文件后,命令行首先轉到npm所在地址,輸入以下代碼進行安裝。
           
          node cli.js install npm -gf  
          安裝Express
          Express是nodejs常用的一個框架。
          a) 全局安裝 
           
          npm install express -gd  
          npm install -g express-generator
          b) 安裝在當前文件夾下 
           
          npm install express  
          安裝成功后,命令行會提示 npm info ok
          -g代表安裝到NODE_PATH的lib里面,而-d代表把相依性套件也一起安裝。如果沒有-g的話會安裝目前所在的目錄(會建立一個node_modules的文件夾)。
          在項目中引用express包
          例:
           
          var express = require('express');  
          var app = module.exports = express.createServer();  
          如果沒有安裝過express,那么首先需要在當前項目文件夾下安裝一個express
          命令行轉到當前路徑后,運行
           
          npm install express  
          安裝完成后,可以看到當前目錄下多了一個【node_modules】文件夾,下有一個【express】文件夾
          注:項目中引用的包,都會被安裝到【node_modules】文件夾
          用express創建項目
          在命令行中輸入【express 項目名稱】,就可以在當前文件夾下創建一個新的項目
          如圖:
          包括以下幾個文件:
          用此方法,只是創建了一個空的項目框架,和一個簡單的實例程序,運行app.js可以查看(還需要在項目文件目錄下,安裝jade包,方法類似安裝express)
          參考網站:
          Node.js基礎 http://www.infoq.com/cn/master-nodejs
          Node.js 入門教程 http://nodebeginner.org/index-zh-cn.html
          Node.js中文文檔 http://cnodejs.org/cman/index.html
          Express文檔 http://expressjs.com/guide.html#routing
          CNode社區 http://club.cnodejs.org/
          posted @ 2014-11-13 09:53 Eric_jiang 閱讀(230) | 評論 (0)編輯 收藏

          Node.js官網有各平臺的安裝下載,不想折騰的可以直接下載安裝,下面說下windows平臺下如何制作綠色版node,以方便遷移。

          1. 獲取node.exe
            下載Windows Binary版本,不要下載Windows Installer版本,直接放到H:\nodejs\
          2. 獲取npm(Node Package Manage)
            下載最新zip版本,不要下載tgz版本,下載后解壓到H:\nodejs\
          3. 添加環境變量
            • NODE_HOME=H:\nodejs
            • NODE_PATH=%NODE_HOME%\node_modules
            • path增加%NODE_HOME%\

          最終得到文件目錄結構H:\nodejs\:

          . ├—— node.exe ├—— npm.cmd └—— node_modules     └—— npm 

          測試一下,出現版本號,說明配置成功:

          node --version npm --version 

          至此,綠色版制作完畢,您已經可以正常使用node/npm,也可以遷移到其他機器使用。

          下面使用npm命令安裝第三方模塊,使用方法可以查看:

          npm -h npm install -h npm help install 

          默認安裝倉庫是https://registry.npmjs.org,查找包可以到這里http://search.npmjs.org,一切都很像maven。有兩種安裝模式可選,參考npm 1.0 Global vs Local installation
          locally
          默認是locally模式,安裝到當前命令的執行目錄。在其他位置執行xxx會報“xxx不是內部或外部命令,也不是可運行的程序”。

          npm install xxx 

          globally
          -g參數代表全局方式,使用全局模式會安裝H:\nodejs\node_modules\中的xxx下。

          npm install xxx -g 

          你可以重新設置prefix位置,方法有二:

          • 重新設置prefix的位置:npm config set prefix "H:\hexo"
          • 或直接修改 『當前用戶』.npmrc 文件,添加prefix = H:\hexo
          posted @ 2014-11-12 15:55 Eric_jiang 閱讀(207) | 評論 (0)編輯 收藏

          在 開始研究 java CMS之前,我們先要了解什么是CMS。CMS — Content Management Systems,內容管理系統,簡單的說,就是一個幫助進行網站內容管理的系統。CMS通常包含兩部分:內容管理程序(Content Management Application ,CMA)和內容發布程序(Content Delivery Application ,CDA),內容管理程序可以幫助網站管理員輕松的實現網站文章的創建、編輯和刪除操作,內容發布程序則可以編輯文章并在網站上發布它們。
          一 個完整的CMS通常包含一個在線的發布、排版、版本控制,以及列表、搜索、恢復等功能模塊。近年來大量涌現的企業網站管理系統,則增加了新聞管 理、使用手冊、在線幫助、銷售手冊等功能。難以避免的,功能強大的CMS往往有著高昂的售價,預算不足的用戶很希望找到一款好用且免費的管理系統?,F在已 經出現了許多基于java的開源CMS系統,本文挑選了10個最強大、最易用的CMS,向大家做一個簡要介紹。1. Alfresco
          Alfresco是一個開源的企業網站內容管理系統,它提供了文檔管理、多人協作、記錄管理、知識管理網頁內容和圖像管理等功能。它使用Spring、 Hibernate、 Lucene 和JSF等最新java技術構建了模塊化的系統架構。Alfresco官方網站:http://www.alfresco.com/中文教程:http://blog.csdn.net/alfresco/2. DotCMS
          DotCMS 是一個開源的企業級內容管理系統,它融入了電子商 務、個性化設置、客戶關系管理工具等功能,它可以方便的建立基于各種關系的數據結構和數據庫,它可以使用模板快速創建頁面,并且提供了一個強大的所見即所 得(WYSIWYG)編輯器。用戶可以使用加載外部模塊的功能快速的建立Ajax應用、搜索、MP3播放器、幻燈片和相冊等功能。DotCMS官方網站http://dotcms.org/中文安裝教程http://www.javaeye.com/wiki/topic/2777943. Magnolia
          Magnolia 是一個老牌的java內容管理系統,目前已經發布了第四版。它的獨特之處在于可以定制內容模型,以返回數組形式來搞定各種不確定的 功能。它遵循W3C標準并且在搜索引擎優化上有許多優勢。同時它支持java內容倉庫( java content repositories , JCR) 的API。Magnolia官方網站http://www.magnolia-cms.com/home.html4. OpenCms
          它提供了一套建立和維護網站的方便的工具。在內容建設方面,它擁有一個易于使用的界面和所見即所得編輯器,在網頁生成上它使用了一個先進的頁面模板。OpenCMS官方網站http://www.opencms.org/opencms/en/index.html中文網站http://www.opencms.cn/6. AtLeap
          Blandware AtLeap是一個多語種的免費Java內容管理系統,它包含了全文搜索引擎,可以算是一個能讓你方便的編寫應用的網站框架。Atleap官方網站https://atleap.dev.java.net/7. Fedora
          Fedora 是“Flexible Extensible Digital Object Repository Architecture”的縮寫,并不是Linux發行版Fedora,是一個數字資源管理系統,它可以創建很多類型的數字圖書館、資料庫、檔案館系統 等。Fedora官方網站http://www.fedora-commons.org/8. Apache Lenya
          這是一個開源的 Java/XML 內容管理系統,提供了版本控制、多站點管理、調度、搜索、所見即所得編輯以及工作流程等功能。Apache Lyenya使用基于模塊的Cocoom開源程序框架。Apache Lyenya官方網站http://lenya.apache.org/9. OpenEdit
          OpenEdit是一個開源的內容管理系統,它旨在建設基于在線數字資產的多媒體網站。它提供在線編輯,動態布局,拼寫檢查,用戶管理器,文件管理器,版本控制和通知工具。同時包含企業級的插件,如電子商務,內容管理,博客,活動日程表,社交網絡工具等。OpenEdit官方網站http://www.openedit.org/10.  Contelligent這個基于Java的開源解決方案有助于創建和管理個性化網站。它完全遵循J2EE,具有先進的模式,可以方便的添加第三方應用。Contelligent官方網站http://www.contelligent.com/
          posted @ 2014-11-11 15:50 Eric_jiang 閱讀(687) | 評論 (0)編輯 收藏

          直接安裝

          安裝Sublime text 2插件很方便,可以直接下載安裝包解壓縮到Packages目錄(菜單->preferences->packages)。

          使用Package Control組件安裝

          也可以安裝package control組件,然后直接在線安裝:

            1. 按Ctrl+`調出console(注:安裝有QQ輸入法的這個快捷鍵會有沖突的,輸入法屬性設置-輸入法管理-取消熱鍵切換至QQ拼音)
            2. 粘貼以下代碼到底部命令行并回車:
          import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read()) 
          1. 重啟Sublime Text 3。
          2. 如果在Perferences->package settings中看到package control這一項,則安裝成功。

          順便貼下Sublime Text2 的代碼

          import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')  

          如果這種方法不能安裝成功,可以到這里下載文件手動安裝。

          用Package Control安裝插件的方法:

          1. 按下Ctrl+Shift+P調出命令面板
          2. 輸入install 調出 Install Package 選項并回車,然后在列表中選中要安裝的插件。

          不爽的是,有的網絡環境可能會不允許訪問陌生的網絡環境從而設置一道防火墻,而Sublime Text 2貌似無法設置代理,可能就獲取不到安裝包列表了。
          好,方法介紹完了,下面是本文正題,一些有用的Sublime Text 2插件:

          GBK Encoding Support

          對應gb2312來說,Sublime Text 2 本生不支持的,我們可以通過Ctrl+Shift+P調出命令面板或Perferences->Package Contro,輸入install 調出 Install Package 選項并回車,在輸入“GBK Encoding Support”選擇開始安裝,左下角狀態欄有提示安裝成功。這時打開gbk編碼的文件就不會出現亂碼了,如果有需要轉成utf-8的可以在File-GBK to UTF8-選擇Save with UTF8就偶看了。

          Zen Coding

          這個,不解釋了,還不知道ZenCoding的同學強烈推薦去看一下:《Zen Coding: 一種快速編寫HTML/CSS代碼的方法》。

          Sublime Text 3 常用插件以及安裝方法 --PHP 第1張

          emmet

          PS:Zen Coding for Sublime Text 2插件的開發者已經停止了在Github上共享了,現在只有通過Package Control來安裝。

          jQuery Package for sublime Text

          如果你離不開jQuery的話,這個必備~~

          Sublime Prefixr

          Prefixr,CSS3 私有前綴自動補全插件,顯然也很有用哇

          Sublime Text 3 常用插件以及安裝方法 --PHP 第2張

          Sublime Prefixr

          JS Format

          一個JS代碼格式化插件。

          SublimeLinter

          一個支持lint語法的插件,可以高亮linter認為有錯誤的代碼行,也支持高亮一些特別的注釋,比如“TODO”,這樣就可以被快速定位。(IntelliJ IDEA的TODO功能很贊,這個插件雖然比不上,但是也夠用了吧)

          Sublime Text 3 常用插件以及安裝方法 --PHP 第3張

          SublimeLinter

          Placeholders

          故名思意,占位用,包括一些占位文字和HTML代碼片段,實用。

          Sublime Alignment

          用于代碼格式的自動對齊。傳說最新版Sublime 已經集成。

          Sublime Text 3 常用插件以及安裝方法 --PHP 第4張

          Clipboard History

          粘貼板歷史記錄,方便使用復制/剪切的內容。

          DetectSyntax

          這是一個代碼檢測插件。

          Nettuts Fetch

          如果你在用一些公用的或者開源的框架,比如 Normalize.css或者modernizr.js,但是,過了一段時間后,可能該開源庫已經更新了,而你沒有發現,這個時候可能已經不太適合你的項目了,那么你就要重新折騰一遍或者繼續用陳舊的文件。Nettuts Fetch可以讓你設置一些需要同步的文件列表,然后保存更新。

          Sublime Text 3 常用插件以及安裝方法 --PHP 第5張

          JsMinifier

          該插件基于Google Closure compiler,自動壓縮js文件。

          Sublime CodeIntel

          代碼自動提示

          Bracket Highlighter

          類似于代碼匹配,可以匹配括號,引號等符號內的范圍。

          Sublime Text 3 常用插件以及安裝方法 --PHP 第6張

          Hex to HSL

          自動轉換顏色值,從16進制到HSL格式,快捷鍵 Ctrl+Shift+U

          Sublime Text 3 常用插件以及安裝方法 --PHP 第7張

          GBK to UTF8

          將文件編碼從GBK轉黃成UTF8,快捷鍵Ctrl+Shift+C

          Git

          Sublime Text 3 常用插件以及安裝方法 --PHP 第8張

          該插件基本上實現了git的所有功能。

          總結

          好吧,大概就這些,如果你有常用的插件或者擴展,歡迎推薦。Sublime Text 3真是一款一見鐘情的編輯器,每次和別人聊到編輯器時必薦的。。。

          posted @ 2014-11-11 11:47 Eric_jiang 閱讀(268) | 評論 (0)編輯 收藏

          AngularJS是Google開源的一款JavaScript MVC框架,彌補了HTML在構建應用方面的不足,其通過使用指令(directives)結構來擴展HTML詞匯,使開發者可以使用HTML來聲明動態內容,從而使得Web開發和測試工作變得更加容易。 


           
          AngularJS誕生以來,吸引了大量的目光,也迅速成為了Web開發領域的新寵。本文整理了2013年度一些非常有價值的AngularJS相關教程和資源,如果你想了解AngularJS或正在使用AngularJS,那么這些資源肯定會為你的學習和進階過程帶來幫助。 

          一、了解AngularJS 

          二、中文資源 

          1.  中文系列資源 

          2.  其他單篇文章 

          3.  中文書籍 

          三、英文資源 

          1.  AngularJS入門教程 

          2.  AngularJS指令學習 

          3.  AngularJS應用開發實戰 

          4.  AngularJS游戲開發 

          5.  AngularJS工作流程和測試 

          6.  AngularJS書籍 

          posted @ 2014-10-24 16:37 Eric_jiang 閱讀(185) | 評論 (0)編輯 收藏

          碰到了用java.util.Properties讀取中文內容(UTF-8格式)的配置文件,發生中文亂碼的現象,

           

          Java代碼  收藏代碼
          1. Properties prop=new Properties();         
          2. prop.load(Client.class.getClassLoader().getResourceAsStream("config.properties"));  

           

          習慣性google了一下,網上大多數文章都是讓大家用native2ascii.exe轉換 這樣的解決方案,一開始還差點被懵住了,以為只能使用這樣的繞彎子方法。。。

           

          但關鍵是,太繞了! 如果每次都用native2ascii.exe將中文轉換成\uXXXX\uXXXX這樣的,麻煩先不說,轉換完后的文件完全不可讀?。?!這基本上是不可忍受的!
          (雖然也能用native2ascii.exe轉換回來,但同樣,麻煩?。?br />
          冷靜下來后,突然想起來,還是初學java時看過,java.io包中 Reader/Writer和Stream的區別。
          (年代久遠,具體細節忘記了,大概是:Reader/Write是處理編碼文本的,而InputStream/OutputStream只把數據當作2進制流 )

          正確解決方案

           

          Java代碼  收藏代碼
          1. Properties prop=new Properties();         
          2. prop.load(new InputStreamReader(Client.class.getClassLoader().getResourceAsStream("config.properties"), "UTF-8"));         

           

          其中“UTF-8”,用于明確指定.properties文件的編碼格式(不指定則默認使用OS的,這會造成同一份配置文件同一份代碼,在linux和windows上、英文windows和中文windows之間的表現都不一致),這個參數應該和具體讀取的properties文件的格式匹配。 


          posted @ 2014-10-10 09:39 Eric_jiang 閱讀(4538) | 評論 (0)編輯 收藏

          最近一個項目拿到客戶那運行不了。原來我的這個項目要和另一個系統通過http的接口進行通訊。但在客戶的生產環境中,那套系統將web應用的登錄和Windows Domain的登錄結合,做了一個sso單點登錄(jcifs實現)。那么我必須要修改我的程序,好自動登錄Windows Domain。

            通過抓包分析,局域網使用的是NTLM 協議。

           當通過瀏覽器訪問被NTLM協議保護的資源的時候,NTLM的認證方式和流程如下:

              1: C  --> S   GET ...
              
              2: C <--  S   401 Unauthorized
                            WWW-Authenticate: NTLM
              
              3: C  --> S   GET ...
                            Authorization: NTLM <base64-encoded type-1-message>
              
              4: C <--  S   401 Unauthorized
                            WWW-Authenticate: NTLM <base64-encoded type-2-message>
              
              5: C  --> S   GET ...
                            Authorization: NTLM <base64-encoded type-3-message>
              
              6: C <--  S   200 Ok

           

          Type-1消息包括機器名、Domain

          Type-2消息包括server發出的NTLM challenge

          Type-3消息包括用戶名、機器名、Domain、以及兩個根據server發出的challenge計算出的response,這里response是基于challenge和當前用戶的登錄密碼計算而得

          PS:在第二步時,當瀏覽器接收到一個401 Unauthorized response,會彈出該對話框讓用戶輸入用戶名、密碼。(ie有可能會自動登錄)



          我的程序(client)要和另個程序走http接口通訊(server),server再去ad驗證域登錄



          httpclient 實現NTLM驗證(當然你也可以自己實現協議)

          HttpClient從version 4.1 開始完全支持NTLM authentication protocol(NTLMv1, NTLMv2,  and NTLM2  ),文檔的原話是“The NTLM authentication scheme is significantly more expensive in terms of computational overhead
          and performance  impact  than  the  standard Basic  and Digest  schemes.”

          但是使用起來還是非常的方便的。因為 NTLM 連接是有狀態的,通常建議使用相對簡單的方法觸發NTLM 認證,比如GET或 HEAD, 而重用相同的連接來執行代價更大的方法,特別是它們包含請求實體,比如 POST或 PUT。

          DefaultHttpClient httpclient = new DefaultHttpClient(); 
          NTCredentials creds = new NTCredentials("user", "pwd", 
          "myworkstation", "microsoft.com"); 
          httpclient.getCredentialsProvider().setCredentials(AuthScop
          .ANY, creds); 
          HttpHost target = new HttpHost("www.microsoft.com", 80, 
          "http"); 
          // 保證相同的內容來用于執行邏輯相關的請求 
          HttpContext localContext = new BasicHttpContext(); 
          // 首先執行簡便的方法。這會觸發NTLM認證 
          HttpGet httpget = new HttpGet("/ntlm-protected/info"); 
          HttpResponse response1 = httpclient.execute(target, httpget
          localContext); 
          HttpEntity entity1 = response1.getEntity(); 
          if (entity1 != null) { 
          entity1.consumeContent(); 
          } 
          //之后使用相同的內容(和連接)執行開銷大的方法。 
          HttpPost httppost = new HttpPost("/ntlm-protected/form"); 
          httppost.setEntity(new StringEntity("lots and lots of data"))
          HttpResponse response2 = httpclient.execute(target, httppost,
          localContext); 
          HttpEntity entity2 = response2.getEntity(); 
          if (entity2 != null) { 
          entity2.consumeContent(); 
          } 




          import org.apache.commons.httpclient.ProxyHost;
          import org.apache.http.HttpEntity;
          import org.apache.http.HttpHost;
          import org.apache.http.HttpResponse;
          import org.apache.http.ParseException;
          import org.apache.http.auth.AuthScope;
          import org.apache.http.auth.UsernamePasswordCredentials;
          import org.apache.http.client.ClientProtocolException;
          import org.apache.http.client.HttpClient;
          import org.apache.http.client.methods.HttpGet;
          import org.apache.http.conn.params.ConnRouteParams;
          import org.apache.http.impl.client.DefaultHttpClient;
          import org.apache.http.util.EntityUtils;


                private HttpClient getHttpClient() {

                  DefaultHttpClient httpClient = new DefaultHttpClient();
                  String proxyHost = "";
                  int proxyPort = 8080;
                  String userName = "";
                  String password = "";
                  httpClient.getCredentialsProvider().setCredentials(
                          new AuthScope(proxyHost, proxyPort),
                          new UsernamePasswordCredentials(userName, password));
                  HttpHost proxy = new HttpHost(proxyHost, proxyPort);
                  httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY,
                          proxy);
                  return httpClient;
              }
          posted @ 2014-10-09 11:53 Eric_jiang 閱讀(1470) | 評論 (1)編輯 收藏

          僅列出標題
          共57頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
          主站蜘蛛池模板: 神池县| 甘肃省| 崇仁县| 房山区| 罗定市| 施甸县| 鲁山县| 玉龙| 环江| 进贤县| 高唐县| 巴青县| 军事| 慈溪市| 宜良县| 夏河县| 台南县| 静宁县| 平凉市| 那坡县| 广德县| 乌海市| 昭苏县| 佛坪县| 梅州市| 台江县| 巴彦淖尔市| 西畴县| 宜川县| 孟连| 浙江省| 兴业县| 防城港市| 峡江县| 石景山区| 南靖县| 沙湾县| 枞阳县| 台山市| 闽清县| 西峡县|