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

drf知识--10

接口文档

# 后端把接口写好后:
    登录接口:/api/v1/login  --->  post---name pwd
    注册接口
     查询所有图书带过滤接口

# 前后端需要做对接,对接第一个东西就是这个接口文档,前端照着接口文档开发

        公司3个人,每个人开发了10个接口,3个人都要同时写接口文档

# 接口文档的编写形式:
           1、world,md,编写,大家都可以操作,写完放在git,公司的文档管理平台上
           2、第三方的接口文档平台(收费)  https://www.showdoc.com.cn/
           3、公司自己开发接口文档平台 : 就跟第三方很像
           4、公司使用开源的接口文档平台,搭建
                YAPI:百度开源的、  https://zhuanlan.zhihu.com/p/366025001
           5、项目自动生成接口文档--drf
                coreapi、swagger

# 接口文档的规范:
        描述、地址、请求方式、编码方式
        请求参数--参数解释,必传,参数类型
        请求体--参数解释,必传,参数类型
        返回示例--返回数据字段解释
        错误码解释
# 使用coreapi自动生成接口文档:
    * 安装:  pip  install coreapi               

总路由:
from django.contrib import admin
from rest_framework.documentation import include_docs_urls
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('docs/', include_docs_urls(title='站点页面标题')),path('app/',include('app01.urls')),
]app01路由:
from rest_framework.routers import SimpleRouter
from . import views
router=SimpleRouter()
router.register('books', views.BookView, 'books')
router.register('pubilsh',views.PublishView,'pulish')
urlpatterns = [
]
urlpatterns += router.urls
 视图类加注释: 
class BookView(GenericViewSet, ListModelMixin):'''返回所有图书接口'''queryset = Book.objects.all()serializer_class = BookSerializer# throttle_classes = [CommonThrottling]# throttle_classes = [MyThrottling]
class PublishView(ListModelMixin, RetrieveModelMixin, CreateModelMixin, GenericViewSet):"""list:返回出版社列表数据retrieve:返回出版社详情数据create:新增出版社"""queryset = Book.objects.all()serializer_class = BookSerializer
序列化类:
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'name', 'price', 'publish', 'authors', 'publish_detail', 'author_list']extra_kwargs = {'name': {'help_text':"出版社名字",'required':False},'publish': {'write_only': True,'help_text':"出版社id号"},'authors': {'write_only': True},'publish_detail': {'read_only': True},'author_list': {'read_only': True},}
配置文件:
INSTALLED_APPS = [...'app01.apps.App01Config','rest_framework','rest_framework_simplejwt',
]REST_FRAMEWORK = {'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

       *表模型或序列化类的字段上写 help_text--->会显示在接口文档的字段介绍上
       *访问地址: http://127.0.0.1:8000/docs/

jwt介绍

# 概念:JWT全名Json web token ,常被用于认证,它是一个前端登录认证的方案,是token    的一种,jwt本质就是token
# cookie,session,token发展史:                                                                                                          https://www.cnblogs.com/liuqingzheng/articles/17858187.html

# token:
           *不在服务端存储(session在服务端存储)
           *token 有三段,需要有个加密方式和秘钥,来签发token,和验证token
# jwt-token串,构成:三段式,使用 . 分割base64编码

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
# 第一段:头部:header   -eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9-声明加密算法,公司信息...# 第二段:荷载:payload  -eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9-用户id,用户信息,token过期时间exp,token签发时间iat...# 第三段:签名 signature -TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ-通过某种加密方式+秘钥,把头和荷载加密后得到-使用它,做到防篡改,防伪造

base64的编码和解码

#  base64 是编码解码方式,不是加密方式

import json
import base64
user_info={'user_id':999,'username':'lqz'}
# 转成字符串,使用base64编码
user_info_str=json.dumps(user_info)
print(user_info_str)# 使用base64编码--->bytes格式
res=base64.b64encode(user_info_str.encode('utf-8'))
print(res)  #  eyJ1c2VyX2lkIjogOTk5LCAidXNlcm5hbWUiOiAibHF6In0=#base64解码
res=base64.b64decode('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9')
print(res)

# base64特点:
           大小写数字组合,有时候,结尾会带  =
            base64编码后的字符串,一定是4个倍数,如果不足,用 = 补齐,最多补3个=

# base64实际用途:
    1、用在jwt中
    2、前后端交互,可能使用base64编码后交互
                百度登录:密码先加密,使用base64编码,向后端发送
    3、图片使用base64 前后端传递    12306就是

jwt的快速使用

# JWT是前后端登录认证的方式:

登录 --签发token(登录接口)
                    1 用户携带用户名,密码到后端
                    2 校验用户名密码是否正确,如果正确
                    3 签发token,按照jwt逻辑生成三段,返回给前端
认证token---认证类
                    1 用户访问我们需要登录的接口
                    2 携带token过来--请求头,请求地址...
                    3 后端验证用户携带的token,是否被篡改,是否是伪造的,如果没问题
                    4 认证通过,继续后续的逻辑

# jwt快速使用:

1、安装, drf中借助于第三方:
                pip install djangorestframework-simplejwt

2、路由层:

from rest_framework.routers import SimpleRouter
from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refresh
from . import views
from django.urls import pathrouter=SimpleRouter()
router.register('books', views.BookView, 'books')
router.register('pubilsh',views.PublishView,'pulish')
urlpatterns = [path('login/', token_obtain_pair),    # 登录,签发token-r-》只有这个用的多path('verify/', token_verify),        # 验证token 是否有效path('refresh/', token_refresh),      # token有过期时间,过期不能使用,在过期之前,可以刷新
]

3、配置文件:

INSTALLED_APPS = [...'app01.apps.App01Config','rest_framework','rest_framework_simplejwt',
]import datetime
SIMPLE_JWT = {# token有效时长'ACCESS_TOKEN_LIFETIME': datetime.timedelta(minutes=30),# token刷新后的有效时间'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),
}

4、迁移表,创建超级用户--- createsuperuser
5、测试登录接口,验证接口,刷新接口

# 双token认证:
    access,真正使用的token
    refresh:用来更新access
    access过期时间很短,过期后,需要重新生成access的token保证token的安全

只要没过期,之前签发的access [token] 和后来刷新签发的token都能用

双token认证

# 单token
     用户登录,签发token----有过期时间
     3 minute----重新登录
     7 天,7天都不需要登录---被别人截货到---不安全
# 双token
    用户登录,签发了两个token,目前的verify验证接口,只要是它签的token,都会认证通过
                access:过期时间短 3分
                refresh:过期时间长7天
    用户正常用:都用access,不用refresh
    * access一旦过期,可以通过refresh这个token,调用刷新接口,再签发一个access
    * 通过refresh再次签发token这个过程,是不需要登录的,对用户就无感知
       后续再用access这个token发送请求
优点:access一旦被别人截取到,拿着模拟发送请求,只能在有效时间内,很快就会失效

# 认证类:不能使用refresh的token

人脸识别逻辑

# 人脸识别---登录---登录后还要签发token
  登录:
        1 用户名密码
        2 手机号验证码
        3 一键登录
        4 扫码登录
        5 人脸登录
# 登录成功了,付款,付大额,弹出人脸识别,做二次认证

登录里的认证类

# 认证类:局部配置、全局配置

局部配置:必须配合权限类

class BookView(APIView):# 局部加:认证类--->带来认证信息,会校验,不带认证信息,不管,需要配合一个权限类使用authentication_classes = [JWTAuthentication]  # 认证类permission_classes = [IsAuthenticated]  # 权限类,没登录的用户没权限

# 前端访问:格式必须如下,放在请求头中
                Authorization :Bearer access的token


全局使用:它写的登录,去除了认证

REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication', # 认证类],'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',  # 权限类],}

# 验证使用 refresh的token能不能认证通过

定制返回格式

# 1 我们的目标,定制返回格式

{code:100,msg:'登录成功',username:'lqz',access:asdfasdf.asdfasdf.asdfasdfrefresh:asdfas.ere.we}

# 2 顺便看了一下荷载内容
      access和refresh是有区分的   

# 第二段:荷载:payload  
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
用户id,用户信息,token过期时间exp,token签发时间iat...

# 3 步骤

写个序列化类:  # 重写validate ,返回什么,前端看到什么
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):# 往荷载中加东西@classmethoddef get_token(cls, user):  # user就是登录成功,查到的用户token = super().get_token(user)  # 签发tokentoken['name'] = user.username  # 往荷载中加用户名return tokendef validate(self, attrs):   # 全局钩子old_data = super().validate(attrs)data = {'code': 100,'msg': '登录成功成功','username': self.user.username,'refresh': old_data['refresh'],'access': old_data['access']}return data
配置文件配置
SIMPLE_JWT = {"TOKEN_OBTAIN_SERIALIZER": "app01.serializer.MyTokenObtainPairSerializer",
}
视图层:    # 定制返回格式(单纯做定制)
from rest_framework.response import Response
from rest_framework.views import APIViewclass BookView(APIView):def get(self, request):return Response("好多书啊")
路由层:
from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refresh
from django.urls import path
urlpatterns = [path('login/', token_obtain_pair),    # 登录,签发token-r-》只有这个用的多path('verify/', token_verify),        # 验证token 是否有效path('refresh/', token_refresh),      # token有过期时间,过期不能使用,在过期之前,可以刷新
]

多方式登录之面条版

# 用户输入:用户名或手机号或邮箱 +密码 都能登录,签发token
        username:手机号/邮箱/名

        password:xxx
# 使用auth的user表
# 新建项目没问题,如果是老项目,迁移过数据了,按照如下操作:
            1 删库
            2 删除项目中app的迁移文件
            3 删除源码中 admin和auth中得迁移记录
            4 扩写auth的user表
            5 重新迁移

面条版登录(简单版)

moedels.py
from django.db import models
from django.contrib.auth.models import AbstractUserclass User(AbstractUser):mobile = models.CharField(max_length=24)icon = models.ImageField(upload_to='icon', default='icon/default.png')
# 迁移表格:
python manage.py makemigrations
python manage.pymigrate
# 创建超级用户:
python manage.py createsuperuser
class UserView(APIView):authentication_classes = ()permission_classes = ()def post(self, request):# 1  request取出用户名和密码username = request.data.get('username')password = request.data.get('password')# 2  使用正则判断用用户名是邮箱,手机号还是用户名,分别去查询当前用户if re.match(r'^1[3-9][0-9]{9}$', username):user = User.objects.filter(mobile=username).first()elif re.match(r'^.+@.+$', username):user = User.objects.filter(email=username).first()else:user = User.objects.filter(username=username).first()if user and user.check_password(password):# 3 校验密码# 4 签发tokenrefresh = TokenObtainPairSerializer.get_token(user)# 5 返回给前端return Response({'code': 100, 'msg': '成功', 'access': str(refresh.access_token), 'refresh': str(refresh)})else:return Response({'code': 101, 'msg': '用户名或密码错误'})
urls.py
path('books/', views.UserView.as_view())

多方式登录之升级版1

views.py
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from .serializer import LoginSerializerclass UserView(GenericAPIView):authentication_classes = ()permission_classes = ()serializer_class = LoginSerializerdef post(self, request):ser = self.get_serializer(data=request.data)if ser.is_valid():  # 会执行字段自己的校验(没有),执行局部钩子(没有),执行全局钩子(写了:校验用户,签发token)# context 是视图类和序列化列之间沟通的桥梁access = ser.context.get('access')refresh = ser.context.get('refresh')username = ser.context.get('username')return Response({'code': 100, 'msg': '成功', 'username': username, 'access': access, 'refresh': refresh})else:return Response({'code': 101, 'msg': '用户名或密码错误11'})
serializers.py
from rest_framework import serializers
from .models import User
import re
from rest_framework.exceptions import ValidationError
from rest_framework_simplejwt.serializers import TokenObtainPairSerializerclass LoginSerializer(serializers.Serializer):username = serializers.CharField()password = serializers.CharField()def validate(self, attrs):    # 写全局钩子# 校验用户,签发tokenusername = attrs.get('username')password = attrs.get('password')# 2  使用正则判断用用户名是邮箱,手机号还是用户名,分别去查询当前用户if re.match(r'^1[3-9][0-9]{9}$', username):user = User.objects.filter(mobile=username).first()elif re.match(r'^.+@.+$', username):user = User.objects.filter(email=username).first()else:user = User.objects.filter(username=username).first()if user and user.check_password(password):# 3 校验密码# 4 签发tokenrefresh = TokenObtainPairSerializer.get_token(user)self.context['access'] = str(refresh.access_token)self.context['refresh'] = str(refresh)self.context['username'] = user.usernamereturn attrselse:raise ValidationError('用户名或密码错误')

多方式登录之升级版2

# 直接在序列化类里输出格式

views.py
class UserView(GenericAPIView):authentication_classes = ()permission_classes = ()serializer_class = LoginSerializerdef post(self, request):ser = LoginSerializer(data=request.data)if ser.is_valid():  # 会执行字段自己的校验(没有),执行局部钩子(没有),执行全局钩子(写了:校验用户,签发token)# ser.validated_data # 字典,校验过后的数据return Response(ser.validated_data )else:return Response({'code': 101, 'msg': '用户名或密码错误11'})
serializers.py
class LoginSerializer(serializers.Serializer):username = serializers.CharField()password = serializers.CharField()def validate(self, attrs):    # 写全局钩子 # 校验用户,签发tokenusername = attrs.get('username')password = attrs.get('password')# 2  使用正则判断用用户名是邮箱,手机号还是用户名,分别去查询当前用户if re.match(r'^1[3-9][0-9]{9}$', username):user = User.objects.filter(mobile=username).first()elif re.match(r'^.+@.+$', username):user = User.objects.filter(email=username).first()else:user = User.objects.filter(username=username).first()if user and user.check_password(password):# 3 校验密码# 4 签发tokenrefresh = TokenObtainPairSerializer.get_token(user)data = {'code': 100,'msg': '登录成功成功','username': self.user.username,'refresh':str(refresh),'access': str(refresh.access_token)}return dataelse:raise ValidationError('用户名或密码错误')

今日思维导图:

相关文章:

drf知识--10

接口文档 # 后端把接口写好后: 登录接口:/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接,对接第一个东西就是这个接口文档,前端照着接口文档开发 公司3个人&#xff…...

探索 Vue 实例方法的魅力:提升 Vue 开发技能(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

mysql死锁排查

查看正在进行中的事务 SELECT * FROM information_schema.INNODB_TRX;字段解释trx_id唯一事务id号,只读事务和非锁事务是不会创建id的trx_state事务的执行状态,值一般分为:RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING.trx_started事务…...

若依项目(ruoy-vue)多模块依赖情况简要分析

主pom文件关键点分析 properties标签声明变量信息:版本号、编码类型、java版本spring-boot依赖形式:spring-boot-dependencies、pom、importdependencies中添加本项目内部模块,同时在modules中声明模块packaging打包选择pom设置打包maven-co…...

【普中开发板】基于51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于普中开发板51单片机的篮球计分器液晶LCD1602显示 1.主要功能:讲解视频:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接(可点击): 基于51单片机的篮球计分器液晶LCD1602显示 ( pr…...

按照层次遍历结果打印完全二叉树

按照层次遍历结果打印完全二叉树 按照推论结果&#xff1a; l 层首个节点位置 2h-l - 1l 层节点间距&#xff1a;2h-l1 - 1 编码实现 public static<E> void print(BinaryTree<E> tree) {List<List<Node<E>>> levelNodeList levelOrderTraver…...

基于SpringBoot的药店管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的药店管理系统,java项目…...

Java 泛型深入解析

Java 中的泛型是一种强大的编程特性&#xff0c;允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面&#xff0c;包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先&#xff0c;让我们看一个简单的泛型类的例子。在下面的代码中&a…...

Apache Doris (六十): Doris - 物化视图

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录...

【javaweb】tomcat9.0中的HttpServlet

2023年12月28日&#xff0c;周四晚上 目录 什么是HttpServlet tomcat中的HttpServlet由谁产生 什么是HttpServlet 在Tomcat中&#xff0c;HttpServlet 是 Java Servlet API 中的一个抽象类&#xff0c;用于简化基于HTTP协议的Servlet的开发。HttpServlet 扩展了 GenericServ…...

数据结构学习笔记——查找算法中的树形查找(B树、B+树)

目录 前言一、B树&#xff08;一&#xff09;B树的概念&#xff08;二&#xff09;B树的性质&#xff08;三&#xff09;B树的高度&#xff08;四&#xff09;B树的查找&#xff08;五&#xff09;B树的插入&#xff08;六&#xff09;B树的删除 二、B树&#xff08;一&#xf…...

python包chromadb安装失败总结

1&#xff0c;背景&#xff1a; 最近在学习langchain的课程&#xff0c;里面创建自己的知识库的Retrieval模块中&#xff0c;需要用到向量数据库。 所以按照官方的教程&#xff08;vectorstores&#xff09;&#xff0c;准备使用chroma的向量数据库。图片来源 2&#xff0c;问…...

机器学习(四) -- 模型评估(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…...

泊松分布与二项分布的可加性

泊松分布与二项分布的可加性 泊松分布的可加性 例 : 设 X , Y X,Y X,Y 相互独立 , X ∼ P ( λ 1 ) X\sim P(\lambda_1) X∼P(λ1​) , Y ∼ P ( λ 2 ) Y\sim P(\lambda_2) Y∼P(λ2​) , 求证 Z X Y ZXY ZXY 服从参数为 λ 1 λ 2 \lambda_1 \lambda_2 λ1​λ2​ …...

【PostgreSQL】约束-排他约束

【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束&#xff0c;用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…...

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习&#xff0c;并且关闭弹幕。 数组的定义&#xff1a;数组是一个容器&#xff0c;用来存储一批同种类型的数据。 下述图&#xff1a;是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢&#xff1f;为了解决在某些场景下&#xff0c;变…...

【C#】知识点实践序列之Lock的锁定代码块

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂之知识点实践序列》文章。 2024年第1篇文章&#xff0c;此篇文章是C#知识点实践序列之Lock知识点&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 本篇验证Lock锁定代…...

StringBad ditto (motto)

第12章 类和动态内存分配 StringBad ditto (motto): // calls StringBad (comst StringBad &) StringBad metoo - motto: // calls StringBad (const StringBad &) StringBad also StringBad (motto): // calls StringBad (const StringBad &) StringBad * pStri…...

Redis缓存击穿、缓存雪崩、缓存穿透

缓存击穿&#xff08;某个热点key缓存失效&#xff09; 概念 缓存中没有但数据库中有的数据&#xff0c;假如是热点数据&#xff0c;那key在缓存过期的一刻&#xff0c;同时有大量的请求&#xff0c;这些请求都会击穿到DB&#xff0c;造成瞬时DB请求量大、压力增大和缓存雪崩的…...

【PCB专题】Allegro封装更新焊盘

在PCB封装的绘制中&#xff0c;有时会出现需要更新焊盘的情况。比如在制作封装的过程中发现焊盘做的不对而使用PAD_Designer重新更新了焊盘。 那在PCB中如何更新已经修改过的焊盘呢&#xff1f; 打开封装&#xff0c;选择Tools->Padstack->Refresh... 选择Refresh all …...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...