第14次:商品列表、熱銷商品及詳情

第1步:定義獲取商品列表的視圖類ListView,本視圖中完成了如下功能:

  1. 根據商品類別id獲取商品類別信息,并根據類別信息反向查詢到所有的該類別的商品。
  2. 根據頁號和排序方式兩個參數,獲取某個頁面的商品列表信息。
#goods應用下views.pyfrom django.core.paginator import Paginator, EmptyPage
from django.http import HttpResponseNotFound, HttpResponseForbidden, JsonResponse
from django.shortcuts import render
from django.views import Viewfrom contents.utils import get_categories
from goods.models import GoodsCategory, SKU
from orders.models import OrderGoods
from xiaoyu_mall_new import settings
from xiaoyu_mall_new.utils.response_code import RETCODE
from .constants import PER_PRODUCTS_LIMIT as per_goods_num
from .utils import get_breadcrumbclass ListView(View):def get(self, request, category_id, page_num):"""提供商品列表頁,category_id:商品類別idpage_num:第幾頁,頁號"""try:# 1 根據商品類別id獲取該商品類別category = GoodsCategory.objects.get(id=category_id)except GoodsCategory.DoesNotExist:return HttpResponseNotFound('"參數category_id不存在"')# 2 接收sort參數,如果沒有傳遞這個參數,那么使用默認的排序方式。分別對應html頁面中的默認、人氣和價格3種排序方式sort = request.GET.get('sort', 'default')# 默認排序 按價格排序 按人氣排序if sort == 'price':sort_field = 'price'elif sort == 'hot':sort_field = '-sales'else:sort = 'default'sort_field = 'create_time'# 3 根據類別信息反向查詢,獲取商品列表skus = category.sku_set.filter(is_launched=True).order_by(sort_field)# 4 數據分頁功能# 創建分頁器paginator = Paginator(skus, per_goods_num)  # 對skus進行分頁,每頁顯示5條數據# 獲取用戶當前要看的那一頁數據try:page_skus = paginator.page(page_num)except EmptyPage:return HttpResponseForbidden('Empty Page')# 獲取總的頁碼數,前端分頁插件中需要使用total_page = paginator.num_pages# 查詢商品分類categories = get_categories()# 5 查詢面包屑導航:一級 ==>二級==>一級breadcrumb = get_breadcrumb(category)# 6 根據商品類別id,查詢所有的在售商品skus = SKU.objects.filter(category_id=category_id, is_launched=True)# 把所有商品的sku id 存放在sku_li中sku_li = []  # 保存當前頁所有的sku_idfor sku in skus:sku_li.append(sku.id)# 7 獲取每個sku-id的評論數量product_review_num = []for sid in sku_li:# 根據商品id獲取已評論的訂單order_goods_list = OrderGoods.objects.filter(sku_id=sid, is_commented=True)# 保存每件商品的評價內容product_review_content = []for order_goods in order_goods_list:product_review_content.append(order_goods.comment)product_review_num.append(len(product_review_content))# 獲取每頁各個商品的評價數量,并保存到列表中per_review_num = [product_review_num[i:i + per_goods_num] for i inrange(0, len(product_review_num), per_goods_num)]# 獲取當前訪問各個商品的數量cur_per_review_num = per_review_num[page_skus.number - 1]# 8 將每個商品數量賦值給每個商品sku對象# 通過zip函數將sku對象和評價數量進行組合,格式為:[(sku對象,商品評價數量)]for sku in list(zip(page_skus, cur_per_review_num)):# 動態添加商品評價數量review_num屬性sku[0].review_num = sku[1]context = {'category_id': category_id,'sort': sort,'page_skus': page_skus,'page_num': page_num,'total_page': total_page,'categories': categories,'breadcrumb': breadcrumb,}print(context)return render(request, 'list.html', context)

在goods應用下定義constants.py,其中定義常量

# 每頁顯示商品數量
PER_PRODUCTS_LIMIT = 5

上面代碼中用的get_breadcrumb(category)函數定義在goods/utils.py中,參數為類別對象。

def get_breadcrumb(category):"""獲取面包屑導航:param category:類別對象:一級 二級  三級:return:一級:返回一級  二級:返回一級+二級  三級:一級+二級+三級"""breadcrumb = {'cat1': '','cat2': '','cat3': '',}if category.parent == None:  			# 一級類別breadcrumb['cat1'] = categoryelif category.subs.count() == 0:  		# 三級類別cat2 = category.parentbreadcrumb['cat1'] = cat2.parentbreadcrumb['cat2'] = cat2breadcrumb['cat3'] = categoryelse:  									# 二級類別breadcrumb['cat1'] = category.parentbreadcrumb['cat2'] = categoryreturn breadcrumb

第2步:定義熱銷排行視圖類,用于展示與商品列表同類別的、銷量前2名的商品,

#goods應用下views.py
class HostGoodsView(View):"""熱銷排行"""def get(self, request, category_id):# 1 查詢熱銷數據(結果為SKU模型類的對象列表)skus = SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[:2]# 2 將模型列表轉字典構造JSON數據hot_skus = []for sku in skus:sku_dict = {'id': sku.id,'name': sku.name,'price': sku.price,# 'default_image_url': settings.STATIC_URL + 'images/goods/' + sku.default_image.url + '.jpg''default_image_url': "http://localhost:8000/" + settings.STATIC_URL + 'images/goods/' + sku.default_image.url + '.jpg'}hot_skus.append(sku_dict)return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'hot_skus': hot_skus})

第3步:定義展示商品詳情的視圖類,獲取用戶點擊的商品。

#goods應用下views.py
class DetailView(View):"""商品詳情頁"""def get(self, request, sku_id):"""提供商品詳情頁"""# 獲取當前sku的信息try:sku = SKU.objects.get(id=sku_id)except SKU.DoesNotExist:return render(request, '404.html')# 查詢商品頻道分類categories = get_categories()# 查詢面包屑導航breadcrumb = get_breadcrumb(sku.category)# 構建當前商品的規格鍵sku_specs = sku.specs.order_by('spec_id')sku_key = []for spec in sku_specs:sku_key.append(spec.option.id)# 獲取當前商品的所有SKUskus = sku.spu.sku_set.all()# 構建不同規格參數(選項)的sku字典spec_sku_map = {}for s in skus:# 獲取sku的規格參數s_specs = s.specs.order_by('spec_id')# 用于形成規格參數-sku字典的鍵key = []for spec in s_specs:key.append(spec.option.id)# 向規格參數-sku字典添加記錄spec_sku_map[tuple(key)] = s.id# 獲取當前商品的規格信息goods_specs = sku.spu.specs.order_by('id')# 若當前sku的規格信息不完整,則不再繼續if len(sku_key) < len(goods_specs):returnfor index, spec in enumerate(goods_specs):key = sku_key[:]# 該spu商品的所有規格選項spec_options = spec.options.all()for option in spec_options:# 在規格參數sku字典中查找符合當前規格的skukey[index] = option.id  # 設置當前商品的規格參數option.sku_id = spec_sku_map.get(tuple(key))spec.spec_options = spec_options# 渲染頁面context = {'categories': categories,'breadcrumb': breadcrumb,'sku': sku,'stock': sku.stock,'specs': goods_specs,}return render(request, 'detail.html', context)

第4步:定義訂單評價視圖類,查詢某個商品的評價信息,由于尚未完成訂單的支付功能,系統中沒有訂單信息,所以這里是查詢不到評價的。

class GoodsCommentView(View):"""訂單商品評價信息"""def get(self, request, sku_id):# 獲取被評價的訂單商品信息order_goods_list = OrderGoods.objects.filter(sku_id=sku_id, is_commented=True).order_by('-create_time')[:30]comment_list = []for order_goods in order_goods_list:username = order_goods.order.user.usernamecomment_list.append({'username': username[0] + '***' + username[-1]if order_goods.is_anonymous else username,'comment': order_goods.comment,'score': order_goods.score,})return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK','comment_list': comment_list})

第5步:訂單商品模型,定義在orders應用models.py中

from django.db import models# Create your models here.
from xiaoyu_mall_new.utils.models import BaseModel
from users.models import User, Address
from goods.models import SKUclass OrderInfo(BaseModel):"""訂單信息"""PAY_METHODS_ENUM = {"CASH": 1,"ALIPAY": 2}PAY_METHOD_CHOICES = ((1, "貨到付款"),(2, "支付寶"),)ORDER_STATUS_ENUM = {"UNPAID": 1,"UNSEND": 2,"UNRECEIVED": 3,"UNCOMMENT": 4,"FINISHED": 5}ORDER_STATUS_CHOICES = ((1, "待支付"),(2, "待發貨"),(3, "待收貨"),(4, "待評價"),(5, "已完成"),(6, "已取消"),)order_id = models.CharField(max_length=64, primary_key=True, verbose_name="訂單號")user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="下單用戶")address = models.ForeignKey(Address, on_delete=models.PROTECT, verbose_name="收貨地址")total_count = models.IntegerField(default=1, verbose_name="商品總數")total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品總金額")freight = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="運費")pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=1, verbose_name="支付方式")status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name="訂單狀態")class Meta:db_table = "tb_order_info"verbose_name = '訂單基本信息'verbose_name_plural = verbose_namedef __str__(self):return self.order_idclass OrderGoods(BaseModel):"""訂單商品"""SCORE_CHOICES = ((0, '0分'),(1, '20分'),(2, '40分'),(3, '60分'),(4, '80分'),(5, '100分'),)order = models.ForeignKey(OrderInfo, related_name='skus',on_delete=models.CASCADE, verbose_name="訂單")sku = models.ForeignKey(SKU, on_delete=models.PROTECT,verbose_name="訂單商品")count = models.IntegerField(default=1, verbose_name="數量")price = models.DecimalField(max_digits=10, decimal_places=2,verbose_name="單價")comment = models.TextField(default="", verbose_name="評價信息")score = models.SmallIntegerField(choices=SCORE_CHOICES, default=5,verbose_name='滿意度評分')is_anonymous = models.BooleanField(default=False,verbose_name='是否匿名評價')is_commented = models.BooleanField(default=False,verbose_name='是否評價了')class Meta:db_table = "tb_order_goods"verbose_name = '訂單商品'verbose_name_plural = verbose_namedef __str__(self):return self.sku.name

對上面的模型生成遷移文件,并執行遷移文件。

第5步:定義路由,goods應用下urls.py配置路由。

from django.urls import pathfrom goods import viewsapp_name = 'goods'
urlpatterns = [path('list/<int:category_id>/<int:page_num>/', views.ListView.as_view(), name='list'),path('hot/<int:category_id>/', views.HostGoodsView.as_view()),path('detail/<int:sku_id>/', views.DetailView.as_view(), name='detail'),
]

根路由中增加

path('', include('goods.urls')),

第6步:查詢到的商品列表展示在list.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/jquery.pagination.css') }}"><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/jquery-1.12.4.min.js') }}"></script><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>
</head>
<body>
<div id="app"><div class="header_con"><div class="header" v-cloak><div class="welcome fl">歡迎來到小魚商城!</div><div class="fr"><div v-if="username" class="login_btn fl">歡迎您:<em>[[ username ]]</em><span>|</span><a href="{{ url('users:logout') }}">退出</a></div><div v-else class="login_btn fl"><a href="{{ url('users:login') }}">登錄</a><span>|</span><a href="{{ url('users:register') }}">注冊</a></div><div class="user_link fl"><span>|</span><a href="{{ url('users:info') }}">用戶中心</a><span>|</span>{#                    <a href="{{ url('carts:info') }}">我的購物車</a>#}<span>|</span>{#                    <a href="{{ url('users:myorderinfo',args=(1,)) }}">我的訂單</a>#}</div></div></div></div><div class="search_bar clearfix"><a href="{{ url('contents: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="#">索尼微單</a></li><li><a href="#">優惠15元</a></li><li><a href="#">美妝個護</a></li><li><a href="#">買2免1</a></li></ul></div><div @mouseenter="get_carts" class="guest_cart fr" v-cloak>{#            <a href="{{ url('carts:info') }}" class="cart_name fl">我的購物車</a>#}<div class="goods_count fl" id="show_count">[[ cart_total_count ]]</div><ul class="cart_goods_show"><li v-for="sku in carts"><img :src="sku.default_image_url" alt="商品圖片"><h4>[[ sku.name ]]</h4><div>[[ sku.count ]]</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 group in categories.values() %}<li><div class="level1">{% for channel in group.channels %}<a href="{{ channel.url }}">{{ channel.name }}</a>{% endfor %}</div><div class="level2">{% for cat2 in group.sub_cats %}<div class="list_group"><div class="group_name fl">{{ cat2.name }} &gt;</div><div class="group_detail fl">{% for cat3 in cat2.sub_cats %}<a href="/list/{{ cat3.id }}/1/">{{ cat3.name }}</a>{% endfor %}</div></div>{% endfor %}</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></ul></div></div><div class="breadcrumb"><a href="javascript:;">{{ breadcrumb.cat1.name }}</a><span>></span><a href="javascript:;">{{ breadcrumb.cat2.name }}</a><span>></span><a href="javascript:;">{{ breadcrumb.cat3.name }}</a></div><div class="main_wrap clearfix"><div class="l_wrap fl clearfix"><div class="new_goods"><h3>熱銷排行</h3><ul><li v-for="sku in hot_skus">
{#                        <a :href="sku.url"><img :src="sku.default_image_url"></a>#}<a :href="sku.url"><img :src="sku.default_image_url"></a><h4><a :href="sku.url">[[ sku.name ]]</a></h4><div class="price">¥[[ sku.price ]]</div></li></ul></div></div><div class="r_wrap fr clearfix"><div class="sort_bar"><a href="{{ url('goods:list',args=(category_id,1)) }}?sort=default"{% if sort=='default' %}class="active" {% endif %}>默認</a><a href="{{ url('goods:list',args=(category_id,1)) }}?sort=price"{% if sort=='price' %}class="active" {% endif %}>價格</a><a href="{{ url('goods:list',args=(category_id,1)) }}?sort=hot" {% if sort=='hot' %} class="active" {%endif %}>人氣</a></div><ul class="goods_type_list clearfix">{% for sku in page_skus %}<li><a href="{{ url('goods:detail',args=(sku.id,)) }}"><img src="/static/images/goods/{{ sku.default_image }}.jpg"></a><h4><a href="{{ url('goods:detail',args=(sku.id,)) }}">{{ sku.name }}</a></h4><div class="operate"><span class="price">¥{{ sku.price }}</span><span class="unit">{{ sku.review_num }}條評價</span><a href="#" class="add_goods" title="加入購物車"></a></div></li>{% endfor %}</ul>{# 前端分頁器插件內容 #}<div class="pagenation"><div id="pagination" class="page"></div></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 ? 2024 北京小魚商業股份有限公司 All Rights Reserved</p><p>電話:010-****888 京ICP備*******8號</p></div>
</div>
<script type="text/javascript">let category_id = "{{ category_id }}";
</script>
<script type="text/javascript" src="{{ static('js/common.js') }}"></script>
<script type="text/javascript" src="{{ static('js/list.js') }}"></script>
<script type="text/javascript" src="{{ static('js/jquery.pagination.min.js') }}"></script>
<script>$(function () {$('#pagination').pagination({currentPage: {{ page_num }},totalPage: {{ total_page }},callback: function (current) {location.href = '/list/{{ category_id }}/' + current + '/?sort={{ sort }}';}})});
</script>
</body>
</html>

第7步:商品詳情頁面

<!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>
</head>
<body>
<div id="app"><div class="header_con"><div class="header" v-cloak><div class="welcome fl">歡迎來到小魚商城!</div><div class="fr"><div v-if="username" class="login_btn fl">歡迎您:<em>[[ username ]]</em><span>|</span><a href="{{ url('users:logout') }}">退出</a></div><div v-else class="login_btn fl"><a href="{{ url('users:login') }}">登錄</a><span>|</span><a href="{{ url('users:register') }}">注冊</a></div><div class="user_link fl"><span>|</span><a href="{{ url('users:info') }}">用戶中心</a><span>|</span>{#                    <a href="{{ url('carts:info') }}">我的購物車</a>#}<span>|</span>{#                    <a href="{{ url('users:myorderinfo',args=(1,)) }}">我的訂單</a>#}</div></div></div></div><div class="search_bar clearfix"><a href="{{ url('contents: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="#">索尼微單</a></li><li><a href="#">優惠15元</a></li><li><a href="#">美妝個護</a></li><li><a href="#">買2免1</a></li></ul></div><div @mouseenter="get_carts" class="guest_cart fr" v-cloak>{#            <a href="{{ url('carts:info') }}" class="cart_name fl">我的購物車</a>#}<div class="goods_count fl" id="show_count">[[ cart_total_count ]]</div><ul class="cart_goods_show"><li v-for="sku in carts"><img :src="sku.default_image_url" alt="商品圖片"><h4>[[ sku.name ]]</h4><div>[[ sku.count ]]</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 group in categories.values() %}<li><div class="level1">{% for channel in group.channels %}<a href="{{ channel.url }}">{{ channel.name }}</a>{% endfor %}</div><div class="level2">{% for cat2 in group.sub_cats %}<div class="list_group"><div class="group_name fl">{{ cat2.name }} &gt;</div><div class="group_detail fl">{% for cat3 in cat2.sub_cats %}<a href="/list/{{ cat3.id }}/1/">{{ cat3.name }}</a>{% endfor %}</div></div>{% endfor %}</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></ul></div></div><div class="breadcrumb"><a href="javascript:;">{{ breadcrumb.cat1.name }}</a><span>></span><a href="javascript:;">{{ breadcrumb.cat2.name }}</a><span>></span><a href="javascript:;">{{ breadcrumb.cat3.name }}</a></div><div class="goods_detail_con clearfix"><div class="goods_detail_pic fl"><img src="/static/images/goods/{{ sku.default_image }}.jpg"></div><div class="goods_detail_list fr"><h3>{{ sku.name }}</h3><p>{{ sku.caption }}</p><div class="price_bar"><span class="show_pirce"><em>{{ sku.price }}</em></span><a href="javascript:;" class="goods_judge" v-cloak>[[ comments.length ]]人評價</a></div><div class="goods_num clearfix"><div class="num_name fl">數 量:</div><div class="num_add fl"><input v-model="sku_count" @blur="check_sku_count" type="text" class="num_show fl"><a @click="on_addition" class="add fr">+</a><a @click="on_minus" class="minus fr">-</a></div></div>{% for spec in specs %}<div class="type_select"><label>{{ spec.name }}:</label>{% for option in spec.spec_options %}{% if option.sku_id == sku.id %}<a href="javascript:;" class="select">{{ option.value }}</a>{% elif option.sku_id %}<a href="{{ url('goods:detail', args=(option.sku_id, )) }}">{{ option.value }}</a>{% else %}<a href="javascript:;">{{ option.value }}</a>{% endif %}{% endfor %}</div>{% endfor %}<div class="total" v-cloak>總價:<em>[[ sku_amount ]]元</em></div><div class="operate_btn"><a @click="add_carts" 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="sku in hot_skus"><a :href="sku.url"><img :src="sku.default_image_url"></a><h4><a :href="sku.url">[[ sku.name ]]</a></h4><div class="price">¥[[ sku.price ]]</div></li></ul></div></div><div class="r_wrap fr clearfix"><ul class="detail_tab clearfix"><li @click="on_tab_content('detail')" :class="tab_content.detail?'active':''">商品詳情</li><li @click="on_tab_content('pack')" :class="tab_content.pack?'active':''">規格與包裝</li><li @click="on_tab_content('service')" :class="tab_content.service?'active':''">售后服務</li><li @click="on_tab_content('comment')" :class="tab_content.comment?'active':''">商品評價([[comments.length ]])</li></ul><div @click="on_tab_content('detail')" class="tab_content" :class="tab_content.detail?'current':''"><dl><dt>商品詳情:</dt><dd>{{ sku.spu.desc_detail|safe }}</dd></dl></div><div @click="on_tab_content('pack')" class="tab_content" :class="tab_content.pack?'current':''"><dl><dt>規格與包裝:</dt><dd>{{ sku.spu.desc_pack|safe }}</dd></dl></div><div @click="on_tab_content('service')" class="tab_content" :class="tab_content.service?'current':''"><dl><dt>售后服務:</dt><dd>{{ sku.spu.desc_service|safe }}</dd></dl></div>{# 商品評價內容#}<div @click="on_tab_content('comment')" class="tab_content" :class="tab_content.comment?'current':''"><ul class="judge_list_con"><li class="judge_list fl" v-for="comment in comments"><div class="user_info fl"><b>[[comment.username]]</b></div><div class="judge_info fl"><div :class="comment.score_class"></div><div class="judge_detail">[[comment.comment]]</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 ? 2024 北京小魚商業股份有限公司 All Rights Reserved</p><p>電話:010-****888 京ICP備*******8號</p></div>
</div>
<script type="text/javascript">let category_id = "{{ sku.category.id }}";let sku_price = "{{ sku.price }}";let sku_id = "{{ sku.id }}";let stock = "{{ stock }}"
</script>
<script type="text/javascript" src="{{ static('js/common.js') }}"></script>
<script type="text/javascript" src="{{ static('js/detail.js') }}"></script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85700.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于雙層注意力重加權 LSTM 的中文長文本謠言檢測模型

文章目錄 1.摘要2.介紹3.相關工作3.1 假新聞檢測數據集3.2 假新聞檢測方法3.3 長文本假新聞檢測的挑戰與進展3.4 與現有方法的區別 4.方法4.1 模型結構4.2模型代碼4.3 損失函數與優化方法 5. 實驗5.1 數據集與預處理5.2 實驗設置5.3 實驗結果5.4 對比分析5.5 結果分析與討論 6.…

在 MyBatis 的xml中,什么時候大于號和小于號可以不用轉義

在 MyBatis 中&#xff0c;< 和 > ?在動態 SQL 標簽內部? 無需轉義的功能是在以下版本引入的&#xff1a; &#x1f4cc; 關鍵版本說明 版本支持情況注意事項?MyBatis 3.3.0??? 在 <if>、<where>、<set> 等動態 SQL 標簽內部可直接使用 < 和…

Redis 的穿透、雪崩、擊穿

Redis 的穿透、雪崩、擊穿 1、緩存穿透 定義 緩存穿透是指查詢一個不存在的數據&#xff0c;由于緩存中沒有該數據&#xff0c;每次請求都會直接訪問數據庫&#xff0c;導致數據庫壓力過大 產生原因 惡意攻擊&#xff1a;攻擊者故意請求大量不存在的key&#xff0c;導致請求直…

有道翻譯官手機版:智能翻譯,隨行助手

在當今全球化的時代&#xff0c;語言不再是交流的障礙。無論是學習外語、出國旅游、商務出差還是日常交流&#xff0c;一款高效、準確的翻譯軟件都能成為我們的好幫手。有道翻譯官手機版正是這樣一款功能強大、操作便捷的語言翻譯軟件&#xff0c;它憑借先進的翻譯技術和豐富的…

nuxt3 + vue3 分片上傳組件全解析(大文件分片上傳)

本文將詳細介紹一個基于 Vue.js 的分片上傳組件的設計與實現,該組件支持大文件分片上傳進度顯示等功能。 組件概述 這個上傳組件主要包含以下功能: 支持大文件分片上傳(默認5MB一個分片)支持文件哈希計算,用于文件唯一標識顯示上傳進度(整體和單個文件)支持自定義UI樣…

正則表達式與C++

轉自個人博客 1. 概述 1.1 正則表達式概述 正則表達式&#xff08;Regular Expressions&#xff0c;簡稱 regex&#xff09;是用于匹配文本模式的一種特殊字符序列&#xff0c;其可以用一系列字符來表示出不同文本的對應模式。正則表達式的應用范圍十分廣泛&#xff0c;包括驗…

OpenCV CUDA模塊設備層-----在 GPU上計算反雙曲正切函數atanh()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對輸入的 uchar1 像素值&#xff08;范圍 [0, 255]&#xff09;&#xff0c;先歸一化到 [0.0, 1.0] 浮點區間&#xff0c;然后計算其 反雙曲正切…

搶占西南產業高地:入駐成都芯谷金融中心文化科技產業園的價值

入駐成都芯谷金融中心文化科技產業園&#xff0c;對企業而言具有顯著的戰略價值&#xff0c;主要體現在以下幾個方面&#xff1a; 產業聚集效應與協同發展 產業鏈完善&#xff1a;成都芯谷聚焦集成電路、新型顯示、人工智能等核心產業&#xff0c;入駐企業可享受完善的產業鏈…

領域驅動設計(DDD)【2】之項目啟動與DDD基本開發流程

文章目錄 一 項目背景與目標二 核心需求分析初步需求詳細分析需求總結表 三 DDD核心概念與開發流程領域和領域專家領域驅動設計開發流程 四 潛在擴展需求 一 項目背景與目標 項目定位 開發基于SaaS的企業管理系統&#xff0c;聚焦軟件服務企業的細分市場&#xff0c;功能需求包…

深度融合數智化,百勝軟件聯合華為云加速零售行業轉型升級

當前&#xff0c;企業數字化轉型縱深推進&#xff0c;滿足企業數智化全階段、全場景的需求變得尤為關鍵。為此&#xff0c;華為云攜手上萬家伙伴共同發起第三屆828 B2B企業節&#xff0c;依托云底座為企業數智化供需“架橋”“鋪路”&#xff0c;加速企業智改數轉&#xff0c;助…

《HTTP權威指南》 第4章 連接管理

帶著問題學習&#xff08;通常是面試考點&#xff09; HTTP是如何使用TCP連接的TCP連接的時延、瓶頸及存在的障礙HTTP的優化&#xff0c;包括并行連接、keep-alive&#xff08;持久連接&#xff09;和管道化連接管理連接時應該和不應該做的事 TCP連接 TCP的數據通過IP分組&am…

StartUML入門級使用教程——畫Class類圖

一、破解安裝StartUML StarUML建模工具最新版破解安裝詳細教程https://blog.csdn.net/m0_74146638/article/details/148709643?spm1001.2014.3001.5502 二、類圖實戰 1.主界面 ? 默認打開starUML后&#xff0c;會默認進入類圖模式&#xff0c;各模塊區域功能如下&#x…

中科億海微SoM模組——FPGA+DSP核心板

FPGADSP核心板是基于中科億海微EQ6HL130型FPGA芯片搭配國產DSP開發的高性能核心板卡。對外接口采取郵票孔連接方式&#xff0c;可以極大提高信號傳輸質量和焊接后的機械強度。核心板卡的系統框圖如下圖所示。 圖 FPGADSP核心板系統框圖 FPGA采用中科億海微136K LUT資源EQ6HL130…

CentOS 7 虛擬機網絡配置異常 典型問題:啟動了NetworkManager但是network無法啟動

問題背景 在 VMware 虛擬機中使用 CentOS 7 時&#xff0c;出現以下網絡問題&#xff1a; 命令行重啟網絡服務失敗&#xff0c;提示 RTNETLINK answers: File exists 等沖突錯誤圖形界面網絡設置無法打開&#xff0c;提示需要啟動 NetworkManager網卡 ens33 無法獲取 IPv4 地…

細節/數學/滑動窗口

題目意思&#xff1a; 判斷字符串是否可以按照題目條件縮短。 思路&#xff1a; 用棧的思想寫&#xff0c;對每一次的大小寫都進行滾動判斷。 tips&#xff1a; 這里面要注意的東西就有一點多了&#xff0c;首先是字符串的遍歷問題auto更方便&#xff0c;其次是對小寫和大…

WebeServer實現:學到了哪些東西

前言 這里話就是總結一下之前沒講過的一些東西 系統調用 accept與accept4 ??當我們調用accept接收一個新的fd的時候&#xff0c;往往需要在調用fcntl將這個fd變成非阻塞IO,那么有沒有一個系統調用可以一次性做完這兩件事呢&#xff0c;有的有的就是accept4. // accept 函數…

React 虛擬dom

JSX創建出ReactElement對象 最終形成一個JS樹 將React.createElement對象轉為真實DOM的方法使用render函數 為什么要虛擬 dom 狀態難以跟蹤 ## 操作真實dom開銷大 &#xff0c;并且操作會引起頻繁的回流和重繪&#xff0c;并且不涉及批處理 聲明式編程 從虛擬dom向真實dom去…

Spring MVC異常處理機制

Spring MVC提供了多種異常處理機制,以下是核心處理方式及實現方法: 一、局部異常處理(Controller級別) @ExceptionHandler注解 在Controller內部定義異常處理方法,捕獲當前控制器拋出的指定異常。@Controller public class UserController {@GetMapping("/test"…

MySQL 8.x配置MGR高可用+ProxySQL讀寫分離(一):MGR構建MySQL高可用

#作者&#xff1a;stackofumbrella 文章目錄 簡介MGR優點MGR缺點MGR適用場景單主模式和多主模式組復制介紹組復制插件架構圖單主模式多主模式配置主機名解析安裝MGR插件 MGR故障轉移恢復MGR集群 簡介 MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本誕…

保安員證考試的理論知識部分,重點考查的法律法規具體有哪些?

保安員證考試理論知識部分&#xff0c;重點考查的法律法規主要有以下幾種&#xff1a; 《保安服務管理條例》&#xff1a;作為保安行業的專門法規&#xff0c;是考試核心。重點考查保安服務活動規范&#xff0c;如保安服務的范圍、資質要求等&#xff1b;保安員的權利與義務&am…