常见问题QA的前端代码

这个的后端代码参见此文

使用语言向量建立常见问题的模糊搜索-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/chenchihwen/article/details/144207262?spm=1001.2014.3001.5501

这段代码实现了一个简单的问答页面,页面分为左右两部分,左侧用于展示对话记录,右侧用于用户输入问题并提交,获取答案后在对应区域显示答案,同时会将每一轮的问答信息添加到对话记录中进行展示,整体通过 HTML 结构定义页面布局,结合 JavaScript 实现交互功能。

HTML 部分详细分析

  1. 文档结构与头部设置(<head>部分)

<head><meta charset="UTF-8"><title>问答测试</title><style>...(内联CSS样式,后续单独分析)</style>
</head>

  • 首先通过<meta charset="UTF-8">指定了文档的字符编码为 UTF-8,确保能正确显示各种字符。
  • <title>标签定义了页面的标题为 “问答测试”,会显示在浏览器的标题栏。
  • 内联的<style>标签中定义了页面的样式规则,用于控制页面元素的外观呈现。

  1. 页面主体结构(<body>部分)

<body><div class="main-container"><div class="conversation-log-container"><h2 class="conversation-title">对话记录</h2><div id="conversationDiv"></div></div><div class="question-answer-container"><h1 class="qa-title">提交问题与答案显示</h1><form id="questionForm" action="/process_question" method="post"><label for="user_question">请输入你的问题:</label><br><input type="text" id="user_question" name="user_question" required><br><input type="submit" value="提交"></form><div id="answerDiv"></div></div></div>
</body>

  • <body>标签内是页面的主体内容,整体采用了flex布局(由外层的.main-container类样式控制),将页面划分为左右两部分来展示不同的功能区域。
  • 左侧对话记录区域(.conversation-log-container
    • 包含一个<h2>标题标签,显示 “对话记录” 字样,用于提示该区域的作用。
    • 有一个空的<div>元素,其idconversationDiv,后续通过 JavaScript 动态往里面添加对话记录的具体内容。
  • 右侧提交问题与答案显示区域(.question-answer-container
    • 首先有一个<h1>标题标签,显示 “提交问题与答案显示”,表明该区域功能。
    • 包含一个<form>表单元素,其idquestionFormaction属性指向"/process_question"(对应后端处理问题的接口,和之前 Python 代码中的服务器路由相关联),method属性为"post"表示以 POST 方式提交表单数据。表单内有一个<label>标签用于提示用户输入问题,一个<input>文本框用于用户输入具体问题(设置了required属性要求用户必须输入内容),还有一个<input>提交按钮用于提交表单。
    • 还有一个空的<div>元素,其idanswerDiv,用于在提交问题后通过 JavaScript 获取后端返回的答案并展示在此处。

CSS 样式部分详细分析(<style>内联样式)

  1. 页面整体样式(body选择器)

body {font-family: Arial, sans-serif;background-color: #f4f4f4;display: flex;justify-content: center;align-items: center;min-height: 100vh;margin: 0;padding: 0;
}

  • 设置了页面整体的字体为Arial或无衬线字体(sans-serif作为备选),背景颜色为浅灰色(#f4f4f4)。
  • 利用flex布局将页面内容在水平和垂直方向上进行居中对齐,设置最小高度为视口高度(100vh),并去除了页面默认的外边距和内边距。

  1. 主容器样式(.main-container选择器)

.main-container {display: flex;width: 1000px;
}

定义了主容器采用flex布局,宽度为1000px,用于划分左右两部分的功能区域。
3. 左侧对话记录容器样式(.conversation-log-container选择器)

.conversation-log-container {background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);width: 450px;/* height: 1000px; */
}

  • 将对话记录容器的背景色设置为白色(#fff),添加了内边距为20px,设置了圆角边框(半径为5px)以及一个淡淡的阴影效果(box-shadow属性),使其在页面上有一定的立体感和视觉区分度。
  • 宽度设置为450px,可以根据实际需求调整这个宽度值,注释掉的height属性若启用可固定容器高度,目前采用默认高度由内容撑开的方式。

  1. 对话记录标题样式(h2.conversation-title选择器)

h2.conversation-title {color: #333;
}

设置对话记录标题的字体颜色为深灰色(#333),使其与整体页面风格协调且有一定的视觉层次。
5. 对话记录展示区域样式(#conversationDiv选择器)

#conversationDiv {margin-top: 20px;max-height: 450px;overflow-y: auto;font-family: Arial, sans-serif;
}

  • 给对话记录展示区域添加了顶部外边距为20px,设置了最大高度为450px,并当内容超出这个高度时启用垂直滚动条(overflow-y: auto)来查看更多对话记录内容,字体同样遵循页面整体设置的Arial或无衬线字体风格。

  1. 对话记录单项样式(.conversation-item选择器)

.conversation-item {margin-bottom: 10px;padding: 10px;border-bottom: 1px solid #ccc;white-space: pre-line; /* 让对话记录中的内容也能折行显示 */
}
.conversation-item:last-child {border-bottom: none;
}

  • 每个对话记录单项有底部外边距为10px,内边距为10px,并且底部有一条浅灰色(#ccc)的边框用于区分不同的对话记录项,最后一项通过:last-child伪类去除了底部边框,使其视觉上更简洁。
  • white-space: pre-line属性设置让对话记录中的文本内容可以按照正常的文本换行规则进行折行显示,方便展示较长的问答内容。

  1. 问题文本样式(.question选择器)

.question {font-weight: bold;
}

将对话记录中的问题文本设置为加粗字体,便于区分问题和答案部分,增强可读性。
8. 右侧提交问题与答案显示容器样式(.question-answer-container选择器)

.question-answer-container {background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);width: 550px;margin-left: 50px;
}

和左侧对话记录容器类似,设置了白色背景、内边距、圆角边框、阴影效果等,宽度设置为550px,并且通过margin-left属性设置了与左侧容器的间距为50px,使其在页面上合理布局。
9. 右侧标题样式(h1.qa-title选择器)

h1.qa-title {color: #333;
}

设置右侧区域标题的字体颜色为深灰色(#333),保持页面整体视觉风格的一致性。
10. 表单样式(form#questionForm选择器)

form#questionForm {text-align: center;
}

将表单内的元素在水平方向上进行居中对齐,让页面布局看起来更整齐美观。
11. 标签样式(label选择器)

label {display: block;margin-bottom: 10px;
}

使每个<label>标签单独占一行显示,并设置了底部外边距为10px,方便页面排版和阅读提示信息。
12. 输入框样式(input[type="text"]选择器)

input[type="text"] {width: 100%;padding: 10px;margin-bottom: 20px;border: 1px solid #ccc;border-radius: 3px;
}

定义了文本输入框的样式,宽度占满父容器(100%),添加了内边距为10px,底部外边距为20px,设置了浅灰色的边框以及较小的圆角边框效果,使其外观简洁且符合常见的输入框设计风格。
13. 提交按钮样式(input[type="submit"]选择器)

input[type="submit"] {background-color: #007BFF;color: #fff;padding: 10px 20px;border: none;border-radius: 3px;cursor: pointer;
}

将提交按钮的背景色设置为蓝色(#007BFF,常见的按钮强调色),字体颜色为白色,添加了内边距,去除了边框,设置了小的圆角边框效果,并添加了鼠标指针悬停变为手型(cursor: pointer)的交互效果,使其在页面上很容易被识别和操作。
14. 答案显示区域样式(#answerDiv选择器)

#answerDiv {white-space: pre-line;margin-top: 20px;word-break: break-all; /* 确保长文本能正常换行显示 */
}

和对话记录展示区域类似,设置了顶部外边距为20pxwhite-space: pre-line让内容可以按正常文本换行规则显示,同时添加了word-break: break-all属性确保长文本能在合适的位置正常换行,避免出现文本超出容器宽度而显示不全的情况。

JavaScript 部分详细分析

  1. 全局变量定义与表单提交事件监听

// 用于存储对话记录的数组
var conversation = [];document.getElementById('questionForm').addEventListener('submit', function (e) {e.preventDefault();var questionInput = document.getElementById('user_question');var questionText = questionInput.value;var xhr = new XMLHttpRequest();xhr.open('POST', '/process_question', true);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {var answerDiv = document.getElementById('answerDiv');// 使用 innerHTML 将响应文本当作 HTML 内容解析,使图片、超链接等能正确显示answerDiv.innerHTML = xhr.responseText;// 将本次的问题和答案添加到对话记录数组中conversation.push({question: questionText,answer: xhr.responseText});// 清空输入框,方便继续提问questionInput.value = "";// 重新渲染对话记录展示区域renderConversation();}};xhr.send('user_question=' + encodeURIComponent(questionText));
});

  • 首先定义了一个名为conversation的全局数组,用于存储每一轮问答的信息(问题和对应的答案)。
  • 通过document.getElementById获取到页面中的表单元素,并给其添加submit事件监听器。当用户提交表单时:
    • 调用e.preventDefault()阻止表单默认的提交行为,避免页面刷新。
    • 获取用户在输入框中输入的问题文本内容。
    • 创建一个XMLHttpRequest对象用于发送 HTTP 请求到后端("/process_question"这个接口,对应后端 Python 代码中处理问题的路由),设置请求方式为POST,并设置请求头的Content-Type"application/x-www-form-urlencoded"
    • xhr对象的onreadystatechange事件绑定回调函数,当请求的状态变为4(表示请求已完成)且状态码为200(表示成功)时:
      • 获取页面中用于显示答案的<div>元素,将后端返回的响应文本通过innerHTML属性赋值给该元素,这样可以解析响应文本中的 HTML 内容(比如如果答案中有图片、超链接等元素能正确显示)。
      • 将本次的问题和答案以对象的形式添加到conversation数组中。
      • 清空输入框内容,方便用户继续提问。
      • 调用renderConversation函数重新渲染对话记录展示区域,使其能及时更新显示最新的问答信息。
    • 最后通过xhr.send方法发送包含用户问题的请求数据,需要对问题文本进行encodeURIComponent编码,以符合 URL 编码规范。

  1. 对话记录渲染函数(renderConversation

// 渲染对话记录展示区域的函数
function renderConversation() {var conversationDiv = document.getElementById('conversationDiv');conversationDiv.innerHTML = "";conversation.forEach(function (item, index) {var conversationItem = document.createElement('div');conversationItem.className = 'conversation-item';var questionDiv = document.createElement('div');questionDiv.className = 'question';questionDiv.innerHTML = "Q" + (index + 1) + ": " + item.question;var answerDiv = document.createElement('div');answerDiv.className = 'answer';// 使用 innerHTML 将答案内容当作 HTML 内容解析,使图片等能正确显示answerDiv.innerHTML = "A" + (index + 1) + ": " + item.answer;conversationItem.appendChild(questionDiv);conversationItem.appendChild(answerDiv);conversationDiv.appendChild(conversationItem);});
}

这个函数用于更新对话记录展示区域的内容,首先获取到idconversationDiv的元素,并清空其原有的innerHTML内容。然后遍历conversation数组中的每一项(每个问答对象):

  • 创建一个新的<div>元素作为对话记录单项的容器,并设置其类名为conversation-item,以应用对应的 CSS 样式。
  • 分别创建用于显示问题和答案的<div>子元素,设置相应的类名(questionanswer),并通过innerHTML将问答内容填充进去,同样可以解析 HTML 内容。
  • 将问题和答案的<div>子元素添加到对话记录单项容器中,再将该容器添加到对话记录展示区域的<div>元素内,从而实现对话记录的动态渲染和展示。

潜在的改进点和注意事项

  • 兼容性问题:代码中使用的XMLHttpRequest在现代浏览器中基本都支持,但对于一些较老版本的浏览器可能存在兼容性问题。可以考虑使用更现代的fetch API 来替代,它提供了更简洁、功能更强大的异步请求方式,并且有较好的浏览器兼容性(不过需要进行适当的错误处理和功能适配)。
  • 安全性考虑:在将后端返回的内容直接通过innerHTML解析并显示时,如果后端返回的数据不可信(比如存在恶意的 HTML、JavaScript 代码),可能会导致安全漏洞,如跨站脚本攻击(XSS)。建议对后端返回的数据进行严格的过滤和转义处理,只允许显示安全的文本内容或者对 HTML 标签进行白名单验证后再进行解析显示。
  • 响应数据格式处理优化:目前假设后端返回的文本可以直接通过innerHTML进行解析显示,但如果后端返回的数据格式比较复杂(比如是 JSON 格式包含了多种类型的数据需要分别处理),需要进一步优化代码逻辑,对响应数据进行准确的解析和展示,例如可以通过JSON.parse先将 JSON 数据解析成 JavaScript 对象,再根据具体的结构进行相应的页面渲染操作。

完整代码如下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>问答测试</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;display: flex;justify-content: center;align-items: center;min-height: 100vh;margin: 0;padding: 0;}.main-container {display: flex;width: 1000px;}/* 左侧对话记录样式 */.conversation-log-container {background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);width: 450px;/* height: 1000px; */}h2.conversation-title {color: #333;}#conversationDiv {margin-top: 20px;max-height: 450px;overflow-y: auto;font-family: Arial, sans-serif;}.conversation-item {margin-bottom: 10px;padding: 10px;border-bottom: 1px solid #ccc;white-space: pre-line; /* 让对话记录中的内容也能折行显示 */}.conversation-item:last-child {border-bottom: none;}.question {font-weight: bold;}/* 右侧提交问题和答案显示样式 */.question-answer-container {background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);width: 550px;margin-left: 50px;}h1.qa-title {color: #333;}form#questionForm {text-align: center;}label {display: block;margin-bottom: 10px;}input[type="text"] {width: 100%;padding: 10px;margin-bottom: 20px;border: 1px solid #ccc;border-radius: 3px;}input[type="submit"] {background-color: #007BFF;color: #fff;padding: 10px 20px;border: none;border-radius: 3px;cursor: pointer;}#answerDiv {white-space: pre-line;margin-top: 20px;word-break: break-all; /* 确保长文本能正常换行显示 */}</style>
</head><body><div class="main-container"><div class="conversation-log-container"><h2 class="conversation-title">对话记录</h2><div id="conversationDiv"></div></div><div class="question-answer-container"><h1 class="qa-title">提交问题与答案显示</h1><form id="questionForm" action="/process_question" method="post"><label for="user_question">请输入你的问题:</label><br><input type="text" id="user_question" name="user_question" required><br><input type="submit" value="提交"></form><div id="answerDiv"></div></div></div><script>// 用于存储对话记录的数组var conversation = [];document.getElementById('questionForm').addEventListener('submit', function (e) {e.preventDefault();var questionInput = document.getElementById('user_question');var questionText = questionInput.value;var xhr = new XMLHttpRequest();xhr.open('POST', '/process_question', true);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {var answerDiv = document.getElementById('answerDiv');// 使用 innerHTML 将响应文本当作 HTML 内容解析,使图片、超链接等能正确显示answerDiv.innerHTML = xhr.responseText;// 将本次的问题和答案添加到对话记录数组中conversation.push({question: questionText,answer: xhr.responseText});// 清空输入框,方便继续提问questionInput.value = "";// 重新渲染对话记录展示区域renderConversation();}};xhr.send('user_question=' + encodeURIComponent(questionText));});// 渲染对话记录展示区域的函数function renderConversation() {var conversationDiv = document.getElementById('conversationDiv');conversationDiv.innerHTML = "";conversation.forEach(function (item, index) {var conversationItem = document.createElement('div');conversationItem.className = 'conversation-item';var questionDiv = document.createElement('div');questionDiv.className = 'question';questionDiv.innerHTML = "Q" + (index + 1) + ": " + item.question;var answerDiv = document.createElement('div');answerDiv.className = 'answer';// 使用 innerHTML 将答案内容当作 HTML 内容解析,使图片等能正确显示answerDiv.innerHTML = "A" + (index + 1) + ": " + item.answer;conversationItem.appendChild(questionDiv);conversationItem.appendChild(answerDiv);conversationDiv.appendChild(conversationItem);});}</script></body></html>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网 Java 面试八股文汇总(2025 最新整理)

我分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#xff0c;都…

CTF之密码学(密码特征分析)

一.MD5,sha1,HMAC,NTLM 1.MD5&#xff1a;MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1&#xff1a;这种加密的密文特征跟MD5差不多&#xff0c;只不过位数是40&#xff08;sha256&#xff1a;64位&#xff1b;sha512:128位&#xff09; 3.HMAC&#xff1a;这…

Linux 入门——基本指令2

目录 1. 通配符的使用 1&#xff09;基本使用 2&#xff09; 拓展使用 2. cp 文件拷贝 基本使用 3. mv :文件剪切或者文件重命名 4. more 指令 5. less 指令 6. cat ,more , less 指令的区别 7. head 8. tail 9. date 日期&#xff0c;时间相关的指令 1&…

2024年12月3日Github流行趋势

项目名称&#xff1a;Lobe Chat 项目维护者&#xff1a;arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍&#xff1a;一个开源的、现代化设计的人工智能聊天框架。支持多种AI提供商&#xff08;OpenAI / Claude 3 / Gemini / Ollama / Qwen / De…

vue2+cesium初始化地图

目录 1、在vue2项目中下载cesium 2、安装loader 3、更改vue.config.js中的配置 4、main.js中引入 5、App.vue中设置样式 6、新建map.vue 其中代码如下&#xff1a; 7、在App.vue中使用Map组件 8、效果展示&#xff1a; 1、在vue2项目中下载cesium npm install cesium 可…

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…

TYUT设计模式精华版

七大原则 单一职责原则 职责要单一不能将太多的职责放在一个类中 开闭原则 软件实体对扩展是开放的&#xff0c;但对修改是关闭的 里氏代换原则 一个可以接受基类对象的地方必然可以接受子类 依赖倒转原则 要针对抽象层编程&#xff0c;而不要针对具体类编程 接口隔离原则 …

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类&#xff0c;用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2&#xff08;api8&#xff09;之后新增的一个&#xff0c;该类为…

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…

Vue框架开发一个简单的购物车(Vue.js)

让我们利用所学知识来开发一个简单的购物车 &#xff08;记得暴露属性和方法&#xff01;&#xff01;&#xff01;&#xff09; 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

瑞芯微方案主板Linux修改系统串口波特率教程,触觉智能RK3562开发板演示

遇到部分串口工具不支持1500000波特率&#xff0c;这时候就需要进行修改&#xff0c;本文以触觉智能RK3562开发板修改系统波特率为115200为例&#xff0c;介绍瑞芯微方案主板Linux修改系统串口波特率教程。 温馨提示&#xff1a;瑞芯微方案主板/开发板串口波特率只支持115200或…

攻防世界-fileclude-文件包含

赛前回顾 1.题目打开后是文件包含的代码&#xff0c;如下 函数作用 highlight_file(__FILE__) //显示代码到网页 isset //检查变量是否存在并且非null(空) !empty //php内置函数&#xff0c;检查变量是否为空或未设置&#xff0c;正常变量为空会触发&#xff0c;但是有个…

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

&#xff08;来左边儿 跟我一起画个龙&#xff0c;在你右边儿 画一道彩虹 ~~~~~~~~~~~ &#xff09; 效果如下&#xff1a; 以下展示部分颜色源码&#xff1a; namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public s…

Spark和MapReduce场景应用和区别

文章目录 Spark和MapReduce场景应用和区别一、引言二、MapReduce和Spark的应用场景1. MapReduce的应用场景2. Spark的应用场景 三、MapReduce和Spark的区别1. 内存使用和性能2. 编程模型和易用性3. 实时计算支持 四、使用示例1. MapReduce代码示例2. Spark代码示例 五、总结 Sp…

泛化调用 :在没有接口的情况下进行RPC调用

什么是泛化调用&#xff1f; 在RPC调用的过程中&#xff0c;调用端向服务端发起请求&#xff0c;首先要通过动态代理&#xff0c;动态代理可以屏蔽RPC处理流程&#xff0c;使得发起远程调用就像调用本地一样。 RPC调用本质&#xff1a;调用端向服务端发送一条请求消息&#x…

D87【python 接口自动化学习】- pytest基础用法

day87 pytest运行参数 -m -k 学习日期&#xff1a;20241203 学习目标&#xff1a;pytest基础用法 -- pytest运行参数-m -k 学习笔记&#xff1a; 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例&#xff0c;markers最好使用英文 [pytest] testpaths./te…

Android 应用单元测试涉及 Telephony 环境初始化问题

Telephony 相关类注入问题 SubscriptionManager Cannot invoke "android.telephony.SubscriptionManager.getActiveSubscriptionInfoList()" because "this.mSubscriptionManager" is nulljava.lang.NullPointerException: Cannot invoke "android.t…

【Spring】介绍一下 Spring 的 xml 标签以及 Bean 的常用配置

文章目录 配置标签<beans>标签<import>标签<alias> 标签自定义标签 BeanBean 常用配置Bean 作用域Bean 实例化流程Bean 生命周期 配置标签 Spring 的 xml 标签大体上分为两类&#xff0c;一种是默认标签&#xff0c;一种是自定义标签 默认标签&#xff1a;…

MySQL篇—通过官网下载linux系统下多种安装方式的MySQL社区版软件

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

大数据新视界 -- 大数据大厂之 Hive 数据压缩算法对比与选择(下)(20 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…