背景:
話說年前有個師妹淚眼汪汪,楚楚動情地找我幫她弄個企業網站。
不過那時候,每天都苦B地閃着:“加班中,相信不用多久升職加薪,當上總經理,出任CEO,迎娶白富美,走上人生巔峰,想想還有點小激動呢”。
所以每夜都懶懶地累到不想動,一直拖延到年后,回到廣州才動有了寫代碼的沖動。
想想畢竟是自家師妹,承諾過的還是要還的,所以打算認真負責的花些時間把它整出來。
技術選型:
1:時間考量:
首先這是一個義務型的網站,所以會考慮時間不能占用太多, 盡量滿足基礎功能,比較異想天開的功能先忽略。
整體前后溝通和小調整,歷長1-2周,實際編碼時間,大概24小時內,換算起時間,那也是三個工作日,六個夜晚啊。
2:技術選型:MVC還是WebForm:
A:時間不能占用過多,開發周期不能拉長。
B:個人能臨時提供的服務器是2003,只有.NET 2.0,后期可能會轉移到對方購買的虛擬主機,所以部署要方便。
C:友好的URL並不是對方在乎的。
所以綜合考慮:WebForm。
像MVC,它的優點是:提供簡單友好的URL,對外是一個好的唬頭,MVC架構分層思想對新手是一種引導。
3:數據庫選型:MSSQL?Access?Sqlite?
用MSSQL,在這種簡單的企業站里,大財小用了。
Access:擁有最弱的並發限制,64K,這個在我以前QBlog系列文章里,把它優化上天了,后來還是離開了。
Sqlite:這個需要最高的信任權限,某些虛擬主機商可能會不支持,而且並發能力和Access差不多一個級別。
以我多年的實戰經歷,這里我選擇文本數據庫,這里有幾個重要思考因素。
1:數據量少:少到可以預估的時間內,文章不會超過1千。
2:占用資源少:目前VPS就1G內存,數據庫勉強跑上了sql2000,而且服務器上跑了好幾個項目,不適合把這外部的數據放置到自己的項目中。
3:性能要高,抗並發要強:服務器本身配置很低,如果不能抗並發,隨便用我提供的分布式壓力測試就能搞掉的話,那不坑我自己的服務器。
4:數據的安全性隱私木有要求:這些數據都是可公開的。
綜合上面的考慮,MSSQL,雖然能抗並發,這個吃內存,不行,而Access和Sqlite不抗並發,如果選擇了它們,意味着我必須考慮到整個緩存機制或生成靜態頁面機制,這無疑會加長我的開發時間。
好在我發現了文本數據庫:剛好滿足以上的條件,而且文本數據庫一直在應用,基本上這個企業站也不在話下,所以最后是用上了CodeFirst方式的文本數據庫。
而選擇文本數據庫,經壓力測試,幾千上萬個並發也不是問題,它天然的內存數據庫機制本身就是緩存機制,一次開發,就可以收工了。
實戰開發:
1:美工的界面來源:
首先,她不是美工,我也不會美工,所以,網站需要有參考,好在她給了一款參考網站。
所以,以我的經驗,把對方網站那點皮膚弄下來不是什么問題,所以美工的問題看似就解決了,具體看一眼下圖,發現是很清秀簡潔的:
2:代碼編寫:
由於數據庫選項是文本數據庫,所以基本上就是CodeFirst,定義好業務實體,什么分層,在這里就是浮雲:
Web.Config就這么一行了:
< add name ="Conn" connectionString ="txt path={0}App_Data\db;ts=0" />
</ connectionStrings >
具體運行后產生的數據存儲,就在App_Data下的db文件夾下了,一個表就對應一個文本數據了。
另外考慮到文章的字節大,就單獨隔離出來一個body文件夾來存放文章,代碼也很簡單:
{
public static void Set( int id, string body)
{
string path = AppDomain.CurrentDomain.BaseDirectory + " /App_Data/db/body/ " + id + " .body ";
File.WriteAllText(path, body);
}
public static string Get( int id)
{
string path = AppDomain.CurrentDomain.BaseDirectory + " /App_Data/db/body/ " + id + " .body ";
if (File.Exists(path))
{
return File.ReadAllText(path);
}
return string.Empty;
}
}
紅色那一塊是后台,由於偷工減料,所以就不方便公開名稱。
3:技術點需要思考的地方:
整個網站,基本上都是簡單類似以下的代碼:
{
protected void Page_Load( object sender, EventArgs e)
{
if (!IsPostBack)
{
BindList();
}
}
void BindList()
{
using (ArticleClass a = new ArticleClass())
{
a.Select( " order by orderNum asc ").Bind(rptList);
}
}
}
不過也有一些需要費點腦的:
3.1:左側的分類列表,有的點擊是直接進入到文章詳細,有的點擊是直接進入列表界面:
面對這個問題,有着最開始的設計思維:
A:分類名稱難道是文章的名稱(因為見過的很多基本上都是同名) ?
B:那么要區分顯示在列表還是單獨的,要在文章里加個字段以區別?
中間的過渡思維:
A:分類名稱就是分類名稱?
B:分類名稱上加個字段,以區別點擊是進入指定的某個文章?
最后的決定性思維:
A:分類名稱還是分類名稱。
B:當分類名稱只有一條文章時,地址變為直接指向那篇文章。
3.2:文本編輯器的引入:
一開始我是很偷懶的,用一個文本框來發文章,就想了理了。
后來想想不能懶到這程度,畢竟人家是師妹啊,何況我還單身,所以引入文本編輯器升級一下檔次也是有必要的。
網上可選的編輯種類很多,FCK,King等網上一搜一個堆,不過我還是思考了一下,如果用上這些:
第一,重,隨便一個都幾M起步;
第二,圖片上傳需要自己再折騰,如果運氣不好,研究+實現可能會花上一天時間。
第三:我太懶了,我想最多1小時以內就把它給換完。
我想到以前QBlog里我寫過一個編輯器(改來的),於是直接弄過來,發現原來的代碼和QBlog的開發模式有點結合。
花了幾分鍾,改了點代碼,基本上就能用了,而且重點是文件上傳,基本上小改幾分鍾也適合着用了,省了不少時間。
3.3 產品中心lightBox.js的引入:
這一塊就沒什么好說的了,就是那種一點圖片出來一遮照層,整個背景黑的那種,06年就開始流行的,沒想到現在還用的上。
關於后台:
對於后台,一開始打算用QBlog那種后台方式,或者像EasyUI那種前端,然后搞個CodeSmith批量生成一樣,不過一想到這CS不知道放哪了,光找出來就要不少時間,再說它也不支持我的文本數據庫。
雖然CodeFirst也支持多種數據庫,改個數據庫鏈接就可以轉移到其它數據庫,然后再借CS去生成,不過感覺這轉來轉去的麻煩。
於是,心一橫,就那幾個表,也就幾個界面,還不如手工來的快,於是一個木有樣式,慘不忍睹的界面,只有最簡單的增刪改查邏輯的后台就出來了。
由於后台界面這一塊太丑,就不截圖了,免的亮瞎了大伙的眼睛。
網站預覽(已失效):http://paileju.com
至於源碼,想要來學習的也可以Q我,隨便給。
總結:
到此,基本上就算完工了,搞完之后,收到了師妹寄來的零食,也算是一種回報了,雖然大部分零售是辣的不合我口味,不過還是有不少零售味道還是不錯的,像那個1塊錢1個的肉松餅就很好吃,可是,為啥只買了一個,納尼?
新的一年,要重新賣身了,打算漂泊,城市不限,歡迎大伙推薦買主,謝謝。