实现效果
1、将图书加入购物车
依然引入两个结构体
购物车 Cart
购物项 Cartitem,图书数量未知,一个购物项对应一种图书
package model
type Cart struct {
CartID string
CartItems []*CartItem //所有的商品
TotalCount int64 //商品数总和
TotalAmount float64 //金额总和
UserID int //购物车所属的用户
}
func (cart *Cart) GetTotalCount() int64{
var totalCount int64
for _, v := range cart.CartItems{
totalCount += v.Count
}
return totalCount
}
func (cart *Cart) GetTotalAmount() float64 {
var totalAmount float64
for _, v := range cart.CartItems {
totalAmount += v.GetAmount()
}
return totalAmount
}
package model
//购物车里的一项商品
type CartItem struct {
CartItemID int64
Book *Book
Count int64
Amount float64 //计算得到
CartID string //属于哪一个购物车
}
func (cartItem *CartItem) GetAmount() float64 {
price := cartItem.Book.Price
return float64(cartItem.Count) * price //数量*单价
}
2、数据库插入两个表,carts, cartitems
--创建购物车表
CREATE TABLE carts(
id VARCHAR(100) PRIMARY KEY,
total_count INT NOT NULL,
total_amount DOUBLE(11,2) NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id)
)
-- 创建购物项表
CREATE TABLE cart_items(
id INT PRIMARY KEY AUTO_INCREMENT,
COUNT INT NOT NULL,
amount DOUBLE(11,2) NOT NULL,
book_id INT NOT NULL,
cart_id VARCHAR(100) NOT NULL,
FOREIGN KEY(book_id) REFERENCES books(id),
FOREIGN KEY(cart_id) REFERENCES carts(id)
)
3、cartdo.go
//AddCart 向购物车数据库中插入购物车
func AddCart(cart *model.Cart) error {
//写sql语句
sqlStr := "insert into carts(id,total_count,total_amount,user_id) values(?,?,?,?)"
//执行sql
_, err := utils.Db.Exec(sqlStr, cart.CartID, cart.GetTotalCount(), cart.GetTotalAmount(), cart.UserID)
if err != nil {
panic(err)
}
//获取购物车中的所有购物项
cartItems := cart.CartItems
//遍历得到每一个购物项
for _, cartItem := range cartItems {
//将购物项插入到数据库中
AddCartItem(cartItem)
}
return nil
}
Addcart接收*model.cart为参数,将里面的id,total_count,total_amount,user_id 插入数据库中,同时cart.CartItems也必须同时插入数据库
4、cartitemdao.go
//AddCartItem 向购物项表中插入购物项
func AddCartItem(cartItem *model.CartItem) error {
//写sql
sqlStr := "insert into cart_items(count,amount,book_id,cart_id) values(?,?,?,?)"
//执行sql
_, err := utils.Db.Exec(sqlStr, cartItem.