Unity 通用UI界面逻辑总结
概述
在游戏开发中,常常会遇到一些通用的界面逻辑,它不论在什么类型的游戏中都会出现。为了避免重复造轮子,本文总结并提供了一些常用UI界面的实现逻辑。希望可以帮助大家快速开发通用界面模块,也可以在次基础上进行扩展修改,以适应你项目的需求。
工程链接:GitCode - 全球开发者的开源社区,开源代码托管平台
二次确认界面
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;public class ConfirmDialog : MonoBehaviour
{private Text txt_title;private Text txt_content;private Button btn_Yes;private Button btn_No;void Start(){var root = gameObject.transform;txt_title = root.Find("txt_Title").GetComponent<Text>();txt_content = root.Find("txt_Content").GetComponent<Text>();btn_Yes = root.Find("btn/btn_Yes").GetComponent<Button>();btn_No = root.Find("btn/btn_No").GetComponent<Button>();txt_title.text = "提示";//测试代码InitDialog("好好学习,天天向上!", () => {Debug.Log("Yes"); },() => {Debug.Log("No"); });}/// <summary>/// 重载一:使用默认标题 “提示”/// </summary>/// <param name="content">需要确认的内容</param>/// <param name="yesAction">确认按钮回调</param>/// <param name="noAction">取消按钮回调</param>public void InitDialog(string content, UnityAction yesAction = null, UnityAction noAction = null){txt_title.text = "提示";CoreLogic(content, yesAction, noAction);}/// <summary>/// 重载一:使用自定义标题/// </summary>/// <param name="title">自定义标题</param>/// <param name="content">需要确认的内容</param>/// <param name="yesAction">确认按钮回调</param>/// <param name="noAction">取消按钮回调</param>public void InitDialog(string title, string content, UnityAction yesAction = null, UnityAction noAction = null){txt_title.text = title;CoreLogic(content, yesAction, noAction);}//公共逻辑提取private void CoreLogic(string content, UnityAction yesAction = null, UnityAction noAction = null){txt_content.text = content;BindBtnLogic(btn_Yes, yesAction);BindBtnLogic(btn_No, noAction);btn_Yes.gameObject.SetActive(yesAction != null);btn_No.gameObject.SetActive(noAction != null);}//绑定按钮点击回调private void BindBtnLogic(Button btn, UnityAction action){btn.onClick.RemoveAllListeners();if (action != null){btn.onClick.AddListener(action);}}
}
切页标签
通过按钮来实现。虽然使用Toggle也可以实现,但是在实际开发中会发现使用toggle不好控制选中事件的触发和选中状态表现。通过按钮来自定义组件可以更好地控制逻辑的调用和标签的显示。
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;class TabNode
{ public int index;public GameObject offBg;public GameObject onBg;public Text offTxt;public Text onTxt;public Button btn;public UnityAction callback;
}public class SwitchPageTab : MonoBehaviour
{public Transform tabRoot;//标签组的父节点public GameObject tabObj;//标签页预制体模板private int _selectIndex;//选中的标签页索引private List<TabNode> _objList = new List<TabNode>();private Dictionary<int, UnityAction> _callbackDic = new Dictionary<int, UnityAction>();private void Start(){_selectIndex = -1;InitCount(4);BindSelectCallback(0, "背包", (() =>{Debug.Log("查看背包");}));BindSelectCallback(1, "英雄", (() =>{Debug.Log("查看英雄");}));BindSelectCallback(2, "商店", (() =>{Debug.Log("查看商店");}));BindSelectCallback(3, "活动", (() =>{Debug.Log("查看活动");}));OnSelectLogic(0);}/// <summary>/// 初始化调用/// </summary>/// <param name="count">标签的数量</param>public void InitCount(int count){_objList.Clear();ClearAllChild(tabRoot);for (var i = 0; i < count; i++){var obj = Instantiate(tabObj, tabRoot);obj.SetActive(true);var trans = obj.transform;var node = new TabNode{offTxt = trans.Find("btn/offBg/offTxt").GetComponent<Text>(),onTxt = trans.Find("btn/onBg/onTxt").GetComponent<Text>(),onBg = trans.Find("btn/onBg").gameObject,offBg = trans.Find("btn/offBg").gameObject,btn = trans.Find("btn").GetComponent<Button>(),};var index = i;BindBtnLogic(node.btn, () =>{OnSelectLogic(index);});_objList.Add(node);}}/// <summary>/// 绑定指定页签索引的回调函数/// </summary>/// <param name="index">页签索引</param>/// <param name="txt">页签问本</param>/// <param name="callback">选中回调</param>public void BindSelectCallback(int index,string txt,UnityAction callback){if (_callbackDic.ContainsKey(index)){Debug.LogError("已经注册过了!");return;}if (callback == null){Debug.LogError("回调为空!");return;}if (index < 0 || index > _objList.Count){Debug.LogError("索引越界!");return;}var node = _objList[index];node.onTxt.text = txt;node.offTxt.text = txt;_callbackDic.Add(index,callback);}/// <summary>/// 调用指定索引对应的回调函数/// </summary>/// <param name="index"></param>private void OnSelectLogic(int index){if (index == _selectIndex){return;}_selectIndex = index;var isExist = _callbackDic.TryGetValue(_selectIndex, out UnityAction callback);if (isExist){callback?.Invoke();SetSelectStatus(index);}}/// <summary>/// 控制指定页签的UI表现/// </summary>/// <param name="index"></param>private void SetSelectStatus(int index){var count = _objList.Count;for (var i = 0; i < count; i++){var isActive = index == i;var node = _objList[i];node.onBg.SetActive(isActive);node.offBg.SetActive(!isActive);}}//清除指定父节点下的所有子物体private void ClearAllChild(Transform parentRoot){var childCount = parentRoot.childCount;for (var i = childCount - 1; i >= 0; i--){var child = parentRoot.GetChild(i);DestroyImmediate(child.gameObject);}}//绑定按钮点击回调private void BindBtnLogic(Button btn, UnityAction action){btn.onClick.RemoveAllListeners();if (action != null){btn.onClick.AddListener(action);}}
}
飘字提示
简易版本
using UnityEngine;
using UnityEngine.Pool;
using DG.Tweening;
using UnityEngine.UI;public class SimpleTip : MonoBehaviour
{//提示栏预制体public GameObject tipObj;//提示栏显示的父节点public Transform tipRoot;//对象池private ObjectPool<GameObject> tipPool;//飞行高度private float flyHeight = 500;void Start(){InitTipPool();}void Update(){if (Input.GetKeyDown(KeyCode.Space)){ShowTip("货币不足!");}}void ShowTip(string tipStr){var obj = tipPool.Get();var rectValue = obj.GetComponent<RectTransform>();var group = obj.GetComponent<CanvasGroup>();var txt = obj.transform.Find("txt").GetComponent<Text>();txt.text = tipStr;obj.SetActive(true);group.alpha = 1;ResetLocal(obj.transform);rectValue.DOAnchorPosY(flyHeight, 1f).OnComplete(() =>{group.DOFade(0, 0.1f).OnComplete(() =>{tipPool.Release(obj);});});}//初始化对象池void InitTipPool(){tipPool = new ObjectPool<GameObject>(() =>{//创建新对象调用var obj = Instantiate(tipObj, tipRoot);obj.SetActive(false);return obj;},(go) =>{//获取对象调用go.SetActive(true);ResetLocal(go.transform);},(go) =>{// 在对象放回池子时调用go.SetActive(false);ResetLocal(go.transform);go.transform.SetParent(tipRoot);},(go) =>{Destroy(go); });}//重置本地信息void ResetLocal(Transform trans){trans.localPosition = Vector3.zero;trans.localEulerAngles = Vector3.zero;trans.localScale = Vector3.one;}
}
升级版本
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Pool;public class GoodTip : MonoBehaviour
{//提示栏显示的父节点public Transform root;//提示栏模板预制体public GameObject tipObj;//对象池节点public Transform objectPool;//最多显示的提示栏数量,超过就隐藏private int limitCount = 5;//提示栏之间的偏移private float offset = 20;//提示飞行高度private float flyHeight = 100;//提示栏生成数量,只用于逻辑运算private int tipCount = 0;//提示栏高度private float tipHeight;private Queue<GameObject> visualTipQueue = new Queue<GameObject>();//是否可继续生成提示栏,防止频繁点击造成异常private bool isOk = true;private float timer = 0f;private bool startTimer = false;private float displayTime = 0.65f;//提示停留展示时间private ObjectPool<GameObject> tipPool;void Start(){var rect = tipObj.GetComponent<RectTransform>();tipHeight = rect.rect.height;InitTipPool();}private void Update(){if (startTimer){//定时统一清理提示消息timer += Time.deltaTime;if (timer > displayTime){ClearAllMsg();timer = 0f;startTimer = false;}}if (Input.GetKeyDown(KeyCode.Space)){ShowTip("货币不足!");}}public void ShowTip(string tip){if (!isOk){return;}startTimer = false;isOk = false;var obj = tipPool.Get();var rect1 = obj.GetComponent<RectTransform>();var group = obj.GetComponent<CanvasGroup>();var sequence = DOTween.Sequence();if (visualTipQueue.Count > 0){sequence.AppendCallback(() =>{foreach (var item in visualTipQueue){var rectValue = item.GetComponent<RectTransform>();rectValue.DOAnchorPosY(rectValue.anchoredPosition.y+tipHeight+offset, 0.2f);}});sequence.AppendInterval(0.2f);}sequence.AppendCallback(() =>{group.alpha = 1;obj.transform.SetParent(root);obj.transform.localScale = new Vector3(0, 0, 1);obj.SetActive(true);rect1.anchoredPosition = Vector2.zero;visualTipQueue.Enqueue(obj);tipCount++;var txt = obj.transform.Find("txt").GetComponent<Text>();txt.text = tip;if (tipCount > limitCount){var result = visualTipQueue.Dequeue();tipPool.Release(result);tipCount--;}});sequence.Append(obj.transform.DOScale(Vector3.one, 0.1f));sequence.AppendInterval(0.1f);sequence.OnComplete(() =>{timer = 0f;isOk = true;startTimer = true;});}//初始化对象池void InitTipPool(){tipPool = new ObjectPool<GameObject>(() =>{//创建新对象调用var obj = Instantiate(tipObj, objectPool);obj.SetActive(false);return obj;},(go) =>{//获取对象调用go.SetActive(true);ResetLocal(go.transform);},(go) =>{// 在对象放回池子时调用go.SetActive(false);ResetLocal(go.transform);go.transform.SetParent(objectPool);},(go) =>{Destroy(go); });}//重置本地信息void ResetLocal(Transform trans){trans.localPosition = Vector3.zero;trans.localEulerAngles = Vector3.zero;trans.localScale = Vector3.one;}//清空消息public void ClearAllMsg(){var childCount = root.childCount;for (var i = 0; i < childCount; i++){var child = root.GetChild(i);var group = child.GetComponent<CanvasGroup>();var rectValue = child.GetComponent<RectTransform>();var sequence = DOTween.Sequence();sequence.AppendInterval(0.1f * i);sequence.Append(rectValue.DOAnchorPosY(rectValue.anchoredPosition.y + tipHeight+flyHeight, 0.2f));sequence.Append(group.DOFade(0, 0.1f).OnComplete(() =>{visualTipQueue.Dequeue();tipPool.Release(child.gameObject);tipCount--;}));}}
}
左右切换按钮组
本组件一般出现在查看英雄界面,点击左右两个按钮切换查看按钮的详细信息。在英雄列表中,第一个英雄的左按钮不显示,最后一个英雄的右按钮不显示。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;public class SwitchCheck : MonoBehaviour
{public Button btn_Left;public Button btn_Right;public Text txt_Check;private int sumCount;private int curIndex;private UnityAction<int> callback;//外部逻辑回调void Start(){curIndex = 0;InitGroup(10, (index) =>{txt_Check.text = $"{index}/{sumCount}";});CheckBtnActive();BindBtnLogic(btn_Left, () =>{var nextIndex = curIndex - 1;if (nextIndex < 0){return;}curIndex = nextIndex;CheckBtnActive();});BindBtnLogic(btn_Right, () =>{var nextIndex = curIndex + 1;if (nextIndex >= sumCount){return;}curIndex = nextIndex;CheckBtnActive();});}public void InitGroup(int _sumCount,UnityAction<int> _callback){sumCount = _sumCount;callback = _callback;}//按钮显隐逻辑private void CheckBtnActive(){if (sumCount <= 1){btn_Left.gameObject.SetActive(false);btn_Right.gameObject.SetActive(false);}else{btn_Left.gameObject.SetActive(curIndex >= 1);btn_Right.gameObject.SetActive(curIndex <= sumCount-2);}var showIndex = curIndex + 1;callback?.Invoke(showIndex);}//绑定按钮点击回调private void BindBtnLogic(Button btn, UnityAction action){btn.onClick.RemoveAllListeners();if (action != null){btn.onClick.AddListener(action);}}
}
帮助说明界面
using System.Text;
using UnityEngine;
using UnityEngine.UI;public class ComDesc : MonoBehaviour
{public Text txt_Title;public Text txt_Desc;public RectTransform content;void Update(){if (Input.GetKeyDown(KeyCode.Space)){SetDesc("帮助", "好好学习,天天向上");}if (Input.GetKeyDown(KeyCode.A)){var str = "好好学习,天天向上";StringBuilder sb = new StringBuilder();for (var i = 1; i < 100; i++){sb.Append(str);}SetDesc("帮助", sb.ToString());}}/// <summary>/// 设置说明描述/// </summary>/// <param name="title">界面标题</param>/// <param name="desc">说明文本</param>public void SetDesc(string title,string desc){txt_Title.text = title;txt_Desc.text = desc;LayoutRebuilder.ForceRebuildLayoutImmediate(content);}
}
跑马灯消息提示
有消息队列缓存,等待队列中所有消息播放完后,提示才消失。
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using TMPro;
using UnityEngine.Events;
using UnityEngine.UI;public class Marquee : MonoBehaviour
{public TMP_Text tmpTxt;public RectTransform maskNode;public CanvasGroup canvasGroup;private float maskWidth;private float unitTime = 0.2f;//计算动画时间自定义标准private Queue<MsgNode> marqueeMsg = new Queue<MsgNode>();private List<int> idList = new List<int>();private bool isPlay;//是否正在播放消息private class MsgNode{public int id;public string msg;public int loopCount;}void Start(){maskWidth = maskNode.rect.width;}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.Space)){var id = Random.Range(1,100);var str = $"id:{id}好好学习,天天向上>>";AddMarqueeMsg(id,str,1);}if(marqueeMsg.Count > 0) {if (!isPlay){isPlay = true;tmpTxt.rectTransform.anchoredPosition = Vector2.zero;var data = marqueeMsg.Peek();idList.Remove(data.id);DisplayMarqueeMsg(data.msg,data.loopCount, () =>{marqueeMsg.Dequeue();if (marqueeMsg.Count == 0){canvasGroup.alpha = 0;}isPlay = false;});}}}/// <summary>/// 在跑马灯消息队列中添加消息/// </summary>/// <param name="msgId">消息记录的唯一id</param>/// <param name="msg">消息内容</param>/// <param name="loopCount">循环播放时间</param>public void AddMarqueeMsg(int msgId, string msg, int loopCount){if (idList.Contains(msgId)){Debug.LogError("消息已在预播队列");return;}if (canvasGroup.alpha < 0.95f){canvasGroup.alpha = 1;}idList.Add(msgId);marqueeMsg.Enqueue(new MsgNode{id = msgId,msg = msg,loopCount = loopCount});}/// <summary>/// 跑马灯消息播放/// </summary>/// <param name="msgId">消息记录的唯一id</param>/// <param name="msg">消息内容</param>/// <param name="loopCount">循环播放时间</param>public void DisplayMarqueeMsg(string msg,int loopCount,UnityAction callback){tmpTxt.text = msg;LayoutRebuilder.ForceRebuildLayoutImmediate(tmpTxt.rectTransform);var width = tmpTxt.rectTransform.rect.width+maskWidth;var duration = GetDuration(width);tmpTxt.rectTransform.DOAnchorPosX(-width, duration).SetEase(Ease.Linear).SetLoops(loopCount, LoopType.Restart).OnComplete(() =>{callback?.Invoke();});}//根据消息长度计算动画匀速运行时间private float GetDuration(float width){var offset1 = (int)width / 100;var offset2 = width % 100 == 0 ?0:1;var offset = offset1 + offset2;return offset * unitTime;}
}
相关文章:
Unity 通用UI界面逻辑总结
概述 在游戏开发中,常常会遇到一些通用的界面逻辑,它不论在什么类型的游戏中都会出现。为了避免重复造轮子,本文总结并提供了一些常用UI界面的实现逻辑。希望可以帮助大家快速开发通用界面模块,也可以在次基础上进行扩展修改&…...
【网络】HTTP协议、HTTPS协议
HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…...
计算机网络——交换机
一、什么是交换机? 交换机(Switch)是局域网(LAN)中的核心设备,负责在 数据链路层(OSI第二层)高效转发数据帧。它像一位“智能交通警察”,根据设备的 MAC地址 精准引导数…...
机器学习:愚者未完成的诗篇(零)
当算法在数据海洋中打捞支离破碎的韵律时,机器学习系统展现出的智慧如同断臂的维纳斯雕像——完美与残缺构成令人战栗的美学悖论。愚者,在词语的混沌中编织逻辑经纬,却总在即将触及诗性本质的瞬间,暴露出认知维度的致命裂隙。 一…...
解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统
目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…...
性能测试和Jmeter
文章目录 前言性能测试理论知识什么是性能?什么是性能测试?性能测试的作用性能测试与功能测试的区别性能测试常见术语性能测试的策略基准测试负载测试稳定性测试压力测试并发测试 常见性能测试指标响应时间并发数吞吐量点击数和错误率资源使用率 性能测试…...
Linux网络之数据链路层协议
目录 数据链路层 MAC地址与IP地址 数据帧 ARP协议 NAT技术 代理服务器 正向代理 反向代理 上期我们学习了网络层中的相关协议,为IP协议。IP协议通过报头中的目的IP地址告知了数据最终要传送的目的主机的IP地址,从而指引了数据在网络中的一步…...
数据结构第八节:红黑树(初阶)
【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 ,是一种 二叉搜索树 ,但 在每个结点上增加一个存储位表示结点的颜色,可以是 Red和 Black 。 通过对 任何…...
【大模型知识点】位置编码——绝对位置编码,相对位置编码,旋转位置编码RoPE
由于Transformer 中的自注意模块具有置换不变性(不关心输入序列的顺序),因此需要使用位置编码来注入位置信息以建模序列,使模型能够区分不同位置的 token,并捕捉序列的顺序关系。 在介绍一些位置编码方法前࿰…...
【大模型篇】推理模型大作战(QwQ-32B vs DeepSeek-R1)
大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。 欢迎关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 写在前面 当我让QwQ-32B vs DeepSeek-R1 写一封未来自己的信 大家更喜欢哪种风格? QwQ-32B 模…...
【汇编语言】单片机程序执行过程
一、任务需求 指示灯LED4闪烁,亮0.5秒,灭0.5秒,无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …...
MYSQL之创建数据库和表
创建数据库db_ck (下面的创建是最好的创建方法,如果数据库存在也不会报错,并且指定使用utf8mb4) show databases命令可以查看所有的数据库名,可以找到刚刚创建的db_ck数据库 使用该数据库时,发现里面没有…...
MybatisPlus
1.增删改查入门案例: 首先导入依赖: <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency> 然后这些增删改查…...
HCIE云计算学什么?怎么学?未来职业发展如何?
随着云计算成为IT行业发展的主流方向,HCIE云计算(华为认证云计算专家)作为华为认证体系中的高端认证之一,逐渐成为了许多网络工程师和IT从业者提升职业竞争力的重要途径。 那么,HCIE云计算究竟学什么内容,如…...
小程序 -- uni-app开发微信小程序环境搭建(HBuilder X+微信开发者工具)
目录 前言 一 软件部分 1. 微信开发者工具 2. HBuilder X 开发工具 二 配置部分 1. 关于 HBuilder X 配置 2. 关于 微信开发工具 配置 三 运行项目 1. 新建项目 2. 代码编写 3. 内置浏览器 编译 4. 配置小程序 AppID获取 注意 四 实现效果 前言 uni-app开发小程…...
多线程-线程本地变量ThreadLocal
简介 ThreadLocal是线程本地变量,用于存储独属于线程的变量,这些变量可以在同一个线程内跨方法、跨类传递。每一个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLo…...
MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模
2025-03-05,由华为诺亚方舟实验室、捷克技术大学和帝国理工学院联合开发的MuBlE(MuJoCo and Blender simulation Environment)模拟环境和基准测试。通过结合MuJoCo物理引擎和Blender高质量渲染,为机器人操作任务规划提供了逼真的视…...
计算机网络笔记(一)——1.1计算机网络在信息时代中的作用
21世纪的一些重要特征是数字化、网络化和信息化,它是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络,因为网络可以迅速地传递信息。网络现在已经成为信息社会的命脉和发展知识经济的重要基础。 有三大类网络大家应该很熟悉,即…...
第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)
客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…...
计算机组成与体系结构-存储系统
主存编址 存储单元:最小存储单元,一般为4bit。每个存储单元有自己的二进制编号 存储器:多个存储单元排布而成。常见的有8*4存储器(8个4bit的存储单元) 编址内容: 按字编址:存储体的最小存储单…...
better-sqlite3之exec方法
在 better-sqlite3 中,.exec() 方法用于执行包含多个 SQL 语句的字符串。与预编译语句相比,这种方法性能较差且安全性较低,但有时它是必要的,特别是当你需要从外部文件(如 SQL 脚本)中执行多个 SQL 语句时。…...
WinUI 3 支持的三种窗口 及 受限的窗口透明
我的目标 希望能够熟悉 WinUI 3 窗口的基本使用方式,了解可能出现的问题 。 WinUI 3 支持三种窗口模式,分别为:常规窗口模式、画中画模式、全屏模式。 窗口模式:常规 即我们最常见的普通窗口。 支持:显示最大化按钮…...
【运维笔记】Navicat中删除mongo 某个时间之前的数据
【运维笔记】Navicat中删除mongo 某个时间之前的数据 一、场景与需求1.1、场景1.2、需求 二、解决方案三、实战3.1、【Navicat】使用sql语句 (推荐)Step 1:使用查询窗口 - 查询Step 2:确认第一步的数据是否是需要删除的数据Step 3…...
java2025年常见设计模式面试题
1. 请解释建造者模式(Builder Pattern)及其应用场景。 答案: 建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。 示例: public class C…...
Docker部署Ragflow(完美解决502 bad gateway)
Docker快速启动Ragflow:Dev 系统准备 ubuntu server 24.04 CPU ≥ 4 cores (x86);RAM ≥ 16 GB;Disk ≥ 100 GB; 更新系统 sudo apt update 下载源码 git clone https://github.com/infiniflow/ragflow.git cd ragflow/docker # 切换稳定版本分支 git checkout -f v0.17.…...
算法中的背包问题详解:部分背包与0-1背包
1. 背包问题概述 背包问题是组合优化中的经典问题,其核心目标是:在给定容量的背包中装入一组物品,使得物品的总价值最大化。根据物品是否可分割或重复选择,背包问题分为多个变种,其中最常见的两种是: 部分…...
Stream特性(踩坑):惰性执行、不修改原始数据源
在日常开发中,Stream API 提供了一种高效且易于使用的工具集来处理集合数据。 本文主要讲解 Stream 的两个特性:惰性执行,不修改原始数据源。 为什么说这两个、而不讲下其他的特性呢?主要是因为在开发中如果忽略这两个特性的话&…...
Varlens(手机上的单反)Ver.1.9.3 高级版.apk
Varlens 是一款专业级手机摄影软件,旨在通过丰富的功能和高自由度参数调节,让手机拍摄效果媲美微单相机。以下是核心功能总结: 一、核心功能 专业拍摄模式 支持手动/自动/程序模式,可调节ISO、快门速度、EV、白平衡等参数27 提供…...
【无监督学习】层次聚类步骤及matlab实现
层次聚类 (四)层次聚类1.算法步骤2.MATLAB 实现参考资料 (四)层次聚类 层次聚类是一种通过逐层合并或分裂数据点构建树状结构(树状图,Dendrogram)的聚类方法。它分为两种类型: 凝聚…...
uploadlabs通关思路
目录 靶场准备 复现 pass-01 代码审计 执行逻辑 文件上传 方法一:直接修改或删除js脚本 方法二:修改文件后缀 pass-02 代码审计 文件上传 1. 思路 2. 实操 pass-03 代码审计 过程: 文件上传 pass-04 代码审计 文件上传 p…...
doris:Elasticsearch
Elasticsearch Catalog 除了支持自动映射 ES 元数据外,也可以利用 Doris 的分布式查询规划能力和 ES(Elasticsearch) 的全文检索能力相结合,提供更完善的 OLAP 分析场景解决方案: ES 中的多 index 分布式 Join 查询。 Doris 和 ES 中的表联合…...
JetBrains学生申请
目录 JetBrains学生免费授权申请 IDEA安装与使用 第一个JAVA代码 1.利用txt文件和cmd命令运行 2.使用IDEA新建项目 JetBrains学生免费授权申请 本教程采用学生校园邮箱申请,所以要先去自己的学校申请校园邮箱。 进入JetBrains官网 点击立即申请,然…...
PDFMathTranslate安装使用
PDF全文翻译!!!! PDFMathTranslate安装使用 它是个啥 PDFMathTranslate 可能是一个用于 PDF 文件的数学公式翻译 工具。它可能包含以下功能: 提取 PDF 内的数学公式 将数学公式转换成 LaTeX 代码 翻译数学公式的内…...
清华北大推出的 DeepSeek 教程(附 PDF 下载链接)
清华和北大分别都有关于DeepSeek的分享文档,内容非常全面,从原理和具体的应用,大家可以认真看看。 北大 DeepSeek 系列 1:提示词工程和落地场景.pdf 北大 DeepSeek 系列 2:DeepSeek 与 AIGC 应用.pdf 清华 Deep…...
2025-03-09 学习记录--C/C++-PTA 练习11-4 字符定位(最后一次找到的字符)
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 裁判测试程序样例: #include <stdio.h> char *match(char *s, char ch); int main(void …...
C语言数据结构之顺序表
目录 1.线性表 2.顺序表 2.1.静态顺序表 2.2.动态顺序表 2.2.1.初始化 2.2.2.清空顺序表 2.2.3.扩容+尾插 2.2.4.尾出函数 2.2.5.头插函数 2.2.6.头出函数 2.2.7.在中间位置插入 2.2.8.删除中间位置数据 2.2.9.查找函数 2.2.10.总结 3.OJ例题 3.1.合…...
【Git】合并冲突
合并冲突 可是,在实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。 为了演示这问题,创建一个新的分支 dev1 ,并切换至目标分支,我们可以使用 git checkout -b dev1 一步…...
【每日学点HarmonyOS Next知识】Web跨域资源、Web长按菜单、Web拦截请求、禁止录屏、Base64图片宽高
1、HarmonyOS Web组件本地资源跨域问题? 关于资源跨域问题的解决,可以参考以下官网文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-cross-origin-V5 方法一 为了使Web组件能够成功访问跨域资源,开…...
高效数据分析实战指南:Python零基础入门
高效数据分析实战指南 —— 以Python为基石,构建您的数据分析核心竞争力 大家好,我是kakaZhui,从事数据、人工智能算法多年,精通Python数据分析、挖掘以及各种深度学习算法。一直以来,我都发现身边有很多在传统行业从…...
【语料数据爬虫】Python爬虫|批量采集征集意见稿数据(1)
前言 本文是该专栏的第5篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“征集意见稿”数据。同时,本文也是采集“征集意见稿”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑…...
电力场景绝缘子缺陷分割数据集labelme格式1585张4类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1585 标注数量(json文件个数):1585 标注类别数:4 标注类别名称:["broken part","broken insulat…...
《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》
类的6个默认成员函数 构造函数 是对一个对象实例化时的初始化 例如在C语言中写的堆的时候要初始化StackInit,而c祖师爷写的构造函数本质上就是自动调用初始化。 构造函数默认构造函数自己写的(符合规定的显示表达式) 注:一般情况下…...
uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!
此文章懒得排版了,为了找出这个bug, 星期六的晚上我从9点查到0点多,此时我心中一万个草泥马在崩腾,超级想骂人!!!!!!!!! uniCloud 不想…...
【论文阅读】VAD: Vectorized Scene Representation for Efficient Autonomous Driving
一、介绍 VAD是华科团队设计的一个端到端无人驾驶框架,针对传统的无人驾驶框架的模块化设计的问题,该算法使用向量化的策略进行了端到端的实现。传统的模块化设计使得感知模块完全依赖于感知模块的计算结果,这一解耦实际上从规划模块的角度损…...
uniapp版本加密货币行情应用
uniapp版本加密货币行情应用 项目概述 这是一个使用uniapp开发的鸿蒙原生应用,提供加密货币的实时行情查询功能。本应用旨在为用户提供便捷、实时的加密货币市场信息,帮助用户随时了解市场动态,做出明智的投资决策。 应用采用轻量级设计&a…...
使用 Java 执行 SQL 语句和存储过程
使用 Java 执行 SQL 语句和存储过程,通常有两种主要的方式:使用 JDBC(Java Database Connectivity)或者通过框架如 Spring Data JPA、MyBatis 等。 1. 使用 JDBC 执行 SQL 语句 JDBC 是 Java 操作数据库的标准 API。以下是通过 …...
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
在算法学习中,深度优先搜索(DFS)是一种常用的图搜索算法,通过递归或栈实现,适合路径搜索、连通性、拓扑排序、回溯、生成、环路检测、强连通分量和可达性等问题。本文将介绍如何利用深度优先搜索解决“妖怪和尚过河问题…...
大白话JavaScript闭包实现原理与在实际开发中的应用场景
大白话JavaScript闭包实现原理与在实际开发中的应用场景 答题思路 解释闭包的概念:先简单直白地说明闭包是什么,让读者对闭包有一个初步的认识。阐述闭包的实现原理:详细讲解闭包是如何形成的,涉及到函数作用域、变量的生命周期…...
【redis】数据类型之geo
Redis的GEO数据类型用于存储地理位置信息(如经纬度),并提供高效的地理位置查询功能(如计算两地距离、搜索附近地点等)。其底层基于Sorted Set(有序集合)实现,通过Geohash编码将经纬度…...
C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域,特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线,涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20:使用现代C特性,如…...