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

Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇

历史文章

Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务

Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇

Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇

Suno Api V4模型无水印开发「AI生成歌词」 —— 「Suno Api系列」第3篇

Suno Api V4模型无水印开发「续写」 —— 「Suno Api系列」第4篇

Suno Api V4模型无水印开发「获取整首歌」 —— 「Suno Api系列」第5篇

Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇

Suno Api V4模型无水印开发「人声伴奏分离」 —— 「Suno Api系列」第7篇

Suno Api V4模型无水印开发「人声伴奏分离 – 自定义音频」 —— 「Suno Api系列」第8篇

Suno Api V4模型无水印开发「人声伴奏分离 – 网络地址」 —— 「Suno Api系列」第9篇

Suno Api V4模型无水印开发「视频封面编辑」 —— 「Suno Api系列」第10篇

Suno Api V4模型无水印开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Suno Api系列」第11篇

Suno Api V4模型无水印开发「上传参考音频 - 方式二:通过URL的方式」 —— 「Suno Api系列」第12篇

Suno Api V4模型无水印开发「分页获取音乐列表」 —— 「Suno Api系列」第13篇

导读

讲了这么多节的Suno API接口,最后还是来实现一下做一个简单的音乐网站。

具体的一个基本效果如下:

一、准备工作

在动手之前,我们需要确保已经准备好了必要的环境和工具:

Vue和Node.js环境:确保你的开发环境中已经配置好了Vue和Node.js,这将是我们构建前端和后端的基础。

文本编辑器或IDE:选择你熟悉和喜欢的文本编辑器,如VS Code、Sublime Text等。

Suno AI音乐API密钥:这是我们生成音乐所需的关键。

申请和使用

「已经有API的,可以跳过此步骤」

要使用Suno AI API,首先可以先登录到站点:

https://suno4.cn/#/?i=8NCBS8_WXTT

点击头像昵称旁边的… ,点击API接入

然后获取请求所需要的凭证:

如果你尚未登录或注册,会自动跳转到登录页面邀请您来注册和登录,登录注册之后会自动返回当前页面。

接口文档

接口文档地址:

https://doc.apipost.net/docs/3769af043c83000?locale=zh-cn

好了,现在,我们获得了Suno API,下面就可以来快速的搭建AI音乐生成平台了。

二、搭建前端和后端

1. 创建Vue项目

为了更清晰地组织前端和后端代码,我们将项目目录结构分为两个主要部分:frontend和backend。以下是具体的目录结构和说明:

suno-music-site/

├── backend/

│ ├── node_modules/

│ ├── package.json

│ ├── package-lock.json

│ └── server.js

├── frontend/

│ ├── node_modules/

│ ├── public/

│ ├── src/

│ │   ├── assets/

│ │   ├── components/

│ │   ├── App.vue

│ │   ├── main.js

│ ├── package.json

│ ├── package-lock.json

│ └── vue.config.js

└── README.md

创建一个 suno-music-site 目录。

2. 创建后端

创建后端目录和文件,在项目根目录下创建 backend 目录,并进入该目录:

mkdir backend

cd backend

初始化Node.js项目

在backend目录下初始化Node.js项目:

npm init -y

安装Express和其他依赖

安装Express和所需的依赖包:

npm install express body-parser node-fetch

创建server.js

在backend目录下创建server.js文件,并添加以下代码:

const express = require('express');const bodyParser = require('body-parser');const fetch = require('node-fetch').default; // 使用CommonJS版本的node-fetchconst cors = require('cors'); // 引入cors中间件const app = express();const PORT = 3000;app.use(cors()); // 使用cors中间件app.use(bodyParser.json());app.post('/generate-music', async (req, res) => {  const { prompt } = req.body;  const options = {    method: "post",    headers: {      "accept": "application/json",      "authorization": "Bearer xxxxxxxxxxx",      "content-type": "application/json"    },    body: JSON.stringify({      "prompt": prompt    })  };  try {    const response = await fetch("https://xxx.xxx.xxx/_open/suno/music/generate", options);    const data = await response.json();            res.json(data);  } catch (error) {    console.error(error);    res.status(500).json({ error: 'An error occurred' });  }});app.listen(PORT, () => {  console.log(`Server is running on http://localhost:${PORT}`);});

3. 创建前端

回到项目根目录,创建frontend目录,并进入该目录:

cd ..

mkdir frontend

cd frontend

创建Vue项目

使用Vue CLI创建Vue项目:

vue create .

选择默认配置或根据你的需要进行配置。

编写前端代码

我们创建一个简单的界面来接收用户输入并显示生成的音乐。

在frontend/src目录下,修改App.vue文件,添加以下代码:

<template>  <div id="app">    <header>      <h1>AI Music Generator</h1>    </header>    <main>      <div class="input-container">        <input type="text" v-model="musicTitle" placeholder="Enter a prompt for the music">        <button @click="handleGenerateMusic" :disabled="loading">生成音乐</button>      </div>            <div v-if="loading" class="loading">        Music is being generated for you, please wait...      </div>      <div v-if="musicGenerated" class="music-container">        <div v-for="music in generatedMusic" :key="music.id" class="music-item">          <h2>{{ music.title }}</h2>          <img :src="music.image_url" alt="Music Image">          <p class="lyric">{{ music.lyric }}</p>          <audio controls class="audio" @play="stopOtherMedia($event)">            <source :src="music.audio_url" type="audio/mpeg">            Your browser does not support the audio element.          </audio>          <video controls class="video" @play="stopOtherMedia($event)">            <source :src="music.video_url" type="video/mp4">            Your browser does not support the video element.          </video>        </div>      </div>      <div v-if="showModal" class="modal">        <div class="modal-content">          <p>{{ modalMessage }}</p>        </div>      </div>    </main>  </div></template><script>import axios from 'axios';export default {  data() {    return {      musicTitle: '',      musicGenerated: false,      generatedMusic: [],      loading: false,      currentPlayingMedia: null,      showModal: false,      modalMessage: ''    };  },  mounted() {    document.title = "XiaoZhi AI Music Generator";  },  methods: {    handleGenerateMusic() {      if (!this.musicTitle) {        this.showModalMessage('请输入生成音乐的提示语');        return;      }      this.generateMusic();    },    generateMusic() {      this.loading = true;      this.musicGenerated = false;      axios.post('http://localhost:3000/generate-music', { prompt: this.musicTitle })        .then(response => {          this.loading = false;          this.musicGenerated = true;          this.generatedMusic = response.data.data;        })        .catch(error => {          this.loading = false;          console.error('Error generating music:', error);        });    },    stopOtherMedia(event) {      if (this.currentPlayingMedia && this.currentPlayingMedia !== event.target) {        this.currentPlayingMedia.pause();        this.currentPlayingMedia.currentTime = 0;      }      this.currentPlayingMedia = event.target;    },    showModalMessage(message) {      this.modalMessage = message;      this.showModal = true;      setTimeout(() => {        this.showModal = false;      }, 2000);    }  }}</script><style scoped>#app {  font-family: Avenir, Helvetica, Arial, sans-serif;  text-align: center;  color: #2c3e50;  margin-top: 60px;}header {  background-color: #42b983;  padding: 20px;  color: white;}main {  margin: 20px;  max-width: 80%;  margin: 20px auto;}.input-container {  display: flex;  flex-direction: row;  justify-content: center;  align-items: center;  margin-bottom: 20px;}input[type="text"] {  padding: 7px;  margin-right: 10px;  font-size: 1em;  flex: 1;  max-width: 600px;}button {  padding: 8px 20px;  background-color: #007bff;  color: #fff;  border: none;  cursor: pointer;  font-size: 1em;  border-radius: 4px;}button:disabled {  background-color: #d3d3d3;  cursor: not-allowed;}button:hover:not(:disabled) {  background-color: #0056b3;}.loading {  font-size: 1.2em;  color: #42b983;  margin-top: 20px;}.music-container {  display: flex;  flex-wrap: wrap;  gap: 20px;}.music-item {  flex: 1;  min-width: 300px;  max-width: 45%;  margin-top: 20px;  padding: 20px;  border: 1px solid #ddd;  border-radius: 8px;  background-color: #f9f9f9;  text-align: left;}.lyric {  font-size: 1.2em;  margin: 10px 0;  white-space: pre-line;}.audio {  width: 100%;  margin-top: 10px;}.video {  width: 100%;  height: auto;  margin-top: 10px;}.modal {  position: fixed;  top: 0;  left: 0;  width: 100%;  height: 100%;  display: flex;  justify-content: center;  align-items: center;  background-color: rgba(0, 0, 0, 0.5);}.modal-content {  background-color: white;  padding: 20px;  border-radius: 5px;  text-align: center;  font-size: 1.2em;}@media (max-width: 600px) {  .input-container {    flex-direction: column;  }    input[type="text"] {    margin-right: 0;    margin-bottom: 10px;    max-width: 100%;           }  .music-item {    max-width: 100%;  }}@media (min-width: 601px) {  .video {    width: 100%;    margin: 10px auto;  }}</style>

4. 解决跨域问题

在你的项目运行中,可能会出现跨域请求的问题,我们需要解决它。

你可以在现有的 vue.config.js 文件中添加开发服务器代理配置,以解决跨域问题。以下是修改后的 vue.config.js 文件内容:

const { defineConfig } = require('@vue/cli-service')module.exports = defineConfig({  transpileDependencies: true,  devServer: {    proxy: {      '/generate-music': {        target: 'http://localhost:3000',        changeOrigin: true      }    }  }})

这样配置后,当前端发起请求到/generate-music时,代理服务器会将请求转发到运行在 http://localhost:3000 的后端服务,从而解决跨域问题。

如果还无法解决的话,你可能还需要处理一下。由于浏览器安全策略的限制,前端和后端运行在不同的域(例如,localhost 和 192.168.0.235)时,浏览器会阻止跨域请求。我们需要在后端服务器中设置适当的CORS头信息来允许跨域请求。

你可以使用 cors 中间件来解决这个问题。

安装 cors 包:

npm install cors

在 server.js 文件中引入并使用 cors 中间件:

这样,后端服务器将允许来自所有来源的请求。如果你想限制特定来源的请求,可以这样配置 cors 中间件:

app.use(cors({  origin: 'http://192.168.20.235:8081' // 允许的前端URL}));

这样应该能解决CORS问题,并允许前端正常调用后端API。

如果Node.js 无法直接使用 ES 模块(ES Module)加载 node-fetch,因 node-fetch 是一个 ES 模块。解决这个问题的一种方法是将 node-fetch 替换为一个可以在 CommonJS 环境中使用的版本。

你可以安装 node-fetch 的 CommonJS 版本,并修改 server.js 文件中的引入方式。

首先,删除项目中已安装的 node-fetch:

npm uninstall node-fetch

安装 node-fetch 的 CommonJS 版本:

npm install node-fetch@2

在 server.js 文件中,将引入方式修改为动态引入(dynamic import),上面的代码已经修改好了。

三. 运行项目

启动后端服务

在backend目录下,启动后端服务:

node server.js

启动前端服务

在frontend目录下,启动前端服务:

npm run serve

打开浏览器,访问http://localhost:8080(Vue CLI默认端口),你将看到一个简单的界面,输入一个提示词并点击“Generate Music”按钮,即可生成音乐。

默认会生成两首音乐,有 MP3 和 MP4 视频,点击即可播放 AI 生成的音乐。

历史文章

Suno AI API接入 - 将AI音乐接入到自己的产品中,支持120并发任务

Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇

Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇

Suno Api V4模型无水印开发「AI生成歌词」 —— 「Suno Api系列」第3篇

Suno Api V4模型无水印开发「续写」 —— 「Suno Api系列」第4篇

Suno Api V4模型无水印开发「获取整首歌」 —— 「Suno Api系列」第5篇

Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇

Suno Api V4模型无水印开发「人声伴奏分离」 —— 「Suno Api系列」第7篇

Suno Api V4模型无水印开发「人声伴奏分离 – 自定义音频」 —— 「Suno Api系列」第8篇

Suno Api V4模型无水印开发「人声伴奏分离 – 网络地址」 —— 「Suno Api系列」第9篇

Suno Api V4模型无水印开发「视频封面编辑」 —— 「Suno Api系列」第10篇

Suno Api V4模型无水印开发「上传参考音频 - 方式一:通过二进制流的方式」 —— 「Suno Api系列」第11篇

Suno Api V4模型无水印开发「上传参考音频 - 方式二:通过URL的方式」 —— 「Suno Api系列」第12篇

Suno Api V4模型无水印开发「分页获取音乐列表」 —— 「Suno Api系列」第13篇

相关文章:

Suno Api V4模型无水印开发「综合实战开发自己的音乐网站」 —— 「Suno Api系列」第14篇

历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 Suno Api V4模型无水印开发「灵感模式」 —— 「Suno Api系列」第1篇 Suno Api V4模型无水印开发「自定义模式」 —— 「Suno Api系列」第2篇 Suno Api V4模型无水印开发「AI生成歌词」…...

云原生架构中的中间件容器化:优劣势与实践探索

在云原生架构逐步推进的过程中&#xff0c;许多企业已经开始将应用和服务容器化&#xff0c;以充分利用云计算带来的弹性和自动化。随着容器技术的发展&#xff0c;容器化不仅仅限于应用层&#xff0c;越来越多的中间件也被考虑纳入容器化范畴&#xff0c;包括Redis、Kafka、Ra…...

如何测试模型推理性能:从零开始的Python指南

如何测试模型推理性能&#xff1a;从零开始的Python指南 什么是模型推理性能&#xff1f;测试模型推理性能的步骤1. 监测内存使用情况2. 测试模型吞吐量 运行测试总结 在机器学习和深度学习中&#xff0c;模型的推理性能是一个非常重要的指标。它可以帮助我们了解模型在实际应用…...

我们来学activiti -- bpmn

bpmn 题记bpmn结余 题记 在《Activiti很难学》提到学习知识点需要面对的思想钢印问题 按常见步骤&#xff0c;先展示下官方的客套话 BPMN&#xff08;Business Process Model and Notation&#xff09;是一种业务流程建模符号&#xff0c; 它是一种图形化的语言&#xff0c;用…...

【每日学点鸿蒙知识】节点析构问题、区分手机和pad、 Navigation路由问题、Tabs组件宽度、如何监听Map

1、HarmonyOS 只调用根节点的dispose,是否其下的子节点都能析构掉还是需要遍历子节点&#xff0c;都执行dispose才能正常析构&#xff1f; 前端持有引用关系的需要dispose&#xff0c;new出来的builderNode和FrameNode也需要dispose。只调用根节点的dispose,无法保证其下的子节…...

敏捷测试文化的转变

敏捷文化是敏捷测试转型的基础&#xff0c;只有具备敏捷文化的氛围&#xff0c;对组织架构、流程和相关测试实践的调整才能起作用。在前面的敏捷测试定义中&#xff0c;敏捷测试是遵从敏捷软件开发原则的一种测试实践&#xff0c;这意味着敏捷的价值观。 此外&#xff0c;从传…...

如何配置线程池参数,才能创建性能最好、最稳定的Spring异步线程池?

配置性能最好、最稳定的Spring异步线程池&#xff0c;需要综合考虑业务场景、硬件资源&#xff08;CPU核心数、内存等&#xff09;、并发量、任务特性&#xff08;CPU密集型、IO密集型等&#xff09;以及线程池参数。 以下是优化线程池配置的关键点及代码示例&#xff1a; 线程…...

【时间之外】IT人求职和创业应知【80】-特殊日子

目录 北京冬季招聘会 OpenAI CEO炮轰马斯克 英伟达推出全新AI芯片B300 莫欢喜&#xff0c;总成空。本周必须要谨行慎言。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如提升自己。提升自己的捷径就是学习和思考…...

Vue中接入萤石等直播视频(更新中ing)

一、萤石&#xff1a; 1. 萤石云开发文档&#xff1a; https://open.ys7.com/help/31 2、安装&#xff1a; npm install ezuikit-js --save 3、在文件中引用&#xff1a;import EZUIKit from ezuikit-js 4、具体代码&#xff1a; 获取accessToken&#xff1a;https://open.…...

如何学习、使用Ai,才能跟上时代的步伐?

目录 1. 打好基础&#xff1a;理解AI的核心概念 2. 学习AI的核心领域 3. 实践&#xff1a;动手做项目&#xff0c;积累经验 4. 利用AI工具提升工作效率 5. 培养AI思维与批判性思维 6. 关注AI领域的最新研究与趋势 7. 培养跨学科能力 总结&#xff1a; 在AI时代&#xf…...

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色&#xff0c;它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件&#xff0c;提供了多种机制来确保消息的可靠传递。其中&#xff…...

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…...

upload-labs关卡记录8

黑名单过滤&#xff0c;同时不能进行双写&#xff0c;大小写&#xff0c;特殊可解析后缀&#xff0c;.htaccess,都不能。点击提示发现&#xff1a; 禁止上传所有可解析后缀&#xff0c;抓包试试&#xff1a; 抓包加空格发现也不能绕过&#xff0c;看源码分析吧&#xff1a; $i…...

GXUOJ-算法-第二次作业

1.矩阵连&#xff08;链&#xff09;乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…...

Gavin Wood 的 Polkadot 2024 年度回顾:技术突破与未来的无限可能

原文&#xff1a;https://medium.com/polkadot-network/polkadot-roundup-mmxxiv-8d3e880dd637 作者&#xff1a;Gavin Wood 编译&#xff1a;OneBlock &#x1f384; 各位波卡生态的 Buidler 们&#xff0c;圣诞快乐&#xff01;在这个充满节日气氛的时刻&#xff0c;很高兴与…...

AduSkin、WPF-UI、Prism:WPF 框架全解析与应用指南

摘要: 本文深入探讨了 AduSkin、WPF-UI、Prism 这三个在 WPF 开发领域极具影响力的框架。详细阐述了每个框架的特点、核心功能、安装与配置过程,并通过丰富的代码示例展示其在实际应用场景中的使用方式,包括界面美化、导航与模块管理等方面。同时对它们的优势与局限性进行了…...

【超详细】Git的基本概念和基本使用方式

Git是程序开发中非常重要的工具&#xff0c;是一种分布式版本控制系统&#xff0c;可用于管理和追踪软件开发过程中的变化。那么关于Git的基本操作你知道吗&#xff1f;下面是Git的基本概念和使用方式的解释&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Gi…...

【数据结构】单链表的使用

单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插&#xff1a;****节点尾插&#xff1a;****新节点插入指定节点后&#xff1a;**节点删除&#xff1a; d、单链表修改节点e、单链表遍历&#xff0c;并打印…...

外键约束的应用层维护

1.前言 一般来说 对于不同表格之间的属性约束 我们通常直接使用数据库已经实现好的外键来完成 但是数据库底层实现的外键他的性能很差 这是因为在执行数据库修改操作时 他需要遍历其他所有的表来找出其中可能相关联的属性 一并进行数据库修改(应用层的维护则只需要遍历所有关联…...

springboot整合log4j2日志框架1

目录 一 log4j基本知识 1.1 log4j的日志级别 1.2 log4j的日志文件结构* 1.2.1 概述 1.2.2 详解 1.3 log4j的日志格式化api 1.3.1 api详解 1.3.2 演示案例 1.3.3 演示案例 1.4 log4j中onmatch和onmismatch的区别* 1.4.1 案例 1.4.2 onmatch的api 1.5 logback&#x…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...