当前位置: 首页 > news >正文

Golang|抽奖相关

文章目录

    • 抽奖核心算法
    • 生成抽奖大转盘
    • 抽奖接口实现

抽奖核心算法

  • 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率,可以想象这样一条 0-1 的数轴,数轴上的每一段相当于一种商品,概率之和为1

在这里插入图片描述

  • 抽奖时,我们会生成 U(0,1) 上的一个随机数,这个数位于哪个线段上就对应着抽中了对应的商品。
  • 构建线段,时间复杂度 O(n)
  • 用二分查找算法查找随机数位于哪一段,时间复杂度 O(logn),采集k个样本需要再乘以k

  • 接下来介绍二分查找区间算法:
  • N 个点把实数域分割成 N+1 段,target 是随机生成的实数
  • target 应该落在哪一段上?
  • 定义 array[i-1] < target < array[i] 为落在第 i 条线段上,代表第 i 个奖品被抽中
    在这里插入图片描述
// BinarySearch 查找 >= target 的最小元素下标,arr单调递增(不能存在重复元素)
// 如果target比arr的最后一个元素还大,返回最后一个元素下标
func BinarySearch(arr []float64, target float64) int {if len(arr) == 0 {return -1}left := 0right := len(arr)for left < right {// 通用条件if target <= arr[left] {return left}if target > arr[right-1] {return right}// len(arr) == 2, mid在left和right之间, 选择left的概率值if left == right-1 {return right}// len(arr) >= 3mid := (left + right) / 2if target < arr[mid] {right = mid} else if target == arr[mid] {return mid} else {left = mid // NOTE: 这里不是找直接数值,而是区间}}return -1
}

在这里插入图片描述

生成抽奖大转盘

  • 首先看看我们对于抽奖大转盘所设计的 mysql 数据库表结构
-- ----------------------------
-- DataBase
-- ----------------------------
CREATE DATABASE lottery;use lottery;-- ----------------------------
-- Table structure for inventory
-- ----------------------------
DROP TABLE IF EXISTS `inventory`;
CREATE TABLE `inventory` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT "奖品id, 自增",`created_at` DATETIME(3) NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",`updated_at` DATETIME(3) NULL DEFAULT NULL COMMENT "更新时间",`deleted_at` DATETIME(3) NULL DEFAULT NULL COMMENT "删除时间",`name` varchar(20) NOT NULL COMMENT "奖品名称",`description` varchar(100) NOT NULL DEFAULT "" COMMENT "奖品描述",`picture` varchar(200) NOT NULL DEFAULT "0" COMMENT "奖品图片",`price` int(11) NOT NULL DEFAULT "0" COMMENT "价值",`count` int(11) NOT NULL DEFAULT "0" COMMENT "库存量",PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COMMENT="奖品库存表";insert into `inventory` (id,name,picture,price,count) values (1,'谢谢参与','img/face.png',0,0);
insert into `inventory` (name,picture,price,count) values ('篮球','img/ball.jpeg',100,1000),('水杯','img/cup.jpeg',80,1000),('电脑','img/laptop.jpeg',6000,200),('平板','img/pad.jpg',4000,300),('手机','img/phone.jpeg',5000,400),('锅','img/pot.jpeg',120,1000),('茶叶','img/tea.jpeg',90,1000),('无人机','img/uav.jpeg',400,100),('酒','img/wine.jpeg',160,500);-- ----------------------------
-- Table structure for order
-- ----------------------------
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT "订单id, 自增",`created_at` DATETIME(3) NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",`updated_at` DATETIME(3) NULL DEFAULT NULL COMMENT "更新时间",`deleted_at` DATETIME(3) NULL DEFAULT NULL COMMENT "删除时间",`gift_id` int(11) NOT NULL COMMENT "商品id",`user_id` int(11) NOT NULL COMMENT "用户id",`count` int(11) NOT NULL DEFAULT "1" COMMENT "购买数量",PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=189549 DEFAULT CHARSET=utf8mb4 COMMENT="订单表";

在这里插入图片描述
在这里插入图片描述

  • 上面这一段,在数据量不大的时候还是可以的,但是数据量一大,在千万级以上大表的场景下就不行啦,会导致长时间的阻塞,而且读出来内存也不够

在这里插入图片描述

  • V2是对其优化,主要是一个分页查询思路,每次把一页的数据放入一个channel中,然后用一个go协程每次从channel中读出数据写入redis
    在这里插入图片描述

  • 对于每个商品的 count 字段,每次被抽中都应该 count 对应的值减1,但是在高并发的情况下mysql可能扛不住这么大并发量下的频繁写入,考虑先记录在redis里面,真正的减1操作是在redis里面实现的。

  • 在前端页面初始化的时候我们需要把整个大转盘的页面通过后端服务器返回的数据去渲染出整个大转盘出来,所以需要一开始通过 InitInventory 函数获得所有奖品的初始库存,存入redis。

在这里插入图片描述

  • 看看前端的代码:
<body><div class="center" id="my-lucky"></div><script>var giftMap = new Map();  //维护奖品ID和转盘里奖品index的对应关系$(document).ready(function () {$.ajax({type: "GET",url: "api/v1/gifts",success: function (data) {console.log(data)let gifts = data["data"]var prizes=new Array();$.each(gifts,function(index,gift){giftMap[gift.Id]=index;prizes[index]= { background: '#e9e8fe', fonts: [{ text: gift.Name }], imgs:[{src:gift.Picture,top:30,width:80,height:80}] };})// 直接使用luch-canvas抽奖插件  https://100px.net/usage/js.htmlconst myLucky = new LuckyCanvas.LuckyWheel('#my-lucky', {width: '600px',height: '600px',blocks: [{ padding: '10px', background: '#869cfa' }],prizes: prizes,buttons: [{ radius: '40%', background: '#617df2' },{ radius: '35%', background: '#afc8ff' },{radius: '30%', background: '#869cfa',pointer: true,fonts: [{ text: '抽奖', top: '-10px' }]},],start: function() {$.ajax({type: "GET",url: "api/v1/lucky",success: function (giftId) {if(giftId=="0"){alert("抽奖结束")}else{myLucky.play();idx=giftMap[giftId];myLucky.stop(idx);}}}).fail(function (result, result1, result2) {alert("出错了");});},end: function(prize) { // 游戏停止时触发alert('恭喜中奖: ' + prize.fonts[0].text)}})}}).fail(function (result, result1, result2) {$('#my-lucky').html("数据加载失败");});});</script>
</body>
  • 我们可以看到前端的代码逻辑是先放一个空的div,然后页面加载好之后通过js代码发起一个请求去请求"/gifts"这个接口获得数据渲染生成大转盘。
  • 这里有个小细节,我们后端返回给前端gifts数据的时候要记得抹掉敏感信息,也就是说我们的抽奖概率是通过商品的库存量来决定的,我们不希望前端拿到json字符串后看到库存量,所以我们的gifts返回给前端的时候记得把所有的库存量都置为0。

在这里插入图片描述

type Inventory struct {ID 			uint 	`gorm:"column:id"`Name 		string 	`gorm:"column:name"`Description string  `gorm:"column:description"`Picture 	string 	`gorm:"column:picture"`Price 		int 	`gorm:"column:price"`Count 		int		`gorm:"column:count"`
}

在这里插入图片描述

  • 上面这段代码就是从redis上获取所有奖品的库存量,其中商品id作为key的时候会统一加一个前缀prefix

抽奖接口实现

在这里插入图片描述

  • 当我们按下抽奖这个按钮后,前端会用js代码请求"/lucky"接口,由后端返回本次抽奖抽中了哪个商品id

在这里插入图片描述
在这里插入图片描述

  • ids和probs两个是一一对应的,一个存的是奖品id一个存的是奖品的库存量
  • 如果奖品已经count为0了,说明已经抽没了,不应该再参与抽奖
  • 为什么要给前端传一个0,因为这个0有特殊的意思,前端收到0后会告诉用户抽奖已经结束
  • 有可能同时对一个库存量为1的商品去执行减1操作,会导致库存量为负数,这个时候我们会执行新一轮的抽奖,重新再抽一遍,如果执行指定次数后还是失败,则会返回最后一行代码,谢谢参与

在这里插入图片描述

  • redis Decr 是支持原子性支持并发的

相关文章:

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率&#xff0c;可以想象这样一条 0-1 的数轴&#xff0c;数轴上的每一段相当于一种商品&#xff0c;概率之和为1。 抽奖时&#xff0c;我们会生…...

10.第二阶段x64游戏实战-添加计时器

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;9.第二阶段x64游戏实战-创建项目代码获取人物属性 效果图&#xff1a; 当前游戏…...

fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb

fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb...

打造AI应用基础设施:Milvus向量数据库部署与运维

目录 打造AI应用基础设施&#xff1a;Milvus向量数据库部署与运维1. Milvus介绍1.1 什么是向量数据库&#xff1f;1.2 Milvus主要特点 2. Milvus部署方案对比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案对比表 3. Milvus部署操作命令实战3.1 Milv…...

使用WindSurf生成贪吃蛇小游戏:从零开始的开发之旅

在当今数字化时代&#xff0c;编程已经成为一项必备技能&#xff0c;而创建游戏无疑是学习编程过程中最具趣味性的项目之一。今天&#xff0c;我将向大家介绍如何使用WindSurf这款强大的代码生成工具来快速生成一个经典的贪吃蛇小游戏。从下载软件到运行游戏&#xff0c;我们将…...

论文学习:《EVlncRNA-net:一种双通道深度学习方法,用于对实验验证的lncRNA进行准确预测》

原文标题&#xff1a;EVlncRNA-net: A dual-channel deep learning approach for accurate prediction of experimentally validated lncRNAs 原文链接&#xff1a;https://www.sciencedirect.com/science/article/pii/S0141813025020896 长链非编码RNA( long non-coding RNAs&…...

LLM Post-Training

1. LLM的后训练分类 Fine-tuning Reinforcement Learning Test-time Scaling 方法 优点 缺点 Fine-tuning 任务适应性&#xff1a;能够针对特定任务或领域进行优化&#xff0c;提升模型在该任务上的性能。 数据驱动优化&#xff1a;利用标注数据直接调整模型参数&#x…...

【LLM】解锁Agent协作:深入了解谷歌 A2A 协议与 Python 实现

人工智能&#xff08;AI&#xff09;智能体正迅速成为企业提高生产力、自动化工作流程和增强运营能力的关键工具。从处理日常重复性任务到协助复杂的决策&#xff0c;智能体的潜力巨大。然而&#xff0c;当这些智能体来自不同的供应商、使用不同的框架或被限制在孤立的数据系统…...

FileWriter 详细解析与记忆方法

FileWriter 详细解析与记忆方法 一、FileWriter 核心概念 FileWriter 是 Java 中用于向文件写入字符数据的类&#xff0c;继承自 OutputStreamWriter&#xff0c;属于字符流体系。 1. 核心特点 特性说明继承关系Writer → OutputStreamWriter → FileWriter数据单位字符&am…...

Java笔记5——面向对象(下)

目录 一、抽象类和接口 1-1、抽象类&#xff08;包含抽象方法的类&#xff09; 1-2、接口 ​编辑​编辑 二、多态 ​编辑 1. 自动类型转换&#xff08;向上转型&#xff09; 示例&#xff1a; 注意&#xff1a; 2. 强制类型转换&#xff08;向下转型&#xff09; 示…...

c++------模板进阶

目录 一、模板 1.1 非类型模板参数 二、模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 全特化 偏特化 &#xff08;1&#xff09;部分特化 &#xff08;2&#xff09;参数更进一步的限制 三、模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决…...

《轨道力学讲义》——第四讲:轨道计算与预测

第四讲&#xff1a;轨道计算与预测 引言 在轨道力学的研究中&#xff0c;轨道计算与预测是将理论付诸实践的关键环节。当我们掌握了轨道运动的基本规律和数学描述后&#xff0c;下一步便是要能够准确地计算航天器在任意时刻的位置和速度&#xff0c;并对其未来的运动轨迹进行…...

鸿蒙开发-页面跳转

1.路由使用 //1.引入路由 import router from ohos.router//2.使用跳转router.pushUrl({url: "pages/Show"})2.页面跳转 import { router } from kit.ArkUI;Entry Component struct LoginPage {State message: string 登陆页;build() {Row() {Column() {Text(this…...

数据大屏只能撑撑场面?

很多人对数据大屏的看法就是“没有用”、“花架子”&#xff0c;实际上&#xff0c;它的作用绝不止于此。 业财猫全新升级的经营驾舱模块&#xff0c;以精准的行业洞察与场景化设计&#xff0c;重新定义了这一工具的价值。 作为专为财税代账行业打造的一站式运营管理平台&…...

第十九讲 | XGBoost 与集成学习:精准高效的地学建模新范式

&#x1f7e8; 一、为什么要学习集成学习&#xff1f; 集成学习&#xff08;Ensemble Learning&#xff09; 是一种将多个弱学习器&#xff08;如决策树&#xff09;组合成一个强学习器的策略。它在地理学、生态学、遥感分类等领域表现尤为突出。 &#x1f4cc; 应用优势&#…...

大数据面试问答-批处理性能优化

1. 数据存储角度 1.1 存储优化 列式存储格式&#xff1a;使用Parquet/ORC代替CSV/JSON&#xff0c;减少I/O并提升压缩率。 df.write.parquet("hdfs://path/output.parquet")列式存储减少I/O的核心机制&#xff1a; 列裁剪&#xff08;Column Pruning&#xff09; …...

关于 软件开发模型 的分类、核心特点及详细对比分析,涵盖传统模型、迭代模型、敏捷模型等主流类型

以下是关于 软件开发模型 的分类、核心特点及详细对比分析&#xff0c;涵盖传统模型、迭代模型、敏捷模型等主流类型&#xff1a; 一、软件开发模型分类及核心特点 1. 瀑布模型&#xff08;Waterfall Model&#xff09; 核心特点&#xff1a; 线性阶段划分&#xff1a;需求分…...

【STL】set

在 C C C S T L STL STL 标准库中&#xff0c; s e t set set 是一个关联式容器&#xff0c;表示一个集合&#xff0c;用于存储唯一元素的容器。 s e t set set 中的元素会自动按照一定的顺序排序&#xff08;默认情况下是升序&#xff09;。这意味着在 s e t set set 中不能…...

信奥还能考吗?未来三年科技特长生政策变化

近年来&#xff0c;科技特长生已成为名校录取的“黄金敲门砖”。 从CSP-J/S到NOI&#xff0c;编程竞赛成绩直接关联升学优势。 未来三年&#xff0c;政策将如何调整&#xff1f;家长该如何提前布局&#xff1f; 一、科技特长生政策趋势&#xff1a;2025-2027关键变化 1. 竞…...

几何建模基础-拓扑命名实现及优化

1.背景介绍 1.1 什么是拓扑&#xff1f; 拓扑是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的一个学科。它只考虑物体间的位置关系而不考虑它们的形状和大小。 Body对象的拓扑可以理解为面&#xff08;Face&#xff09;与边&#xff08;Edge&#xff09;、边…...

浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek音乐创作最强玩法来了!

浙江大学DeepSeek系列专题线上公开课第二季第5期即将在今晚进行直播&#xff01; 其中&#xff0c;今晚8点10分左右&#xff0c;浙大AI大佬张克俊教授将带来硬核的deepseek公开课讲座。 讲座 主题&#xff1a; 人工智能与音乐创作 主讲人&#xff1a; 张克俊 教授 人工智能作…...

electron-builder参数详解

electron-builder 是一个用于打包和构建 Electron 应用的工具&#xff0c;支持 macOS、Windows 和 Linux 平台&#xff0c;并提供了丰富的参数配置选项。 1、安装&#xff1a; npm install electron-builder --save-dev2、参数详解 命令&#xff1a; electron-builder build…...

PVE+CEPH+HA部署搭建测试

一、基本概念介绍 Proxmox VE ‌Proxmox Virtual Environment (Proxmox VE)‌ 是一款开源的虚拟化管理平台&#xff0c;基于 Debian Linux 开发&#xff0c;支持虚拟机和容器的混合部署。它提供基于 Web 的集中管理界面&#xff0c;简化了计算、存储和网络资源的配置与监控。P…...

Android Studio 日志系统详解

文章目录 一、Android 日志系统基础1. Log 类2. 日志级别 二、Android Studio 中的 Logcat1. 打开 Logcat2. Logcat 界面组成3. 常用 Logcat 命令 三、高级日志技巧1. 自定义日志工具类2. 打印方法调用栈3. 打印长日志4. JSON 和 XML 格式化输出 四、Logcat 高级功能1. 自定义日…...

【LLM】A2A 与 MCP:剖析 AI Agent 互联时代的两种关键协议

随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;正从理论走向实践&#xff0c;有望成为提升生产力的关键。然而&#xff0c;正如历史上任何新兴技术领域一样&#xff0c;标准的缺失导致了“筒仓效应”——不同来源、不同框架构建的 Agent 难以有…...

解析大尺寸液晶屏视觉检测,装配错位如何避免?

在3C电子产品种类飞速发展的今天&#xff0c;大尺寸液晶屏已成为市场主流&#xff0c;消费刚需。消费者对手机屏幕的视觉体验要求不断攀升&#xff0c;屏占比的提升成为各大手机厂商竞争的焦点。然而&#xff0c;大尺寸液晶屏在生产过程中面临着诸多检测难题&#xff0c;严重影…...

巴法云平台-TCP设备云-微信小程序实时接收显示数据-原理

微信小程序通过WebSocket或HTTP长轮询连接平台&#xff08;而非直接使用TCP&#xff09;&#xff01;&#xff01;&#xff01; 物联网平台对协议层的一种封装设计——将底层通信协议&#xff08;如TCP&#xff09;与应用层业务逻辑&#xff08;如主题路由&#xff09;解耦&am…...

ElementNotInteractableException原因及解决办法

在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…...

信息系统项目管理师-工具名词解释(上)

本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 数据收集 头脑风暴 在短时间内获得大量创意,适用于团队环境,需要引导者…...

CSI-external-provisioner

main() 这段Go代码是一个CSI&#xff08;容器存储接口&#xff09;Provisioner&#xff08;供应器&#xff09;的实现&#xff0c;用于在Kubernetes集群中动态提供持久卷。代码涉及多个组件和步骤&#xff0c;下面是对关键部分的解释&#xff1a; 初始化和配置 命令行标志和…...

OpenAI为抢跑AI,安全底线成牺牲品?

几年前&#xff0c;如果你问任何一个AI从业者&#xff0c;安全测试需要多长时间&#xff0c;他们可能会淡定地告诉你&#xff1a;“至少几个月吧&#xff0c;毕竟这玩意儿可能改变世界&#xff0c;也可能毁了它。”而现在&#xff0c;OpenAI用实际行动给出了一个新答案——几天…...

单片机任意普通IO引脚使用定时器扩展外部中断的巧妙方法

在嵌入式系统中&#xff0c;将任意一个IO端口配置为外部中断源是一种常见的需求&#xff0c;尤其是在硬件资源有限的情况下。通过定时器扩展外部中断的方法&#xff0c;可以在不依赖专用中断引脚的情况下&#xff0c;实现对外部信号的实时响应。以下是一种基于定时器扩展外部中…...

arcgis几何与游标(1)

本节我们对几何进行展开学习 ArcPy 的几何对象 在 ArcPy 中&#xff0c;几何对象是表示地理空间数据的核心。它包括点&#xff08;Point&#xff09;、多点&#xff08;Multipoint&#xff09;、线&#xff08;Polyline&#xff09;和面&#xff08;Polygon&#xff09;等类型…...

安全密码处理实践

1. 引言 在现代应用程序中,密码存储和验证的安全性 直接关系到用户数据的保护。密码泄露事件频繁发生,通常是由于不安全的存储方式 或 弱加密处理 导致的。为了提高密码的安全性,开发者需要遵循一系列安全密码处理 的最佳实践。 本篇文章将详细介绍如何在应用程序中安全地…...

can‘t set boot order in virtualbox

Boot order setting is ignored if UEFI is enabled https://forums.virtualbox.org/viewtopic.php?t99121 如果勾选EFI boot order就是灰色的 传统BIOS就是可选的 然后选中任意介质&#xff0c;通过右边的上下箭头调节顺序&#xff0c;最上面的应该是优先级最高的 然后就…...

电池分选机详细介绍

在当今这个科技飞速发展的时代&#xff0c;电池作为能源存储的重要载体&#xff0c;其性能的一致性和稳定性对于各类电子设备和电动汽车等应用至关重要。而电池分选机&#xff0c;作为电池生产过程中的关键环节&#xff0c;正扮演着越来越重要的角色。本文将带您深入了解电池分…...

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…...

浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek人文艺术之美专场来啦!

浙江大学DeepSeek系列专题线上公开课第二季第五期即将重磅上线&#xff01; 其中&#xff0c;今晚7点半&#xff0c;浙大AI大神陈为教授将带来硬核的deepseek公开课讲座。 讲座 主题&#xff1a; DeepSeek时代&#xff0c;让AI更懂中国文化的美与善 主讲人&#xff1a; 陈为 …...

5分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试。 接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架如何搭建&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发…...

Flink DataStream API深度解析(Scala版):窗口计算、水位线与状态编程

在前面的文章中Flink 编程基础&#xff1a;Scala 版 DataStream API 入门-CSDN博客&#xff0c;我们已经介绍了 Flink 的 Datastream API 编程模型、窗口划分以及时间语义&#xff08;处理时间、事件时间等&#xff09;。本篇文章将深入讲解窗口计算的进阶内容&#xff0c;包括…...

【从零实现高并发内存池】内存池整体框架设计 及 thread cache实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

#MES系统中的一些相关的名词

&#x1f4cc;MES系统 部分 术语表 缩写英文全称中文名称详细解释MESManufacturing Execution System制造执行系统用于连接计划系统与生产现场&#xff0c;实时管理和控制整个生产过程&#xff0c;覆盖物料、人员、设备、质量、指令等。ERPEnterprise Resource Planning企业资…...

《灵活的接口设计:如何支持多种后端数据存取实现》

《灵活的接口设计:如何支持多种后端数据存取实现》 一、引言:从单一适配到多样需求 在现代软件开发中,系统通常需要与不同的数据存储后端进行交互,例如关系型数据库(MySQL、PostgreSQL)、NoSQL 数据库(MongoDB、Redis)或文件存储(JSON、CSV)。为了增强系统的可扩展性…...

Spark-SQL核心编程(一)

一、Spark-SQL 基础概念 1.定义与起源&#xff1a;Spark SQL 是 Spark 用于结构化数据处理的模块&#xff0c;前身是 Shark。Shark 基于 Hive 开发&#xff0c;提升了 SQL-on-Hadoop 的性能&#xff0c;但因对 Hive 依赖过多限制了 Spark 发展&#xff0c;后被 SparkSQL 取代&…...

Qt:解决MSVC编译器下qDebug输出中文乱码的问题

问题描述&#xff1a; 使用msvc编译器&#xff0c;通过qDebug输出打印信息为乱码&#xff08;显示问号或者乱码&#xff09; 百度到以下方案&#xff0c;但是没有效果 最终解决: 在.pro文件中添加如下&#xff0c;重新构建运行即可显示中文内容 msvc:QMAKE_CXXFLAGS -exec…...

Go:接口

接口既约定 Go 语言中接口是抽象类型 &#xff0c;与具体类型不同 &#xff0c;不暴露数据布局、内部结构及基本操作 &#xff0c;仅提供一些方法 &#xff0c;拿到接口类型的值 &#xff0c;只能知道它能做什么 &#xff0c;即提供了哪些方法 。 func Fprintf(w io.Writer, …...

js | 网页上的 json 数据怎么保存到本地表格中?

1.思路 json 转为 csv 保存到本地或者&#xff1a;json 转为 html 显示到网页中&#xff0c;然后复制到excel中。 (2) 数据 wjl{"code":1,"data":[{"chrmiRNA":"chr1","0":"chr1","startmiRNA":&quo…...

智能Todo协作系统开发日志(二):架构优化与安全增强

&#x1f4c5; 2025年4月14日 | 作者&#xff1a;Aphelios380 &#x1f31f; 今日优化目标 在原Todo单机版基础上进行三大核心升级&#xff1a; 组件化架构改造 - 提升代码可维护性 本地数据加密存储 - 增强隐私安全性 无障碍访问支持 - 践行W3C标准 一、组件化架构改造 …...

buctoj_算法设计与分析(5)

问题 A: 没有上司的舞会 题目描述 Ural大学有N名职员&#xff0c;编号为1~N。 他们的关系就像一棵以校长为根的树&#xff0c;父节点就是子节点的直接上司。 每个职员有一个快乐指数&#xff0c;用整数 HiHi 给出&#xff0c;其中 1≤i≤N。 现在要召开一场周年庆宴会&#x…...

VUE项目中的package.json中的启动脚本

"scripts": {"dev": "vite","build:prod": "vite build","build:stage": "vite build --mode staging","preview": "vite preview"}vite build 和 vite build --mode staging 是 V…...