【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

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

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

相关文章

Pytest接口自动化测试实战演练

结合单元测试框架pytest数据驱动模型allure 目录 api&#xff1a; 存储测试接口 conftest.py :设置前置操作 目前前置操作&#xff1a;1、获取token并传入headers&#xff0c;2、获取命令行参数给到环境变量,指定运行环境 commmon&#xff1a;存储封装的公共方法 connect_mysq…

集成Activiti-Modeler流程设计器

集成Activiti-Modeler流程设计器 Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件&#xff0c;可以方便流程设计与开发人员绘制流程图&#xff0c;保存流程模型&#xff0c;部署至流程定义等等。 1、材料准备 首先我们需要获取activiti-explorer.zip&…

zabbix监控平台部署(二)

目录 一、自定义监控 二、Nginx监控 三、监控mysql 四、钉钉告警 五、163邮箱报警 总结 zabbix5.0 一、自定义监控 zabbix-agent&#xff08;147&#xff09; agent端操作 vim /etc/zabbix/zabbix_agentd.conf 在配置未文件末尾添加 UserParametermemory_userd,free…

vue修改node_modules打补丁步骤和注意事项

当我们使用 npm 上的第三方依赖包&#xff0c;如果发现 bug 时&#xff0c;怎么办呢&#xff1f; 想想我们在使用第三方依赖包时如果遇到了bug&#xff0c;通常解决的方式都是绕过这个问题&#xff0c;使用其他方式解决&#xff0c;较为麻烦。或者给作者提个issue&#xff0c;然…

【Java 基础篇】Java后台线程和守护线程详解

在Java多线程编程中&#xff0c;有两种特殊类型的线程&#xff1a;后台线程&#xff08;Daemon Thread&#xff09;和守护线程&#xff08;Daemon Thread&#xff09;。这两种线程在一些特定的场景下非常有用&#xff0c;但也需要谨慎使用。本文将详细介绍后台线程和守护线程的…

(JavaEE)(多线程案例)线程池 (简单介绍了工厂模式)(含经典面试题ThreadPoolExector构造方法)

线程诞生的意义&#xff0c;是因为进程的创建/销毁&#xff0c;太重了&#xff08;比较慢&#xff09;&#xff0c;虽然和进程比&#xff0c;线程更快了&#xff0c;但是如果进一步提高线程创建销毁的频率&#xff0c;线程的开销就不能忽视了。 这时候我们就要找一些其他的办法…

Ansible之Playbook的任务控制

一&#xff09;Ansible 任务控制基本介绍 这⾥主要来介绍PlayBook中的任务控制。 任务控制类似于编程语⾔中的if … 、for … 等逻辑控制语句。 这⾥我们给出⼀个实际场景应⽤案例去说明在PlayBook中&#xff0c;任务控制如何应⽤。 在下⾯的PlayBook中&#xff0c;我们创建了…

pnpm入门教程

一、概述 1、更小 使用 npm 时&#xff0c;依赖每次被不同的项目使用&#xff0c;都会重复安装一次。 而在使用 pnpm 时&#xff0c;依赖会被存储在内容可寻址的存储中。 2、更快 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。目录结构计算。 node_modules 目录结构是…

什么是GPT磁盘?介绍GPT(GUID 分区表)磁盘及其优势!

GPT概述 GPT磁盘是什么意思&#xff1f;GPT是全局唯一标识符分区表&#xff08;GUID Partition Table&#xff09;的简称&#xff0c;它是硬盘分区表结构的一个标准模式。在我们深入了解GPT磁盘的特性之前须知&#xff0c;MBR磁盘的分区信息直接保存在主引导记录&#xff0…

【探索C语言中VS调试技巧】:提高效率和准确性

文章目录 前言1. 什么是bug&#xff1f;2. 调试是什么&#xff1f;有多重要&#xff1f;2.1 调试是什么&#xff1f;2.2 调试的基本步骤2.3 Debug和Release的介绍 3. Windows环境调试介绍3.1 调试环境的准备3.2 学会快捷键3.3 调试的时候查看程序当前信息3.3.1 查看临时变量的值…

【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…

Android 富文本SpannableString

一、认识SpannableString 为什么要使用富文本 在Android开发中&#xff0c;有很多UI会画出一些特别炫酷的界面出来&#xff0c;比如一个字符串里有特殊的字会有其他颜色并加粗、变大变小、插入小图片、给某几个文字添加边框&#xff0c;如果我们使用笨办法用几个TextView或者Im…

单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元

目录 1&#xff0c;开发板原理图 2&#xff0c;浮点运算单元&#xff08;FPU&#xff09; 1&#xff0c;开发板原理图 课程视频比较早&#xff0c;介绍了三款开发板。观看视频时用的开发板说和51单片机共板的STM32核心板&#xff0c;将51单片机从底座拆下来后&#xff0c;安…

avi怎么转换成视频?

avi怎么转换成视频&#xff1f;在我们日常使用的视频格式中&#xff0c;AVI是一种常见且经常被使用的音频视频交叉格式之一。它的优点之一是占用的存储空间相对较小&#xff0c;但也明显存在着画质损失的缺点。虽然AVI格式的视频在某种程度上也很常见&#xff0c;但与最常见的M…

zabbix的原理与安装

一、Zabbix介绍 1、zabbix 是什么&#xff1f; zabbix是一个开源的IT基础监控软件&#xff0c;能实时监控网络服务&#xff0c;服务器和网络设备的状态&#xff0c;如网络使用&#xff0c;CPU负载、磁盘空间等&#xff0c;主要是包括数据的收集、报警和通知的可视化界面zabbi…

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST SCSI设备的模拟是由QEMU和HOST共同实现的&#xff0c;QEMU模拟VHOST SCSI设备配置空间等&#xff0c;而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。 在QEMU中VHOST SCSI设备继承关系如下&#xff1a; 其它设备以及对应class_init函数和realize具现化实现与V…

LLM微调(一)| 单GPU使用QLoRA微调Llama 2.0实战

最近LLaMA 2在LLaMA1 的基础上做了很多优化&#xff0c;比如上下文从2048扩展到4096&#xff0c;使用了Grouped-Query Attention&#xff08;GQA&#xff09;共享多头注意力的key 和value矩阵&#xff0c;具体可以参考&#xff1a; 关于LLaMA 2 的细节&#xff0c;可以参考如下…

zotero通过DOI快速导入文献

之前我经常采用两种方式导入文献&#xff1a; &#xff08;1&#xff09;下载PDF&#xff0c;然后拖入zotero 这种方法比较费时间&#xff0c;有些文献无法下载pdf &#xff08;2&#xff09;通过google scholar检索文献&#xff0c;然后点击引用——EndNote&#xff0c;chorme…

Kotlin中函数的基本用法以及函数类型

函数的基本用法 1、函数的基本格式 2、函数的缺省值 可以为函数设置指定的初始值&#xff0c;而不必要传入值 private fun fix(name: String,age: Int 2){println(name age) }fun main(args: Array<String>) {fix("张三") }输出结果为&#xff1a;张三2 …

WebGL层次模型——多节点模型

目录 多节点模型 MultiJointModel中的层次结构 控制各部件旋转角度的变量 示例程序——共用顶点数据&#xff0c;通过模型矩阵缩放实现&#xff08;MultiJointModel.js&#xff09; MultiJointModel.js&#xff08;按键响应部分&#xff09; MultiJointModel.js&#x…