构建自己的AI客服【根据用户输入生成EL表达式】
要实现一个基于对话形式的AI客服系统,该系统能够提示用户输入必要的信息,并根据用户的输入生成相应的EL(Expression Language)表达式编排规则,您可以按照以下步骤进行设计和开发。本文将涵盖系统架构设计、关键技术选型、具体实现步骤以及一些扩展功能的建议。
1. 系统架构设计
1.1. 系统组成
- 前端:负责与用户进行交互,展示对话界面,收集用户输入,并显示AI生成的EL表达式。
- 后端:处理用户输入,管理对话状态,生成EL表达式,并与AI/NLP服务集成以增强对话能力。
- 数据库(可选):存储用户会话数据、EL表达式规则等信息,便于后续分析和使用。
- AI/NLP 服务:用于理解用户意图,管理对话逻辑,确保对话的自然性和智能性。
1.2. 技术选型
- 前端:
- 框架:React.js、Vue.js 或纯HTML/CSS/JavaScript
- 实时通信:WebSocket 或基于HTTP的轮询(如使用REST API)
- 后端:
- 框架:Spring Boot
- 实时通信:Spring WebSocket 或基于REST API的异步处理
- 数据库:MySQL、PostgreSQL 或 NoSQL(如MongoDB)
- AI/NLP 服务:
- 使用预训练的模型(如OpenAI的GPT系列)
- 或者集成其他NLP库(如Rasa、Dialogflow)
2. 具体实现步骤
2.1. 搭建后端基础架构
2.1.1. 创建Spring Boot项目
使用Spring Initializr创建一个新的Spring Boot项目,包含以下依赖:
- Spring Web
- Spring Data JPA(如果需要数据库支持)
- Spring WebSocket(用于实时通信)
- Lombok(简化代码)
- 其他必要的依赖,如数据库驱动等
2.1.2. 配置数据库(可选)
如果需要持久化存储用户会话或EL表达式规则,配置数据库连接。
application.properties
示例:
spring.datasource.url=jdbc:mysql://localhost:3306/aicustomerdb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
2.1.3. 创建实体类(可选)
如果需要存储用户会话或EL表达式规则,创建相应的实体类。
package com.example.aicustomer.model;import javax.persistence.*;@Entity
public class ELExpression {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String tableId;private String fieldId;private String javaFieldName;private String elExpression;// Getters and Setters
}
2.1.4. 创建Repository接口(可选)
package com.example.aicustomer.repository;import com.example.aicustomer.model.ELExpression;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface ELExpressionRepository extends JpaRepository<ELExpression, Long> {// 自定义查询方法(如需要)
}
2.2. 实现对话管理和EL表达式生成逻辑
2.2.1. 创建用户输入模型
package com.example.aicustomer.model;public class UserInput {private String userName;private String userAction;private String targetResource;// Getters and Setters
}
2.2.2. 创建EL表达式生成服务
package com.example.aicustomer.service;import com.example.aicustomer.model.UserInput;
import org.springframework.stereotype.Service;@Service
public class ExpressionService {public String generateELExpression(UserInput userInput) {// 根据用户输入生成EL表达式,这里使用简单的拼接,可以根据需要调整逻辑return String.format("${user.name == '%s' and user.action == '%s' and user.target == '%s'}",userInput.getUserName(),userInput.getUserAction(),userInput.getTargetResource());}
}
2.2.3. 集成AI/NLP服务
为了实现智能对话,可以集成OpenAI的GPT模型或者其他NLP服务。以下示例假设使用OpenAI的API。
添加依赖(使用OpenAI的Java库或使用HTTP客户端如RestTemplate或WebClient):
<!-- 在pom.xml中添加HTTP客户端依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
创建AI服务类:
package com.example.aicustomer.service;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;@Service
public class AIService {@Value("${openai.api.key}")private String openAIApiKey;private final WebClient webClient;public AIService(WebClient.Builder webClientBuilder) {this.webClient = webClientBuilder.baseUrl("https://api.openai.com/v1").build();}public Mono<String> getAIResponse(String prompt) {return webClient.post().uri("/completions").header("Authorization", "Bearer " + openAIApiKey).bodyValue("{ \"model\": \"text-davinci-003\", \"prompt\": \"" + prompt + "\", \"max_tokens\": 150 }").retrieve().bodyToMono(String.class).map(response -> {// 解析AI响应,这里简单返回整个响应,实际使用时需要解析JSON获取具体内容return response;});}
}
注意: 确保在application.properties
中配置OpenAI的API密钥。
openai.api.key=your_openai_api_key
2.2.4. 创建控制器处理对话
package com.example.aicustomer.controller;import com.example.aicustomer.model.UserInput;
import com.example.aicustomer.service.AIService;
import com.example.aicustomer.service.ExpressionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;@RestController
@RequestMapping("/api/chat")
public class ChatController {@Autowiredprivate AIService aiService;@Autowiredprivate ExpressionService expressionService;@PostMapping("/message")public Mono<ResponseEntity<String>> handleMessage(@RequestBody String userMessage) {// 这里可以添加对用户消息的解析和状态管理// 示例:假设用户输入的消息包含所有必要的信息,以简化流程// 真实场景中可能需要多轮对话来收集信息// 解析用户输入(根据具体格式)// 这里假设用户输入格式为 "name:xxx;action:yyy;target:zzz"UserInput userInput = parseUserMessage(userMessage);// 生成EL表达式String elExpression = expressionService.generateELExpression(userInput);// 构建AI响应String aiResponse = "生成的EL表达式是: " + elExpression;return Mono.just(ResponseEntity.ok(aiResponse));}private UserInput parseUserMessage(String message) {UserInput input = new UserInput();String[] parts = message.split(";");for (String part : parts) {String[] keyValue = part.split(":");if (keyValue.length != 2) continue;switch (keyValue[0].trim().toLowerCase()) {case "name":input.setUserName(keyValue[1].trim());break;case "action":input.setUserAction(keyValue[1].trim());break;case "target":input.setTargetResource(keyValue[1].trim());break;default:break;}}return input;}
}
2.3. 实现前端对话界面
前端部分可以使用React.js或Vue.js构建SPA(单页面应用),但为了简化,这里以纯HTML、CSS和JavaScript为例。
index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>AI客服系统</title><style>body {font-family: Arial, sans-serif;background-color: #f2f2f2;}.chat-container {width: 400px;margin: 50px auto;background-color: #fff;border-radius: 5px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);overflow: hidden;}.chat-box {height: 400px;overflow-y: scroll;padding: 20px;border-bottom: 1px solid #ddd;}.chat-message {margin-bottom: 15px;}.chat-message.user {text-align: right;}.chat-message.ai {text-align: left;}.chat-input {display: flex;padding: 10px;}.chat-input input {flex: 1;padding: 10px;border: 1px solid #ddd;border-radius: 3px;}.chat-input button {padding: 10px 15px;margin-left: 10px;border: none;background-color: #28a745;color: #fff;border-radius: 3px;cursor: pointer;}.chat-input button:hover {background-color: #218838;}</style>
</head>
<body><div class="chat-container"><div class="chat-box" id="chatBox"><!-- 聊天记录 --></div><div class="chat-input"><input type="text" id="userInput" placeholder="请输入您的信息..." /><button id="sendButton">发送</button></div></div><script>document.getElementById("sendButton").addEventListener("click", sendMessage);document.getElementById("userInput").addEventListener("keypress", function(e) {if (e.key === 'Enter') {sendMessage();}});function appendMessage(message, sender) {const chatBox = document.getElementById("chatBox");const messageDiv = document.createElement("div");messageDiv.classList.add("chat-message", sender);messageDiv.innerText = message;chatBox.appendChild(messageDiv);chatBox.scrollTop = chatBox.scrollHeight;}async function sendMessage() {const userInput = document.getElementById("userInput").value.trim();if (!userInput) return;appendMessage("用户: " + userInput, "user");document.getElementById("userInput").value = "";// 发送消息到后端try {const response = await fetch("/api/chat/message", {method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify(userInput)});if (response.ok) {const aiResponse = await response.text();appendMessage("AI: " + aiResponse, "ai");} else {appendMessage("AI: 服务器错误,请稍后再试。", "ai");}} catch (error) {appendMessage("AI: 无法连接到服务器。", "ai");}}</script>
</body>
</html>
2.4. 启动和测试
- 启动后端:确保Spring Boot应用正常启动,没有报错。
- 访问前端页面:在浏览器中打开
index.html
,通常可以通过将其放置在resources/static
目录下,并通过http://localhost:8080/index.html
访问。 - 进行对话测试:在对话框中输入类似
name:张三;action:登录;target:系统
的格式,查看AI是否正确生成EL表达式。
3. 扩展功能与优化
3.1. 多轮对话与对话状态管理
当前实现假设用户一次性提供所有必要的信息,实际应用中可能需要引导用户逐步提供。例如:
- AI询问用户姓名
- 获取姓名后,询问用户的操作
- 获取操作后,询问目标资源
- 最后生成EL表达式
实现方法:
- 在后端维护用户会话状态,可以使用WebSocket进行实时通信。
- 使用Spring Session或其他会话管理工具。
3.2. 集成AI/NLP模型提升对话智能性
通过集成更强大的AI模型(如OpenAI的GPT系列),可以实现更自然和智能的对话,引导用户完成必要的输入。
示例:
// 在ChatController中集成AIService
@PostMapping("/message")
public Mono<ResponseEntity<String>> handleMessage(@RequestBody String userMessage, @RequestHeader String sessionId) {// 获取或初始化会话状态SessionState session = sessionService.getSession(sessionId);// 生成AI提示String prompt = generatePrompt(session, userMessage);return aiService.getAIResponse(prompt).map(aiResponse -> {// 解析AI响应,更新会话状态String finalResponse = processAIResponse(aiResponse, session);return ResponseEntity.ok(finalResponse);});
}
3.3. 使用WebSocket实现实时对话
使用WebSocket可以实现更流畅的实时对话体验。
后端配置WebSocket:
// WebSocketConfig.java
package com.example.aicustomer.config;import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic"); // 区域性消息代理config.setApplicationDestinationPrefixes("/app"); // 应用前缀}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/ws-chat").setAllowedOrigins("*").withSockJS();}
}
前端使用SockJS和Stomp.js进行连接:
<!-- 在index.html中引入SockJS和Stomp.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
<script>const socket = new SockJS('/ws-chat');const stompClient = Stomp.over(socket);stompClient.connect({}, function(frame) {console.log('Connected: ' + frame);stompClient.subscribe('/topic/replies', function(message) {appendMessage("AI: " + message.body, "ai");});});function sendMessage() {const userInput = document.getElementById("userInput").value.trim();if (!userInput) return;appendMessage("用户: " + userInput, "user");document.getElementById("userInput").value = "";stompClient.send("/app/chat", {}, userInput);}
</script>
调整后端控制器以支持WebSocket通信:
package com.example.aicustomer.controller;import com.example.aicustomer.service.AIService;
import com.example.aicustomer.service.ExpressionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;@Controller
public class ChatWebSocketController {@Autowiredprivate ExpressionService expressionService;@MessageMapping("/chat")@SendTo("/topic/replies")public String handleMessage(String message) {// 解析用户消息UserInput userInput = parseUserMessage(message);// 生成EL表达式String elExpression = expressionService.generateELExpression(userInput);// 返回AI响应return "生成的EL表达式是: " + elExpression;}private UserInput parseUserMessage(String message) {UserInput input = new UserInput();String[] parts = message.split(";");for (String part : parts) {String[] keyValue = part.split(":");if (keyValue.length != 2) continue;switch (keyValue[0].trim().toLowerCase()) {case "name":input.setUserName(keyValue[1].trim());break;case "action":input.setUserAction(keyValue[1].trim());break;case "target":input.setTargetResource(keyValue[1].trim());break;default:break;}}return input;}
}
3.4. 增强EL表达式生成逻辑
根据实际业务需求,增强EL表达式的生成逻辑,支持更多条件和复杂的表达式。
public String generateELExpression(UserInput userInput) {StringBuilder el = new StringBuilder("${");if (userInput.getUserName() != null && !userInput.getUserName().isEmpty()) {el.append("user.name == '").append(userInput.getUserName()).append("' ");}if (userInput.getUserAction() != null && !userInput.getUserAction().isEmpty()) {if (el.length() > 2) el.append("and ");el.append("user.action == '").append(userInput.getUserAction()).append("' ");}if (userInput.getTargetResource() != null && !userInput.getTargetResource().isEmpty()) {if (el.length() > 2) el.append("and ");el.append("user.target == '").append(userInput.getTargetResource()).append("' ");}el.append("}");return el.toString();
}
3.5. UI/UX 优化
- 美化对话界面:使用CSS框架(如Bootstrap、Tailwind CSS)提升界面美观度。
- 添加图片、按钮等丰富内容:增强用户体验。
- 支持表情、文件传输等功能:提高互动性。
3.6. 安全性与性能优化
- 输入校验:防止XSS攻击,确保用户输入内容安全。
- 身份认证:如果需要,添加用户认证机制。
- 性能优化:针对高并发场景进行优化,如使用缓存、异步处理等。
4. 示例演示
假设用户在对话框中输入:name:张三;action:登录;target:系统
系统将生成以下EL表达式:
${user.name == '张三' and user.action == '登录' and user.target == '系统'}
对话过程示例:
用户: name:张三;action:登录;target:系统
AI: 生成的EL表达式是: ${user.name == '张三' and user.action == '登录' and user.target == '系统'}
5. 部署与上线
5.1. 部署后端
- 选择服务器:如AWS、阿里云、腾讯云等。
- 配置运行环境:安装Java、数据库等必要环境。
- 打包部署:使用Maven或Gradle打包Spring Boot应用,并使用服务管理工具(如Systemd)部署为服务。
5.2. 部署前端
- 静态资源部署:将前端页面放置在后端的
resources/static
目录下,或使用独立的前端服务器(如Nginx)托管。 - 配置域名与SSL:确保访问的安全性和便捷性。
5.3. 监控与维护
- 监控系统健康状态:使用监控工具(如Prometheus、Grafana)监控系统性能。
- 日志管理:收集和分析日志,及时发现和解决问题。
6. 总结
通过上述步骤,您可以构建一个基于对话形式的AI客服系统,能够与用户进行自然的对话,收集必要的信息,并生成相应的EL表达式编排规则。根据具体需求,您可以进一步完善系统的功能和性能,例如增强对话智能性、支持多轮对话、优化UI/UX等。
参考资源
- Spring Boot官方文档:https://spring.io/projects/spring-boot
- WebSocket教程:Spring WebSocket文档
- OpenAI API文档:https://beta.openai.com/docs/
- 前端框架文档:
- React.js:https://reactjs.org/
- Vue.js:https://vuejs.org/
相关文章:
构建自己的AI客服【根据用户输入生成EL表达式】
要实现一个基于对话形式的AI客服系统,该系统能够提示用户输入必要的信息,并根据用户的输入生成相应的EL(Expression Language)表达式编排规则,您可以按照以下步骤进行设计和开发。本文将涵盖系统架构设计、关键技术选型…...

(50)[HGAME 2023 week2]before_main
[HGAME 2023 week2]before_main nss:3501 我们进入那个sub_12EB然后我们发现这个就是base64加密 我们取得qword_4020: 0CxWsOemvJq4zdk2V6QlArj9wnHbt1NfEX/3DhyPoBRLY8pK5FciZau7UMIgTSG 很显然这个是自定义映射base64.然后我们代入我们之前写的base64自定义映射代码 enc:A…...
机器学习数学基础:39.样本和隐含和残差协方差矩阵
假设我们研究学生的数学成绩、英语成绩和学习时间之间的关系。收集了100名学生这三项数据作为样本。 样本协方差矩阵 计算得到的样本协方差矩阵如下(假设数据简化): [ V a r ( 数学 ) C o v ( 数学 , 英语 ) C o v ( 数学 , 学习时间 ) C …...
java之http传MultipartFile文件
【需求】前端请求后端做文件上传或者excel上传,后端不解析直接把MultipartFile传给第三方平台,通过http的方式该怎么写 import org.springframework.web.multipart.MultipartFile;import java.io.*; import java.net.HttpURLConnection; import java.ne…...
深入解析SpringMVC中Http响应的实现机制
在Web应用开发中,处理HTTP请求并返回相应的HTTP响应是核心任务之一。SpringMVC作为Java生态中广泛使用的Web框架,提供了灵活且强大的机制来处理HTTP请求和生成HTTP响应。本文将深入探讨SpringMVC中如何实现HTTP响应的返回,涵盖从控制器方法的…...
构建一个支持精度、范围和负数的-Vue-数字输入框
分析并实现一个支持精度、范围和负数控制的数字输入框。 背景 在很多业务中,我们经常需要使用数字输入框,通常这些输入框会涉及到数字校验,比如限制输入范围、设置小数精度、是否允许负数等。每次写表单时,都需要重复定义这些校…...

尚硅谷爬虫note14
一、scrapy scrapy:为爬取网站数据是,提取结构性数据而编写的应用框架 1. 安装 pip install scrapy 或者,国内源安装 pip install scrapy -i https://pypi.douban.com/simple 2. 报错 报错1)building ‘twisted.te…...

1438. 绝对差不超过限制的最长连续子数组
目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题2.4 代码复盘 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 滑动窗口 2.2 代码尝试 class Solution { public:int longestSubarray(vector<int>& nums, int limit) {int cou…...
ZCC5090EA适用于TYPE-C接口,集成30V OVP功能, 最大1.5A充电电流,带NTC及使能功能,双节锂电升压充电芯片替代CS5090EA
概要: ZCC5090EA是一款5V输入,最大1.5A充电电流,支 持双 节 锂 电 池 串 联 应 用 的 升 压 充 电 管 理 I C 。ZCC5090EA集成功率MOS,采用异步开关架构, 使其在应用时仅需极少的外围器件,可有效减少整体 …...
Dify 开源大语言模型应用开发平台使用(二)
文章目录 说明Dify 使用报告1. 应用创建——专业的锂电池相关知识解答1.1 平台简介1.2 创建应用 2. 知识库、工作流、变量、节点与编排节点详解2.1 知识库管理2.2 工作流配置2.3 变量管理2.4 节点与编排节点 3. 测试和调试3.1 单元测试3.2 日志与监控3.3 实时调试3.4 性能测试 …...

【LangFuse】数据集与测试
1. 在线标注 2. 上传已有数据集 import json# 调整数据格式 {"input":{...},"expected_output":"label"} data [] with open(my_annotations.jsonl, r, encodingutf-8) as fp:for line in fp:example json.loads(line.strip())item {"i…...

【Python】如何解决Jupyter Notebook修改外部模块后必须重启内核的问题?
“为什么我修改了Python模块的代码,Jupyter Notebook却看不到变化?” 一、问题现象:令人抓狂的开发体验 假设你正在开发一个图像处理项目,项目结构如下: project/ ├── utils/ │ └── image_processor.py └…...
Redis 篇
一、数据结构 二、持久化方式 Redis 提供了两种主要的持久化方式,分别是 RDB(Redis Database)和 AOF(Append Only File),此外,还可以同时使用这两种方式以增强数据安全性,以下为你…...
React + TypeScript 实战指南:用类型守护你的组件
TypeScript 为 React 开发带来了强大的类型安全保障,这里解析常见的一些TS写法: 一、组件基础类型 1. 函数组件定义 // 显式声明 Props 类型并标注返回值 interface WelcomeProps {name: string;age?: number; // 可选属性 }const Welcome: React.FC…...

从零开始:Linux环境下如何制作静态库与动态库
个人主页:chian-ocean 文章专栏-Linux 前言 动静态库是编程中两种主要的库类型,它们用于帮助开发者复用已有的代码,而不需要每次都从头开始编写。它们的主要区别在于链接和加载的时机、方式以及使用场景 库 库就是一些已经写好并且经过测试…...
【智能体Agent】ReAct智能体的实现思路和关键技术
基于ReAct(Reasoning Acting)框架的自主智能体 import re from typing import List, Tuplefrom langchain_community.chat_message_histories.in_memory import ChatMessageHistory from langchain_core.language_models.chat_models import BaseChatM…...

Java进阶:Zookeeper相关笔记
概要总结: ●Zookeeper是一个开源的分布式协调服务,需要下载并部署在服务器上(使用cmd启动,windows与linux都可用)。 ●zookeeper一般用来实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能。 ●有多台服…...

QT-绘画事件
实现颜色的随时调整,追加橡皮擦功能 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QColor> #include <QPoint> #include <QVector> #include <QMouseEvent> #include <QPainter> #include <Q…...

鸿蒙NEXT开发-端云一体化开发
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 端云一体化开发基本概念 传统架构 端云一…...

大模型——股票分析AI工具开发教程
大模型——股票分析AI工具开发教程 在本教程中,我们将利用Google Gemini 2.0 Flash模型创建一个简单但有效的股票分析器。 你是否曾被大量的股票市场数据所淹没?希望有一个私人助理来筛选噪音并为您提供清晰、可操作的见解?好吧,你可以自己构建一个,而且由于 Python 的强…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...