1. 程式人生 > >【Django REST framework電商專案筆記】第10章 購物車, 訂單和支付寶支付功能(下)

【Django REST framework電商專案筆記】第10章 購物車, 訂單和支付寶支付功能(下)

Pycharm遠端除錯程式碼

第三方支付和第三方登入都有一個回撥的URl。一般指向伺服器的ip地址。 要完成能夠通過pycharm去除錯遠端的伺服器,回撥時就可以除錯程式碼。

如何將程式碼上傳到遠端伺服器

1、點選tools下的deploy點選configuration… 2、new一個 sftp, Name: vueshop 為了防止連線過一段時間自動退出來

yum install tmux

3、將本地地址與伺服器上目錄地址進行繫結對映。 4、程式碼同步過去了,不代表我們可以除錯遠端伺服器的程式碼了,還必須在遠端伺服器建立一個虛擬環境。

在遠端伺服器建立虛擬環境

1、安裝python3.6 獲取

wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
tar -xzvf Python-3.6.2.tgz -C  /tmp
cd  /tmp/Python-3.6.2/

把python3.6 安裝到 /usr/local 目錄

./configure --prefix=/usr/local
make
make altinstall

更改 /usr/bin/python 連結

ln -s /usr/local/bin/python3.6 /usr/bin/python3

注意: 阿里雲端口限制 安全組規則中新建規則 連線上之後新建資料庫,將本地資料庫進行同步。資料傳輸,選擇伺服器和它的資料庫 如果資料傳輸失敗的話,工具裡面有個伺服器監控,裡面有個變數,可以修改max_allowed_packet大小

2、新建虛擬環境。centos下需要多執行一條 yum install python-setuptools python-devel

不同作業系統下檔案的位置可能不同。 sudo find / -name virtualenvwrapper.sh

mysqlclient安裝出錯。 pip install -r requirement.txt

專案中setting.py裡關於mysql的配置。 host 應該寫遠端伺服器的 ip 地址 在 mysql 的設定許可權中設定了 % 就不會包括 localhost 要點選專案的根目錄再點選上傳

python manage.py runserver 0.0.0
.0:8000

部署到外部伺服器時需要加上 allowed_hosts,這樣才能執行外部的ip 的訪問 解析器是配置伺服器端的解析器

3、ssh驗證 ip地址 使用者名稱 密碼 要將python環境選擇到我們新建的虛擬環境的python。會將伺服器端的全部拷貝到本地。 debug。設定ip 0.0.0.0 然後啟動程式碼。打斷點進行除錯。

支付寶公鑰,私鑰和沙箱環境的配置

登陸之後,進入管理中心 建立一個應用

我們可以拿到應用的appid。在真正上線的時候需要提交這些資訊進行稽核的。 微信支付和支付寶支付都是要求企業認證才可以完成的。個人開發者是不可以的。

文件中告訴了我們這些介面需要傳遞的引數。正式環境的地址,而我們實際要用到的是沙箱環境。將地址改為沙箱環境的。

請求引數 appid 也就是我們沙箱環境提供的appid。(正式的是我們自己的) return url 引數實際是我們自己的url charset String: utf-8 sign_type: 商戶生成簽名字串所使用的簽名演算法型別: 推薦使用RSA2 sign 非常核心的一個引數,關係到能否成功。

點選下載工具。

開啟工具中的說明 1、雙擊指令碼檔案 “RSA簽名驗籤工具.bat” 即執行RSA簽名驗籤工具。 2、RSA2簽名方式使用演算法:SHA256withRSA。 RSA簽名方式使用演算法:SHA1withRSA。 3、簽名驗籤工具不要放在檔案路徑名存在空格的資料夾下。 因為我們使用的是python。所以是非python版本,長度選擇2048

點選生成後,可以在路徑下檢視到應用公鑰和應用私鑰 前往沙箱環境上傳公鑰,將我們剛才生成的公鑰貼上進去 點選驗證公鑰正確性(這個簽名工具只支援java適用的pkcs8,所以我們不做驗證了)。點選下載使用簽名工具 我們的私鑰檔案一定要妥善保管。將中文名改為英文名。 重要步驟: 在公鑰和私鑰的字串前後加上

-----BEGIN PRIVATE KEY-----

-----END PRIVATE KEY-----

此時要將沙箱環境中支付寶提供給我們的公鑰也要取下來。 這個公鑰在我們後面做訂單查詢狀態的時候有用。 新建alipay_key_2048.txt,然後將公鑰拷入。 這裡面最重要的是支付寶的公鑰和我們自己的私鑰 我們在請求支付寶的時候拿著我們的金鑰進行加密,支付寶拿著我們給他上傳的公鑰去進行解密驗證。

支付寶開發文件解讀

將解析器設定為本地執行環境 支付寶官方文件:

  • 電腦網站支付介面:統一下單支付介面

請求的地址以及引數,appid(沙箱或自己) sign 的生成很關鍵

  • timestamp 時間戳
  • version 固定值
  • biz_content 這個值很關鍵

sign & biz_content 業務請求引數的集合,最大長度不限,除公共引數除外,所有請求引數都必須放在這個引數中傳遞,聚體參照各產品快速接入文件

其他的欄位都沒有表明我們要支付多少錢等,所以只有通過該欄位支付寶才能知道我們需要支付多少錢,以及產品名稱等。

請求引數:

out_trade_no: 商戶自己平臺的訂單號 在我們的trade中models中已經有該欄位就是order_sn 這個訂單號需要傳遞過去。因為它會將該訂單號傳遞回來。 product_code: 目前只支援FAST_INSTANT_TRADE_PAY。值固定,不用細究 total_amount:實際就是訂單的交易金額(單位為元,精確到小數點後兩位) subject: 訂單的標題 body: 訂單描述

後面的欄位都是非必填欄位。

singn商戶請求引數的簽名串,詳見簽名

技術同學把1.APPID,2.應用私鑰,3.支付寶公鑰,配置在程式碼中,對請求內容進行簽名,並對支付寶返回的內容進行驗籤。

如何簽名

1.篩選並排序

獲取所有請求引數(appid method等),不包括位元組型別引數,如檔案、位元組流,剔除sign欄位,剔除值為空的引數,並按照第一個字元的鍵值ASCII碼遞增排序(字母升序排序),如果遇到相同字元則按照第二個字元的鍵值ASCII碼遞增排序,以此類推。

比如a是排在m之前的,要對所有引數進行排序

2.拼接

將排序後的引數與其對應值,組合成“引數=引數值”的格式,並且把這些引數用&字元連線起來,此時生成的字串為待簽名字串。

REQUEST URL: https://openapi.alipay.com/gateway.do
REQUEST METHOD: POST
CONTENT:
app_id=201809*****7148
method=alipay.mobile.public.menu.add
charset=GBK
sign_type=RSA2
timestamp=2018-10-05 12:12:52
biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"話費充值"},{"name":"查詢","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"餘額查詢"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查詢"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"話費查詢"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新優惠"}]}
sign=e9zEAe4TTQ4LPLQvETPoLGXTiURcxiAKfMVQ6Hrrsx2hmyIEGvSfAQzbLxHrhyZ48wOJXTsD4FPnt+YGdK57+fP1BCbf9rIVycfjhYCqlFhbTu9pFnZgT55W+xbAFb9y7vL0MyAxwXUXvZtQVqEwW7pURtKilbcBTEW7TAxzgro=
version=1.0

appid 等於這個值,拼出來效果app_id=201809*****7148

拼完之後,用&符號連線起來。此時生成的字串為待簽名字串

前面的這些工作都只是為了生成一個字串,這個字串我們還要對他進行簽名。才能夠最終生成我們的sign值。

使用各自語言對應的SHA256WithRSA(對應sign_type為RSA2)或SHA1WithRSA(對應sign_type為RSA)簽名函式利用商戶私鑰(我們之前生成的那個)對待簽名字串進行簽名,並進行Base64編碼。

不僅要簽名,簽名之後還要使用base64編碼

3.把生成的簽名賦值給sign引數,拼接到請求引數中。 可以參考開放平臺SDK原始碼中AlipaySignature.rsaSign方法。

開始編碼

pip install pycryptodome
# -*- coding: utf-8 -*-
__author__ = 'Evan'
# pip install pycryptodome

from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256

from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from urllib.request import urlopen

from base64 import b64encode, b64decode
from base64 import decodebytes, encodebytes

import json


class AliPay(object):
    """
    支付寶支付介面
    """
    def __init__(self, appid, app_notify_url, app_private_key_path,
                 alipay_public_key_path, return_url, debug=False):
        self.appid = appid
        self.app_notify_url = app_notify_url
        self.app_private_key_path = app_private_key_path
        self.app_private_key = None
        self.return_url = return_url
        with open(self.app_private_key_path) as fp:
            self.app_private_key = RSA.importKey(fp.read())

        self.alipay_public_key_path = alipay_public_key_path
        with open(self.alipay_public_key_path) as fp:
            self.alipay_public_key = RSA.import_key(fp.read())


        if debug is True:
            self.__gateway = "https://openapi.alipaydev.com/gateway.do"
        else:
            self.__gateway = "https://openapi.alipay.com/gateway.do"

    def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):
        biz_content = {
            "subject": subject,
            "out_trade_no": out_trade_no,
            "total_amount": total_amount,
            "product_code": "FAST_INSTANT_TRADE_PAY",
            # "qr_pay_mode":4
        }

        biz_content.update(kwargs)
        data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)
        return self.sign_data(data)

    def build_body(self, method, biz_content, return_url=None):
        data = {
            "app_id": self.appid,
            "method": method,
            "charset": "utf-8",
            "sign_type": "RSA2",
            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "version": "1.0",
            "biz_content": biz_content
        }

        if return_url is not None:
            data["notify_url"] = self.app_notify_url
            data["return_url"] = self.return_url

        return data

    def sign_data(self, data):
        data.pop("sign", None)
        # 排序後的字串
        unsigned_items = self.ordered_data(data)
        unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)
        sign = self.sign(unsigned_string.encode("utf-8"))
        # ordered_items = self.ordered_data(data)
        quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)

        # 獲得最終的訂單資訊字串
        signed_string = quoted_string + "&sign=" + quote_plus(sign)
        return signed_string

    def ordered_data(self, data):
        complex_keys = []
        for key, value in data.items():
            if isinstance(value, dict):
                complex_keys.append(key)

        # 將字典型別的資料dump出來
        for key in complex_keys:
            data[key] = json.dumps(data[key], separators=(',', ':'))

        return sorted([(k, v) for k, v in data.items()])

    def sign(self, unsigned_string):
        # 開始計算簽名
        key = self.app_private_key
        signer = PKCS1_v1_5.new(key)
        signature = signer.sign(SHA256.new(unsigned_string))
        # base64 編碼,轉換為unicode表示並移除回車
        sign = encodebytes(signature).decode("utf8").replace("\n", "")
        return sign

    def _verify(self, raw_content, signature):
        # 開始計算簽名
        key = self.alipay_public_key
        signer = PKCS1_v1_5.new(key)
        digest = SHA256.new()
        digest.update(raw_content.encode("utf8"))
        if signer.verify(digest, decodebytes(signature.encode("utf8"))):
            return True
        return False

    def verify(self, data, signature):
        if "sign_type" in data:
            sign_type = data.pop("sign_type")
        # 排序後的字串
        unsigned_items = self.ordered_data(data)
        message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)
        return self._verify(message, signature)


if __name__ == "__main__":
    return_url = 'http://127.0.0.1:8000/?total_amount=100.00&timestamp=2017-08-15+23%3A53%3A34&sign=e9E9UE0AxR84NK8TP1CicX6aZL8VQj68ylugWGHnM79zA7BKTIuxxkf%2FvhdDYz4XOLzNf9pTJxTDt8tTAAx%2FfUAJln4WAeZbacf1Gp4IzodcqU%2FsIc4z93xlfIZ7OLBoWW0kpKQ8AdOxrWBMXZck%2F1cffy4Ya2dWOYM6Pcdpd94CLNRPlH6kFsMCJCbhqvyJTflxdpVQ9kpH%2B%2Fhpqrqvm678vLwM%2B29LgqsLq0lojFWLe5ZGS1iFBdKiQI6wZiisBff%2BdAKT9Wcao3XeBUGigzUmVyEoVIcWJBH0Q8KTwz6IRC0S74FtfDWTafplUHlL%2Fnf6j%2FQd1y6Wcr2A5Kl6BQ%3D%3D&trade_no=2017081521001004340200204115&sign_type=RSA2&auth_app_id=2016080600180695&charset=utf-8&seller_id=2088102170208070&method=alipay.trade.page.pay.return&app_id=2016080600180695&out_trade_no=20170202185&version=1.0'
    o = urlparse(return_url)
    query = parse_qs(o.query)
    processed_query = {}
    ali_sign = query.pop("sign")[0]


    alipay = AliPay(
        appid="2018091052145897",
        app_notify_url="http://127.0.0.1:8000/alipay/return/",
        app_private_key_path="../trade/keys/private_2048.txt",
        alipay_public_key_path="../trade/keys/alipay_key_2048.txt",  # 支付寶的公鑰,驗證支付寶回傳訊息使用,不是你自己的公鑰,
        debug=True,  # 預設False,
        return_url="http://127.0.0.1:8000/alipay/return/"
    )

    for key, value in query.items():
        processed_query[key] = value[0]
    print (alipay.verify(processed_query, ali_sign))

    url = alipay.direct_pay(
        subject="測試訂單2",
        out_trade_no="20170202sss",
        total_amount=100,
        return_url="http://127.0.0.1:8000/alipay/return/"
    )
    re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(data=url)

    print(re_url)

將打印出的url拿到瀏覽器中進行訪問。這是沙箱環境為我們生成的url。可以直接進行支付。

支付必須要用沙箱環境為我們提供的買家賬號,以及沙箱app 在這裡插入圖片描述

下載沙箱支付寶app 進行除錯測試

支付寶支付原始碼解讀

init的時候有一些引數。

def __init__(self, appid, app_notify_url, app_private_key_path,
                 alipay_public_key_path, return_url, debug=False):
        # appid是我們的appid或沙箱環境的appid
        self.appid = appid
        # 
        self.app_notify_url = app_notify_url
        # 我們私鑰檔案的路徑
        self.app_private_key_path = app_private_key_path
        # 我們是要讀檔案然後生成private_key的
        self.app_private_key = None
        # 
        self.return_url = return_url
        # 開啟這個檔案,讀這個檔案,讀完之後
        # 呼叫RSA的import_key(from Crypto.PublicKey import RSA)
        with open(self.app_private_key_path) as fp:
            self.app_private_key = RSA.importKey(fp.read())

        # 支付寶的公鑰在連結生成的過程中實際沒什麼用。
        # 但是在驗證支付寶給我們返回的訊息的時候,有用
        self.alipay_public_key_path = alipay_public_key_path
        with open(self.alipay_public_key_path) as fp:
            self.alipay_public_key = RSA.import_key(fp.read())


        # debug是true會呼叫沙箱的gateway
        if debug is True:
            self.__gateway = "https://openapi.alipaydev.com/gateway.do"
        else:
            self.__gateway = "https://openapi.alipay.com/gateway.do"

direct_pay方法

# 傳遞一些引數進來。交易標題,我們的訂單號,總金額。
    def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):
        biz_content = {
            "subject": subject,
            "out_trade_no": out_trade_no,
            "total_amount": total_amount,
            "product_code": "FAST_INSTANT_TRADE_PAY",
            # "qr_pay_mode":4
        }

        biz_content.update(kwargs)
        data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)
        return self.sign_data(data)

biz_content是一個很重要的引數。與訂單相關的四個必填欄位。

通過python傳入可變引數。如果後面還有其他的值,只需要傳進來就行了。

當biz_content生成好了之後,會呼叫build_body方法

def build_body(self, method, biz_content, return_url=None):
        # data中欄位與公共請求的必填欄位一致
        data = {
            "app_id": self.appid,
            "method": method,
            "charset": "utf-8",
            "sign_type": "RSA2",
            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "version": "1.0",
            "biz_content": biz_content
        }

        if return_url is not None:
            data["notify_url"] = self.app_notify_url
            data["return_url"] = self.return_url

        return data

引數有兩種: 一種是公共請求引數,一種是請求引數(業務)。

整個引數以公共請求引數為主,這裡面嵌套了bizcontent

build_body是生成公共請求引數(包含biz_content)

如果傳遞進來的引數有return_url 那麼我們就將return_url也放入data中

buildbody是用來生成整個訊息格式的。

獲取到訊息格式的data 對於這個訊息格式進行簽名

def sign_data(self, data):
        data.pop("sign", None)
        # 排序後的字串
        unsigned_items = self.ordered_data(data)
        unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)
        sign = self.sign(unsigned_string.encode("utf-8"))
        # ordered_items = self.ordered_data(data)
        quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)

        # 獲得最終的訂單資訊字串
        signed_string = quoted_string + "&sign=" + quote_plus(sign)
        return signed_string

簽名非常的關鍵。在簽名之前,將sign欄位先pop掉。(如果有,現在當然是沒有的)

data就是一個清除了不必要引數的data 對於data進行排序。引數傳進來進行排序

def ordered_data(self, data):
        complex_keys = []
        for key, value in data.items():
            if isinstance(value, dict):
                complex_keys.append(key)

        # 將字典型別的資料dump出來
        for key in complex_keys:
            data[key] = json.dumps(data[key], separators=(',', ':'))

        對於data進行排序。引數傳進來進行排序return sorted([(k, v) for k, v in data.items()])

對於data進行排序,生成有一個tuple。這是一個有順序的tuple unsigned_items已經是排過序的一個數組了。 unsigned_string是拼接而成的字串。

這時我們就要拿著這個字串進行簽名了。

sign = self.sign(unsigned_string.encode("utf-8"))

    def sign(self, unsigned_string):
        # 開始計算簽名
        key = self.app_private_key
        signer = PKCS1_v1_5.new(key)
        signature = signer.sign(SHA256.new(unsigned_string))
        # base64 編碼,轉換為unicode表示並移除回車
        sign = encodebytes(signature).decode("utf8").replace("\n", "")
        return sign

首先要拿到我們的私鑰,然後使用PKCS1_v1_5進行簽名。 from Crypto.Signature import PKCS1_v1_5

生成一個簽名的物件signer,呼叫該物件的sign函式。使用SHA256演算法生成一個簽名

生成簽名還沒有完,文件中說明了簽名還有最後一步。並進行base64編碼 from base64 import decodebytes, encodebytes

我們這裡用到的是base64的encodebytes編碼。編碼之後我們要使用decode將其轉換為utf-8字串。

簽名字串完成。

得到sign的值之後

quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)

quote_plus會將url做一定的處理。區別在於不會讓引數簽名帶http://等多餘字元。

也就是簽名用的是原始字串,而我們的url請求時是往quote後的字串中新增sign引數

最終的返回值被url接收。拼接上我們的呼叫沙箱介面url形成支付頁面連結

這個訂單我們也是可以進行支付的

支付寶支付成功之後會跳回到我們自己的頁面。這是因為我們沒有給他傳遞我們的return_url

支付完成之後立即跳回去的頁面。

已支付的訂單號再去生成的話會提示訂單已支付。

會變成我們傳遞過去的url並跟一系列的引數。- 這就是我們return url的作用

那麼問題來了,notify url是什麼意思呢? 使用者掃碼但是沒有支付,然後將支付頁面關閉了。使用者如果在手機裡的賬單裡支付 不是來這個頁面支付,那麼這個return url就沒有用了。

return url 是我們在支付成功之後支付寶會自動跳轉的頁面。

notify url就是使用者一旦完成支付(不在當前支付頁面,而是通過如手機賬單等) 支付寶會給你發起一個非同步的請求。

非同步的請求就是說比如我們把頁面關了之後,支付寶發了一個通知告訴你該賬單已經被使用者支付了。需要去系統裡更改訂單的狀態啊等一些後續的工作。 那時候的url已經和支付寶產生一個非同步的互動了。是不可能給瀏覽器再返回頁面的。

所以我們也需要一個非同步接收的介面。return是一個同步接收的介面。

支付寶通知介面驗證

對於return url 和 notify url 進行更加詳細的介紹

上一節課我們已經可以生成支付寶支付的頁面。

這是一個支付寶給我們發回來的請求。我們需要驗證支付寶給我們返回的資料是否有效。 因為這個資料有可能是被別人截獲。它會修改裡面的資料,讓訂單狀態變為成功支付。

驗證資料是否對。與生成的加密過程正好是一個反過程

def verify
            
           

相關推薦

Django REST framework專案筆記10 購物車, 訂單支付支付功能

購物車功能實現 在交易 trade 應用上 在商品詳情頁點選加入購物車,彈出提示框(去結算、繼續購物),右上角會新增商品到購物車 這是從後臺取出來的資料,可以顯示商品、數量、總價等資訊 新增商品,在商品數量上加一,直接更新數量即可 注意shoppingcart

Django REST framework專案筆記10 購物車, 訂單支付支付功能

訂單管理介面實現 首先理解一下購物車和訂單之間的關係。 我們現在是做了一種最簡單的實現就是把購物車中所有商品進行一起的結算 orderInfo model 裡面有一個order_sn是不能為空的。 點選去結算之後為它生成一個訂單。然後讓使用者去支付頁面進行支付。

Django REST framework專案筆記10 購物車, 訂單支付支付功能

Pycharm遠端除錯程式碼 第三方支付和第三方登入都有一個回撥的URl。一般指向伺服器的ip地址。 要完成能夠通過pycharm去除錯遠端的伺服器,回撥時就可以除錯程式碼。 如何將程式碼上傳到遠端伺服器 1、點選tools下的deploy點選configura

Django REST framework專案筆記05 商品列表頁功能開發

drf中的request和response drf 對 Django 的 request 和 response 進行了封裝 瀏覽器請求的 request 會被 drf 封裝擴充套件為標準的 http request 在基本的 httpRequest 上擴充套件,

Django REST framework專案筆記06 商品類別功能

將drf返回的資料對映到vue介面思路 1、處理商品的分類 2、目錄會有兩個介面 一個是全部資料的介面,用於首頁的全部分類,一級-二級-三級 另一個是獲取某一類的分類,以及商品數量 3、為商品通過大類進行過濾條件的過濾。價格,銷量的排序,分頁 開發商品類別介

vue+django restful framework 專案(三) -- xadmin安裝 商品資料的匯入

         xadmin的安裝和配置詳見部落格:http://www.cnblogs.com/shhnwangjian/p/6372503.html   途中可能會遇到缺少什麼包, 用pip

vue+django restful framework 專案(二)---資料表的設計

       這一節開始我們來開始做這個專案, 至於專案的新建還有檔案結構, 我就不做詳細介紹了,這些步驟在這個部落格都有:http://www.cnblogs.com/derek1184405959/p/8733578.html&nb

vue+django restful framework 專案(一)---開發環境搭建

最近要做一個共享類的專案, 要做api開發, 苦於不會開發, 所以去網上找了這個教程練練drf開發, 廢話少說, 先跟著老師搭建環境吧 這的專案的環境是:django + python3 + vue + nodejs,先簡單介紹一下這幾部分的搭建  百度雲視訊連結: http://

SSM分散式架構專案-27RabbitMQ的5種佇列

5種佇列 匯入itcast-rabbitmq 簡單佇列 P:訊息的生產者 C:訊息的消費者 紅色:佇列 生產者將訊息傳送到佇列,消費者從佇列中獲取訊息。 匯入RabbitMQ的客戶端依賴 獲取MQ的連線

SSM分散式架構專案-07後臺管理系統查詢商品列表以及日誌的書寫

查詢商品列表 JS EasyUI的datagrid的格式化輸出 預設情況下,會直接顯示返回的資料,但是有些情況下不能直接顯示,如:價格、日期、性別,需要指定formatter函式。

SSM分散式架構專案-24Solr實現商品的搜尋

匯入資料 資料來源,京東: 資料: 修改表結構 匯入圖片資料 測試: Solr的安裝 下載得到zip壓縮包,下載的版本為4.10.2. 檔案大小148MB左右。 1、 將solr-4.10.2.zip檔案拷貝

SSM分散式架構專案-15Httpclient訪問介面服務

對外的介面服務 package com.taotao.manage.controller.api; import org.springframework.beans.factory.annotation.Autowired; import org.s

.NET Core專案實戰-統一認證平臺 閘道器篇-資料庫儲存配置2

【.NET Core專案實戰-統一認證平臺】開篇及目錄索引 上篇文章我們介紹瞭如何擴充套件Ocelot閘道器,並實現資料庫儲存,然後測試了閘道器的路由功能,一切都是那麼順利,但是有一個問題未解決,就是如果閘道器配置資訊發生變更時如何生效?以及我使用其他資料庫儲存如何快速實現?本篇就這兩個問題展開講解,

.NET Core專案實戰-統一認證平臺 閘道器篇-資料庫儲存配置1

原文: 【.NET Core專案實戰-統一認證平臺】第三章 閘道器篇-資料庫儲存配置(1) 【.NET Core專案實戰-統一認證平臺】開篇及目錄索引 本篇將介紹如何擴充套件Ocelot中介軟體實現自定義閘道器,並使用2種不同資料庫來演示Ocelot配置資訊儲存和動態更新功能,內容也是從實際設計出發

專案筆記之六:訂單操作

手裡的專案沒有支付寶相關的程式碼 比較遺憾, 剛才網上查了一下 貌似支付寶和struts的介面也不是太難 ,有機會再試試吧 一:提交訂單 public String add() throws Exception { order.setName(getLogin

Java企業級專案筆記 使用者模組開發

一、功能介紹 登入功能、使用者名稱驗證、註冊、忘記密碼、提交問題答案、重置密碼、獲取使用者資訊、更新使用者資訊、退出登入 二·、橫向越權、縱向越權安全漏洞 橫向越權:攻擊者嘗試訪問與他擁有相同許可權的

Linux學習筆記4 Linux磁盤管理

linux centos 磁盤 格式化 LVM 4.1df命令df 查看文件系統磁盤空間使用情況。文件系統 磁盤總大小(kB) 已使用 可用 已用% 掛載點(目錄)Linux磁盤不能直接訪問,必須要有一個掛載點。參數:-h 可根據磁盤大小顯示適當的單位。帶有tmpfs代表臨時的

Linux學習筆記5 VIM工具

linux centos vim 5.1vim介紹vim是vi的升級版,帶有顏色顯示,先安裝包yum install -y vim-enhancedvim分為三種模式:一般模式、編輯模式、命令模式。 5.2vim顏色顯示和移動光標相同的文件信息在不同目錄下顯示顏色會有差異。相同內容,不同文件名,

Linux學習筆記6 Linux文件壓縮打包

linux centos 打包 壓縮 tar 6.1壓縮打包介紹Windows壓縮:.rar,.zip,.7zLinux壓縮:.zip,.gz,.bz2,.xz,.tar.gz,.tar.bz2,.tar.xz 6.2gzip壓縮工具gzip FILENAME 壓縮文件,格式gz,壓縮後

Linux學習筆記8 Linux shell基礎知識

linux centos shell 通配 8.1shell介紹shell是一個命令解釋器,提供人機交互。支持特定語法。每個用戶都可以有自己特定的shell(bash)。CentOS7默認bash(Bourne Agin Shell)。其他還有zsh、ksh等。 8.2命令歷史命令歷史存放於