【Django】网上蛋糕商城后台-商品管理

news2024/9/21 13:55:41

1.商品管理功能

当管理员点击商品管理时,发送服务器请求

path('admin/goods_list/', viewsAdmin.goods_list),
# 处理商品列表请求
def goods_list(request):
    try:
        type = request.GET["type"]
    except:
        type = 0
    try:
        ym = request.GET["ym"]
    except:
        ym = 1
    if int(type) == 0:
        goodsList = Goods.objects.all().order_by("-id").values()
        for goods in goodsList:
            typeName = Type.objects.get(id=goods["type_id"]).name
            types = Recommend.objects.filter(goods_id=goods["id"]).values_list("type")
            if (1,) in types:
                goods["isScroll"] = True
            if (2,) in types:
                goods["isHot"] = True
            if (3,) in types:
                goods["isNew"] = True
            goods["typeName"] = typeName

    else:
        recommends = Recommend.objects.filter(type=type).order_by("-goods_id")
        goodsList = []
        for r in recommends:
            # 根据推荐栏类型查询商品信息,将查询的对象转换成字典
            goods = Goods.objects.get(id=r.goods_id).__dict__
            # 根据商品id查询该商品添加在哪些推荐栏中
            types = Recommend.objects.filter(goods_id=r.goods_id).values_list("type")
            if (1,) in types:
                goods["isScroll"] = True
            if (2,) in types:
                goods["isHot"] = True
            if (3,) in types:
                goods["isNew"] = True
            # 根据商品中的分类id查询分类名称
            typeName = Type.objects.get(id=goods["type_id"])
            goods["typeName"] = typeName.name
            goodsList.append(goods)
    # 将该分类的商品信息进行分页处理,每页显示6条记录
    pag = paginator.Paginator(goodsList, 6)
    # 根据当前页码获取当前分页信息
    pageInfo = pag.get_page(ym)
    # 获取当前页的商品列表信息
    goodsList = pageInfo.object_list
    # 获取总页码数
    yms = pag.page_range
    return render(request, "adminTemp/goods_list.html",
                  {"goodsList": goodsList, "page": pageInfo, "yms": yms, "type": type})
<!DOCTYPE html>
<html>
<head>
    <title>商品列表</title>
    {% load static %}
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}"/>
    <link rel="stylesheet" href="{% static 'css/page.css' %}"/>
</head>
<body>
<div class="container-fluid">
    {% include "adminTemp/header.html" %}
    <div class="text-right"><a class="btn btn-warning" href="/admin/goods_add/">添加商品</a></div>
    <br>
    <ul role="tablist" class="nav nav-tabs">

        <li {% if type == 0 %}
            class="active"
        {% endif %} role="presentation"><a href="/admin/goods_list/">全部商品</a></li>
        <li {% if type == 1 %}
            class="active"
        {% endif %} role="presentation"><a href="/admin/goods_list/?type=1">条幅推荐</a></li>
        <li {% if type == 2 %}
            class="active"
        {% endif %} role="presentation"><a href="/admin/goods_list/?type=2">热销推荐</a></li>
        <li {% if type == 3 %}
            class="active"
        {% endif %} role="presentation"><a href="/admin/goods_list/?type=3">新品推荐</a></li>
    </ul>
    <br>
    <table class="table table-bordered table-hover">
        <tr>
            <th width="5%">ID</th>
            <th width="10%">图片</th>
            <th width="10%">名称</th>
            <th width="20%">介绍</th>
            <th width="10%">价格</th>
            <th width="10%">类目</th>
            <th width="25%">操作</th>
        </tr>
        {% for g in goodsList %}
            <tr>
                <td><p>{{ g.id }}</p></td>
                <td><p><a href="/goods_detail/?id={{ g.id }}" target="_blank"><img src="{% static g.cover %}"
                                                                                   width="100px"
                                                                                   height="100px"></a></p></td>
                <td><p><a href="/goods_detail/?id={{ g.id }}" target="_blank">{{ g.name }}</a></p></td>
                <td><p>{{ g.intro }}</p></td>
                <td><p>{{ g.price }}</p></td>
                <td><p>{{ g.typeName }}</p></td>
                <td>
                    <p>
                        {% if g.isScroll %}
                            <a class="btn btn-info"
                               href="/admin/goods_recommend/?id={{ g.id }}&method=remove&typeTarget=1">移出条幅</a>
                        {% endif %}
                        {% if not g.isScroll %}
                            <a class="btn btn-primary"
                               href="/admin/goods_recommend/?id={{ g.id }}&method=add&typeTarget=1">加入条幅</a>
                        {% endif %}
                        {% if g.isHot %}
                            <a class="btn btn-info"
                               href="/admin/goods_recommend/?id={{ g.id }}&method=remove&typeTarget=2">移出热销</a>
                        {% endif %}
                        {% if not g.isHot %}
                            <a class="btn btn-primary"
                               href="/admin/goods_recommend/?id={{ g.id }}&method=add&typeTarget=2">加入热销</a>
                        {% endif %}
                        {% if g.isNew %}
                            <a class="btn btn-info"
                               href="/admin/goods_recommend/?id={{ g.id }}&method=remove&typeTarget=3">移出新品</a>
                        {% endif %}
                        {% if not g.isNew %}
                            <a class="btn btn-primary"
                               href="/admin/goods_recommend/?id={{ g.id }}&method=add&typeTarget=3">加入新品</a>
                        {% endif %}
                    </p>
                    <a class="btn btn-success"
                       href="/admin/goods_editshow/?id={{ g.id  }}&ym={{ page.number  }}">修改</a>
                    <a class="btn btn-danger"
                       href="/admin/goods_delete/?id={{ g.id  }}&ym={{ page.number  }}">删除</a>
                </td>
            </tr>
        {% endfor %}
    </table>
    <br>
    <!-- 显示页码导航栏 -->
    <div id="nav" align="center">
        <!-- 上一页 -->
        <!-- 判断当前页是否有上一页,如果有上一页则显示上一页的按钮,否则就不显示上一页 -->
        {% if page.has_previous %}
            <a href="/admin/goods_list/?ym={{ page.previous_page_number }}&type={{ type }}" class="up_page">上一页</a>
        {% endif %}
        <!-- 页码 -->
        {% for ym in yms %}
            {% if page.number == ym %}
                <a href="/admin/goods_list/?ym={{ ym }}&type={{ type }}" class="p_page c_page">{{ ym }}</a>
            {% else %}
                <a href="/admin/goods_list/?ym={{ ym }}&type={{ type }}" class="p_page">{{ ym }}</a>
            {% endif %}
        {% endfor %}

        <!-- 下一页 -->
        {% if page.has_next %}
            <a href="/admin/goods_list/?ym={{ page.next_page_number }}&type={{ type }}" class="do_page">下一页</a>
        {% endif %}
    </div>
    <br>
</div>
</body>
</html>

2.加入或移除推荐栏功能

选择某个商品,点击加入条幅,移除条幅,加入热销,移除热销,加入新品,移除新品按钮时,触发请求事件,传递不同参数信息给服务器

path('admin/goods_recommend/',viewsAdmin.goods_recommend),
# 处理商品的推荐栏请求
def goods_recommend(request):
    id = request.GET["id"]
    method = request.GET["method"]
    typeTarget = request.GET["typeTarget"]
    if "add" == method:
        # 添加至推荐栏
        Recommend.objects.create(goods_id=id, type=typeTarget)
    elif "remove" == method:
        # 从推荐栏中移除
        r = Recommend.objects.get(goods_id=id, type=typeTarget)
        r.delete()
    # 刷新商品管理列表页面
    return redirect(goods_list)

3.添加商品功能

当管理员点击添加商品按钮,触发请求事件

path('admin/goods_add/', viewsAdmin.goods_add),
# 处理添加商品页面的跳转请求
def goods_add(request):
    types = Type.objects.all()
    return render(request, "adminTemp/goods_add.html", {"typeList": types})
<!DOCTYPE html>
<html>
<head>
    <title>商品添加</title>
    {% load static %}
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}"/>
</head>
<body>
<div class="container-fluid">
    {% include "adminTemp/header.html" %}
    <br><br>
    <form class="form-horizontal" action="/admin/addGoods/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <div class="form-group">
            <label for="input_name" class="col-sm-1 control-label">名称</label>
            <div class="col-sm-6">
                <input type="text" class="form-control" id="input_name" name="name" required="required">
            </div>
        </div>
        <div class="form-group">
            <label for="input_name" class="col-sm-1 control-label">价格</label>
            <div class="col-sm-6">
                <input type="text" class="form-control" id="input_name" name="price">
            </div>
        </div>
        <div class="form-group">
            <label for="input_name" class="col-sm-1 control-label">介绍</label>
            <div class="col-sm-6">
                <input type="text" class="form-control" id="input_name" name="intro">
            </div>
        </div>
        <div class="form-group">
            <label for="input_name" class="col-sm-1 control-label">库存</label>
            <div class="col-sm-6">
                <input type="text" class="form-control" id="input_name" name="stock">
            </div>
        </div>
        <div class="form-group">
            <label for="input_file" class="col-sm-1 control-label">封面图片</label>
            <div class="col-sm-6">
                <input type="file" name="cover" id="input_file" required="required">推荐尺寸: 500 * 500
            </div>
        </div>
        <div class="form-group">
            <label for="input_file" class="col-sm-1 control-label">详情图片1</label>
            <div class="col-sm-6">
                <input type="file" name="image1" id="input_file" required="required">推荐尺寸: 500 * 500
            </div>
        </div>
        <div class="form-group">
            <label for="input_file" class="col-sm-1 control-label">详情图片2</label>
            <div class="col-sm-6">
                <input type="file" name="image2" id="input_file" required="required">推荐尺寸: 500 * 500
            </div>
        </div>
        <div class="form-group">
            <label for="select_topic" class="col-sm-1 control-label">类目</label>
            <div class="col-sm-6">
                <select class="form-control" id="select_topic" name="typeid">
                    {% for t in typeList %}
                        <option value="{{ t.id }}">{{ t.name }}</option>
                    {% endfor %}
                </select>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-1 col-sm-10">
                <button type="submit" class="btn btn-success">提交保存</button>
            </div>
        </div>
    </form>
</div>
</body>
</html>

当管理员填写完商品信息以及选择好上传的图片后,点击提交保存按钮,将表单提交给服务器

path('admin/addGoods/',viewsAdmin.addGoods),
# 获取商品添加请求
def addGoods(request):
    name = request.POST["name"]
    price = request.POST["price"]
    intro = request.POST["intro"]
    stock = request.POST["stock"]
    pic = request.FILES.getlist('cover')
    cover = upload(pic[0])
    pic = request.FILES.getlist('image1')
    image1 = upload(pic[0])
    pic = request.FILES.getlist('image2')
    image2 = upload(pic[0])
    typeid = request.POST["typeid"]
    Goods.objects.create(name=name, price=price, intro=intro, stock=stock, cover=cover, image1=image1, image2=image2,
                         type_id=typeid)
    # 添加成功刷新商品管理列表页面
    return redirect(goods_list)

对于处理图片上传的函数如下

def upload(pic, image=None):
    # 指定文件上传路径
    path = "CookieShopClient/static/picture/"
    if image:
       file_path = path + str(image)[8:]
       # 检查文件是否存在
       if os.path.isfile(file_path):
           # 删除文件
           os.remove(file_path)
    imageName = ""
    # 检查文件夹是否存在
    if not os.path.exists(path):
        # 如果文件夹不存在,则创建它
        os.makedirs(path)
    imageName = pic.name
    # 获取当前时间的时间戳(秒)
    timestamp_seconds = time.time()
    # 转换为毫秒
    timestamp_milliseconds = int(timestamp_seconds * 1000)
    imageName = str(imageName).split(".")[0] + str(timestamp_milliseconds) + "." + str(imageName).split(".")[1]
    url = path + imageName
    with open(url, 'wb') as f:
        for data in pic.chunks():
            f.write(data)
    return "/picture/" + imageName

4.修改商品功能

当管理员选择某个商品进行修改时,将该商品的商品编号以及所在分页页码发送给修改页面

path('admin/goods_editshow/',viewsAdmin.goods_editshow),
# 处理跳转至修改页面的请求
def goods_editshow(request):
    id = request.GET["id"]
    ym = request.GET["ym"]
    goods = Goods.objects.get(id=id)
    # 查询该商品所属分类
    typeName = Type.objects.get(id=goods.type_id).name
    types = Type.objects.all()
    return render(request, "adminTemp/goods_edit.html", {"g": goods, "typeName": typeName, "ym": ym, "typeList": types})
<!DOCTYPE html>
<html>
<head>
	<title>商品编辑</title>
    {% load static %}
	<meta charset="utf-8" />
	<link rel="stylesheet" href="{% static 'css/bootstrap.css' %}" />
</head>
<body>
<div class="container-fluid">
	{% include "adminTemp/header.html" %}
	<br><br>
	<form class="form-horizontal" action="/admin/goods_edit/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
		<input type="hidden" name="id" value="{{ g.id  }}"/>
		<input type="hidden" name="cover" value="{{ g.cover  }}"/>
		<input type="hidden" name="image1" value="{{ g.image1  }}"/>
		<input type="hidden" name="image2" value="{{ g.image2  }}"/>
		<input type="hidden" name="ym" value="{{ ym  }}"/>
		<input type="hidden" name="type" value="{{ typeName }}"/>
		<div class="form-group">
			<label for="input_name" class="col-sm-1 control-label">名称</label>
			<div class="col-sm-6">
				<input type="text" class="form-control" id="input_name" name="name" value="{{ g.name  }}" required="required">
			</div>
		</div>
		<div class="form-group">
			<label for="input_name" class="col-sm-1 control-label">价格</label>
			<div class="col-sm-6">
				<input type="text" class="form-control" id="input_name" name="price" value="{{ g.price  }}">
			</div>
		</div>
		<div class="form-group">
			<label for="input_name" class="col-sm-1 control-label">介绍</label>
			<div class="col-sm-6">
				<input type="text" class="form-control" id="input_name" name="intro" value="{{ g.intro  }}">
			</div>
		</div>
		<div class="form-group">
			<label for="input_name" class="col-sm-1 control-label">库存</label>
			<div class="col-sm-6">
				<input type="text" class="form-control" id="input_name" name="stock" value="{{ g.stock  }}">
			</div>
		</div>
		<div class="form-group">
			<label for="input_file" class="col-sm-1 control-label">封面图片</label>
			<div class="col-sm-6"><img src="{% static g.cover %}" width="100" height="100"/>
				<input type="file" name="cover"  id="input_file">推荐尺寸: 500 * 500
			</div>
		</div>
		<div class="form-group">
			<label for="input_file" class="col-sm-1 control-label">详情图片1</label>
			<div class="col-sm-6"><img src="{% static g.image1 %}" width="100" height="100"/>
				<input type="file" name="image1"  id="input_file">推荐尺寸: 500 * 500
			</div>
		</div>
		<div class="form-group">
			<label for="input_file" class="col-sm-1 control-label">详情图片2</label>
			<div class="col-sm-6"><img src="{% static g.image2 %}" width="100" height="100"/>
				<input type="file" name="image2"  id="input_file">推荐尺寸: 500 * 500
			</div>
		</div>
		<div class="form-group">
			<label for="select_topic" class="col-sm-1 control-label">类目</label>
			<div class="col-sm-6">
				<select class="form-control" id="select_topic" name="typeid">
                    {% for t in typeList %}
                    <option
                        {% if t.id == g.type_id %}
                        selected="selected"
                        {% endif %}
                         value="{{ t.id }}">{{ t.name  }}</option>
                    {% endfor %}

				</select>
			</div>
		</div>
		<div class="form-group">
			<div class="col-sm-offset-1 col-sm-10">
				<button type="submit" class="btn btn-success">提交修改</button>
			</div>
		</div>
	</form>
</div>
</body>
</html>

当管理员修改信息以及重新选择新图片后,将表单提交给服务器,服务器通过比较原图片以及新图片地址判断当前图片是否需要重新上传

path('admin/goods_edit/',viewsAdmin.goods_edit),
# 处理修改商品信息的请求
def goods_edit(request):
    id = request.POST["id"]
    # 根据id查询出原商品信息
    goods = Goods.objects.filter(id=id)
    name = request.POST["name"]
    price = request.POST["price"]
    intro = request.POST["intro"]
    stock = request.POST["stock"]
    try:
        # 判断修改页面传递的图片名称是否和数据库中原本图片名称一致,如果一致表示该图片没有被修改
        # 如果图片没有修改,则返回值为空
        pic = request.FILES.getlist('cover')[0]
        cover = upload(pic, goods[0].cover)
    except:
        cover = goods[0].cover
    try:
        # 判断修改页面传递的图片名称是否和数据库中原本图片名称一致,如果一致表示该图片没有被修改
        # 如果图片没有修改,则返回值为空
        pic = request.FILES.getlist('image1')[0]
        image1 = upload(pic, goods[0].image1)
    except:
        image1 = goods[0].image1
    try:
        # 判断修改页面传递的图片名称是否和数据库中原本图片名称一致,如果一致表示该图片没有被修改
        # 如果图片没有修改,则返回值为空
        pic = request.FILES.getlist('image2')[0]
        image2 = upload(pic, goods[0].image2)
    except:
        image2 = goods[0].image2

    typeid = request.POST["typeid"]
    ym = request.POST["ym"]
    # 修改商品信息
    goods.update(name=name, price=price, intro=intro, stock=stock, cover=cover, image1=image1, image2=image2,
                 type_id=typeid)
    return HttpResponseRedirect("/admin/goods_list/?ym=" + ym)

5.删除商品功能

当管理员选择某个商品删除的时候,触发请求

path('admin/goods_delete/',viewsAdmin.goods_delete),
# 处理删除商品的请求
def goods_delete(request):
    id=request.GET["id"]
    ym=request.GET["ym"]
    # 先查看当前商品是否有被添加为推荐栏商品,如果有,需要先从推荐栏中删除
    rs=Recommend.objects.filter(goods_id=id)
    if rs:
        rs.delete()
    # 根据商品编号将商品信息查询出来
    goods=Goods.objects.get(id=id)
    remove_image(goods.cover)
    remove_image(goods.image1)
    remove_image(goods.image2)
    goods.delete()
    return HttpResponseRedirect("/admin/goods_list/?ym=" + ym)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1934793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列预测|附代码数据

全文链接&#xff1a;https://tecdat.cn/?p37019 分析师&#xff1a;Haopeng Li 随着我国股票市场规模的不断扩大、制度的不断完善&#xff0c;它在金融市场中也成为了越来越不可或缺的一部分。 【视频讲解】神经网络、Lasso回归、线性回归、随机森林、ARIMA股票价格时间序列…

Haproy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

【MQTT(3)】开发一个客户端,QT-Android安卓手机版本

手机版本更加方便 生成安卓库 参考了这个代码 在编译Mosquitto以支持安卓平台时&#xff0c;主要涉及到使用Android NDK&#xff08;Native Development Kit&#xff09;进行交叉编译。环境的准备参考之前的博客【QT开发&#xff08;17&#xff09;】2023-QT 5.14.2实现Andr…

jenkins添加ssh证书

1、生成ssh密匙&#xff1a;windows生成ssh密匙-CSDN博客 2、添加添加ssh凭证&#xff1a;jenkins路由地址为&#xff1a;/manage/credentials/store/system/domain/_/ 点击添加凭证 选择第二个&#xff0c;将生成的私匙 id_rsa 里边的内容赋值到密钥&#xff0c;id留空自动…

使用小波分析实现文字种类自动识别

文章目录 数据简介开始实验小波分解得出结果结果分析误差分析 数据简介 各找一篇中文&#xff0c;日文&#xff0c;韩文&#xff0c;英文&#xff0c;俄文较长的学术论文。将论文转化为JPG格式。拆分每张JPG生成更多小的JPG。最终获得很多5个不同语言的JPG并且自带标签。数据链…

网安速查引擎(厂商设备大全)

速查引擎 斯元的速查引擎以其全面、精准的信息整合和便捷的搜索功能&#xff0c;大大缩短了用户查找相关厂商和产品信息的时间&#xff0c;从而提高了工作效率和决策质量。用户可以轻松查阅到各个赛道中的领先厂商和最新技术&#xff0c;帮助企业快速找到适合的合作伙伴和解决方…

逆向案例二十五——webpack所需模块函数很多,某翼云登录参数逆向。

解决步骤&#xff1a; 网址&#xff1a;aHR0cHM6Ly9tLmN0eXVuLmNuL3dhcC9tYWluL2F1dGgvbG9naW4 不说废话&#xff0c;密码有加密&#xff0c;直接搜索找到疑似加密位置打上断点。 再控制台打印&#xff0c;分析加密函数 有三个处理过程&#xff0c;b[g]得到的是用户名,b[f] 对…

HiFi-GAN——基于 GAN 的声码器,能在单 GPU 上生成 22 KHz 音频

拟议的 HiFiGAN 可从中间表征生成原始波形 源码地址&#xff1a;https://github.com/NVIDIA/DeepLearningExamples 论文地址&#xff1a;https://arxiv.org/pdf/2010.05646.pdf 研究要点包括 **挑战&#xff1a;**基于 GAN 的语音波形生成方法在质量上不及自回归模型和基于流…

Linux部署Prometheus+Grafana

【Linux】PrometheusGrafana 一、Prometheus&#xff08;普罗米修斯&#xff09;1、Prometheus简述2、Prometheus特点3、Prometheus生态组件4、Prometheus工作原理 二、部署Prometheus1、系统架构2、部署Prometheus3、修改配置文件4、配置系统启动文件 三、部署 Node Exporter …

Spring MVC-什么是Spring MVC?

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 1.MVC定义2. Spring MVC 官方对于Spring Web MVC的描述这样的: Spring Web MVC is the original web framework built on the Servlet APl and has been includedin the Spring Frame…

P1-AI产品经理--九五小庞

产品经理的定位 AI基于现有业务挖掘AI应用场景&#xff0c;服务提供商选择及算法定制等&#xff0c;配合已有产品完成整体产品工工资基于从事医疗行业的考虑&#xff0c;我们走的应该是AI产品经理&#xff08;软件型&#xff09; AI产品经理&#xff08;行业型&#xff09; AI…

JavaEE:Lombok工具包的使用以及EditStarter插件的安装

Lombok是一个Java工具库&#xff0c;通过添加注解的方式&#xff0c;简化Java的开发。 目录 1、引入依赖 2、使用 3、原理解释 4、更多使用 5、更快捷的引入依赖 1、引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lomb…

STM32全栈嵌入式人脸识别考勤系统:融合OpenCV、Qt和SQLite的解决方案

1. 项目概述 本项目旨在设计并实现一个基于STM32的全栈人脸识别考勤系统。该系统结合了嵌入式开发、计算机视觉和数据库技术&#xff0c;实现了自动人脸检测、识别和考勤记录功能。 主要特点: 使用STM32F4系列微控制器作为主控制器采用OpenCV进行人脸检测和识别Qt开发跨平台…

高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0

桌面虚拟化作为云时代的主流和热门技术&#xff0c;已经取得了广泛应用。随着生成式 AI 爆炸式发展&#xff0c;CSDN 看到&#xff0c;人工智能正在引发计算、开发、交互三大范式的全面升级&#xff0c;技术开发或将迎来一次全新的科技变革周期&#xff0c;因此 VDI 云桌面随之…

亚马逊自发货erp,虚拟自动化发货功能以及1688订单采购

亚马逊自发货erp自动化功能&#xff0c;自动同步订单&#xff0c;1688订单同步。 大家好&#xff0c;今天分享一个非常实用并且节省时间的功能&#xff1a;自动化发货以及1688同步订单。 首先来看下自动化发货功能怎么操作。 →要在商品信息里面添加商品信息&#xff0c;上传…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

JavaDS —— 二叉树

树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有…

网易滑块逆向

版本 2.27.2 混淆难度挺大 没反混淆 直接硬着直接干 参数还是那些 滑块&#xff08;其他类型也一样&#xff09;成功率 100%

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效 上篇作业解题 在前一篇文章的最后,给各位看官留了一个作业,如上图所示。本篇文章,我们来公布一下它的源码。 主要实现的思路 四个渐变色的线段,沿着四个方向的依次运动,(运动在加载前执行)使用 …