Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美性色黄大片a级毛片视频,国产午夜精品久久久久免费视小说,自拍偷拍网站

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          幾張圖為你分析HTML、JS與PHP之間的數(shù)據(jù)傳輸

          電商網(wǎng)站搭建過(guò)程中,前端經(jīng)常會(huì)向后端請(qǐng)求數(shù)據(jù),有時(shí)候通過(guò)HTML、JS和PHP文件的處理來(lái)實(shí)現(xiàn)數(shù)據(jù)的連通。通常情況下,用戶在HTML中做關(guān)鍵字操作,JS對(duì)提交的表單進(jìn)行數(shù)據(jù)處理,向后端發(fā)起ajax請(qǐng)求對(duì)應(yīng)PHP的api接口,PHP在接收到數(shù)據(jù)后對(duì)連接服務(wù)器,服務(wù)器再通過(guò)PHP中的SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)關(guān)鍵字進(jìn)行處理返回給PHP,再由PHP返回給前端,前端通過(guò)JS處理將數(shù)據(jù)渲染在HTML中,最終呈現(xiàn)給用戶。圖1為數(shù)據(jù)傳輸流程圖:

          圖1 HTML、JS與PHP之間的數(shù)據(jù)傳輸流程圖

          以加入商品到購(gòu)物車為例,本例為模擬數(shù)據(jù),和實(shí)際的數(shù)據(jù)庫(kù)的數(shù)據(jù)不同。

          圖2 商品列表

          加入購(gòu)物車的點(diǎn)擊事件大致步驟為:用戶點(diǎn)擊"加入購(gòu)物車"按鈕==>頁(yè)面獲取當(dāng)前商品唯一值(如商品ID:productID)==>JS處理點(diǎn)擊事件,將唯一值連同用戶信息通過(guò)ajax請(qǐng)求傳送給PHP===>PHP向服務(wù)器請(qǐng)求連接===>數(shù)據(jù)庫(kù)語(yǔ)句執(zhí)行===>服務(wù)器將執(zhí)行結(jié)果返回給PHP===>PHP將執(zhí)行結(jié)果傳送給前端。

          如果數(shù)據(jù)庫(kù)語(yǔ)句執(zhí)行成功,那么數(shù)據(jù)庫(kù)中該用戶的購(gòu)物車表就多了一項(xiàng)剛加入的商品數(shù)據(jù),同時(shí)服務(wù)器也會(huì)向PHP返回執(zhí)行成功信息(及一條不為空的數(shù)據(jù)串),而用戶的界面就會(huì)顯示"成功加入購(gòu)物車"等字樣(如圖1-1所示);若執(zhí)行失敗,也會(huì)將失敗信息(err)傳給PHP,用戶界面也會(huì)顯示相應(yīng)的提示,如圖3所示。

          圖3 成功加入購(gòu)物車提示

          1. HTML中的代碼實(shí)例,商品列表信息通過(guò)引入art-template模塊進(jìn)行渲染,代碼如下

          <ul class="productContainer">

          {{each product prod}}

          <li>

          <input type="text" value="{{prod.id}}">

          <img src="{{prod.img}}"/>

          <p>{{prod.title}}</p>

          <span>¥{{prod.price}}</span>

          <a href="javascript:void(0)">加入購(gòu)物車</a>

          </li>

          {{/each}}

          </ul>

          2. JS中的數(shù)據(jù)請(qǐng)求處理實(shí)例如下,加入購(gòu)物車的請(qǐng)求的api文件路徑為http://localhost/api/add.php,此時(shí)將點(diǎn)擊加入的商品ID及操作的用戶ID封裝為對(duì)象,用ajax的post請(qǐng)求傳給服務(wù)端

          $(".productContainer").on("click", ".add", function () {

          var productID=$("#prodID").val();//獲取到當(dāng)前商品的ID值

          $.post("http://localhost/api/add.php", {productID:productID,userID},

          function (data) {

          if (data.res_code === 1) { //返回的數(shù)據(jù)中,data.res_code為1表示加入成功

          alert("加入成功");//對(duì)用戶進(jìn)行加入成功提示

          } else {

          alert(data.res_message);//若不為1則表示加入失敗,data.res_message為失敗信息

          }

          }, "json");

          });

          3. PHP中的代碼(及JS中所請(qǐng)求的add.php文件)

          <?php

          // CORS跨域

          header("Access-Control-Allow-Origin:*");

          /* 向購(gòu)物車添加商品 */

          $productID = $_POST["productID"];

          $userid = $_POST["userID"];

          // 連接數(shù)據(jù)庫(kù)服務(wù)器

          mysql_connect("localhost:3306", "root", "");

          // 選擇連接數(shù)據(jù)庫(kù)的名稱

          mysql_select_db("cart");

          // 讀寫(xiě)庫(kù)編碼

          mysql_query("set character set utf8");

          mysql_query("set names utf8");

          // 編寫(xiě)SQL語(yǔ)句

          //若該用戶未添加該商品,則向cartList表插入該商品,并將數(shù)量置為1

          $sql1 = "INSERT INTO cartList(productID, userID,count) VALUES ('$productID', '$userID',1)";

          //若該用戶已添加該商品,再次添加時(shí)只在cartList表中讓該商品的數(shù)量+1

          $sql2 = "UPDATE cartList SET count=count+1 WHERE productID= '$productID' AND userid='$userID'";

          // 執(zhí)行SQL語(yǔ)句,首先執(zhí)行sql1的語(yǔ)句,如果表中有相同的數(shù)據(jù),則sql1會(huì)執(zhí)行失敗,那么執(zhí)行sql2

          $result = mysql_query($sql1);

          if(!$result){

          $result = mysql_query($sql2);

          }

          // 判斷

          if ($result) { // 執(zhí)行成功,將res_code的值設(shè)為1,并將返回信息設(shè)置為"加入成功"

          $arr = array("res_code"=>1, "res_message"=>"加入成功");

          echo json_encode($arr);

          } else { // 執(zhí)行失敗,則將res_code設(shè)為0,并將錯(cuò)誤信息設(shè)置為"加入失敗"

          $arr = array("res_code"=>0, "res_message"=>"加入失敗" . mysql_error());

          echo json_encode($arr);

          }

          // 關(guān)閉連接

          mysql_close();

          ?>

          4. 當(dāng)用戶進(jìn)入購(gòu)物車時(shí),頁(yè)面要請(qǐng)求該用戶在數(shù)據(jù)庫(kù)中的購(gòu)物車表cartList,此時(shí)查詢結(jié)果應(yīng)該為一個(gè)數(shù)組,數(shù)組里的每一個(gè)子元素對(duì)應(yīng)一個(gè)唯一的商品對(duì)象,數(shù)據(jù)庫(kù)查詢語(yǔ)句如下:

          // 編寫(xiě)SQL語(yǔ)句

          //在購(gòu)物車cartList表中找到該用戶已經(jīng)添加的購(gòu)物車商品數(shù)據(jù)的信息

          $sql = "SELECT * FROM cartList WHERE userID='$userID'";

          // 執(zhí)行SQL語(yǔ)句

          $result = mysql_query($sql);

          // 新建一個(gè)數(shù)組用來(lái)存查詢出來(lái)的結(jié)果,每條結(jié)果僅有一條商品的信息

          $results = array();

          // 每次查詢成功,將當(dāng)前查詢到的商品結(jié)果存入results數(shù)組中

          while($row = mysql_fetch_row($result))

          {

          $results[] = $row;

          }

          if ($results) {//返回?cái)?shù)組$results,res_code值設(shè)為1

          $arr = array("res_code"=>1, "res_message"=>$results);

          echo json_encode($arr);

          }

          else { // 查找失敗,返回信息"查找失敗",res_code值設(shè)為0

          $arr = array("res_code"=>0, "res_message"=>"查找失敗" . mysql_error());

          echo json_encode($arr);

          }

          關(guān)于PHP語(yǔ)法的說(shuō)明:

          mysql_query() 函數(shù)執(zhí)行某個(gè)針對(duì)數(shù)據(jù)庫(kù)的查詢,每次查詢結(jié)果僅有一條數(shù)據(jù)。

          mysql_fetch_row() 從和結(jié)果標(biāo)識(shí) data 關(guān)聯(lián)的結(jié)果集中取得一行數(shù)據(jù)并作為數(shù)組返回。每個(gè)結(jié)果的列儲(chǔ)存在一個(gè)數(shù)組的單元中,偏移量從 0 開(kāi)始。依次調(diào)用 mysql_fetch_row() 將返回結(jié)果集中的下一行,如果沒(méi)有更多行則返回 FALSE。

          自我介紹一下?

          答:我叫xxx,來(lái)自北京,20xx年畢業(yè)于xx大學(xué)計(jì)算機(jī)xx系,畢業(yè)后在xx從事了x年的php開(kāi)發(fā)工作,公司是一個(gè)外包公司,主要做微信開(kāi)發(fā),公眾號(hào)推廣,商城,論壇的開(kāi)發(fā)

          你在公司負(fù)責(zé)那些項(xiàng)目?

          答:由于我們公司是一個(gè)外包公司,不可能只做一個(gè)項(xiàng)目,公司的項(xiàng)目都是交叉進(jìn)行的,論壇,微信,商城我都做過(guò)?

          你做過(guò)哪些模塊?

          答:登陸注冊(cè),商品管理,購(gòu)物車模塊,訂單管理

          mvc是什么?相互間有什么關(guān)系?

          答:mvc是一種開(kāi)發(fā)模式,主要分為三部分:m(model),也就是模型,負(fù)責(zé)數(shù)據(jù)的操作;v(view),也就是視圖,負(fù)責(zé)前后臺(tái)的顯示;c(controller),也就是控制器,負(fù)責(zé)業(yè)務(wù)邏輯

          客戶端請(qǐng)求項(xiàng)目的控制器,如果執(zhí)行過(guò)程中需要用到數(shù)據(jù),控制器就會(huì)到模型中獲取數(shù)據(jù),再將獲取到的數(shù)據(jù)通過(guò)視圖顯示出來(lái)

          oop是什么?

          答:oop是面向?qū)ο缶幊?面向?qū)ο缶幊淌且环N計(jì)算機(jī)編程架構(gòu),OOP 的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。

          OOP具有三大特點(diǎn)

          1、封裝性:也稱為信息隱藏,就是將一個(gè)類的使用和實(shí)現(xiàn)分開(kāi),只保留部分接口和方法與外部聯(lián)系,或者說(shuō)只公開(kāi)了一些供開(kāi)發(fā)人員使用的方法。于是開(kāi)發(fā)人員只 需要關(guān)注這個(gè)類如何使用,而不用去關(guān)心其具體的實(shí)現(xiàn)過(guò)程,這樣就能實(shí)現(xiàn)MVC分工合作,也能有效避免程序間相互依賴,實(shí)現(xiàn)代碼模塊間松藕合。

          2、繼承性:就是子類自動(dòng)繼承其父級(jí)類中的屬性和方法,并可以添加新的屬性和方法或者對(duì)部分屬性和方法進(jìn)行重寫(xiě)。繼承增加了代碼的可重用性。PHP只支持單繼承,也就是說(shuō)一個(gè)子類只能有一個(gè)父類。

          3、多態(tài)性:子類繼承了來(lái)自父級(jí)類中的屬性和方法,并對(duì)其中部分方法進(jìn)行重寫(xiě)。于是多個(gè)子類中雖然都具有同一個(gè)方法,但是這些子類實(shí)例化的對(duì)象調(diào)用這些相同的方法后卻可以獲得完全不同的結(jié)果,這種技術(shù)就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性。

          1、易維護(hù)

          采用面向?qū)ο笏枷朐O(shè)計(jì)的結(jié)構(gòu),可讀性高,由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊,所以維護(hù)起來(lái)是非常方便和較低成本的。

          2、質(zhì)量高

          在設(shè)計(jì)時(shí),可重用現(xiàn)有的,在以前的項(xiàng)目的領(lǐng)域中已被測(cè)試過(guò)的類使系統(tǒng)滿足業(yè)務(wù)需求并具有較高的質(zhì)量。

          3、效率高

          在軟件開(kāi)發(fā)時(shí),根據(jù)設(shè)計(jì)的需要對(duì)現(xiàn)實(shí)世界的事物進(jìn)行抽象,產(chǎn)生類。使用這樣的方法解決問(wèn)題,接近于日常生活和自然的思考方式,勢(shì)必提高軟件開(kāi)發(fā)的效率和質(zhì)量。

          4、易擴(kuò)展

          由于繼承、封裝、多態(tài)的特性,自然設(shè)計(jì)出高內(nèi)聚、低耦合的系統(tǒng)結(jié)構(gòu),使得系統(tǒng)更靈活、更容易擴(kuò)展,而且成本較低。

          smarty是什么,有什么作用?

          回答一:smarty是用php寫(xiě)出來(lái)的模板引擎,也是目前業(yè)界最著名的php模板引擎之一

          它分離了邏輯代碼和外在的顯示,提供了一種易于管理和使用的方法,用來(lái)將混雜的php邏輯代碼與html代碼進(jìn)行分離

          回答二:smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經(jīng)封裝好了smarty模板,所以沒(méi)有單獨(dú)使用過(guò)

          回答三: smarty是個(gè)模板引擎,最顯著的地方就是有可以把模板緩存起來(lái)。一般模板來(lái)說(shuō),都是做一個(gè)靜態(tài)頁(yè)面,然后在里面把一些動(dòng)態(tài)的部分用一切分隔符切開(kāi),然后在PHP里打開(kāi)這個(gè)模板文件,把分隔符里面的值替換掉,然后輸出來(lái),你可以看下PHPLib里面的template部分。

          而smarty設(shè)定了緩存參數(shù)以后,第一次運(yùn)行時(shí)候會(huì)把模板打開(kāi),在php替換里面值的時(shí)候把讀取的html和php部分重新生成一個(gè)臨時(shí)的php文件,這樣就省去了每次打開(kāi)都重新讀取html了。如果修改了模板,只要重新刷下就行了。

          TP框架有哪些優(yōu)點(diǎn)?

          答:TP框架是我們中國(guó)人自己開(kāi)發(fā)的框架,各種資料比較齊全,國(guó)內(nèi)用的比較多,比較簡(jiǎn)單和方便,而且是免費(fèi)開(kāi)源的

          TP的特性有哪些?

          1.多表查詢非常方便,在model中幾句代碼就可以完成對(duì)多表的關(guān)聯(lián)操作

          2.融合了smarty模板,使前后臺(tái)分離

          3.支持多種緩存技術(shù),尤其對(duì)memcache技術(shù)支持非常好

          4.命名規(guī)范,模型,視圖,控制器嚴(yán)格遵循命名規(guī)則,通過(guò)命名一一對(duì)應(yīng)

          5.支持多種url模式

          6.內(nèi)置ajax返回方法,包括xml,json,html等

          7.支持應(yīng)用擴(kuò)展,類庫(kù)擴(kuò)展,驅(qū)動(dòng)擴(kuò)展等

          TP框架中的大字母函數(shù)?

          U:對(duì)url的組裝

          A:內(nèi)部實(shí)例化控制器

          S:緩存處理

          R:調(diào)用某個(gè)控制器的操作方法

          D:實(shí)例化自定義模型類

          M:實(shí)例化基礎(chǔ)模型類

          I:獲取參數(shù)

          L:設(shè)置或者獲取當(dāng)前語(yǔ)言

          C:設(shè)置或獲取,保存配置

          請(qǐng)介紹一下laravel框架?

          答: laravel框架的設(shè)計(jì)思想比較先進(jìn),非常適合應(yīng)用各種開(kāi)發(fā)模式,作為一個(gè)框架,它為你準(zhǔn)備好了一切,composer是php的未來(lái),沒(méi)有composer,php肯定要走向沒(méi)落

          laravel框架最大的特點(diǎn)和優(yōu)秀之處就是集合了php比較新的特點(diǎn),以及各種各樣的設(shè)計(jì)模式,Ioc模式,依賴注入等

          laravel有那些特點(diǎn)?

          回答一:

          1.強(qiáng)大的rest router:用簡(jiǎn)單的回調(diào)函數(shù)就可以調(diào)用,快速綁定controller和router

          2.artisan:命令行工具,很多手動(dòng)的工作都自動(dòng)化

          3.可繼承的模板,簡(jiǎn)化view的開(kāi)發(fā)和管理

          4.blade模板:渲染速度更快

          5.ORM操作數(shù)據(jù)庫(kù)

          6.migration:管理數(shù)據(jù)庫(kù)和版本控制

          7.測(cè)試功能也很強(qiáng)大

          8.composer也是亮點(diǎn)

          回答二: laravel框架引入了門(mén)面,依賴注入,Ioc模式,以及各種各樣的設(shè)計(jì)模式等

          請(qǐng)簡(jiǎn)述一下數(shù)據(jù)庫(kù)的優(yōu)化?

          答:數(shù)據(jù)庫(kù)的優(yōu)化可以從四個(gè)方面來(lái)優(yōu)化:

          1.從結(jié)構(gòu)層: web服務(wù)器采用負(fù)載均衡服務(wù)器,mysql服務(wù)器采用主從復(fù)制,讀寫(xiě)分離

          2.從儲(chǔ)存層: 采用合適的存儲(chǔ)引擎,采用三范式

          3.從設(shè)計(jì)層: 采用分區(qū)分表,索引,表的字段采用合適的字段屬性,適當(dāng)?shù)牟捎媚娣妒?開(kāi)啟mysql緩存

          4.sql語(yǔ)句層:結(jié)果一樣的情況下,采用效率高,速度快節(jié)省資源的sql語(yǔ)句執(zhí)行

          如何解決異常處理?

          答: 拋出異常:使用try…catch,異常的代碼放在try代碼塊內(nèi),如果沒(méi)有觸發(fā)異常,則代碼繼續(xù)執(zhí)行,如果異常被觸發(fā),就會(huì) 拋出一個(gè)異常。Catch代碼塊捕獲異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象。$e->getMessage(),輸出異常的錯(cuò)誤信息。

          解決異常:使用set_error_handler函數(shù)獲取異常(也可以使用try()和catch()函數(shù)),然后使用set_exception_handler()函數(shù)設(shè)置默認(rèn)的異常處理程序,register_shutdown_function()函數(shù)來(lái)執(zhí)行,執(zhí)行機(jī)制是,php要把調(diào)入的函數(shù)調(diào)入到內(nèi)存,當(dāng)頁(yè)面所有的php語(yǔ)句都執(zhí)行完成時(shí),再調(diào)用此函數(shù)

          前端?

          答:我在工作中處理前端的功能,一般就是用ajax向后臺(tái)請(qǐng)求數(shù)據(jù),然后返回?cái)?shù)據(jù)在前臺(tái)頁(yè)面中顯示出來(lái)。我從來(lái)沒(méi)有獨(dú)立的完整的將html和css樣式都一個(gè)人完成,如果公司實(shí)在有這樣的需求的話,我可能會(huì)找一些前臺(tái)的模板或者說(shuō)是前端的框架,比如說(shuō)h—ui等等

          權(quán)限管理(RBAC)的實(shí)現(xiàn)?

          1.首先創(chuàng)建一張用戶表:id name auto(保存格式為:控制器-方法)

          2.然后在后臺(tái)中創(chuàng)建一個(gè)基類控制器,控制器里封裝一個(gè)構(gòu)造方法,當(dāng)用戶登陸成功后,使用TP框架中封裝好的session函數(shù)獲取保存在服務(wù)器中的session id,然后實(shí)例化模型,通過(guò)用戶id獲取保存在數(shù)據(jù)表中的auth數(shù)據(jù),使用explode函數(shù)分割獲取到的數(shù)據(jù),并使用一個(gè)數(shù)組保存起來(lái),然后使用TP框架中封裝好的常量獲取當(dāng)前控制器和方法,然后把他們組裝成字符串,使用in_array函數(shù)進(jìn)行判斷該數(shù)組中是否含有當(dāng)前獲取到的控制器和方法,如果沒(méi)有,就提示該用戶沒(méi)有權(quán)限,如果有就進(jìn)行下一步操作

          怎么保證促銷商品不會(huì)超賣?

          答:這個(gè)問(wèn)題是我們當(dāng)時(shí)開(kāi)發(fā)時(shí)遇到的一個(gè)難點(diǎn),超賣的原因主要是下的訂單的數(shù)目和我們要促銷的商品的數(shù)目不一致導(dǎo)致的,每次總是訂單的數(shù)比我們的促銷商品的數(shù)目要多,當(dāng)時(shí)我們的小組討論了好久,給出了好幾個(gè)方案來(lái)實(shí)現(xiàn):

          第一種方案:在每次下訂單前我們判斷促銷商品的數(shù)量夠不夠,不夠不允許下訂單,更改庫(kù)存量時(shí)加上一個(gè)條件,只更改商品庫(kù)存大于0的商品的庫(kù)存,當(dāng)時(shí)我們使用ab進(jìn)行壓力測(cè)試,當(dāng)并發(fā)超過(guò)500,訪問(wèn)量超過(guò)2000時(shí),還是會(huì)出現(xiàn)超賣現(xiàn)象。所以被我們否定了。

          第二種方案:使用mysql的事務(wù)加排他鎖來(lái)解決,首先我們選擇數(shù)據(jù)庫(kù)的存儲(chǔ)引擎為innoDB,使用的是排他鎖實(shí)現(xiàn)的,剛開(kāi)始的時(shí)候我們測(cè)試了下共享鎖,發(fā)現(xiàn)還是會(huì)出現(xiàn)超賣的現(xiàn)象。有個(gè)問(wèn)題是,當(dāng)我們進(jìn)行高并發(fā)測(cè)試時(shí),對(duì)數(shù)據(jù)庫(kù)的性能影響很大,導(dǎo)致數(shù)據(jù)庫(kù)的壓力很大,最終也被我們否定了。

          第三種方案:使用文件鎖實(shí)現(xiàn)。當(dāng)用戶搶到一件促銷商品后先觸發(fā)文件鎖,防止其他用戶進(jìn)入,該用戶搶到促銷品后再解開(kāi)文件鎖,放其他用戶進(jìn)行操作。這樣可以解決超賣的問(wèn)題,但是會(huì)導(dǎo)致文件得I/O開(kāi)銷很大。

          最后我們使用了redis的隊(duì)列來(lái)實(shí)現(xiàn)。將要促銷的商品數(shù)量以隊(duì)列的方式存入redis中,每當(dāng)用戶搶到一件促銷商品則從隊(duì)列中刪除一個(gè)數(shù)據(jù),確保商品不會(huì)超賣。這個(gè)操作起來(lái)很方便,而且效率極高,最終我們采取這種方式來(lái)實(shí)現(xiàn)

          商城秒殺的實(shí)現(xiàn)?

          答:搶購(gòu)、秒殺是如今很常見(jiàn)的一個(gè)應(yīng)用場(chǎng)景,主要需要解決的問(wèn)題有兩個(gè):

          1 高并發(fā)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生的壓力

          2 競(jìng)爭(zhēng)狀態(tài)下如何解決庫(kù)存的正確減少("超賣"問(wèn)題)

          對(duì)于第一個(gè)問(wèn)題,已經(jīng)很容易想到用緩存來(lái)處理?yè)屬?gòu),避免直接操作數(shù)據(jù)庫(kù),例如使用Redis。第二個(gè)問(wèn)題,我們可以使用redis隊(duì)列來(lái)完成,把要秒殺的商品放入到隊(duì)列中,因?yàn)閜op操作是原子的,即使有很多用戶同時(shí)到達(dá),也是依次執(zhí)行,文件鎖和事務(wù)在高并發(fā)下性能下降很快,當(dāng)然還要考慮其他方面的東西,比如搶購(gòu)頁(yè)面做成靜態(tài)的,通過(guò)ajax調(diào)用接口,其中也可能會(huì)出現(xiàn)一個(gè)用戶搶多次的情況,這時(shí)候需要再加上一個(gè)排隊(duì)隊(duì)列和搶購(gòu)結(jié)果隊(duì)列及庫(kù)存隊(duì)列。

          高并發(fā)情況下,將用戶進(jìn)入排隊(duì)隊(duì)列,用一個(gè)線程循環(huán)處理從排隊(duì)隊(duì)列取出一個(gè)用戶,判斷用戶是否已在搶購(gòu)結(jié)果隊(duì)列,如果在,則已搶購(gòu),否則未搶購(gòu),庫(kù)存減1,寫(xiě)數(shù)據(jù)庫(kù),將用戶入結(jié)果隊(duì)列。

          購(gòu)物車的原理?

          答:購(gòu)物車相當(dāng)于現(xiàn)實(shí)中超市的購(gòu)物車,不同的是一個(gè)是實(shí)體車,一個(gè)是虛擬車而已。

          用戶可以在購(gòu)物網(wǎng)站的不同頁(yè)面之間跳轉(zhuǎn),以選購(gòu)自己喜愛(ài)的商品,點(diǎn)擊購(gòu)買時(shí),該商品就自動(dòng)保存到你的購(gòu)物車中,重復(fù)選購(gòu)后,最后將選中的所有商品放在購(gòu)物車中統(tǒng)一到付款臺(tái)結(jié)賬,這也是盡量讓客戶體驗(yàn)到現(xiàn)實(shí)生活中購(gòu)物的感覺(jué)。服務(wù)器通過(guò)追蹤每個(gè)用戶的行動(dòng),以保證在結(jié)賬時(shí)每件商品都物有其主。

          主要涉及以下幾點(diǎn):

          1、把商品添加到購(gòu)物車,即訂購(gòu)

          2、刪除購(gòu)物車中已定購(gòu)的商品

          3、修改購(gòu)物車中某一本圖書(shū)的訂購(gòu)數(shù)量

          4、清空購(gòu)物車

          5、顯示購(gòu)物車中商品清單及數(shù)量、價(jià)格

          實(shí)現(xiàn)購(gòu)物車的關(guān)鍵在于服務(wù)器識(shí)別每一個(gè)用戶并維持與他們的聯(lián)系。但是HTTP協(xié)議是一種“無(wú)狀態(tài)(Stateless)”的協(xié)議,因而服務(wù)器不能記住是誰(shuí)在購(gòu)買商品,當(dāng)把商品加入購(gòu)物車時(shí),服務(wù)器也不知道購(gòu)物車?yán)镌扔行┦裁矗沟糜脩粼诓煌?yè)面間跳轉(zhuǎn)時(shí)購(gòu)物車無(wú)法“隨身攜帶”,這都給購(gòu)物車的實(shí)現(xiàn)造成了一定的困難。

          目前購(gòu)物車的實(shí)現(xiàn)主要是通過(guò)cookie、session或結(jié)合數(shù)據(jù)庫(kù)的方式。下面分析一下它們的機(jī)制及作用。

          cookie

          cookie是由服務(wù)器產(chǎn)生,存儲(chǔ)在客戶端的一段信息。它定義了一種Web服務(wù)器在客戶端存儲(chǔ)和返回信息的機(jī)制,cookie文件它包含域、路徑、生存期、和由服務(wù)器設(shè)置的變量值等內(nèi)容。當(dāng)用戶以后訪問(wèn)同一個(gè)Web服務(wù)器時(shí),瀏覽器會(huì)把cookie原樣發(fā)送給服務(wù)器。

          通過(guò)讓服務(wù)器讀取原先保存到客戶端的信息,網(wǎng)站能夠?yàn)闉g覽者提供一系列的方便,例如在線交易過(guò)程中標(biāo)識(shí)用戶身份、安全要求不高的場(chǎng)合避免用戶重復(fù)輸入名字和密碼、門(mén)戶網(wǎng)站的主頁(yè)定制、有針對(duì)性地投放廣告等等。利用cookie的特性,大大擴(kuò)展了WEB應(yīng)用程序的功能,不僅可以建立服務(wù)器與客戶機(jī)的聯(lián)系,因?yàn)閏ookie可以由服務(wù)器定制,因此還可以將購(gòu)物信息生成cookie值存放在客戶端,從而實(shí)現(xiàn)購(gòu)物車的功能。

          用基于cookie的方式實(shí)現(xiàn)服務(wù)器與瀏覽器之間的會(huì)話或購(gòu)物車,有以下特點(diǎn):

          1、cookie存儲(chǔ)在客戶端,且占用很少的資源,瀏覽器允許存放300個(gè)cookie,每個(gè)cookie的大小為4KB,足以滿足購(gòu)物車的要求,同時(shí)也減輕了服務(wù)器的負(fù)荷;

          2、cookie為瀏覽器所內(nèi)置,使用方便。即使用戶不小心關(guān)閉了瀏覽器窗口,只要在cookie定義的有效期內(nèi),購(gòu)物車中的信息也不會(huì)丟失;

          3、cookie不是可執(zhí)行文件,所以不會(huì)以任何方式執(zhí)行,因此也不會(huì)帶來(lái)病毒或攻擊用戶的系統(tǒng);

          4、基于cookie的購(gòu)物車要求用戶瀏覽器必須支持并設(shè)置為啟用cookie,否則購(gòu)物車則失效;

          5、存在著關(guān)于cookie侵犯訪問(wèn)者隱私權(quán)的爭(zhēng)論,因此有些用戶會(huì)禁止本機(jī)的cookie功能。

          session

          session是實(shí)現(xiàn)購(gòu)物車的另一種方法。session提供了可以保存和跟蹤用戶的狀態(tài)信息的功能,使當(dāng)前用戶在session中定義的變量和對(duì)象能在頁(yè)面之間共享,但是不能為應(yīng)用中其他用戶所訪問(wèn),它與cookie最重大的區(qū)別是,session將用戶在會(huì)話期間的私有信息存儲(chǔ)在服務(wù)器端,提高了安全性。

          在服務(wù)器生成session后,客戶端會(huì)生成一個(gè)sessionid識(shí)別號(hào)保存在客戶端,以保持和服務(wù)器的同步。這個(gè)sessionid是只讀的,如果客戶端禁止cookie功能,session會(huì)通過(guò)在URL中附加參數(shù),或隱含在表單中提交等其他方式在頁(yè)面間傳送。因此利用session實(shí)施對(duì)用戶的管理則更為安全、有效。

          同樣,利用session也能實(shí)現(xiàn)購(gòu)物車,這種方式的特點(diǎn)是:

          1、session用新的機(jī)制保持與客戶端的同步,不依賴于客戶端設(shè)置;

          2、與cookie相比,session是存儲(chǔ)在服務(wù)器端的信息,因此顯得更為安全,因此可將身份標(biāo)示,購(gòu)物等信息存儲(chǔ)在session中;

          3、session會(huì)占用服務(wù)器資源,加大服務(wù)器端的負(fù)載,尤其當(dāng)并發(fā)用戶很多時(shí),會(huì)生成大量的session,影響服務(wù)器的性能;

          4、因?yàn)閟ession存儲(chǔ)的信息更敏感,而且是以文件形式保存在服務(wù)器中,因此仍然存在著安全隱患。

          結(jié)合數(shù)據(jù)庫(kù)的方式

          這也是目前較普遍的模式,在這種方式中,數(shù)據(jù)庫(kù)承擔(dān)著存儲(chǔ)購(gòu)物信息的作用,session或cookie則用來(lái)跟蹤用戶。這種方式具有以下特點(diǎn):

          1、數(shù)據(jù)庫(kù)與cookie分別負(fù)責(zé)記錄數(shù)據(jù)和維持會(huì)話,能發(fā)揮各自的優(yōu)勢(shì),使安全性和服務(wù)器性能都得到了提高;

          2、每一個(gè)購(gòu)物的行為,都要直接建立與數(shù)據(jù)庫(kù)的連接,直至對(duì)表的操作完成后,連接才釋放。當(dāng)并發(fā)用戶很多時(shí),會(huì)影響數(shù)據(jù)庫(kù)的性能,因此,這對(duì)數(shù)據(jù)庫(kù)的性能提出了更高的要求;

          3、使cookie維持會(huì)話有賴客戶端的支持。

          各種方式的選擇:

          雖然cookie可用來(lái)實(shí)現(xiàn)購(gòu)物車,但必須獲得瀏覽器的支持,再加上它是存儲(chǔ)在客戶端的信息,極易被獲取,所以這也限制了它存儲(chǔ)更多,更重要的信息。所以一般cookie只用來(lái)維持與服務(wù)器的會(huì)話

          例如國(guó)內(nèi)最大的當(dāng)當(dāng)網(wǎng)絡(luò)書(shū)店就是用cookie保持與客戶的聯(lián)系,但是這種方式最大的缺點(diǎn)是如果客戶端不支持cookie就會(huì)使購(gòu)物車失效。

          Session能很好地與交易雙方保持會(huì)話,可以忽視客戶端的設(shè)置。在購(gòu)物車技術(shù)中得到了廣泛的應(yīng)用。但session的文件屬性使其仍然留有安全隱患。

          結(jié)合數(shù)據(jù)庫(kù)的方式雖然在一定程度上解決了上述的問(wèn)題,但從上面的例子可以看出:在這種購(gòu)物流程中涉及到對(duì)數(shù)據(jù)庫(kù)表的頻繁操作,尤其是用戶每選購(gòu)一次商品,都要與數(shù)據(jù)庫(kù)進(jìn)行連接,當(dāng)用戶很多的時(shí)候就加大了服務(wù)器與數(shù)據(jù)庫(kù)的負(fù)荷。

          redis消息隊(duì)列先進(jìn)先出需要注意什么?(

          REDIS高級(jí)應(yīng)用:使用redis消息隊(duì)列完成秒殺過(guò)期訂單處理)

          答:通常使用一個(gè)list來(lái)實(shí)現(xiàn)隊(duì)列操作,這樣有一個(gè)小限制,所以的任務(wù)統(tǒng)一都是先進(jìn)先出,如果想優(yōu)先處理某個(gè)任務(wù)就不太好處理了,這就需要讓隊(duì)列有優(yōu)先級(jí)的概念,我們就可以優(yōu)先處理高級(jí)別的任務(wù),實(shí)現(xiàn)方式有以下幾種方式:

          1)單一列表實(shí)現(xiàn):隊(duì)列正常的操作是 左進(jìn)右出(lpush,rpop)為了先處理高優(yōu)先級(jí)任務(wù),在遇到高級(jí)別任務(wù)時(shí),可以直接插隊(duì),直接放入隊(duì)列頭部(rpush),這樣,從隊(duì)列頭部(右側(cè))獲取任務(wù)時(shí),取到的就是高優(yōu)先級(jí)的任務(wù)(rpop)

          2)使用兩個(gè)隊(duì)列,一個(gè)普通隊(duì)列,一個(gè)高級(jí)隊(duì)列,針對(duì)任務(wù)的級(jí)別放入不同的隊(duì)列,獲取任務(wù)時(shí)也很簡(jiǎn)單,redis的BRPOP命令可以按順序從多個(gè)隊(duì)列中取值,BRPOP會(huì)按照給出的 key 順序查看,并在找到的第一個(gè)非空 list 的尾部彈出一個(gè)元素,redis> BRPOP list1 list2 0

          list1 做為高優(yōu)先級(jí)任務(wù)隊(duì)列

          list2 做為普通任務(wù)隊(duì)列

          這樣就實(shí)現(xiàn)了先處理高優(yōu)先級(jí)任務(wù),當(dāng)沒(méi)有高優(yōu)先級(jí)任務(wù)時(shí),就去獲取普通任務(wù)

          方式1最簡(jiǎn)單,但實(shí)際應(yīng)用比較局限,方式3可以實(shí)現(xiàn)復(fù)雜優(yōu)先級(jí),但實(shí)現(xiàn)比較復(fù)雜,不利于維護(hù)

          方式2是推薦用法,實(shí)際應(yīng)用最為合適

          你負(fù)責(zé)的模塊有哪些難題?

          答:在我負(fù)責(zé)的B2B電商項(xiàng)目中,當(dāng)時(shí)我負(fù)責(zé)的是訂單模塊,由于客戶一次選擇了多家商戶的商品,最終生成了一個(gè)訂單,這樣我們平臺(tái)在給商戶結(jié)算時(shí)出現(xiàn)了不知道這比費(fèi)用應(yīng)該給哪個(gè)商戶,這時(shí)候我們小組經(jīng)過(guò)討論,需要涉及到訂單拆分,也就是說(shuō)用戶點(diǎn)擊支付后,如果有多件商品,并且不是同一家店鋪那么 就要用到訂單的拆分,比如如果有兩件商品,并且不是同一店鋪 就在原來(lái)的訂單號(hào)下 在生成兩個(gè)子訂單號(hào) 并修改訂單表中兩件商品的訂單號(hào)。最終實(shí)現(xiàn)了商品的分配管理,解決了我們的難題。

          我覺(jué)得在開(kāi)發(fā)過(guò)程中,遇到的難題無(wú)非是兩個(gè),一個(gè)是技術(shù)層次的,我認(rèn)為,只要你有恒心,有熱心,沒(méi)有覺(jué)得不了的難題。另一個(gè)就是溝通問(wèn)題,在任何地方任何時(shí)候溝通都是最重要的,尤其是我們做開(kāi)發(fā)的,不溝通好,會(huì)影響整個(gè)項(xiàng)目的進(jìn)度,我本人是個(gè)非常還溝通的人,所以這點(diǎn)上也沒(méi)多大問(wèn)題。

          用戶下單是怎么處理的?

          答:判斷用戶有沒(méi)有登錄,在沒(méi)有登錄的情況下,不允許下單。登陸后,可進(jìn)行下單,并生成唯一的訂單號(hào),此時(shí)訂單的狀態(tài)為未支付。

          電商的登錄是怎么實(shí)現(xiàn)的?

          答:分為普通登錄和第三方登錄 這邊主要說(shuō)一下第三方登錄吧,第三方登陸主要使用的是author協(xié)議,我就以QQ的第三方登陸為例來(lái)進(jìn)行說(shuō)明:當(dāng)用戶在我們的站點(diǎn)請(qǐng)求QQ的第三方登陸時(shí),我們站點(diǎn)會(huì)引導(dǎo)用戶跳轉(zhuǎn)到QQ的登陸授權(quán)界面, 當(dāng)用戶輸入QQ和密碼成功登錄以后會(huì)自動(dòng)跳回到我們站點(diǎn)設(shè)置好的回調(diào)頁(yè)面,并附帶一個(gè)code參數(shù),接著你使用code再次去請(qǐng)求QQ的授權(quán)頁(yè)面,就可以從中獲取到一個(gè)access token(訪問(wèn)令牌),通過(guò)這個(gè)access_token,我們可以調(diào)用QQ提供給我們的接口,比如獲取open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權(quán)信息和open_id和我們平臺(tái)的普通用戶進(jìn)行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實(shí)現(xiàn)登陸。

          接口安全方面是怎么處理的?

          答:我們當(dāng)時(shí)是這么做的,使用HTTP的POST方式,對(duì)固定參數(shù)+附加參數(shù)進(jìn)行數(shù)字簽名,使用的是md5加密,比如:我想通過(guò)標(biāo)題獲取一個(gè)信息,在客戶端使用 信息標(biāo)題+日期+雙方約定好的一個(gè)key通過(guò)md5加密生成一個(gè)簽名(sign),然后作為參數(shù)傳遞到服務(wù)器端,服務(wù)器端使用同樣的方法進(jìn)行校驗(yàn),如何接受過(guò)來(lái)的sign和我們通過(guò)算法算的值相同,證明是一個(gè)正常的接口請(qǐng)求,我們才會(huì)返回相應(yīng)的接口數(shù)據(jù)。

          用的什么技術(shù)實(shí)現(xiàn)短信發(fā)送,在哪調(diào)用?

          答:我主要用的第三方短信接口,在申請(qǐng)接口時(shí)進(jìn)行相應(yīng)信息的配置,然后在我們站點(diǎn)需要用到短信驗(yàn)證的地方進(jìn)行調(diào)用,我們通常在用戶注冊(cè)時(shí)使用到。

          看了以上的面試題,是不是有種豁然開(kāi)朗的感覺(jué)呢?小編還有更多面試題及答案分享給大家哦:

          • 秒殺當(dāng)中的細(xì)節(jié)你是怎么得出來(lái)的?
          • 做秒殺用什么數(shù)據(jù)庫(kù),怎么實(shí)現(xiàn)的?
          • 支付寶流程怎么實(shí)現(xiàn)的?
          • 什么是單點(diǎn)登錄?
          • 什么情況下使用緩存?
          • 怎么實(shí)現(xiàn)第三方登錄?
          • 如何處理負(fù)載、高并發(fā)?(好好看看,經(jīng)常問(wèn)到,能回答到主要的東西即可)?
          • Nginx的優(yōu)點(diǎn)是,缺點(diǎn)是?
          • 更多……

          完整面試題獲取方式:關(guān)注黑馬程序員頭條號(hào),后臺(tái)回復(fù)“PHP面試”即可!

          51CTO.com快譯】JavaScript與PHP,都是目前人氣較高的兩款編程語(yǔ)言。PHP是基于C語(yǔ)言而打造,因此非常適合有C語(yǔ)言基礎(chǔ)的開(kāi)發(fā)者。事實(shí)上,兩種語(yǔ)言對(duì)于新手程序員來(lái)說(shuō)都是比較容易上手的,而且它們都具備出色的靈活性與可擴(kuò)展性。

          那么,它們到底有何不同?

          1.PHP能更輕松地實(shí)現(xiàn)定制化目標(biāo):

          重構(gòu)與定制化能力是決定編程語(yǔ)言命運(yùn)的兩大重要因素。PHP是開(kāi)放源代碼軟件,意味開(kāi)發(fā)者可以根據(jù)社區(qū)需求進(jìn)行修改,而非立足單個(gè)開(kāi)發(fā)者的需求,也正是它的開(kāi)源特性使得PHP更為靈活也更加適用。憑借著這一點(diǎn)PHP能獲得很多開(kāi)發(fā)者的支持的原因之一。Comiconverse公司CEO透露稱,“我們更樂(lè)于利用PHP開(kāi)發(fā)網(wǎng)站,因?yàn)槲覀兡軌蜉p松做出自己需要的變更。JavaScript雖然也很實(shí)用,但開(kāi)發(fā)者能夠利用PHP更輕松地實(shí)現(xiàn)定制化目標(biāo)。”

          需要注意的是,PHP在這方面僅僅是略有優(yōu)勢(shì)。JavaScript同樣可以根據(jù)實(shí)際需求進(jìn)行重構(gòu)與定制,只不過(guò)在效率上不及PHP。

          2.各方面對(duì)比:

          • 上手難度:js完全oop相對(duì)PHP更容易理解一些,但是文檔不如PHP完善,而且語(yǔ)言更新運(yùn)營(yíng)還解析引擎不是一家,沒(méi)辦法寫(xiě)清底層原理。那也是js上手簡(jiǎn)單一些,起碼不用搭環(huán)境選版本

          • 特性:js是事件驅(qū)動(dòng)的,很靈活但是也很坑,調(diào)試起來(lái)比較困難(曾經(jīng)被吭哭),而PHP的特性就比較混亂了,組件很多。雙方特性各有優(yōu)點(diǎn),PHP的引用傳遞,js的萬(wàn)物皆對(duì)象。平均水平j(luò)s贏,整天實(shí)力PHP贏。

          • 功能:要說(shuō)功能強(qiáng)大,很明顯,js暫時(shí)還比不上PHP,而且客戶端js被限制了很多,比如跨域,ajax寫(xiě)入,文件讀取什么的。

          • 開(kāi)發(fā)難度:其實(shí)都不難,但是PHP比較依賴文檔還搜索引擎,因?yàn)槊麊?wèn)題很難記住,這一點(diǎn)js做的就比較好了,尤其是正則表達(dá)式部分。

          • 語(yǔ)義:個(gè)人比較看重的一點(diǎn)就是語(yǔ)言的語(yǔ)義性,這一點(diǎn)js的完全對(duì)象化占很大的優(yōu)勢(shì),調(diào)用屬性或方法.和[]語(yǔ)義性特別強(qiáng),而PHP這方面就比較謹(jǐn)慎,限制的比較嚴(yán)格。但是js也有一個(gè)語(yǔ)義部分很糟糕的部分,就是下面這個(gè)

          • 注釋:PHP有相當(dāng)完善的注釋系統(tǒng),而且各個(gè)IDE支持的非常好,當(dāng)PHP作為核心驅(qū)動(dòng)的時(shí)候代碼提示和注釋非常給力。反觀js大多以編輯器為主,作為驅(qū)動(dòng)也是最近不久,所以注釋方面不如PHP完善。


          3.開(kāi)發(fā)大型Web應(yīng)用中,JavaScript有明顯優(yōu)勢(shì)

          兩種語(yǔ)言都能用于開(kāi)發(fā)大型Web應(yīng)用,但JavaScript在這一領(lǐng)域擁有明顯優(yōu)勢(shì)。如之前所提到,專用服務(wù)器能夠更好地托管JavaScript用例,因此其更適合用于大型Web應(yīng)用開(kāi)發(fā)。


          4.PHP是一種更為年輕的語(yǔ)言,因此傳統(tǒng)企業(yè)更傾向于選擇JavaScript。

          如果是在小型企業(yè)工作的開(kāi)發(fā)人員,他們通常會(huì)使用PHP。但如果在大型企業(yè)或者是傳統(tǒng)企業(yè),那么JavaScript會(huì)是系統(tǒng)與項(xiàng)目中的普及度更高的語(yǔ)言。PHP是一種更為年輕的語(yǔ)言,因此傳統(tǒng)企業(yè)更傾向于選擇JavaScript,以簡(jiǎn)化IT部門(mén)內(nèi)部的管理工作。

          同樣需要強(qiáng)調(diào)的是,JavaScript是一種認(rèn)證的付費(fèi)語(yǔ)言。這意味著大家可以考取JavaScript相關(guān)資質(zhì)認(rèn)證,而PHP則不行。另外,如果學(xué)PHP,最后你還得學(xué)javascript,因?yàn)楝F(xiàn)在PHP 只會(huì)后端不會(huì)前端,很難找到工作。


          5.不可一概而論

          正如很多程序員所言,我們沒(méi)辦法將二者進(jìn)行簡(jiǎn)單比較,因?yàn)樗鼈兊挠猛静⒉灰粯印HP是一種服務(wù)器端腳本語(yǔ)言,而JavaScript則是一種面向桌面與服務(wù)器端的通用型語(yǔ)言。這意味著程序員能夠利用JavaScript完成更為廣泛的應(yīng)用目標(biāo)。


          6.總結(jié)——應(yīng)該如何選擇?

          選擇哪款語(yǔ)言,取決于您的協(xié)作對(duì)象以及使用目的。在理想情況下,大家最好能同時(shí)掌握兩者。如果非要選擇其一,那么PHP應(yīng)該能夠憑借著開(kāi)源特性、更多支持選項(xiàng)以及靈活的可塑性小幅勝出。

          當(dāng)然,這只是我的個(gè)人見(jiàn)解。您對(duì)此有何看法?請(qǐng)?jiān)谠u(píng)論中與我們分享。


          原文鏈接:https://dzone.com/articles/javascript-vs-php-whats-the-difference

          原文標(biāo)題:JavaScript vs. PHP: What's the Difference?

          原文作者:Carol Jon

          【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】


          主站蜘蛛池模板: 亚洲AV无码一区二区乱孑伦AS| 亚欧免费视频一区二区三区| 中日韩一区二区三区| 亚洲福利视频一区| 国产亚洲综合一区柠檬导航| 色一乱一伦一区一直爽| 国产精品一区二区三区高清在线 | 亚洲av综合av一区| 国产成人高清亚洲一区久久| 波多野结衣免费一区视频| 精品视频在线观看你懂的一区| 日本国产一区二区三区在线观看 | | 亚洲日韩中文字幕一区| 99精品一区二区免费视频| 少妇一夜三次一区二区| 国产av一区二区精品久久凹凸| 精品视频一区二区三区四区五区| 国偷自产一区二区免费视频| 亚洲成AV人片一区二区| 日本无码一区二区三区白峰美| 国产精品一区三区| 亚洲美女一区二区三区| 国产成人精品一区二三区| 国模丽丽啪啪一区二区| 亚洲AV无码一区二区三区网址| 波多野结衣中文字幕一区| 久久久久成人精品一区二区 | 日韩人妻精品一区二区三区视频| 色狠狠色狠狠综合一区| 国产精品一区12p| 国产精品一区二区电影| 国产福利一区二区三区在线观看 | 国产在线一区二区| 国产一区中文字幕| 国产精品乱码一区二区三| 亚洲国产精品一区二区第一页 | 国产成人一区二区三中文| 中文无码精品一区二区三区| 国产一区二区三区电影| 在线中文字幕一区|