2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩109頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、【中級篇】項目二:內(nèi)容管理系統(tǒng),模塊五 后臺功能實現(xiàn),MySQL安裝與使用HTTP、會話技術(shù),PHP操作數(shù)據(jù)庫文件、圖像技術(shù),,,,,,,任務(wù)一,任務(wù)二,任務(wù)三,項目準備,管理員登錄,欄目管理,,,,,任務(wù)四,任務(wù)五,文章管理,排序與搜索,,,任務(wù)五,分頁導航,目錄,在項目開發(fā)的初始階段,先進行項目的目錄結(jié)構(gòu)劃分,才能合理、規(guī)范地管理項目中的各種文件。根據(jù)功能模塊劃分,本項目的目錄結(jié)構(gòu)如下所示。,,,項目初始化,任務(wù)一:項目準備,,

2、,項目初始化,任務(wù)一:項目準備,,,項目初始化,項目首先分成了前臺和后臺兩個平臺將common和upload目錄作為前后臺公共目錄后臺相關(guān)的文件全部放到了admin目錄中從而在目錄結(jié)構(gòu)上對前后臺進行了區(qū)分,任務(wù)一:項目準備,,,項目初始化,在完成目錄劃分后,接下來為項目的前后臺創(chuàng)建初始化文件,為項目定義一些基礎(chǔ)的常量,方便在項目中使用。,任務(wù)一:項目準備,,,項目初始化,為前臺創(chuàng)建初始化文件init.php定義常量APP_DEB

3、UG,用于表示是否開啟調(diào)試,其值可以為true和false。當開啟時將提示完整的錯誤信息以便于調(diào)試,否則只進行簡單的錯誤提示。定義常量COMMON_PATH和UPLOAD_PATH,用于表示公共文件目錄和上傳文件目錄的路徑。從前臺進行訪問時,從當前目錄“./”開始。,任務(wù)一:項目準備,,,項目初始化,為后臺創(chuàng)建初始化文件admin\init.php定義常量APP_DEBUG,用于表示是否開啟調(diào)試,其值可以為true和false。當

4、開啟時將提示完整的錯誤信息以便于調(diào)試,否則只進行簡單的錯誤提示。定義常量COMMON_PATH和UPLOAD_PATH,用于表示公共文件目錄和上傳文件目錄的路徑。從后臺進行訪問時,從上級目錄“../”開始。,任務(wù)一:項目準備,,,函數(shù)庫與配置文件,——函數(shù)庫,在項目開發(fā)時,有許多常用的功能可以通過函數(shù)來完成,因此應(yīng)該為項目創(chuàng)建一個函數(shù)庫,保存項目中的常用函數(shù)。常用函數(shù)的名稱,通過一個大寫字母的命名風格,既書寫方便,又便于程序閱讀。

5、,任務(wù)一:項目準備,,,函數(shù)庫與配置文件,——函數(shù)庫,在common目錄中創(chuàng)建文件function.php,編寫一個“E()”函數(shù)。,函數(shù)名是英文單詞“error”的首字母縮寫,表示程序遇到錯誤。該函數(shù)有兩個參數(shù)$msg和$debug,參數(shù)$debug的默認值為空字符串該函數(shù)的參數(shù)$msg表示錯誤信息,$debug表示調(diào)試信息當開啟調(diào)試時,顯示錯誤信息和調(diào)試信息,而關(guān)閉調(diào)試時,只顯示錯誤信息在完成編寫函數(shù)庫后,接下來在項目的初始

6、化文件中載入函數(shù)庫,任務(wù)一:項目準備,,,函數(shù)庫與配置文件,——配置文件,在項目中通常有一些常用的配置,如數(shù)據(jù)庫連接信息,使用獨立的配置文件來保存配置可以使代碼更利于維護。,任務(wù)一:項目準備,,,函數(shù)庫與配置文件,——配置文件,接下來在common目錄中創(chuàng)建配置文件config.php,保存數(shù)據(jù)庫的連接信息。,在config.php中,直接返回數(shù)組,數(shù)組中的元素用于設(shè)置項目的配置信息DB_CONNECT元素的值是一個數(shù)組,用于保存數(shù)據(jù)

7、庫的連接信息,如數(shù)據(jù)庫服務(wù)器地址、用戶名、密碼、默認數(shù)據(jù)庫和端口號。DB_CHARSET元素用于保存數(shù)據(jù)庫字符集,任務(wù)一:項目準備,,,函數(shù)庫與配置文件,——訪問配置文件,完成配置文件common\config.php的創(chuàng)建后,接下來還需要對配置文件進行訪問。,任務(wù)一:項目準備,,,函數(shù)庫與配置文件,——訪問配置文件,在函數(shù)庫文件common\function.php中編寫函數(shù)C()實現(xiàn)此功能。,函數(shù)名是英文字母“config”的首字

8、母縮寫,表示訪問程序的設(shè)置。參數(shù)$name表示待訪問的數(shù)組元素,如DB_CONNECT。在C()函數(shù)中設(shè)置靜態(tài)變量$config,用于保存項目配置信息判斷$config是否為null,若為null,則載入配置文件判斷要獲取的配置信息是否存在,若不存在賦值為空字符串返回要獲取的配置信息,任務(wù)一:項目準備,,,,函數(shù)庫與配置文件,——示例演示,在后臺初始化文件admin\init.php中,添加以下代碼用于測試函數(shù)的使用。,//訪

9、問數(shù)據(jù)庫連接信息$config = C('DB_CONNECT');echo $config['host']; //輸出結(jié)果:localhost//訪問數(shù)據(jù)庫字符集echo C('DB_CHARSET'); //輸出結(jié)果:utf8,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),在基于數(shù)據(jù)庫的項目中,對數(shù)據(jù)庫的操作是非常頻繁的,因此可以利用函數(shù)將這部分代碼提取出來,以方便后續(xù)的代碼編寫。

10、接下來在common目錄中創(chuàng)建db.php,保存數(shù)據(jù)庫的常見操作函數(shù),任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——連接數(shù)據(jù)庫,編寫db_connect()函數(shù),用于完成數(shù)據(jù)庫連接和設(shè)置字符集操作設(shè)置靜態(tài)變量$link用于保存數(shù)據(jù)庫連接實現(xiàn)函數(shù)第一次調(diào)用時進行數(shù)據(jù)庫連接實現(xiàn)函數(shù)執(zhí)行后返回數(shù)據(jù)庫連接$link,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——執(zhí)行SQL語句,在完成數(shù)據(jù)庫連接后接下來就可以執(zhí)行SQL語句。由于MySQLi擴展提供的預處

11、理語句更加高效和安全,因此在項目中執(zhí)行SQL語句時,將通過預處理來實現(xiàn)。,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——執(zhí)行SQL語句,編寫函數(shù)db_query(),完成SQL語句的預處理操作該函數(shù)的參數(shù)依次為SQL語句、數(shù)據(jù)格式和數(shù)據(jù)內(nèi)容。其中,數(shù)據(jù)格式的默認值為空字符串、數(shù)據(jù)內(nèi)容的默認值為空數(shù)組。獲取數(shù)據(jù)庫連接后,利用mysqli_prepare()預處理SQL語句,獲取$stmt數(shù)據(jù)內(nèi)容為空,利用mysqli_stmt_execut

12、e()直接執(zhí)行SQL語句。數(shù)據(jù)內(nèi)容不為空,則執(zhí)行自定義函數(shù)db_bind_param()進行參數(shù)綁定后,再執(zhí)行SQL語句最后返回預處理結(jié)果$stmt,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——執(zhí)行SQL語句,編寫函數(shù)db_bind_param(),完成SQL語句的參數(shù)綁定該函數(shù)的參數(shù)依次$stmt、數(shù)據(jù)格式和引用傳遞的數(shù)據(jù)內(nèi)容利用$params保存預處理函數(shù)mysqli_stmt_bind_param()需要的每個參數(shù)首先依次保存

13、前兩個參數(shù)$stmt和數(shù)據(jù)格式由于mysqli_stmt_bind_param()的參數(shù)綁定需要引用傳參,因此通過遍歷數(shù)據(jù)內(nèi)容,為每個參數(shù)創(chuàng)建引用,并依次賦值給$param最后調(diào)用mysqli_stmt_bind_param()函數(shù)完成參數(shù)的綁定,任務(wù)一:項目準備,,,,數(shù)據(jù)庫函數(shù),——示例演示,//準備SQL語句$sql = 'INSERT INTO `cms_category` (`name`, `sort`) VAL

14、UES (?, ?)';//執(zhí)行SQL語句db_query($sql, 'si', ['test', 0]);,第二個參數(shù)‘si’,表示插入數(shù)據(jù)的類型s表示字符串i表示整型,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——批量操作,在db_query()函數(shù)中,第3個參數(shù)用于傳入數(shù)據(jù)內(nèi)容,目前只支持一維數(shù)組。MySQLi擴展的預處理機制還可以實現(xiàn)批量操作。因此,還可以改進db_query()函數(shù),

15、當傳入數(shù)據(jù)內(nèi)容是二維數(shù)組時,自動進行批量操作。,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——批量操作,在db_query()函數(shù)實現(xiàn)參數(shù)綁定的位置進行修改首先進行預處理操作的參數(shù)綁定并執(zhí)行預處理操作然后刪除執(zhí)行完的數(shù)據(jù)最后批量執(zhí)行剩余的其他數(shù)據(jù),任務(wù)一:項目準備,,,,數(shù)據(jù)庫函數(shù),——示例演示,//準備SQL語句$sql = 'INSERT INTO `cms_category` (`name`, `sort`) VALUES

16、 (?, ?)';//準備數(shù)據(jù)$data = [['aa', 1], ['bb', 12], ['cc', 30]];//執(zhí)行SQL語句db_query($sql, 'si', $data);,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——其他數(shù)據(jù)庫操作,在數(shù)據(jù)庫操作中,除了執(zhí)行SQL語句,還需要處理結(jié)果集、獲取受影響行數(shù)、獲取最后插入的ID等后續(xù)操作。接下來繼續(xù)完

17、善數(shù)據(jù)庫操作函數(shù)。,任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),——其他數(shù)據(jù)庫操作,定義常用常量,用于表示后續(xù)的具體操作定義函數(shù)db_fetch(),處理有結(jié)果集的SQL語句;定義函數(shù)db_exec(),處理沒有結(jié)果集的SQL語句。兩個函數(shù)的參數(shù)依次為后續(xù)的操作,SQL語句,數(shù)據(jù)格式和數(shù)據(jù)內(nèi)容最后結(jié)合switch語句根據(jù)不同的操作,執(zhí)行不同的處理函數(shù),任務(wù)一:項目準備,,,數(shù)據(jù)庫函數(shù),,——示例演示,// ① 查詢數(shù)據(jù),獲得保存所有結(jié)果的關(guān)

18、聯(lián)數(shù)組$data = db_fetch(DB_ALL, 'SELECT * FROM `cms_category`');var_dump($data);// ② 插入數(shù)據(jù),獲得最后插入的ID$sql = 'INSERT INTO `cms_category` (`name`, `sort`) VALUES (?, ?)';$id = db_exec(DB_LASTID, $sql, 's

19、i', ['test', 0]);echo $id;,任務(wù)一:項目準備,,,輸入過濾函數(shù),在項目開發(fā)中,對于$_GET、$_POST數(shù)組的訪問是非常頻繁的,但是這兩個數(shù)組保存的是來自外部提交的數(shù)據(jù),如果直接進行訪問,會帶來安全隱患。因此,通過函數(shù)來統(tǒng)一接收外部變量,可以使項目代碼更加嚴謹和規(guī)范。接下來,在common\function.php中編寫I()函數(shù)用于接收外部變量。,任務(wù)一:項目準備,,,輸入過濾函

20、數(shù),該函數(shù)名取自英文單詞“input”的首字母,表示輸入。該函數(shù)的參數(shù)依次為需要處理的變量名、接收方法、數(shù)據(jù)類型、默認值根據(jù)接收方法確定數(shù)據(jù)變量使用哪種接收類型通過isset()判斷接收的數(shù)據(jù)變量是否存在,若不存在將其值設(shè)為默認值結(jié)合switch和數(shù)據(jù)類型進行不同的過濾處理,具體有字符串型、html轉(zhuǎn)義、整數(shù)、無符號整數(shù)、頁碼、浮點數(shù)、布爾型、數(shù)組型。,任務(wù)一:項目準備,,,輸入過濾函數(shù),結(jié)合htmlspecialchars()

21、函數(shù)把一些預定義的 HTML 實體轉(zhuǎn)換為字符,并設(shè)置第二個參數(shù)ENT_QUOTES完成對單引號和雙引號的轉(zhuǎn)義操作。結(jié)合trim()函數(shù)去除字符串首尾處的空白字符(或者其他字符)結(jié)合str_replace()函數(shù)將字符串中的空格替換成 ,其中,在對數(shù)據(jù)進行HTML特殊字符轉(zhuǎn)義時,為方便管理和操作,接下來在common\function.php中實現(xiàn)該函數(shù)toHTML()。具體思路如下:,任務(wù)一:項目準備,,,,輸入過

22、濾函數(shù),——示例演示,,// ① POST方式$_POST['name'] = '測試';$name = I('name', 'post', 'html');echo $name; //輸出結(jié)果:測試<文本>,// ② GET方式$_GET['id'] = '123abc';$id =

23、I('id', 'get', 'id');echo $id; //輸出結(jié)果:123,任務(wù)一:項目準備,,,,后臺頁面布局,下面開始進入網(wǎng)站后臺頁面的開發(fā)。在設(shè)計后臺頁面時,通常使用“品”字形的頁面布局,此布局的具體結(jié)構(gòu)如圖。,,top是頁面的頂部,通常用于顯示系統(tǒng)名稱、相關(guān)鏈接;nav是頁面的左側(cè)導航菜單,后臺中的各個功能模塊通過這個菜單進入;content是頁面內(nèi)容,根據(jù)當前訪問

24、的功能而改變。,任務(wù)一:項目準備,,,后臺頁面布局,,在admin\view目錄中創(chuàng)建后臺的布局文件layout.html,頁面頂部和左側(cè)導航標簽中添加響應(yīng),頁面內(nèi)容部分嵌套一個框架,用于動態(tài)改變內(nèi)容創(chuàng)建后臺首頁admin\index.php,載入后臺初始化文件和布局文件接下來在當前目錄下,創(chuàng)建admin\cp_index.php文件,載入后臺首頁信息創(chuàng)建文件admin\view\index.html,該文件是后臺首頁的HTML模

25、板文件,任務(wù)一:項目準備,,,后臺頁面布局,,——后臺頁面布局展示圖,任務(wù)一:項目準備,,,,實現(xiàn)管理員登錄,,——添加管理員信息,在管理員表中添加初始數(shù)據(jù),具體字段應(yīng)包括ID、用戶名和密碼,SQL語句如下。,INSERT INTO `cms_admin` VALUES (1, 'admin', '123456');,任務(wù)二:管理員登錄,,,,實現(xiàn)管理員登錄,,——創(chuàng)建后臺登錄表單,在后臺admin\vi

26、ew中創(chuàng)建后臺用戶登錄的HTML表單login.html。,用戶名:密 碼: ,任務(wù)二:管理員登錄,,,實現(xiàn)管理員登錄,,——載入數(shù)據(jù)庫操作函數(shù),修改前后臺的初始化文件admin\init.php,載入數(shù)據(jù)庫操作函數(shù)db.php。將數(shù)據(jù)庫操作函數(shù)載入后,在項目中就可以使用來自db.php中的函數(shù)。,任務(wù)二:管理員登錄,,,實現(xiàn)管理員登錄,,——接收登錄表單,創(chuàng)建后臺登錄文件admin\login.ph

27、p,實現(xiàn)載入HTML模板顯示登錄頁面,當接收到提交的登錄表單時處理表單。,任務(wù)二:管理員登錄,,,實現(xiàn)管理員登錄,,——接收登錄表單,載入后臺初始化文件init.php和表單模板文件login.html通過if與$_POST處理提交后的表單內(nèi)容在處理表單時,先通過I()函數(shù)接收用戶名和密碼,到數(shù)據(jù)庫中查詢信息,然后取出密碼后進行驗證。如果驗證通過,則將用戶登錄信息保存到Session中,然后利用自定義redirect()函數(shù)跳轉(zhuǎn)到

28、后臺首頁index.php如果驗證失敗,則調(diào)用E()函數(shù)停止程序繼續(xù)執(zhí)行。,任務(wù)二:管理員登錄,,,,實現(xiàn)管理員登錄,,——接收登錄表單,接下來在common\function.php中編寫用于實現(xiàn)頁面跳轉(zhuǎn)的redirect()函數(shù)。,function redirect($url){ header("Location:$url"); //重定向到目標URL地址 exit;},任務(wù)二:管理

29、員登錄,,,頁面信息提示,,當PHP處理用戶提交表單時,如果在處理過程中發(fā)生了成功或失敗的信息,應(yīng)該以友好的提示信息在頁面中顯示。為了利于程序的維護,可以將載入HTML頁面的代碼放到一個函數(shù)中,通過調(diào)用函數(shù)的方式來決定程序在什么情況下顯示頁面。,任務(wù)二:管理員登錄,,,頁面信息提示,,——編寫顯示頁面的函數(shù),接下來在admin\login.php中編寫display()函數(shù),將載入HTML模板的代碼放到函數(shù)中。,,function d

30、isplay($msg=null){ require './view/login.html'; exit; },任務(wù)二:管理員登錄,,,頁面信息提示,,——在頁面中輸出提示信息,編輯后臺登錄頁面admin\view\login.html,在頁面中添加元素用于顯示信息提示。,,,任務(wù)二:管理員登錄,,,頁面信息提示,,——在頁面中輸出提示信息,在common\function.php中編

31、寫該函數(shù)tips()輸出提示信息。,,function tips($msg=null){ if(!$msg){ return ''; //沒有提示信息時直接返回空字符串 } return $msg[0] ? "$msg[1]" : "$msg[1]";},tips()函數(shù)的參數(shù)$msg用于傳入一個數(shù)組,數(shù)組的第1個元素表示成功或失敗第2個元

32、素是表示提示信息當省略參數(shù)$msg,或$msg為空時,直接返回空字符串,表示沒有提示信息,任務(wù)二:管理員登錄,,,頁面信息提示,,——顯示頁面并提示信息,在完成信息提示功能后,修改admin\login.php中登錄失敗的提示代碼,,//修改前的代碼://E('登錄失?。河脩裘蛎艽a錯誤。');,,//修改后的代碼:display([false, '登錄失?。河脩裘蛎艽a錯誤。']);,任務(wù)二:管理

33、員登錄,,,,頁面信息提示,,——沒有表單提交時顯示頁面,在完成創(chuàng)建display()函數(shù)后,當沒有表單提交時,應(yīng)顯示登錄頁面,if($_POST){ //有表單提交時,處理表單……}else{ //沒有表單提交時,顯示登錄頁面 display();},任務(wù)二:管理員登錄,,,頁面信息提示,,——效果展示,任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,在實現(xiàn)了用戶登錄功能后,還需要判斷用戶是否登錄,如果

34、沒有登錄則提示用戶進行登錄,并阻止用戶訪問本來的功能。,任務(wù)二:管理員登錄,,,,判斷登錄狀態(tài),,在后臺中,Session操作是項目中的公共功能,為了更好地維護項目中的Session,可以在初始化文件中統(tǒng)一開啟Session,并為項目中的Session創(chuàng)建前綴。修改文件admin\init.php,具體如下:,——開啟Session,//啟動sessionsession_start();//為項目創(chuàng)建Session,統(tǒng)一保存到cms

35、中if(!isset($_SESSION['cms'])){ $_SESSION = ['cms' => []];},任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,接下來在admin\init.php中繼續(xù)編寫代碼,實現(xiàn)檢查用戶登錄。,——檢查用戶登錄,判斷是否已經(jīng)定義了NO_CHECK_LOGIN常量如果沒有定義則檢查用戶是否登錄,如果已經(jīng)定義了則不檢查用戶是否登錄當用戶登錄時,取出

36、用戶信息保存到變量$user中如果沒有登錄則跳轉(zhuǎn)到登錄頁面login.php并停止腳本繼續(xù)執(zhí)行當其他腳本載入這個文件時,就會自動判斷用戶是否登錄,而如果不需要判斷登錄,則在載入admin\init.php之前,先定義NO_CHECK_LOGIN常量。,任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,在admin\login.php文件中,當用戶登錄成功時,將用戶信息(ID和用戶名)保存到了Session中。在admin\init.php中

37、判斷用戶是否登錄,如果已經(jīng)登錄,則從Session中取出用戶信息,保存到$user中。當用戶登錄成功后進入后臺首頁時,可通過輸出$user將用戶名顯示在頁面中。,——顯示當前登錄的用戶名,任務(wù)二:管理員登錄,,,判斷登錄狀態(tài),,——效果展示,任務(wù)二:管理員登錄,,,登錄驗證碼,,在開發(fā)管理員登錄功能時,還要考慮一個問題,就是除了瀏覽器,其他軟件也可以向服務(wù)器提交數(shù)據(jù)。從系統(tǒng)安全的角度看,如果使用軟件自動大批量向服務(wù)器提交表單,那么管

38、理員的用戶名、密碼將會被窮舉出來,導致管理員賬號被盜取。為此,驗證碼就是一種防御的手段。,任務(wù)二:管理員登錄,,,登錄驗證碼,,通常情況下,驗證碼是一張帶有文字的圖片,要求用戶輸入圖中的文字。對于圖片中的文字,人類識別非常容易,而軟件識別非常困難。因此,驗證碼是一種區(qū)分人類和計算機的程序。接下來,就在項目中實現(xiàn)驗證碼的功能。,任務(wù)二:管理員登錄,,,登錄驗證碼,,——生成驗證碼文本,在項目中創(chuàng)建common\captcha.php,該

39、文件用于保存驗證碼相關(guān)的函數(shù)。,編寫captcha_create()函數(shù),用于生成指定位數(shù)的驗證碼該函數(shù)有一個參數(shù),用于表示生成文本的位數(shù),默認值為5從$charset字符串中隨機取出$count個字符,保存到$code中調(diào)用該函數(shù)后,返回生成的驗證碼文本,任務(wù)二:管理員登錄,,,登錄驗證碼,,——生成驗證碼圖像,通過PHP提供的GD庫擴展,可以繪制一張圖片。在繪制圖片時,可以將文本寫入到圖片中。,任務(wù)二:管理員登錄,,,登錄驗證

40、碼,,——生成驗證碼圖像,在common\captcha.php中繼續(xù)編寫代碼,實現(xiàn)輸出驗證碼圖像的函數(shù)。,編寫captcha_show()函數(shù),用于驗證碼圖像該函數(shù)有一個參數(shù),用于表示驗證碼文本創(chuàng)建圖片資源,隨機生成背景顏色,設(shè)置字體顏色和樣式生成指定長度的驗證碼添加8個干擾線和250個噪點向瀏覽器輸出PNG格式的驗證碼圖片,任務(wù)二:管理員登錄,,,登錄驗證碼,,——調(diào)用驗證碼函數(shù),在完成了驗證碼文本和圖像生成的函數(shù)后,接下

41、來在后臺中調(diào)用函數(shù)顯示驗證碼。,創(chuàng)建文件admin\captcha.php,完成驗證碼函數(shù)的調(diào)用載入驗證碼函數(shù)文件common\captcha.php生成驗證碼值輸出驗證碼圖像,將驗證碼保存到Session中,任務(wù)二:管理員登錄,,,登錄驗證碼,,——顯示驗證碼,在完成驗證碼的調(diào)用后,接下來在后臺管理員登錄的表單中顯示驗證碼。修改登錄表單admin\view\login.html,在表單中使用載入驗證碼圖片。,,驗證碼:,任務(wù)二

42、:管理員登錄,,,登錄驗證碼,,——效果展示,任務(wù)二:管理員登錄,,,登錄驗證碼,,——判斷驗證碼,在用戶提交表單后,在判斷用戶名和密碼之前,應(yīng)該先判斷驗證碼是否正確。如果驗證碼有誤,則沒有必要繼續(xù)判斷用戶名和密碼。,任務(wù)二:管理員登錄,,,登錄驗證碼,,——判斷驗證碼,通過I()函數(shù)獲取用戶輸入的驗證碼載入驗證碼函數(shù)調(diào)用自定義函數(shù)checkCode()驗證用戶輸入的驗證碼是否正確若驗證錯誤,則顯示驗證碼驗證失敗若驗證正確,接著

43、繼續(xù)驗證用戶名和密碼是否正確,任務(wù)二:管理員登錄,,,登錄驗證碼,,——判斷驗證碼,接著自定義函數(shù)checkCode()該函數(shù)的參數(shù)是用戶輸入的驗證碼$code接著取出保存到Session中的驗證碼$captcha 在$captcha 不為空的情況下,為防止重復驗證,清除驗證碼在不區(qū)分大小寫的情況下,返回$code和$captcha 的比較結(jié)果在$captcha 為空的情況下,直接返回false,任務(wù)二:管理員登錄,,,,退出

44、登錄,,在完成管理員登錄功能后,還需要開發(fā)管理員退出功能。編輯admin\view\layout.html文件,在顯示用戶信息的位置,添加一個退出登錄的鏈接。,您好,前臺首頁退出,任務(wù)二:管理員登錄,,,退出登錄,,接下來在admin\login.php中接收參數(shù),實現(xiàn)退出功能。,,//接收操作參數(shù)$action = I('a', 'get', 'string');//執(zhí)行操作

45、if($action=='logout'){ //退出登錄 unset($_SESSION['cms']['admin']); //清除Session display([true, '您已經(jīng)成功退出。']);},任務(wù)二:管理員登錄,,,,讀取欄目,,——準備測試數(shù)據(jù),在管理員登錄后,就可以對欄目進行管理。在項目數(shù)據(jù)庫中,為欄目表添加測試數(shù)據(jù),用

46、于讀取欄目功能的開發(fā)。添加測試數(shù)據(jù)的SQL語句如下。,INSERT INTO `cms_category` (`id`, `pid`, `name`, `sort`) VALUES(1, 0, 'PHP', 0), (2, 0, 'Java', 1), (3, 1, 'PHP基礎(chǔ)', 0),(4, 1, 'PHP高級', 1);,任務(wù)三:欄目管理,,,讀取欄目,,—

47、—讀取欄目數(shù)據(jù),在項目中,讀取欄目數(shù)據(jù)的需求可能會頻繁出現(xiàn),因此將此功能寫在函數(shù)中。在common目錄下創(chuàng)建文件module.php,用于保存和數(shù)據(jù)相關(guān)的功能模塊函數(shù)。,任務(wù)三:欄目管理,,,讀取欄目,,——讀取欄目數(shù)據(jù),定義函數(shù)module_category(),用于獲取欄目列表該函數(shù)的參數(shù)$mode表示索引方式:id 或 pid,默認返回兩種格式定義一個靜態(tài)變量$result,用于緩存查詢結(jié)果當?shù)谝淮握{(diào)用函數(shù)時,到數(shù)據(jù)庫中獲取

48、數(shù)據(jù),并分別根據(jù)id和pid創(chuàng)建數(shù)組索引,方便查找。最后根據(jù)索引方式返回查詢結(jié)果,任務(wù)三:欄目管理,,,編輯欄目,,——輸出已有欄目,在項目中創(chuàng)建cp_category.php文件,該文件用于讀取欄目數(shù)據(jù)顯示在HTML模板中。,在該文件中載入初始化文件接著定義display()函數(shù),顯示頁面從數(shù)據(jù)庫中根據(jù)pid取出數(shù)據(jù),載入HTML模板文admin\view\cateogory.html調(diào)用函數(shù)display(),任務(wù)三:欄目管

49、理,,,編輯欄目,,——輸出已有欄目,接下來編寫用于顯示欄目的admin\view\cateogory.html文件。為了提高后臺管理的操作效率,可以將欄目顯示、添加、修改功能都在一個頁面中完成。,pid的頂級分類為0外層循環(huán)輸出頂級欄目接著判斷該分類下是否存在子欄目,若存在則循環(huán)輸出,任務(wù)三:欄目管理,,,編輯欄目,,——效果展示,任務(wù)三:欄目管理,,,編輯欄目,,——添加欄目,在完成已有欄目的輸出后,還需要開發(fā)欄目添加功能,在實

50、現(xiàn)欄目添加時,為了更直觀地在頁面中添加欄目和子欄目,這里通過jQuery實現(xiàn)了頁面的靈活處理。編輯admin\view\cp_category.html文件,在頁面底部添加JavaScript代碼如下。,任務(wù)三:欄目管理,,,編輯欄目,,——添加欄目,當單擊頁面中的class屬性為jq-add的元素時,就會觸發(fā)點擊事件在該元素的前面添加HTML內(nèi)容,內(nèi)容是添加新欄目的輸入框?qū)τ谔砑颖韱蔚膎ame屬性,這里使用了名稱為add的二維數(shù)

51、組,其外層用于區(qū)分多個添加的內(nèi)容,內(nèi)層是sort、name、pid三個字段由于是頂級欄目,所以pid的值為0,① 頂級分類欄目添加,任務(wù)三:欄目管理,,,編輯欄目,,——添加欄目,當單擊頁面中的class屬性為jq-sub-add的元素時,就會觸發(fā)點擊事件為“添加子欄目”元素添加data-id屬性,用于保存子欄目的上級欄目ID。添加子欄目的事件函數(shù)中應(yīng)該先獲取到此ID,然后保存到隱藏域的pid字段中。,② 二級分類欄目添加,任務(wù)三

52、:欄目管理,,,編輯欄目,,——效果展示,任務(wù)三:欄目管理,,,批量保存,,接收表單 調(diào)用addData()函數(shù)添加欄目,調(diào)用saveData()函數(shù)修改欄目 實現(xiàn)接收表單并處理批量添加 添加欄目的信息保存在了add二維數(shù)組中 利用I()函數(shù)接收數(shù)組后保存到數(shù)據(jù)庫中即可批量修改 批量修改的實現(xiàn)方式和批量添加類似 在接收表單時,修改欄目的信息保存在了save數(shù)組中,任務(wù)三:欄目管理,,,修改層級,,添加編輯鏈接 為

53、每個欄目添加“編輯”超鏈接,鏈接到cp_category_edit.php文件 同時,傳遞參數(shù)ID,表示編輯指定ID的欄目取出指定欄目信息先取出待編輯欄目的信息,然后取出所有頂級欄目信息保存信息 在admin\cp_category_edit.php中接收表單數(shù)據(jù),將信息保存到數(shù)據(jù)庫中,任務(wù)三:欄目管理,,,刪除欄目,,添加刪除鏈接在開發(fā)刪除功能時,為了防止誤操作,在執(zhí)行操作前進行彈框提示執(zhí)行操作判斷待刪除欄目下是否有子

54、級欄目,若有則不執(zhí)行刪除操作;若沒有則刪除,任務(wù)三:欄目管理,,,刪除欄目,,——效果展示,任務(wù)三:欄目管理,,,刪除欄目,,——令牌保護,在前面實現(xiàn)刪除功能時,通過一個URL地址直接實現(xiàn)了刪除數(shù)據(jù),然而這種方式在Web開發(fā)中存在安全隱患。當管理員在登錄系統(tǒng)的狀態(tài)下進行其他操作時,如果訪問了其他用戶惡意構(gòu)造的危險URL地址,就會導致后臺的操作被執(zhí)行,這種安全漏洞稱為CSRF(跨域請求偽造)。,任務(wù)三:欄目管理,,,刪除欄目,,——令牌

55、保護,防御CSRF安全問題的一個有效的措施,是為所有涉及更改數(shù)據(jù)的操作加上令牌保護,該令牌將在用戶登錄時隨機生成,每個更改的操作都附加上令牌,沒有令牌時將無法執(zhí)行操作。,任務(wù)三:欄目管理,,,刪除欄目,,——令牌保護,token_get():利用md5()和microtime(true)生成令牌,將其保存在Session中token_check():先從GET參數(shù)中取出token,然后再與保存到Session中的token進行比較,判

56、斷是否正確。如果令牌有誤,說明用戶當前的操作是非法的。,在common\function.php中,自定義token_get()和token_check()函數(shù),任務(wù)三:欄目管理,,,,刪除欄目,,——令牌保護,在admin\init.php中添加代碼實現(xiàn)令牌的自動生成和驗證對刪除欄目的操作添加令牌驗證,需要注意的是,為了避免項目中頻繁的令牌驗證影響代碼演示,在本書后面的開發(fā)步驟中并沒有加上令牌驗證功能。同時為了確保項目的嚴謹性,在本

57、書的配套源代碼中已經(jīng)全部加上了令牌驗證。,任務(wù)三:欄目管理,,,文章列表,,準備測試數(shù)據(jù) 在開發(fā)具體功能前,先向數(shù)據(jù)庫中插入測試數(shù)據(jù)查詢文章列表 通過文章表和欄目表的左連接查詢,從數(shù)據(jù)庫中獲取到文章列表, 在列表中包含了文章所屬欄目的信息展示文章列表 編寫代碼輸出文章列表,任務(wù)四:文章管理,,,文章列表,,——效果展示,任務(wù)四:文章管理,,,編輯文章,,添加編輯鏈接當單擊“編輯”鏈接時,訪問cp_article_e

58、dit.php并傳入?yún)?shù)id查詢指定文章信息 接收文章id,顯示修改頁面 如果沒有收到,或id的值為0時,直接顯示空表單,用于發(fā)布新文章顯示文章編輯表單 創(chuàng)建一個表單顯示文章編輯內(nèi)容輸出欄目列表 下面將欄目輸出到一個下拉菜單中,任務(wù)四:文章管理,,,編輯文章,,引入在線編輯器 在CKEditor的官方網(wǎng)站可以下載此編輯器 將編輯器放入到項目的admin\js目錄中,并將編輯器目錄命名為“ckeditor”

59、 在文章編輯頁面admin\view\article_edit.html的底部編寫JavaScript代碼,實現(xiàn)在線編輯器的引入。 修改容器的name屬性值,任務(wù)四:文章管理,,,編輯文章,,——效果展示,任務(wù)四:文章管理,,,,保存文章,,接收表單 接收用戶填寫的基本信息 接收由在線編輯器提交的內(nèi)容時,沒有進行HTML轉(zhuǎn)義,這是因為編輯器提交內(nèi)容的本來就是HTML。,從安全角度來說,服務(wù)器端不進行HTML轉(zhuǎn)義會帶來安全問題

60、,原因是瀏覽器端任何限制都可以被繞過。在項目開發(fā)時,可以考慮使用富文本過濾器(如HTML Purifier)對HTML內(nèi)容進行安全過濾,這部分內(nèi)容將在后面的項目中進行講解。,任務(wù)四:文章管理,,,保存文章,,實現(xiàn)文章修改 在執(zhí)行接收表單后的操作時,如果接收到文章ID,就執(zhí)行文章修改操作。實現(xiàn)文章添加 在處理表單時,如果沒有接收到文章ID,就執(zhí)行文章添加操作。,任務(wù)四:文章管理,,,上傳封面圖,,檢查上傳文件 在進行添加或修

61、改數(shù)據(jù)之前,先處理上傳文件 在common\function.php中,自定義check_upload()函數(shù),用于判斷上傳文件是否成功,成功時返回true,失敗時將錯誤信息保存到$error中準備縮略圖函數(shù) 為圖片生成縮略圖image_thumb 根據(jù)原圖文件創(chuàng)建圖像資源image_create 保存圖像資源image_save,任務(wù)四:文章管理,,,上傳封面圖,,獲取圖片信息 實現(xiàn)image_thumb()函數(shù)的功能,完

62、成縮略圖的生成實現(xiàn)圖片等比例縮放 通常會保持圖片比例,防止圖片被拉伸或者壓扁,影響圖片的美觀生成保存路徑 可以根據(jù)日期為圖片生成子目錄,并為文件自動生成文件名,防止文件名沖突調(diào)用縮略圖函數(shù)在調(diào)用時,需要指定原圖路徑、縮略圖寬高、上傳目錄等信息,任務(wù)四:文章管理,,,上傳封面圖,,——效果展示,任務(wù)四:文章管理,,,刪除文章,,添加刪除鏈接 該功能和欄目刪除時的代碼相同執(zhí)行刪除操作 當用戶單擊刪除鏈接后,就會向PHP

63、腳本發(fā)送待刪除的文章ID參數(shù) 在實際進行文章記錄刪除操作之前,需要先判斷文章是否有封面圖。 如果封面圖存在,就先刪除圖片文件,再刪除文章記錄,任務(wù)四:文章管理,,,列表功能區(qū),,準備排序條件 在admin\cp_article.php文章列表程序中編寫代碼,獲取列表相關(guān)的GET參數(shù),并定義排序的方式以及對應(yīng)的SQL語句顯示列表功能區(qū) 欄目篩選和列表排序功能是兩個下拉菜單 列表搜索功能是一個文本框 三個功能各放在

64、三個表單中,單擊表單提交按鈕即可完成對應(yīng)的功能操作。,任務(wù)五:排序與搜索,,,列表功能區(qū),,——效果展示,任務(wù)五:排序與搜索,,,組合SQL語句,,——組合ORDER和WHERE子句,在前面的步驟中,已經(jīng)使用$cid、$search、$order三個變量接收了來自表單提交的數(shù)據(jù)。接下來就可以根據(jù)這些數(shù)據(jù)組合SQL語句進行查詢。在文章列表功能admin\cp_article.php中繼續(xù)編寫代碼,在接收變量后組合SQL語句。,,//拼接排

65、序條件$sql_order = ' ORDER BY '$sql_order .= isset($order_arr[$order]) ? $order_arr[$order]['sql'] : 'a.`id` DESC';//拼接WHERE條件$sql_where = ' WHERE 1=1 ';$sql_where .= $cid ? ' AND a.

66、`cid` IN ('.module_category_sub($cid).')' : '';$sql_where .= ' AND a.`title` LIKE ? ';$sql_search = '%'.db_escape_like($search).'%';,任務(wù)五:排序與搜索,,,組合SQL語句,,——根據(jù)欄目ID取出所有子欄目ID,下面

67、在common\module.php文件中編寫module_category_sub()函數(shù),實現(xiàn)根據(jù)欄目ID取出所有子欄目ID的功能。,,function module_category_sub($id){ $data = module_category('pid'); $sub = isset($data[$id]) ? array_keys($data[$id]) : []; a

68、rray_unshift($sub, $id); //將$id放入數(shù)組開頭 return implode(',', $sub);},任務(wù)五:排序與搜索,,,組合SQL語句,,——轉(zhuǎn)義LIKE搜索字符串,接下來在common\db.php文件中編寫db_escape_like()函數(shù),用于實現(xiàn)轉(zhuǎn)義LIKE搜索字符串中的所有特殊字符。,,function db_escape_like($like){

69、 return strtr($like, ['%'=>'\%', '_'=>'\_', '\\'=>'\\\\']); },在單引號字符串中書寫“\”字符時,如果一個“\”后面跟一個單引號,單引號將會被轉(zhuǎn)義成字符串中的字符,而非字符串定界符,因此需要在“\”前面加一個“\”進行轉(zhuǎn)義(字符串中實際只保存了一個“\”字符)。

70、,任務(wù)五:排序與搜索,,,組合SQL語句,,——修改文章列表查詢SQL,在完成對ORDER和WHERE的組合后,接下來繼續(xù)編寫admin\cp_article.php,修改查詢文章列表數(shù)據(jù)的代碼,將篩選和排序條件加入到SQL語句中。,,$data = db_fetch(DB_ALL, 'SELECT a.`id`, a.`cid`, a.`title`, a.`author`,a.`show`, a.`time`, c.`n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論