Django Ajax

【一】Json

【1】介绍

  • JSON(javascript object otaition)是一种轻量级数据交换格式
  • JSON使用了Javascript的一部分语法来定义其数据格式,但Json是独立于语言
  • Json采用完全独立于语言的文本格式,使得Json成为理想的数据交互语言,几乎所有的现代编程语言都也有工具可以解析Json
  • 它是一种键值对形式的数据结构,易于人的阅读和编写,也易于机器的解析
  • Json格式的提出
    • 目的取代繁琐笨重的XML格式

【2】格式

  • 属性名必须使用双引号
  • 能使用十六进制值
  • 能使用undefind
  • 能使用日期和函数对象
{
    "name": "John Doe",
    "age": 30,
    "is_student": false,
    "subjects": ["Math", "English", "Science"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}

【3】数据格式转换

请添加图片描述

【二】Ajax

【1】介绍

(1)概念

  • AJAX(全称:Asynchronous JavaScript and XML,异步的Javascript和和XML)
  • AJAX是一种无需重新加载整个页面的情况下,能够更新部分网页的技术
  • 简单说:AJAX是一种用于创动态网页的编程技术
  • 这意味着网页再被用户查看和交互的同时,可以与服务器进行数据交换和页面更新。
  • 尽管名字中含有XML,但是在实践中,数据格式通常是JSON,并非XML
  • 简单的将:异步交互局部刷新

(2)大致工作原理

  1. 用户在浏览器进行操作(例如:点击一个按钮)
  2. Javascript创建一个XMLHttpRequest对象,然后向服务器发送请求
  3. 服务器处理这个请求
  4. 服务器将响应发送回网页
  5. Javascript读取响应,然后对网页进行响应的更新
  • 关键:
    • 关键是XMLHttpRequest对象
    • 这个对象是AJAX的主要接口,他提供了浏览器和服务器之间的进行异步通信的能力
  • 请求方式
    • 既可以发送get请求又可以发送post请求

(3)请求方式小结

  • 浏览器地址输入URL回车:GET请求
  • a标签的跳转:GET请求
  • form表单:既可以GET也可以POST
  • AJAX:既可以GET也可以POST

【2】加法案例

(1)前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

</head>
<body>

<div>number_one: <input type="text" id="num1"></div>
<div>number_two: <input type="text" id="num2"></div>
<div>result: <input type="text" id="result"></div>
<button id="btn_result">求和计算</button>

<script>
    {#等待页面加载完毕#}
    $(document).ready(
        {#给按钮绑定事件#}
        $("#btn_result").click(function () {
            {#异步触发AJAX#}
            $.ajax(
                {
                    {#提交数数据路径, 和action一样#}
                    url: "",
                    {#提交方式#}
                    type: "post",
                    {#表示期望从数据库返回的数据类型(json、xml、script、html)#}
                    dataType:"json",
                    {#提交给后端的数据, 键值可以直接写#}
                    data: {
                        number1: $("#num1").val(),
                        "number2": $("#num2").val()
                    },
                    {#回调函数,data是后端返回的数据#}
                    success: function (data) {
                        console.log(data, typeof data)
                        {#102 string#}
                        $("#result").val(data)
                    }
                }
            )
        })
    )
</script>


</body>
</html>

(2)后端

from django.shortcuts import render, HttpResponse, JsonResponse


def home(request):
    if request.method == "POST":
        data = request.POST
        print(data)
        num1 = data.get("number1")
        num2 = data.get("number2")
        result = int(num1) + int(num2)
        return HttpResponse(result)
		return JsonResponse(result)
        
    return render(request, 'home.html')

(3)不同方式数据返回

  • 在Django框架中,HttpResponseJsonResponse是两种不同的响应方式。

    • HttpResponse通常用于返回文本数据
    • JsonResponse用于返回JSON格式的数据
  • 如果后端使用HttpResponse返回数据

    • 那么数据(包括字典)将作为字符串返回,客户端(例如JavaScript)需要手动对其进行解析或反序列化。
    • 例如,如果返回的是JSON格式的字符串,那么在JavaScript中,需要使用JSON.parse()函数将其转换为JavaScript对象。
    • 或者在后端中使用json.dumps()方法将数据转换成
  • 如果后端使用JsonResponse返回数据

    • 那么Django将自动将Python字典或列表转换为JSON格式的字符串。
    • 在客户端,如果使用的是JavaScript的fetch API或jQuery的$.ajax方法(并且dataType参数被设置为'json'),那么这些函数将自动将JSON字符串转换为JavaScript对象,无需手动进行反序列化。
<script>
    {#等待页面加载完毕#}
    $(document).ready(
        {#给按钮绑定事件#}
        $("#btn_result").click(function () {
            {#异步触发AJAX#}
            $.ajax(
                {
                    {#提交数数据路径, 和action一样#}
                    url: "",
                    {#提交方式#}
                    type: "post",
                    {#表示期望从数据库返回的数据类型(json、xml、script、html)#}
                    dataType: "json",
                    {#提交给后端的数据, 键值可以直接写#}
                    data: {
                        number1: $("#num1").val(),
                        "number2": $("#num2").val()
                    },
                    {#回调函数,data是后端返回的数据#}
                    success: function (data) {
                        console.log(data, typeof data)
                        {#{message: 'OK', result: 7712}#}
                        {# 'object'#}
                        $("#result").val(data.result)
                    }
                }
            )
        })
    )
</script>
def home(request):
    if request.method == "POST":
        data = request.POST
        print(data)
        num1 = data.get("number1")
        num2 = data.get("number2")
        res = {
            "message": "OK",
            "result": int(num1) + int(num2)
        }
        return JsonResponse(res)

    return render(request, 'home.html')

【三】前后端传输数据的编码格式(contentType)

  • 由于get请求数据是直接放在url后面的
    • url?username=bruce&password=123
  • 所以主要研究POST请求

【1】urlencoded

  • application/x-www-form-urlencoded(urlencoded)
    • 这是最常见的POST数据提交的方式。
    • 浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
    • 键值对都是通过**&符号分隔,键值之间等号(=**)连接。
      • 例如:key1=value1&key2=value2

【2】formdata

  • multipart/form-data(formdata)
    • 这种数据格式通常用于文件上传
    • 当表单中包含 <input type="file"> 时,就需要使用这种格式来提交表单。

【3】json

  • application/json(json)
    • 这种数据格式用于发送 JSON 格式的数据。
    • 在现代的Web应用中,这种格式越来越常见,特别是在构建 RESTful API 时。
    • form表单没有这种格式

【4】plain

  • 表单 <form>enctype 属性还可以设置为 text/plain

  • text/plain 是一种简单的数据格式

    • 它和 application/x-www-form-urlencoded 类似
    • 但是它不对字符进行URL编码
    • 这意味着,如果你的数据中包含特殊字符(例如空格、&=等),这些字符在 text/plain 格式中将保持原样,而不会被转换为URL编码。
      • 空格被转换为 +@ 被转换为 %40·
  • ext/plain 格式并不常用,因为它不进行URL编码,可能会导致数据传输过程中出现问题。

【四】AJAX传输数据编码格式

【1】request补充

(1).body

  • 在 Django 中,request.body 属性包含了 HTTP 请求的原始内容,它通常用于处理非表单数据的 POST 请求。
    • 比如,当发送 JSON、XML 或者其他类型的数据时,你会使用 request.body 来获取这些数据。
  • request.body 返回的是一个字节字符串
    • 所以如果你发送的是 JSON 数据,你需要使用 Python 的 json 模块来解析这个字节字符串
  • 需要注意的是,request.body 只能被读取一次
    • 因为它是从 socket 读取的,读取后数据就会被清空
    • 如果试图多次读取 request.body,你会得到一个空的字节字符串。
    • 如果需要多次使用请求的数据,你需要将它保存到一个变量中。
  • 要使用尽量放在最千面

(2).is_ajax()

  • is_ajax()是HttpRequest对象的一个方法

    • 它用于检查HTTP请求是否是一个AJAX请求
    • 这个方法检查HTTP请求头中的X-Requested-With字段是否为XMLHttpRequest
    • 如果是,则返回True,否则返回False
  • 需要注意的是,is_ajax()方法并不完全可靠

    • 因为它依赖于客户端设置正确的X-Requested-With头。
    • 如果一个恶意的客户端发送一个伪造的请求,并设置X-Requested-WithXMLHttpRequest,那么is_ajax()会错误地认为这是一个AJAX请求。

【2】默认格式

(1)前端界面

<button class="btn btn=success" id="b1">Click</button>

<script>
    $(document).ready(
        $("#b1").click(function () {
            $.ajax({
                    url: "",
                    type: "post",
                    data: {"username": "bruce", "password": "123"},
                    success: function (args) {
                    }}
            )
        })
    )
</script>

(2)后端

def home(request):
    body = request.body
    print(body, type(body))
    if request.method == "POST":
        data = request.POST
        print(data, type(data))
    return render(request, 'home.html')
# b'username=bruce&password=123' <class 'bytes'>
# <QueryDict: {'username': ['bruce'], 'password': ['123']}> <class 'django.http.request.QueryDict'>

(3)结果

  • 默认值是 'application/x-www-form-urlencoded; charset=UTF-8',这表示数据是以表单的形式提交的。
    • 特殊的字符串类型
    • 编码方式将每个键值对(key-value pair)转换为key=value的形式,并使用&符号连接多个键值对。

【3】Json格式

(1)前端页面

<button class="btn btn=success" id="b1">Click</button>

<script>
    $(document).ready(
        $("#b1").click(function () {
            $.ajax({
                    url: "",
                    type: "post",
                    contentType:"applications/json",
                    data: JSON.stringify({"username": "bruce", "password": "123"}),
                    success: function (args) {
                    }}
            )
        })
    )
</script>

(2)后端

def home(request):
    body = request.body
    print(body, type(body))
    if request.method == "POST":
        data = request.POST
        print(data, type(data))

    if body:
        # 先解码
        json_str = body.decode('utf-8')
        # 类型转换
        json_dict = json.loads(json_str)
        print(json_dict, type(json_dict))
    return render(request, 'home.html')

b'{"username":"bruce","password":"123"}' <class 'bytes'>
<QueryDict: {}> <class 'django.http.request.QueryDict'>
{'username': 'bruce', 'password': '123'} <class 'dict'>
# 在没有设置类型时
# b'{"username":"bruce","password":"123"}' <class 'bytes'>
# <QueryDict: {'{"username":"bruce","password":"123"}': ['']}> <class 'django.http.request.QueryDict'>

(3)结果

  • contentType:"applications/json"
    
  • 首先在没有上述设置之前

    • 默认按照urlencoded格式
    • 是特殊的字符串格式
    • 所以在POST中看到的是
      • <QueryDict: {'{"username":"bruce","password":"123"}': ['']}> <class 'django.http.request.QueryDict'>
      • 将所有的数据当成连连在一起的字符,作为一个键值传入
  • 在添加上述设置以后

    • 我们在POST中拿不到任何数据了,是一个空的querydict
    • 我们此时只能在body中拿去数据
    • 但是该数据是字节字符串
      • 所以需要先解码
      • 在使用json.loads()转换格式后
      • 才可以拿到想要的数据

【4】文件格式

(1)前端界面

<p>username: <input type="text" id="d1" name="username"></p>
<p>username: <input type="password" id="d2" name="password"></p>
<p>file: <input type="file" id="d3" name="file"></p>
<button class="btn btn-success" id="b1">submit</button>

<script>
    $("#b1").on('click', function () {
        {#传输文件需要内置对象formdata#}
        let formDataObj = new FormData();
        formDataObj.append('username', $("#d1").val());
        formDataObj.append('password', $("#d2").val());
        formDataObj.append('file', $("#d3")[0].files[0]);

        $.ajax({
            url: "",
            type: "post",
            data: formDataObj,
            {#不需要使用任何编码,django后端能自动识别formdate对象#}
            contentType: false,
            {#告诉浏览器不要对我的数据进行处理#}
            processData: false,
            success: function (args) {
            }
        })
    })
</script>

(2)后端

def home(request):
    if request.is_ajax() and request.method == "POST":
        print(request.POST)
        print(request.FILES)

    return render(request, 'home.html')
# <QueryDict: {'username': ['456'], 'password': ['123']}>
# <MultiValueDict: {'file': [<InMemoryUploadedFile: 53efb9d8079c6e4f904ed602f5c1e4e.png (image/png)>]}>

(3)结果

  • 想要传输文件需要

    • javascript内置对象
      • formdata
      • 可以通过append方法
      • 添加在键值对
      • 文件内容在$("#d1")[0].files[0]
    • 两个配置
      • 不使用任何编码contentType: false,后端自动识别formdata
      • 不对数据进行任何处理:processData: false
  • 后端可以通过is_ajax和post一起来判断

    • 是否是ajax的post请求
    • 文件在request.FILES
    • 其他键值对在request.POST

【五】sweetleart

【1】官网

(1)sweetleart1

  • SweetAlert1
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
  • 其他需要的资源
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

(2)sweetleart2

  • sweetalert2 CDN by jsDelivr - A CDN for npm and GitHub

  • SweetAlert2

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
  • 其他资源对象
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

【2】使用

(1)弹框后跳转

<button class="btn btn-success" id="b1">submit</button>

<script>
    $("#b1").on('click', function () {
        Swal.fire({
            position: "top-end",
            icon: "success",
            title: "Your work has been saved",
            showConfirmButton: false,
            timer: 1500
        }).then(function () {
            $.ajax({
                type: "POST",
                url: "",
                data: "",
                success: function () {
                        window.location.href = "https://www.baidu.com/";
                },
            });
        });
    });
</script>

(2)确认删除后跳转

  • 点击确认后将段落ID传递给后端
    • 后端返回可以的信息和新的地址
    • 然后自动跳转到新界面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</head>
<body>
<p id="p1">
    <button class="btn btn-success" id="b1">submit</button>
</p>
<script>
    $("#b1").on('click', function () {
        Swal.fire({
            title: "Are you sure?",
            text: "You won't be able to revert this!",
            icon: "warning",
            showCancelButton: true,
            confirmButtonColor: "#3085d6",
            cancelButtonColor: "#d33",
            confirmButtonText: "Yes, delete it!"
        }).then((result) => {
            if (result.isConfirmed) {
                var pId = $("#p1").attr("id");

                $.ajax({
                    type: "POST",
                    url: "",
                    data: {pId: pId},
                    success: function (response) {
                        if (response.flag) {
                            Swal.fire({
                                title: "Deleted!",
                                text: "Your file has been deleted.",
                                icon: "success"
                            }).then(() => {
                                window.location.href = response.url;
                            });
                        }
                    },
                });
            }
        });
    });
</script>
</body>
</html>
def home(request):
    if request.is_ajax() and request.method == "POST":
        data_dict = {"flag": True, "url": "https://www.baidu.com/"}
        return JsonResponse(data_dict)
    return render(request, 'home.html', locals())

【六】序列化组件

【0】前言

(1)为啥要用

  • 目前我们可以在后端通过models获得queryset对象

    • 然后直接用locals()直接传送给前端
  • 但是在前后端分离项目中

    • queryset对象的内容格式是多种多样的

    • 前端工程师无法简单的了解你的数据格式

    • 所以需要一种统一的格式

    • 一般都是将数据处理成列表套字典的形式

    • [{}, {}, {}...]
      

(2)模型数据准备

  • 模型
from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField(null=True)
    gender_choices = (
        (1, "男"),
        (2, "女"),
        (3, "保密"),
    )
    gender = models.IntegerField(choices=gender_choices, default=3)
  • 批量添加数据(后续具体讲解)
import random
from django.test import TestCase
# Create your tests here.
import os

if __name__ == '__main__':
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_test.settings')
    import django
    django.setup()

from app01 import models
user_list = []
for i in range(5):
    obj = models.User(name=f"bruce{i}", age=20+i, gender=random.choice([1, 2, 3]))
    user_list.append(obj)
models.User.objects.bulk_create(user_list)

【1】JsonResponse

  • 后端发送数据
def home(request):
    user_queryset = models.User.objects.all()
    user_list = []
    for user_obj in user_queryset:
        user_dict = {"name": user_obj.name,
                     "age": user_obj.age,
                     "gender": user_obj.gender}
        user_list.append(user_dict)
    return JsonResponse(user_list, safe=False)

  • 前端拿到的数据格式
[
    {
        "name": "bruce0",
        "age": 20,
        "gender": 2
    },
    {
        "name": "bruce1",
        "age": 21,
        "gender": 1
    },
    {
        "name": "bruce2",
        "age": 22,
        "gender": 2
    },
    {
        "name": "bruce3",
        "age": 23,
        "gender": 3
    },
    {
        "name": "bruce4",
        "age": 24,
        "gender": 2
    }
]

【2】serializers组件

  • 后端
from django.core import serializers
def home(request):
    user_queryset = models.User.objects.all()
    user_str = serializers.serialize('json', user_queryset)
    print(type(user_str))
    # <class 'str'>
    return HttpResponse(user_str)
  • 前端
    • 这里面的信息就更加丰富了
    • 有model、pk和fields
    • 其中fields中是模型型中的具体数据
[{"model": "app01.user", "pk": 1, "fields": {"name": "bruce0", "age": 20, "gender": 2}}, {"model": "app01.user", "pk": 2, "fields": {"name": "bruce1", "age": 21, "gender": 1}}, {"model": "app01.user", "pk": 3, "fields": {"name": "bruce2", "age": 22, "gender": 2}}, {"model": "app01.user", "pk": 4, "fields": {"name": "bruce3", "age": 23, "gender": 3}}, {"model": "app01.user", "pk": 5, "fields": {"name": "bruce4", "age": 24, "gender": 2}}]

【3】小结

  • JsonResponse
    • 为了统一的列表套字典格式
    • 需要手动创建该格式
  • serializers
    • 首先需要导入模块
    • 然后用模块转换数据格式
    • 最后HttpResponse传输数据
  • 都有的问题
    • 这里的性别在前端开来,只有三个数字
    • 不知具体含义
    • 所有都还需要有一个具体字段数值说明书

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从这15个简洁B端系统控制台页面,你悟到了什么?

从这15个简洁英文 B 端系统控制台页面中&#xff0c;我可以得出以下一些结论&#xff1a; 系统注重简洁性&#xff1a;这些页面采用了简洁的设计风格&#xff0c;避免了过多的装饰和冗余的信息&#xff0c;使用户界面更加清晰和易于使用。用户导航清晰&#xff1a;这些页面通常…

get_ipython()函数使用

今天发现一个很有意思的函数&#xff0c; 在jupyter notebook中&#xff0c;我也可以用命令实现这些值 get_ipython().system(nvidia-smi)结果如下 get_ipython().system(pwd)

学习大数据之JDBC(使用JAVA语句进行SQL操作)

文章目录 DCL语句创建用户授权用户撤销授权查看权限删除用户修改用户密码修改普通用户密码 JDBCjdbc介绍JDBC准备JDBC开发步骤以及详解JDBC注册驱动JDBC获取连接JDBC实现增删改操作JDBC 工具类的使用 DCL语句 我们现在默认使用的都是root用户&#xff0c;超级管理源&#xff0…

计算机基础系列 —— 汇编语言

Same hardware can run many different programs(Software) 文中提到的所有实现都可以参考&#xff1a;nand2tetris_sol&#xff0c;但是最好还是自己学习课程实现一遍&#xff0c;理解更深刻。 我们在之前的文章里&#xff0c;构建了 Register、RAM 和 ALU&#xff0c;使得我…

智慧物联-能源分析平台

物联能源分析平台是为了满足企业对能源管理和节能减排的需求而开发的一套在线平台。随着能源问题日益凸显&#xff0c;企业对能源的使用和管理面临着越来越大的挑战。因此&#xff0c;开发一个能够帮助企业实时监测、分析和优化能源消耗的平台变得尤为重要。 随着工业化和城市…

apifox创建接口含中文字符报错的两种解决方案

针对apifox的含中文报错解决方法&#xff1a; 方法一&#xff1a;创建相应接口后&#xff0c;在设置中URL自动编码为WHATING。 方法二&#xff1a;直接将浏览器的url复制到apifox中&#xff0c;浏览器会自动解析配置中文转换路径。

带大家做一个,易上手的家常水煮肉片

首先 我们泡一些腐竹 如果不会泡 可以查看我的文章 泡软超时干腐竹方法 然后 拿一块猪瘦肉 切 相对厚一点点的薄片 一包豆芽 洗干净 肉片装在大碗中 倒入 小半勺食用盐 适量胡椒粉 倒入一勺生抽 适量蚝油 一点点老抽 一勺淀粉 抓拌均匀 切一些 姜末 蒜末 一把花椒 七八个干…

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁&#xff1b; 1.1.2 防止死锁 需要确保在任何故障场景下&#xff0c;都不会出现死锁&#xff1b; 1.2.3 可重入 特殊的锁机制&#xff0c;它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…

Embedding #notebook

Embedding 上一个篇章huggingface tokenizer #notebook我们讲解了tokenizer的使用&#xff0c;这一个篇章我们继续讲解所谓的embedding&#xff0c;这是通向模型的第一个层&#xff0c;它实际上就是一个全连接层&#xff0c;那么从一个text文本’我爱中南大学’&#xff0c;经…

【微服务】以模块化单体架构开发微服务应用

目录 推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战我们知道,起初,单体应用有显著的优势:它们更容易开发和部署。从开发人员的角度来看,这种简单性是有益的。一切都是集中的,可以快速更新任何部分的业务逻辑并立即看到结果。这种开…

matlab 去除海图的右上角的刻度

matlab 去除海图的右上角的刻度 matlab 去除海图的右上角的刻度 去除&#xff1a; 图片 未去除&#xff1a; 本期不提供图片的代码&#xff1a;以后收费发布&#xff1b;整理中&#xff1b; 本期思路解决方法来自物理海洋科研群中 只需要把m_grid的代码484-485和569-570行…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题&#xff1a; 由于代码是串行方式&#xff0c;流程大致为&#xff1a;开…

蓝桥杯day12刷题日记

P8720 [蓝桥杯 2020 省 B2] 平面切分 思路&#xff1a;首先借用dalao的图解释一下&#xff0c;又多出一条与当前平面任意一条直线都不重合线时&#xff0c;多了的平面是交点数1&#xff0c;所以用双层循环每次往里面加一条直线&#xff0c;计算交点 #include <iostream>…

生日悖论与概率分析:如何运用随机算法解答生日问题

生日&#xff0c;这个我们每年都会庆祝的特殊日子&#xff0c;在概率学和随机算法中却隐藏着许多有趣的秘密。今天&#xff0c;我们就来探讨一下如何利用概率分析和随机算法来解决与生日有关的几个常见问题&#xff1a;一次聚会需要邀请多少人&#xff0c;才能让其中3人的生日很…

嵌入式多层总线矩阵结构介绍

嵌入式系统中&#xff0c;多层总线矩阵结构是一种常见的总线连接方式&#xff0c;用于连接处理器核、内存、外设和其他系统组件&#xff0c;以实现数据传输和控制信号的交换。本文将介绍嵌入式多层总线矩阵结构的基本概念、主要特点以及在实际应用中的优势。 以下是我整理的关…

阿里云服务器价格购买价格表,2024新版报价查询

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

【算法每日一练]-动态规划(保姆级教程 篇17 状态压缩)#POJ1185:炮兵阵地 #互不侵犯

目录 今日知识点&#xff1a; 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1和i-2行进行不断转移 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1行进行状态匹配&#xff0c;然后枚举国王数转移 POJ1185&#xff1a;炮兵阵地 思路&#xff1a; 题目&#xff1a;互…

代码随想录|Day27|贪心02|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

122.买卖股票的最佳时机II 本题可以将最终利润分解为每日利润&#xff1a; 假如第 0 天买入&#xff0c;第 3 天卖出&#xff0c;那么利润为&#xff1a;prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[2] - prices[1]) (prices[1] - prices[0])。 如下图所…

机器人流程自动化技术(RPA)金融应用指南

1 范围 本文件提供了机器人流程自动化技术在金融领域应用的参考框架、技术设计、场景应用、安全管理、 成效评估等指南。 本文件适用于金融机构开展机器人流程自动化技术应用的产品设计、软件开发、系统评估等。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成…

深入探索JDK动态代理:从入门到原理的全面解析

文章目录 基本概念入门案例实现JDK动态代理的步骤入门实操拓展--动态生成代理类的几种方法方式一&#xff1a;通过getProxyClass方法获取代理实例方式二&#xff1a;通过newProxyInstance方法获取代理实例&#xff08;常用&#xff01;&#xff09;方式三&#xff1a;通过Lambd…