18- 项目梳理-商品详情--product

1. 创建视图函数

class RemenProductView(View):
    def get(self, request, categoryId):
        # Type类型Error错误: Object of type QuerySet查询结果集 is not 不是JSON serializable序列化
        products = ProductSku.objects.filter(category_id=categoryId, is_shop=True).order_by("-sale_count")[0:3]
        list = []
        for pro in products:
            list.append({"id": pro.id, "default_imgurl": pro.default_imgurl, "name": pro.name, "price": pro.price})
        # print("====", list)
        return JsonResponse({"code": 0, "msg": "获取成功", "products": list})


class ProductDetailView(View):
    def get(self, request, skuId):
        # 获取当前skuID商品的详细信息
        prouctSku = ProductSku.objects.get(id=skuId)
        data = {
            "categories": product_category(),
            "daohang": daohang(prouctSku.category),
            "prouctSku": prouctSku,
        }
        return render(request, "product/productDetail.html", context=data)

2. 创建路由

urlpatterns = [
    re_path(r'hotProduct/(?P<categoryId>\d+)/$', RemenProductView.as_view(), name="hotProduct"),

    re_path(r'productDetail/(?P<skuId>\d+)/$', ProductDetailView.as_view(), name="productDetail"),
]

3. 创建productDetail.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>喵喵商城-商品详情</title>
    <link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}">
    <script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
    <script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
    <script type="text/javascript" src="{{ static('js/utils.js') }}"></script>
</head>
<body>
<div id="app">
    <div class="header_con">
        <div class="header" v-cloak>
            <div class="welcome fl">欢迎来到喵喵商城</div>
            <div class="fr">
                <div class="login_btn fl" v-show="flag1">
                    欢迎您:<em>{[ username ]}</em>
                    <span>|</span>
                    <a href="{{ url('users:logout') }}">退出</a>
                </div>
                <div class="login_btn fl" v-show="flag2">
                    <a href="{{ url('users:login') }}">登录</a>
                    <span>|</span>
                    <a href="{{ url('users:zhuce') }}">注册</a>
                </div>
                <div class="user_link fl">
                    <span>|</span>
                    <a href="{{ url('users:userinfo') }}">用户中心</a>
                    <span>|</span>
                    <a href="">我的购物车</a>
                    <span>|</span>
                    <a href="">我的订单</a>
                </div>
            </div>
        </div>
    </div>
    <div class="search_bar clearfix">
        <a href="{{ url('shouye:index') }}" class="logo fl"><img src="{{ static('images/logo.png') }}"></a>
        <div class="search_wrap fl">
            <form method="get" action="/search/" class="search_con">
                <input type="text" class="input_text fl" name="q" placeholder="搜索商品">
                <input type="submit" class="input_btn fr" name="" value="搜索">
            </form>
            <ul class="search_suggest fl">
                <li><a href="#">满199减100</a></li>
                <li><a href="#">家装建材</a></li>
                <li><a href="#">潮流家电</a></li>
                <li><a href="#">华为新品</a></li>
            </ul>
        </div>
        <div class="guest_cart fr">
            <a href="" class="cart_name fl">我的购物车</a>
            <div class="goods_count fl" id="show_count"></div>
            <ul class="cart_goods_show">
                <li>
                    <img src="" alt="商品图片">
                    <h4></h4>
                    <div></div>
                </li>
            </ul>
        </div>
    </div>
    <div class="navbar_con">
        <div class="navbar">
            <div class="sub_menu_con fl">
                <h1 class="fl">商品分类</h1>
                <ul class="sub_menu">
                    {% for g in categories.values() %}
                        <li>
                            <div class="level1">
                                {% for yiji in g.channels %}
                                    <a href="{{ yiji.url }}">{{ yiji.name }}</a>
                                {% endfor %}
                            </div>
                            <div class="level2">
                                <div class="list_group">
                                    {% for category2 in g.sub_categorys %}
                                        <div class="group_name fl">{{ category2.name }} &gt;</div>
                                        <div class="group_detail fl">
                                            {% for category3 in category2.sub_categorys %}
                                                <a href="/productList/{{ category3.id }}/1/">{{ category3.name }}</a>
                                            {% endfor %}
                                        </div>
                                    {% endfor %}
                                </div>
                            </div>
                        </li>
                    {% endfor %}
                </ul>
            </div>
            <ul class="navlist fl">
                <li><a href="">秒杀</a></li>
                <li class="interval">|</li>
                <li><a href="">拍卖</a></li>
                <li class="interval">|</li>
                <li><a href="">喵喵家电</a></li>
                <li class="interval">|</li>
                <li><a href="">喵喵超市</a></li>
                <li class="interval">|</li>
                <li><a href="">喵喵生鲜</a></li>
                <li class="interval">|</li>
                <li><a href="">喵喵国际</a></li>
            </ul>
        </div>
    </div>
    <div class="breadcrumb">
        <a href="javascript:;">{{ daohang.category1.name }}</a>
        <span>></span>
        <a href="javascript:;">{{ daohang.category2.name }}</a>
        <span>></span>
        <a href="javascript:;">{{ daohang.category3.name }}</a>
    </div>
    <div class="goods_detail_con clearfix">
        <div class="goods_detail_pic fl"><img src="http://yhcsxtest.yonghui.cn//wimages/894864/894864_main_1.jpg"></div>
        <div class="goods_detail_list fr">
            <h3>{{ prouctSku.name }}</h3>
            <p>{{ prouctSku.fubiaoti }}</p>
            <div class="price_bar">
                <span class="show_pirce">¥<em>{{ prouctSku.price }}</em></span>
                <a href="javascript:;" class="goods_judge"></a>
            </div>
            <div class="goods_num clearfix">
                <div class="num_name fl">数 量:</div>
                <div class="num_add fl">
                    <input v-model="count" @blur="check_count" type="text" class="num_show fl">
                    <a @click="jia" class="add fr">+</a>
                    <a @click="jian" class="minus fr">-</a>
                </div>
            </div>
            <div class="type_select">
                <label></label>
                {#  选项  #}

            </div>
            <div class="operate_btn">
                <a class="add_cart" id="add_cart">加入购物车</a>
            </div>
        </div>
    </div>
    <div class="main_wrap clearfix">
        <div class="l_wrap fl clearfix">
            <div class="new_goods">
               <h3>热销排行</h3>
                <ul>
                    <li v-for="pro in products">
                        <a :href="pro.detailUrl"><img src="http://yhcsxtest.yonghui.cn//wimages/44788/main/44788_main_1657605282537.jpg"></a>
                        <h4><a :href="pro.detailUrl">{[ pro.name ]}</a></h4>
                        <div class="price">¥{[ pro.price ]}</div>
                    </li>
                </ul>
            </div>
        </div>
        <div class="r_wrap fr clearfix">
            <ul class="detail_tab clearfix">
                <li class="active">商品详情</li>
                <li>规格与包装</li>
                <li>售后服务</li>
                <li>商品评论</li>
            </ul>
            <div class="tab_content">
                <dl>
                    <dt>商品详情:</dt>
                    <dd></dd>
                </dl>
            </div>
            <div class="tab_content">
                <dl>
                    <dt>规格与包装:</dt>
                    <dd></dd>
                </dl>
            </div>
            <div class="tab_content">
                <dl>
                    <dt>售后服务:</dt>
                    <dd></dd>
                </dl>
            </div>
            <div class="tab_content">
                <ul class="judge_list_con">
                    <li class="judge_list fl">
                        <div class="user_info fl">
                            <img src="">
                            <b></b>
                        </div>
                        <div class="judge_info fl">
                            <div class="stars_five"></div>
                            <div class="judge_detail"></div>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
    </div>
    <div class="footer">
        <div class="foot_link">
            <a href="#">关于我们</a>
            <span>|</span>
            <a href="#">联系我们</a>
            <span>|</span>
            <a href="#">招聘人才</a>
            <span>|</span>
            <a href="#">友情链接</a>
        </div>
        <p>CopyRight © 2018 北京*******有限公司 All Rights Reserved</p>
        <p>电话:010-******* 京ICP备********号</p>
    </div>
</div>
</body>
<script type="text/javascript">
let categoryId = "{{ prouctSku.category.id }}";
let kucun="{{ prouctSku.kucun }}"
</script>
<script type="text/javascript" src="{{ static('js/productDetatail.js') }}"></script>

</html>

4.创建productDetatail.js

var v = new Vue({
    el: "#app",
    delimiters: ["{[", "]}"],
    data: {
        username: "",


        flag1: false,  //展示用户名和退出
        flag2: true,  //展示注册和登陆

        categoryId: categoryId,
        products: "",  //热门商品数据
        count: 1,
        kucun: kucun,

    },
    //页面加载完成后,自动调用
    mounted() {
        //从cookie里面读取用户名...可能会从cookie中读取很多数据-->编写一个工具js文件,写一个getcookie函数读取信息
        this.username = getCookie("username");

        if (this.username != undefined) {
            this.flag1 = true;
            this.flag2 = false;

        } else {
            this.flag1 = false;
            this.flag2 = true;
        }

        //发送获取热门商品的请求
        this.get_remen_product();

        if (this.kucun == 0) {
            this.count = 0;
            //禁用代码,提示文案
        }

    },
    methods: {
        get_remen_product() {
            if (this.categoryId) {
                let path = "/hotProduct/" + this.categoryId + "/";
                axios.get(path).then(resp => {
                    this.products = resp.data.products;
                    //给每一条sku加上商品详情连接跳转
                    for (let i = 0; i < this.products.length; i++) {
                        this.products[i].detailUrl = '/productDetail/' + this.products[i].id + "/";

                    }


                }).catch(err => {
                    console.log(err)
                })
            }
        },
        check_count() {
            if (this.count < 1) {
                this.count = 1;
            }
            if (this.count > this.kucun) {
                this.count = this.kucun;
            }
        },
        jia() {
            if (this.count < this.kucun) {
                this.count++;
            } else {
                this.count = this.kucun;
                alert("商品已达上限")
            }
        },
        jian() {
            if (this.count > 1) {
                this.count--;
            }
        },
    }

})

posted @ 2023-02-15 22:50  测试圈的彭于晏  阅读(64)  评论(0)    收藏  举报