【web开发】7、Django(2)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、部门列表
- 二、部门管理(增删改)
- 三、用户管理过渡到modelform组件
- 四、modelform实例:靓号操作
- 五、自定义分页组件
- 六、datepick时间插件的使用
- 在layout.html模板文件中引入datepick的js、css
- 1.直接在字段中添加 id="dt"
- 2.基于ModelForm
- 七、自定义有Bootstrap样式的ModelForm
一、部门列表
1.在models.py下
class Department(models.Model):"""部门表"""title =models.CharField(verbose_name="标题",max_length=32)def __str__(self):return self.title
2.在views文件下
def …(request):return(request,’…html’)
def depart_list(request):"""部门类"""# 去数据库中获取所有的部门列表queryset = models.Department.objects.all()return render(request, 'depart_list.html', queryset )
3.depart_list.html文件下
{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default" style="margin-top: 20px;"><!-- Default panel contents --><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>批量上传</div><div class="panel-body"><form method="post" enctype="multipart/form-data" action="/depart/multi/">{% csrf_token %}<div class="form-group"><input type="file" name="exc"></div><input type="submit" value="上传" class="btn btn-info btn-sm"></form></div><div style="margin-bottom: 10px"></div><div class="panel-heading"><a class="btn btn-success btn-xs " href="/depart/add/"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新建部门</a></div><!-- Table --><table class="table"><thead><tr><th>id</th><th>名称</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr><th scope="row">{{ obj.id }}</th><td>{{ obj.title }}</td><td><a href="/depart/{{ obj.id }}/edit/" class="btn btn-primary btn-xs ">编辑</a><a href="/depart/delete/?nid={{ obj.id }}" class="btn btn-danger btn-xs ">删除</a></td></tr>{% endfor %}</tbody></table></div></div><!-- /.container -->{% endblock %}
二、部门管理(增删改)
注意:两个html文件中都需要{% load static %}
添加部门
1)在urls.py下创建path(‘depart/add/’, views.depart_add),
2)在views.py下创建def depart_add(request)
def depart_add(request):"""添加部门"""if request.method == 'GET':return render(request, 'depart_add.html')# 获取用户POST提交过来的数据title = request.POST.get("title")# 保存到数据库models.Department.objects.create(title=title)# 重定向部门列表return redirect("/depart/list/")
3)templates目录下创建depart_add.html
{% extends 'layout.html' %}
{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading">新建部门</div><div class="panel-body"><form class="form-horizontal" method="post">{% csrf_token %}<div class="form-group"><label class="col-sm-2 control-label">标题</label><div class="col-sm-10"><input type="text" class="form-control" placeholder="标题" name="title"/></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="submit" class="btn btn-primary">提 交</button></div></div></form></div></div></div>
{% endblock %}
4)在depart_list.html文件下新建部门处链接到depart/add/地址
删除部门
1)在urls.py下创建path(‘depart/delete/’, views.depart_delete),
2)在views.py下创建def depart_delete(request)
删除: href=“/depart/delete/?nid={{ obj.id }}”
def depart_delete(request):"""删除部门"""# 获取idnid = request.GET.get('nid')# 删除models.Department.objects.filter(id=nid).delete()# 跳转(重定向回部门列表)return redirect("/depart/list/")
3)在depart_list.html文件下的删除按钮内
<a href="/depart/delete/?nid={{ obj.id }}" class="btn btn-danger btn-xs ">删除</a>
编辑部门
1)在urls.py下创建path(‘depart/< int:nid >/edit/’, views.depart_edit),
http://127.0.0.1:8000/depart/int/edit/
编辑: href=“/depart/{{ obj.id }}/edit/”
path('depart/<int:nid>/edit/', views.depart_edit),
2)在views.py下创建def depart_edit(request,nid)
def depart_edit(request, nid):"""编辑部门"""if request.method == "GET":# 根据id获取编辑的数据row_object = models.Department.objects.filter(id=nid).first()print(row_object.id, row_object.title)# 重定向到编辑页面return render(request, "depart_edit.html", {"row_object": row_object})# 用户提交的标题title = request.POST.get("title")# 根据id在数据库中进行更新models.Department.objects.filter(id=nid).update(title=title)# 跳转(重定向回部门列表)return redirect("/depart/list/")
3)vaule表示默认值,在depart_list.html文件下的编辑按钮内
value=“{{ row_object.title }}”
{% extends 'layout.html' %}
{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading">修改部门</div><div class="panel-body"><form class="form-horizontal" method="post">{% csrf_token %}<div class="form-group"><label class="col-sm-2 control-label">标题</label><div class="col-sm-10"><input type="text" class="form-control" placeholder="标题" name="title" value="{{ row_object.title }}"/></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="submit" class="btn btn-primary">提 交</button></div></div></form></div></div></div>
{% endblock %}
三、用户管理过渡到modelform组件
获取数据
insert into app01_userinfo(name,password,age,account,creat_time,gender,depart_id) values("刘乐","1e4q",42,3321.02,"2010-03-11",2,11);
在models.py文件下
class UserInfo(models.Model):"""员工表"""name =models.CharField(verbose_name="姓名",max_length=32)password =models.CharField(verbose_name="密码",max_length=32)age =models.IntegerField(verbose_name="年龄")account =models.DecimalField(verbose_name="余额",max_digits=10,decimal_places=2,default=0)creat_time =models.DateField(verbose_name="入职时间")
# 有约束 on_delete=models.CASCADE级联删除depart = models.ForeignKey(verbose_name="所属部门",to="Department",to_field="id",on_delete=models.CASCADE)
# 链接部分被删除时置空
# depart = models.ForeignKey(to="Department",to_field="id",null=True,blank=True,on_delete=models.SET_NULL)
# 在django中做的约束gender_choices=((1,"男"),(2,"女"),)gender =models.SmallIntegerField(verbose_name="性别",choices=gender_choices)
在user_list.html文件下
"""注意:return render(request,"user_list.html", {"queryset": queryset})(双引号、花括号、冒号)"""
<th>{{ obj.id }}</th>
<td>{{ obj.name }}</td>
<td>{{ obj.password }}</td>
<td>{{ obj.age }}</td>
<td>{{ obj.account }}</td>
<td>{{ obj.creat_time|date:"Y-m-d" }}</td>#日期的读取
<td>{{ obj.get_gender_display }}</td>#性别
<td>{{ obj.depart.title }}</td> #关联其他表的读取
在没有利用Django组件:ModelForm组件下
添加用户
def user_add(request):if request.method == "GET":context = {'gender_choices': models.UserInfo.gender_choices,'depart_list': models.Department.objects.all()}return render(request, "user_add.html", context)name = request.POST.get("name")password = request.POST.get("password")age = request.POST.get("age")account = request.POST.get("account")# from django.utils import timezone# creat_time = timezone.now()creat_time = request.POST.get("creat_time")gender = request.POST.get("gender")depart_id = request.POST.get("depart_id")models.UserInfo.objects.create(name=name, password=password, age=age,account=account, creat_time=creat_time,gender=gender, depart_id=depart_id)return redirect("/user/list/")
利用Django组件:ModelForm组件
在views.py文件下
class UserModelForm(forms.ModelForm):# name = forms.CharField(min_length=3, label="用户名")class Meta:model = models.UserInfofields = ["name", "password", "age", "account", "creat_time", "gender", "depart"]# widgets = {# "name":forms.TextInput(attrs={"class":"col-sm-2 control-label"})# }def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件,添加了"class":"form-control"得样式for name, field in self.fields.items():print(name, field)field.widget.attrs = {"class": "form-control", "placeholder": field.label}
添加用户
GET下:form = UserModelForm()
POST下:form = UserModelForm(data=request.POST)
from django import forms
def use_model_form_add(request):"""添加用户"""if request.method == "GET":form = UserModelForm()return render(request, 'user_model_form_add.html', {"form": form})# 用户提交的数据进行校验,如果合法再保存到数据库form = UserModelForm(data=request.POST)if form.is_valid():# print(form.cleaned_data)form.save()return render(request, 'user_model_form_add.html', {"form": form})
html文件中:
< span style=“color: red”>{{ field.errors.0 }}</ span >为提示错误信息
将英文提示改为中文提示信息时需要将settings.py文件中改为
LANGUAGE_CODE = ‘zh-hans’
#settings.py
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
#html
<div class="col-sm-offset-2 col-sm-10"><label>{{ field.label }}</label>{{ field }}<span style="color: red">{{ field.errors.0 }}</span>
{# <input type="text" class="form-control" placeholder="年龄" name="age"/>#}
</div>
"编辑用户
GET下:form = UserModelForm(instance=row_object)
POST下:form = UserModelForm(data=request.POST, instance=row_object)
#views.py
from django import forms
def user_edit(request, nid):"""编辑用户"""# 根据id去数据库获取要编辑的那一行数据row_object = models.UserInfo.objects.filter(id=nid).first()if request.method == "GET":# instance=row_object表示将数据库中获取的那行的每一个值都显示在页面上form = UserModelForm(instance=row_object)return render(request, 'use_edit.html', {"form": form})form = UserModelForm(data=request.POST, instance=row_object)if form.is_valid():form.save()return redirect('/user/list')return render(request, 'user_edit.html', {"form": form})
删除用户
def user_delete(request, nid):"""删除用户"""models.UserInfo.objects.filter(id=nid).delete()return redirect('/user/list/')
四、modelform实例:靓号操作
#urls.py
#<int:nid>表明要传递nid这个值到views.py文件中
path('pretty/list/', views.pretty_list),path('pretty/add/', views.pretty_add),path('pretty/<int:nid>/edit/', views.pretty_edit),path('pretty/<int:nid>/delete/', views.pretty_delete),
首先在models.py文件下定义PrettyNum这个类,同时用djando命令生成数据库表(python manage.py makemigrations;python manage.py migrate)数据库下才有app01_prettynum这个数据表
#models.py
class PrettyNum(models.Model):"""靓号表"""mobile = models.CharField(verbose_name="电话", max_length=11)price = models.IntegerField(verbose_name="单价",default=0)level_choices = ((1, "1级"),(2, "2级"),(3, "3级"),(4, "4级"),)level = models.SmallIntegerField(verbose_name="级别", choices=level_choices,default=1)status_choices = ((1, "已占用"),(2, "未占用"),)status = models.SmallIntegerField(verbose_name="状态", choices= status_choices,default=2)
添加靓号
#ModelForm类
from django import forms
from django.core.validators import RegexValidatorclass PrettyModelForm(forms.ModelForm):# 验证:方法1mobile = forms.CharField(label="手机号",# validators=[RegexValidator(r'^159[0-9]+$','数字必须以159开头')],validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')],)class Meta:model = models.PrettyNum# fields = ['mobiles','price','level','status'] 一一列举# exclude = ['level'] 排除fields = "__all__"def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件,添加了"class":"form-control"得样式for name, field in self.fields.items():print(name, field)field.widget.attrs = {"class": "form-control", "placeholder": field.label}# # # 验证:方法2(钩子方法,对用户数据进行验证)
# def clean_mobile(self):
# txt_mobile = self.cleaned_data["mobile"]
# if len(txt_mobile) !=11:
# raise ValidationError("手机号格式错误")
# return txt_mobile
#views.py
def pretty_add(request):if request.method == 'GET':form = PrettyModelForm()return render(request, 'pretty_add.html', {"form": form})row_object = models.PrettyNum.objects.create()form = PrettyModelForm(data=request.POST, instance=row_object)if form.is_valid():form.save()return redirect('/pretty/list')return render(request, 'pretty_add.html', {"form": form})
编辑靓号
views.py文件下重新定义PrettyEditModelForm
其中mobile = forms.CharField(disabled=True,label=“手机号”)表示在编辑时“手机号”显示但不可更改
#ModelForm类
from django import formsclass PrettyEditModelForm(forms.ModelForm):mobile = forms.CharField(disabled=True,label="手机号")class Meta:model = models.PrettyNum# fields = ['mobiles','price','level','status'] 一一列举# exclude = ['level'] 排除fields = "__all__"def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件,添加了"class":"form-control"得样式for name, field in self.fields.items():print(name, field)field.widget.attrs = {"class": "form-control", "placeholder": field.label}
"""确保编辑的手机号在原数据中没有重复。编辑对象的id:self.instance.pk"""def clean_mobile(self):#print(self.instance.pk)txt_mobile = self.cleaned_data["mobile"]exists=models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()if exists:raise ValidationError("手机号已存在")#if len(txt_mobile) !=11:#raise ValidationError("手机号格式错误")return txt_mobile
#views.py
def pretty_edit(request, nid):row_object = models.PrettyNum.objects.filter(id=nid).first()if request.method == 'GET':form = PrettyEditModelForm(instance=row_object)return render(request, 'pretty_edit.html', {"form": form})form = PrettyEditModelForm(data=request.POST, instance=row_object)if form.is_valid():form.save()return redirect('/pretty/list')return render(request, 'pretty_edit.html', {"form": form})
删除靓号
def pretty_delete(request, nid):models.PrettyNum.objects.filter(id=nid).delete()return redirect('/pretty/list/')
搜索靓号
get方式传参?q=
pretty_list.html页面添加一个搜索框:name=“q”,submit提交
<div class="col-lg-3 clearfix" style="float: right;display: block"><form method="get"><div class="input-group"><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></button></span><input type="text" name='q' class="form-control" placeholder="Search for..."value="{{ search_data }}"></div><!-- /input-group --></form>
在靓号列表views.py中添加
data_dict = {}
search_data = request.GET.get(‘q’, “”)
if search_data:
data_dict[“mobile__contains”] = search_data
queryset = models.PrettyNum.objects.filter(**data_dict).order_by(“-level”)
靓号列表
def pretty_list(request):data_dict = {}search_data = request.GET.get('q', "")if search_data:data_dict["mobile__contains"] = search_dataqueryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")page_object = Pagination(request, queryset) # 分页context = {"queryset": page_object.page_queryset,"search_data": search_data, # 分完页的数据"page_string": page_object.html() # 页码}return render(request, 'pretty_list.html', context)
models.PrettyNum.objects.filter(mobile="1612313223",id=7)
data_lict ={"mobile":"168324145","id":7}
models.PrettyNum.objects.filter(**data_lict)models.PrettyNum.objects.filter(mobile__contains=”1999”)
#对于数字类型:
#filter(id=12) #等于12
#filter(id__gt=12) #大于12
#filter(id__gte=12) #大于等于12
#filter(id__lt=12) #小于12
#filter(id__lte=12) #小于等于12
#filter(id=12)
#对于字符串类型:
#filter(mobile=”1999”)
#filter(mobile__startswith=”1999”) #筛选1999开头
#filter(mobile__endswith=”1999”)
#filter(mobile__contains=”1999”)
五、自定义分页组件
4.分页组件的创建
在appo01目录下创建utils目录,并创建pagination.py文件
"""
自定义分页组件
"""
from django.utils.safestring import mark_safe
class Pagination(object):def __init__(self,request,queryset,page_size=10,page_param="page",plus=5):""":param request: 请求对象:param queryset: 符合条件的数据:param page_size: 每页显示多少条数据:param page_param: 在URL中传递的获取分页的参数 例如/pretty/list/?page=4:param plus:显示当前页的前或后几页(页码)"""import copyquery_dict = copy.deepcopy(request.GET)query_dict._mutable = Trueself.query_dict = query_dictpage = request.GET.get(page_param, "1")if page.isdecimal():page=int(page)else:page=1self.page =pageself.page_size=page_sizeself.page_param=page_paramself.start = (page - 1) * page_sizeself.end = page * page_sizeself.page_queryset = queryset[self.start:self.end]total_count = queryset.count()total_page_count, div = divmod(total_count, page_size)if div:total_page_count += 1self.total_page_count =total_page_countself.plus=plusdef html(self):# 计算出显示当前页的的前五页后五页# 数据较少,显示全部页码if self.total_page_count <= 2 * self.plus + 1:start_page = 1end_page = self.total_page_countelse:# 数据较多# 当前页<5if self.page <= self.plus:start_page = 1end_page = 2 * self.plus + 1else:# 当前页>5# 当前页+5>总页面if (self.page + self.plus) > self.total_page_count:start_page = self.total_page_count - 2 * self.plusend_page = self.total_page_countelse:start_page = self.page - self.plusend_page = self.page + self.plus# 页码page_str_list = []self.query_dict.setlist(self.page_param,[1])first = '<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode())page_str_list.append(first)# 上一页if self.page > 1:self.query_dict.setlist(self.page_param,[self.page-1])prev = '<li><a href="?{}">《</a></li>'.format(self.query_dict.urlencode())else:prev = '<li><a href="?{}">《</a></li>'.format(1)page_str_list.append(prev)for i in range(start_page, end_page + 1):self.query_dict.setlist(self.page_param,[i])if i == self.page:ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)else:ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)page_str_list.append(ele)if self.page >= self.total_page_count:self.query_dict.setlist(self.page_param,[self.page+1])next = '<li><a href="?{}">》</a></li>'.format(self.query_dict.urlencode())else:self.query_dict.setlist(self.page_param,[self.total_page_count])next = '<li><a href="?{}">》</a></li>'.format(self.query_dict.urlencode())page_str_list.append(next)# 尾页self.query_dict.setlist(self.page_param,[self.total_page_count])end = '<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode())page_str_list.append(end)search_string = """ <li ><form method="get" style="float: left"><input type="text" class="form-control" name="page" placeholder="页码" style="width: 80px;position: relative;float: left;display: inline-block;border-radius: 0"><button type="submit" class="btn btn-default">跳转</button></form></li>"""page_str_list.append(search_string)page_string = mark_safe("".join(page_str_list))return page_string
注意:
"""如果以后想要使用这个分页组件,你需要做如下几件事:在视图函数views.py函数中:
def pretty_list(request):#1.根据所需筛选数据queryset = models.PrettyNum.objects.all()
#2.实例化分页对象page_object = Pagination(request,queryset,page_size=2)context ={"queryset": page_object.page_queryset, #分完页的数据"page_string": page_object.html() #生成页码}return render(request, 'pretty_list.html',context)在html页面中<ul class="pagination">{{ page_string }}</ul>
"""
靓号列表(pretty_list)
views.py文件如上,需要提前导入:
from app01.utils.pagination import Pagination
pretty_list.html文件
{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default" ><!-- Default panel contents --><div class="panel-heading" ><a class="btn btn-success btn-xs " href="/pretty/add/"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>添加靓号</a><div class="col-lg-3" style="float: right;display: block;padding-bottom: 5px"><form method="get"><div class="input-group"><span class="input-group-btn"><button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span></button></span><input type="text"name='q' class="form-control" placeholder="Search for..."value="{{ search_data }}"></div><!-- /input-group --></form></div></div><!-- Table --><table class="table"><thead><tr><th>id</th><th>电话号</th><th>单价</th><th>级别</th><th>状态</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr><th scope="row">{{ obj.id }}</th><td>{{ obj.mobile }}</td><td>{{ obj.price }}</td><td>{{ obj.get_level_display }}</td><td>{{ obj.get_status_display }}</td><td><a href="/pretty/{{ obj.id }}/edit/" class="btn btn-primary btn-xs ">编辑</a><a href="/pretty/{{ obj.id }}/delete/" class="btn btn-danger btn-xs ">删除</a></td></tr>{% endfor %}</tbody></table></div><div><nav><ul class="pagination">{{ page_string }}</ul></nav></div></div><!-- /.container -->{% endblock %}
六、datepick时间插件的使用
在layout.html模板文件中引入datepick的js、css
<script src="https://cdn.jsdelivr.net/npm/bootstrap-datepicker@1.10.0/dist/js/bootstrap-datepicker.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-datepicker@1.10.0/dist/js/bootstrap-datepicker.min.js"></script>
1.直接在字段中添加 id=“dt”
<script>$(function (){$('#dt').datepicker({format:"yyyy-mm-dd",startDate:'0',language:"zh-CN.js:6",autoclose:true});})
</script>
2.基于ModelForm
#id_字段名:id_creat_time
<script>$(function (){$('#id_creat_time').datepicker({format:"yyyy-mm-dd",startDate:'0',language:"zh-CN.js:6",autoclose:true});})</script>
七、自定义有Bootstrap样式的ModelForm
在appo01目录下创建utils目录,并创建bootstrap.py文件
from django import formsclass BootstrapModelForm(forms.ModelForm):bootstrap_exclude_fields = ['img']def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件,添加了"class":"form-control"得样式for name, field in self.fields.items():if name in self.bootstrap_exclude_fields:continue# 字段中有属性,保留原来的属性,没有属性,才增加if field.widget.attrs:# 有则添加字典值field.widget.attrs["class"] = "form-control"field.widget.attrs["placeholder"] = field.labelelse:field.widget.attrs = {"class": "form-control","placeholder": field.label}
继承BootstrapModelForm,并定义class Meta
class UserEditModelForm(BootstrapModelForm):class Meta:model = models.UserInfofields = ["name", "password", "age"]
注意:需要提前引用
from app01.utils.bootstrap import BootstrapModelForm
相关文章:
【web开发】7、Django(2)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、部门列表二、部门管理(增删改)三、用户管理过渡到modelform组件四、modelform实例:靓号操作五、自定义分页组件六、datepick…...
Prometheus+Grafana可视化监控【Nginx状态】
文章目录 一、安装Docker二、安装Nginx(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装nginx_exporter七、Grafana添加Nginx监控模板 一、安装Docker 注意:我这里使用之前写好脚本进行安装Docker,如果已经有D…...
R 语言的安装教程
一、下载相关软件 1、R 下载 官网:R: The R Project for Statistical Computing 找到中国镜像,下载快 历史版本点击这里 2、Rtools 下载 进入镜像后,点击这里 然后选择与上面下载的R版本相对应的版本即可 3、Rstudio 下载 官网࿱…...
uniapp-提现功能(demo)
页面布局 提现页面 有一个输入框 一个提现按钮 一段提现全部的文字 首先用v-model 和data内的数据双向绑定 输入框逻辑分析 输入框的逻辑 为了符合日常输出 所以要对输入框加一些条件限制 因为是提现 所以对输入的字符做筛选,只允许出现小数点和数字 这里用正则实现的小数点…...
Spring 篇
1、什么是 Spring? Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置…...
three.js简单3D图形的使用
npm init vitelatest //创建一个vite的脚手架 选择 Vanilla 之后自己处理一下 在main.js中写入 // 导入three.js import * as THREE from three// 创建场景 const scene new THREE.Scene();// 创建相机 const camera new THREE.PerspectiveCamera(45, //视角window.inner…...
spark withColumn的使用(笔记)
目录 前言: spark withColumn的语法及使用: 准备源数据演示: 完整实例代码: 前言: withColumn():是Apache Spark中用于DataFrame操作的函数之一,它的作用是在DataFrame中添加或替换列ÿ…...
PTA:7-1 线性表的合并
线性表的合并 题目输入样例输出样例 代码解析 题目 输入样例 4 7 5 3 11 3 2 6 3输出样例 7 5 3 11 2 6 代码 #include<iostream> #include<vector> using namespace std;bool checkrep(const vector<int>& arr, int x) {for (int element : arr) {i…...
Spring 的创建和日志框架的整合
目录 一、第一个 Spring 项目 1、配置环境 2、Spring 的 jar 包 Maven 项目导入 jar 包和设置国内源的方法: 3、Spring 的配置文件 4、Spring 的核心 API ApplicationContext 4、程序开发 5、细节分析 (1)名词解释 (2&…...
11-集合和学生管理系统
1.ArrayList 集合和数组的优势对比: 长度可变添加数据的时候不需要考虑索引,默认将数据添加到末尾 1.1 ArrayList类概述 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 长度可以变化…...
C语言进阶指针(3) ——qsort的实现
大家好,我们今天来学习回调函数qsort的实现。 首先让我们打开cplusplus.com找到qsort函数。 我们看到这个函数就可以看到它的头文件和参数信息。 #include<stdlib.h> void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const voi…...
Rust源码分析——Rc 和 Weak 源码详解
Rc 和 Weak 源码详解 一个值需要被多个所有者拥有 rust中所有权机制在图这种数据结构中,一个节点可能被多个其它节点所指向。那么如何表示图这种数据结构?在多线程中,多个线程可能会持有同一个数据?如何解决这个问题。 Rc rus…...
【网络编程】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)
TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 6.捎带应答、延时应答 1.连接管理机制 正常情况下&…...
社区团购商城小程序v18.1开源独立版+前端
新增后台清理缓存功能 修复定位权限 修复无法删除手机端管理员 11月新登录接口修复! 修复商家付款到零钱, 修复会员登陆不显示头像, 修复无法修改会员开添加绑定...
MATLAB入门-字符串操作
MATLAB入门-字符串操作 注:本篇文章是学习笔记,课程链接是:link MATLAB中的字符串特性: 无论是字符还是字符串,都要使用单引号来‘’表示;在MATLAB中,字符都是在矩阵中存储的,无论…...
Kong Learning
一、Kong Kong是由Mashape公司开源的可扩展的Api GateWay项目。它运行在调用Api之前,以插件的扩展方式为Api提供了管理。比如,鉴权、限流、监控、健康检查等,Kong是基于lua语言、nginx以及openResty开发的,所有拥有动态路由、负载…...
Python怎样写桌面程序
要编写Python桌面应用程序,可以使用以下几种方法: 1.使用Tkinter模块:Tkinter是Python自带的GUI工具包之一,可以使用它来创建基本的GUI界面。例如,可以创建一个简单的窗口,添加按钮、文本框等控件…...
蓝桥杯2023年第十四届省赛真题-平方差--题解
蓝桥杯2023年第十四届省赛真题-平方差 时间限制: 3s 内存限制: 320MB 提交: 2379 解决: 469 题目描述 给定 L, R,问 L ≤ x ≤ R 中有多少个数 x 满足存在整数 y,z 使得 x y2 − z2。 输入格式 输入一行包含两个整数 L, R,用一个空格分隔。 输出格…...
iText实战--根据绝对位置添加内容
3.1 direct content 概念简介 pdf内容的4个层级 层级1:在text和graphics底下,PdfWriter.getDirectContentUnder() 层级2:graphics层,Chunk, Images背景,PdfPCell的边界等 层级3:text层,Chun…...
使用navicat for mongodb连接mongodb
使用navicat for mongodb连接mongodb 安装navicat for mongodb连接mongodb 安装navicat for mongodb 上文mongodb7.0安装全过程详解我们说过,在安装的时候并没有勾选install mongodb compass 我们使用navicat去进行可视化的数据库管理 navicat for mongodb下载地址…...
Qt ffmpeg音视频转换工具
Qt ffmpeg音视频转换工具,QProcess方式调用ffmpeg,对音视频文件进行格式转换,支持常见的音视频格式,主要在于QProcess的输出处理以及转换的文件名和后缀的处理,可以进一步加上音视频剪切合并和音视频文件属性查询修改的…...
机器学习笔记 - 视频分析和人类活动识别技术路线简述
一、理解人类活动识别 首先了解什么是人类活动识别,简而言之,是对某人正在执行的活动/动作进行分类或预测的任务称为活动识别。 我们可能会有一个问题:这与普通的分类任务有什么不同?这里的问题是,在人类活动识别中,您实际上需要一系列数据点来预测正确执行的动作。 看看…...
Redis从入门到精通(三:常用指令)
前边我们介绍了redis存储的四种基本数据类型,并纵向介绍了这四种数据类型的各种指令操作,现在我们这个章节从横向来总结一下关于key的常用指令和数据库常用指令 key常用指令 删除指定key del key 获取key是否存在 exists key 获取key的类型 type …...
代码随想录day39 || 动态规划 || 不同路径
62.不同路径 ● 力扣题目链接 ● 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 ● 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 ● 问总共有…...
电商平台API接口采集电商平台淘宝天猫京东拼多多数据获取产品详情信息,销量,价格,sku案例
淘宝SKU详情接口是指,获取指定商品的SKU(Stock Keeping Unit,即库存量单位)的详细信息。SKU是指提供不同的商品参数组合的一个机制,通过不同的SKU来标识商品的不同组合形式,如颜色、尺寸等。SKU详情接口可以…...
The ‘<‘ operator is reserved for future use. 错误解决
The < operator is reserved for future use. 错误解决 在 PowerShell 终端执行 python learnstock.py < ldata.txt 发生错误, The < operator is reserved for future use.解决方法, cmd /c python learnstock.py < ldata.txt完结&#x…...
vulnhub靶机Thoth-Tech
下载地址:https://download.vulnhub.com/thothtech/Thoth-Tech.ova 主机发现 arp-scan -l 目标:192.168.21.148 端口扫描 nmap --min-rate 10000 -p- 192.168.21.148 服务扫描 nmap -sV -sT -O -p21,22,80 192.168.21.148 漏洞扫描 nmap --scriptvu…...
不可思议,无密码登录所有网站!
hello,我是小索奇 居然可以免密码登录你的网站?听起来是不是很恐怖 确实如此,Cookie可以用于保持用户在网站上的登录状态,从而实现 免密码登录,学会了不要做坏事哈 这里仅做免密码登录的实操,就不介绍Cooki…...
深度学习编译器关键组件
1 高层中间代码 为了克服传统编译器中采用的IR限制DL模型中复杂计算的表达的局限性,现有的DL编译器利用高层IR(称为图IR)进行高效的代码优化设计。 1.1 图表示 基于DAG的IR:基于DAG的IR是编译器构建计算图的最传统方法之一&…...
【C++】string类模拟实现下篇(附完整源码)
目录 1. resize2. 流插入<<和流提取>>重载2.1 流插入<<重载2.2 流提取 << 3. 常见关系运算符重载4. 赋值重载4.1浅拷贝的默认赋值重载4.2 深拷贝赋值重载实现4.3 赋值重载现代写法 5. 写时拷贝(了解)6.源码6.1 string.h6.2 test.cpp 1. res…...
wordpress pin/51外链代发网
https://www.anquanke.com/post/id/104401 http://blog.nsfocus.net/cve-2018-1273/ http://www.freebuf.com/news/7080.html http://bbs.qcloud.com/thread-49690-1-1.html http://www.cnvd.org.cn/webinfo/show/4247...
沈阳学习做网站/女生学网络营销这个专业好吗
編按:1979年, 《哈佛商業評論》 刊出〈競爭作用 力如何形塑策略〉 (How Competitive Forces Shape Strategy ),這篇文章的作者是當時擔任副教授的年輕經 濟學家麥可.波特 (Michael E. Porter &a…...
ecshop二次开发网站开发心得/百度指数在线查询前100
物业软件对管理的作用分析1、减少人工,节省成本使用软件后六岗合一:财务人员计费人员档案管理人员收费人员制表统计人员录入员只需一个收费员假设只节省一个人,一年节省:1000元/月*12个月12000元/年;若5个小区…...
可信网站认证收费吗/怎么快速推广app
hdu2098很水的题,但是自己用的是筛子法,但是自己想到惠超市了饿,还执意放到上面ac思路很简单,简单来说就是从1到n-1然后到n-1/2到n-1/2,因此正好一半,因此/2,然后验证是否为素数就行了,因此,验证…...
wordpress分类目录优化/注册一个公司网站需要多少钱
嵌套函数:什么是嵌套函数 使用外部函数中变量 def out():x 5def inn():print("inn函数中 x {}".format(y))print("out函数中 x {}".format(x))inn()out()结果: inn函数中 x 5 out函数中 x 5 内部函数是可以引用外部函数的变量…...
公司网站设计很好的/网络营销工具包括
浑浑噩噩已经走了这么长时间了,那么,留下点什么吧。 一种积累,一种出口。 转载于:https://www.cnblogs.com/Peong/p/10438157.html...