当前位置: 首页 > news >正文

Django项目之订单管理part1

一.前言

我们前面把django的常用知识点给讲完了,现在我们开始项目部分,项目是一个订单管理系统,我们同时也会在项目之中也会讲一些前面没有用到的知识点。

项目大概流程如下:

核心的功能模块:

  • 认证模块,用户名密码 或 手机短信登录(60s有效)。

  • 角色管理,不同角色具有不同权限 和 展示不同菜单。

    管理员,充值客户,下单
  • 客户管理,除了基本的增删改查以外,支持对客户可以分级,不同级别后续下单折扣不同。

  • 交易中心

    • 管理员可以给客户余额充值/扣费

    • 客户可以下单/撤单

    • 生成交易记录

    • 对订单进行多维度搜索,例如:客户姓名、订单号。

  • worker,去执行订单并更新订单状态。

二.单点知识

2.1 群发短信

这个需要我们去开通腾讯云短信服务,具体大家浏览器搜索就知道了,参考下面:

短信 Python SDK-SDK 文档-文档中心-腾讯云https://cloud.tencent.com/document/product/382/43196https://cloud.tencent.com/document/product/382/43196https://cloud.tencent.com/document/product/382/43196https://cloud.tencent.com/document/product/382/43196https://cloud.tencent.com/document/product/382/43196

大概精简下来就长这样 

# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.sms.v20210111 import sms_client, models# SecretId和SecretKey
cred = credential.Credential("SecretId", "SecretKey")
client = sms_client.SmsClient(cred, "ap-guangzhou")req = models.SendSmsRequest()# 设置的appid
req.SmsSdkAppId = "appid"
# 设置的签名内容
req.SignName = "签名内容"
# 模板id
req.TemplateId = "模板id"
# 验证码内容
req.TemplateParamSet = ["666666"]
req.PhoneNumberSet = ["+8615888888888"]
resp = client.SendSms(req)print(resp)

2.2 权限和菜单管理

2.2.1 菜单

不同的用户登陆时会看到不同的菜单,那我们此时此刻就有几种选择方式,一是写到html的母版里面,但是这样的弊端就是后续更改页面位置太多会比较麻烦,我们也可以把菜单的设计放在settings里面或者数据库里面。

页面写死 HTML模板:

<html>
    {% if 角色 "管理员"%}
        <a href="/xxx/x">用户管理</a>
        <a href="/xxx/x">级别管理</a>
        <a href="/xxx/x">级别管理</a>
        ...
    {% else %}
        <a href="/xxx/x">xxx管理</a>
        <a href="/xxx/x">级别管理</a>
    {% endif %}
</html>

将菜单放在配置文件中:

# settings.py

ADMIN = [
    {"title":"用户管理", "url":"...." },
    {"title":"用户管理", "url":"...." },
    {"title":"用户管理", "url":"...." },
    {"title":"用户管理", "url":"...." },
]

USER = [
    {"title":"用户管理", "url":"...." },
    {"title":"用户管理", "url":"...." },
    {"title":"用户管理", "url":"...." },
    {"title":"用户管理", "url":"...." },
]

<html>
    {% if 角色 "管理员"%}
        {% for item in ADMIN%}
            <a href="{{item.url}}">{{item.title}}</a>
        {%emdfor%}
    {% else %}
        {% for item in USER%}
            <a href="{{item.url}}">{{item.title}}</a>
        {%emdfor%}
    {% endif %}
</html> 

将 菜单+角色 写入数据库 :

idtitleurl
1用户管理...
2级别管理...
3订单管理...
id角色
1管理员
2用户
idrole_idmenu_id
111
212
322
在页面展示数据库
1.查询特定角色关联的所有的菜单
2.在页面上进行展示

 如果选择使用配置文件的方式:

ADMIN = [
    {
        "title":"用户管理", 
        "children":[
            {"title":"级别列表","url":"....", "name":"level_list",}
            {"title":"级别列表","url":"...."}
            {"title":"级别列表","url":"...."}
        ]
    },
    {
        "title":"订单管理", 
        "children":[
            {"title":"订单列表","url":"...."}
            {"title":"订单列表","url":"...."}
            {"title":"订单列表","url":"...."}
        ]
    },
]

 这个name是我们可以通过name反向生成ur,在前面路由里面和大家说过

菜单选中和展开问题:

1.获取当前用户请求的 URL   pricepolicy/list/ 或 url对应的name

2. pricepolicy/list/ 配置 ADMIN中的URL   ->默认选中

路径导航的问题 :

1.获取当前用户请求的 URL   pricepolicy/list/ 或 url对应的name

2.获取上级,展示导航信息

3.设置菜单与下级关系

扩展:菜单多级关系

idtitleurlparent_id
1客户管理nullnull
2级别列表...1
3客户列表...1
4订单管理nullnull
5价格...4
6交易...4
7其他...6

注意:类似与平台的评论。

idcontentroot_idparent_iddepth
1优秀nullnull0
2不咋样nullnull0
3确实111
4哈哈111
5你说的都对132

- 优秀
    确实
        你说的都对
    哈哈
- 不咋样 

2.2.2 权限

我们在权限的判断时,应该要两种判断,一种是客户点击页面,一种是导航条输入api,都要进行判断,我们一般就是把客户和他对应的url存放到字典或者集合,每次访问都在中间件进行判断,不用列表是因为列表的查询效率特别的低特别的耽误时间

文件settings.py的方式:

admin_permisions = {
    "level_list":{...},
    "level_edit":{..., 'parent':'level_list'},
    "level_add":{... 'parent':'level_list'},
    "level_delete":{..'parent':'level_list'.},
    
    "user_list":{...},
    "user_edit":{...},
    "user_add":{...},
    "user_delete":{...},
}

user_permisions = {
    ...
}

当然我们通常不会存储链接,而是存储name和naspace

admin访问某个URL + 路由信息(name、namespace),获取当前的URL  /level/edit/4/ -> 是否存在URL,因为有的url是可变的,比如编辑删除,他的客户信息都是动态的

在中间件中根据URL中的name进行权限的校验。

数据库方式:

2.3 队列 

  • rabbitMQ,Linux命令+服务构建+python代码。

  • kafka,Linux命令+服务构建+python代码。

  • redis的列表

基于redis实现上述的过程和代码示例:

  • 安装redis

  • 启动redis

这里我就不说安装教程了,大家不记得直接去搜就好了

Python操作redis:

pip install redis 

import redisconn = redis.Redis(host='127.0.0.1', port=6379, encoding='utf-8')
# 短信验证码
conn.set('15131255089', 9999, ex=10)
value = conn.get('15131255089')
print(value)
import redisconn = redis.Redis(host='127.0.0.1', port=6379, encoding='utf-8')# 放值
# conn.lpush('my_queue', "root")
# conn.lpush('my_queue', "good")# 取值
v1 = conn.brpop("my_queue", timeout=5)
print(v1)

这是两种实例代码,上面是我们用来短信验证码的,而下面就是我们的任务队列

2.4 worker和线程池 

# 1.去redis中获取任务
import time
# 2.再将此订单在数据库中的状态修改为 执行中# 3.获取任务详细:100个任务# 4.线程池或协程
from concurrent.futures import ThreadPoolExecutordef task(arg):# 执行任务# 模拟运行时间time.sleep(1)start_time=time.time()
pool = ThreadPoolExecutor(50)
for i in range(100):pool.submit(task, "任务参数")pool.shutdown()  # 卡主,等待所有的任务执行完毕。
end_time=time.time()
# 5.更新订单状态,已完成
print(end_time-start_time)

这个就是前面说的多线程

三.项目 

我们这里完整的说一下整个项目的创建,不记得的可以看前面几篇,有更具体的介绍

1.我们新创建一个项目django_project,然后安装django3.2

2.执行命令django-admin startproject django_project .

3.这里我们只创建一个app,我们就叫web,执行命令python manage.py startapp web

4.连接数据库,pip install pymysql,再在项目同名的文件夹下的__init__.py写入

import pymysql
pymysql.install_as_MySQLdb()
然后再在settings改成mysql的配置

5.屏蔽掉settings里面没用的组件,让项目是一个纯净版的django(可不做)

6.再将app注册

3.1 表结构设计

表结构设计我们要有管理员表,客户表,级别表(折扣等级),价格表,订单表,交易记录表。

这里我就直接给代码了,代码也都给上注释了

from django.db import modelsclass ActiveBaseModel(models.Model):"""用来继承的表"""active = models.SmallIntegerField(verbose_name='状态', default=1,choices=((1, '激活'), (0, '删除')))  # 用来进行逻辑删除而不是物理删除class Meta:abstract = True  # 把 ActiveBaseModel 设置为抽象类,防止在数据库中创建表class Administrator(ActiveBaseModel):"""管理员表"""username = models.CharField(verbose_name='用户名', max_length=32, db_index=True)password = models.CharField(verbose_name='密码', max_length=64)mobile = models.CharField(verbose_name='手机号', max_length=11, db_index=True)create_date = models.DateTimeField(verbose_name='创建日期',auto_now_add=True)  # auto_now_add和之前说的auto_now的区别是前者只在创建的时候自动生成,后者在后面更新的时候也会自动更新,我们这里要的是第一次创建的class Level(ActiveBaseModel):"""级别表"""title = models.CharField(verbose_name='标题', max_length=32)percent = models.IntegerField(verbose_name='折扣')class Customer(ActiveBaseModel):"""客户表"""username = models.CharField(verbose_name='用户名', max_length=32, db_index=True)password = models.CharField(verbose_name='密码', max_length=64)mobile = models.CharField(verbose_name='手机号', max_length=11, db_index=True)balance = models.DecimalField(verbose_name='账户余额', default=0, max_digits=10, decimal_places=2)level = models.ForeignKey(verbose_name='级别', to='Level', on_delete=models.CASCADE)creator = models.ForeignKey(verbose_name='创建者', to='Administrator', on_delete=models.CASCADE)create_date = models.DateTimeField(verbose_name='创建日期', auto_now_add=True)class PricePolicy(models.Model):"""价格策略 (原价,后续可以根据级别享受不同折扣)1000 52000 8"""count = models.IntegerField(verbose_name="数量")price = models.DecimalField(verbose_name='价格', default=0, max_digits=10, decimal_places=2)class Order(ActiveBaseModel):"""订单表"""status_choices = ((1, '待执行'),(2, '正在执行'),(3, '已完成'),(4, '失败'),)status = models.SmallIntegerField(verbose_name='状态', choices=status_choices, default=1)oid = models.CharField(verbose_name='订单号', max_length=64, unique=True)count = models.IntegerField(verbose_name='数量')price = models.DecimalField(verbose_name='价格', default=0, max_digits=10,decimal_places=2)  # 价格这里我们不通过价格策略关联,因为如果我们后期更换价格策略,会对不上账real_price = models.DecimalField(verbose_name='实际价格', default=0, max_digits=10, decimal_places=2)old_view_count = models.CharField(verbose_name="原播放量", max_length=32,default="0")  # 不用整型是因为我们拿到的播放量很容易是字符串例如1.2wcreate_date = models.DateTimeField(verbose_name='创建日期', auto_now_add=True)customer = models.ForeignKey(verbose_name='客户', to="Customer", on_delete=models.CASCADE)memo = models.TextField(verbose_name='备注', null=True, blank=True)class TransactionRecord(ActiveBaseModel):"""交易记录"""charge_type_class_mapping = {1: 'success',2: 'danger',3: 'default',4: 'info',5: 'primary',}#这个是根据bootstrap的按钮样式来做的一个字典charge_type_choices=((1,"充值"),(2,"扣款"),(3,"创建订单"),(4,"删除订单"),(5,"撤单"),)charge_type=models.SmallIntegerField(verbose_name="类型",choices=charge_type_choices)customer=models.ForeignKey(verbose_name='客户',to='Customer',on_delete=models.CASCADE)amount=models.DecimalField(verbose_name='金额',default=0,max_digits=10,decimal_places=2)creator=models.ForeignKey(verbose_name='管理员',to='Administrator',on_delete=models.CASCADE,null=True,blank=True)order_oid=models.CharField(verbose_name='订单号',max_length=64,null=True,blank=True,db_index=True)

这里就是表结构的代码,大家可以看看

3.2 用户认证相关 

  • 用户名和密码登录

  • 短信登录

  • 页面展示

  • 提交数据

  • 根据数据去数据库校验

    • 通过,登录成功 session

    • 失败,页面展示错误信

登录成功后,保存用户的信息session【文件、数据库、缓存中】

而今天最后的最后就是来写用户登录的代码

3.2.1 基本页面

我们先创建一个templates存放html,因为我们后面要写的视图函数比较多,所以我们就把views.py删掉换成 一个文件夹,文件夹里面放入给类视图函数,因为我们现在要做登录相关函数所以我们先创建一个account.py。

我们先写一个简单的登录页面,这里给大家介绍几个需要注意的点,第一个就是如果是post请求(ajax除外),就一定要加上这个csrf_token (不然就会报错),或者把中间件里的csrf关掉

{% csrf_token %}

3.2.2 bootstrap优化页面

但是我们发现这个样式有点丑,我们可以借用bootstrap进行美化,我们先去下载,然后在app目录下面创建static文件夹,然后再创建文件,把下载好的bootstrap引入进去,然后再引入到html里面

这样就是创建好了,我们就要开始写好看的页面了,这里不过多叙述,我们就借助ai和bootstrap来写一个稍微能看的页面就行了,这里直接给出代码

login.html

{% load static %}<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static '/plugins/bootstrap/css/bootstrap.css' %}"><style>.box {width: 400px;border: 1px solid #dddddd;margin-left: auto;margin-right: auto;margin-top: 200px;padding-left: 40px;padding-right: 40px;padding-bottom: 30px;box-shadow: 5px 10px 10px rgb(0 0 0 /5%);}</style></head>
<body><div class="box"><h2 style="text-align: center">用户登录</h2><form method="post" action="{% url 'login' %}" class="form-horizontal">{% csrf_token %}<div class="form-group"><label>角色</label><select name="role" class="form-control"><option value="2">客户</option><option value="1">管理员</option></select></div><div class="form-group"><label>用户名</label><input type="text" class="form-control" id="exampleInputPassword1" name="username" placeholder="用户名"></div><div class="form-group"><label>密码</label><input type="password" class="form-control" id="exampleInputPassword1" name="password" placeholder="密码"></div><div class="form-group"><div class="checkbox"><label><input type="checkbox"> 记住我</label></div></div><div class="form-group"><button type="submit" class="btn btn-primary">登录</button><a href="{% url 'sms_login' %}" style="float: right">短信登录</a></div></form></div><h1></h1></body>
</html>

 sms_login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static '/plugins/bootstrap/css/bootstrap.css' %}"><style>.box {width: 400px;border: 1px solid #dddddd;margin-left: auto;margin-right: auto;margin-top: 200px;padding-left: 40px;padding-right: 40px;padding-bottom: 30px;box-shadow: 5px 10px 10px rgb(0 0 0 /5%);}</style>
</head>
<body><div class="box"><h2 style="text-align: center">短信登录</h2><form method="post" action="{% url 'sms_login' %}" class="form-horizontal">{% csrf_token %}<div class="form-group"><label>角色</label><select name="role" class="form-control"><option value="2">客户</option><option value="1">管理员</option></select></div><div class="form-group"><label>手机号</label><input type="text" class="form-control" id="inputEmail3" name="mobile" placeholder="手机号"></div><div class="form-group"><label>短信验证码</label><div class="row"><div></div><div class="col-md-9"><input type="password" class="form-control" id="inputPassword3" name="code"placeholder="短信验证码"></div><div class="col-md-3"><input type="button" value="发送短信" class="btn btn-default"></div></div></div><div class="form-group"><button type="submit" class="btn btn-primary">登录</button><a href="{% url 'login' %}" style="float: right">用户名登录</a></div></form></div></body>
</html>

 

优化后的页面虽然不好看,但是也能看 

3.2.3 登录逻辑

我们现在就要来写登录逻辑了,我们在写登录逻辑之前肯定知道,如果登录成功肯定要存储到session,我们上节说过session配置缓存,那我们就要按照上节配置一下。

我们创建数据库存放密码的时候,通常用的是密文,那我们就创建一个utils文件夹来存放加密解密

 

这个seetings.SECRET_KEY是django创建项目的时候生成的,我们把这个充当是盐

这样我们一个简单的登录逻辑就写好了,那我们就要开始测试了,我们平时都是直接在数据库里面写入数据,但是这个密码是md5还要加上盐,我们手动创建会很麻烦,我们可以写一点离线脚本

import os
import sys
import djangobase_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名.settings')
django.setup()from web import models
from utils.encrypt import md5models.Administrator.objects.create(username='admin',password=md5('admin'),mobile='18888888888')

我们通过这个就能写django的离线脚本了,通过脚本给数据库添加点东西,或者还可以在项目终端执行python manage.py shell,然后写入代码,但是这个直接一次性执行,不是很方便

3.2.4 form表单验证

我们现在想想,我们这个是不是什么都不输入并且密码错误以后什么都没有了,此时我们就要借助form,这样可以解决这一点

from django.shortcuts import render,redirect
from web import models
from utils.encrypt import md5
from django import formsclass LoginForm(forms.Form):role=forms.ChoiceField(required=True,choices=(('2','客户'),('1','管理员')),widget=forms.Select(attrs={'class':'form-control'}))username=forms.CharField(required=True,widget=forms.TextInput(attrs={'class':'form-control','placeholder':'用户名'}))password=forms.CharField(required=True,widget=forms.PasswordInput(attrs={'class':'form-control','placeholder':'密码'})) #密码默认不保留 如果想要保留就加上render_value=Truedef login(request):if request.method=="GET":form=LoginForm()return render(request,'login.html',{'form':form})#通过form来校验form=LoginForm(request.POST)if not form.is_valid():#这个来开始校验return render(request,'login.html',{'form':form}) #这个相当于是把上一次的值写进去# 验证成功之后 form.cleaned_data就是存放的所有数据username=form.cleaned_data.get('username')password=form.cleaned_data.get('password')password=md5(password) #我们存放到数据库要用md5role=form.cleaned_data.get('role')mapping={'1':'ADMIN','2':'CUSTOMER'}if role not in mapping:return render(request,'login.html',{'form':form,'error':'角色不存在'})if role=='1':user_object=models.Administrator.objects.filter(active=1,username=username,password=password).first() #因为是逻辑删除,所以一定要加上active=1else:user_object = models.Customer.objects.filter(active=1, username=username, password=password).first()# 校验失败if not user_object:return render(request, 'login.html', {'form':form,'error': '用户名或密码错误'})# 校验成功存到session+进入项目后台request.session['user_info']={'role':mapping[role],'name':user_object.username,'id':user_object.id}return redirect('/home/')

我直接上代码,也都加上了注释,但是我在这里把重要的点加上来给你说,下重点

1.定义form必须要继承forms.Form

2.最开始定义例如:username=forms.CharField(),括号里面加上一些字段,如果要带上标签的类型的话要加上widget=forms.TextInput() 或者别的标签,根据标签来,要加上的类型例如class,就写上attrs={},这样子,其中name不用写,name就默认等于定义的名字,如username

3.form=LoginForm(request.POST) 这个就是把requests.POST的值放进去一个个比对

4.form.is_valid() 来判断是否比对成功

5.比对成功之后form.cleaned_data就是一个字典,里面存放所有要的数据

最新的login.html

{% load static %}<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static '/plugins/bootstrap/css/bootstrap.css' %}"><style>.box {width: 400px;border: 1px solid #dddddd;margin-left: auto;margin-right: auto;margin-top: 200px;padding-left: 40px;padding-right: 40px;padding-bottom: 30px;box-shadow: 5px 10px 10px rgb(0 0 0 /5%);}@keyframes fadeOut {0% {opacity: 1;}99% {opacity: 1;}100% {opacity: 0;visibility: hidden;}}</style></head>
<body><div class="box"><h2 style="text-align: center">用户登录</h2><form method="post" action="{% url 'login' %}" class="form-horizontal" >{% csrf_token %}<div class="form-group"><label>角色</label>{{ form.role }}</div><div class="form-group"><label>用户名</label>{{ form.username }}</div><div class="form-group"><label>密码</label>{{ form.password }}</div><div class="form-group"><div class="checkbox"><label><input type="checkbox"> 记住我</label></div></div><div class="form-group"><button type="submit" class="btn btn-primary">登录</button><span style="animation: fadeOut 2s forwards;color: red">{{ error }}</span><a href="{% url 'sms_login' %}" style="float: right">短信登录</a></div></form></div></body>
</html>

四.总结 

今天说的内容有点多,刚开始嘛都这,我也写了好久了,主要的还是form表单的验证,下一期将更加完善这个项目,会涉及ajax,短信登陆等等

五.补充 

下一期将和大家开始讲项目,期待大家的点赞关注加收藏 

 

 

 

相关文章:

Django项目之订单管理part1

一.前言 我们前面把django的常用知识点给讲完了&#xff0c;现在我们开始项目部分&#xff0c;项目是一个订单管理系统&#xff0c;我们同时也会在项目之中也会讲一些前面没有用到的知识点。 项目大概流程如下&#xff1a; 核心的功能模块&#xff1a; 认证模块&#xff0c;用…...

基于SSM+Vue的智能汽车租赁平台设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

deepseek本地调用

目录 1.介绍 2.开始调用 2.1模型检验 2.2 通过url调用 3.总结 1.介绍 这篇博客用来教你如何从本地调用ollama中deepseek的模型接口&#xff0c;直接和deepseek进行对话。 2.开始调用 2.1模型检验 首先要保证ollama已经安装到本地&#xff0c;并且已经下载了deepseek模型…...

文件同步工具哪家强?FreeFileSync 免费无限制

FreeFileSync 是一款备受推崇的开源文件同步与备份软件&#xff0c;凭借其卓越的功能和简洁直观的界面&#xff0c;赢得了全球用户的青睐。该软件不仅支持跨平台操作&#xff0c;兼容 Windows、macOS 和 Linux 系统&#xff0c;还能帮助用户在不同设备之间无缝同步文件&#xf…...

捷米特 JM - RTU - TCP 网关应用 F - net 协议转 Modbus TCP 实现电脑控制流量计

一、项目背景 在某工业生产园区的供水系统中&#xff0c;为了精确监测和控制各个生产环节的用水流量&#xff0c;需要对分布在不同区域的多个流量计进行集中管理。这些流量计原本采用 F - net 协议进行数据传输&#xff0c;但园区的监控系统基于 Modbus TCP 协议进行数据交互&…...

Coze扣子怎么使用更强大doubao1.5模型

最近&#xff0c;豆包刚刚发布了最新的doubao1.5系列模型&#xff0c;并且加量不加价。 在性能极大进步的情况下&#xff0c;价格还与之前一致。真是业界良心了。 在同样的价格下&#xff0c;肯定要使用性能更强大的模型嘛 于是我准备把所有的智能体和工作流切换到doubao1.5…...

layui 远程搜索下拉选择组件(多选)

模板使用&#xff08;lay-module/searchSelect&#xff09;&#xff0c;依赖于 jquery、layui.dist 中的 dropdown 模块实现&#xff08;所以data 格式请参照 layui文档&#xff09; <link rel"stylesheet" href"layui-v2.5.6/dist/css/layui.css" /&g…...

嵌入式学习(18)---Linux文件编程中的进程

一、进程的概念 进程:(用来描述 程序动态执行的过程&#xff0c;方便操作系统管理的) 进行中的程序 程序的一次执行过程 (内存 CPU) 程序的实例 程序 ----加载到内存----> 进程 应用场景: 实现并发 同一时刻 同时发生 并行 …...

一.AI大模型开发-初识机器学习

机器学习基本概念 前言 本文主要介绍了深度学习基础&#xff0c;包括机器学习、深度学习的概念&#xff0c;机器学习的两种典型任务分类任务和回归任务&#xff0c;机器学习中的基础名词解释以及模型训练的基本流程等。 一.认识机器学习 1.人工智能和机器学习 人工智能&am…...

RoCE和 TCP的区别

RoCE&#xff08;RDMA over Converged Ethernet&#xff09;和 TCP&#xff08;Transmission Control Protocol&#xff09;都是用于数据传输的协议&#xff0c;但它们在多个方面存在显著区别&#xff0c;以下为你详细介绍&#xff1a; 设计目标 RoCE&#xff1a;主要设计目标…...

勒索病毒攻击:如何应对和恢复

近年来,勒索病毒(Ransomware)已经成为全球信息安全领域最具破坏力的威胁之一。无论是个人用户,还是大中型企业,甚至政府机构,勒索病毒的攻击频率和破坏性日益增加。2020年及2021年,勒索病毒攻击不仅数量激增,且其攻击手法、目标和传播方式也变得更加复杂、精密和具有针…...

解决MySQL错误:You can‘t specify target table ‘xxx‘ for update in FROM clause

目录 错误复现场景原因分析解决方案方法1&#xff1a;使用派生表&#xff08;推荐&#xff09;方法2&#xff1a;改用JOIN操作方法3&#xff1a;使用临时表 总结 在编写MySQL的UPDATE或DELETE语句时&#xff0c;如果子查询中直接引用了要操作的目标表&#xff0c;可能会遇到一个…...

在Linux上安装和使用Docker

在Linux上安装和使用Docker&#xff1a;一步步指南 Docker是一种流行的容器化平台&#xff0c;它可以帮助开发者轻松构建、部署和运行应用程序。在本文中&#xff0c;我们将介绍如何在Linux系统上安装Docker&#xff0c;并提供一些常用的Docker命令和使用说明。 1. 安装Docke…...

【Git】四、标签管理

文章目录 Ⅰ. 理解标签Ⅱ. 创建标签① 轻量级标签② 含附注类标签 Ⅲ. 操作标签 Ⅰ. 理解标签 ​ 标签 tag &#xff0c;可以简单的理解为是 对某次 commit 的一个标识&#xff0c;相当于起了一个别名。例如&#xff0c;在项目发布某个版本的时候&#xff0c;针对最后一次 com…...

elementui中aria-hidden报错

浏览器检查的原因&#xff0c;不影响功能&#xff0c;但会在控制台报红 解决办法&#xff1a; 在对应元素设置display:none .el-radio__original {display: none !important;}...

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

【MySQL】简单掌握数据类型与表操作,让数据库性能飞跃

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f333;一、数据类型 &#x1f343;1.数值类型 &#x1f342;整型类型 &#x1f342;浮点型类型 &#x1f342;定点数类型 &#x1f343;2.字符串类型 3.&am…...

JUC并发编程——Java线程(一)

文章目录 1. 线程的创建1.1 方法1&#xff1a; 直接使用Thread1.2 方法2&#xff1a;使用Runnable配合Thread1.3 方法3&#xff1a;FutureTask配合Thread 2. 线程运行2.1 原理2.2 常见方法2.2.1 start与run2.2.2 sleep与yield2.2.3 join2.2.4 interrupt 3. 主线程和守护线程4. …...

Python入门笔记3

ros小车亚博官网例子延时性基本上跑完了&#xff0c;发现自己一些基础Python语法还不熟悉。 本节学习循环&#xff1a; while\for\break\continue 1. while 循环 while 循环会在条件表达式为真时&#xff0c;重复执行一段代码块&#xff0c;直到条件表达式变为假。 格式&am…...

【SQL教程|07】sql中条件查询where用法示例

SQL WHERE 条件查询教程 在SQL中&#xff0c;WHERE 条件用于在 SELECT 语句后过滤结果集&#xff0c;只返回符合条件的记录。它帮助我们从大量数据中提取所需的信息。以下是使用 WHERE 条件的逐步指南。 1. 基本语法 SELECT [字段] FROM [表] WHERE [条件];SELECT&#xff1a…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...