【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复
技术栈:vue3 + element-plus + axios + pinia + router + Django5 + websocket + 讯飞星火API
本文将实现一个 AI 聊天对话功能,将前端用户输入问题以及之前对话发送给后端,通过 api 访问大模型,返回前端实时对话数据。
调用 讯飞星火API 大家可以看这篇(文A):创作中心-CSDN
前端 vue3 +后端 Django5 连接可以看这篇(文B):【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!_django vue3 前后端分离-CSDN博客
Django5 配置 websocket(文C):【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现_django websocket-CSDN博客
【玩转全栈】---- Django 基于 Websocket 实现群聊(解决channel连接不了)_django websocket聊天室-CSDN博客
目录
效果预览:
前期准备
代码实现
后端
前端
资源获取
效果预览:
Django连接vue3,接入ai
前期准备
文A 已讲解如何在 Django 调用免费的讯飞星火API 。
文B 已讲解如何连接前端 vue3 、后端 Django5,配置 vite.config 文件代理,后端解决跨域等等。还有如何在前端获取 token ,并在前端发送 Post 请求时以携带该 token 以越过安全验证,使得后端 Django 能接收到数据,这里不过多赘述,结尾也有相关资源可以下载。
文C 以讲解如何在 Django 中配置 websocket 环境,以及如何实现聊天室功能。
没实现的可以先回去实现。
代码实现
后端
Django 配置好 websocket ,定义 AI 消费者及其路径:
routings.py:
from django.urls import re_path
from . import consumerswebsocket_urlpatterns = [re_path(r'ws/chat/', consumers.ChatConsumer.as_asgi()),
]
consumers.py:
import json
import asyncio
import httpx
from channels.generic.websocket import AsyncWebsocketConsumer
import reclass ChatConsumer(AsyncWebsocketConsumer):async def connect(self):print("AI消费者已连接")await self.accept()async def disconnect(self, close_code):print("AI消费者已断开")passasync def receive(self, text_data):print("获取到的text_data:", text_data)try:text_data_json = json.loads(text_data)print("text_data_json:",text_data_json)if not text_data_json:await self.send(text_data=json.dumps({'error': '问题不能为空',}))returntry:async for chunk in self.call_spark_ai(text_data_json):if chunk == '[DONE]':await self.send(text_data=json.dumps({'done': True,}))else:# 将 AI 的答复推送给前端await self.send(text_data=json.dumps({'message': chunk,}))await asyncio.sleep(0.1) # 增加延迟,降低推送频率except Exception as e:await self.send(text_data=json.dumps({'error': f'调用 AI 接口失败: {str(e)}',}))except json.JSONDecodeError:await self.send(text_data=json.dumps({'error': '无效的 JSON 数据',}))async def call_spark_ai(self, question):print("已调用 Spark_ai函数")# 讯飞星火 AI API 的 URL 和认证信息url = "https://spark-api-open.xf-yun.com/v1/chat/completions"headers = {"Authorization": "Bearer 你的密钥","Content-Type": "application/json",}data = {"max_tokens": 4096,"top_k": 4,"temperature": 0.5,"messages": question,"model": "4.0Ultra","stream": True,}async with httpx.AsyncClient() as client:async with client.stream("POST", url, headers=headers, json=data) as response:if response.status_code != 200:raise Exception(f"AI 接口返回错误: {response.status_code} {await response.text()}")# 定义正则表达式pattern = r'"content":"(.*?)"'async for line in response.aiter_lines():print(line.strip())if line.strip():try:# 使用正则表达式提取 contentmatch = re.search(pattern, line)if match:content = match.group(1)print("content:", content)if content:yield content # 只推送 content 部分except Exception as e:print(f"处理消息时出错: {e}")continue
消费者涉及到的内容比较多,下面我将一一解释:
首先注意!由于连的 websocket ,需要频繁地接收客户端发送的消息、向客户端发送消息并保持连接状态。这些操作本质上是 I/O 密集型任务,涉及到网络请求和响应。如果使用同步代码来处理这些任务,线程会阻塞,导致性能瓶颈。而异步代码可以高效地处理大量并发连接,避免线程阻塞。
text_data_json 获取到前端的对话数据,并添加空数据判断。
定义 call_spark_ai() 函数,传入参数是对话列表,通过调用讯飞星火 API ,得到流式数据,通过正则获取到 content 数据,通过 yield 并发式返回。
然后在消费者中异步使用该函数,将返回值返回给前端。
记得在 headers 中添加自己的密钥。
前端
新建一个 Ai_store 用于存储对话数据:
// stores/Ai_store.js
import { defineStore } from 'pinia';export const useAiStore = defineStore('ai', {state: () => ({messages: [],}),actions: {// 添加对话addMessage(role, content) {this.messages.push({ "role":role, "content":content });},// 清空对话列表clearMessages() {this.messages = [];},},
});
定义了一个 messages 用于存储对话,addMessage() 添加对话对话和内容,clearMessage() 使messages 清空,即新建对话。
导入、初始化 pinia ,并定义一些变量:
import { useAiStore } from '../stores/Ai_store';// 初始化 pinia store
const Ai_store = useAiStore();// 定义消息类型
type Message = {role: string;content: string;
};
const messages = ref<Message[]>([]); // 存储当前一轮对话(用户提问和 AI 回答)
const question = ref(''); // 用户输入的问题
const aiResponse = ref<string[]>([]); // AI 的响应数据
let csrfToken: string | null = null; // CSRF Token
let socket: WebSocket | null = null; // WebSocket 连接(全局变量)
let currentAiResponse = ''; // 当前问题的实时回复内容
初始化 websocket 连接:
function initWebSocket() {if (socket) {socket.close(); // 关闭之前的连接}socket = new WebSocket(`ws://localhost:8080/ws/chat/`);// 监听 WebSocket 打开事件socket.onopen = () => {console.log("WebSocket connection opened");};// 监听 WebSocket 消息事件socket.onmessage = (event: MessageEvent) => {console.log("到达websocket消息事件");const data = JSON.parse(event.data);console.log("data:", data);if (data.message) {// 将消息添加到当前响应中currentAiResponse += data.message;// 更新AI回复内容if (messages.value.length > 0) {messages.value[messages.value.length - 1].content = currentAiResponse;}} else if (data.error) {console.error("Error from backend:", data.error);}};// 监听 WebSocket 关闭事件socket.onclose = () => {console.log("WebSocket connection closed");setTimeout(initWebSocket, 5000); // 自动重连,间隔 5 秒};}
socket 路径 ws://localhost:8080/ws/chat/ 要和后端对应起来,保证连接顺利。
onmessage 接受后端返回的消息流,将 message.data 动态加入到 currentAiResponse ,currentAiResponse 动态更新消息。
发送消息:
async function sendQuestion() {// csrfToken验证if (!csrfToken) {console.error("CSRF Token is not available");return;}if (!question.value.trim()) {alert("请输入有效的问题!");return;}try {// 如果有上一轮对话,将其存入 Ai_storeif (messages.value.length > 0) {console.log("messages:", messages);messages.value.forEach(msg => {Ai_store.addMessage(msg.role, msg.content);});}// 清空 messages 并存储新的用户问题messages.value = [];messages.value.push({ role: 'user', content: question.value });// 清空 AI 的响应数据和完整字符串currentAiResponse = "";// 通过 WebSocket 发送问题const join_messages = ref<Message[]>([]);join_messages.value = [...Ai_store.messages];join_messages.value.push({ role: "user", content: question.value })console.log("join_messages:", join_messages)const message = JSON.stringify(join_messages.value);if (socket) {socket.send(message);}console.log("Sent question to WebSocket:", message);// 清空问题输入框question.value = '';// 初始化 AI 回复占位符messages.value.push({ role: 'system', content: '' });} catch (error) {console.error("Error sending question:", error.response?.data || error.message);}}
如何 messages 中有对话数据,则添加至 pinia 中,当作历史对话数据,以在页面上展示之前对话数据,通过 join_messages 构造历史对话数据和当前对话数据,即当前对话中所有对话数据,然后传给后端,后端解析后,传给 讯飞星火,如此形成循环。
组件生命周期:
onMounted(() => {fetchCsrfToken();initWebSocket();});onUnmounted(() => {if (socket) {socket.close();}});
组件挂载则初始化,卸载则断开 socket 连接。
新建对话:
// 新建对话函数function newConversation() {try {// 清空数据Ai_store.clearMessages();messages.value = [];currentAiResponse = '';// 清空用户输入框question.value = '';console.log("新建对话:所有数据已清空");} catch (error) {console.error("Error creating new conversation:", error.message);}}
用户点击按钮调用此函数,所有数据清空,重新开始对话。
计算 html :
// 计算属性:实时拼接并格式化对话记录const formattedResponse = computed(() => {// 合并历史记录和当前问题的实时回复const allMessages = [...Ai_store.messages, ...messages.value];// 格式化消息const formattedMessages = allMessages.map(msg => {return `<strong style="color: ${msg.role === 'user' ? 'blue' : 'green'};">${msg.role === 'user' ? '您:' : 'AI:'}</strong><br>${String(msg.content || '').replace(/(\\n)+/g, '<br>').replace(/\t+/g, ' ')}`;});// 拼接最终的HTML字符串return formattedMessages.join('<br><br>');});
合并所有对话数据,制造格式化消息,返回给页面,用于展示。
页面:
<el-drawerv-model="drawerVisible"direction="ltr":modal="true":close-on-click-modal="true"custom-class="custom-drawer":with-header="false"><div class="drawer-content"><div class="header-not"><h1>AI 对话界面</h1><button @click="newConversation">新建对话</button></div><!-- 输入框 --><div class="fixed-container"><textarea v-model="question" placeholder="请输入问题"></textarea><button @click="sendQuestion" class="send_button">发送问题</button></div><!-- 对话记录 --><div class="response" v-html="formattedResponse"></div></div></el-drawer>
资源获取
本次分享结束,源码也已放入资源:
https://download.csdn.net/download/2403_83182682/90626683
感谢您的观看!!!
相关文章:
【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复
技术栈:vue3 element-plus axios pinia router Django5 websocket 讯飞星火API 本文将实现一个 AI 聊天对话功能,将前端用户输入问题以及之前对话发送给后端,通过 api 访问大模型,返回前端实时对话数据。 调用 讯飞星火API…...
1.1 java开发的准备工作(入门)
准备工作 一.JDK 开始写java程序之前需要安装jdk jdk是java开发工具,包含着JRE和里面的JVM(虚拟机,可以使得不同环境下都能运行Java程序),和开发工具。 二.了解写程序的三大步骤步骤 java成功运行主要需要经过代码编写,编译&a…...
socket编程基础
上一篇 --- 网络基础概念(下)https://blog.csdn.net/Small_entreprene/article/details/147320155?fromshareblogdetail&sharetypeblogdetail&sharerId147320155&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 理…...
根据定义给出json_schema:
根据您提供的智能体定义,以下是符合JSON Schema Draft-07规范的完整架构描述(包含中文注释说明): {"$schema": ""title": "智能体架构规范","type": "object","req…...
深入微服务核心:从架构设计到规模化
作者:腾讯云开发者 原文:深入微服务核心:从架构设计到规模化 01 微服务 什么是微服务? 微服务就是一些协同工作的小而自治的服务。我们在一个单体系统中,通常会采用一些抽象层或者模块来保证代码的内聚性,…...
linux与c语言基础知识(未全部完成)
文章很多处理论,没办法写出来,(linux的一些理论问题,我有时间后,会逐个解决) 文章大多数的理论来字这个链接, C语言快速入门-C语言基础知识-CSDN博客 一. linux(Ubuntu) …...
【专题刷题】滑动窗口(四):
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
小白自学python第一天
学习python的第一天 一、常用的值类型(先来粗略认识一下~) 类型说明数字(number)包含整型(int)、浮点型(float)、复数(complex)、布尔(boolean&…...
Redis 服务自动开启、设置密码和闪退问题
一、Redis 服务自动开启 1、以管理员身份运行命令提示符 右键点击“命令提示符”图标,选择“以管理员身份运行”。 2、注册为 Windows 服务 redis-server --service-install 3、启动服务 redis-server --service-start 4、测试 Redis 连接 redis-cli ping …...
2025年渗透测试面试题总结-拷打题库14(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库14 1. WAF存在的意义 2. 威胁感知能力衡量指标 3. 感知规则有效性…...
java后端开发day35--集合进阶(四)--双列集合:MapHashMapTreeMap
(以下内容全部来自上述课程) 1.双列集合 1.1 特点 双列集合一次需要存一对数据,分别为键和值键不能重复,值可以重复键和值是一一对应的,每一个键只能找到自己对应的值键值这个整体,我们称之为“键值对”…...
进行网页开发时,怎样把function()中变量值在控制台输出,查看?
在网页开发过程中,为了及时了解JavaScript中的function函数中的变量值,可以用控制台命令console.log()把变量的值在控制台输出,方便调试时对函数变量值进行了解。 看下面的一段示例: <!DOCTYPE html> <html> &l…...
【计算机网络】现代网络技术核心架构与实战解析
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:TCP服务端/客户端通信案例2:Wireshark抓包分析 三、性能对比测试方法…...
Python内置函数---bool()
用于将任意对象转换为布尔值(True或False) 1. 基本语法与参数 bool(x) - 参数:x为可选参数,可以是任意Python对象(如数值、字符串、列表、自定义对象等)。 - 返回值:根据x的真值性返回True或Fa…...
Vue 3中如何封装API请求:提升开发效率的最佳实践
在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时。随着Vue 3的广泛应用,如何高效地封装API请求,既能提升代码的可维护性,又能确保代码的高复用性,成为了很多开发者关注的话题。 在本文中&…...
【Redis】redis主从哨兵
Redis 主从复制 在访问量极高的场景下,单台 Redis 已难以承载所有请求,且单点故障风险高。通过主从复制,可以实现读写分离、数据备份与高可用。 概念 主节点(Master):负责写操作,将数据变更同…...
16.第二阶段x64游戏实战-分析二叉树结构
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:15.第二阶段x64游戏实战-分析怪物血量(遍历周围) 首先通…...
vue | 不同 vue 版本对复杂泛型的支持情况 · vue3.2 VS vue3.5
省流总结:defineProps 的泛型能力,来直接推导第三方组件的 props 类型 引入第三方库的类型,并直接在 <script setup> 中作为 props 使用。这种类型一般是复杂泛型(包含联合类型、可选属性、交叉类型、条件类型等࿰…...
OpenGL学习笔记(Blinn-Phong、伽马矫正、阴影)
目录 Blinn-PhongGamma矫正GammaGamma矫正实现方法sRGB纹理衰减 阴影shadow mapping渲染阴影改进阴影贴图PCF GitHub主页:https://github.com/sdpyy1 OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdp…...
GPLT-2025年第十届团体程序设计天梯赛总决赛题解(2025天梯赛题解,266分)
今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试,…...
day4 pandas学习
%pip install openxyxl 找一个自己觉得有意思的文件。我找的是成绩单来玩。 这节学的比较耗时了,大概用了60分钟。 import pandas as pd data2 pd.read_csv(rD:\python代码区\代码随想录挑战-调试区\python训练营\1_计算类专业分流学生成绩排名.csv) #print(data)…...
【Java学习笔记】循环结构
循环结构 一、for循环 for循环结构 for(循环变量初始化;循环条件;循环变量迭代){循环操作(可以多条语句) }for循环写死循环 for(;;){语句 }注意点:循环变量的初始化在for语句内,属于是局部变量,在全局中会出现未定义…...
URP-UGUI交互功能实现
一、非代码层面实现交互(SetActive) Button :在OnClick()中添加SetActive方法(但是此时只首次有效) Toggle :在OnClick()中添加动态的SetActive方法 &#…...
08-IDEA企业开发工具-集成AI插件通义灵码
需要登陆才可使用!!! 1. 安装AI编程插件 找到插件: 在IDEA的设置中,找到插件(Plugins)部分。安装插件: 搜索“通义灵码”,找到后点击安装(Install),接受条款…...
解决报错:this[kHandle] = new _Hash(algorithm, xofLen);
前端项目编译报错: node:internal/crypto/hash:68this[kHandle] new _Hash(algorithm, xofLen);^Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:68:19)at Object.createHash (node:crypto:138:10)at modu…...
使用 Streamlit 打造一个简单的照片墙应用
在现代 web 开发中,快速构建交互式应用是一项重要的技能。Streamlit 是一个强大的 Python 库,允许开发者以最小的代码量创建美观且功能丰富的 web 应用。今天,我们将通过分析一段简单的 Streamlit 代码,展示如何构建一个照片墙应用…...
深度学习优化器和调度器的选择和推荐
一、常用优化器对比 1. 随机梯度下降(SGD) 原理:每次迭代使用小批量数据计算梯度并更新参数。优点:实现简单,适合大规模数据集。缺点:收敛速度慢,容易陷入局部最优或鞍点。适用场景࿱…...
“时间”,在数据处理中的真身——弼马温一般『无所不能』(DeepSeek)
电子表格时间处理真理:数值存储最瘦身,真身闯关通四海。 笔记模板由python脚本于2025-04-23 22:25:59创建,本篇笔记适合喜欢在电子表格中探求时间格式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验…...
为什么Spring中@Bean注解默认创建单例Bean
在Spring框架中,使用Bean注解定义的对象默认确实是单例的,这是由Spring容器的设计哲学和实际需求决定的。下面我从多个角度解释这一设计选择的原因和机制。 1. Spring Bean作用域基础 Spring定义了多种Bean作用域,其中默认是单例(Singleton…...
GPLT-2025年第十届团体程序设计天梯赛总决赛题解(2025天梯赛题解,共计266分)
今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试,…...
JDK(Ubuntu 18.04.6 LTS)安装笔记
一、前言 本文与【MySQL 8(Ubuntu 18.04.6 LTS)安装笔记】同批次:先搭建数据库,再安装JDK,后面肯定就是部署Web应用:典型的单机部署。“麻雀虽小五脏俱全”,善始善终,还是记下来吧。…...
Java 拦截器完全指南:原理、实战与最佳实践
一、引言 拦截器的基本概念 在现代 Java Web 开发中,拦截器(Interceptor)是一种用于在请求处理前后插入自定义逻辑的机制。简单来说,它是一种“横切逻辑处理器”,可以用来对请求进行预处理、后处理,甚至终…...
2025.04.23华为机考第二题-200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 魔法彩灯森林 问题描述 在卢小姐的魔法花园中,有一棵神奇的彩灯树。这棵树的每个节点都装有一盏魔法灯,灯有三种颜色状态:红色(用数字1表示)、绿色(用数字2表示)和蓝色(…...
【Leetcode 每日一题】1399. 统计最大组的数目
问题背景 给你一个整数 n n n。请你先求出从 1 1 1 到 n n n 的每个整数 10 10 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。 请你统计每个组中的数字数目,并返回数字数目并列最多的组…...
系统重装——联想sharkbay主板电脑
上周给一台老电脑重装系统系统,型号是lenovo sharkbay主板的电脑,趁着最近固态便宜,入手了两块长城的固态,装上以后插上启动U盘,死活进不去boot系统。提示 bootmgr 缺失,上网查了许久,终于解决了…...
Python数据清洗笔记(上)
一、数据清洗概述 数据清洗是数据分析过程中至关重要的一步,约占整个数据分析过程的60%-80%的时间。主要包括处理缺失值、异常值、重复值、格式不一致等问题。 二、常用工具 主要使用Python的Pandas库进行数据清洗: import pandas as pd import nump…...
三、Python编程基础03
目录 一、debug 调试的使用1. 打断点2. 右键 Debug 运行代码3. 单步执行代码,查看过程 二、字符串1、定义与下标引用2、切片3、查找4、去除空白字符5、转换大小写与拆分6、其他方法-替换、连接、是否为纯数字7、登录案例优化 三、列表 list1、列表基础操作2、案例: …...
西门子S7-200SMART 控制Profinet闭环步进MD-4250-PN (1)电机及专栏介绍
一、前言 本系列是我继 《西门子S7-1200PLC 控制步进电机 MD-4240-PN》系列专栏后,新开的一篇专栏。 系列的主题围绕 S7-200SMART Profinet闭环步进(MD-4250-PN) 触摸屏的硬件,预计作四篇文章,分别为:专栏介绍、硬件介绍、PLC…...
NoSQL 简单讲解
目录 1. NoSQL 的背景与意义 1.1 数据库的演变 1.2 NoSQL 的兴起 2. NoSQL 数据库的分类 2.1 键值存储(Key-Value Stores) 2.2 文档数据库(Document Stores) 2.3 列族存储(Column-Family Stores) 2.…...
TCP 协议:原理、机制与应用
一、引言 在当今数字化的时代,网络通信无处不在,而 TCP(Transmission Control Protocol,传输控制协议)作为互联网协议栈中的核心协议之一,扮演着至关重要的角色。无论是浏览网页、发送电子邮件还是进行文件…...
C++23 新特性:令声明顺序决定非静态类数据成员的布局 (P1847R4)
文章目录 引言背景知识非静态类数据成员类的内存布局 P1847R4提案内容示例代码 影响和优势提高代码的可预测性与其他语言和库的交互更加方便简化代码调试和优化 编译器支持情况实际应用场景嵌入式系统开发跨语言编程内存优化 总结 引言 在C的发展历程中,每一个新版…...
Java 环境配置详解(Windows、macOS、Linux)
Java 环境配置是学习和开发 Java 程序的第一步,也是至关重要的一步。一个正确配置的 Java 环境能够保证你的 Java 程序能够顺利编译、运行和调试。本文将详细介绍在 Windows、macOS 和 Linux 三种主流操作系统上配置 Java 环境的步骤,力求详尽、易懂&…...
ChatBEV:一种理解 BEV 地图的可视化语言模型
25年3月来自上海交大、上海AI实验室、同济大学和MAGIC的论文“ChatBEV: A Visual Language Model that Understands BEV Maps”。 交通场景理解对于智能交通系统和自动驾驶至关重要,可确保车辆安全高效地运行。虽然 VLM 的最新进展已显示出整体场景理解的前景&…...
利用Python爬虫实现百度图片搜索的PNG图片下载
在图像识别、训练数据集构建等场景中,我们经常需要从互联网上批量下载图片素材。百度图片是中文搜索中最常用的来源之一。本文将介绍如何使用Python构建一个稳定、可扩展的百度图片爬虫,专门用于下载并保存高清PNG格式图片。 一、项目目标 本项目的目标…...
自主可控鸿道Intewell工业实时操作系统
鸿道Intewell工业实时操作系统是东土科技旗下科东软件自主研发的新一代智能工业操作系统,以下是相关介绍: 系统架构 -Intewell-C全实时构型:设备上只运行自研RTOS的全实时系统,适用于有功能安全认证需求的实时控制场景…...
【数据结构入门训练DAY-21】信息学奥赛一本通T1334-围圈报数
文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 STL库中队列的使用练习。训练解题思维 一、题目 有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数&am…...
【C语言】C语言中的字符函数和字符串函数全解析
前言 在C语言编程中,字符和字符串的处理是必不可少的。C语言标准库提供了丰富的字符和字符串函数,这些函数极大地简化了字符和字符串的操作。本文将详细介绍这些函数的使用方法、模拟实现以及一些实用的代码示例,帮助你更好地理解和掌握它们…...
声纹振动传感器在电力监测领域的应用
声纹振动传感器在电力监测领域有多种应用,主要包括以下几个方面: 变压器监测 故障诊断:变压器在运行过程中会产生特定的声纹和振动信号,当变压器内部出现故障,如绕组短路、铁芯松动、局部放电等,其声纹和振…...
配色之道:解码产品设计中的UI设计配色艺术
在数字化时代,用户界面(UI)作为产品与用户交互的桥梁,其设计质量直接影响着用户体验与产品成败。而配色,作为UI设计中最为直观且富有表现力的元素之一,不仅是视觉美学的体现,更是情感传递、信息…...
python基础语法测试
1. 关于Python语言数值操作符,以下选项中描述错误的是 A x%y表示x与y之商的余数,也称为模运算 B x/y表示x与y之商 C x**y表示x的y次幂,其中,y必须是整数 D x//y表示x与y之整数商,即不大于x与y之商的最大整数2. 下面代码…...