前端sql条件拼接js工具

因为项目原因,需要前端写sql,所以弄了一套sql条件拼接的js工具

​
/*常量
LT : " < ",
LE : " <= ",
GT : " > ",
GE : " >= ",
NE : " != ",
EQ : " = ",
LIKE : " like ",
OR : " or ",
IN : " in ",
*/let sqlUtil = {// 拼接sqlbuildSql : '',/*函数*/lt: lessThan,lte: lessThanOrEqual,gt: greaterThan,gte: greaterThanOrEqual,ne: notEqual,eq: equal,toLike: sqlLike,leftLike:leftLike,rightLike:rightLike,in: sqlIn,notIn: notIn,isNull: isNull,isNotNull: isNotNull,isEmpty: isEmpty,isEmptyOrNull: isEmptyOrNull,isNotEmpty:isNotEmpty,isNotEmptyAndNotNull:isNotEmptyAndNotNull,sor: simpleOr,toBetween: between,notBetween : notBetween,sqlOr: sqlOr,orderByDesc : orderByDesc,orderByAsc: orderByAsc,orderBy: orderBy,notDelete : notDelete,userDefined:userDefined,toSql: toSql
};/*** 小于 <* sqlUtil.lt("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function lessThan(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" < '"+fieldValue+"' ";}return this;
}/*** 小于等于 <=* sqlUtil.le("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function lessThanOrEqual(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" <= '"+fieldValue+"' ";}return this;
}/*** 大于 >* sqlUtil.gt("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function greaterThan(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" > '"+fieldValue+"' ";}return this;
}/*** 大于等于 >=* sqlUtil.ge("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function greaterThanOrEqual(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" >= '"+fieldValue+"' ";}return this;
}/*** 不等于 !=* sqlUtil.ne("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function notEqual(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" != '"+fieldValue+"' ";}return this;
}/*** 等于 =* sqlUtil.eq("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function equal(fieldName,fieldValue,condition = true){if(!condition){return this;}if(!fieldValue){return this;}if(typeof fieldValue === 'string' && fieldValue.trim() === ''){return this;}sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" = '"+fieldValue+"' ";return this;
}/*** 模糊搜索 like* sqlUtil.like("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function sqlLike(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){fieldValue = fieldValue.replaceAll('%','\\%');sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" like '%"+fieldValue+"%' ";}return this;
}/*** 模糊搜索 左like* sqlUtil.leftLike("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function leftLike(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){fieldValue = fieldValue.replaceAll('%','\\%');sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" like '%"+fieldValue+"' ";}return this;
}/*** 模糊搜索 右like* sqlUtil.rightLike("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function rightLike(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){fieldValue = fieldValue.replaceAll('%','\\%');sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" like '"+fieldValue+"%' ";}return this;
}/*** in查询* sqlUtil.in("field_name",fieldValueArray)* @param fieldName 字段名* @param fieldValueArray 字段值数组* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function sqlIn(fieldName,fieldValueArray = [],condition = true){if(!condition){return this;}if (fieldValueArray.length === 0){return this;}sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" in ( ";for (const fieldValue of fieldValueArray) {if(typeof fieldValue === "string"){sqlUtil.buildSql = sqlUtil.buildSql + "'" + fieldValue + "',";}else{sqlUtil.buildSql = sqlUtil.buildSql + fieldValue + ",";}}sqlUtil.buildSql = sqlUtil.buildSql.substring(0,sqlUtil.buildSql.length-1) + ") ";return this;
}/*** not in查询* sqlUtil.notIn("field_name",fieldValueArray)* @param fieldName 字段名* @param fieldValueArray 字段值数组* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function notIn(fieldName,fieldValueArray = [],condition = true){if(!condition){return this;}if (fieldValueArray.length === 0){return this;}sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" not in ( ";for (const fieldValue of fieldValueArray) {sqlUtil.buildSql = sqlUtil.buildSql + fieldValue + " ,";}sqlUtil.buildSql = sqlUtil.buildSql.substring(0,sqlUtil.buildSql.length-1) + " ) ";return this;
}/*** is null* sqlUtil.isNull("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function isNull(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" is null '"+fieldValue+"%' ";}return this;
}/*** is not null* sqlUtil.isNotNull("field_name",fieldValue)* @param fieldName 字段名* @param fieldValue 字段值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function isNotNull(fieldName,fieldValue,condition = true){if(!condition){return this;}if(fieldValue && fieldValue.trim() !== ''){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" is not null '"+fieldValue+"%' ";}return this;
}/*** 是否为空字符* sqlUtil.isEmpty("field_name",fieldValue)* @param fieldName 字段名* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function isEmpty(fieldName,condition = true){if(!condition){return this;}if(fieldName){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" = '' ";}return this;
}/*** 是否为 空字符或null* sqlUtil.isEmpty("field_name",fieldValue)* @param fieldName 字段名* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function isEmptyOrNull(fieldName,condition = true){if(!condition){return this;}if(fieldName){sqlUtil.buildSql = sqlUtil.buildSql + "and ("+fieldName+" = '' or  "+fieldName+" is null)";}return this;
}/*** 是否为空字符* sqlUtil.isNotEmpty("field_name",fieldValue)* @param fieldName 字段名* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function isNotEmpty(fieldName,condition = true){if(!condition){return this;}if(fieldName){sqlUtil.buildSql = sqlUtil.buildSql + "and "+fieldName+" != '' ";}return this;
}/*** 是否为空字符* sqlUtil.isNotEmpty("field_name",fieldValue)* @param fieldName 字段名* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function isNotEmptyAndNotNull(fieldName,condition = true){if(!condition){return this;}if(fieldName){sqlUtil.buildSql = sqlUtil.buildSql + "and ("+fieldName+" != '' or  "+fieldName+" is not null)";}return this;
}/*** between("age", 20, 22);* @param fieldName 字段名* @param fieldValue1  第一个值* @param fieldValue2 第二个值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/function between(fieldName,fieldValue1,fieldValue2,condition = true){if(!condition){return this;}if(!fieldValue1 || !fieldValue2){return this;}if(typeof fieldValue1 === 'string' && typeof fieldValue2  === 'string'){//  有可能是日期sqlUtil.buildSql = sqlUtil.buildSql + "and '"+fieldName+"' between '"+fieldValue1+"' and '"+fieldValue2+"' ";}else{sqlUtil.buildSql = sqlUtil.buildSql + "and '"+fieldName+"' between "+fieldValue1+" and "+fieldValue2+" ";}return this;
}/*** sqlUtil.notBetween("field_name",20,22)* notBetween("age", 20, 22);* @param fieldName 字段名* @param fieldValue1  第一个值* @param fieldValue2 第二个值* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/function notBetween(fieldName,fieldValue1,fieldValue2,condition = true){if(!condition){return this;}if(fieldName){sqlUtil.buildSql = sqlUtil.buildSql + "and '"+fieldName+"' not between "+fieldValue1+" and "+fieldValue2+" ";}return this;
}/*** sqlUtil.orderByAsc("field_name") || sqlUtil.orderByAsc(["field_name1","field_name2"])* "order by id asc"* @param fieldName 字段名 || 数组* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function orderByAsc(fieldName,condition = true){if(!condition){return this;}if(typeof fieldName === 'string'){sqlUtil.buildSql = sqlUtil.buildSql +" order by "+fieldName+" asc"}else{sqlUtil.buildSql = sqlUtil.buildSql +" order by ";for (const itemName of fieldName) {sqlUtil.buildSql = sqlUtil.buildSql + itemName + " asc,";}sqlUtil.buildSql = sqlUtil.buildSql.substring(0,sqlUtil.buildSql.length-1) + " ";}return this;
}/*** sqlUtil.orderByDesc("field_name") || sqlUtil.orderByDesc(["field_name1","field_name2"])* "order by id desc"* @param fieldName 字段名 || 数组* @param condition 判断条件是否成立* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function orderByDesc(fieldName,condition = true){if(!condition){return this;}if(typeof fieldName === 'string'){sqlUtil.buildSql = sqlUtil.buildSql +" order by "+fieldName+" desc"}else{sqlUtil.buildSql = sqlUtil.buildSql +" order by ";for (const itemName of fieldName) {sqlUtil.buildSql = sqlUtil.buildSql + itemName + " desc,";}sqlUtil.buildSql = sqlUtil.buildSql.substring(0,sqlUtil.buildSql.length-1) + " ";}return this;
}/*** 自定义排序* @param fieldList 字段名或数组[{fileName:'',order:''}],order的值为 desc|asc* @param condition* @returns {orderBy}*/
function orderBy(fieldList,condition = true){if(!condition){return this;}sqlUtil.buildSql = sqlUtil.buildSql +" order by ";for (const item of fieldList) {sqlUtil.buildSql = sqlUtil.buildSql + item.fileName +" "+item.order +",";}sqlUtil.buildSql = sqlUtil.buildSql.substring(0,sqlUtil.buildSql.length-1) + " ";return this;
}/*** 简单的或条件 or* const paramMap =  new Map([*   ["field_name1",fieldValue1],*   ["field_name2",fieldValue2],*   ["field_name3",fieldValue3],* ])** sqlUtil.sor(paramMap)* @param paramMap  参数集** @param condition* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function simpleOr(paramMap,condition = true){if(!condition){return this;}if(! paramMap){return this;}sqlUtil.buildSql += "and ( ";for(let [index,field] of paramMap.entries()){sqlUtil.buildSql = sqlUtil.buildSql + field[0]+" = '"+field[1]+"' or ";}sqlUtil.buildSql = sqlUtil.buildSql.substring(0, sqlUtil.buildSql.length - 4) +  ") ";return this;
}/*** 或条件 or** sqlUtil.OR(paramMap)* @param paramSqlList  sql集* @param condition* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function sqlOr(paramSqlList= [],condition = true){if(!condition){return this;}if(paramSqlList.length === 0){return this;}sqlUtil.buildSql = sqlUtil.buildSql +" and (";for (const paramSql of paramSqlList) {sqlUtil.buildSql = sqlUtil.buildSql + " or "}sqlUtil.buildSql = sqlUtil.buildSql.substring(0,sqlUtil.buildSql.length - 3) + ") "return this;
}/*** 查询没有被逻辑删除的* @returns {{sqlUtil}} 拼接后的sqlUtil*/
function notDelete(){sqlUtil.buildSql += "and is_delete = '0' "return this;
}/*** 自定义sql,* @param paramSql  'and {condition}'* @param condition  条件*/
function userDefined(paramSql,condition = true){if(!condition){return this;}sqlUtil.buildSql += paramSql;return this;}/*** 获取拼装后的sql* @returns {string}*/
function toSql(){let sql = '';//判断有没有orderByif(sqlUtil.buildSql.indexOf("order by") != -1){let arr = sqlUtil.buildSql.split("order by");sql = arr[0] + " and is_delete = '0' "+"order by"+arr[1];}else{sql =  sqlUtil.notDelete()["buildSql"];}// sqlUtil.notDelete().buildSqlsqlUtil.buildSql = '';console.log("sql:"+sql);return sql;
}export default sqlUtil;​

或许某些场景,例如用户自定义条件的场景才用得到吧?这篇文章如能提供到帮助,方便的话请在评论下留言,我也想知道还能用到什么地方。

使用方式参考如下(使用userDefined方法可以利用sql函数,并进行条件拼接):

return sqlUtil.toLike("discussion_title",searchParam.discussionTitle).eq("division_code",searchParam.divisionCode).eq("party_grid_deliberation_id",searchParam.partyGridDeliberationId).userDefined(" and (DATE_FORMAT(discussion_time_start, '%Y-%m') = '"+this.searchParam.discussionYearMonth+"' or DATE_FORMAT(discussion_time_end, '%Y-%m') = '"+this.searchParam.discussionYearMonth+"') ",this.searchParam.discussionYearMonth).orderByDesc("discussion_time_start").toSql();

另外进阶版,可以结合jq的extend,进一步封装,像后端开发那样,把业务代码写到前端来。如图:

fwptPost(表名,提交的json对象)。

这样做当然是有缺陷,需要解决事务一致性的问题,要考虑如何联表,要考虑性能。

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

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

相关文章

2024有哪些免费的mac苹果电脑深度清理工具?CleanMyMac X

苹果电脑用户们&#xff0c;你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅&#xff1f;可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻&#xff0c;拥有一些高效的深度清理工具就显得尤为重要。今天&#xff0c;我将介绍几款优秀的苹果电脑深度清理工具…

浅谈 Linux 孤儿进程和僵尸进程

文章目录 前言孤儿进程僵尸进程 前言 本文介绍 Linux 中的 孤儿进程 和 僵尸进程。 孤儿进程 在 Linux 中&#xff0c;就是父进程已经结束了&#xff0c;但是子进程还在运行&#xff0c;这个子进程就被称作 孤儿进程。 需要注意两点&#xff1a; 孤儿进程最终会进入孤儿院…

数据结构-带头双向循环链表

文章目录 一.头结点二.双链表1双链表的概念与结构2.与单链表相比 三.循环链表1.关于循环链表2.循环链表的优点 四.带头双向循环链表1.带头双向循环链表2.结构图3.实现 五.代码一览 一.头结点 在链表中设置头结点的作用是什么 标识链表:头结点是链表的特殊节点,它的存在能够明确…

springboot基于web的网上摄影工作室的开发与实现论文

网上摄影工作室 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了网上摄影工作室的开发全过程。通过分析网上摄影工作室管理的不足&#xff0c;创建了一个计算机管理网上摄影工作室的方案。文章介绍了网上摄影工…

1.亿级积分数据分库分表:总体方案设计

项目背景 以一个积分系统为例&#xff0c;积分系统最核心的有积分账户表和积分明细表&#xff1a; 积分账户表&#xff1a;每个用户在一个品牌下有一个积分账户记录&#xff0c;记录了用户的积分余额&#xff0c;数据量在千万级积分明细表&#xff1a;用户每次积分发放、积分扣…

gitlab添加ssh公钥

一&#xff1a;生成公钥 桌面鼠标右击打开 Open Git Bash here (前提是安装了Git)&#xff1b; 2.输入命令 ssh-keygen -t rsa -C "123*****90qq.com"来生成新的密钥对,将其中的"123*****90qq.com"替换为你自己的电子邮件地址。 命令&#xff1a;ssh-keyg…

MWC 2024丨美格智能推出5G RedCap系列FWA解决方案,开启5G轻量化新天地

2月27日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;美格智能正式推出5G RedCap系列FWA解决方案。此系列解决方案具有低功耗、低成本等优势&#xff0c;可以显著降低5G应用复杂度&#xff0c;快速实现5G网络接入&#xff0c;提升FWA部署的经济效益。 RedCap技术带来了…

Linux之嫁衣神功

前言&#xff1a;此博客内容全部转载他人&#xff0c;无一原创&#xff0c;初衷转播优质内容 1 挂载的作用 扩展存储空间 将额外的存储设备连接到Linux系统中&#xff0c;扩展系统的存储容量。 实现数据共享 不同计算机之间可以共享文件和数据&#xff0c;实现更高效的协作…

强大!信息安全技术导图全汇总!共200多张(附下载)

从网络上搜集整理了200多张信息安全技术导图&#xff0c;文末有免费领取方式。 详细文件目录 APT 攻击/ APT 攻击.png APT攻防指南基本思路v1.0-SecQuan.png Red Teaming Mind Map.png Windows常见持久控制.png 发现与影响评估.jpg …

Unity的相机跟随和第三人称视角

Unity相机跟随和第三人称视角 介绍镜头视角跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 思路跟随人物方向进行旋转的镜头视角固定球和人的镜头视角 镜头旋转代码人物移动的参考代码注意 介绍 最近足球项目的镜头在做改动&#xff0c;观察了一下实况足球的视角&#x…

html基本标签

<h1></h1> <p></p> h是标签从h1~h6&#xff0c;没用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平台</a> href可以指定链接进行跳转 <img src"https://www.educoder.net/attachments/download/2078…

跨境知识分享:什么是动态IP?和静态IP有什么区别?

对于我们跨境人来说&#xff0c;清楚地了解IP地址、代理IP等这些基础知识&#xff0c;并学会正确地使用IP地址对于保障店铺的安全性和稳定性至关重要&#xff0c;尤其是理解动态IP和静态IP之间的区别&#xff0c;以及如何利用这些知识来防止账号关联&#xff0c;对于每个电商卖…

深入理解分库、分表、分库分表

前言 分库分表&#xff0c;是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案&#xff0c;所谓"分库分表"&#xff0c;根本就不是一件事儿&#xff0c;而是三件事儿&#xff0c;他们要解决的问题也都不一样&#xff0c;这三个事儿分别是"只…

Nodejs 第四十二章(jwt)

什么是jwt? JWT&#xff08;JSON Web Token&#xff09;是一种开放的标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用间传递信息的一种方式。它是一种基于JSON的安全令牌&#xff0c;用于在客户端和服务器之间传输信息。 https://jwt.io/ JWT由三部分组成&…

Qt 自定义长条进度条(类似播放器进度条)

1.运行界面 2.步骤 其实很简单。 2.1绘制底图圆角矩形 2.2绘制播放进度圆角矩形 参考&#xff1a;painter绘图 3.源码 #pragma once#include <QWidget> #include <QLabel> #include <QHBoxLayout> #include <QMouseEvent> #include <QDebug&g…

探索Redis 6.0的新特性

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统&#xff0c;通常被用作缓存、消息队列和实时数据处理等场景。它的简单性、高性能以及丰富的数据结构支持使其成为了众多开发者和企业的首选。在Redis 6.0版本中&#xff0c;引入了一…

NVMe开发——PCIe复位

简介 PCIe中有4种复位机制&#xff0c;早期的3种被称为传统复位(Conventional Reset)。传统复位中的前2种又称为基本复位(Fundamental Resets)&#xff0c;分别为冷复位(Cold Reset)&#xff0c;暖复位(Warm Reset)。第3种复位为热复位(Hot Reset)。第4种复位被称为功能级复位…

SQL面试题(2)

第一题 创建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…

【机器学习基础】层次聚类-BIRCH聚类

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…

如何将视频的声音转换成音频?视频提取音频的小妙招

在数字化时代&#xff0c;视频和音频是我们生活中不可或缺的元素。有时候&#xff0c;我们可能只需要视频中的音频部分&#xff0c;这时就需要将视频的声音转换成音频文件。那么&#xff0c;如何实现这一操作呢&#xff1f;本文将为您介绍几种简单而实用的小妙招。 方法一&…