人工智能和机器学习2 (复旦大学计算机科学与技术实践工作站)python调用百度AI、获取token,并利用opencv绘制分析图,做简单判断

news2024/9/9 4:28:11

前言

在现代科技的推动下,人工智能(AI)和机器学习(ML)逐渐成为各行各业的重要工具。百度AI开放平台作为全球领先的人工智能服务平台,为开发者提供了包括语音、图像、自然语言处理(NLP)等多项技术支持。本篇博客笔记旨在分享如何利用Python调用百度AI获取人体关键点数据,并使用OpenCV对结果进行可视化和简单分析。这不仅是对AI技术的实际应用,也是对机器学习领域的一次有益探索。

百度AI开放平台-全球领先的人工智能服务平台百度AI开放平台提供全球领先的语音、图像、NLP等多项人工智能技术,开放对话式人工智能系统、智能驾驶系统两大行业生态,共享AI领域最新的应用场景和解决方案,帮您提升竞争力,开创未来。icon-default.png?t=N7T8https://ai.baidu.com/登陆成功后打开“开放能力”中的“人脸与人体”找到右边的“人体关键点识别”点击进入,

点击“立即使用”

点击应用列表”——创建应用:

安装好Python环境后打开IDLE(如果友友们有用过其他Python环境的编辑器并且熟练的话也是可以的)小北就以IDLE为例子,首先点击File,新建一个文件,然后保存到一个专门的文件

(举个栗子:2024复旦科创)

(.py文件命名为“try1")

测试一下:

print(“hello”)

在不管去使用哪一个网络服务的时候我们可以学习看一下它的技术文档:

下拉”技术文档“找到(如果遇到任何技术问题可以参考)Access Token获取icon-default.png?t=N7T8https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu

一、获取Access Token

      在开始使用百度AI的API之前,需要先获取Access Token,这是一种用于验证和授权的凭证。

获取Token的步骤

  1. 创建应用:首先需要登录百度AI开放平台,导航到“人脸与人体”板块,选择“人体关键点识别”并创建一个新应用。获取API Key和Secret Key。

  2. 获取Access Token:利用API Key和Secret Key,通过百度提供的认证接口获取Access Token。

复制代码进行调试:

import requests
import json


API_KEY = 'xxx'
SECRET_KEY = 'xxx'

def main():
    url =f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={API_KEY}&client_secret={SECRET_KEY}"

    payload = ""
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    print(response.text)


if __name__ == '__main__':
    main()

找自己刚刚创建的应用并输入自己的: PI_KEY ='xxx' 和SECRET_KEY ='xxx',

 如果显示没有安装requests库:ModuleNotFoundError: No module named 'requests'

方法一:要使用清华大学的pip镜像源,你需要修改pip的配置文件或者在命令行中指定使用该镜像。

命令行临时使用:


pip install -i https://pypi.tuna.tsinghua.edu.cn/simple XXX

xxx替换为你想要安装的包名(requests)。

若出现CMD安装不成功,可以尝试:

方法二:打开IDLE安装文件夹的Scripts的终端再进行安装

成功会返还许多字典:

learn1.py(IDLE)

learn1.py(Pycharm)

其中最重要的是:(access_token)之后会用到验证我们的账户登录、凭证等等,友友们可以把它打印出来:(改写一下代码)

import requests



API_KEY = 'xxx'
SECRET_KEY = 'xxx'


def login():
    url =(f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials"
          f"&client_id={API_KEY}&client_secret={SECRET_KEY}")

    payload = ""
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)


    result =response.json()
    print(result)
    token =result['access_token']
    print('登录成功:', token)
    return token

if __name__ == '__main__':
    login()

结果显示:登录成功以及我们的access_token码

learn2.py(IDLE)

learn2.py(Pycharm)

 代码解释:最后这一个If是程序的入口。来解释一下这个login(),这个login()也没有的话其实这个整个代码是不会执行的,因为小北是创建了一个登录功能的函数,但是我们并没有使用它,然后所以说我们需要去使用它的话,我们就是通过加小括号去执行这个函数内部的功能,然后至于小北为什么要使用这个If呢因为这个是他在设计出考虑的一个点,就是他考虑可能会有非常多的Python文件在我们单个文件中如果没有这一行,并不影响到于执行Python文件中的所有代码,出现如果是一个项目之后多个排线文件,那我只需要执行其中这一个文件的name它是那个就是说我执行的这个文件,那它才会去执行这个功能。如果说它是被其他文件影响到,所以友友们可以和小北一样习惯性地把Python程序作为入口的时候,都需要判断一下是否是就是主程序~

还有就是友友们在学习的时候可以多多参考————技术文档:人体分析 - 人体关键点识别 | 百度AI开放平台 (baidu.com)icon-default.png?t=N7T8https://ai.baidu.com/ai-doc/BODY/0k3cpyxme?tn=39042058_34_oem_dg&ie=utf-8

二、调用百度AI获取人体关键点数据

       使用获得的Access Token,我们可以调用百度AI的“人体关键点识别”接口,对图像中的人体进行分析,提取人体的各个关键点信息。

找到技术文档:往下拉,找到Python请求代码示例复制粘贴,

新建一个learn3.py文件:


# encoding:utf-8

import requests
import base64

'''
人体关键点识别
'''

request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis"
# 二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())

params = {"image":img}
access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
    print (response.json())

我们现在需要一张”全身照“,(此处引用一下杰哥帅照,如有侵权请及时与小北联系~)调用鉴权接口获取的token和打开图片地址(在同文件夹就可以直接用图片名称)

learn3.py(IDLE)

====== RESTART: D:\桌面\Python\人工智能和机器学习复旦大学计算机科学与技术实践工作站\2024复旦科创\learn3.py =====
{'person_num': 1, 'person_info': [{'body_parts': {'nose': {'score': 0.911842942237854, 'x': 396.302734375, 'y': 160.353515625}, 'right_knee': {'score': 0.8574072122573853, 'x': 305.091796875, 'y': 725.861328125}, 'left_hip': {'score': 0.8353385925292969, 'x': 451.029296875, 'y': 534.318359375}, 'right_ankle': {'score': 0.8325769901275635, 'x': 277.728515625, 'y': 908.283203125}, 'right_wrist': {'score': 0.8704789876937866, 'x': 305.091796875, 'y': 497.833984375}, 'left_eye': {'score': 0.8941200971603394, 'x': 414.544921875, 'y': 151.232421875}, 'left_mouth_corner': {'score': 0.9020979404449463, 'x': 405.423828125, 'y': 187.716796875}, 'right_elbow': {'score': 0.8880144953727722, 'x': 295.970703125, 'y': 397.501953125}, 'left_knee': {'score': 0.8518943190574646, 'x': 478.392578125, 'y': 734.982421875}, 'neck': {'score': 0.8677067160606384, 'x': 396.302734375, 'y': 233.322265625}, 'top_head': {'score': 0.8829088807106018, 'x': 396.302734375, 'y': 105.626953125}, 'right_ear': {'score': 0.8775261640548706, 'x': 359.818359375, 'y': 160.353515625}, 'left_ear': {'score': 0.8890771269798279, 'x': 441.908203125, 'y': 169.474609375}, 'left_elbow': {'score': 0.8575105667114258, 'x': 505.755859375, 'y': 397.501953125}, 'right_shoulder': {'score': 0.8700956702232361, 'x': 314.212890625, 'y': 278.927734375}, 'right_eye': {'score': 0.8894573450088501, 'x': 378.060546875, 'y': 151.232421875}, 'right_mouth_corner': {'score': 0.8865164518356323, 'x': 387.181640625, 'y': 187.716796875}, 'left_ankle': {'score': 0.8733648061752319, 'x': 505.755859375, 'y': 917.404296875}, 'right_hip': {'score': 0.8567600846290588, 'x': 350.697265625, 'y': 534.318359375}, 'left_wrist': {'score': 0.8995563387870789, 'x': 496.634765625, 'y': 497.833984375}, 'left_shoulder': {'score': 0.8760096430778503, 'x': 478.392578125, 'y': 278.927734375}}, 'location': {'score': 0.999074399471283, 'top': 81.2220458984375, 'left': 191.5921630859375, 'width': 364.416015625, 'height': 934.3431396484375}}], 'log_id': 1818249803046925474}

learn3.py(Pycharm)

D:\桌面\Python\code\pythonProject\venv\Scripts\python.exe D:\桌面\Python\人工智能和机器学习复旦大学计算机科学与技术实践工作站\2024复旦科创\learn3.py 
{'person_num': 1, 'person_info': [{'body_parts': {'nose': {'score': 0.911842942237854, 'x': 396.302734375, 'y': 160.353515625}, 'right_knee': {'score': 0.8574072122573853, 'x': 305.091796875, 'y': 725.861328125}, 'left_hip': {'score': 0.8353385925292969, 'x': 451.029296875, 'y': 534.318359375}, 'right_ankle': {'score': 0.8325769901275635, 'x': 277.728515625, 'y': 908.283203125}, 'right_wrist': {'score': 0.8704789876937866, 'x': 305.091796875, 'y': 497.833984375}, 'left_eye': {'score': 0.8941200971603394, 'x': 414.544921875, 'y': 151.232421875}, 'left_mouth_corner': {'score': 0.9020979404449463, 'x': 405.423828125, 'y': 187.716796875}, 'right_elbow': {'score': 0.8880144953727722, 'x': 295.970703125, 'y': 397.501953125}, 'left_knee': {'score': 0.8518943190574646, 'x': 478.392578125, 'y': 734.982421875}, 'neck': {'score': 0.8677067160606384, 'x': 396.302734375, 'y': 233.322265625}, 'top_head': {'score': 0.8829088807106018, 'x': 396.302734375, 'y': 105.626953125}, 'right_ear': {'score': 0.8775261640548706, 'x': 359.818359375, 'y': 160.353515625}, 'left_ear': {'score': 0.8890771269798279, 'x': 441.908203125, 'y': 169.474609375}, 'left_elbow': {'score': 0.8575105667114258, 'x': 505.755859375, 'y': 397.501953125}, 'right_shoulder': {'score': 0.8700956702232361, 'x': 314.212890625, 'y': 278.927734375}, 'right_eye': {'score': 0.8894573450088501, 'x': 378.060546875, 'y': 151.232421875}, 'right_mouth_corner': {'score': 0.8865164518356323, 'x': 387.181640625, 'y': 187.716796875}, 'left_ankle': {'score': 0.8733648061752319, 'x': 505.755859375, 'y': 917.404296875}, 'right_hip': {'score': 0.8567600846290588, 'x': 350.697265625, 'y': 534.318359375}, 'left_wrist': {'score': 0.8995563387870789, 'x': 496.634765625, 'y': 497.833984375}, 'left_shoulder': {'score': 0.8760096430778503, 'x': 478.392578125, 'y': 278.927734375}}, 'location': {'score': 0.999074399471283, 'top': 81.2220458984375, 'left': 191.5921630859375, 'width': 364.416015625, 'height': 934.3431396484375}}], 'log_id': 1818248771820865185}

Process finished with exit code 0

 如果出现错误码可以参考技术文档:

接下来修改代码,让代码输出的结果列表里有很多字典变得有格式:

learn3.py(Pycharm)

learn3.py(IDLE)

继续修改代码:(假如友友们要拿到nosed的x坐标参数)

if response:
    result = response.json()
    print(json.dumps(result, indent=4))
    nose_x = result['person_info'][0]['body_parts']['nose']['x']
    print('nose_x:', nose_x)

learn3.py(Pycharm)

learn3.py(IDLE)

三、使用OpenCV绘制人体关键点分析图

       通过百度AI接口获取到的关键点信息,我们可以使用OpenCV库在原图上绘制这些关键点和它们之间的连接线。

安装opencv:

pip install opencv-python

注:若已经成功安装了Python 3.12.4,但是pip(Python的包管理工具)没有正确安装或配置导致无法使用pip来安装任何Python包,包括opencv-python,这时候

Python 3.4及以上版本提供了一个内置的模块ensurepip,可以用来安装pip。

  1. 在命令提示符中,运行:
    python -m ensurepip
  2. 安装完成后,再次尝试运行
    pip --version

成功安装opencv:

继续改代码:(利用opencv绘制分析图)

# encoding:utf-8
import requests
import base64
import json
import cv2

access_token = 'xxx'
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis"
request_url += "?access_token=" + access_token

# Open image and encode it
with open('Jason.png', 'rb') as f:
    img = base64.b64encode(f.read())

params = {"image": img}
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)

result = response.json()
print(json.dumps(result, indent=4))

body_parts = result['person_info'][0]['body_parts']

def draw_person(image, json_data):
    ss = 0.4
    lines = [
        'left_ear,left_eye,nose,right_eye,right_ear',
        'left_wrist,left_elbow,left_shoulder,neck,right_shoulder,right_elbow,right_wrist',
        'nose,neck',
        'left_hip,right_hip',
        'left_shoulder,left_hip,left_knee,left_ankle',
        'right_shoulder,right_hip,right_knee,right_ankle',
    ]
    for info in json_data['person_info']:
        bp = info['body_parts']
        for line in lines:
            ks = line.split(',')
            for i in range(len(ks) - 1):
                v1, v2 = bp[ks[i]], bp[ks[i + 1]]
                c1, c2 = (int(v1['x']), int(v1['y'])), (int(v2['x']), int(v2['y']))
                if v1['score'] > ss and v2['score'] > ss:
                    cv2.line(image, c1, c2, color=(255, 120, 120), thickness=3)
        for k in bp:
            v = bp[k]
            if v['score'] > ss:
                c = (int(v['x']), int(v['y']))
                cv2.circle(image, c, radius=5, color=(255, 120, 120), thickness=-1)
    return image

# Load the original image
image = cv2.imread('Jason.png')
image_plot = draw_person(image, result)
cv2.imwrite('image_plot.png', image_plot)

 代码结果:

图片结果:

四、简单的头部姿态判断

       通过对检测到的关键点进行分析,可以判断人物是否存在头部转向。例如,通过比较耳朵与肩膀之间的距离来判断头部是否有明显转向。

进一步改代码:(做简单判断——”转没转头“)

# encoding:utf-8
import requests
import base64
import json
import cv2

access_token = 'xxx'
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis"
request_url += "?access_token=" + access_token

# Open image and encode it
with open('Jason.png', 'rb') as f:
    img = base64.b64encode(f.read())

params = {"image": img}
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)

result = response.json()
print(json.dumps(result, indent=4))

body_parts = result['person_info'][0]['body_parts']

def draw_person(image, json_data):
    ss = 0.4
    lines = [
        'left_ear,left_eye,nose,right_eye,right_ear',
        'left_wrist,left_elbow,left_shoulder,neck,right_shoulder,right_elbow,right_wrist',
        'nose,neck',
        'left_hip,right_hip',
        'left_shoulder,left_hip,left_knee,left_ankle',
        'right_shoulder,right_hip,right_knee,right_ankle',
    ]
    for info in json_data['person_info']:
        bp = info['body_parts']
        for line in lines:
            ks = line.split(',')
            for i in range(len(ks) - 1):
                v1, v2 = bp[ks[i]], bp[ks[i + 1]]
                c1, c2 = (int(v1['x']), int(v1['y'])), (int(v2['x']), int(v2['y']))
                if v1['score'] > ss and v2['score'] > ss:
                    cv2.line(image, c1, c2, color=(255, 120, 120), thickness=3)
        for k in bp:
            v = bp[k]
            if v['score'] > ss:
                c = (int(v['x']), int(v['y']))
                cv2.circle(image, c, radius=5, color=(255, 120, 120), thickness=-1)
    return image

# Load the original image
image = cv2.imread('Jason.png')
image_plot = draw_person(image, result)
cv2.imwrite('image_plot.png', image_plot)


body_parts = result['person_info'][0]['body_parts']
left_ear_x = body_parts['left_ear']['x']
right_ear_x = body_parts['right_ear']['x']
left_shoulder_x= body_parts['left_shoulder' ]['x']
right_shoulder_x= body_parts['right_shoulder']['x']
print(left_ear_x,right_ear_x,left_shoulder_x, right_shoulder_x)

left_ear_score = body_parts['left_ear']['score' ]
right_ear_score = body_parts['right_ear']['score' ]
print(left_ear_score,right_ear_score)
if left_ear_score <0.3 or right_ear_score < 0.3:
    print('关键点检测不全')
ear_distance =abs(left_ear_x-right_ear_x)
shoulder_distance = abs(left_shoulder_x - right_shoulder_x)
print(ear_distance,shoulder_distance)



if ear_distance < shoulder_distance / 3:
    print('检测到转头了')
else:
   print('检测到没有转头')

结果:(没有转头)

总结

      本次实践小北展示了如何使用Python结合百度AI开放平台和OpenCV进行图像分析。通过获取Access Token,调用百度的API,我们能够方便地获取到人体的关键点数据。进一步的,使用OpenCV可以将这些数据可视化,并通过简单的计算进行基本的姿态分析。这种应用不仅有助于理解计算机视觉技术,还为实际问题提供了一个有效的解决方案。

希望这篇博客笔记能对友友们在人工智能和机器学习方面的学习有所帮助~

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

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

相关文章

Python常用内置库介绍

Python作为一门强大且易学的编程语言&#xff0c;内置了许多功能强大的库&#xff0c;让开发者能够更加便捷地完成各种任务。本文中&#xff0c;我将详细介绍Python中常用的内置库。 math&#xff1a;提供数学函数&#xff0c;如三角函数、对数函数等。 示例&#xff1a;计算平…

Pycharm conda 虚拟环境添加失败---windows

版本&#xff1a; conda&#xff1a;23.5.2 pycharm:2023.1.3 解决方案&#xff1a; 已验证&#xff1a; 使用系统解释器选择python.exe进行本地添加&#xff08;ps:该方式不会显示conda名称&#xff09; conda路径使用conda info查询 还有一个是在查找解决方法的时候看到比…

05-ArcGIS For JavaScript-RenderNode后处理效果

05-ArcGIS For JavaScript-RenderNode后处理效果 综述代码解析代码实现颜色混合完整代码结果高亮处理完整代码结果 结语 综述 ArcGIS For JavaScript 4.9版本提供了很多优秀的功能&#xff0c;其中提供了RenderNode类&#xff0c;既可以支持第三方渲染引擎的植入&#xff0c;例…

PowerShell报错 about_Execution_Policies 解决方法

在用express创建项目中显示项目创建失败&#xff0c;报错如图所示&#xff0c;显示无法加载文件&#xff0c;按照提示地址https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies看到页面显示是PowerShell执行策略的问题。有问题评论区留言&#xff0c;…

前端构建工具Vite

前端主流框架Vue大家应该都耳熟能详&#xff0c;很多的公司和项目都在使用&#xff0c;以前前端构建工具用的比较多的是webpack&#xff0c;后面渐渐地出现了Vite&#xff0c;它受到大家的喜爱和使用&#xff0c;那大家是否也很想知道它的由来以及优势&#xff0c;为什么越来越…

用户提交订单业务

文章目录 概要整体架构流程技术细节小结 概要 我们通常指的是在电子商务或在线零售环境中&#xff0c;顾客通过互联网完成商品或服务购买的过程。随着互联网技术的发展和普及&#xff0c;越来越多的消费者选择在线购物&#xff0c;这不仅因为其便捷性&#xff0c;还因为它提供…

Linux网络-小结

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux服务器作为一个常用的网络服务器&#xff0c;主要的作用就是向客户端提供网络…

MySQL基础练习题14-产品销售分析1

题目&#xff1a;获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。 准备数据 分析数据 题目&#xff1a;获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。 准备数据 ## 创建库 create database db;…

实战:深入了解JDBC和分享JDBCUtil

Java 数据库连接 (JDBC) 是一个功能强大的 API&#xff0c;它弥补了 Java 应用程序与关系数据库之间的差距。通过利用 JDBC&#xff0c;您可以无缝地与数据库交互以存储、检索和操作数据。但是&#xff0c;要有效使用 JDBC&#xff0c;需要遵循最佳实践&#xff0c;以确保代码的…

GitHub Revert Merge Commit的现象观察和对PR的思考

文章目录 前言Pull Request 为什么会是这样&#xff1f;Pull Request Branch的差异 ?Two Dot Diff和Three Dot Diff 老生常谈&#xff1a; Merge 和 Rebasegit mergegit rebase Revert Main分支中的一个Merge Commit现象描述解决方案: Revert Feature分支中的一个Merge Commi…

RocketMQ入门到精通

RocketMQ入门到精通 一、介绍1.对比2.基础概念 二、环境搭建1.下载rocket2.新增系统变量&#xff1a;ROCKETMQ_HOME3.启动命名服务 nameserver4.启动broker服务器5.安装可视面板6.手动创建Topic7.手动创建消费者组 三、使用Springboot实现消息的收发1.引入jar包2.配置yml文件3.…

【Python机器学习】朴素贝叶斯——使用朴素贝叶斯过滤垃圾邮件

使用朴素贝叶斯解决一些现实生活中的问题时&#xff0c;需要先从文本内容中得到字符串列表&#xff0c;然后生成词向量。 使用朴素贝叶斯对电子邮件进行分类的过程&#xff1a; 1、收集数据&#xff1a;提供文本文件 2、准备数据&#xff1a;将文本文件解析成词条向量 3、分析…

推荐5款好用的将pdf翻译成中文的工具。

像word&#xff0c;PPT,Excel等这些文档如果要翻译的话&#xff0c;即使没有合适的工具也可以复制粘贴内容。可PDF有的时候是不可以编辑的&#xff0c;很难用这种方法实现翻译。但是这5款翻译工具就可以做到直接将PDF文件进行翻译。 1、365pdf在线翻译 直达&#xff1a;https:…

力扣Hot100-543二叉树的直径

给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5] 输出&a…

零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因)

零基础入门转录组数据分析——机器学习算法之lasso&#xff08;筛选特征基因&#xff09; 目录 零基础入门转录组数据分析——机器学习算法之lasso&#xff08;筛选特征基因&#xff09;1. Lasso基础知识2. Lasso&#xff08;Rstudio&#xff09;——代码实操2. 1 数据处理2. 2…

结构体的引入

结构体也是一种数据组合&#xff0c;它和数组的区别是&#xff0c;数组的元素类型是一样的数据集合体&#xff0c;如果元素类型不一样&#xff0c;就要用到结构体了 下面定义一个学生结构体 struct Student {int num;char name[32];int age;double score;char addr[32]; }; …

谷粒商城实战笔记-88~91-商品发布保存

文章目录 一&#xff0c;基本信息二&#xff0c;规格参数三&#xff0c;销售属性四&#xff0c;SKU信息五&#xff0c;代码分析1&#xff0c;Spu信息的保存2&#xff0c;Sku信息的保存 这一篇包含三节内容&#xff1a; 88-商品服务-API-新增商品-保存SPU基本信息89-商品服务-AP…

Redis缓存穿透、击穿和雪崩的理解和解决思路

Redis的缓存穿透 缓存穿透是指那些查询请求所要获取的数据既不在缓存&#xff08;Redis&#xff09;中&#xff0c;也不在数据库&#xff08;例如&#xff1a;MySQL&#xff09;中&#xff0c;因此每次请求都会直接访问数据库。这种情况通常由以下几种情形引起&#xff1a; 恶…

C++:类进阶之继承与派生

一、基本概念&#xff1a;继承、基类、派生类 继承&#xff1a;在定义一个新的类B时&#xff0c;如果该类与某个已有的类A相似 (指的是B拥有A的全部特点)&#xff0c;那么就可以把A作为一个基类&#xff0c;而把B作为基类的一个派生类 (也称子类)。 派生类&#xff1a;通过对…