与copilot 结对编程系列 - log日志重复性检测 - 第4篇 - 网页UI界面

2024-08-25 01:36

本文主要是介绍与copilot 结对编程系列 - log日志重复性检测 - 第4篇 - 网页UI界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

细节可以参考这篇文章: 与copilot 结对编程系列 - log日志重复性检测 - 第1篇 - 总体介绍及效果展示

本文主要将数据库中存储的数据通过网页调用并展示出来, 以下是对详细解释。

web框架选择

当前场景使用 Flask 来展示网页信息.
主要原因如下:

  1. 轻量级和易于使用:Flask 是一个轻量级的 Web 框架,易于设置和使用。它允许开发者快速构建和部署 Web 应用程序,而不需要复杂的配置。
  2. 模板渲染:Flask 提供了强大的模板引擎 Jinja2,可以方便地将 Python 数据传递到 HTML 模板中进行渲染。在 result.html文件中,使用了 Jinja2 模板语法(如 {{ log_results | tojson | safe }})来将后端数据传递到前端。
  3. 路由管理:Flask 提供了简单的路由机制,可以轻松地将 URL 映射到特定的函数。在 app.py文件中,可以定义不同的路由来处理不同的请求,并返回相应的 HTML 页面或数据。
  4. 数据处理:在 database_query.py等脚本中,可以使用 Flask 处理从数据库中查询的数据,并将其传递到前端进行展示。Flask 可以与各种数据库(如 SQLite、MySQL、PostgreSQL)无缝集成。
  5. 扩展性:Flask 拥有丰富的扩展库,可以轻松地添加各种功能,如表单处理、用户认证、文件上传等。开发者可以根据需要选择合适的扩展来增强应用的功能。
  6. 开发和调试:Flask 提供了内置的开发服务器和调试工具,可以方便地进行本地开发和调试。开发者可以快速迭代和测试代码,提升开发效率。

综上所述,Flask 作为一个轻量级且功能强大的 Web 框架,非常适合用于当前场景中展示网页信息的需求。

具体实现

ui_interface.py 这是一个 Flask 应用程序

它通过前端表单接收用户输入的数据,调用数据库接口进行查询,然后将处理后的结果展示在页面上。以下是详细的步骤:

  1. 接收前端数据

    • 用户在前端表单中输入数据并提交表单。
    • 表单数据通过 POST 请求发送到服务器端的 /query 路由。
  2. 处理请求

    • /query 路由中,使用 request.form 获取表单数据。
    • 根据表单数据中的query_type 字段,选择相应的数据库查询函数。
  3. 调用数据库接口

    • 根据query_type,调用 database_query 模块中的相应函数进行数据库查询。
    • 查询函数返回查询结果 log_results 和摘要结果summary_result
  4. 处理查询结果

    • 使用 process_json 函数对查询结果进行处理,添加前缀到键名。
    • 将处理后的结果存储在 Flask 的 session 中,以便后续使用。
  5. 展示结果

    • 将处理后的查询结果传递给模板引擎 render_template,渲染 result.html 页面。
    • result.html 页面中展示查询结果。

以下是代码中的关键部分:

@app.route('/query', methods=['POST'])
def query_result():# 获取表单数据query_type = request.form['query_type']log_level = request.form.get('log_level')log_type = request.form.get('log_type')limit = request.form.get('limit')log_procedure = request.form.get('log_procedure')file_line = request.form.get('file_line')order_by_field = request.form.get('order')sct_case_name = request.form.get('sct_case_name')# 根据 query_type 调用相应的数据库查询函数query_functions = {'query_single_sct_case': lambda: ds.query_single_sct_case(sct_case_name),'query_top_sct_cases': lambda: (ds.query_top_sct_cases(log_level, log_type, limit), {}),'query_log_types_ranking': lambda: (ds.query_log_types_ranking(log_level), {}),'query_top_log': lambda: (ds.query_top_log(log_procedure, log_level, log_type, limit, order_by_field), {}),'query_specific_log': lambda: (ds.query_specific_log(file_line, limit), {}),'query_logs_by_type': lambda: (ds.query_logs_by_type(log_type, limit), {}),'query_pet_log_type': lambda: (ds.query_pet_log_type(), {}),'query_pet_top_log_ranking': lambda: (ds.query_pet_top_log_ranking(log_procedure, log_level, log_type, limit), {})}# 执行查询函数log_results, summary_result = query_functions.get(query_type, lambda: ({}, {}))()# 处理查询结果log_results = process_json(log_results)summary_result = process_json(summary_result) if summary_result else {}# 将结果存储在 session 中session['log_results'] = log_resultssession['summary_result'] = summary_result# 渲染结果页面return render_template('result.html', query_type=query_type, log_results=log_results, summary_result=summary_result)

通过上述步骤,脚本实现了从前端接收数据、调用数据库接口、处理查询结果并展示在页面上的完整流程。

index.html

这个 index.html 文件是一个前端页面,主要用于提供一个查询接口。它的主要功能和作用如下:

  1. 页面结构和样式

    • 使用 HTML 和 CSS 定义了页面的基本结构和样式。
    • 页面包含一个标题、一个表单和一个计时器显示区域。
    • 表单包含两个下拉菜单(查询类别和查询类型)和一个动态参数容器。
  2. 动态表单生成

    • 根据用户选择的查询类别和查询类型,动态生成表单参数。
    • 使用 JavaScript 脚本,根据预定义的 queryOptionsqueryParams 对象,动态更新查询类型选项和参数输入字段。
  3. JavaScript 脚本

    • updateQueryTypeOptions():根据选择的查询类别,更新查询类型的下拉菜单选项。
function updateQueryTypeOptions() {const queryCategory = document.getElementById('query_category').value;const queryTypeSelect = document.getElementById('query_type');queryTypeSelect.innerHTML = '';queryOptions[queryCategory].forEach(option => {const opt = document.createElement('option');opt.value = option.value;opt.textContent = option.text;queryTypeSelect.appendChild(opt);});showParams();
}
  • showParams():根据选择的查询类别和查询类型,动态生成相应的参数输入字段。
function showParams() {const queryCategory = document.getElementById('query_category').value;const queryType = document.getElementById('query_type').value;const paramsContainer = document.getElementById('params_container');paramsContainer.innerHTML = '';const params = queryParams[`${queryCategory}_${queryType}`];if (params) {params.forEach(param => {const label = document.createElement('label');label.setAttribute('for', param.id);label.textContent = param.label;paramsContainer.appendChild(label);if (param.type === 'select') {const select = document.createElement('select');select.id = param.id;select.name = param.name;param.options.forEach(option => {const opt = document.createElement('option');opt.value = option;opt.textContent = option;select.appendChild(opt);});paramsContainer.appendChild(select);} else {const input = document.createElement('input');input.type = param.type;input.id = param.id;input.name = param.name;if (param.value) {input.value = param.value;}paramsContainer.appendChild(input);}});}
}
  • startTimer():在表单提交时启动一个计时器,显示查询时间,并禁用提交按钮以防止重复提交。
function startTimer() {const submitButton = document.querySelector('input[type="submit"]');submitButton.disabled = true;const timerElement = document.getElementById('timer');const startTime = Date.now();setInterval(() => {const elapsedTime = ((Date.now() - startTime) / 1000).toFixed(1);timerElement.textContent = 'Query time: ' + elapsedTime + ' seconds';}, 100);return true; // Allow form submission
}
  • window.onload:页面加载时,默认选择 SCT 查询类别并更新查询类型选项。
window.onload = function() {document.getElementById('query_category').value = 'SCT';updateQueryTypeOptions();
};
  1. 与 Flask 的集成
    • 表单的 action 属性指向 /query,使用 POST 方法提交数据,这是一个 Flask 路由,用于处理查询请求。
    • Flask 后端会接收表单提交的数据,处理查询逻辑,并返回结果。

总结来说,这个文件主要用于提供一个用户界面,让用户选择查询类别和类型,并输入相应的参数,然后提交查询请求到 Flask 后端进行处理。

results.html

这个 result.html 文件是一个 HTML 模板文件,通常用于 Flask 应用中,用来展示查询结果。以下是这个文件的主要作用和功能:

  1. 页面结构和样式

    • 使用 HTML 和 CSS 定义了页面的结构和样式。
    • 包含一个标题 “Query Result”。
    • 定义了一些样式规则,使页面看起来更美观,例如背景颜色、字体、表格样式等。
  2. 数据处理和展示

    • 使用 JavaScript 函数 removePrefixFromKeys 去除数据键中的前缀。
    • 使用 generateTablegenerateSingleRowTable 函数生成 HTML 表格,用于展示查询结果。
    • 将处理后的数据插入到页面的特定容器中 (log-results-containersummary-results-container)。
  3. 导出功能

    • 提供了一个链接,允许用户将查询结果导出为 Excel 文件。
  4. 图表展示

    • 如果查询类型是 query_log_types_rankingquery_pet_log_type,则会生成一个饼图来展示日志类型的排名。
    • 使用 Chart.js 库生成图表,并对图表进行了一些自定义设置,例如颜色、图例等。
  5. 模板引擎

    • 使用了 Jinja2 模板引擎的语法(例如 {{ log_results | tojson | safe }}{% if query_type == 'query_log_types_ranking' or query_type == 'query_pet_log_type' %})来动态渲染数据和条件内容。

这个文件的主要作用是展示查询结果,包括表格和图表,并提供导出功能。它是 Flask 应用的一部分,通过 Flask 渲染并返回给客户端。

最终效果演示

界面查询

提供多个categories, 用于后期扩展
在这里插入图片描述
对于特地category, 当前提供了6个查询接口
在这里插入图片描述

数据展示

表格数据展示, 提供了占比, 总数, 排名等等信息
在这里插入图片描述
提供了可视化图表, 更加直观体现
在这里插入图片描述
提供excel一键导出, 便于离线数据分析
在这里插入图片描述

最后

后续展望, 当前的脚本还存在诸多问题,后期准备增加功能:

  • 周期性运行部署, 监控log日志的趋势
  • 历史版本比较, 往不好方向发展, 可以及时知晓
  • 更多log日志格式支持
  • 邮件通知
    等等
    有兴趣, 需要源码可以关注我的公众号, 代码的更多细节, 一起交流~~~
    在这里插入图片描述

这篇关于与copilot 结对编程系列 - log日志重复性检测 - 第4篇 - 网页UI界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104185

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言