1. 程式人生 > >學習淘淘商城第十七課(商品列表展示、PageHelper的使用)

學習淘淘商城第十七課(商品列表展示、PageHelper的使用)

        上節課我們實現了展示後臺頁面的功能,如下圖所示。可以看到,目前頁面是沒有資料的,我們本節課便一起學習下如何展示商品列表。


          我們知道,EasyUI的最大特點便是區域性重新整理,所有展示都是分模組展示的,不像我們一般頁面採用全部重新整理。查詢商品是index.jsp中的一個模組展示而已,我們下面來看下index.jsp頁面程式碼,如下圖所示。可以看到,當我們點選查詢商品的時候實際上是去訪問item-list這麼一個邏輯檢視。


        我們再來看下item-list.jsp頁面程式碼,如下圖所示,我們可以看到這個頁面程式碼只是有個table和一個div,並沒有檔案頭和尾,因此這不是一個完整的頁面,而只是一個片段而已(它是index.jsp的一個程式碼片段而已,而EasyUI的特點便是對這樣的程式碼塊進行重新整理,而不會重新整理其它模組)。


       下面我們再具體看下item-list.jsp這個頁面的程式碼,首先看下<table>頭資訊,如下所示,可以看到,table的class設定成了"easyui-datagrid",設定了它之後便預設把表格渲染成我們在最上方那張圖所看到的表格樣式。雖然不太好看,但是對於後臺來說能用即可,美觀並不是多麼重要。data-options中singleSelect:false表示可以多選,如果想要實現只能選擇一條記錄的效果,可以把singleSelect的值設定為true。

<table class="easyui-datagrid" id="itemList" title="商品列表" 
       data-options="singleSelect:false,collapsible:true,pagination:true,url:'/item/list',method:'get',pageSize:30,toolbar:toolbar">
       collapsible:true所代表的意思是是否顯示摺疊按鈕,如下圖最右邊紅色框圈住的按鈕。

        如果把collapsible的值設定為false,那麼這個按鈕將不再顯示,如下圖所示(注:修改頁面後不用重新啟動,直接重新整理頁面即可)。

         pagination:true代表的意思是要顯示分頁,如果不想分頁就把該值設定為false。設定成false後介面如下圖所示,可以發現,與上面的圖相比,沒有了分頁的資訊。


          url:'/item/list'的意思是我們初始化商品列表請求的url。method:'get'表示請求方式是GET。pageSize:30表示每頁顯示30條記錄,我們從有分頁資訊的圖中可以看到"30"的資訊,就是這裡設定的值。toolbar:toolbar指定工具欄,如上圖的"新增"、"編輯"、"刪除"、"下架"、"上架"這些工具。toolbar是由js定義的,程式碼就在item-list頁面下方的js部分,如下所示。

var toolbar = [{
        text:'新增',
        iconCls:'icon-add',
        handler:function(){
        	$(".tree-title:contains('新增商品')").parent().click();
        }
    },{
        text:'編輯',
        iconCls:'icon-edit',
        handler:function(){
        	var ids = getSelectionsIds();
        	if(ids.length == 0){
        		$.messager.alert('提示','必須選擇一個商品才能編輯!');
        		return ;
        	}
        	if(ids.indexOf(',') > 0){
        		$.messager.alert('提示','只能選擇一個商品!');
        		return ;
        	}
        	
        	$("#itemEditWindow").window({
        		onLoad :function(){
        			//回顯資料
        			var data = $("#itemList").datagrid("getSelections")[0];
        			data.priceView = TAOTAO.formatPrice(data.price);
        			$("#itemeEditForm").form("load",data);
        			
        			// 載入商品描述
        			$.getJSON('/rest/item/query/item/desc/'+data.id,function(_data){
        				if(_data.status == 200){
        					//UM.getEditor('itemeEditDescEditor').setContent(_data.data.itemDesc, false);
        					itemEditEditor.html(_data.data.itemDesc);
        				}
        			});
        			
        			//載入商品規格
        			$.getJSON('/rest/item/param/item/query/'+data.id,function(_data){
        				if(_data && _data.status == 200 && _data.data && _data.data.paramData){
        					$("#itemeEditForm .params").show();
        					$("#itemeEditForm [name=itemParams]").val(_data.data.paramData);
        					$("#itemeEditForm [name=itemParamId]").val(_data.data.id);
        					
        					//回顯商品規格
        					 var paramData = JSON.parse(_data.data.paramData);
        					
        					 var html = "<ul>";
        					 for(var i in paramData){
        						 var pd = paramData[i];
        						 html+="<li><table>";
        						 html+="<tr><td colspan=\"2\" class=\"group\">"+pd.group+"</td></tr>";
        						 
        						 for(var j in pd.params){
        							 var ps = pd.params[j];
        							 html+="<tr><td class=\"param\"><span>"+ps.k+"</span>: </td><td><input autocomplete=\"off\" type=\"text\" value='"+ps.v+"'/></td></tr>";
        						 }
        						 
        						 html+="</li></table>";
        					 }
        					 html+= "</ul>";
        					 $("#itemeEditForm .params td").eq(1).html(html);
        				}
        			});
        			
        			TAOTAO.init({
        				"pics" : data.image,
        				"cid" : data.cid,
        				fun:function(node){
        					TAOTAO.changeItemParam(node, "itemeEditForm");
        				}
        			});
        		}
        	}).window("open");
        }
    },{
        text:'刪除',
        iconCls:'icon-cancel',
        handler:function(){
        	var ids = getSelectionsIds();
        	if(ids.length == 0){
        		$.messager.alert('提示','未選中商品!');
        		return ;
        	}
        	$.messager.confirm('確認','確定刪除ID為 '+ids+' 的商品嗎?',function(r){
        	    if (r){
        	    	var params = {"ids":ids};
                	$.post("/rest/item/delete",params, function(data){
            			if(data.status == 200){
            				$.messager.alert('提示','刪除商品成功!',undefined,function(){
            					$("#itemList").datagrid("reload");
            				});
            			}
            		});
        	    }
        	});
        }
    },'-',{
        text:'下架',
        iconCls:'icon-remove',
        handler:function(){
        	var ids = getSelectionsIds();
        	if(ids.length == 0){
        		$.messager.alert('提示','未選中商品!');
        		return ;
        	}
        	$.messager.confirm('確認','確定下架ID為 '+ids+' 的商品嗎?',function(r){
        	    if (r){
        	    	var params = {"ids":ids};
                	$.post("/rest/item/instock",params, function(data){
            			if(data.status == 200){
            				$.messager.alert('提示','下架商品成功!',undefined,function(){
            					$("#itemList").datagrid("reload");
            				});
            			}
            		});
        	    }
        	});
        }
    },{
        text:'上架',
        iconCls:'icon-remove',
        handler:function(){
        	var ids = getSelectionsIds();
        	if(ids.length == 0){
        		$.messager.alert('提示','未選中商品!');
        		return ;
        	}
        	$.messager.confirm('確認','確定上架ID為 '+ids+' 的商品嗎?',function(r){
        	    if (r){
        	    	var params = {"ids":ids};
                	$.post("/rest/item/reshelf",params, function(data){
            			if(data.status == 200){
            				$.messager.alert('提示','上架商品成功!',undefined,function(){
            					$("#itemList").datagrid("reload");
            				});
            			}
            		});
        	    }
        	});
        }
    }];
       看完了<table>裡面的屬性,下面我們來看下錶頭的程式碼,其中<thead>表示表頭,<tr>表示一行。<th>表示一列。我們可以看到第一列是複選框,欄位名稱為"ck",商品ID的欄位名稱是"id",商品標題的欄位名稱為'title"等等。
<thead>
        <tr>
        	<th data-options="field:'ck',checkbox:true"></th>
        	<th data-options="field:'id',width:60">商品ID</th>
            <th data-options="field:'title',width:200">商品標題</th>
            <th data-options="field:'cid',width:100">葉子類目</th>
            <th data-options="field:'sellPoint',width:100">賣點</th>
            <th data-options="field:'price',width:70,align:'right',formatter:TAOTAO.formatPrice">價格</th>
            <th data-options="field:'num',width:70,align:'right'">庫存數量</th>
            <th data-options="field:'barcode',width:100">條形碼</th>
            <th data-options="field:'status',width:60,align:'center',formatter:TAOTAO.formatItemStatus">狀態</th>
            <th data-options="field:'created',width:130,align:'center',formatter:TAOTAO.formatDateTime">建立日期</th>
            <th data-options="field:'updated',width:130,align:'center',formatter:TAOTAO.formatDateTime">更新日期</th>
        </tr>
    </thead>
       我們再看看商品表各個欄位,發現與我們的表頭裡面定義的欄位完全一致。這樣才能自動將從資料庫查出來的資料賦值給相應的列進行顯示。

      當我們從地址訪問item-list時會報一個400錯誤,代表請求有問題,我們應該讓請求轉向item-list.jsp頁面並且從資料庫查詢出資料,轉換成json返回給客戶端。讓datagrid進行區域性重新整理。由於要分頁,因此還傳遞了page和rows,分別表示當前頁碼(從1開始)和每頁顯示多少條記錄。


         那麼,我們服務端響應的資料格式應該是什麼樣子的呢?EasyUI中datagrid控制元件要求的資料格式為:{total:"2",rows:[{"id":"1","name":"張三"},{"id":"2","name":"李四"}]}

返回過濾資料顯示,該函式帶一個引數"data"用來指向源資料(即:獲取的資料來源,比如json物件)。您可以改變源資料的標準資料格式,但是這個函式必須返回包含total和rows屬性的標準資料物件。還要就是rows當中的欄位名稱必須和<table>表格裡面定義的欄位名稱一致。我們一般採用用一個pojo類來返回前臺所需要的資料,而我們rows當中的json資料則一般是由Java物件轉換而來,多個物件的話就把一個集合轉換為json串。

         下面我們來新建一個pojo類EasyUIDataGridResult,由於這個pojo類有可能被多個服務所呼叫,因此我們把它放到taotao-common工程下,我們新建一個com.taotao.common.pojo包並在該包下新建一個EasyUIDataGridResult類,該類的程式碼如下圖右側所示,必須注意的是,屬性的名稱必須叫toal和rows,另外由於rows集合可能是各種不同的物件,因此我們便不再使用泛型,直接用List表示型別,它可以裝任意型別的物件。由於pojo要在服務端和客戶端進行傳輸,因此一定要實現序列化介面。


       下面我們再說下分頁,我們使用逆向工程生成的mapper檔案(比如TbItemMapper.xml)中是沒有分頁功能的,那麼我們怎麼實現分頁功能?

        第一,大家可以自己手工修改mapper檔案,使其可以分頁,這種方式比較麻煩,因為當生成的mapper檔案很多時,一個一個的改又是一個耗時的工程,而且還容易出錯。

        第二,就是不修改mapper檔案,使用mybatis提供的一個分頁外掛pagehelper來實現分頁,這種方法當然是我們的首選了。

        PageHelper分頁外掛目前支援:Oracle、Mysql、MariaDB(其實只是Mysql的一個分支而已)、SQLite、Hsqldb、PostgreSQL六種資料庫。

        我們使用的PageHelper分頁外掛版本是3.4.2-fix,這個版本從中央倉庫是下載不到的,這是經過高人修改過的版本,mybatis官方提供的分頁外掛在無條件分頁查詢的時候沒問題,但是當有條件進行分頁查詢的時候會拋異常,因此高人做了修改,命名為了3.4.2-fix版本。我們目前只需要會使用就可以了,等我們學會熟練使用了,能夠很好的閱讀原始碼了,便可以看看哪些做了修改。

        我們怎麼使用這個修改後的分頁外掛呢?方法有兩種,第一種便是從:http://download.csdn.net/detail/u012453843/9797063這個地址下載pagehelper修改過後的maven工程,解壓後,匯入到eclipse。如下圖所示,如果我們使用的jdk版本是1.8的話,我們需要修改pom.xml檔案中build定義的jdk的版本為1.8。


        我們對該工程進行maven打包,打包到本地maven倉庫中,方法是在pagehelper工程上右鍵-------->Run As--------->Maven Install。

        第二種使用方法便是到http://download.csdn.net/detail/u012453843/9786164這個地址進行下載。下載完之後,我們解壓它並把它放在我們本地maven倉庫的相應位置下,如下圖所示。這樣便可以使用修改後的pagehelper外掛了。

        接下來我們開始在mybatis的配置檔案中配置分頁外掛,如下圖所示,這段配置的作用是根據不同的資料庫採用不同的分頁方法。


       為方便大家複製,把程式碼放置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
		PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
		"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 配置分頁外掛 -->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<property name="dialect" value="mysql"/>
		</plugin>
	</plugins>
</configuration>
        下面新建一個測試類來測試一下分頁是否好使,如下圖所示。發現是可以正常進行分頁查詢的。



        為方便大家複製程式碼,這裡把測試類的程式碼粘貼出來,如下所示。

package com.taotao.pagehelper;

import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.mapper.TbItemMapper;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbItemExample;
import com.taotao.pojo.TbItemExample.Criteria;

public class TestPageHelper {
	
   @Test
   public void testPageHelper() throws Exception{
	   //1.在Mybatis配置檔案中配置分頁外掛,這一步我剛才已經做過了。
	   //2.在執行查詢之前配置分頁條件,使用pagehelper靜態方法
	   PageHelper.startPage(1, 10);
	   //3.執行查詢
	   ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
	   TbItemMapper tbItemMapper = applicationContext.getBean(TbItemMapper.class);
	   TbItemExample tbItemExample = new TbItemExample();
	   //如果要使用條件查詢,則先建立Criteria,然後使用它來拼接查詢條件,這裡我們不按條件查詢,我們查詢全部。
//	   Criteria criteria = tbItemExample.createCriteria();
//	   criteria.andIdEqualTo(1L);
	   //pagehelper的Page類是繼承ArrayList的,Page裡面有分頁結果
	   List<TbItem> list = tbItemMapper.selectByExample(tbItemExample);
	   //4.取分頁資訊,使用PageInfo物件獲取,我們使用PageInfo的目的便是把List強轉成Page物件,從而得到分頁結果
	   PageInfo<TbItem> pageInfo = new PageInfo<>(list);
	   System.out.println("總記錄數:"+pageInfo.getTotal());
	   System.out.println("總頁數:"+pageInfo.getPages());
	   System.out.println("返回的記錄數:"+pageInfo.getSize());
   }
}
        其中註釋中提到pagehelper外掛的Page類繼承ArrayLis以及Page類實現了分頁結果,現把pagehelper的Page類程式碼放置如下。
/*
	The MIT License (MIT)

	Copyright (c) 2014 [email protected]

	Permission is hereby granted, free of charge, to any person obtaining a copy
	of this software and associated documentation files (the "Software"), to deal
	in the Software without restriction, including without limitation the rights
	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
	copies of the Software, and to permit persons to whom the Software is
	furnished to do so, subject to the following conditions:

	The above copyright notice and this permission notice shall be included in
	all copies or substantial portions of the Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
	THE SOFTWARE.
*/

package com.github.pagehelper;

import org.apache.ibatis.session.RowBounds;

import java.util.ArrayList;
import java.util.List;

/**
 * Mybatis - 分頁物件
 *
 * @author liuzh/abel533/isea533
 * @version 3.3.0
 *          專案地址 : http://git.oschina.net/free/Mybatis_PageHelper
 */
public class Page<E> extends ArrayList<E> {
    private static final long serialVersionUID = 1L;

    /**不進行count查詢*/
    private static final int NO_SQL_COUNT = -1;
    /**進行count查詢*/
    private static final int SQL_COUNT = 0;
    /**頁碼,從1開始*/
    private int pageNum;
    /**頁面大小*/
    private int pageSize;
    /**起始行*/
    private int startRow;
    /**末行*/
    private int endRow;
    /**總數*/
    private long total;
    /**總頁數*/
    private int pages;
    /**分頁合理化*/
    private boolean reasonable;

    public Page(){
    	super();
    }

    public Page(int pageNum, int pageSize) {
        this(pageNum, pageSize, SQL_COUNT);
    }

    public Page(int pageNum, int pageSize, boolean count) {
        this(pageNum, pageSize, count ? Page.SQL_COUNT : Page.NO_SQL_COUNT);
    }

    public Page(int pageNum, int pageSize, int total) {
        super(pageSize > -1 ? pageSize : 0);
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        calculateStartAndEndRow();
    }

    public Page(RowBounds rowBounds, boolean count) {
        this(rowBounds, count ? Page.SQL_COUNT : Page.NO_SQL_COUNT);
    }


    public Page(RowBounds rowBounds, int total) {
        super(rowBounds.getLimit() > -1 ? rowBounds.getLimit() : 0);
        this.pageSize = rowBounds.getLimit();
        this.startRow = rowBounds.getOffset();
        //RowBounds方式預設不求count總數,如果想求count,可以修改這裡為SQL_COUNT
        this.total = total;
        this.endRow = this.startRow + this.pageSize;
    }

    public List<E> getResult() {
        return this;
    }

    public int getPages() {
        return pages;
    }

    public int getEndRow() {
        return endRow;
    }

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        //分頁合理化,針對不合理的頁碼自動處理
        this.pageNum = (reasonable && pageNum <= 0) ? 1 : pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getStartRow() {
        return startRow;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
        if (pageSize > 0) {
            pages = (int) (total / pageSize + ((total % pageSize == 0) ? 0 : 1));
        } else {
            pages = 0;
        }
        //分頁合理化,針對不合理的頁碼自動處理
        if (reasonable && pageNum > pages) {
            pageNum = pages;
            calculateStartAndEndRow();
        }
    }

    public void setReasonable(boolean reasonable) {
        this.reasonable = reasonable;
        //分頁合理化,針對不合理的頁碼自動處理
        if (this.reasonable && this.pageNum <= 0) {
            this.pageNum = 1;
            calculateStartAndEndRow();
        }
    }

    /**
     * 計算起止行號
     */
    private void calculateStartAndEndRow() {
        this.startRow = this.pageNum > 0 ? (this.pageNum - 1) * this.pageSize : 0;
        this.endRow = this.startRow + this.pageSize * (this.pageNum > 0 ? 1 : 0);
    }

    public boolean isCount() {
        return this.total > NO_SQL_COUNT;
    }

    @Override
    public String toString() {
        return "Page{" +
                "pageNum=" + pageNum +
                ", pageSize=" + pageSize +
                ", startRow=" + startRow +
                ", endRow=" + endRow +
                ", total=" + total +
                ", pages=" + pages +
                '}';
    }
}
       下面我們來實現商品列表查詢功能。首先我們需要在taotao-manager-interface的介面中新增一個介面,如下圖所示。

       接下來我們需要在taotao-manager-service的實現類中實現該介面,如下圖所示。


        下面我們來寫Controller程式碼,如下圖所示,我們在ItemController當中新增一個獲取商品列表的介面,返回值是EasyUIDataGridResult類。


        寫完了程式碼,由於我們在taotao-common當中添加了一個pojo,在taotao-manager-interface新增一個介面,因此這兩個工程都需要打下包到本地倉庫。打包的方法如下圖所示(taotao-manager-interface打包方式與此相同)。



        下面我們重新啟動taotao-manager和taotao-manager-web工程,然後訪問http://localhost:8081/並點選查詢商品,可以看到如下圖所示介面,說明我們成功進行分頁查詢了。


            最後來說下debug,我們需要關聯原始碼,否則debug將難以進行,關聯方法如下圖所示。

            彈出的對話方塊中,選擇taotao-manager工程,點選"Source"頁籤,去除掉"Default"。


            由於taotao-manager工程是個聚合工程,它是由四個子工程組成的,因此我們把它們加進來。新增之後記得點選下圖的"Apply"按鈕。


        新增之後如下圖所示,同理,我們把taotao-manager-web工程的Default也去掉並把taotao-manager-web工程新增進來(記得點選"Apply"按鈕)。debug啟動可以點選下圖的"Debug"按鈕。


相關推薦

學習商城商品列表展示PageHelper的使用

        上節課我們實現了展示後臺頁面的功能,如下圖所示。可以看到,目前頁面是沒有資料的,我們本節課便一起學習下如何展示商品列表。           我們知道,EasyUI的最大特點便是區域性重新整理,所有展示都是分模組展示的,不像我們一般頁面採用全部重新整理。查

學習商城商品詳情頁面對加入購物車進行改造

        我們訪問淘淘商城首頁(前提是啟動了所有的服務及工程,雖然有個別工程用不上,不過也沒關係),在搜尋框中輸入要搜尋的商品,我以前新增過"金立M2017"這款手機,我就搜尋它。          搜尋到的結果頁面如下圖所示。           我們再點選這款

學習商城第二內容管理

      上節課我們一起學習了內容分類管理,包括增加、修改、刪除等操作。這節課我們一起學習下內容管理。 第一部分:查詢內容列表       首先,我們先來看看內容管理後臺頁面,如下圖所示,可以看到頁面分兩部分,分為左側內容分類和右側內容列表兩個部分。        為什

學習商城商品詳情快取的實現

       上節課我們一起分析了下商品詳情快取策略,這節課我們一起實現商品詳情快取的新增。        首先,我們要想清楚快取應該加到哪個工程當中,現在我們有兩個工程可以選擇,第一個工程是taotao-item-web(商品詳情工程),如果把快取加到這個工程的話,由於該

商城(展示後臺管理頁面)

前面做了那麼多鋪墊,現在我們開始著手處理後臺管理系統。        首先,大家需要下載淘淘商城的靜態資原始檔,大家可以到:https://download.csdn.net/download/anaitudou/10505519這個地址進行下載,下載後解壓,解壓後可以看到有

學習商城第二KindEditor富文字編輯器的使用

      上節課我們一起學習了怎樣解決KindEditor富文字編輯器上傳圖片的瀏覽器相容性問題,這節課我們一起學習下富文字編輯器與淘淘商城相結合的使用方法。       我們在發表一篇部落格或者微博的時候,都會用到富文字編輯器,因為它提供的功能非常豐富,不僅能寫文字,還

Ng:大規模機器學習(Large Scale Machine Learning)

在線 src 化簡 ima 機器學習 learning 大型數據集 machine cnblogs 17.1 大型數據集的學習 17.2 隨機梯度下降法 17.3 微型批量梯度下降 17.4 隨機梯度下降收斂 17.5 在線學習 17.6 映射化簡和數據並行

JAVA學習java程序的異常處理

num 函數 錯誤 style col 編譯失敗 return [] java 異常處理的捕捉形式: 這是能夠對異常進行針對性處理的方式 六、try、catch的理解 詳細格式: try { //須要被檢測異常的代碼 } catch(異常類 變量)//改變量用

我的學習之路_章_JavaUtils

包含 string 和數 類的方法 objc 基本數據類型 通過 序列 setprop 【BeanUtils工具類】 javaBaen : Java和數據庫所對應關系實體類 表(Utils)-->類(User) 表中的列-->類中字段(屬性) 表中的行-->

接口測試學習-python面向對象編程

公有 屬性和方法 定義 無法 eight self 析構 () 每一個 以前都是面向過程編程,做一件事是按順序來的,必須經過很多操作。現在是面向對象編程,將各種操作集合在一起,然後指揮其適用於多個場景。上課時老師舉了一個蠻貼切的例子,比如買車,面向過程就是先去學車,然後去4

斯坦福大學-自然語言處理入門 筆記 資訊檢索information retrieval

一、介紹 資訊檢索(information retrieval)是從海量集合體(一般是儲存在計算機中的文字)中找到滿足資訊需求(information need)的材料(一般是文件) 資訊檢索的應用領域:網頁搜尋,郵件搜尋,電腦內部搜尋,法律資訊檢索等等 資訊檢索的基

C++筆記 物件的構造---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第十七課 物件的構造(上) 問題:物件中成員變數的初始值是多少?不定的 小實驗 下面的類定義中成員變數i和j的初始值為什麼? 17-1 成員變數的初始值 #incl

【ERC721實踐】迷戀貓從玩耍到開發

**CryptoKitties(中文名:迷戀貓)**是一款在以太坊區塊鏈上的虛擬養貓遊戲,一經推出就以病毒式的快速擴散,橫掃整個以太坊市場。而這款可愛的遊戲於2018年 2 月 16 日(農曆大年初一)登陸 iOS國區,中文名稱的 “迷戀貓”,皆因 “迷戀”

C語言筆記 ++和-- 操作符分析

第十七課 ++和-- 操作符分析 ++,- -操作符的本質 ++和- -操作符對應兩條彙編指令 前置 變數自增(減)1 取變數值 後置 取變數值 變數自增(減)1 ++,- -操作符使用分析 int i = 0; (i++) + (i++) + (i++); 0+1+2=

【問鏈財經-區塊鏈基礎知識系列】 區塊鏈應用於汽車保險行業所帶來的變革

編者按:在一般汽車保險詐騙案,汽車駕駛會故意安排假車禍,然後向保險公司提出各種不實和非法的索賠。據德勤(Deloitte)統計,這些假車禍每年讓保險業損失約7億新元。汽車駕駛若對不同保險公司索賠,除非共享跨產業資料,否則很難發現欺詐行為。區塊鏈結合汽車保險行業將會產生新的火花。

學習HadoopHadoop序列化機制Linux安裝Eclipse及建立快捷圖示使用Maven開發

我看的視訊就是這個,看到有人寫了,就轉過來了 上節課我們一起學習了MapReduce的一個簡單例項,這節課我們一起來學習Hadoop的序列化機制。        首先我們來學習一下,什麼叫做序列化,序列化是指把結構化物件轉換成位元組流,這樣做的目的當然是便於在網路中傳輸。

【深度學習框架Caffe學習與應用】

1.車輛檢測實踐:使用Caffe訓練的深度學習模型做目標檢測——以車輛檢測為例 有關檔案都放在以下資料夾中: 對vehicle_detetc.cpp進行編譯: 編譯之前,需要修改一下程式碼中的檔

javaweb基礎:jsp講解

大綱: 執行原理 4大域物件 jsp指令 page include taglib jsp動作標籤 jsp:forword jsp:include   這節課我們來講

final關鍵字和abstract關鍵字

 一、final關鍵字final(最終)是一個修飾符 1.final可以修飾類,函式,變數(成員變數,區域性變數) 2.被final修飾後的類不可以被其他類繼承 3.被final修飾後的函式不可以被重寫 4.被final修飾後的變數不允許被再次賦值,final在對變數進

python——列表生成式

ava end php ems span 以及 expr 保留 同時 1.列表生成式:什麽是列表生成式?它就是一串表達式,專門用於生成列表對象,當中包含一系列的業務邏輯;結構:簡介、優雅、閱讀性好;比傳統獲取列表對象來的更加的方便;它是語法糖的一種;什麽是語法糖?我們在實際