HTTP/HTTPS 服务端口监测的简易实现

一  HTTP/HTTPS 服务端口监测的简易实现方法

        在当今快节奏的工作环境中,工作忙碌成为了许多职场人的常态。就拿我们团队最近经历的事情来说,工作任务一个接一个,大家都在各自的岗位上争分夺秒地忙碌着。然而,就在这样高强度的工作节奏下,一个严重的问题悄然发生了。

        我们负责的一个重要项目,在服务器重启时,其中的 http 服务竟然关闭了长达 3 天之久,令人遗憾的是,这期间居然没有一个人发现这个异常情况。这个看似不起眼的疏忽,却引发了极其严重的后果。由于 http 服务的长时间中断,我们丢失了部分订单。这些订单的丢失,不仅仅意味着直接的经济损失,还对我们与客户之间的信任关系造成了冲击,可能会影响到未来的业务合作。

        基于对过往故障的深入反思与分析,为有效规避类似情况的再度发生,有必要采取切实可行的应对策略。于是便开发一款简易的 HTTP 服务端口监测程序,该程序仅通过单个 HTML 文件实现。此举旨在提升监测的便捷性与高效性,以实现对 HTTP 服务端口状态的实时监控。一旦检测到异常情况,能够迅速做出响应并采取相应的解决措施,从而有效避免因服务中断而引发的一系列严重后果。这一基于 HTML 的简易监测工具,不仅承担着保障业务稳定运行的关键职责,同时也警示我们,在复杂的业务环境中,任何可能影响系统稳定性的细节都不容忽视。

二 HTTP/HTTPS 服务端口监测

HTML 的简易监测效果图如下:

只需一个html,放在本地电脑或服务器Nginx都可运行,以下是项目完整html代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>http服务状态监控</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
        }
        
        body {
            background-color: #f5f7fa;
            padding: 20px;
            color: #333;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
        }
        
        h1 {
            text-align: center;
            margin-bottom: 20px;
            color: #2c3e50;
        }
        
        .projects-grid {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            gap: 15px;
        }
        
        .project {
            background: white;
            border-radius: 6px;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
            overflow: hidden;
            height: 100%;
            display: flex;
            flex-direction: column;
        }
        
        .project-header {
            background: #3498db;
            color: white;
            padding: 10px 15px;
            font-size: 16px;
            font-weight: 600;
        }
        
        .services-container {
            padding: 10px;
            flex-grow: 1;
        }
        
        .service-item {
            display: grid;
            grid-template-columns: minmax(100px, 1fr) minmax(150px, 2fr) auto;
            gap: 8px;
            align-items: center;
            padding: 8px 0;
            border-bottom: 1px solid #eee;
            font-size: 14px;
        }
        
        .service-item:last-child {
            border-bottom: none;
        }
        
        .service-name {
            font-weight: 500;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }
        
        .service-url {
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }
        
        .service-url a {
            color: #3498db;
            text-decoration: none;
        }
        
        .service-url a:hover {
            text-decoration: underline;
        }
        
        .service-status {
            display: flex;
            align-items: center;
            white-space: nowrap;
            justify-content: flex-end;
        }
        
        .status-indicator {
            width: 10px;
            height: 10px;
            border-radius: 50%;
            margin-right: 6px;
            display: inline-block;
        }
        
        .status-normal {
            background-color: #2ecc71;
        }
        
        .status-closed {
            background-color: #e74c3c;
        }
        
        .status-loading {
            background-color: #f39c12;
            animation: pulse 1.5s infinite;
        }
        
        .refresh-container {
            text-align: center;
            margin: 15px 0 20px;
        }
        
        .refresh-btn {
            background: #3498db;
            color: white;
            border: none;
            padding: 8px 16px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
            transition: background 0.3s;
        }
        
        .refresh-btn:hover {
            background: #2980b9;
        }
        
        .refresh-controls {
            display: flex;
            justify-content: center;
            align-items: center;
            gap: 15px;
            margin-top: 10px;
        }
        
        .refresh-info {
            font-size: 14px;
            color: #666;
        }
        
        .loading-overlay {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(255, 255, 255, 0.8);
            display: flex;
            justify-content: center;
            align-items: center;
            z-index: 1000;
            visibility: hidden;
            opacity: 0;
            transition: all 0.3s;
        }
        
        .loading-overlay.active {
            visibility: visible;
            opacity: 1;
        }
        
        .spinner {
            width: 40px;
            height: 40px;
            border: 4px solid rgba(52, 152, 219, 0.3);
            border-top-color: #3498db;
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }
        
        .tooltip {
            position: relative;
            display: inline-block;
        }
        
        .tooltip .tooltiptext {
            visibility: hidden;
            width: 250px;
            background-color: #555;
            color: #fff;
            text-align: center;
            border-radius: 4px;
            padding: 5px;
            position: absolute;
            z-index: 1;
            bottom: 125%;
            left: 50%;
            transform: translateX(-50%);
            opacity: 0;
            transition: opacity 0.3s;
            font-size: 12px;
            word-break: break-all;
        }
        
        .tooltip:hover .tooltiptext {
            visibility: visible;
            opacity: 1;
        }
        
        @keyframes spin {
            to {
                transform: rotate(360deg);
            }
        }
        
        @keyframes pulse {
            0% { opacity: 0.6; }
            50% { opacity: 1; }
            100% { opacity: 0.6; }
        }
        
        @media (max-width: 1200px) {
            .projects-grid {
                grid-template-columns: repeat(2, 1fr);
            }
        }
        
        @media (max-width: 768px) {
            .projects-grid {
                grid-template-columns: 1fr;
            }
            
            .service-item {
                grid-template-columns: 1fr auto;
                gap: 5px;
            }
            
            .service-url {
                grid-column: 1 / 3;
                grid-row: 2;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>http服务状态监控</h1>
        
        <div class="refresh-container">
            <button id="refreshBtn" class="refresh-btn">立即刷新</button>
            <div class="refresh-controls">
                <div class="refresh-info">上次刷新时间: <span id="lastRefreshTime">-</span></div>
                <div class="refresh-info">自动刷新间隔: <select id="refreshInterval">
                    <option value="30">30秒</option>
                    <option value="60" selected>1分钟</option>
                    <option value="300">5分钟</option>
                    <option value="600">10分钟</option>
                </select></div>
            </div>
        </div>
        
        <div id="projectsGrid" class="projects-grid"></div>
    </div>
    
    <div class="loading-overlay" id="loadingOverlay">
        <div class="spinner"></div>
    </div>
    
    <script>
        // 示例数据 - 10个项目,每个项目5个服务,这里根据自己的项目修改即可
        var project_list = [
            {
                name: '项目名称1',
                serv_list: [
                    {name: '服务名1-1', url: 'https://www.baidu.com', status: '正常'},
                    {name: '服务名1-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名1-3', url: 'https://www.bing.com', status: '正常'},
                    {name: '服务名1-4', url: 'https://www.qq.com', status: '正常'},
                    {name: '服务名1-5', url: 'https://www.taobao.com', status: '正常'}
                ]
            },
            {
                name: '项目名称2',
                serv_list: [
                    {name: '服务名2-1', url: 'https://www.bing.com', status: '正常'},
                    {name: '服务名2-2', url: 'https://www.google.com', status: '关闭'},
                    {name: '服务名2-3', url: 'https://www.baidu.com', status: '正常'},
                    {name: '服务名2-4', url: 'https://www.github.com', status: '正常'},
                    {name: '服务名2-5', url: 'https://www.douban.com', status: '正常'}
                ]
            },
            {
                name: '项目名称3',
                serv_list: [
                    {name: '服务名3-1', url: 'https://www.jd.com', status: '正常'},
                    {name: '服务名3-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名3-3', url: 'https://www.zhihu.com', status: '正常'},
                    {name: '服务名3-4', url: 'https://www.weibo.com', status: '正常'},
                    {name: '服务名3-5', url: 'https://www.163.com', status: '正常'}
                ]
            },
            {
                name: '项目名称4',
                serv_list: [
                    {name: '服务名4-1', url: 'https://www.douyin.com', status: '正常'},
                    {name: '服务名4-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名4-3', url: 'https://www.alipay.com', status: '正常'},
                    {name: '服务名4-4', url: 'https://www.sohu.com', status: '正常'},
                    {name: '服务名4-5', url: 'https://www.bilibili.com', status: '正常'}
                ]
            },
            {
                name: '项目名称5',
                serv_list: [
                    {name: '服务名5-1', url: 'https://www.tmall.com', status: '正常'},
                    {name: '服务名5-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名5-3', url: 'https://www.csdn.net', status: '正常'},
                    {name: '服务名5-4', url: 'https://www.oschina.net', status: '正常'},
                    {name: '服务名5-5', url: 'https://www.cnblogs.com', status: '正常'}
                ]
            },
            {
                name: '项目名称6',
                serv_list: [
                    {name: '服务名6-1', url: 'https://www.tencent.com', status: '正常'},
                    {name: '服务名6-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名6-3', url: 'https://www.huawei.com', status: '正常'},
                    {name: '服务名6-4', url: 'https://www.xiaomi.com', status: '正常'},
                    {name: '服务名6-5', url: 'https://www.oppo.com', status: '正常'}
                ]
            },
            {
                name: '项目名称7',
                serv_list: [
                    {name: '服务名7-1', url: 'https://www.vivo.com', status: '正常'},
                    {name: '服务名7-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名7-3', url: 'https://www.apple.com', status: '正常'},
                    {name: '服务名7-4', url: 'https://www.samsung.com', status: '正常'},
                    {name: '服务名7-5', url: 'https://www.mi.com', status: '正常'}
                ]
            },
            {
                name: '项目名称8',
                serv_list: [
                    {name: '服务名8-1', url: 'https://www.sina.com.cn', status: '正常'},
                    {name: '服务名8-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名8-3', url: 'https://www.163.com', status: '正常'},
                    {name: '服务名8-4', url: 'https://www.sogou.com', status: '正常'},
                    {name: '服务名8-5', url: 'https://www.360.cn', status: '正常'}
                ]
            },
            {
                name: '项目名称9',
                serv_list: [
                    {name: '服务名9-1', url: 'https://www.so.com', status: '正常'},
                    {name: '服务名9-2', url: 'https://www.not-exist-example.com', status: '关闭'},
                    {name: '服务名9-3', url: 'https://www.ifeng.com', status: '正常'},
                    {name: '服务名9-4', url: 'https://www.cctv.com', status: '正常'},
                    {name: '服务名9-5', url: 'https://www.people.com.cn', status: '正常'}
                ]
            }
        ];
        
        // 全局变量
        let autoRefreshTimer;
        let refreshIntervalSeconds = 60;
        
        // DOM 元素
        const projectsGrid = document.getElementById('projectsGrid');
        const refreshBtn = document.getElementById('refreshBtn');
        const lastRefreshTimeEl = document.getElementById('lastRefreshTime');
        const refreshIntervalSelect = document.getElementById('refreshInterval');
        const loadingOverlay = document.getElementById('loadingOverlay');
        
        // 初始化页面
        function initPage() {
            // 设置刷新间隔
            refreshIntervalSelect.addEventListener('change', function() {
                refreshIntervalSeconds = parseInt(this.value);
                resetAutoRefreshTimer();
            });
            
            // 刷新按钮事件
            refreshBtn.addEventListener('click', function() {
                checkAllServices();
            });
            
            // 初始渲染项目列表
            renderProjects();
            
            // 初次检查服务状态
            checkAllServices();
            
            // 设置自动刷新
            resetAutoRefreshTimer();
        }
        
        // 渲染项目列表
        function renderProjects() {
            projectsGrid.innerHTML = '';
            
            project_list.forEach(project => {
                const projectEl = document.createElement('div');
                projectEl.className = 'project';
                
                const projectHeader = document.createElement('div');
                projectHeader.className = 'project-header';
                projectHeader.textContent = project.name;
                
                const servicesContainer = document.createElement('div');
                servicesContainer.className = 'services-container';
                
                project.serv_list.forEach(service => {
                    const serviceItem = document.createElement('div');
                    serviceItem.className = 'service-item';
                    
                    const serviceName = document.createElement('div');
                    serviceName.className = 'service-name';
                    serviceName.textContent = service.name;
                    
                    const serviceUrl = document.createElement('div');
                    serviceUrl.className = 'service-url';
                    
                    const urlLink = document.createElement('a');
                    urlLink.href = service.url;
                    urlLink.target = '_blank';
                    urlLink.textContent = shortenUrl(service.url);
                    urlLink.title = service.url;
                    
                    serviceUrl.appendChild(urlLink);
                    
                    const serviceStatus = document.createElement('div');
                    serviceStatus.className = 'service-status';
                    
                    const statusIndicator = document.createElement('span');
                    statusIndicator.className = `status-indicator status-loading`;
                    
                    const statusText = document.createElement('span');
                    statusText.textContent = '检测中...';
                    
                    serviceStatus.appendChild(statusIndicator);
                    serviceStatus.appendChild(statusText);
                    
                    serviceItem.appendChild(serviceName);
                    serviceItem.appendChild(serviceUrl);
                    serviceItem.appendChild(serviceStatus);
                    
                    servicesContainer.appendChild(serviceItem);
                });
                
                projectEl.appendChild(projectHeader);
                projectEl.appendChild(servicesContainer);
                
                projectsGrid.appendChild(projectEl);
            });
        }
        
        // 缩短URL显示
        function shortenUrl(url) {
            try {
                const urlObj = new URL(url);
                return urlObj.hostname;
            } catch (e) {
                // 如果解析失败,返回原始URL的一部分
                return url.length > 20 ? url.substring(0, 20) + '...' : url;
            }
        }
        
        // 检测所有服务状态
        async function checkAllServices() {
            showLoading();
            
            // 更新上次刷新时间
            lastRefreshTimeEl.textContent = new Date().toLocaleString();
            
            const projectElements = document.querySelectorAll('.project');
            
            for (let i = 0; i < project_list.length; i++) {
                const project = project_list[i];
                
                for (let j = 0; j < project.serv_list.length; j++) {
                    const service = project.serv_list[j];
                    
                    // 获取对应的 DOM 元素
                    const serviceItems = projectElements[i].querySelectorAll('.service-item');
                    const serviceStatusEl = serviceItems[j].querySelector('.service-status');
                    const statusIndicator = serviceStatusEl.querySelector('.status-indicator');
                    const statusText = serviceStatusEl.querySelector('span:last-child');
                    
                    // 将状态设置为检测中
                    statusIndicator.className = 'status-indicator status-loading';
                    statusText.textContent = '检测中...';
                    
                    try {
                        // 使用 fetch 带超时进行检测
                        const status = await checkServiceStatus(service.url);
                        
                        // 更新服务状态
                        service.status = status ? '正常' : '关闭';
                        
                        // 更新 UI
                        if (status) {
                            statusIndicator.className = 'status-indicator status-normal';
                            statusText.textContent = '正常';
                        } else {
                            statusIndicator.className = 'status-indicator status-closed';
                            statusText.textContent = '关闭';
                        }
                    } catch (error) {
                        console.error(`检测服务 ${service.name} 失败:`, error);
                        
                        // 出错时将状态设为关闭
                        service.status = '关闭';
                        statusIndicator.className = 'status-indicator status-closed';
                        statusText.textContent = '关闭';
                    }
                }
            }
            
            hideLoading();
        }
        
        // 检测单个服务状态
        async function checkServiceStatus(url) {
            try {
                // 设置超时
                const controller = new AbortController();
                const timeoutId = setTimeout(() => controller.abort(), 5000);
                
                const response = await fetch(url, {
                    method: 'HEAD',
                    mode: 'no-cors',
                    signal: controller.signal
                });
                
                clearTimeout(timeoutId);
                
                // 返回状态码小于 400 表示服务正常
                return response.status < 400;
            } catch (error) {
                // 出现异常(如超时、网络错误)表示服务异常
                return false;
            }
        }
        
        // 重置自动刷新定时器
        function resetAutoRefreshTimer() {
            if (autoRefreshTimer) {
                clearInterval(autoRefreshTimer);
            }
            
            autoRefreshTimer = setInterval(() => {
                checkAllServices();
            }, refreshIntervalSeconds * 1000);
        }
        
        // 显示加载中遮罩
        function showLoading() {
            loadingOverlay.classList.add('active');
        }
        
        // 隐藏加载中遮罩
        function hideLoading() {
            loadingOverlay.classList.remove('active');
        }
        
        // 页面加载完成后初始化
        document.addEventListener('DOMContentLoaded', initPage);
    </script>
</body>
</html>

说明:使用时只需根据自己项目修改js部分项目数据即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于数据可视化学习的卡路里消耗预测分析

数据分析实操集合&#xff1a; 1、关于房间传感器监测数据集的探索 2、EEMD-LSTM模型择时策略 — 1.EEMD分解与LSTM模型搭建 3、EEMD-LSTM模型择时策略 — 2. 量化回测 4、国际超市电商销售数据分析 5、基于问卷调查数据的多元统计数据分析与预测&#xff08;因子分析、对应分…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

计算机网络:应用层 —— 电子邮件

文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件&#xff08;E-mail&#xff09;是因特网上最早…

AWVS(web)扫描器安装与使用

目录 前言 1. AWVS 简介与功能特性 1.1 什么是 AWVS&#xff1f; 1.2 主要功能特性 2. AWVS 的安装步骤 2.1 系统要求 2.2 安装步骤&#xff08;以 Windows 为例&#xff09; 3. 配置与初始化 3.1 设置扫描目标 3.2 配置扫描选项 4. AWVS 的使用方法 4.1 自动扫描 …

opencv的C++遇到找不到opencv_worldxxxd.dll

如图所示&#xff1a; 将你缺的这个dll文件复制到 C:\Windows\System32 即可

AI提示工程的挑战与演进

目前让AI按照工作流正确的工作依然存在着提示挑战&#xff0c;提示工程实际上是一套逻辑严密的工作。 根据当前技术发展及行业实践&#xff0c;AI按照工作流正确执行任务仍面临显著的提示工程挑战&#xff0c;而提示工程本身也正在从零散经验向系统化、逻辑严密的方法论演进。以…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

蓝桥杯第十六届嵌入式模拟编程题解析

由硬件框图可以知道我们要配置LED 和按键 LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&#xf…

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况&#xff1a;本科就读于电科软院&#xff0c;24年2月开始了解考研&#xff0c;24年3月开始数学&#xff0c;9月决定考本院&#xff08;开始全天候图书馆学习&#xff09;并开始专业课学习&#xff0c;11月底开始政治学习&#xff0c;最后…

基于范围选择的进化多目标优化PESA-II-可用于(汽车发动机多目标优化设计/飞机机翼多目标外形优化/电动汽车充电设施布局优化)

基于范围选择的进化多目标优化 PESA-II&#xff08;Pareto Envelope-Based Selection Algorithm II&#xff09;是一种经典的多目标遗传算法&#xff0c;以下是对它的详细介绍&#xff1a;基于范围选择的进化多目标优化PESA-II-可用于&#xff08;汽车发动机多目标优化设计/飞机…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

鹏哥c语言数组(初阶数组)

前言&#xff1a; 对应c语言视频54集 内容&#xff1a; 一维数组的创建 数组是一组相同元素的集合&#xff0c; 数组的创建方式 type_t就是数组的元素类型&#xff0c;const_n是一个常量表达式&#xff0c;用来指定数组的大小 c99标准之前的&#xff0c;数组的大小必须是…

Oracle 数据变化量查询

1. DBA_HIST_SEG_STAT可以看出对象的使用趋势&#xff0c;构造如下SQL查询出每个时间段内数据库对象的增长量 select c.SNAP_ID,to_char(c.END_INTERVAL_TIME, yyyy-mm-dd) SNAP_TIME,a.OWNER,a.OBJECT_NAME,a.OBJECT_TYPE,b.DB_BLOCK_CHANGES_DELTAfrom dba_objects a,(selec…

Language Models are Unsupervised Multitask Learners,GPT-2详细讲解

1542M1.542B15.42亿个 背景和动机 1.GPT-1在特定自然语言理解任务标注较少情况下&#xff0c;通过利用大量无标注数据&#xff0c;取得较强性能 2.BERT性能超越GPT-1&#xff0c;GPT-2通过构建更大数据集和模型&#xff0c;同时在zero-shot的多任务学习场景中展示不错性能 创…

ultralytics导出engine之后,用tensorrt c++ api加载报Serialization failed

一。问题复现 1.生成engine 在安装了ultralytics之后&#xff0c;或者直接用源码也一样。运行如下代码 (或者用命令行也行&#xff1a;yolo taskdetect modeexport model/home/kv183/tensorrt_starter/ultralytics-main/weights/yolov8s.pt formatengine &#xff09; from…

Milvus x DeepSeek 搭建低成本高精度 RAG 实战

为什么手握海量数据&#xff0c;却用不出真正的“智能”&#xff1f;要么 AI 模型学艺不精&#xff0c;答非所问&#xff1b;要么技术门槛太高&#xff0c;让普通开发者望而却步。现在&#xff0c;使用阿里云 Milvus 向量检索服务、DeepSeek 大模型和 PAI LangStudio 开发工具&…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

学习路程五 向量数据库Milvus操作

前序 前面安装好了docker且成功拉取Milvus镜像&#xff0c;启动。通过python成功连接上了数据。接下来就继续更多Milvus的操作 在开始之前&#xff0c;先来简单了解一下向量数据库内一些东西的基本概念 概念描述数据库&#xff08;Database&#xff09;类似与MySQL的database…

pycharm安装教程-PyCharm安装破解步骤【MAC版】

pycharm安装教程-PyCharm2023安装破解步骤【MAC版】 破解安装安装包获取 今天来给大家分享 Mac 系统安装 PyCharm&#xff0c;附带资源 破解安装&#xff0c; PyCharm 相关就不叙述了&#xff0c;直接开始安装&#xff01; 破解安装 打开下载的安装包 PyCharm2023.dmg&#x…

简单介绍 SSL 证书类型: DV、OV、EV 的区别

SSL证书类型DV、OV、EV 区别&#xff1a; DV(域名验证型)SSL证书 OV(组织验证型)SSL证书 EV(扩展验证型)SSL证书