一、頁面的加載
0.業務分析
1.點擊日志管理呈現日志列表頁面
1)注冊點擊事件
2)定義事件處理函數
3)在事件處理函數中發送異步請求,加載頁面並進行數據呈現
2.呈現日志列表頁面的位置為mainContentId
3.將log_list.html(位置/templates/pages/sys)顯示到mainContentId中
4.log_list.html頁面加載完成后,需加載page.html頁面和數據
頁面跳轉:點擊日志管理異步加載log_list.html頁面,log_list.html頁面異步加載page.html頁面
1. 數據庫表結構設計
日志管理模塊業務:需要記錄用戶在什么時間什么地點做了什么事情
所以日志模塊的字段需要有:用戶的登陸名,用戶所做的操作(執行了什么方法,請求了什么參數),所用的時間(什么時間執行的操作,執行操作所用的時長)
1 CREATE TABLE `sys_logs` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `username` varchar(50) DEFAULT NULL COMMENT '登陸用戶名', 4 `operation` varchar(50) DEFAULT NULL COMMENT '用戶操作', 5 `method` varchar(200) DEFAULT NULL COMMENT '請求方法', 6 `params` varchar(5000) DEFAULT NULL COMMENT '請求參數', 7 `time` bigint(20) NOT NULL COMMENT '執行時長(毫秒)', 8 `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址', 9 `createdTime` datetime DEFAULT NULL COMMENT '日志記錄時間', 10 PRIMARY KEY (`id`) 11 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系統日志';
2. 頁面跳轉處理 PageController.java
項目中的所有頁面處理,都放在PageController中(com.cy.pj.sys.controller)
日志模塊的頁面跳轉:1.首先顯示首頁樣式
2.顯示日志管理模塊的列表頁面
3.顯示日志模塊列表頁面下面的分頁頁面
1 @Controller 2 @RequestMapping("/") 3 public class PageController { 4 //localhost:80/doIndexUI 5 @RequestMapping("doIndexUI") 6 public String doIndexUI() { 7 return "starter";//首頁頁面 8 } 9 /**基於此方法返回日志列表頁面(記住此頁面並不是完整頁面)*/ 10 @RequestMapping("log/log_list") 11 public String doLogUI() { 12 return "sys/log_list"; 13 } 14 /**基於此方法返回分頁頁面元素 15 * @throws InterruptedException */ 16 @RequestMapping("doPageUI") 17 public String doPageUI(){ 18 //Thread.sleep(5000); 19 return "common/page"; 20 } 21 }
首先訪問首頁頁面starter.html,通過localhost:80/doIndexUI網址訪問首頁頁面
然后點擊日志管理時,需要顯示日志頁面,日志頁面包括日志列表頁面和日志分頁頁面兩部分
sys/log_list為日志列表頁面,common/page為分頁頁面
3. starter.html(首頁)加載日志列表頁面
點擊日志管理,顯示相應的日志列表頁面,需要進行局部刷新,所以要是用異步加載
1 <script type="text/javascript"> 2 //此函數是在頁面加載完成以后執行 3 (function(){ 4 doLoadUI("load-log-id","log/log_list"); 5 })() 6 //基於不同對象的點擊事件執行資源加載操作 7 function doLoadUI(id,url){ 8 $("#"+id).click(function(){//click事件處理函數 9 //jquery中的load函數為一個異步加載的ajax函數。 10 //此函數用於在指定位置異步加載資源(並將返回的資源填充到這個指定位置) 11 $("#mainContentId").load(url); 12 }) 13 } 14 </script>
(function(){})()函數是在頁面加載完成之后執行和$(function(){})函數功能一致
日志管理的id值為load-log-id,對日志管理進行點擊事件處理,然后異步加載資源
load函數為jQuery中的一個異步加載的ajax函數,此函數用於在制定位置異步加載資源,並將返回的資源填充到指定的位置(mainContentId)中
$("#load-log-id").click(function(){
$("#mainContentId").load("log/log_list");
})
其中log/log_list為頁面跳轉中的地址
4. log_list.html加載分頁列表頁面
1 $(function(){ 2 $("#pageId").load("doPageUI"); 3 });
在pageId的位置加載分頁列表頁面,代碼寫在日志列表頁面中,有首頁加載log_list頁面,log_list頁面加載分頁頁面。
二、數據的加載
0. 業務分析
1.顯示日志數據(在數據庫中的數據)
2.顯示總記錄數,總頁數的值,顯示當前頁顯示的數據為第幾頁
3.點擊首頁進入第一頁,點擊尾頁進入最后一頁,點擊上一頁查看當前頁的上一頁數據,點擊下一頁查看當前頁的下一頁數據
4.點擊全選按鈕后,下面的復選框也全被選中。當所有的復選框都被選中后,取消其中一個復選框的選中效果,全選的復選框被取消
1. 日志列表數據呈現
1.1 構建實體對象 Sys_Log
1 /** 2 * 此對象主要用於封裝數據庫提取的數據或者向數據庫寫入的數據 3 * 此對象中的屬性建議和表中字段有對應的映射關系(名字,類型) 4 * 建議:所有用於封裝數據的對象都建議實現序列化接口(Serializable) 5 * 1)序列化:將對象轉換為字節的過程稱之為對象序列化 6 * 2)反序列化:將字節轉換為對象的過程稱之為反序列化 7 * 3)應用場景:對對象進行緩存,將對象進行鈍化(寫入文件),將對象通過網絡進行傳輸 8 */ 9 @Data 10 public class SysLog implements Serializable{ 11 //對象在序列化和反序列化時會基於此id進行數據處理。 12 //將對象序列化時會將這個id作為版本寫入到字節中。 13 //將字節反序列化會從字節中提取這個版本id然后和類中的版本id進行比對,一致則進行反序列化。 14 private static final long serialVersionUID = -1592163223057343412L; 15 private Integer id; 16 //用戶名 17 private String username; 18 //用戶操作 19 private String operation; 20 //請求方法 21 private String method; 22 //請求參數 23 private String params; 24 //執行時長(毫秒) 25 private Long time; 26 //IP地址 27 private String ip; 28 //創建時間 29 private Date createdTime; 30 31 }
pojo類用於封裝數據庫提取的數據或者向數據庫中寫入數據
pojo類與數據庫中的字段名,類型都一一對應
所有用於封裝的對象都建議使用實現序列化接口(Serializable)
1.2 分頁字段的封裝 PageObject
1 /** 2 * 基於此對象封裝業務執行結果 3 * 在Java語言,可以簡單將內存中的對象分為兩大類: 4 * 1)存儲數據的對象(設計的關鍵在屬性上)-典型的POJO對象(VO,BO,DO) 5 * 2)執行業務的對象(設計的關鍵在方法上)-典型的controller,service,dao 6 */ 7 @Data 8 @NoArgsConstructor 9 @AllArgsConstructor 10 public class PageObject<T> implements Serializable{//pojo中的bo對象,new PageObject<SysLog> 11 private static final long serialVersionUID = -3130527491950235344L; 12 /**總記錄數(從數據庫查詢出來的)*/ 13 private Integer rowCount; 14 /**總頁數(基於rowCount和頁面大小計算出來的)*/ 15 private Integer pageCount; 16 /**頁面大小(每頁最多可以呈現的記錄總數)*/ 17 private Integer pageSize; 18 /**當前頁碼值(客戶端傳遞)*/ 19 private Integer pageCurrent; 20 /**當前頁記錄,list集合中的T由PageObject類上定義的泛型決定*/ 21 private List<T> records; 22 public PageObject(Integer rowCount, Integer pageSize, Integer pageCurrent, List<T> records) { 23 super(); 24 this.rowCount = rowCount; 25 this.pageSize = pageSize; 26 this.pageCurrent = pageCurrent; 27 this.records = records; 28 //計算總頁數的方法一: 29 //this.pageCount=this.rowCount/this.pageSize; 30 //if(this.rowCount%this.pageSize!=0)pageCount++; 31 //計算總頁數的方法二: 32 this.pageCount=(rowCount-1)/pageSize+1; 33 } 34 }
PageObject用於封裝分頁操作,因為不光是日志管理模塊要用上分頁操作,所有的模塊都要用,所以要使分頁集合要具有通用性,PageObject,records要使用
注意區分存儲數據的對象(pojo),執行業務的對象(service,controller,dao)
1.3 數據層接口對象 Dao SysLogDao
1 /** 2 * 基於條件查詢用戶行為日志記錄總數 3 * @param username 查詢條件 4 * @return 查詢到的記錄總數 5 */ 6 int getRowCount(String username); 7 /** 8 * 基於條件查詢當前頁記錄 9 * @param username 查詢條件 10 * @param startIndex 當前頁數據的起始位置(用於limit 子句) 11 * @param pageSize 當前頁面大小(每頁最多顯示多少條記錄) 12 * @return 查詢到的記錄 13 */ 14 List<SysLog> findPageObjects(String username, 15 Integer startIndex,Integer pageSize); 16 }
日志管理模塊查詢日志記錄總數時需要判斷輸入框中是否有
查詢當前頁面數據的功能,查詢當前頁面數據需要使用幾個條件:1.輸入框中是否填寫了用戶名
2.從那一頁開始展示數據
3.當前頁顯示多少條數據
1.4 基於Dao接口創建映射文件
1.5
1.6
1.7