首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SSH框架電商專案實戰(十七):購物車核心功能實作

     編輯:Java 相關知識

資料庫設計

新增四張資料表支撐購物流程:

  • user:會員基本資料(登入帳號、密碼、姓名、性別、電話、Email)
  • status:訂單狀態(如:未付款、已付款、已出貨、已完成)
  • forder (訂單主檔):收件人資訊、下單日期、總金額、訂單狀態 FK、會員 FK
  • sorder (訂單明細/購物項):商品名稱、購買時單價、數量、商品 FK、訂單主檔 FK

透過 Hibernate 逆向工程生成對應 POJO,建立雙向關聯(Forder 1:N Sorder、User 1:N Forder、Status 1:N Forder)。

Service 層邏輯

1. SorderService:處理「商品 → 購物項 → 加入購物車」

public interface SorderService extends BaseService<Sorder> {
    Forder addSorder(Forder forder, Product product);  // 加入購物車主邏輯
    Sorder productToSorder(Product product);           // 商品轉購物項
}

@Service("sorderService")
public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements SorderService {

    @Override
    public Sorder productToSorder(Product product) {
        Sorder sorder = new Sorder();
        sorder.setName(product.getName());
        sorder.setPrice(product.getPrice());
        sorder.setNumber(1);
        sorder.setProduct(product);
        return sorder;
    }

    @Override
    public Forder addSorder(Forder forder, Product product) {
        Sorder newSorder = productToSorder(product);
        boolean existed = false;

        // 檢查購物車內是否已有同商品
        for (Sorder existing : forder.getSorders()) {
            if (existing.getProduct().getId().equals(newSorder.getProduct().getId())) {
                existing.setNumber(existing.getNumber() + 1);
                existed = true;
                break;
            }
        }

        if (!existed) {
            forder.getSorders().add(newSorder);
        }
        return forder;
    }
}

2. ForderService:計算購物車總金額

public interface ForderService extends BaseService<Forder> {
    double calculateTotal(Forder forder);
}

@Service("forderService")
public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {

    @Override
    public double calculateTotal(Forder forder) {
        double total = 0.0;
        for (Sorder item : forder.getSorders()) {
            total += item.getNumber() * item.getPrice();
        }
        return total;
    }
}

Action 層

將 Service 注入 BaseAction,供子 Action 使用:

@Controller("baseAction")
@Scope("prototype")
public class BaseAction<T> extends ActionSupport implements ... {
    @Resource protected ForderService forderService;
    @Resource protected SorderService sorderService;
    // ...
}
@Controller
@Scope("prototype")
public class SorderAction extends BaseAction<Sorder> {

    public String addSorder() {
        // 1. 取得商品
        Product product = productService.get(model.getProduct().getId());

        // 2. Session 無購物車則新建
        if (session.get("forder") == null) {
            session.put("forder", new Forder(new HashSet<>()));
        }

        // 3. 加入購物車並計算總價
        Forder forder = (Forder) session.get("forder");
        forder = sorderService.addSorder(forder, product);
        forder.setTotal(forderService.calculateTotal(forder));

        // 4. 更新 Session
        session.put("forder", forder);

        return "showCart";
    }
}

Struts 設定與前頁對接

<action name="sorder_*" class="sorderAction" method="{1}">
    <result name="showCart">/showCart.jsp</result>
</action>

前台 detail.jsp「加入購物車」連結指向 sorder_addSorder.action?id=#{product.id} 即可。

執行流程圖解

  1. 使用者點擊「加入購物車」
  2. SorderAction.addSorder() 取得商品、檢查/建立購物車
  3. 呼叫 SorderService.addSorder() 合併同商品或新增明細
  4. 呼叫 ForderService.calculateTotal() 重算總價
  5. 將更新後的購物車存回 Session
  6. 導向 showCart.jsp 顯示購物車內容

後續優化方向

  • 購物車數量修改、刪除單項、清空購物車
  • 結帳前登入檢查(攔截器實作)
  • 購物車資料持久化(登入後合併 Session 與資料庫購物車)

小結

本文完整實作購物車核心功能:資料表設計、Service 業務邏輯(去重加量、總價計算)、Action 流程控制與前頁串接,為後續結帳、訂單流程奠定基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved