小程序商城筆記

一、三端分離:javascript

服務端:主要是查詢數據庫,獲取數據;php

客戶端:向服務端發送請求,完成自身邏輯;html

CMS:向服務端發送請求,實現發貨與發送微信信息。(CMS就是公司內部用戶用的,主要功能是添加、修改商品這一類功能)前端

二、基於token管理權限:登陸和有些用戶有權限看什麼,有些用戶沒有權限看什麼。vue

三、java

ORM模型(面向對象的模型),簡單理解爲:數據庫中的一張表就是一個對象。關聯模型就是多張表有關聯,好比寫sql語句的時候,多表關聯git

四、單元測試的做用:當業務代碼複雜的時候,有可能會出現這種狀況,剛修改一個地方的Bug,結果其餘地方出問題了。要解決這種狀況,就應該用單元測試github

五、在GitHub上下載think-phpweb

https://github.com/top-think/think   下載think-5.0.7 這個裏面找到(至關於一個demo)redis

https://github.com/top-think/framework/tree/v5.0.7   下載ThinkPHP核心代碼   framework-5.0.7

 

下載之後,把這倆個解壓,把think-5.0.7解壓,更名爲項目名字,好比zerg,放在XAMPP下的htodcs文件夾下;把framework-5.0.7解壓,更名爲thinkphp放到zerg文件夾下,結構爲:

 六、下載XAMPP  https://www.apachefriends.org/zh_cn/index.html

這個表示PHP的版本

點擊這塊,選擇相應的php版本

七、微信裏的登陸、微信支付(預訂單、庫存量檢測與回調通知處理(這是重點)、微信模板信息(很是重要,這是微信小程序惟一能夠告訴用戶的消息機制,模板信息是被動的,只有用戶在小程序裏觸發了某些選項後,纔有權利向用戶發送這些消息,不能主動、隨意地向用戶推送消息))

八、Token令牌的存儲:(1)、用後端語言自帶的方法;(2)、寫到一個配置文件裏;(3)、存儲到數據庫裏

九、

Web產品矩陣:

用一個技術把上面的這些產品都凝合起來,以實現更好的複用性,讓整個架構變得合理和流暢。如今作web產品要有公共服務的概念。要有一個公共的api向這些產品提供共有的數據和服務

十、能寫出代碼和寫出易維護的代碼不是一回事

前端毫不等於作界面和特效,前端與服務器在編程思惟上的差別愈來愈小了

前端已經變得和服務器同樣須要處理大量的業務邏輯

十一、第三方組件應該合理選擇:

(1)、第三方組件封裝的層次不同,有時候引入第三方組件會引起代碼bug

(2)、不少功能咱們用不上,要浪費不少時間去學習第三方組件,並不比咱們本身實現功能消耗的時間短

(3)、第三方組件的一些功能與咱們本身所要求的功能有衝突,要花不少時間去處理

(4)、第三方組件會侵入咱們本身的代碼

(5)、用第三方組件,不利於提升本身的邏輯能力和開發能力

(6)、有一些複雜的功能,好比訪問數據庫,本身寫不出來,或者寫出來的效用很差,就可使用第三方組件庫

(7)、有的第三方組件庫沒有侵入本身的代碼,只是做爲一個類庫來使用,這樣的第三方組件庫可使用

十二、

vendor:第三方的插件就安裝到這裏

thinpphp:tp5的核心代碼,用來支持框架的運行

runtime:運行文件、日誌文件就放在runtime裏

public:外部站點的目錄,這裏面的文件,能夠被直接訪問到

extend:以前已經寫好的第三方類庫,放入這個裏面的類庫,命名空間是能夠被框架自動註冊的

application:核心代碼

1三、tp5自帶的web服務器:配置PHP環境變量,把D:\xampp\php(php.exe)添加到PATH裏面,cmd進入public文件夾,運行php -S localhost:8080 router.php

在瀏覽器中輸入localhost:8080

這個只是本地測試用,最好仍是用xampp

 14。URL路徑格式

說明:藍色的:域名

index.php 入口文件,PHP默認的

綠色index:模塊名(項目中會有多個模塊)

紫色index:controller名

棕色Index:controller下面的文件

對比下面的結構

 1五、建立class的時候,如何自動匹配命名空間

config.php裏定義的命名空間,默認爲app,能夠修改

使用PhpStrom配置,setting-->Directories ,選中application,點擊Sources,,而後點擊右下角的,設置爲app

 

實戰經驗:php中,模塊的範圍大,中小型的項目,單一模塊就夠了,不要一個功能一個模塊

1六、虛擬域名的配置

如今啓動項目,若是要訪問

Url爲:http://localhost/zerg/public/index.php/sample/test/hello

效果爲:

 

這樣的話太長了

如今起個虛擬域名:z.cn

點擊xampp裏的

找到D:\xampp\apache\conf\extra下的httpd-vhosts.conf文件,在最下面加入以下代碼:

1 <VirtualHost *:80>   
2     DocumentRoot "D:\xampp\htdocs\zerg\public"
3     ServerName z.cn
4 </VirtualHost>

在C:\Windows\System32\drivers\etc下找到hosts文件,最下面加入以下代碼:

1 127.0.0.1 z.cn

從新啓動Apache

輸入url:http://z.cn/sample/test/hello

顯示效果爲:

 

 

PhpStrom 斷點調試:https://coding.imooc.com/lesson/97.html#mid=3320 

在項目的public下面建立一個文件infor.php

輸入phpinfo();

在瀏覽器打開 localhost/zerg(項目名)/public/infor.php(我配置了虛擬域名,因此打開的Url 是:http://z.cn/infor.php) 

在打開的頁面裏搜索Xdebug,若是有就說明安裝成功了,若是沒有,就說明沒有安裝

 

安裝一個Xdebug  網站是:https://xdebug.org/download.php

 

在剛纔Infor的頁面,查找源代碼,而後複製,粘貼到下面的框裏

 

 這樣就會出現與本地使用的php相匹配的Xdebug,不過7如下的不行

連接:https://pan.baidu.com/s/1O3tdu0rz0hA_bBC2YY3xhA
提取碼:zhwo

 這個裏面有

下載好文件後,

 

 找到這個路徑D:\xampp\php\ext,把剛纔的文件放進去

點擊

打開php.ini,把下面的代碼複製到最下面

[Xdebug]
zend_extension = D:\xampp\php\ext\php_xdebug-2.2.5-5.6-vc11.dll (這個路徑根據你本身的來)
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey="PHPSTORM"

重啓

 

刷新infor頁面,查找Xdebug,若是有,說明安裝成功

 

如今開始配置調試

點擊

 

配置服務器

點擊下面的啓動調試

把這個複製到postman的接口後面,請求的時候,就能夠開啓調試

 1七、Postman   後端接口調試工具

https://www.getpostman.com/

 1八、ThinkPHP5中支持三種路由:

(1)、默認的,PATH_INFO:

 1 //配置式路由
 2 return [
 3     '__pattern__' => [
 4         'name' => '\w+',
 5     ],
 6     '[hello]'     => [
 7         ':id'   => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
 8         ':name' => ['index/hello', ['method' => 'post']],
 9     ],
10 
11 ];

(2)、強制路由(最標準的,項目中推薦用這種)

開啓強制路由:在application/config.php中,,值改成true

 

 

1 //動態路由
2 use think\Route;
3 
4 Route::rule('hello', 'sample/Test/hello');

 

標準路由的倆種寫法:

1 //(1)、第一種寫法
2 Route::rule('hello', 'sample/Test/hello', 'GET', ['https'=>true]);
3 Route::rule('hello', 'sample/Test/hello', 'GET|POST', ['https'=>true]);
4 //(2)、第二種寫法
5 Route::get('hello', 'sample/Test/hello');
6 Route::post();
7 Route::any();

 

 (3)、混合模式

就是上面倆種均可以用

 

1九、路由參數  https://coding.imooc.com/lesson/97.html#mid=3338

20、驗證器  https://coding.imooc.com/lesson/97.html#mid=3351

2一、REST以前的重要協議是SOAP,重,使用XML描述數據

REST是用JSON描述數據

XML和JSON都是通用的,與語言無關,能夠在不一樣的語言之間交換數據

REST的出現,更多的是給我提供了一種輕量級的思惟方式,前端能夠經過javascript直接訪問後臺

 2二、REST是一種思想,RESTFuL API 是基於REST的API的設計理論

無狀態:假如發生了倆個http請求,這倆個Http請求之間是沒有前後順序的,也沒有直接的關係,第二個請求是不須要依賴第一個請求的。

             好比咱們在訪問數據庫的時候,是要連接和打開數據庫的,只有這個成功了,才能去作一些對數據庫的操做,刪除和增長,完成後要記得把這個連接close掉,這就不是無狀態的,必須有個前置操做。

             RESTFUL 請求就沒有這些

備註:傳統開發中的GET、POST和RESTFUL中的GET、POST,用法沒有區別,可是意義上區別很大

在傳統開發中,選擇GET、POST的依據是:若是傳輸的數據簡單,不須要保密,就用GET,不然就用POST

在RESTFUL中,選擇GET仍是POST,是看對資源是作什麼操做,若是是獲取資源,就用GET,若是是建立資源,就用POST

404:找不到頁面

400:請求參數錯誤

401:沒有權限訪問

403:當前的資源被禁止。有權限訪問,可是由於某些緣由,資源被禁止

例子:有倆個用戶請求數據,A用戶請求的時候傳遞的是B用戶的ID,這時候就應該返回403

500:服務器的未知錯誤,(1)、確實不知道哪裏錯了,沒法返回具體的錯誤提示,因此就返回500;(2)、知道哪裏錯誤了,可是這是我服務器的緣由,與你客戶端無關,不想讓客戶端知道服務器出了什麼問題,返回500

豆瓣的簡單,GitHub的標準  https://developer.github.com/v3/

徹底按照標準REST不容易,尤爲是在內部開發中,好比查詢,參數不一樣,若是作成給一個接口,要各類判斷,代碼會很是複雜

2三、何時用全局異常:(1)、每級要處理上級的異常,很繁瑣,也有可能沒有捕獲,(2)、有些異常沒有預料到,沒有捕獲。須要一個全局異常,作出統一的處理

此外不少框架中已經有了全局異常,好比thinkphp5,這時候就須要咱們重寫這個錯誤

 

 2三、thinkphp裏的數據庫三種操做方法:

(1)、原生SQL   

1 Db::query('select * from banner_item where banner_id=?',[$id]);

2四、詳細:https://coding.imooc.com/lesson/97.html#mid=3576

項目運行中發現一個問題,當url錯誤的時候,會報錯:httpException不是Exception,通過調試發現,httpException繼承的是\RuntimeException,不是Exception的子類

2五、鏈接數據庫的原理

若是是直接用sql鏈接數據庫,那就是用Collection鏈接

若是用的是Query查詢,就是先用Builder(生成器)編譯成SQL,再傳給Collertion

在TP5中,不是直接訪問數據庫,是經過一箇中間層來操做數據庫,就是dal,好處:(1)、簡化sql代碼的編寫;(2)、不須要關心具體的實現,只要贊成使用中間層提供的db類,就能夠訪問不一樣的數據庫

db的原理:它是一個工廠模式,使用的時候,db根據不一樣的配置文件,來調用不一樣的驅動,這個驅動纔是真正決定Collection是什麼類型的

 2七、開啓SQL日誌記錄  https://coding.imooc.com/lesson/97.html#mid=3591

index.php是入口文件,每個url請求過來,都會通過這個文件,因此能夠在這個文件進行配置

2八、https://coding.imooc.com/lesson/97.html#mid=3610

ORM  Object Relational Mapping 對象關係映射   設計表的時候,要當成對象來設計,操做的時候,不是在操做表,而是在操做一個個對象

在tp5中,模型不僅是一張表,更是一個業務邏輯,當業務邏輯簡單時,模型能夠是一張表,可是複雜時,是多張表的聯合

2九、Db是一個數據庫訪問層,model是創建在Db訪問層上的更加抽象的一個處理業務邏輯的模型層

30、thinkPhp5裏類和模型的區別,類是一個抽象的,模型是具體的(相似於java裏的對象)

thinkPhp5調用模型的方法有倆種:靜態調用(推薦)和實例對象調用。這個和Java裏面不同,Java都是new 一個實例對象後,調用裏面的方法

爲何不推薦用實例對象調用呢?

https://coding.imooc.com/lesson/97.html#mid=3655

邏輯上的問題:實例化對象後,模型對象對應數據庫裏的一條數據,一條數據get一個id,這個說不過去

面向對象中,類和對象的區別,model裏面,一個類對應的是數據庫的一張表,而一個new出來的對象,對應的是表裏的一條數據

3一、查詢數據的時候,隱藏某些字段   https://coding.imooc.com/lesson/97.html#mid=3909

3二、tp5裏公開的配置項文件是extra,在這個文件添加文件(這個裏面能夠自定義一些配置,下面的這個表示返回的圖片路徑前面加上http://z.cn/image)

調用的時候

config('setting.img_prefix')

 3三、在TP5裏面,若是出現router前面相似的,就須要開啓完整路由匹配

 

在config.php裏面

改成true

3三、8.16數據庫字段冗餘的合理利用(合理的)

在設計數據庫的時候,能夠適當的冗餘,舉個例子:product表關聯的image表,咱們要獲取img的url,就須要查詢imgage表,若是product表數量不少的話,速度會變慢,有一種優化的方法,把url存在product裏面,這樣只要查詢image表就能夠,不用再查詢image表了

3九、8-19 

若是想在某個方法裏隱藏某個字段,可使用TP5框架裏的collection,它能夠把數據轉換成一個對象,這樣就可使用裏面的方法hidden來進行隱藏字段

1 $collection = collection($products);
2 $products = $collection->hidden(['summary']);

在thinkphp5中,直接修改database裏的

// 數據集返回類型
'resultset_type' => 'collection'
這樣就可讓返回的數據爲collection對象

TP5中,判斷對象爲空,可使用isEmpty()方法

40. 9-1  token

驗證token:(1)、驗證這個token在數據庫裏;(2)、這個token沒有過時;(3)、若是token在數據庫裏,並且沒有過時,還要驗證這個token所在的分組有權限調用這個接口

 4一、9-2微信身份體系設計

 

在小程序中,咱們是基於微信體系作的,因此登陸的時候不須要輸入帳號和密碼

小程序把code碼發送給getToken接口,getToken接口接收到code碼之後,會向微信服務器發送一個請求,把code碼傳遞到微信服務器,微信服務器接收到code碼之後,會返還openid(用戶身份的標識)和session_key

session_key的做用:在微信體系中,能夠直接訪問微信服務器拿到一個加密信息,要想解密這個信息,就須要session_key

加密信息裏面包含一個UnionID(也是用戶的標識)

UnionID和openid的區別:

   openid是一個用戶針對一個小程序,它有一個openid,一個用戶在不一樣的小程序中,openid是不一樣的

   UnionID在不一樣的小程序下是相同的,只要是同一個帳號註冊的小程序、公衆號、服務號,都是相同的

從微信服務器獲取到openid後,把它存儲到服務器中,生成token,而後返回給小程序端

咱們能夠把token保存到緩存中,由於咱們有可能會遇到這種狀況,打開一個頁面,就須要請求一次服務器,獲取token,驗證token是否有效,若是把token保存到緩存中,就能夠在緩存中獲取token進行驗證,減小服務器壓力

備註:緩存的維護不容易,選取技術的時候,要慎重,既要考慮到優勢,還要考慮到缺點

 

 4二、 9-11 閉包函數構建查詢器 

 要求:關聯倆張表查詢數據,根據imgs表裏的order字段進行排序,通過演變後,使用了下面的寫法(多看)

model/Product.php

 1 public static function getProductDetail($id)
 2     {
 3         $product = self::with([
 4             'imgs' => function($query){
 5                 $query->with(['imgUrl'])
 6                     // order('order', 'asc') 第一個order是排序,第二個order是數據庫裏的字段
 7                 ->order('order', 'asc');
 8             }
 9         ])
10             ->with(['properties'])
11             ->find($id);
12         return $product;
13     }

 4三、9-12 經過令牌獲取用戶標識

令牌Token是用戶訪問受保護的接口的必須參數

爲何不直接傳遞UID,而是經過令牌獲取UID?

uid是自增加生成的,容易被別人猜到

 

使用令牌獲取UID的好處是:在post提交的時候,若是提交的是倆個用戶,令牌是A用戶的,UID是B用戶的,這樣修改的地址就是B用戶的,容易出錯

4四、9-15 參數過濾

Controller/Address.php

1  // 根據規則取字段是頗有必要的,防止惡意更新非客戶端字段
2         $data = $validate->getDataByRule(input('post.'));
getDataByRule 這個方法是用來過濾客戶端傳回的參數的,uid咱們是用token獲取的,可是爲了怕客戶端傳過來uid,覆蓋token獲取的uid,因此咱們要過濾參數

 4五、10-1 Scope權限做用域

用來判斷用戶的權限,能夠先建立一個配置文件,在裏面配置好幾種權限,而後代碼裏用到什麼就調用

4七、前置方法

就是請求接口時,先執行這個方法

4八、小程序下單支付流程

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3

 小程序調用下單API,檢查庫存,若是有庫存,就下單成功;下單成功後,調用支付API,咱們本身的服務器調用微信服務器,生成預訂單,返回支付參數,而後把支付參數傳給小程序,小程序拿到支付參數後,就調用相應的接口,請求微信,進行支付,彈出支付窗口。支付成功或失敗後,一方面返回給小程序提示信息,另外一方面返回給咱們的服務器信息(異步的,會在必定時間內屢次推送)

4九、10-10 訂單快照

訂單快照 保存的信息是當時下單時候的信息,地址和商品價格、數量,通常都是經過商品ID查詢獲取商品信息,這樣很差,由於商品的名稱和價格有可能改變,這樣獲取的數據和當時下單的時候的數據不同,解決辦法是下單的時候,就把訂單裏的商品信息都保存在訂單order表裏

50、TP5自動寫入時間戳

在表裏面,常常有create_time,update_time,delete_time這些屬性,若是咱們不想在保存數據的時候手動加入,能夠在對應的mode裏面寫入以下代碼,當保存數據的時候,自動加入當前時間

1 protected $autoWriteTimestamp = true;   //自動返回當前時間戳

何時TP5會給create_time自動加入時間,當檢測到新加一條數據的時候

一樣,若是作的是刪除操做的時候,會自動給delete_time自動加入時間

這裏特別說明下delete_time這個,如今咱們不少時候刪除數據,並非真實的刪除,而是假刪除,只要delete_time有值,就表示這條數據被刪除了

記住:要使用TP5自動寫入時間戳,必須用模型的方式,若是用原生SQL,是不行的

如何自定義TO5裏的create_time,update_time,delete_time這些名稱

 

 5一、TP5中使用事務

遇到下面的問題

咱們執行一個方法的時候,在倆個表裏保存相關的數據,若是隻保存了前面的數據,後面的沒有保存成功,這樣會出問題,這裏用到的數據庫中的事務

在TP5中。要解決這個問題,就須要下面的代碼

Db::startTrans();   Db::commit();
 1 Db::startTrans();
 2         try{
 3             $orderNo = $this->makeOrderNo();
 4             $order = new \app\api\model\Order();
 5             $order->user_id = $this->uid;
 6             $order->order_no = $orderNo;
 7             $order->total_price = $snap['orderPrice'];
 8             $order->total_count = $snap['totalCount'];
 9             $order->snap_img = $snap['snapImg'];
10             $order->snap_name = $snap['snapName'];
11             $order->snap_address = $snap['snapAddress'];
12             $order->snap_items = json_encode($snap['pStatus']);
13 
14             $order->save();
15 
16             $orderID = $order->id;
17             $create_time = $order->create_time;
18 
19             foreach ($this->oProducts as &$p){
20                 $p['order_id'] = $orderID;
21             }
22             $orderProduct = new OrderProduct();
23             $orderProduct->saveAll($this->oProducts);
24             Db::commit();
25             return [
26                 'order_no' => $orderNo,
27                 'order_id' => $orderID,
28                 'create_time' => $create_time
29             ];
30         }catch (Exception $ex){
31             Db::rollback();
32             throw $ex;
33         }

 5二、微信支付SDK

分爲倆端的,客戶端和服務端

客戶端:在百度搜索微信支付開發者文檔

 

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

 

服務端:在百度搜索微信支付開發者文檔

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

 5三、 10-21

下載PHP版的SDK,解壓,在extend下建立個文件夾,把lib裏的複製到裏面

 5四、在TP5中,引入extend裏的文件

 

 5五、  10-18

 

生成一個微信服務器須要的訂單,不是咱們真正的訂單,用預訂單,是爲了從微信服務器返回支付參數

 

5六、小程序業務流程

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3

 5七、微信支付  簽名  10-26

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/payment/wx.requestPayment.html

簽名的做用:爲了保證傳送的數據不被修改(固然,這是相對的,不能保證必定不被修改)

 

舉例說明簽名的做用:服務端有三個參數:A。B、C,如今用這個三個參數和APPKey四個參數一塊兒,使用MD5,作成Sign簽名,而後傳送給客戶端,客戶端又傳送到微信服務端,

微信服務端用一樣的規則把傳過來的參數和APPKey生成Sign簽名,進行驗證,倆個簽名是否是同樣,若是同樣,就說明傳送過來的參數正確

5八、10-29  支付回調通知處理

 1 // 微信支付回調處理
 2     public function receiveNotify(){
 3        //通知頻率爲15/15/30/180/1800/1800/1800/3600,單位:秒
 4 
 5         //1.檢查庫存量,有可能超賣
 6         //2.更新這個訂單的status狀態
 7         //3.減庫存
 8         //若是成功處理,返回微信成功處理信息,不然返回未成功處理信息
 9 
10         //微信返回的數據特色:post,xml格式,不會攜帶參數
11         // 使用SDK的好處 能夠處理XML格式
12     }

微信支付成之後,會調用一個接口,返回處理的信息,這個接口須要咱們本身定義receiveNotify()

備註:這個接口必須是post請求,返回的格式是xml,並且不會再裏面攜帶參數(相似url?xx=xx這種)

咱們用了SDK,能夠很容易的處理XML數據  

要覆蓋WxPay.Notify.php裏的NotifyProcess方法

5九、10-30 支付回調通知

$data的說明  https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8

肯定是否成功,要看下面這個字段

 60、把本地服務轉換成外網,可使用相似ngrok,不過這種工具,通常不安全

6一、使用了代理之後,secure.php裏pay_back_url要從新配置,具體看 10-23

 6二、10-34 能夠斷點調試微信支付的回調嗎?

正常狀況,微信支付後,會本身調用咱們提供的接口,這時咱們是沒法斷點調試接口信息的

有一個方法:新建立一個方法,微信服務器調用的方法裏面調這個方法,在這個方法裏面斷點調試微信服務器返回的信息

6三、10-37

要把返回的數據裏的某個字段進行json格式化處理,能夠在Model裏定義讀取器

 

微信端

6四、11-3 

微信小程序在真機上運行時要提早配置域名

進入小程序後臺管理界面  https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=726946140&lang=zh_CN

 

 只是請求的話只須要配置 request合法域名

 

6五、11-4  異步回調和箭頭函數

http://www.javashuo.com/article/p-qlouyqpo-bw.html

6六、11-6

1 // if(params.sCallBack){
2         //   params.sCallBack(res);
3         // }
4         // 這倆種寫法是同樣的  推薦用下面的,微信的demo中就這樣寫的
5         params.sCallBack && params.sCallBack(res.data);

 6七、小程序模板template的一些注意

父文件:

1 <!--引入template文件-->
2 <import src="../tpls/products/products-tpl.wxml" />
3 
4 <!--使用data把數據傳遞到template裏面-->
5 <template is="products" data="{{products:productsArr}}"></template>

模板文件:

 1 <template name="products">
 2   <view class="products-box">
 3     <block wx:for="{{products}}">
 4       <view class="products-item">
 5         <image class="products-image" src="{{item.main_img_url}}"></image>
 6         <view class="products-item-bottom">
 7           <text class="name">{{item.name}}</text>
 8           <view class="price">¥{{item.price}}</view>
 9         </view>
10       </view>
11     </block>
12   </view>
13 </template>

 (1)、父文件要引入模板文件的路徑

 (2)、父文件裏的is和模板文件裏的name一致

 (3)、模板文件裏不進行js操做,須要的數據是由父文件裏傳過來的,使用 data={}

  (4)、模板文件的樣式,在父文件的樣式裏引入

1 @import "../tpls/products/products-tpl.wxss";

 6七、底部的配置

 1 "tabBar": {
 2     "list": [
 3       {
 4         "pagePath": "pages/home/home",
 5         "text": "首頁",
 6         "iconPath": "imgs/toolbar/home.png",
 7         "selectedIconPath": "imgs/toolbar/home@selected.png"
 8       },
 9       {
10         "pagePath": "pages/category/category",
11         "iconPath": "imgs/toolbar/category.png",
12         "selectedIconPath": "imgs/toolbar/category@selected.png",
13         "text": "分類"
14       },
15       {
16         "pagePath": "pages/cart/cart",
17         "iconPath": "imgs/toolbar/cart.png",
18         "selectedIconPath": "imgs/toolbar/cart@selected.png",
19         "text": "購物車"
20       },
21       {
22         "pagePath": "pages/my/my",
23         "iconPath": "imgs/toolbar/my.png",
24         "selectedIconPath": "imgs/toolbar/my@selected.png",
25         "text": "個人"
26       }
27     ],
28     "borderStyle": "white", // 邊框的顏色
29     "selectedColor": "#AB956D", //選中之後文字的顏色
30     "color": "#989898", // 未選中文字的顏色
31     "backgroundColor": "#F5F5F5" // 背景顏色
32   }

 6八、調試技巧

引入template的時候,不顯示:在template裏面隨便打一行字,若是顯示,就說麼是數據的問題,若是不顯示,就說明模板沒有引入,這時候就要檢查倆個地方:

  (1)、在父組件裏,有沒有用inport引入模板文件

  (2)、父組件傳入的數據key和模板裏的是否一致

   

 

 

在微信開發工具裏,AppData裏能夠查看當前頁面裏的數據

 

6九、11-16 動態設置導航欄標題

https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.setNavigationBarTitle.html?search-key=setNavigationBarTitle

wx.setNavigationBarTitle(Object object)

注意:一、要在onReady裏面調用,在onLoad裏調用的時候,有可能會失效  二、全局設置導航欄標題的的地方必須爲空,不然有可能先顯示全局設置的,而後顯示動態設置的,會閃一下

 

70、11-18 Picker組件

https://developers.weixin.qq.com/miniprogram/dev/component/picker.html

1 <picker class="" range="{{countsArray}}" bindchange="bindPickerChange" value="1">
2           <!--flex-->
3           <view>
4             <text class="counts-tips">數量</text>
5             <text class="counts-data">{{productCount}}</text>
6             <image class="counts-icon" src="../../imgs/icon/arrow@down.png"></image>
7           </view>
8 </picker>

 

picker對flex的支出不是很好,因此爲了讓picker裏面的值都在中間,能夠在他們外面包裹一個view,view源碼裏用的是flex佈局

7一、11-23 微信小程序數據從服務器端到前端的流程

 

頁面初始化時,JS層調用API,從服務器端獲取數據,而後進行數據綁定,在wxml顯示數據。

前端有時候會進行操做,經過標籤的自定義屬性(data-)把參數傳遞到js層,js層用event獲取,而後把參數經過API傳遞到服務器端,服務器端響應後把心得數據

再傳遞到J層,而後進行新的數據綁定

 

在小程序中,數據綁定是最重要的部分,相似的有angular,js和vue.js

 7二、編譯設置

每次咱們改變代碼的時候,都會跳轉到第一頁,能夠這樣設置

這樣就會跳轉到指定頁面

 

7三、12-4

1  for (let i = 0; i < len; i++) {
2       //避免 0.05 + 0.01 = 0.060 000 000 000 000 005 的問題,乘以 100 *100
3       if (data[i].selectStatus) {
4         account +=
5           data[i].counts * multiple * Number(data[i].price) * multiple;
6         selectedCounts += data[i].counts;
7         selectedTypeCounts++;
8       }
9     }

注意這種寫法,在Js裏,小數相乘會出現特別的結果,能夠先乘以10的冪數,把值變成整數再相乘,最後對結果進行處理

7四、12-5 購物車頁面開發

不須要在頁面顯示,能夠是用block,相似於大括號。

wx:if和wx:else不必定非要倆個類似的標籤

7五、跳轉到tab欄下面的頁面,必須使用switchTab

7六、13-4 客戶端令牌管理機制

程序初始化的時候,先從緩存(Storage)中讀取令牌,檢測令牌,若是令牌失效或者不存在,則請求token,把獲取到的令牌保存到緩存(token)中

model(泛指全部向後端發送請求的文件)中請求後端API的時候,攜帶令牌去請求

若是在初始化的時候有令牌,在請求API的時候卻沒有,返回401,那就從新請求令牌,而後攜帶令牌去請求API

7五、13-17 獲取用戶信息

 1 wx.login({
 2       success: function () {
 3 
 4         wx.getUserInfo({
 5 
 6           success: function (res) {
 7             typeof cb == "function" && cb(res.userInfo);
 8           },
 9 
10           fail: function (res) {
11             typeof cb == "function" && cb({
12               avatarUrl: '../../imgs/icon/user@default.png',
13               nickName: '零食小販'
14             });
15           }
16 
17         });
18       },
19 
20     })

備註:wx.login獲取code,進而獲取poenid,是不須要受權的

          wx.getUserInfo是須要受權的 

7六、13-17 獲取用戶信息

在小程序裏面,最好不要在頁面中間自定義Loding組件,體驗效果很差;若是特別須要,能夠在頂部定義一個

7七、wx.getUserInfo  獲取用戶信息

調用這個接口前,會讓用戶受權,若是是贊成,可成功獲取用戶信息;若是是不一樣意,那將進入fail回調,並且不會再出現受權頁面

7八、13-20

合併倆個數組

1 this.data.orderArr.push.apply(this.data.orderArr, data);

7九、13-20

onReachBottom 是Page的事件,頁面滾動到最底部的時候觸發
scroll-view組件也有這種效果,不過若是須要js控制好,那麼推薦用onReachBottom 

80、微信模板信息   14章的總結

微信模板信息連接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html

看使用說明:

步驟一:獲取模板 ID

有兩個方法能夠獲取模板 ID:

  1. 經過模板消息管理接口獲取模板 ID(詳見 模板消息管理
  2. 在微信公衆平臺手動配置獲取模板 ID

登陸 https://mp.weixin.qq.com 獲取模板,若是沒有合適的模板,能夠申請添加新模板,審覈經過後可以使用,詳見 模板審覈說明

 

要想使用模板信息,須要先在https://mp.weixin.qq.com 這個裏面選擇須要的模板

點擊添加按鈕進行添加

添加完之後,記住 模板ID,請求模板信息接口的時候,要用這個ID(對應的參數是template_id)

 

步驟二:頁面的 <form/> 組件,屬性 report-submit 爲 true 時,能夠聲明爲須要發送模板消息,此時點擊按鈕提交表單能夠獲取 formId,用於發送模板消息。或者當用戶完成 支付行爲,能夠獲取 prepay_id 用於發送模板消息。

  有倆種發送模板信息的狀況,一種是使用form組件,一種是支付完成後發送

  如今討論支付完成這種狀況,注意prepay_id ,這也是參數之一,對應的參數是form_id

 

步驟三:調用接口下發模板消息(詳見 sendTemplateMessage )

  經過上面倆個步驟,獲取了template_id和form_id,再加上其餘參數,就能夠請求接口了

 

如今咱們來看https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html,分析發送模板信息接口

   參數分析

       string access_token  小程序全局惟一後臺接口調用憑據 

         具體信息,查看 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/access-token/getAccessToken.html

       string touser   接收者(用戶)的 openid

       string template_id  所需下發的模板消息的id   上面已經說了

       string page   點擊模板卡片後的跳轉頁面,僅限本小程序內的頁面。支持帶參數,(示例index?foo=bar)。該字段不填則模板無跳轉。

       string form_id  表單提交場景下,爲 submit 事件帶上的 formId;支付場景下,爲本次支付的 prepay_id

       string data  模板內容,不填則下發空模板

       string emphasis_keyword   模板須要放大的關鍵詞,不填則默認無放大

      

      請求數據實例

      

 1 {
 2   "touser": "OPENID",
 3   "template_id": "TEMPLATE_ID",
 4   "page": "index",
 5   "form_id": "FORMID",
 6   "data": {
 7       "keyword1": {
 8           "value": "339208499"
 9       },
10       "keyword2": {
11           "value": "2015年01月05日 12:30"
12       },
13       "keyword3": {
14           "value": "騰訊微信總部"
15       } ,
16       "keyword4": {
17           "value": "廣州市海珠區新港中路397號"
18       }
19   },
20   "emphasis_keyword": "keyword1.DATA"
21 }

 

  8一、15-2  另外一種思路處理庫存量的問題

      以前是先建立訂單,在支付之後在數據庫里扣除數量;

       新的思路是在建立訂單後,就暫時扣除數量,支付之後,就正式扣除數量,若是在一段時間就沒有支付,就恢復數量

       難點是:如何控制,沒有支付就恢復數量,可使用定時器(不是很好),隊列(相似於redis)

相關文章
相關標籤/搜索