web程式設計實踐
一、專案概況
專案簡介:完善部落格功能。
使用技術:PHP、html、css、JavaScript
工具:mysql5.0、Apache2.0、PHP5.0
工作內容:1、查詢部落格文章。文章管理選單下的查詢部落格文章功能。
2、日曆搜尋文章。在首頁的日曆檢索功能。使用者可檢視某天釋出的所有博文標題。功能描述:使用者通過日曆欄選擇具體的日期(年/月/日),所選日期釋出的全部博文按照發布日期倒序排列,在首頁的右側。
3、管理員的文章資訊統計。用於統計所有博文的瀏覽次數、評論次數。列表資訊包括但不限於:博文題目、釋出日期、瀏覽次數、評論次數。結果按照瀏覽次數排序。
二、系統基礎功能的設計與實現
基礎部落格系統的架構設計
功能
部落格主頁:
新增部落格:
查詢部落格文章:
圖片管理:
使用者管理:
公告管理:
三、系統擴充套件功能的設計與實現
1、查詢部落格文章。文章管理選單下的查詢部落格文章功能。
程式碼
1.<tr> 2.<tdheight="223"align="center"valign="top"> 3.<?php 4.if(isset($_POST[sel_key])){ 5.$tj=$_POST[sel_tj]; 6.$key=$_POST[sel_key]; 7. 8.$sql=mysql_query("select*fromtb_articlewhere$tj='$key'"); 9.$result=mysql_fetch_array($sql); 10.//if(mysql_num_rows($rst)==0){ 11.if($result==false){ 12.echo"[<fontcolor=red>對不起,您檢索的文章資訊不存在!</font>]"; 13.} 14.else{ 15.?> 16.<tablewidth="560"border="1"align="center"cellpadding="3"cellspacing="1"bordercolor="#9CC739"bgcolor="#FFFFFF"> 17.<tralign="left"colspan="2"> 18.<tdwidth="390"height="25"colspan="3"valign="top"bgcolor="#EFF7DE"><spanclass="tableBorder_LTR">部落格文章</span></td> 19.</tr> 20.<tdalign="center"valign="top"><tablewidth="480"border="0"cellpadding="0"cellspacing="0"> 21.<tr> 22.<tdheight="100"valign="top"> 23.<?php 24.do{ 25.?> 26.<tablewidth="100%"border="1"cellpadding="1"cellspacing="1"bordercolor="#D6E7A5"bgcolor="#FFFFFF"class="i_table"> 27.<trbgcolor="#FFFFFF"> 28.<tdwidth="14%"align="center">部落格ID號</td> 29.<tdwidth="15%"><?phpecho$result[id];?></td> 30.<tdwidth="11%"align="center">作 31.者</td> 32.<tdwidth="18%"><?phpecho$result[author];?></td> 33.<tdwidth="12%"align="center">發表時間</td> 34.<tdwidth="30%"><?phpecho$result[subtime];?></td> 35.</tr> 36.<trbgcolor="#FFFFFF"> 37.<tdalign="center">部落格主題</td> 38.<tdcolspan="5"><?phpecho$result[title];?></td> 39.</tr> 40.<trbgcolor="#FFFFFF"> 41.<tdalign="center">文章內容</td> 42.<tdcolspan="5"><?phpecho$result[content];?></td> 43.</tr> 44.<trbgcolor="#FFFFFF"> 45.<tdcolspan="3"align="center"><ahref="comment.php?file_id=<?phpecho$result[id];?>">發表評論</a></td> 46.<tdcolspan="3"align="center"> 47.<?php 48.if($_SESSION[fig]==1){ 49.?> 50.<ahref="del_file.php?file_id=<?phpecho$result[id];?>"><imgsrc="images/A_delete.gif"width="52"height="16"alt="刪除部落格文章"onClick="returnd_chk();"></a> 51.<?php 52.} 53.?></td> 54.</tr> 55.</table> 56.<?php 57.}while($result=mysql_fetch_array($sql)); 58.?></td> 59.</tr> 60.</table></td> 61.</table> 62.<?php 63.} 64.} 65.?> 66.</td> 67.</tr>
2、日曆搜尋文章。在首頁的日曆檢索功能。使用者可檢視某天釋出的所有博文標題。功能描述:使用者通過日曆欄選擇具體的日期(年/月/日),所選日期釋出的全部博文按照發布日期倒序排列,在首頁的右側。
程式碼
1.functionpresent_article(){ 2.$sql=mysql_query("select*fromtb_articlewheredate_format(subtime,'%Y-%m')='".$this->year."-".$this->month."'ORDERBYsubtimeDESC"); 3.$result=mysql_fetch_array($sql); 4.echo($result); 5.//echo('".$this->$year."-".$this->$month."') 6.if($result==false){ 7. 8.} 9.else{ 10.?> 11.<tableclass="tableBorder_A"width="0"border="1"align="center"cellpadding="3"cellspacing="1"bordercolor="#f4c871"bgcolor="#FFFFFF"> 12.<tralign="left"colspan="2"> 13.<tdwidth="390"height="25"colspan="3"valign="top"bgcolor="#ffeecc"><spanclass="tableBorder_LTR">Blogpost</span></td> 14.</tr> 15.<tdalign="center"valign="top"><tablewidth="480"border="0"cellpadding="0"cellspacing="0"> 16.<tr> 17.<tdheight="100"valign="top"> 18.<?php 19.do{ 20.?> 21.<tablewidth="100%"border="1"cellpadding="1"cellspacing="1"bordercolor="#ffeecc"bgcolor="#fff7e5"class="i_table1"> 22.<trbgcolor="#fff7e5"> 23.<tdwidth="14%"align="center">ID</td> 24.<tdwidth="15%"><?phpecho$result[id];?></td> 25.<tdwidth="11%"align="center">author</td> 26.<tdwidth="18%"><?phpecho$result[author];?></td> 27.<tdwidth="12%"align="center">Timeofpublication</td> 28.<tdwidth="30%"><?phpecho$result[subtime];?></td> 29.</tr> 30.<trbgcolor="#fff7e5"> 31.<tdalign="center">theme</td> 32.<tdcolspan="5"><?phpecho$result[title];?></td> 33.</tr> 34.<trbgcolor="#fff7e5"> 35.<tdalign="center">content</td> 36.<tdcolspan="5"><?phpecho$result[content];?></td> 37.</tr> 38.</table> 39.<?php 40.}while($result=mysql_fetch_array($sql)); 41.?></td> 42.</tr> 43.</table></td> 44.</table> 45.<?php 46.} 47.}
3、管理員的文章資訊統計。用於統計所有博文的瀏覽次數、評論次數。列表資訊包括但不限於:博文題目、釋出日期、瀏覽次數、評論次數。結果按照瀏覽次數排序。
程式碼
1.<!--瀏覽數-->
2.<?php
3.session_start();//定義session,同一IP登入不累加
4.$filepath='count.txt';//count.txt統計次數
5.//counter()方法用來得到檔案內的數字
6.functioncounter($f_value)
7.{
8.//用w模式開啟檔案時會清空裡面的內容,所以先用r模式開啟,取出檔案內容,儲存到變數
9.$fp=fopen($f_value,'r')ordie('開啟檔案時出錯。');
10.$countNum=fgets($fp,1024);
11.fclose($fp);
12.$countNum++;
13.$fpw=fopen($f_value,'w');
14.fwrite($fpw,$countNum);
15.fclose($fpw);
16.}
17.if($_SESSION['temp']==''){//判斷$_SESSION[temp]的值是否為空,其中的temp為自定義的變數
18.if(!file_exists($filepath)){
19.//檢查檔案是否存在,不存在剛新建該檔案並賦值為0
20.$fp=fopen($filepath,'w');
21.fwrite($fp,0);
22.fclose($fp);
23.counter($filepath);
24.}else{
25.counter($filepath);
26.}
27.$_SESSION['temp']=1;//登入以後,給$_SESSION[temp]賦一個值1
28.}
29.
30.
31.//註釋下面一行可以實現同一IP登入不累加效果,測試時可以開啟
32.//session_destroy();
33.
34.
35.?>
四、實踐心得體會
1.MVC是一種軟體工程中的一種軟體架構模式,把軟體系統劃分為三個基本結構部分,分別是模型(model)、檢視(view)、控制器(controller),所以簡稱為MVC。
其中M(模型)就是業務流程、業務狀態的處理、業務規範的規定。模型接受檢視資料的請求,並返回最終的處理結果。整個model的設計是MVC模式的核心;
V(檢視)是使用者看到的並與之互動的介面資訊,比如:html檔案、jsp檔案、ASP檔案、php檔案等。
而C(控制器):控制器是使用者請求的處理,對使用者的請求提交給模型進行資料的處理,並負責請求的轉發等等。
MVC模式的優點是可以實現顯示模組與功能模組的分離。提高了程式的可維護性、可移植性、可擴充套件性與可重用性,降低了程式開發難度,降低了後期維護的難度;而且使一個模型可以適用於多個檢視中,增加了檢視與控制器的可插拔性;且提高了模型的可移植性,因為模型是獨立於檢視的。
2.約定優於配置,也稱作按約定程式設計,是一種軟體設計正規化,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性。Yii中對於action萬用字元的規範,XyzController.php中若有一個名為 actionEdit() 的方法,那麼體現在網頁URL上,就是是除去action字首的動作函式名。即/xyz/edit。
3.ORM是物件-關係-對映的簡稱。框架採用元資料來描述物件一關係對映細節,元資料一般採用XML格式,並且存放在專門的物件一對映檔案中。它的作用是在關係型資料庫和物件之間作一個對映,這樣,我們在具體的操作資料庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作物件一樣操作它就可以了 。
Active Record模式是軟體裡的一種架構性模式,主要概念是關係型資料庫中的資料在記憶體中以物件的形式儲存。遵循該模式的物件介面一般包括如Insert, Update, 和 Delete這樣的函式,以及對應於底層資料庫表字段的相關屬性。
AR模式是一種訪問資料庫資料的方式。資料表或檢視被對映成一個類。每個物件例項則對應於表的一條記錄。物件被建立後,通過save就可以向表中新添一行記錄。當物件被更新時,表中相應記錄也被更新。這個包裹類通過屬性或方法的形式實現訪問表或檢視中的每一個欄位。
該模式主要被物件持久化工具採用,用於物件關係對映 (ORM). 典型的,外來鍵關係會以合適的物件例項屬性的形式暴露訪問。
4.Gii 是一個強大的程式碼生成器,主要用於後臺程式碼生成。在編寫程式程式碼時,通常每個功能模組的基礎維護程式碼邏輯都相同,只是針對的表不同, 根據這其中的規律做成模板,機器就可以根據模板來生成程式碼了。這樣就避開了那些枯燥的重複勞動,使開發人員將時間和精力集中於核心業務,既節省了開發人員的工作時間,也為企業節省了成本。程式碼生成器通過模板技術解決了傳統的程式碼生成器生成的程式碼比較單一,與本地開發環境不匹配,也打破了對程式語言的限制。缺點在於錯誤會被放大,1個Bug可能會產生許多bug,且程式碼生成器本身就難寫。
程式碼模板的定製:
假設我們想要定製由 model 生成器生成的程式碼。
我們首先建立一個名為 protected/gii/model/templates/compact的目錄。這裡的model意味著將要override預設的model生成器。templates/compact意味著將增加一個新的程式碼模板集名為 compact。
然後在應用程式配置裡把 application.gi增加到GiiModule::generatorPaths。
複製檔案framework/gii/generators/model/templates/default/model.ph到 protected/gii/model/templates/compact。
開啟檔案protected/gii/model/templates/compact/model.php以編輯它。記得這個檔案將作為類似一個檢視檔案被使用,意味著它可以包含 PHP 表示式和語句。讓我們更改模板以便生成的程式碼裡 attributeLabels()方法使用 Yii::t()來翻譯屬性標籤:
public function attributeLabels()
{
return array(
<?php echo "'$name' => Yii::t('application', '$label'),\n"; ?>
);
}
在每個程式碼模板中,可以訪問一些預定義的變數,例如上面例子中的 $labels。這些變數由對應的程式碼生成器提供。不同的程式碼生成器可能在他們的程式碼模板中提供不同的變數。需要認真閱讀預設程式碼模板中的描述。
5.查詢構建器也是建立在 DAO 基礎之上,可讓你建立程式化的、DBMS 無關的 sql 語句,並且這樣建立的 sql 語句比原生的sql 語句更易讀、更安全。而且,一旦你的sql很長,query builder構建的sql語句,可讀性也會更強
6.RBAC是基於角色的訪問控制。在RBAC中,許可權與角色相關聯,使用者通過成為適當角色的成員而得到這些角色的許可權。這就極大地簡化了許可權的管理。這樣管理都是層級相互依賴的,許可權賦予給角色,而把角色又賦予使用者,這樣的許可權設計很清楚,管理起來很方便。RBAC認為授權實際上是Who、What、How三元組之間的關係,也就是Who對What進行How的操作,也就是“主體”對“客體”的操作。Who是許可權的擁有者或主體(如:User,Role)。What是操作或物件。How:具體的許可權(Privilege,正向授權與負向授權)。對系統操作的各種許可權不是直接授予具體的使用者,而是在使用者集合與許可權集合之間建立一個角色集合。每一種角色對應一組相應的許可權。一旦使用者被分配了適當的角色後,該使用者就擁有此角色的所有操作許可權。這樣做的好處是,不必在每次建立使用者時都進行分配許可權的操作,只要分配使用者相應的角色即可,而且角色的許可權變更比使用者的許可權變更要少得多,這樣將簡化使用者的許可權管理,減少系統的開銷。角色在使用者和許可權間起到橋樑作用。
7.Bootstrap有移動裝置優先的特點,自 Bootstrap 3 起,框架包含了貫穿於整個庫的移動裝置優先的樣式。而且所有的主流瀏覽器都支援 Bootstrap。 Bootstrap 的響應式 CSS 能夠自適應於桌上型電腦、平板電腦和手機。更多有關響應式設計的內容詳見 Bootstrap 響應式設計。為開發人員建立介面提供了一個簡潔統一的解決方案。它包含了功能強大的內建元件,易於定製。它還提供了基於 Web 的定製。且是開源的。可以定製 Bootstrap 的元件、LESS 變數和 jQuery 外掛來得到自己的版本。
8.UrlRewrite技術可以滿足搜尋引擎的要求某些搜尋引擎不能支援動態頁面的抓取,大量的資訊就不能被潛在使用者搜尋到。UrlRewrite技術可以使其被搜尋引擎收錄了。隱藏技術實現,提高網站的移植性。每個頁面都掛著鮮明的.asp/.jsp這種開發語言的標記,可以一眼讓人看出你的網站使用什麼語言做的。而且在改變網站的語言的時候,你需要改動大量的連結。而且,一個頁面修改了副檔名,他的pagerank也會隨之消失,從頭開始。我們可以用UrlRewrite技術隱藏我們的實現細節,這樣修改移植都很方便,而且完全不損失pagerank。滿足美感的要求
URL rewrite實現機制是首先獲得一個進入的URL請求然後把它重新寫成網站可以 處理的另一個URL的過程。舉個例子來說,如果通過瀏覽器進來的URL是 “UserProfile.aspx?ID=1”那麼它可以被重寫成 “UserProfile/1.aspx”,這樣的URL, 這樣的網址可以更好的被網站所閱讀。或者把會話ID附加在HTML頁面中所有的 URL上,這些頁面作為響應傳送給客戶。這樣,當用戶單擊URL時,會話ID被自 動作為請求行的一部分而不是作為頭行傳送回伺服器。
9.瀏覽器快取機制就是把一個已經請求過的Web資源(如html頁面,圖片,js,資料等)拷貝一份副本儲存在瀏覽器中。使用快取可以減少網路頻寬消耗,可以有效的降低運營成本。同時可以降低伺服器壓力,給網路資源設定有效期之後,使用者可以重複使用本地的快取,減少對源伺服器的請求,間接降低伺服器的壓力。同時,搜尋引擎的爬蟲機器人也能根據過期機制降低爬取的頻率,也能有效降低伺服器的壓力。最後可以減少網路延遲,加快頁面開啟速度,達到更好的體驗。
快取會根據進來的請求儲存輸出內容的副本。當下一個請求來到的時候,如果是相同的URL,快取會根據快取機制決定是直接使用副本響應訪問請求,還是向源伺服器再次傳送請求。比較常見的就是瀏覽器會快取訪問過網站的網頁,當再次訪問這個URL地址的時候,如果網頁沒有更新,就不會再次下載網頁,而是直接使用本地快取的網頁。只有當網站明確標識資源已經更新,瀏覽器才會再次下載網頁。