Django从入门到精通(三)

目录

七、ORM操作

7.1、表结构

常见字段

参数

示例

7.2、表关系

一对多

多对多

第一种方式

第二种方式

7.3、连接MYSQL

7.4、数据库连接池

7.5、多数据库

读写分离

分库(多个app ->多数据库)

分库(单app)

注意事项

7.6、表关系

单表

一对多

多对多

一对一

7.7、数据操作

单表

增加

删除

修改

查询

一对多

增加

删除

修改

查询

多对多

添加

查询

八、session和cookie

8.1、cookie

8.2、session

存入文件

数据库

缓存(redis)


七、ORM操作

其实说白了,就是对数据库进行增删改查操作。

7.1、表结构

实现:创建表、修改表、删除表。

在app中的models.py中按照规则编写类 ===> 表结构。

第一步:编写实体类

app01/models.py

from django.db import modelsclass UserInfo(models.Model):name = models.CharField(max_length=16)age = models.IntegerField()

app02/models.py

from django.db import modelsclass Role(models.Model):roleName = models.CharField(max_length=16)count = models.IntegerField()

第二步:注册app

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','apps.app01.apps.App01Config','apps.app02.apps.App02Config'
]

第三步:命令,django根据models中类生成一个 `对数据库操作的配置文件` => `migrations`

python manage.py makemigrations

注意:假如我们要添加个字段或者修改一个字段,亦或者又增加了一个实体类,那么再次运行此命令即可,django会自动帮我们检测我们做了哪些修改。

第四步:配置数据库信息

默认的如下:

第五步:执行命令生成表

python manage.py migrate

读取已经注册的app中的migrations目录将配置文件 -> 转换成:生成表,修改表 SQL -> 连接数据库去运行。

第六步:打开sqlite3数据库

常见问题请不要再手动去修改数据的表结构 + 时刻保证 ORM和数据表是对应。

必须先修改实体类字段,再执行那两条命令。

常见字段

CharField  -> 字符串

SmallIntegerField
IntegerField -> 整型
BigIntegerField

DateField -> 年月入
DateTimeField -> 年月入时分秒

BooleanField  -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1

DecimalField  -> 精确的小数

参数

CharField

        verbose_name="姓名":表示这个字段的注释

        max_length:最大长度

        null=True:表示数据库是否可以为null

        blank=True:表示用户输入字段是否可以为空,和null=True一般搭配使用

        db_index=True:为这个字段添加索引

        unique=True:为这个字段增加唯一约束

        default:默认值

        choices:元组套元组,限制存储值显示值

DateField

        auto_now=True:自动给数据库赋值当前日期,常用于创建时间字段

DecimalField

        max_digits=10:总共长度是10个数

        decimal_places=2:小数部分有两位

示例

from django.db import modelsclass UserInfo(models.Model):name = models.CharField(verbose_name="姓名", max_length=16, db_index=True)age = models.PositiveIntegerField(verbose_name="年龄")email = models.CharField(verbose_name="邮箱", max_length=128, unique=True)amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)register_date = models.DateField(verbose_name="注册时间", auto_now=True)class Goods(models.Model):title = models.CharField(verbose_name="标题", max_length=32)# detail = models.CharField(verbose_name="详细信息", max_length=255)detail = models.TextField(verbose_name="详细信息")price = models.PositiveIntegerField(verbose_name="价格")count = models.PositiveBigIntegerField(verbose_name="库存", default=0)

7.2、表关系

一对多

很明显1个部门对应多个用户。

from django.db import modelsclass Department(models.Model):"""部门表"""title = models.CharField(verbose_name="标题")class UserInfo(models.Model):name = models.CharField(max_length=16)depart_id = models.ForeignKey(verbose_name="部门ID", to="Department", to_field="id", on_delete=models.CASCADE)

注意:on_delete=models.CASCADE 意思就是级联删除,比如我要删除某个部门,部门下没有用户关联还好,如果有关联就把关联的用户删掉。也可以on_delete=models.SET_NULL,如果删除部门,那就将部门下的员工信息所关联的depart_id字段设置为null。

多对多

第一种方式

第二种方式

我们就可以省略中间表的实体类代码,直接使用ManyToManyField,Django会自动为我们生成中间表。

注意:ManyToManyField生成的表字段只能id/bid/gid。

7.3、连接MYSQL

第一步:settings.py文件

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django-test',  # 数据库名字'USER': 'root','PASSWORD': 'root','HOST': '127.0.0.1',  # ip'PORT': 3306,}
}

第二步:安装第三方组件

pymysql

pip install pymysql
项目根目录/项目名目录/__init__.pyimport pymysqlpymysql.install_as_MySQLdb()

mysqlclient

pip install mysqlclient

7.4、数据库连接池

django默认内置没有数据库连接池 。

pip install django-db-connection-pool
DATABASES = {"default": {'ENGINE': 'dj_db_conn_pool.backends.mysql','NAME': 'django-test',  # 数据库名字'USER': 'root','PASSWORD': 'root','HOST': '127.0.0.1',  # ip'PORT': 3306,'POOL_OPTIONS': {'POOL_SIZE': 10,  # 最小'MAX_OVERFLOW': 10,  # 在最小的基础上,还可以增加10个,即:最大20个。'RECYCLE': 24 * 60 * 60,  # 连接可以被重复用多久,超过会重新创建,-1表示永久。'TIMEOUT':30, # 池中没有连接最多等待的时间。}}
}

注意:如果你不用连接池,那ENGINE属性值就是django.db.backends.mysql。

7.5、多数据库

django支持项目连接多个数据库。

DATABASES = {"default": {'ENGINE': 'dj_db_conn_pool.backends.mysql','NAME': 'django-test',  # 数据库名字'USER': 'root','PASSWORD': 'root','HOST': '127.0.0.1',  # ip'PORT': 3306,'POOL_OPTIONS': {'POOL_SIZE': 10,  # 最小'MAX_OVERFLOW': 10,  # 在最小的基础上,还可以增加10个,即:最大20个。'RECYCLE': 24 * 60 * 60,  # 连接可以被重复用多久,超过会重新创建,-1表示永久。'TIMEOUT': 30,  # 池中没有连接最多等待的时间。}},"bak": {'ENGINE': 'dj_db_conn_pool.backends.mysql','NAME': 'django-test-bak',  # 数据库名字'USER': 'root','PASSWORD': 'root','HOST': '127.0.0.1',  # ip'PORT': 3306,'POOL_OPTIONS': {'POOL_SIZE': 10,  # 最小'MAX_OVERFLOW': 10,  # 在最小的基础上,还可以增加10个,即:最大20个。'RECYCLE': 24 * 60 * 60,  # 连接可以被重复用多久,超过会重新创建,-1表示永久。'TIMEOUT': 30,  # 池中没有连接最多等待的时间。}},
}

读写分离

生成数据库表

python manage.py makemigrations    # 找到所有已注册的app中的models.py中的类读取 -> migrations配置python manage.py migrate
python manage.py migrate --database=default
python manage.py migrate --database=bak

后续再进行开发时

models.UserInfo.objects.using("default").create(title="编程抗氧化")models.UserInfo.objects.using("bak").all()

编写router类,简化【后续再进行开发时】

class DemoRouter(object):def db_for_read(...):return "bak"def db_for_write(...):return "default"
router = ["DemoRouter"]

分库(多个app ->多数据库)

100张表,50表-A数据库【app01】;50表-B数据库【app02】。

app01/models

from django.db import modelsclass UserInfo(models.Model):title = models.CharField(verbose_name="标题", max_length=32)

app02/models

from django.db import modelsclass Role(models.Model):title = models.CharField(verbose_name="标题", max_length=32)

命令

python manage.py makemigrations
python manage.py migrate app01 --database=default
python manage.py migrate app02 --database=bak

读写操作

from django.shortcuts import render, HttpResponsefrom app01 import models as m1
from app02 import models as m2def index(request):# app01中的操作 -> defaultv1 = m1.UserInfo.objects.all()print(v1)# app02中的操作 -> bakv2 = m2.Role.objects.using('bak').all()print(v2)return HttpResponse("返回")

router

分库(单app)

100张表,50表-A数据库;50表-B数据库。

注意:因为单个app是无法通过命令去生成哪张表去A库,哪张表去B库的,所以要借用路由的allow_migrate方法。

from django.shortcuts import render, HttpResponsefrom app01 import models as m1def index(request):# app01中的操作 -> defaultv1 = m1.UserInfo.objects.all()print(v1)# app01中的操作 -> bakv2 = m1.Role.objects.using('bak').all()print(v2)return HttpResponse("返回")

注意事项

一定不要跨数据库做关联  -> django不支持

那怎么办呢?

尽可能的将有关联的表放在一个库中。

7.6、表关系

单表

class Role(models.Model):title = models.CharField(verbose_name="标题", max_length=32)

一对多

多对多

如果中间表中只有3列。

class Boy(models.Model):name = models.CharField(verbose_name="标题", max_length=32, unique=True)b = models.ManyToManyField(to="Girl")class Girl(models.Model):name = models.CharField(verbose_name="标题", max_length=32, unique=True)
class Boy(models.Model):name = models.CharField(verbose_name="标题", max_length=32, unique=True)class Girl(models.Model):name = models.CharField(verbose_name="标题", max_length=32, unique=True)b = models.ManyToManyField(to="Boy")

如果中间表不止3列。

class Boy(models.Model):name = models.CharField(verbose_name="标题", max_length=32, unique=True)class Girl(models.Model):name = models.CharField(verbose_name="标题", max_length=32, unique=True)class B2G(models.Model):bid = models.ForeignKey(to="Boy", on_delete=models.CASCADE)gid = models.ForeignKey(to="Girl", on_delete=models.CASCADE)address = models.CharField(verbose_name="地点", max_length=32)

一对一

博客园为例:
    - 注册,用户名、密码,无法创建博客
    - 开通博客  地址

7.7、数据操作

单表

class Role(models.Model):title = models.CharField(verbose_name="标题", max_length=32)
增加
# obj1 = models.Role.objects.create(title="管理员", od=1)
# obj2 = models.Role.objects.create(**{"title": "管理员", "od": 1})# 内存 -> save
# obj = models.Role(title="客户", od=1)
# obj.od = 100
# obj.save()# obj = models.Role(**{"title": "管理员", "od": 1})
# obj.od = 100
# obj.save()

删除
# models.Role.objects.all().delete()
models.Role.objects.filter(title="管理员").delete()

修改
models.Role.objects.all().update(od=99)
models.Role.objects.filter(id=7).update(od=99, title="管理员")
models.Role.objects.filter(id=7).update(**{"od": 99, "title": "管理员"})

查询
# select * from role;
v1 = models.Role.objects.all()
for obj in v1:print(obj, obj.id, obj.title, obj.od)# select * from role where od = 99 and id = 99;
# v2 = models.Role.objects.filter(od=99, id=99)
v2 = models.Role.objects.filter(**{"od": 99, "id": 99})
for obj in v2:print(obj, obj.id, obj.title, obj.od)# select * from role where id = 99;
v3 = models.Role.objects.filter(id=99)
print(v3.query)# select * from role where id > 2;
v3 = models.Role.objects.filter(id__gt=2)
print(v3.query)# select * from role where id >= 2;
v3 = models.Role.objects.filter(id__gte=2)
print(v3.query)# select * from role where id < 2;
v3 = models.Role.objects.filter(id__lt=2)
print(v3.query)# select * from role where id in (11,22,33);
v3 = models.Role.objects.filter(id__in=[11, 22, 33])
print(v3.query)v3 = models.Role.objects.filter(title__contains="户")
print(v3.query)v3 = models.Role.objects.filter(title__startswith="户")
print(v3.query)# select * from role where title is null;
v3 = models.Role.objects.filter(title__isnull=True)
print(v3.query)# select * from role where id != 99 and od = 88;
v3 = models.Role.objects.exclude(id=99).filter(od=88)
print(v3.query)# 取数据集的第一个
v3 = models.Role.objects.filter(id__gt=0).first()
# print(v3)  # 对象# 判断数据是否存在
v3 = models.Role.objects.filter(id__gt=10).exists()
print(v3)  # True/False# asc 排序
v3 = models.Role.objects.filter(id__gt=0).order_by("id")# id desc  od asc
v3 = models.Role.objects.filter(id__gt=0).order_by("-id", 'od')

当查询返回QuerySet[obj,obj]怎么办?

# queryset=[obj,obj]
v3 = models.Role.objects.filter(id=99)# queryset=[{'id': 6, 'title': '客户'}, {'id': 7, 'title': '客户'}]
v4 = models.Role.objects.filter(id__gt=0).values("id", 'title')# QuerySet = [(6, '客户'), (7, '客户')]
v5 = models.Role.objects.filter(id__gt=0).values_list("id", 'title')
print(v5[0])

一对多

from django.db import modelsclass Depart(models.Model):""" 部门 """title = models.CharField(verbose_name="标题", max_length=32)class Admin(models.Model):name = models.CharField(verbose_name="姓名", max_length=32)pwd = models.CharField(verbose_name="密码", max_length=32)depart = models.ForeignKey(verbose_name="部门", to="Depart", on_delete=models.CASCADE)

一个部门对应多个员工。

生成表后是这样的:

我们先手动往部门表里添加几条数据

增加
# 第一种方式:直接添加值
# models.Admin.objects.create(name='编程抗氧化', pwd='123456', depart_id=1)# 第二种方式:先查出你要添加用户的部门信息,再动态添加用户
obj = models.Depart.objects.filter(id=2).first()
models.Admin.objects.create(name='苏格拉底', pwd='123456', depart=obj)
models.Admin.objects.create(name='柏拉图', pwd='123456', depart_id=obj.id)

删除
# 找到部门id=3的所有的员工,直接删除
# models.Admin.objects.filter(depart_id=3).delete()# 删除销售部的所有员工
# obj = models.Depart.objects.filter(title="销售部").first()
# models.Admin.objects.filter(depart_id=obj.id).delete()# filter后面的条件代表 部门表的title='软件部' and 用户表的name='苏格拉底'
# 相当于使用了inner join
models.Admin.objects.filter(depart__title="软件部", name='苏格拉底').delete()

修改
models.Admin.objects.filter(id=2).update(name='xxx', pwd='xxxx')
models.Admin.objects.filter(name="苏格拉底").update(depart_id=1)

查询
# 1. select * from admin; 只查询admin表数据
v1 = models.Admin.objects.filter(id__gt=0)
for obj in v1:print(obj.name, obj.pwd, obj.id, obj.depart_id)# 2. select * from admin inner join depart      queryset=[obj,obj,]
v2 = models.Admin.objects.filter(id__gt=0).select_related("depart")
for obj in v2:print(obj.name, obj.pwd, obj.id, obj.depart_id, obj.depart.title)# 3. select id,name.. from admin inner join depart      queryset=[{},{}]
v3 = models.Admin.objects.filter(id__gt=0).values("id", 'name', 'pwd', "depart__title")
print(v3)# 4. select id,name.. from admin inner join depart      queryset=[(),()]
v4 = models.Admin.objects.filter(id__gt=0).values_list("id", 'name', 'pwd', "depart__title")
print(v4)

多对多

class Boy(models.Model):name = models.CharField(verbose_name="姓名", max_length=32, db_index=True)class Girl(models.Model):name = models.CharField(verbose_name="姓名", max_length=32, db_index=True)class B2G(models.Model):bid = models.ForeignKey(to="Boy", on_delete=models.CASCADE)gid = models.ForeignKey(to="Girl", on_delete=models.CASCADE)address = models.CharField(verbose_name="地点", max_length=32)

添加

先添加boy表和girl表数据

models.Boy.objects.create(name="宝强")
models.Boy.objects.create(name="羽凡")
models.Boy.objects.create(name="乃亮")# 批量添加
models.Girl.objects.bulk_create(objs=[models.Girl(name="小路"), models.Girl(name="百合"), models.Girl(name="马蓉")],batch_size=3
)

然后创建这两张表的关系,往中间表添加数据

# 创建关系
b_obj = models.Boy.objects.filter(name='宝强').first()
g_object = models.Girl.objects.filter(name="小路").first()
models.B2G.objects.create(bid=b_obj, gid=g_object, address="北京")

查询
# 1.宝强都与谁约会。
q = models.B2G.objects.filter(bid__name='宝强').select_related("gid")
for item in q:print(item.id, item.address, item.bid.name, item.gid.name)q = models.B2G.objects.filter(bid__name='宝强').values("id", 'bid__name', 'gid__name')
for item in q:print(item['id'], item['bid__name'], item['gid__name'])# 2.百合 都与谁约会。
q = models.B2G.objects.filter(gid__name='百合').values("id", 'bid__name', 'gid__name')
for item in q:print(item['id'], item['bid__name'], item['gid__name'])

八、session和cookie

8.1、cookie

def login(request):res = HttpResponse('登录...')res.set_cookie("v1", "123456", max_age=100, path="/")return res

def home(request):v1 = request.COOKIES.get("v1")print(v1)return HttpResponse('home')

8.2、session

默认情况下,Django将Session存入数据库中。为了追求更高的速度,可以把Session存到别的地方,比如文件系统和Cache中。

存入文件

settings.py

# session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = 'session_data' # 需要你在项目下创建名为session_data的文件夹SESSION_COOKIE_NAME = "sid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = True  # 是否每次请求都保存Session,默认修改之后才保存

views.py

def login(request):# 在session中设置值 + cookie中写入凭证request.session["user_info"] = '编程抗氧化'return HttpResponse('登录...')def home(request):# 获取sessionuser_info = request.session.get("user_info")print(user_info)return HttpResponse('home')

解析代码:

request.session["user_info"] = '编程抗氧化' 这句代码所做的哪些操作?

首先往session中存入user_info = '编程抗氧化' ,然后往cookie中设置了sid = 2dsjd8sdsk2sdsdd。

下一次用户再次访问带着sid = 2dsjd8sdsk2sdsdd,我们根据sid获取存在session里的信息。

数据库

settings.py

# session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'SESSION_COOKIE_NAME = "sid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = True  # 是否每次请求都保存Session,默认修改之后才保存

缓存(redis)

安装连接redis包

pip install django-redis

settings.py

CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 100}# "PASSWORD": "密码",}}
}# session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'SESSION_COOKIE_NAME = "sid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = True  # 是否每次请求都保存Session,默认修改之后才保存

手动操作redis

from django_redis import get_redis_connectionconn = get_redis_connection("default")
conn.set("xx","123123")
conn.get("xx")

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

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

相关文章

狗东云搭建幻兽帕鲁(奶妈级别)

使用狗东云搭建幻兽帕鲁 同配置狗东云比腾讯云便宜&#xff0c;2核2G服务器仅50元1年&#xff0c;4核8G服务器458元1年&#xff0c;点击链接直达. 进入页面会跳转到注册&#xff0c;先注册账户&#xff0c;注册好后页面跳转&#xff0c;没有跳转点这里&#xff0c;选择页面左侧…

[AIGC 大数据基础] 浅谈hdfs

HDFS介绍 什么是HDFS&#xff1f; HDFS&#xff08;Hadoop Distributed File System&#xff09;是Apache Hadoop生态系统的一部分&#xff0c;是一个分布式文件系统。它被设计用于存储和处理大规模数据集&#xff0c;并且能够容错、高可靠和高性能地处理文件。 HDFS是为了支…

2024转行程序员的请注意:均月薪在40-70k

前言 2023年&#xff0c;对大多数行业来说都是不太好过的一年。 对程序员来说也是如此&#xff0c;很多粉丝朋友都在说android工作特别难找&#xff0c;一个岗位都是几千份简历........大家心里都是特别的焦虑&#xff0c;本以为2024年就业情况会有好转&#xff0c;但实际上并…

PHP - Yii2 异步队列

1. 前言使用场景 在 PHP Yii2 中&#xff0c;队列是一种特殊的数据结构&#xff0c;用于处理和管理后台任务。队列允许我们将耗时的任务&#xff08;如发送电子邮件、push通知等&#xff09;放入队列中&#xff0c;然后在后台异步执行。这样可以避免在处理大量请求时阻塞主应用…

[GXYCTF2019]BabySQli1

单引号闭合&#xff0c;列数为三列&#xff0c;但是没有期待的1 2 3回显&#xff0c;而是显示wrong pass。 尝试报错注入时发现过滤了圆括号&#xff0c;网上搜索似乎也没找到能绕过使用圆括号的方法&#xff0c;那么按以往爆库爆表爆字段的方法似乎无法使用了 在响应报文找到一…

ORM-07-querydsl 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; 1. 介绍 1.1 背景 Querydsl的诞生源于以类型安全的方式维护HQL查询的需求。逐步构建HQL查询需要进行字符串连接&#xff0c;导致代码难以…

32个Java面试必考点-06常用工具集

本课时主要介绍常用的工具&#xff0c;将会讲解三个知识点&#xff1a; & JVM 相关工具的作用和适用场景&#xff1b; & Git 常用命令和工作流&#xff1b; & Linux 系统中常用分析工具。 常用工具汇总 常用工具汇总如下图所示。 说明&#xff1a;这里列出的都…

k8s的图形化工具--rancher

什么是rancher&#xff1f; rancher是一个开源的企业级多集群的k8s管理平台 rancher和k8s的区别 都是为了容器的调度和编排系统&#xff0c;但是rancher不仅能够调度&#xff0c;还能管理k8s集群&#xff0c;自带监控&#xff08;普罗米修斯&#xff09; 实验部署 实验架构…

电容主要特点和作用,不同类型的电容区别

电容 两个相互靠近的金属板中间夹一层绝缘介质组成的器件&#xff0c;当两端存在电势差时&#xff0c;由于介质阻碍了电荷移动而累积在金属板上&#xff0c;衡量金属板上储存电荷的能力称之为电容&#xff0c;相应的器件称为电容器。 电容&#xff08;Capacitance&#xff09…

移动端 h5-table react版本支持虚拟列表

介绍 适用于 react ts 的 h5 移动端项目 table 组件 github 链接 &#xff1a;https://github.com/duKD/react-h5-table 有帮助的话 给个小星星 有两种表格组件 常规的&#xff1a; 支持 左侧固定 滑动 每行点击回调 支持 指定列排序 支持滚动加载更多 效果和之前写的vue…

【开源】基于JAVA的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

四、Kotlin 表达式

1. 常量 & 变量 1.1 可读写变量&#xff08;var&#xff09; var x initValue // x 称为可读写变量注意&#xff1a;当 var 声明的变量做成员属性时&#xff0c;默认提供 setter/getter 方法。 1.2 只读变量&#xff08;val&#xff09; val x initValue // x 称为只…

FPGA:我的零基础学习路线(2022秋招已上岸)持续更新中~

可内推简历&#xff0c;丝我即可 前言 初次接触FPGA是在2022年3月左右&#xff0c;正处在研二下学期&#xff0c;面临着暑假找工作&#xff0c;周围的同学大多选择了互联网&#xff0c;出于对互联网的裁员形势下&#xff0c;我选择了FPGA&#xff0c;对于硬件基础知识我几乎是…

Vue+OpenLayers7入门到实战:鹰眼控件简单介绍,并使用OpenLayers7在地图上添加鹰眼控件

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍OpenLayers7添加鹰眼控件到地图上的功能。 在OpenLayers中,想要实现鹰眼控件,必须要新建一个数据源,且不能跟其他图层混用,相当于鹰眼是一个单独图层。 补充知识,鹰眼控件是什么? 鹰眼控件是一种在地…

大数据平台红蓝对抗 - 磨利刃,淬精兵!

背景 目前大促备战常见备战工作&#xff1a;专项压测&#xff08;全链路压测、内部压测&#xff09;、灾备演练、降级演练、限流、巡检&#xff08;监控、应用健康度&#xff09;、混沌演练&#xff08;红蓝对抗&#xff09;&#xff0c;如下图所示。随着平台业务越来越复杂&a…

OpenCV功能特性和依赖关系

有许多可选的依赖项和功能可以打开或关闭。 CMake 具有特殊选项&#xff0c;允许打印所有可用的配置参数&#xff1a; cmake -LH ../opencv 选项命名约定 有三种选项用于控制库的依赖项&#xff0c;它们具有不同的前缀&#xff1a; 以启用或禁用依赖项开头的选项WITH_ 从启…

输入框限制输入两位小数 输入金额限制 双向绑定输入框能继续输入但是变量的数据不变解决方案 input 保留两位小数

移动端项目 需求是 输入框只能输入1000以内的数字保留两位小数 开发中发现 用vue开发双向绑定 不管是用value还是v-model 在输入时用input监听输入框变化 校验是否匹配 当不匹配是修改绑定的变量 inputValue时 打印inputValue符合预期 但是input输入框中还是原来输入的值 没有…

RocketMQ源码阅读-八-定时消息和消息重试

RocketMQ源码阅读-八-定时消息和消息重试 定时消息概念逻辑流程图延迟级别Producer发送定时消息Broker存储定时消息Broker发送定时消息Broker 持久化定时发送进度 消息重试总结 定时消息 概念 官网给出的概念&#xff1a;https://rocketmq.apache.org/zh/docs/featureBehavior…

树莓派无显示屏连接

终端命令控制树莓派关机 1&#xff1a;用网线连接树莓派 按照正常的步骤 &#xff0c;搜索控制面板&#xff0c;网络和internet&#xff0c;网络和共享中心&#xff0c;更改适配器设置&#xff0c;右键WIFI&#xff0c;点击属性&#xff0c;点击共享&#xff0c;打勾允许即可&…

redis排序

文章目录 简介SORT命令的实现ALPHA选项的实现ASC和DESCBYLIMITGET命令 类似映射STORE选项的实现多个命令的执行顺序 简介 Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。 SORT命令的实现 服务器执行SORT numbers 命令的详细步骤如下&#xff1a; 1&#…