1. 程式人生 > >樂優商城第十九天(購物車)

樂優商城第十九天(購物車)

html5的web儲存

localstorage 沒有時間限制,只能儲存字串。可以在網頁之間傳輸資訊。

購物車的流程。

首先,我們在商品詳情頁點選加入購物車,把sku資訊儲存在localstorge中,當頁面跳轉到購物車頁面的時候,我們判斷有沒有登陸 ,沒有登陸的話,我們儲存在本地的購物車,也是localstoreage中,如果登入u了,我們把資料提交到後臺處理。

本地購物車也要判斷是否登陸,如果登陸,要進行和後臺的合併。

後臺新增的邏輯

我們把skuId和num傳送到後臺,後臺會將我們的購物車新增到redis中

public void addCart(Cart cart) {
//凡事走到這裡的,都是登入過的
//使用者名稱我們在token中已經解析過了 UserInfo userInfo = LoginInterceptor.getUserInfo(); String key = KEY_PREFIX + userInfo.getId(); //通過key獲取redis中的資料 BoundHashOperations<String, Object, Object> cartsData = redisTemplate.boundHashOps(key); Long skuId = cart.getSkuId(); Integer num = cart.getNum(); Boolean boo =
cartsData.hasKey(skuId.toString()); //如果購物車中存在此商品 if (boo) { //修改購物車中商品的數量 //1.首先從redis中得到該商品 String json = cartsData.get(skuId.toString()).toString(); //將得到的資料解析成物件 Cart redisCart = JsonUtils.parse(json, Cart.class); //修改物件中商品的數量 redisCart.setNum(redisCart.getNum() + num); } else { //根據skuid查詢商品的詳細資訊 ResponseEntity
<Sku> skuResp = this.goodsClient.querySkuBySkuId(skuId); if (!skuResp.hasBody()) { logger.error("沒有查到相關sku的資訊:{}" + skuId); throw new RuntimeException(); } //將資訊和數量封裝在cartSku skuBody = skuResp.getBody(); cart.setImage(StringUtils.isBlank(skuBody.getImages()) ? "" : StringUtils.split(skuBody.getImages(), ",")[0]); cart.setOwnSpec(skuBody.getOwnSpec()); cart.setPrice(skuBody.getPrice()); cart.setTitle(skuBody.getTitle()); cart.setUserId(userInfo.getId()); } //將此商品新增到rediscartsData.put(skuId.toString(), JsonUtils.serialize(cart)); }

查詢購物車

/**
 * 查詢購物車
*
 * @return
 */
public List<Cart> queryCart() {
UserInfo userInfo = LoginInterceptor.getUserInfo();
Long userId = userInfo.getId();
String key = KEY_PREFIX + userId;
if (!this.redisTemplate.hasKey(key)) {
return null;
    }
BoundHashOperations<String, Object, Object> cartData = this.redisTemplate.boundHashOps(key);
List<Object> values = cartData.values();
if (CollectionUtils.isEmpty(values)) {
return null;
    }
List<Cart> carts = new ArrayList<>();
for (Object value : values) {
Cart c = JsonUtils.parse(value.toString(), Cart.class);
carts.add(c);
    }
return carts;
}

這邊逐一將字串進行系列化,因為我們的stringrestemplate儲存到全是字串的形式。

更新商品的資訊,對商品的數量進行修改

public void updateCart(Long skuId, Integer num) {
//得到使用者的資訊
UserInfo userInfo = LoginInterceptor.getUserInfo();
Long userId = userInfo.getId();
String key = KEY_PREFIX + userId;
//根據key查詢到資料
if (this.redisTemplate.hasKey(key)) {
BoundHashOperations<String, Object, Object> cartData = this.redisTemplate.boundHashOps(key);
String json = cartData.get(skuId.toString()).toString();
Cart redisCart = JsonUtils.parse(json, Cart.class);
redisCart.setNum(num);
cartData.put(skuId.toString(), JsonUtils.serialize(redisCart));
    } else {
logger.error("您所修改的商品不存在");
    }

刪除購物車中商品的資訊

 * 刪除購物車
* @param skuId
 */
public void daleteCart(Long skuId) {
//首先得到登陸使用者的資訊
UserInfo userInfo = LoginInterceptor.getUserInfo();
Long userId = userInfo.getId();
String key = KEY_PREFIX + userId;
Boolean boo = this.redisTemplate.hasKey(key);
if (boo) {
BoundHashOperations<String, Object, Object> cartData = this.redisTemplate.boundHashOps(key);
cartData.delete(skuId.toString());
    }
}

購物車我們實現的功能

未登陸狀態,資料儲存在localstrage中

登陸後,未登陸的資料儲存到後臺,然後查詢資料,查詢到的資料就是本地加登陸狀態的資料。

在購物車微服務,我們也要校驗使用者有沒有登陸,並拿到用的id,我們採用springmvc的過濾器來做這個判斷。

過濾器的實現思路,首先用一個類繼承HandlerInterceptorAdapter類,選擇要實現的方法,哪個攔截器,前置後置,最終。

然後將這個攔截器新增到springmvc中

public class LoginInterceptor extends HandlerInterceptorAdapter {
private JwtProperties jwtProperties;
//一個執行緒域,存放登陸的物件
private static final ThreadLocal<UserInfo> t_user = new ThreadLocal<>();
public LoginInterceptor(JwtProperties jwtProperties) {
this.jwtProperties = jwtProperties;
    }
//獲取登陸使用者的方法
public static UserInfo getUserInfo() {
return t_user.get();
    }
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try {
//首先拿到令牌
String token = CookieUtils.getCookieValue(request, jwtProperties.getCookieName());
//判斷令牌是否是空
if (StringUtils.isBlank(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
            }
//令牌不為空,解析得到使用者的資訊
UserInfo userInfo = JwtUtils.getInfoFromToken(token, jwtProperties.getPublicKey());
t_user.set(userInfo);
return true;
        } catch (Exception e) {
//丟擲異常,證明未登陸,401
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
        }
    }
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
t_user.remove();
    }
}
@Configuration
@EnableConfigurationProperties(JwtProperties.class)
public class MvcConfig implements WebMvcConfigurer {
//把配置檔案注入
@Autowired
private JwtProperties jwtProperties;
//將攔截器注入
@Bean
public LoginInterceptor loginInterceptor() {
return new LoginInterceptor(jwtProperties);
    }
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**");
    }

相關推薦

商城九天購物車

html5的web儲存localstorage 沒有時間限制,只能儲存字串。可以在網頁之間傳輸資訊。購物車的流程。首先,我們在商品詳情頁點選加入購物車,把sku資訊儲存在localstorge中,當頁面跳轉到購物車頁面的時候,我們判斷有沒有登陸 ,沒有登陸的話,我們儲存在本地

商城八天授權中心與登陸

很早之前,聽人家做淘淘商城的人一直說單點登入,但是一直不明白單點登陸是什麼,看百度百科如果是這樣的話,那麼我們這個應該也算是一種單點登陸的解決方案。我們的登陸是服務端無狀態的登陸採用jwt+rsa對稱式加密演算法來生成一個令牌,儲存在瀏覽器,瀏覽器下次可以通過攜帶cookie

商城二天Elasticsearch

spring data Elasticsearch1.匯入依賴<dependencies> <dependency> <groupId>org.springframework.boot</groupId>

商城九天天,商品規格引數模版的新增,商品的新增

樂優商城第9,10兩天,商品的新增,是整個後臺系統最難的地方,尤其是前端頁面,這裡把中心放在後端程式碼和業務邏輯上spu是一種商品的總稱,比如小米8sku是細分領域,比如xiaomi8 星空黑64G商品的新增涉及4張表,spu,spudetail,sku,store其實就是兩

HTML學習筆記 css定位浮動及瀑布流 三節 原創

oct adding styles gin ima alt eight div height <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

HTML學習筆記 css定位浮動及瀑布流案例 三節 原創 參考使用表

20px 筆記 lis containe use cor ack 100% set #fd { width: 100px; height: 150px; background-color: forestgreen; float: left;

HTML學習筆記 w3sCss盒子模型陰影div的一些使用案例 原創 參考使用表

idt pac cin head src 模型圖 div 盒子模型 樣式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

hdu 4699 Editor 多校模擬

棧 L,R 維護游標之前(之後)的序列 那麼    I x        L.push(x);             D       L.pop();             L       R.push(L.pop());            R       L.pu

第二次Soring衝刺計劃個人

1.站立會議內容:            今天主要的目標有:            1)繼續編寫完善程式;          &nbs

數字影象處理matlab版重要

分割將一幅影象細分為期組成區域或物件。 單色影象的分割演算法通常基於影象亮度值的兩個基本特性,不連續性和相似性。 在第一種類別中,處理方法是基於亮度的突變來分割一幅影象,如影象中的邊緣。 在第二類別中,主要方法是根據事先定義的準則把影象分割成相似的區域。 數字影象中檢測亮度

機器學習--隨機梯度下降

大資料 機器學習中約定俗成有這麼一句話:更多的資料決定演算法的好壞。 但是資料變多時,計算量也就相應增多。 當我們的訓練集大小為一億時,訓練集就非常大了。當我們訓練集非常大時,我們會隨機選取幾千條資料來驗證我們的演算法是否合適。這裡隨機取

商城——購物車

目錄 一、搭建購物車微服務 1.1 建立module 1.2 pom依賴 1.3 配置檔案 1.4 啟動類 二、購物車功能分析 2.1 需求 2.2 流程圖 三、未登入購物車 3.1 準備 3.1.1 購物車的資料結構 3.1.2 web本地儲存

商城—— 訂單中心

目錄 一、我的訂單頁 1.1. 頁面效果 1.2 後臺介面 1.3 頁面改造 1.3.1 資料載入 1.3.2 分頁條 1.4 測試 1.5 訂單狀態過濾 1.5.1 全部訂單(16) 1.5.2 待付款(3) 1.5.3 待發貨(4) 1.5.4 待

商城——訂單微服務

目錄 五、地址管理 5.1 頁面效果 5.2 資料庫表設計 5.3 頁面優化 5.3.1 在data中定義資料 5.3.2 模態框 5.3.3 方法繫結 5.3.4 效果展示 5.4 後臺介面 5.4.1 實體類 5

商城——訂單微服務

目錄 四、細節優化 4.1 支付頁面顯示總金額 4.1.1 支付頁面 4.1.2 支付成功頁面 4.2 修改訂單號的傳遞方式 4.2.1 修改訂單提交函式 4.2.2 修改支付頁面 4.3 訂單提交時進行登入認證 4.4 本地資料刪除 4.5 購物車資料更新

商城——訂單微服務

目錄 二、訂單結算頁 2.1 頁面跳轉 2.2 收貨人資訊 2.3 支付方式 2.4 商品列表 2.4.1 購物車資訊獲取 2.4.2 頁面渲染 2.5 總金額 2.6 提交訂單 2.6.1 頁面提交 2.6.2 精度損失問題 三、微信支付 3.1

商城——訂單微服務

目錄 一、建立訂單微服務 1.1 建立module 1.2 pom依賴 1.3 配置檔案 1.4 啟動類 1.5 配置匯入 1.6 屬性讀取 1.7 支付工具類 1.8 修改閘道器配置 二、實體類準備 2.1 Order.java 2.2 OrderD

商城——訂單微服務

目錄 一、訂單系統介面 1.1 Swagger-UI 1.1.1 什麼是OpenApi 1.1.2 什麼是Swagger 1.1.3 快速入門 1.2 測試介面 1.2.1 建立訂單介面 1.2.2 生成ID方式 1.2.3 查詢訂單介面

商城三十三——購物車

目錄 四、已登入購物車 4.1 新增登入校驗 4.1.1 引入JWT相關依賴 4.1.2 配置公鑰 4.1.3 載入公鑰 4.1.4 編寫攔截器 4.1.5 配置攔截器 4.1.6 編寫過濾器 4.1.7 配置過濾器 4.2 後臺購物車設計 4.3 新增商

商城——授權中心

目錄 三、首頁判斷登入狀態 3.1 頁面程式碼 3.2 後臺實現校驗使用者介面 3.3 測試 3.4 重新整理token 四、閘道器的登入攔截 4.1 引入jwt相關配置 4.2 編寫過濾邏輯 4.3 白名單 三、首頁判斷登入狀態 雖然cookie已經