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

Python 自动化(十八)admin后台管理

admin后台管理

什么是admin后台管理

django提供了比较完善的后台数据库的接口,可供开发过程中调用和测试使用

django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开发使用

admin配置步骤

创建后台管理账号

该账号为管理后台最高权限账号

  • python3 manage.py createsuperuser

  • 测试登录

    启动服务后,后台管理的登录地址:http://127.0.0.1:8000/admin,使用刚才注册的管理员账号登录即可

    实验:测试admin后台系统
  • 首先创建用户,在终端执行 python3 manage.py createsuperuser 命令

  • (testenv) [root@localhost mysite3]# python3 manage.py createsuperuser
    用户名 (leave blank to use 'root'): root
    电子邮件地址: root@qq.com
    Password: 123456
    Password (again): 123456
    密码长度太短。密码必须包含至少 8 个字符。
    这个密码太常见了。
    密码只包含数字。
    Bypass password validation and create user anyway? [y/N]: y  # 如果密码短需要手动确定
    Superuser created successfully.

    启动服务 django 服务

  • (testenv) [root@localhost mysite3]# python3 manage.py runserver

    后台管理的登录地址:http://127.0.0.1:8000/admin

 

 

 

注册自定义模型类

若要自己定义的模型类也能在admin后台管理系统界面中显示和管理,需要将自己的类注册到后台管理界面

注册步骤

实验:绑定模型管理器类

  • 在应用app中的 admin.py 中导入注册要管理的模型 models 类,如:from .models import Book

  • 调用 admin.site.register 方法进行注册,如:admin.site.register(自定义模型类)

  • 案例

  • 修改自定义模型类的数据样式

  • admin后台管理数据库中对自定义的数据记录都展示为 XXX object 类型的记录,不便于阅读和理解

  • 在用户自定义的模型类中可以重写 def str(self)方法解决显示问题,如:

  • 实验:注册模型类
  • 修改 bookstore 应用下的 admin.py 文件

  • from django.contrib import admin
    from .models import Book  # 导入模型类# Register your models here.
    admin.site.register(Book)  # 注册模型类

    启动服务,重新登录 admin 后台管理系统,观察界面

  • 点击Books链接,查看图书详情页

  • 这里显示的内容是 __str__ 方法封装的字符串,所以可以自定义修改

  • 模型管理器类

    理解与说明

    作用:为后台管理界面添加便于操作的新功能

    说明:后台管理器类须继承自 Django.contrib.admin 里的 ModelAdmin

    使用方法
  • 在 <应用app>/admin.py 里定义模型管理器类

  • 绑定注册模型管理器和模型类

  • 案例

  • 类属性说明
  • list_display:去控制哪些字段会显示在admin后台管理的修改列表页面中
  • list_display_links:可以控制list_display中的字段是否应该链接到对象的”更改”页面
  • 修改 bookstore 应用下的 admin.py 文件,添加模型管理器类

  • list_filter:设置激活admin修改列表页面右侧栏中的过滤器
  • search_fields:设置启用admin更改列表页面上的搜索框
  • from django.contrib import admin
    from .models import Bookclass BookManager(admin.ModelAdmin):# 列表页显示哪些字段的列list_display = ["id", "title", "pub", "price"]# 控制 list_display 中的字段,哪些可以链接到修改页list_display_links = ["title"]# 添加过滤器list_filter = ["pub"]# 添加搜索框[模糊查询]search_fields = ["title"]# 添加可在列表编辑的字段list_editable = ["price"]admin.site.register(Book, BookManager)  # 将模型管理器类和模型类进行绑定

    启动服务,重新登录 admin 后台管理系统,观察界面

  • 点击Books进入详情页,发现修改内容均已在管理界面生效

  • Meta类

    通过Meta内嵌类定义模型类的属性,用法如下:

实验:修改Meta类属性
  • 修改 bookstore 应用下的 admin.py 文件,修改 Book 模型类

from django.db import modelsclass Book(models.Model):title = models.CharField("书名", max_length=50, default="", unique=True)pub = models.CharField("出版社", max_length=50, default="")price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)market_price = models.DecimalField("零售价", max_digits=7, decimal_places=2, default=0.0)is_active = models.BooleanField("是否活跃", default=True)def __str__(self):return f"{self.title}, {self.pub}, {self.price}, {self.market_price}"class Meta:db_table = "book"verbose_name = "图书"  # 修改单数显示verbose_name_plural = verbose_name  # 修改复数显示

启动服务,重新登录 admin 后台管理系统,观察界面

 

练习

需求:对 Author 模型管理类的自定义设置

  • 将 Author 模型类加入后台管理
  • 制作一个 AuthorManager 管理器类,让后台管理 Authors 列表中显示作者的 ID、姓名、年龄信息
  • 用后台管理程序添加三条 Author 记录
  • 修改其中一条记录的年龄 – Author
  • 删除最后一条添加的记录 – Author

总结

  • 注册自己的模型类
  • 修改自定义模型类的显示样式 - 模型管理器类
  • Meta类对模型类的属性修改

关系映射

什么是关系映射

在关系型数据库中,通常不会把所有数据都放在同一张表中,不易于扩展,常见关系映射有:

  • 一对一映射

    • 如:一个身份证对应一个人
  • 一对多映射

    • 如:一个班级可以有多个学生
  • 多对多映射

  • 如:一个学生可以报多个课程,一个课程可以有多个学生学习

一对一映射

概念与理解

创建模型类

查询数据
正向查询

  • 一对一是表示现实事物间存在的一对一的对应关系

  • 如:一个家庭只有一个户主,一个男人有一个妻子,一个人有一个唯一的指纹信息等

  • 语法:OneToOneField(类名, on_delete=xxx)

  • 特殊字段选项【必须】
    on_delete:级联删除
  • models.CASCADE 级联删除:Django模拟 SQL 约束 ON DELETE CASCADE 的行为,并删除包含 ForeignKey的对象
  • Models.PROTECT:抛出 ProtectedError 以阻止被引用对象的删除;等同于 mysql 默认的 RESTRICT
  • SET_NULL 设置 ForeignKey null;需要指定 null = True
  • SET_DEFAULT:将 ForeignKey 设置为其默认值,必须设置 ForeignKey 的默认值
  • 示例 - 创建模型类 – oto/models.py
  • 添加数据
  • 无外键的模型类[Author]:

    • author1 = Author.objects.create(name="王老师")
  • 有外键的模型类[Wife]:

    • 方式1:wife1 = Wife.objects.create(name="王夫人", author=author1) # 关联王老师对象
    • 方式2:wife1 = Wife.objects.create(name="王夫人", author_id=1) # 关联王老师对应的主键值
  • 直接通过外键属性查询,则称为正向查询

反向查询

没有外键属性的一方,可以调用反向属性查询关联的另一方

一对多映射

  • 反向关联属性为:实例对象.引用类名(小写),如作家的反向引用为:作家对象.wife

  • 当反向引用不存在时,则会触发异常

  • author1 = Author.objects.get(name=‘王老师’)
    author1.wife.name
    实验:一对一模型
  • 创建应用:oto

  • (testenv) [root@localhost mysite3]# python3 manage.py startapp oto

    并在 settings.py 中将 oto 应用进行注册

  • INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','music','news','sport','bookstore','oto',  # 模型注册
    ]

    修改 oto 应用下的 models.py,创建模型类

  • from django.db import modelsclass Author(models.Model):# wife 反向属性:用作反向查询name = models.CharField('姓名', max_length=11)class Wife(models.Model):name = models.CharField('姓名', max_length=11)author = models.OneToOneField(Author, on_delete=models.CASCADE)

    同步迁移数据库

  • (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    (testenv) [root@localhost mysite3]# python3 manage.py migrate

    进入 MySQL 环境,观察 wife 表中的外键,自动生成 author_id 外键

  • (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    MariaDB [(none)]> USE mysite3;
    MariaDB [mysite3]> DESC oto_author;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(11) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+MariaDB [mysite3]> DESC oto_wife;
    +-----------+-------------+------+-----+---------+----------------+
    | Field     | Type        | Null | Key | Default | Extra          |
    +-----------+-------------+------+-----+---------+----------------+
    | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name      | varchar(11) | NO   |     | NULL    |                |
    | author_id | int(11)     | NO   | UNI | NULL    |                |
    +-----------+-------------+------+-----+---------+----------------+

    测试:给两张表中添加数据,使用 Django Shell 的方式,两种方式添加数据

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from oto.models import *
    >>> a1 = Author.objects.create(name="ben")
    >>> w1 = Wife.objects.create(name="benfuren", author=a1)  # 类属性赋值
    >>> a2 = Author.objects.create(name="niu")
    >>> w2 = Wife.objects.create(name="niufuren", author_id=2)  # 数据库字段赋值
    >>> a2.id  # 查看作者id
    2

    查询:正向查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from oto.models import *
    >>> wife = Wife.objects.get(name="benfuren")
    >>> wife.name
    'benfuren'
    >>> wife.author.name
    'ben'

    查询:反向查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from oto.models import *
    >>> author1 = Author.objects.get(name="ben")
    >>> author1.wife.name  # 利用反向属性进行数据查询
    'benfuren'
    一对一映射关系总结
  • 一对一的模型类创建

  • 一对一的数据创建

  • 一对一的数据查询

    • 正向查询
    • 反向查询
概念与理解

一对多是表示现实事物存在的一对多的对应关系

如:一个学校有多个班级,一个班级有多个学生,一本书只能属于一个出版社,但是出版社可以出版多本书

一对多需要明确出具体角色,在多表上设置外键

创建模型类
  • 语法:当一个A类对象可以关联多个B类对象时

  • ForeignKey必须指定 on_delete 模式

  • 示例 – 创建模型类 - otm/models.py

  • 添加数据
  • 先创建“一”再创建多“多”

  • 示例:

  • from .models import *
    pub1=Publisher.objects.create(name='清华大学出版社')
    Book.objects.create(title='C++', publisher=pub1)
    Book.objects.create(title='Java', publisher_id=1)
    查询数据
  • 正向查询 [通过Book查询Publisher]

  • 反向查询 [通过Publisher查询对应的所有的Book] 需要用到 反向属性

  • 实验:一对多模型
  • 创建应用:otm

  • (testenv) [root@localhost mysite3]# python3 manage.py startapp otm

    并在 settings.py 中将 otm 应用进行注册

  • INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','music','news','sport','bookstore','oto','otm',  # 模型注册
    ]

    修改 otm 应用下的 models.py,创建模型类

  • from django.db import modelsclass Publisher(models.Model):#出版社  [一]name = models.CharField('出版社名称', max_length=50)class Book(models.Model):#书名 [多]title = models.CharField('书名', max_length=11)publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)  # 外键

    同步迁移数据库

  • (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    (testenv) [root@localhost mysite3]# python3 manage.py migrate

    进入 MySQL 环境,观察 Book 表中的外键

  • (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    MariaDB [(none)]> USE mysite3;
    MariaDB [mysite3]> DESC otm_book;
    +--------------+-------------+------+-----+---------+----------------+
    | Field        | Type        | Null | Key | Default | Extra          |
    +--------------+-------------+------+-----+---------+----------------+
    | id           | int(11)     | NO   | PRI | NULL    | auto_increment |
    | title        | varchar(11) | NO   |     | NULL    |                |
    | publisher_id | int(11)     | NO   | MUL | NULL    |                |
    +--------------+-------------+------+-----+---------+----------------+MariaDB [mysite3]> DESC otm_publisher;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(50) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+
    

    测试:给两张表中添加数据,使用 Django Shell 的方式,先创建一,再创建多

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from otm.models import *
    >>> p1 = Publisher.objects.create(name="中信出版社")
    >>> p1
    <Publisher: Publisher object (1)>
    >>> b1 = Book.objects.create(title="python1", publisher=p1)  # 类属性赋值
    >>> b2 = Book.objects.create(title="python2", publisher_id=1)  # 数据库字段赋值

    查询:正向查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from otm.models import *
    >>> b1 = Book.objects.get(id=1)
    >>> b1
    <Book: Book object (1)>
    >>> print(b1.title, b1.publisher.name)
    python1 中信出版社

    查询:反向查询

  • >>> from otm.models import *
    >>> pub1 = Publisher.objects.get(name="中信出版社")
    >>> pub1
    <Publisher: Publisher object (1)>
    >>> books = pub1.book_set.all()
    >>> books
    <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
    >>> for book in books:
    ...     print(book.title)
    ... 
    python1
    python2

    多对多映射

    概念与理解
  • 多对多表达对象之间多对多的复杂关系,如:每个都有不同的学校(小学,初中,高中……),每个学校都有不同的学生……

  • Mysql 中创建多对多需要依赖第三张表来实现

  • Django 中无需手动创建第三张表,这个操作Django自动完成

  • 语法:在关联的两个类中的任意一个类中,增加:

    • 属性 = models.ManyToManyField(MyModel)
  • 创建模型类

    用法示例:

  • 一个作者可以出版多本图书

  • 一本图书可以由多个作者共同编写

  • 用法示例—创建模型类:

  • 添加数据
  • 用法示例—创建数据

  • 数据查询

    正向查询:有多对多属性的对象查另一方

  • 通过 Book 查询对应的所有的 Author

  • 此时多对多属性相当于 objects

  • 反向查询:

  • 通过 Author查询对应的所有的 Book

  • 利用反向属性 book_set

  • 实验:多对多模型
  • 创建应用:mtm

  • (testenv) [root@localhost mysite3]# python3 manage.py startapp otm

    并在 settings.py 中将 mtm 应用进行注册

  • INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','music','news','sport','bookstore','oto','otm','mtm',  # 模型注册
    ]

    修改 mtm 应用下的 models.py,创建模型类

  • from django.db import modelsclass Author(models.Model):name = models.CharField('姓名', max_length=11)class Book(models.Model):title = models.CharField('书名', max_length=11)authors = models.ManyToManyField(Author)

    同步迁移数据库

  • (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    (testenv) [root@localhost mysite3]# python3 manage.py migrate

    进入 MySQL 环境,观察 Django 帮助我们生成的中间表

  • (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    MariaDB [(none)]> USE mysite3;
    MariaDB [mysite3]> DESC mtm_author;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(11) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+MariaDB [mysite3]> DESC mtm_book;
    +-------+-------------+------+-----+---------+----------------+
    | Field | Type        | Null | Key | Default | Extra          |
    +-------+-------------+------+-----+---------+----------------+
    | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    | title | varchar(11) | NO   |     | NULL    |                |
    +-------+-------------+------+-----+---------+----------------+MariaDB [mysite3]> DESC mtm_book_authors;  # 中间表
    +-----------+---------+------+-----+---------+----------------+
    | Field     | Type    | Null | Key | Default | Extra          |
    +-----------+---------+------+-----+---------+----------------+
    | id        | int(11) | NO   | PRI | NULL    | auto_increment |
    | book_id   | int(11) | NO   | MUL | NULL    |                |
    | author_id | int(11) | NO   | MUL | NULL    |                |
    +-----------+---------+------+-----+---------+----------------+

    测试:给两张表中添加数据,使用 Django Shell 的方式

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from mtm.models import *
    # 方案1:先创建 author,再关联 book
    >>> author1 = Author.objects.create(name="teacher ben")
    >>> author2 = Author.objects.create(name="teacher niu")
    >>> book1 = author1.book_set.create(title="Python")
    >>> author2.book_set.add(book1)
    # 方案2:先创建 book,再关联 author
    >>> book2 = Book.objects.create(title="Django")
    # 凯哥和niu老师都参与了Django的编写
    >>> author3 = book2.authors.create(name="kaige")
    >>> book2.authors.add(author2)

    查询:正向查询,通过 Book 查询对应的所有的 Author

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from mtm.models import *
    >>> book1 = Book.objects.get(title="Django")
    >>> book1.title
    'Django'
    >>> users = book1.authors.all()
    >>> for user in users:
    ...     print(user.name)
    ... 
    teacher niu
    kaige

    查询:反向查询

  • (testenv) [root@localhost mysite3]# python3 manage.py shell
    >>> from mtm.models import *
    >>> author2 = Author.objects.get(name="teacher niu")
    >>> books = author2.book_set.all()
    >>> for book in books:
    ...     print(book.title)
    ... 
    Python
    Django

    Cookies 和 Session

    会话概念

  • 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话
  • HTTP 协议是无状态的,导致会话状态难以保持
  • 试想一下,如果不保持会话状态,再电商网站购物的场景体验?
  • Cookies和Session就是为了保持会话状态而诞生的两个存储技术

Cookies

Cookies 定义

cookies 是保存在客户端浏览器上的存储空间

在讲cookie前先了解下它的使用场景

  • 使用Chrome浏览器打开京东网站且未登录情况下我的购物车未添加商品,所以商品数量是0

  • 挑选3个商品加入购物车,此时购物车数量显示3

  • 关闭 Chrome 浏览器再次打开京东首页发现购物车数量还是 3

  • 如果此时换成 Firefox 浏览器打开京东首页发现购物车里的商品数量是 0

  • 为什么 Chrome 浏览器未登录关闭浏览器后再次打开购物车商品数量没变,换个浏览器购物车商品数量就不是 3 了,这个场景就说明了 2 点

  • 商品信息保留在本地了,未保留在浏览器缓存
  • 不同的浏览器cookie的保留路径不一样,并且各个浏览器的cookie信息互不影响
Cookies 特点

  • cookie 在浏览器上是以键值对的形式进行存储的,键和值都是以 ASCII 字符串的形式存储(不能是中文字符串)
  • 存储的数据带有声明周期
  • cookie 中的数据是按域存储隔离的,不同的域之间无法访问
  • cookie 的内部的数据会在每次访问此网站时携带到服务器端,如果 cookie 过大会降低响应速度
实验:Cookies 操作
  • 添加 cookies:修改 mysite3 下的 views.py 文件,添加指定视图函数

  • from django.shortcuts import render
    from django.http import HttpResponsedef test_static(request):return render(request, "test_static.html")def set_cookies(request):  # 添加测试cookie的函数resp = HttpResponse('set cookies is ok')resp.set_cookie('uuname', 'nfx',500)return resp

    修改主路由 urls.py

  • from django.contrib import admin
    from django.urls import path, include
    from . import viewsurlpatterns = [path('admin/', admin.site.urls),# ......path('set_cookies', views.set_cookies),
    ]

    启动服务,测试 http://127.0.0.1:8000/set_cookies,观察网络请求中的 cookies 变化

  • 获取 cookies:修改 mysite3 下的 views.py 文件,添加指定视图函数

  • from django.shortcuts import render
    from django.http import HttpResponsedef test_static(request):return render(request, "test_static.html")def set_cookies(request):resp = HttpResponse('set cookies is ok')resp.set_cookie('uuname', 'nfx',500)return respdef get_cookies(request):  # 添加获取cookie的函数value = request.COOKIES.get('uuname')return HttpResponse(f'value is {value}')

    修改主路由 urls.py

  • from django.contrib import admin
    from django.urls import path, include
    from . import viewsurlpatterns = [path('admin/', admin.site.urls),# ......path('set_cookies', views.set_cookies),path('get_cookies', views.get_cookies),  # 获取cookie的url
    ]

    启动服务,测试 http://127.0.0.1:8000/get_cookies,观察网络请求中的 cookies 变化

  • Session

    Session概念

    session 是在服务器上开辟了一段用于保留浏览器和服务器交互时的重要数据

  • 实现方式
  • 使用session需要在浏览器客户端启动 cookie,且在cookie中存储 sessionid
  • 每个客户端都可以在服务端有一个独立的 session
  • 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
在 Django 中的配置

向 INSTALLED_APPS 列表中添加

 向 MIDDLEWARE 列表中添加

 

session的使用
  • session 对象是一个类似与字典的 SessionStore 类型的对象,可以用类拟于字典的方式进行操作

  • session 能够存储如字符串,整型,字典,列表等数据

  • 保存 session 的值到服务器

    • request.session['KEY'] = VALUE
  • 获取 session 的值

    • value = request.session['KEY']
    • value = request.session.get('KEY', '默认值')
  • 删除 session

    • del request.session['KEY']
实验:Session 操作
  • 添加以及获取 session:修改 mysite3 下的 views.py 文件,添加指定视图函数

  • def set_session(request):request.session['uname'] = 'nfx'return HttpResponse('set session is ok')def get_session(request):value = request.session['uname']return HttpResponse(f'session value is {value}')

    修改主路由 urls.py

  • from django.contrib import admin
    from django.urls import path, include
    from . import viewsurlpatterns = [path('admin/', admin.site.urls),# ......path('set_cookies', views.set_cookies),path('get_cookies', views.get_cookies),path('set_session', views.set_session),  # 设置sessionpath('get_session', views.get_session),  # 获取session
    ]

    启动服务:先测试 set 设置 session,然后再测试 get 获取 session

  • settings.py 中相关配置项以及注意事项
  • SESSION_COOKIE_AGE

  • 作用:指定sessionid在cookies中的保存时长 (默认时2周),如下:
  • 例如:SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
  • SESSION_EXPIRE_AT_BROWSER_CLOSE = True

  • 设置只要浏览器关闭时,session就失效(默认是False)
  • 注意:Django中的session数据存储在数据库中,所以使用session前需要确保已经执行过migrate操作将存储session表创建出来

  • django_session 表是单表设计;且该表数据量持续增加

    • 可以定期执行 python3 manage.py clearsessions
    • 该命令可删除已过期的 session 数据

Cookie和Session的对比

相关文章:

Python 自动化(十八)admin后台管理

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口&#xff0c;可供开发过程中调用和测试使用 django会搜集所有已注册的模型类&#xff0c;为这些模型类提供数据管理界面&#xff0c;供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…...

Navicat 技术指引 | 适用于 GaussDB 的自动运行功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…...

MySQL 的执行原理(四)

5.5. MySQL 的查询重写规则 对于一些执行起来十分耗费性能的语句&#xff0c;MySQL 还是依据一些规则&#xff0c;竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程也可以 被称作查询重写。 5.5.1. 条件化简 我们编写的查询语句的搜索条件…...

PHP 正则式 全能匹配URL(UBB)

PHP 正则式 全能匹配URL&#xff08;UBB&#xff09; 语言&#xff1a;PHP 注明&#xff1a;正则式 无语言限制&#xff08;js、PHP、JSP、ASP、VB、.net、C#...&#xff09;一切皆可。 简介&#xff1a;PHP UBB 正则式 全能匹配URL 自动加超级链接。网上找了很多都不匹配或…...

hadoop shell操作 hdfs处理文件命令 hdfs上传命令 hadoop fs -put命令hadoop fs相关命令 hadoop(十三)

hadoop fs -help rm 查看rm命令作用 hadoop fs 查看命令 1. 创建文件夹&#xff1a; # hdfs前缀也是可以的。更推荐hadoop hadoop fs -mkdir /sanguo 2.上传至hdfs命令&#xff1a; 作用&#xff1a; 从本地上传hdfs系统 &#xff08;本地文件被剪切走&#xff0c;不存在了&…...

redis-cluster集群

1.redis-cluster集群 redis3.0引入的分布式存储方案 集群由多个node节点组成&#xff0c;redis数据分布在这些节点之中。 在集群之中分为主节点和从节点 集群模式当中&#xff0c;主从一一对应&#xff0c;数据写入和读取与主从模式一样&#xff0c;主负责写&#xff0c;从…...

Hfish安全蜜罐部署

一、Hfish蜜罐介绍 HFish蜜罐官网 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷…...

Apache POI(Java)

一、Apache POI介绍 Apache POI是Apache组织提供的开源的工具包&#xff08;jar包&#xff09;。大多数中小规模的应用程序开发主要依赖于Apache POI&#xff08;HSSF XSSF&#xff09;。它支持Excel 库的所有基本功能; 文本的导入和导出是它的主要特点。 我们可以使用 POI 在…...

P8599 [蓝桥杯 2013 省 B] 带分数(dfs+全排列+断点判断)

思路&#xff1a;1.深度枚举所有排列情况 2.设置为每个排列设置两个断点&#xff0c;分为三部分&#xff1a;a,b,c 3.转换为乘法判断条件&#xff0c;满足加一 代码如下&#xff1a;&#xff08;可用next_permutation全排列函数代替dfs&#xff09; #include<iostream>…...

PS右边的图层窗口没有显示出来?

问题描述&#xff1a;PS右边的图层窗口没有显示出来&#xff1f; 解决步骤&#xff1a; 键盘F7快捷键即可调出来。...

Sealos 云操作系统私有化部署教程

Sealos 私有云已经正式发布了&#xff0c;它为企业用云提供了一种革命性的新方案。Sealos 的核心优势在于&#xff0c;它允许企业在自己的机房中一键构建一个功能与 Sealos 公有云完全相同的私有云。这意味着企业可以在自己的控制和安全范围内&#xff0c;享受到公有云所提供的…...

信息系统的安全保护等级的五个级别

信息系统的安全保护等级分为五级&#xff1a;第一级为自主保护级、第二级为指导保护级、第三级为监督保护级、第四级为强制保护级、第五级为专控保护级。 法律依据&#xff1a;《信息安全等级保护管理办法》第四条 信息系统的安全保护等级分为以下五级&#xff1a;   &#…...

c语言使用modbus库

Modbus是一种串行通信协议&#xff0c;被广泛用于连接工业电子设备。Modbus库可以提供用于实现Modbus通信的功能。 以下是一个简单的示例&#xff0c;展示了如何在C语言中使用Modbus库来读取一个Modbus设备中的保持寄存器。 #include <stdio.h> #include <modbus.…...

【Flask使用】全知识md文档,4大部分60页第3篇:Flask模板使用和案例

本文的主要内容&#xff1a;flask视图&路由、虚拟环境安装、路由各种定义、状态保持、cookie、session、模板基本使用、过滤器&自定义过滤器、模板代码复用&#xff1a;宏、继承/包含、模板中特有变量和函数、Flask-WTF 表单、CSRF、数据库操作、ORM、Flask-SQLAlchemy…...

芯片的测试方法

半导体的生产流程包括晶圆制造和封装测试&#xff0c;在这两个环节中分别需要完成晶圆检测(CP, Circuit Probing)和成品测试(FT, Final Test)。无论哪个环节&#xff0c;要测试芯片的各项功能指标均须完成两个步骤&#xff1a;一是将芯片的引脚与测试机的功能模块连接起来&…...

网络安全等级保护2.0国家标准

等级保护2.0标准体系主要标准如下&#xff1a;1.网络安全等级保护条例2.计算机信息系统安全保护等级划分准则3.网络安全等级保护实施指南4.网络安全等级保护定级指南5.网络安全等级保护基本要求6.网络安全等级保护设计技术要求7.网络安全等级保护测评要求8.网络安全等级保护测评…...

从根到叶:随机森林模型的深入探索

一、说明 在本综合指南中&#xff0c;我们将超越基础知识。当您盯着随机森林模型的文档时&#xff0c;您将不再对“节点杂质”、“加权分数”或“成本复杂性修剪”等术语感到不知所措。相反&#xff0c;我们将剖析每个参数&#xff0c;阐明其作用和影响。通过理论和 Python 实践…...

python数据结构与算法-15_堆与堆排序

堆(heap) 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序&#xff0c;中间又穿插了一把树和二叉树&#xff0c; 本章我们开始介绍另一种有用的数据结构堆(heap)&#xff0c; 以及借助堆来实现的堆排序&#xff0c;相比前两种排序算法要稍难实现一些。 最后我…...

vscode提交代码到Gitee(保姆教程)

Visual Studio Code&#xff08;VSCode&#xff09; 提交代码到Gitee&#xff08;保姆教程&#xff09; 1 环境配置1.1 git本地安装1.2 Vscode安装1.3 配置注册gitee账号 2 Vscode代码提交到Gitee2.1 新建仓库2.2 Vscode提交代码 1 环境配置 电脑需要已经安装好的Vscode已经配…...

【洛谷算法题】P5714-肥胖问题【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5714-肥胖问题【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...