FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据

news2024/12/23 2:31:31

FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据

  • FreeSWITCH GUI界面预览
  • 安装FreeSWITCH GUI先看使用手册
  • 1、简介
  • 2、安装mod_xml_curl模块
  • 3、配置mod_xml_curl模块
  • 3、编写API接口
  • 4、测试一下
  • 5、其他注意的地方


FreeSWITCH GUI界面预览

http://myfs.f3322.net:8020/
用户名:admin,密码:admin

FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/137820796

安装FreeSWITCH GUI先看使用手册

先看使用手册,先看使用手册,先看使用手册。

这里是手册,这里是手册,这里是手册,
这里是手册,这里是手册,这里是手册,
这里是手册,这里是手册,这里是手册,
这里是手册,这里是手册,这里是手册,

1、简介

在FreeSWITCH的架构中,大部分配置都是通过XML文件来定义的。传统的配置方式是直接编辑这些XML文件。然而,借助于mod_xml_curl模块,我们可以实现配置的动态加载。这意味着配置文件可以通过API接口来获取。

mod_xml_curl模块是FreeSWITCH的一个扩展,它允许系统动态地从远程服务器获取配置信息,而不是依赖静态的XML配置文件。这种灵活性可以带来许多好处,包括但不限于多实例管理、集中式配置管理以及动态配置生成。

使用mod_xml_curl模块,您可以实现以下几种典型用途:

  • 在无需维护多个服务器配置的情况下运行多个FreeSWITCH实例;
  • 中央化管理配置,避免使用复杂的shell脚本来同步配置;
  • 从连接到数据库的Web应用程序动态填充配置;
  • 提供一种简便的方法来自动化部署FreeSWITCH配置,例如在托管的VoIP平台上。

FreeSWITCH的所有配置文件都集中存储在一个主配置文件/usr/local/freeswitch/conf/freeswitch.xml中。这个主配置文件使用include指令,不仅包含各个模块的配置,还涵盖了呼叫路由规则、聊天计划、用户目录信息以及语言设置等关键配置。

<!-- /usr/local/freeswitch/conf/freeswitch.xml 主配置文件内容-->
<?xml version="1.0"?>
<document type="freeswitch/xml">
  <!-- 全局变量 -->
  <X-PRE-PROCESS cmd="include" data="vars.xml"/>
  <!-- 各个模块的配置文件 -->
  <section name="configuration" description="Various Configuration">
    <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
  </section>
  <!-- 呼叫规则配置文件 -->
  <section name="dialplan" description="Regex/XML Dialplan">
    <X-PRE-PROCESS cmd="include" data="dialplan/*.xml"/>
  </section>
  <!-- 聊天计划配置文件 -->
  <section name="chatplan" description="Regex/XML Chatplan">
    <X-PRE-PROCESS cmd="include" data="chatplan/*.xml"/>
  </section>
  <!-- 用户目录(分机号、gateway)配置文件 -->
  <section name="directory" description="User Directory">
    <X-PRE-PROCESS cmd="include" data="directory/*.xml"/>
  </section>
  <!-- 语言管理 -->
  <section name="languages" description="Language Management">
    <X-PRE-PROCESS cmd="include" data="lang/en/*.xml"/>
    <X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>
  </section>
</document>

我们可以使用mod_xml_curl模块,通过http访问API接口,按照此文件的格式,分别获取各个模块的配置、用户目录配置、呼叫规则配置。

2、安装mod_xml_curl模块

# 进入freeswitch源码主目录
cd /usr/local/src/freeswitch
# 单独编译安装mod_xml_curl
make mod_xml_curl-install
# 修改modules.conf,自动加载mod_xml_curl
cd /usr/local/freeswitch/conf/autoload_configs
vim modules.conf.xml # 把modules.conf里,mod_xml_curl前面的注释取消
# 尽量确保此模块首先加载,否则可能会导致加载顺序出错。
# 重新启动FreeSWITCH

3、配置mod_xml_curl模块

mod_xml_curl的配置文件路径是/usr/local/freeswitch/conf/autoload_configs/xml_curl.conf.xml,下面是一个典型的配置及注释。

./freeswitch/conf/autoload_configs/xml_curl.conf.xml

<configuration name="xml_curl.conf" description="cURL XML Gateway">
  <bindings>
    <!-- 请求example1.com的拨号计划配置,如果接收到有效响应,则不再继续请求example2.com。如果未接收到有效响应,则继续请求example2.com -->
    <binding name="dialplan">
      <param name="gateway-url" value="http://example1.com:80/fsapi" bindings="dialplan"/>
    </binding>

    <!-- 如果example1.com返回无效或未找到的响应,则只在此情况下调用此备用配置。如果此网关也未能返回有效配置,则FreeSWITCH将从磁盘查找静态配置文件 -->
    <binding name="dialplan backup">
      <param name="gateway-url" value="http://example2.com:80/fsapi" bindings="dialplan"/>
    </binding>

    <!-- 请求example1.com的用户目录配置,如果没有找到则恢复到磁盘 -->
    <binding name="directory">
      <param name="gateway-url" value="http://example1:80/fsapi" bindings="directory"/>
    </binding>

    <!-- 请求example1.com的配置配置,如果没有找到则恢复到磁盘 -->
    <binding name="configuration">
      <param name="gateway-url" value="http://example1:80/fsapi" bindings="configuration"/>
    </binding>

    <!-- 请求example1.com的语音短语配置,如果没有找到则恢复到磁盘 -->
    <binding name="phrases">
      <param name="gateway-url" value="http://example1:80/fsapi" bindings="phrases"/>
    </binding>
  </bindings>
</configuration>

参考mod_xml_curl.conf的注释,我们配置一下如下:

<configuration name="xml_curl.conf" description="cURL XML Gateway">
  <bindings>
    <!--
    通过http://127.0.0.1:9000/pbx/config接口,获取所有模块的配置文件,  也就是主配置文件freeswitch.xml里的,configuration部分。
     <section name="configuration" description="Various Configuration">
        <X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/>
     </section>
     -->
    <binding name="all configs">
      <param name="gateway-url" value="http://127.0.0.1:9000/pbx/config" bindings="configuration"/>
      <param name="timeout" value="10"/>
      <param name="method" value="GET"/>
    </binding>
     <!--
    通过http://127.0.0.1:9000/pbx/directory接口,获取分机用户的配置文件,  也就是主配置文件freeswitch.xml里的,configuration部分。
     <section name="directory" description="User Directory">
        <X-PRE-PROCESS cmd="include" data="directory/*.xml"/>
     </section>
     -->
    <binding name="directory">
      <param name="gateway-url" value="http://127.0.0.1:9000/pbx/directory" bindings="directory"/>
      <param name="timeout" value="10"/>
      <param name="method" value="GET"/>
    </binding>
        <!--
    通过http://127.0.0.1:9000/pbx/dialplan接口,获取呼叫规则,  也就是主配置文件freeswitch.xml里的,configuration部分。
      <section name="dialplan" description="Regex/XML Dialplan">
          <X-PRE-PROCESS cmd="include" data="dialplan/*.xml"/>
      </section>
     -->
    <binding name="dialplan">
      <param name="gateway-url" value="http://127.0.0.1:9000/pbx/dialplan" bindings="dialplan"/>
      <param name="timeout" value="10"/>
      <param name="method" value="GET"/>
    </binding>
  </bindings>
</configuration>

其他binding选项,可参考:

名称描述示例
gateway-url绑定的URLhttp://127.0.0.1/pbx/config
gateway-credentialsURL的身份验证用户名和密码user:pass
auth-scheme使用的身份验证方案。支持的值为:basic, digest, NTLM, GSS-NEGOTIATE 或 “any” 用于自动检测basic
method是否使用GET或POST方法GET
timeoutHTTP请求的超时时间(秒)20
enable-cacert-check是否检查服务器的SSL证书以验证其是否由受信任的CA证书颁发(对于HTTPS推荐使用)true
enable-ssl-verifyhost是否检查服务器的SSL证书是否与URL的主机名匹配(对于HTTPS推荐使用)true
ssl-cacert-fileCA证书文件的路径。注意,此选项似乎是必需的,因为模块不会自动搜索系统CA证书。/etc/ssl/certs/ca-certificates.crt
ssl-cert-path客户端证书的路径/etc/ssl/certs/fs_client.crt
ssl-key-path客户端私钥的路径/etc/ssl/private/fs_client.key
ssl-key-password客户端私钥的密码mysecret
ssl-version要使用的SSL/TLS版本。支持的值为 “SSLv3” 或 “TLSv1”TLSv1
disable-100-continue禁用HTTP Expect头中的100 Continue选项,适用于不喜欢此选项的服务器true
cookie-file存储cookies的文件路径/var/run/freeswitch/fs.cookies
enable-post-var定义post参数
bind-local用于HTTP请求的网络接口名称,这可能会影响多宿主服务器上的源地址/路由eth1

3、编写API接口

简单编写api接口,返回数据,示例如下:

from flask import Flask, request, Response

app = Flask(__name__)

@app.route('/pbx/config', methods=['GET'])
def get_configuration():
    # 这里返回各个模块的配置信息,相关value可以从数据库获取其他数据源获取
    # 
    xml_response = """
    <document type="freeswitch/xml">
      <section name="configuration" description="all configs">
             <!-- 生成switch.conf.xml文件 -->
             <configuration name="post_load_switch.conf" description="Core Configuration">
                   <settings>
		               <param name="rtp-start-port" value="10000"/>
		               <param name="rtp-end-port" value="11000"/>
		               <param name="max-sessions" value="1000"/>
		               <param name="sessions-per-second" value="100"/>
		               <param name="switchname" value="Myfs"/>
	               </settings>
             </configuration>
             
             <!-- 生成acl.conf.xml文件 -->
             <configuration name="acl.conf" description="Network Lists">
				<network-lists>
					<!--  预定义:所有IP地址  -->
					<list name="all.auto" default="allow"> </list>
					<!--  内网  -->
					<list name="LocalNet" default="allow">
						<node host="192.168.1.0" mask="255.255.255.0" type="allow"/>
					</list>
				</network-lists>
			</configuration>
			
			<!-- 参考模块配置文件,动态生成其他配置文件即可 -->
			
			<!-- 生成sofia.conf -->

	        <!-- 生成odbc_cdr.conf -->
   
	        <!-- 生成db.conf -->
   
	        <!-- 生成ivr.conf -->
     
	     	<!-- 生成callcenter.conf-->
	
			<!-- 生成voicemail.conf-->
			
			<!-- 生成nibblebill.conf-->
			
			<!-- 生成acl.conf-->
			
			<!-- 生成conference.conf-->
			
			<!-- 生成freetdm.conf-->
			
			<!-- 生成unimrcp.conf-->
			
			<!-- 生成distributor.conf.xml-->
       
			......
         </section>
    </document>
    """
    return Response(xml_response, mimetype='text/xml')

@app.route('/pbx/directory', methods=['GET'])
def get_directory():
    # 这里返回分机用户目录信息,相关value可以从数据库获取其他数据源获取
    xml_response = """
   <document type="freeswitch/xml">
		<section name="directory" description="User Directory">
		<domain name="$${domain}">
			<params>
				<param name="dial-string" value="{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}"/>
			</params>
			<groups>
				<group name="默认部门">
					<users>
					    <!-- 分机1001-->
						<user id="1001" cacheable="1800000">
							<params>
								<param name="password" value="1001"/>
								<param name="allow-empty-password" value="false"/>
								<param name="sip-forbid-register" value="false"/>
							</params>
							<variables>
								<variable name="user_context" value="默认权限"/>
								<variable name="video_bandwidth" data="2mb"/>
								<variable name="_jitterbuffer" data="0"/>
								<variable name="tx_vol" data="0"/>
								<variable name="rx_vol" data="0"/>
								<variable name="call_timeout" data="60"/>
								<variable name="sched_hangup" data="7200"/>
								<variable name="limit_max" data="1"/>
								<variable name="_absolute_codec_string" data=""/>
								<variable name="media_processing" data="default"/>
								<variable name="zrtp_secure_media" data="false"/>
								<variable name="sip_secure_media" data="false"/>
								<variable name="effective_caller_id_name" value="1001"/>
								<variable name="outbound_caller_id_name" value="1001"/>
								<variable name="effective_caller_id_number" value="1001"/>
								<variable name="outbound_caller_id_number" value="1001"/>
								<variable name="callgroup" value="1"/>
								<variable name="limit_max" value="1"/>
								<variable name="minimum-session-expires" value="120"/>
								<variable name="sip-force-expires" value="1800"/>
								<variable name="sip-expires-max-deviation" value="600"/>
								<variable name="nibble_account" value="1001"/>
							</variables>
						</user>
						 <!-- 分机1002-->
						<user id="1002" cacheable="1800000">
							<params>
								<param name="password" value="1002"/>
								<param name="allow-empty-password" value="false"/>
								<param name="sip-forbid-register" value="false"/>
							</params>
							<variables>
								<variable name="user_context" value="默认权限"/>
								<variable name="video_bandwidth" data="2mb"/>
								<variable name="_jitterbuffer" data="0"/>
								<variable name="tx_vol" data="0"/>
								<variable name="rx_vol" data="0"/>
								<variable name="call_timeout" data="60"/>
								<variable name="sched_hangup" data="7200"/>
								<variable name="limit_max" data="1"/>
								<variable name="_absolute_codec_string" data=""/>
								<variable name="media_processing" data="default"/>
								<variable name="zrtp_secure_media" data="false"/>
								<variable name="sip_secure_media" data="false"/>
								<variable name="effective_caller_id_name" value="1002"/>
								<variable name="outbound_caller_id_name" value="1002"/>
								<variable name="effective_caller_id_number" value="1002"/>
								<variable name="outbound_caller_id_number" value="1002"/>
								<variable name="callgroup" value="1"/>
								<variable name="limit_max" value="1"/>
								<variable name="minimum-session-expires" value="120"/>
								<variable name="sip-force-expires" value="1800"/>
								<variable name="sip-expires-max-deviation" value="600"/>
								<variable name="nibble_account" value="1002"/>
							</variables>
						</user>
					</users>
		           </group>
	           </groups>
        	</domain>
        </section>
    </document>
    """
    return Response(xml_response, mimetype='text/xml')

@app.route('/pbx/dialplan', methods=['GET'])
def get_dialplan():
    # 这里返回拨号计划信息,相关value可以从数据库获取其他数据源获取
    xml_response = """
     <document type="freeswitch/xml">
       <section name="dialplan" description="Regex/XML Dialplan">
       	<context name="default">
			<extension name="11113-播放音乐号码">
				<condition expression="^(11113)$" field="destination_number">
					<action application="answer"/>
					<action application="playback" data="$${sounds_dir}/sound/fenghuang.wav"/>
					<action application="hangup"/>
				</condition>
			</extension>
		</context>
       </section>
     </document>
    """
    return Response(xml_response, mimetype='text/xml')

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=9000)

4、测试一下

先启动接口,在启动FreeSWITCH,测试一下。

如果先启动FreeSWITCH,FreeSWITCH的mod_xml_curl获取失败,还是读取的本地文件。

5、其他注意的地方

  • mod_xml_curl 从接口获取的数据大小有限制,超过限制,FreeSWITCH会报错。
    可以修改源码里的XML_CURL_MAX_BYTES的值,重新编译该模块。如下图:
    在这里插入图片描述

  • 如果分机数量巨大,接口无需返回所有分机的配置文件,返回该分机的配置文件即可,这样可以减少数据的大小。
    mod_xml_curl在访问API接口时,会传递很多参数,找到传递分机号的参数,从而生成该分机号的配置文件。(分机登录时,都会请求接口,从获取的分机目录xml中,验证用户名和密码是否正确)

  • FreeSWITCH官方文档https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_xml_curl_1049001/

祝君好运,国庆快乐

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LDO选型

LDO原理 mos管工作在可变电阻区&#xff0c;输出端电压会因为输出负载的变化而变化&#xff0c;则可通过误差放大器来控制Rds从而维持输出电压不变&#xff0c;行成一个动态平衡。 低压差 线性调整率 负载调整率 电源&#xff08;纹波&#xff09;抑制比 瞬态响应 外部元器件作…

神经网络(二):卷积神经网络

文章目录 一、图像的本质1.1单通道图像&#xff1a;灰度图1.2多通道图像 二、卷积神经网络2.1基本结构2.2卷积层2.2.1卷积操作2.2.2填充padding2.2.3步幅strides2.2.4多通道图像卷积&#xff1a;单卷积核2.2.5多通道图像卷积&#xff1a;多卷积核2.2.5卷积层的参数与激活函数 2…

算法练习题24——leetcode3296移山所需的最小秒数(二分模拟)

【题目描述】 【代码示例&#xff08;java&#xff09;】 class Solution {// 计算让工人们将山的高度降到0所需的最少时间public long minNumberOfSeconds(int mountainHeight, int[] workerTimes) {long left 0; // 最少时间初始为0long right 0; // 最大时间初始化为0// …

Linux,uboot,kernel启动流程,S5PV210芯片的启动流程,DRAM控制器初始化流程

一、S5PV210芯片的DRAM控制器介绍、初始化DDR的流程分析 1、DRAM的地址空间 1)从地址映射图可以知道&#xff0c;S5PV210有两个DRAM端口。 DRAM0的内存地址范围&#xff1a;0x20000000&#xff5e;0x3FFFFFFF&#xff08;512MB&#xff09;&#xff1b;DRAM1:的内存地址范围…

AI大模型教程 Prompt提示词工程 AI原生应用开发零基础入门到实战【2024超细超全,建议收藏】

在AGI&#xff08;通用人工智能&#xff09;时代&#xff0c;那些既精通AI技术、又具备编程能力和业务洞察力的复合型人才将成为最宝贵的资源。为此&#xff0c;我们提出了‘AI全栈工程师’这一概念&#xff0c;旨在更精准地描述这一复合型人才群体&#xff0c;而非过分夸大其词…

全栈项目小组【算法赛】题目及解题

题目&#xff1a;全栈项目小组【算法赛】 题目&#xff1a; 解题思路 1.遍历简历信息&#xff1a;我们需要读取所有简历&#xff0c;根据期望薪资和岗位类型进行分类和统计。 2.分类统计&#xff1a;使用哈希表来存储每个薪资下的前端&#xff08;F&#xff09;和后端&#…

传统产品经理如何快速转行成为顶尖的AI产品经理?

前言 产品经理本身便是一个需要不断学习、不断实践的岗位&#xff0c;即使是AI产品经理&#xff0c;也不能脱离产品经理岗位的本质。 另外&#xff0c;要想知道具体如何转行成为顶尖的AI产品经理&#xff0c;我们首先要明确两个问题&#xff0c;即&#xff1a; 什么是AI产品…

HTML5简介的水果蔬菜在线商城网站源码系列模板3

文章目录 1.设计来源1.1 主界面1.2 商品列表1.3 商品信息1.4 购物车1.5 其他页面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.ne…

AI Native平台,跨越AI应用从创新到生产的鸿沟

2024年是AI应用的元年&#xff0c;以大模型为中心的 AI Native 应用大爆发正在从理想变成现实。云计算带来的应用创新潮&#xff0c;经历了虚拟机时代和云原生时代&#xff0c;正在全面拥抱以大模型为核心的 AI Native 阶段&#xff0c;推动大数据与AI的工作流前所未有地紧密结…

【C语言进阶】第四节:自定义类型详解

1、结构体 1.1 结构体变量的定义和初始化 struct Point//类型声明 {int x;int y; }p1;//声明类型的同时定义变量p1struct Point p2;//定义结构体变量p2//初始化&#xff1a;定义变量的同时赋初值。 struct Point p3 { x, y };struct Node {int data;struct Point p;struct N…

智谱清影的魅力:使用CogVideoX-2b生成6秒视频的真实体验!

文章目录 1 3D变分自编码器与3D RoPE2 精确描述与多样化输入3 社区的力量与未来展望 在8月6日&#xff0c;智谱 AI 发布了一则令人振奋的消息&#xff1a;他们决定开源其视频生成模型CogVideoX。 1 3D变分自编码器与3D RoPE 作为一名开发者&#xff0c;我近期才来体验这个新工…

只需5分钟!掌握学术写作的核心逻辑!

人工智能的广泛应用中&#xff0c;ChatGPT 已被证明是一种极具潜力的语言模型&#xff0c;其功能涵盖多个领域&#xff0c;显示出强大的适应性。在 GPT-4 架构的推动下&#xff0c;ChatGPT 正在彻底改变我们与文本驱动的人工智能的交互模式。 在学术界&#xff0c;学术写作至关…

【AIGC】ChatGPT提示词助力高效文献处理、公文撰写、会议纪要与视频总结

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效英文文献阅读提示词使用方法 &#x1f4af;高效公文写作提示词使用方法 &#x1f4af;高效会议纪要提示词使用方法 &#x1f4af;高效视频内容分析提示词使用方法 &a…

Unity3D 小案例 像素贪吃蛇 03 蛇的碰撞

Unity3D 小案例 像素贪吃蛇 第三期 蛇的碰撞&#xff08;完结&#xff09; 像素贪吃蛇 碰撞蛇身 当蛇头碰撞到蛇身时&#xff0c;游戏应该判定为失败。 找到蛇身预制体&#xff0c;添加 Body 标签和碰撞体&#xff0c;碰撞体的大小为 0.5&#xff0c;跟蛇头和蛇身的碰撞体范…

两台虚拟机之分布式部署

Apache2 和 PHP 安装 在虚拟机1上执行以下步骤: 更新系统包列表: sudo apt update安装 Apache2: sudo apt install apache2 -y安装 PHP 及其扩展: sudo apt install php libapache2-mod-php php-mysql配置Apache和PHP sudo nano /etc/apache2/mods-enabled/dir.conf#…

【BEV 视图变换】Ray-based(2): 代码复现+画图解释 基于深度估计、bev_pool(代码一键运行)

paper&#xff1a;Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D code&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 一、完整复现代码(可一键运行)和效果图 import torch import torch.nn as nn import mat…

【Go】Go语言切片(Slice)深度剖析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

知乎:从零开始做自动驾驶定位; 注释详解(二)

这个个系统整体分为: 数据预处理 前端里程计 后端优化 回环检测 显示模块。首先来看一下数据预处理节点做的所有事情&#xff1a; 数据预处理节点 根据知乎文章以及代码我们知道: 节点功能输入输出数据预处理1.接收各传感器信息2.传感器数据时间同步 3.点云运动畸变补偿 4.传…

免杀对抗—python混淆算法反序列化shellcode

一、前言 内网已经学的七七八八了(主要是实验环境太麻烦了&#xff0c;累了)&#xff0c;今天就开启新的篇章——免杀。免杀我们主要是对生成的shellcode做免杀&#xff0c;而不是对生成的exe做免杀。为啥呢&#xff0c;你可以这样理解&#xff0c;exe已经是成品了&#xff0c…

Vue 内存泄漏分析:如何避免开发过程中导致的内存泄漏问题

一. 引言 Vue 作为一款流行的前端框架&#xff0c;已经在许多项目中得到广泛应用。然而&#xff0c;随着我们在 Vue 中构建更大规模的应用程序&#xff0c;我们可能会遇到一个严重的问题&#xff0c;那就是内存泄漏。内存泄漏是指应用程序在使用内存资源时未正确释放&#xff…