前端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.mzph.cn/news/706744.shtml

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

相关文章

【突发】MDPI再出事!23本期刊84篇论文存在“审稿人工厂”问题,4本被中科院预警!

毕业推荐 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区 • 2个月19天录用&#xff0c;6天见刊&#xff0c;36天检索 SCIE&#xff08;CCF-C类&#xff09; • 算法类&#xff0c;2.0-3.0&#xff0c;JCR3区&#xff0c;中科院…

后台与接口测试demo 查数据

pom 里引入 mybatis 依赖 2.添加 entity 实体类 3.添加 Mapper 添加SQL语句、接口 SpringbootApplicants.Java 添加 RestController接口 标识 SpringbootApplication 是一个接口&#xff0c;可以通过 GetMapping(“/”) 查询所有数据。 GetMapping(“/”) 依赖于 RestCon…

SpringCloud微服务-Eureka注册中心

Eureka注册中心 文章目录 Eureka注册中心前言1、Eureka的作用2、搭建EurekaServer3、服务注册4、启动多个实例5、服务拉取 -实现负载均衡 前言 在服务调用时产生的问题&#xff1a; //2. 利用RestTemplate发起HTTP请求&#xff0c;查询user String url "http://localho…

【力扣hot100】刷题笔记Day15

前言 今天要刷的是图论&#xff0c;还没学过&#xff0c;先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本节点…

DVWA 靶场之 Command Injection(命令执行)middlehigh

对于 middle 难度的 我们直接先看源码 <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Set blacklist$substitutions array(&& > ,; > ,);// Remove any of the characters in the array (blacklist).$target str_rep…

通过一个栗子来看看创建和运行servlet

通过前面一篇文章的介绍&#xff08;搞着搞着对web project是不是有点迷糊&#xff1f;先关注几个问题-CSDN博客&#xff09;大家对于servlet作为中间层接收请求和反馈响应有了概念上的认知&#xff0c;接下来通过一个栗子来加深一下理解&#xff0c;还是基于前面的jsp项目&…

水电表远程集中抄表管理系统

水电表远程集中抄表管理系统是当前水电行业智能化发展的关键技术之一&#xff0c;为水电企业和用户提供了便捷、高效的抄表管理解决方案。该系统结合了远程监控、自动抄表、数据分析等多种功能&#xff0c;实现了水电抄表的智能化和精准化&#xff0c;为用户节省了大量人力物力…

智慧公厕让社区生活更美好

随着科技的迅猛发展&#xff0c;城市管理、城市服务均使用科技化的手段进行升级改造&#xff0c;社区生活更美好赋予全新的智慧效能&#xff0c;其中智慧公厕也成为了城市环卫设施的新宠。智慧公厕以物联网、互联网、大数据、云计算、5G通信、自动化控制等技术为核心&#xff0…

浅谈 Linux fork 函数

文章目录 前言fork 基本概念代码演示示例1&#xff1a;体会 fork 函数返回值的作用示例2&#xff1a;创建多进程&#xff0c;加深对 fork 函数的理解 前言 本篇介绍 fork 函数。 fork 基本概念 pid_t fork(void) fork 的英文含义是"分叉"&#xff0c;在这里就是 …

UE4c++ ConvertActorsToStaticMesh

UE4c ConvertActorsToStaticMesh ConvertActorsToStaticMesh UE4c ConvertActorsToStaticMesh创建Edior模块&#xff08;最好是放Editor模块毕竟是编辑器代码&#xff09;创建UBlueprintFunctionLibraryUTestFunctionLibrary.hUTestFunctionLibrary.cpp:.Build.cs 目标:为了大量…

【QT+QGIS跨平台编译】之五十一:【QGIS_CORE跨平台编译】—【qgsexpressionparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

【严格递增】2972统计移除递增子数组的数目 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 严格递增 子数组 LeetCode2972. 统计移除递增子数组的数目 II 给你一个下标从 0 开始的 正 整数数组 nums 。 如果 nums 的一个子数组满足&#xff1a;移除这个子数组后剩余元素 严格递增 &#xff0c;那么我们称这个子…

Vue+SpringBoot打造天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

Qt RGB三色灯上位机

今天突发奇想做一个Qt RGB三色灯上位机&#xff0c;刚好手上有一个RGB三色灯和arduion开发板。 我是想实现一个颜色选择器界面然后鼠标点击颜色区域就可以发出rgb的值&#xff0c;然后把这个值通过串口线发送给arduion,arduion再解析出数据发送给RGB三色灯。 实现界面如下&…

express+mysql+vue,从零搭建一个商城管理系统3--user路由模块

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建routes文件夹二、新建routes/index.js和routes/user.js三、修改index.js四、修改routes/index.js五、修改routes/user.js六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所…

maven的私服

什么是maven的私服就是把自己写的工具类共享给别人这样大家都能用到你写的工具类不用重复写提示效率 maven的上传与下载示意图 1.什么是发行版本&#xff1f;发行版本指定的是功能稳定可以共大家使用的版本 2.什么是快照版本&#xff1f;快照版本指定的是指正在开发的版本 3…

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

第102讲:MySQL多实例与Mycat分布式读写分离的架构实践

文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的…

蓝桥杯第十四届电子类单片机组决赛程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十四届比赛题目 1.比赛题目 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、显示功能实现 1.关于高位为0时数码管熄灭功能的实现 2.关于显示小数位的处理 3.关于“校准值”的…

Nginx反向代理ip透传与负载均衡

前言 上篇介绍了nginx服务器单向代理和动静分离等相关内容&#xff0c;可参考Nginx重写功能和反向代理-CSDN博客&#xff0c;这里就ip透传和负载均衡对nginx反向代理做进一步了解。 目录 一、客户端ip透传 1. 概述 2. 一级代理 2.1 图示 2.2 操作过程 3. 二级代理 3.…