全面掌握Django的web框架Django Rest_Framework(一)
文章目录
- Django Rest_Framework
- 1. DRF介绍
- 2.DRF特点
- 3.环境安装与配置
- (1)DRF需要以下依赖
- (2)创建django项目
- 4.序列化器的使用
- (1)创建序列化器
- 5. 反序列化器使用
Django Rest_Framework
1. DRF介绍
Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用,简称DRF。
在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,把queryset类型数据自动转化为json等可以传到前端的数据类型
不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。
REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。
REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
提供了我们写接口便利的方法,把响应的内容,响应的格式,响应状态码都封装好了
不用自己再做这些了,但是能DRF能做的还是有限的,对于复杂的接口还是需要自己来做这些事
restful不是必须的,但是为了后续开发,交接规范,大家约定俗成的使用restful规范
2.DRF特点
- 提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
- 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
- 丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
- 多种身份认证和权限认证方式的支持;[jwt]
- 内置了限流系统;
- 直观的 API web 界面;
- 可扩展性,插件丰富
django restframework(简称drf)本质上其实就是一个别人编写好的app,里面集成了很多编写restful API的功能功能。
其目录中有很多我们以前写django程序见到过的,因为它就是一个别人写好了的app,我们拿来用。
因此 每次新建项目时要记得在settings中注册app。
同时在settings中也要加上如下字典,以后drf相关的全局配置都会在该字典中添加。
3.环境安装与配置
(1)DRF需要以下依赖
- Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6, 3.11)
- Django (1.10, 1.11, 2.0, 4.2.1)
DRF是以Django扩展应用的方式提供的,所以我们可以直接利用已有的Django环境而无需从新创建。(若没有Django环境,需要先创建环境安装Django)
安装DRF,这是linux安装
前提是已经安装了django,建议安装在虚拟环境
#mkvirtualenv drfdemo -p python3
#pip install django
pip install djangorestframework
Windows就在本地环境中安装
(2)创建django项目
添加rest_framework应用,pycharm创建的项目,默认会把第一个创建的应用添加进去
在settings.py的INSTALLED_APPS中添加’rest_framework’。
需要手动将rest_framework 添加到INSTALLED_APPS 中,这个一定要手动添加,不然用不了drf功能
接下来就可以使用DRF提供的功能进行api接口开发了。在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:
- 将请求的数据(如JSON格式)转换为模型类对象
- 操作数据库
- 将模型类对象转换为响应的数据(如JSON格式)
创建模型操作类
class Student(models.Model):# 模型字段name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空')sex = models.BooleanField(default=1,verbose_name="性别")age = models.IntegerField(verbose_name="年龄")class_null = models.CharField(max_length=5,verbose_name="班级编号")description = models.TextField(max_length=1000,verbose_name="个性签名")#通过django migrate默认创建的表名是 应用名_类名小写,如果不想用默认的,可以自己配置表的元信息#通过class Meta类来配置class Meta:#配置表名db_table="tb_student"#这里是为了配置Django的后台管理系统admin里面的表名verbose_name = "学生"#这里是为了配置让表名不以复数形式显示,默认是以复数形式显示verbose_name_plural = verbose_name
我们看urls.py有个admin路径
当我们运行项目时,Django默认带个后台管理系统,需要先执行数据库同步指令
运行项目,登录后台管理系统
需要用户名,密码,初次登录需要我们创建超级管理员用户
控制台 python manager.py createsuperuser
按照提示输入,邮箱可以不用输入
输入用户名,密码登录
这里面有两张系统自带的表,生产中一般不用admin,由于admin功能太过简单,不符合生产要求
如果想用一个不错的后台管理系统,可以用xadmin
admin和xadmin是用来对数据库中的表进行管理的,项目中可能会写很多表。admin和xadmin就可以展示所有的表,以及表中数据
比如我们希望通过admin来管理模型类中的表
创建完,需要我们将models类里面的表注册到admin里面管理
在我们创建的应用下有个admin.py,专门用于admin后台管理系统的
注册模型类
#首先导包
from app01 import models
admin.site.register(models.Student)
重新运行项目,登录管理系统平台,可以看到我们app01应用下自己创建的表
class Meta:下面的verbose_name 就是配置在这里显示的表名
verbose_name_plural 是配置表名复数显示
比如我们注释后再看
表名 显示为我们创建的模型类 类名的复数形式
只配置verbose_name
表名默认以复数形式显示
配置好后,我们进入表中查看
我们可以直接通过这个后台管理系统管理我们的表,做增删改查
点击ADD学生,可以直接添加学生
页面字段显示中文,就是我们创建模型类时,每个字段指定了verbose_name 才能显示的
admin后台管理系统显示字段名称直接是通过verbose_name配置的名称来显示的
还有提示信息help_text 这些主要是给后台管理系统用的
整个admin后台管理系统是基于 form 和model-form开发的。数据检验用的
布尔值,在后台管理系统显示就是个单选框
添加表记录
点保存
默认展示的是模型类对象,怎么展示出表的字段名称呢,在admin.py中配置
现在看表中数据展示
想要修改字段,点击前面的id进入编辑界面
admin就是用来管理数据库表的
也可以查找
也可以直接在展示页面编辑,不能把id放进去
可以做批量修改
创建管理员以后,访问admin站点,先修改站点的语言配置,设置成显示中文 修改settings.py
LANGUAGE_CODE = ‘zh-hans’
重启服务,这样页面就是中文展示
这个admin功能不够全面,后面生产中我们使用xadmin,提供的功能更多
现在我们连接mysql数据库来进行drf操作
create database students;
在项目的__init__.py文件中配置pymysql使用mysql数据库,并兼容高版本mysql
此时,要把原先创建在sqlite3里面的数据迁移到mysql,由于初始化数据库同步语句已经生成了,数据库表没有变化,不要再执行makemigrations
只需要执行migrate
可能的报错处理
数据库中查看表
创建序列化器
创建个子应用 student
startapp student
记得将新创建的应用添加到INSTALLED_APPS里面
配置路由分发,在新创建的应用下创建urls.py文件
项目下的urls.py 将各个应用的url导入
在student应用目录中新建serializers.py用于保存该应用的序列化器。
创建一个StudentModelSerializer类用于序列化与反序列化。
#创建序列化器类,回头会在视图中被调用
#要继承rest_framework中的一个类ModelSerializer
from rest_framework.serializers import ModelSerializer
from app01 import models
class StudentModelSerializer(ModelSerializer):#配置元信息class Meta:model = models.Studentfields = "__all__"
model 指明该序列化器处理的数据字段从模型类Student参考生成
fields 指明该序列化器包含模型类中的哪些字段,'__all__'指明包含所有字段可以使用fields来明确字段,__all__表示包含所以字段,具体那些字段->fields = ('title','price')
由于之前admin管理后台创建的超级用户存在了sqlite3,现在数据库换成了mysql,需要重新创建一个,存在了django内置的auth-user表中
登录上去,添加些数据
视图类函数
from django.shortcuts import render# Create your views here.from app01 import modelsfrom django.http import JsonResponse
#引入我们创建的序列化器类
from student.serializers import StudentModelSerializer
def students(request):method = request.methodif method == 'GET':studentdata = models.Student.objects.filter()#序列化多条数据,需要加上many=True,返回序列化对象serializer_obj = StudentModelSerializer(instance=studentdata,many=True)#返回列表类型数据print(serializer_obj.data,type(serializer_obj.data))#JsonResponse返回非字典类型数据,需要加上safe=False,返回中文,需要加上, json_dumps_params={'ensure_ascii': False} 不然浏览器查看是Unicode码return JsonResponse(serializer_obj.data,safe=False, json_dumps_params={'ensure_ascii': False})
查看数据类型,每个字典由一个元祖包裹
浏览器访问,达到效果,前端拿到数据之后,方便循环来展示
DRF可以用一个方法实现5个接口,增删改查,我们视图使用CBV模式
视图类
from app01 import modelsfrom django.http import JsonResponse
#引入我们创建的序列化器类
from student.serializers import StudentModelSerializer#导入DRF的ModelViewSet类
from rest_framework.viewsets import ModelViewSet#定义的视图类要继承ModelViewSet类
class StudentView(ModelViewSet):#queryset 指明该视图集在查询数据时使用的查询集#serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器queryset = models.Student.objects.all()serializer_class = StudentModelSerializer
路由也由drf来注册生成
from student import views#Django2之后的path不支持正则,正则使用re_pathurlpatterns = [# path('students/', views.students),
]#使用rest_frame创建路由,首先导包
from rest_framework.routers import DefaultRouter
url_obj = DefaultRouter() # 可以处理视图的路由器,自动通过视图来生成增删改查的url路径
url_obj.register('students',views.StudentView) #students是生成的url前缀,名称随便写, 向路由器中注册视图集
urlpatterns += url_obj.urls # 将路由器中的所有路由信息追到到django的路由列表中
浏览器访问查看,这些路由都是drf的defaultrouter对象自动生成的
DefaultRouter生成的接口路径太死板,在公司中我们也基本不用它,都是自己手写的
我们查看下students返回的json,页面视图都是drf提供的
视图页面是由ModelViewSet这个视图类提供的
正常的APIView或者View 页面都是返回的json字符串
如果我们不想看页面,也可以只看json数据,在url添加?format=json
这些都是DRF提供的功能
不仅提供了查看数据,也可以直接添加数据,可以直接在页面添加数据
不仅可以以form表单形式提交,还可以以原生json格式提交
输入数据,点POST直接添加到数据库
也可以查询指定id的数据
在浏览器中输入网址127.0.0.1:8000/stu/students/3/,可以访问获取单一学生信息的接口(id为3的学生),呈现如下页面:
可以直接修改数据,然后点击put提交
点击put后,返回修改后的数据
点击delete,可以删除本条记录
删除成功返回状态码204
序列化器类中,可以使用fields来明确字段,__all__表示包含所以字段,具体那些字段->fields = (‘title’,‘price’)
也可以序列化指定字段数据
访问接口查看
4.序列化器的使用
在ser里面创建个新的模型类
添加几条数据
(1)创建序列化器
#先引入基础序列化器类
from rest_framework import serializers
from ser import models
"""name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空')sex = models.BooleanField(default=1,verbose_name="性别")age = models.IntegerField(verbose_name="年龄")class_null = models.CharField(max_length=5,verbose_name="班级编号")description = models.TextField(max_length=1000,verbose_name="个性签名")
"""#这个基础序列化类,能指定哪个字段序列化什么格式,可以指定序列化哪些数据,加工几条数据,返回几条数据
# 序列化哪些字段,就写与模型类中相同的名称
class StudentSerializer(serializers.Serializer):id = serializers.IntegerField()name = serializers.CharField()sex = serializers.BooleanField()age = serializers.IntegerField()class_null = serializers.CharField()description = serializers.CharField() #对于serializer中没有的数据类型,使用CharField。不写长度默认有多长序列化多长
这样的好处是,不想要哪个字段的数据,就不用序列化
视图类一样
from django.http import JsonResponse
from django.shortcuts import render# Create your views here.from django.views import View
from ser import models
from ser.serializers import StudentSerializerclass StudentView(View):def get(self,request):studentdata = models.Student.objects.filter()#序列化多条数据,需要加上many=True,返回序列化对象serializer_obj = StudentSerializer(instance=studentdata,many=True)#返回列表类型数据print(serializer_obj.data,type(serializer_obj.data))#JsonResponse返回非字典类型数据,需要加上safe=False,中文显示中文return JsonResponse(serializer_obj.data,safe=False, json_dumps_params={'ensure_ascii': False})
浏览器访问
上面我们序列化queryset类型数据,我们也可以序列化模型类对象
#序列化模型类对象对于单条数据,不用加many=truestudentdata = models.Student.objects.get(id=1)serializer_obj = StudentSerializer(instance=studentdata) #返回字典
返回的是字典
注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。
常用字段类型:
选项参数
这个是在序列化类里面,在序列化相关字段时,可以添加一些参数
通用参数,默认required 默认是True
5. 反序列化器使用
序列化器的使用分两个阶段:
- 在客户端请求时,使用序列化器可以完成对数据的反序列化。
- 在服务器响应时,使用序列化器可以完成对数据的序列化。
使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。
验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。
验证成功,可以通过序列化器对象的validated_data属性获取数据。
在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。
后台收到前端发过来的数据,在保存之前要对数据进行校验,符合要求再往里面存
不符合要求报错
#定义个新的序列化器2,id是主键自增,不需要前端传递,所以不需要反序列化
# 数据校验基于用到了序列化时的参数,具体限制多少,要根据数据库创建时的要求来定
class StudentSerializer2(serializers.Serializer):name = serializers.CharField(max_length=8)sex = serializers.BooleanField()age = serializers.IntegerField()class_null = serializers.CharField()description = serializers.CharField() #对于serializer中没有的数据类型,使用CharField。不写长度默认有多长序列化多长
反序列化器校验,基于用户提交的数据,再在视图函数写个post方法
#用户提交数据逻辑def post(self,request):#保存数据之前要对用户提交的数据进行校验,将用户提交的数据放到序列化器中serializer_obj = StudentSerializer2(data=request.POST)#对数据进行校验,所有数据校验成功返回True,但凡有一个校验失败,返回Falseif serializer_obj.is_valid():print('校验成功后的数据',serializer_obj.validated_data)return JsonResponse(serializer_obj.validated_data,safe=False, json_dumps_params={'ensure_ascii': False})else:#打印校验失败信息print(serializer_obj.errors)#校验失败,返回错误信息,并修改状态码return JsonResponse({'error':'校验失败'},status=400)
我们借助接口调试工具postman或国产的apipost来调试
我们使用国产的apipost,可以设置请求类型,携带的请求参数
可以原生row的json类型提交,也可以form表单的www-form-urlencoded,form-data
apipost功能还是太少,我们使用postman
向后台传输原生json类型
注意,json 键和值如果是字符串类型,必须用英文双引号
最后一对键值对后面不能有逗号
后台打印可知,没接收到数据,因为Django默认解析不了json类型数据
一般情况下,需要我们通过request.body将数据取出来,然后自己手动序列化解析
现在我们通过DRF来帮我们自动解析,简化工作量
视图类继承drf的apiview from rest_framework.views import APIView
继承了APIView之后,视图类定义的请求方法中的request 就被重新加工了一遍
APIView类还是继承的View,对View进行了拓展
对View里面的request进行了扩展
扩展后的request,再从前端拿数据,不用request.POST了 使用request.data
request.data就能获取到前端post请求提交过来的json数据
不管什么格式,都能解析出来
request.data 返回解析后的请求体数据。类似Django中标准的request.POST和request.FILES属性,但是能提供如下属性
包含了解析后的文件和非文件数据
包含了对POST,PUT,PATCH请求方式解析后的数据
利用了REST framework的parsers解析器,不仅支持表单类型数据(unlencoded/data),也支持JSON数据(application/json)
此时,重启服务器,postman发送post请求
后台已经获取到,获取到的就是字典类型数据
当name字段长度超过限制,则会报错
查看打印的错误信息,code指明哪个参数校验报的错
发送符合要求的字段,就不再报错
现在我们发送个正确的post请求
返回正常的json类型数据
请求正常,就保存数据
allow_blank,默认为False, 空字符串 如果想要实现不传数据,需要结合required =False
validators校验函数
a).可以在序列化器字段上使用validators函数指定自定义的校验规则
b).validators值必须为序列类型(类表),在列表中可以添加多个校验规则
c).DRF框架自带的UniqueValidator校验器,必须指定queryset参数指定查询集对象,用于对该字段的唯一性进行校验,UniqueValidator里面还可以使用message指定自定义报错信息
在序列化器需要反序列化输入校验的字段中,指定validators=[校验规则1,校验规则2...]参数,可以使用drf自带的校验规则UniqueValidator, 也可以使用自定义的的校验规则
error_messages 可以自定义报错信息 自定义错误信息用字典包裹,针对每个参数定义报错信息
发送post请求
这样,报错信息就是我们自定义的,实现了错误信息定制
不传name
上面序列化器,一个是用于序列化用的,一个是反序列化数据校验的,
序列化和反序列化 能不能合并成一个序列化器来使用呢?
可以的
针对个别字段,有的只用于序列化输出,有的只用于反序列化输入,可以用下面两个参数控制
read_only 表明该字段仅用于序列化输出,默认False 用户提交数据时,不校验该字段
write_only 表明该字段仅用于反序列化输入,默认False 序列化时不会把该字段提取出来,服务端响应数据时,不响应给客户端该字段。反序列化时,客户端必须要传该字段进行校验
序列化器合成一个
#将序列化和反序列化合并在一个序列化类中实现
class StudentSerializer3(serializers.Serializer):id = serializers.IntegerField(read_only=True) #id在序列化时需要,反序列化时不需要name = serializers.CharField(max_length=8)sex = serializers.BooleanField()age = serializers.IntegerField(max_value=200)class_null = serializers.CharField()description = serializers.CharField() #对于serializer中没有的数据类型,使用CharField。不写长度默认有多长序列化多长
视图类中,get请求和post请求,都用该序列化器
get请求,能收到数据
post请求,能提交数据
post请求校验成功
read_only使用场景:一般用在id上,序列化时需要,用户提交数据时不需要提交该字段
write_only使用场景:一般用在用户短信验证码,输入手机号,用户收到验证码,需要提交到后台验证,但是不需要服务端响应给客户,也不需要保存到数据库。
好了,今天先到这,明天继续,Carry on !
相关文章:

全面掌握Django的web框架Django Rest_Framework(一)
文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置(1)DRF需要以下依赖(2)创建django项目 4.序列化器的使用(1)创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…...

AOP+Redisson 延时队列,实现缓存延时双删策略
一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案,但不管是单独在修改数据库之前,还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式,即在删除缓存之后&…...

Hive中left join 中的where 和 on的区别
目录 一、知识点 二、测试验证 三、引申 一、知识点 left join中关于where和on条件的知识点: 多表left join 是会生成一张临时表。on后面: 一般是对left join 的右表进行条件过滤,会返回左表中的所有行,而右表中没有匹配上的数…...

LaTeX教程(001)-LaTeX文档结构(01)
LaTeX教程(001)- LaTeX \LaTeX LATEX文档结构(01) 说在前面 这是我本人学习《The LaTeX Companion》第三版的笔记,但并不是翻译。 书籍的第一章对 LaTeX \LaTeX LATEX及其历史进行了相当长的介绍,这是几乎每一本关于 LaTeX \LaTeX LATEX的书都会…...

SV-7041T 多媒体教学广播IP网络有源音箱
SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。同时它可以外接一个30W的无源副音箱,用在面积较大的场所。5寸进口全频低音喇…...

Linux文本三剑客awk经典案例
前言: AWK是一种专门用于文本处理的编程语言,它被广泛用于数据提取和报告生成,也是企业笔试面试常考的内容,以下34题是awk的用法案例,希望可以帮到你! 1.查看TCP连接状态 [rootnode1 ~]# netstat -nat | a…...

如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图三
Mermaid 系列 如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图一如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图二 1.如何创建甘特图 Gantt 甘特图以条形图的形式用作可视化表示。它有效地展示了项目的时间表,揭示了各个项目组件完成所需的持续时间…...

考研经验总结——政治篇
文章目录 一、前言二、学习情况三、最后 一、前言 不要提前,不要提前,不要提前, 我曾在暑假的时候上了7天左右的政治课,讲真话是很有趣的,并且对于自身的世界观、人生观和价值观的改善也是相当不错的,把我…...

春招秋招,在线测评到底难不难?
现在很多企业在春招的时候,都会有一个在线测评的环节,目的当然就是希望更加了解清楚毕业生的综合能力以及其他方面的素质,好让HR可以根据岗位筛选出能力达标的人才。所以,现在不少即将面对春招的大学毕业生,比较关心的…...

数学建模比赛中,使用大语言模型如chatgpt、文心一言该如何写Prompt(提示)?
在大型语言模型中,"prompt"(中文常译为“提示”或“引导”)是指提供给模型的输入文本,用于指示或引导模型产生特定的输出。它的作用主要是告诉模型用户想要得到什么样的信息或完成什么样的任务。 例如,在使…...

tcpdump 抓包无法落盘
文章目录 问题背景解决办法 问题背景 在嵌入式设备中(Linux系统),为了分析两个网络节点的通讯问题,往往需要用到tcpdump,抓一个.pcap的包在PC端进行分析。博主在实际操作中发现,抓包无法实时落盘。 解决办法 # 下面的命令是写在…...

【网站项目】066农家乐信息平台
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

idea/webstorm 创建Vue实例 Unresolved type Vue 处理方法
1.电脑本地安装node.js 官网下载 2. 其他: 未排除变量,前期试错(以下步骤配置了,但不确定对解决问题是否有帮助)...

C++ 11新特性之语法甜点2
概述 C 11中引入了许多简化编程工作的语法上的新特性,我们暂且美其名曰:“语法甜点”。书接上篇,我们继续介绍C 11中的这些“语法甜点”,也是第二篇关于“语法甜点”的文章。 语法甜点6:模板右边双括号 在C 03中&#…...

【芯片设计- RTL 数字逻辑设计入门 番外篇 8.1 -- memory repair 详细介绍】
文章目录 memory repair 详细介绍Memory Repair 方法Memory Repair 过程举例memory repair 详细介绍 SoC (System on Chip) 的 Memory Repair 是一种技术,用于检测和修复内存中的损坏单元。由于SoC内部集成了大量的逻辑和存储单元,包括RAM(随机访问存储器)、ROM(只读存储…...

2023强网杯复现
强网先锋 SpeedUp 要求2的27次方的阶乘的逐位之和 在A244060 - OEIS 然后我们将4495662081进行sha256加密 就得到了flag flag{bbdee5c548fddfc76617c562952a3a3b03d423985c095521a8661d248fad3797} MISC easyfuzz 通过尝试输入字符串判断该程序对输入字符的验证规则为9…...

IP代理协议有哪些?爬虫代理如何被合理使用?
随着互联网的普及和发展,IP代理作为一种网络代理方式,越来越受到人们的关注。IP代理协议是网络代理的一种规范,它规定了代理服务器与客户端之间进行通信的规则。了解IP代理协议对于使用代理的人来说非常重要,因为它可以帮助我们更…...

Vue学习笔记(二)快速入门
Vue学习笔记(二)快速入门 vue小试牛刀 hello-vue3.html <body><div id"app"><h1>{{msg}}</h1></div><script type"module">import {createApp} from https://unpkg.com/vue3/dist/vue.esm-b…...

在Vue中@click方法不起效
问题描述: 在跟项目的时候,我们可能会遇到我们click点击时,需要执行多个操作,如:调用方法,修改变量等。举个例子,像这样,我们在管理项目中想要编辑某一值,编辑好后&…...

服装行业ERP系统解决方案
我国的服装企业大多属于劳动密集型,主要有三种类型:自有品牌服装生产销售企业、接订单生产型企业及处于产业链下游的零售分销企业。在经营过程中,服装行业面临诸多挑战,如流行周期短、季节性强,市场变化快;…...

AI绘画探索人工智能的未来
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

Java 的 Map 與 List
小心获得List<Map>的size List<Map>没有赋值前,JVM会初始化,所以List<Map>会有一个25的size()。 通過重新new 一個ArrayList 轉化 resTask.setList(new ArrayList<Group>(custMap.values())); 无序的M…...

C++从零开始的打怪升级之路(day24)
这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于vector的一些函数 1.构造函数 vector() …...

用 CanvasKit 实现超级丝滑的原神地图(已开源)!!!
首先给大家送上预览地址: 官网地址:https://webstatic.mihoyo.com/ys/app/interactive-map/index.html canvaskit地址:http://106.55.55.247/ky-genshin-map/ 为什么 canvaskit 有如此高的性能? 第一个问题,官方网页…...

MySQL原理(三)锁定机制(2)表锁行锁与页锁
前面提到,mysql锁按照操作颗粒分类,一般认为有表级锁、行级锁、页面锁三种。其实还有一种特殊的全局锁。 锁场景问题全局锁全库逻辑备份加了全局锁之后,整个数据库都是【只读状态】,如果数据库里有很多数据,备份就会花…...

设计模式⑩ :用类来实现
文章目录 一、前言二、Command 模式1. 介绍2.应用3. 总结 三、Interpreter 模式1. 介绍2. 应用3. 总结 参考文章 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系…...

Flutter 解决ExpansionTile上下分割线问题,以及title撑满问题
文章目录 前言一、解决上下分割线问题二、使ExpansionTile的title撑满总结 前言 最近在做flutter项目,其中的一个功能用到了ExpansionTile的效果,奈何我们的设计师要求很高,展开的时候不能有上下一根线,而且我们是不需要展开的按…...

数据可视化 pycharts实现时间数据可视化
自用版 数据格式为: 运行效果为: from pyecharts import options as opts from pyecharts.charts import Polar, Page import csv filename "./hot-dog-places.csv" data_x [] data_y [] with open(filename) as f:reader csv.reade…...

深度强化学习(王树森)笔记11
深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…...

python 实现 macOS状态栏 网速实时显示
安装依赖包: pip install pillow psutil rumpsnetSpeedApp.py from PIL import Image, ImageDraw, ImageFont import psutil import rumpsclass NetSpeedApp(rumps.App):def __init__(self):super(NetSpeedApp, self).__init__("NetSpeed")self.titlese…...