【Unity3D】UI Toolkit样式选择器

1 前言

        UI Toolkit简介 中介绍了样式属性,UI Toolkit容器 和 UI Toolkit元素 中介绍了容器和元素,本文将介绍样式选择器(Selector),主要包含样式类选择器(Class Selector)、C# 类选择器(Type Selector)、名称选择器(Name Selector)、通用选择器(Universal Selector)、后代选择器(Descendant Selector)、子选择器(Child Selector)、多重选择器(Multiple Selector)、伪类选择器(Pseudo Class)等。样式选择器官方介绍见→USS selectors。

2 简单选择器(Simple Selector) 

        简单选择器优先级:

//       *         <    C# Type    <     .Name      <    #Name
//   通用选择器     <   C#类选择器   <   样式类选择器  <  名称选择器
Universal Selector < Type Selector < Class Selector < Name Selector

2.1 样式类选择器(Class Selector)

        Class 选择器是命名以 "." 号开头的选择器(如:.red、.abc、.xyz 等),需要手动绑定到元素上,官方介绍见→Class selectors。

        1)创建 UI

        在 UI Builder 的 Hierarchy 窗口中创建 UI 如下。

        显示如下。 

        2)创建 USS 文件

        在 StyleSheets 窗口点击 "+" 号,选择 Create New USS 选项,如下。选择 USS 文件保存路径,命名为 StyleSelectorDemo。

        3)创建选择器

        在 StyleSheets 窗口的 selector 框中输入 ".textColor",如下。注意:textColor 前面有个点,命名可以随意,如:demo、test 等都行。

        按 Enter 键后,创建了 selector,如下。

        4)修改选择器的属性

        选中 ".textColor" 选择器,在 Inspector 窗口修改文本颜色,如下。

        5)绑定选择器到元素

        将 ".textColor" 选择器拖拽到 Hierarchy 或 Viewport 窗口中相关元素上,实现样式选择器与元素的绑定。

        也可以通过以下方式绑定元素:选中元素后,在 Inspector 窗口的 Style Class List 中添加 selector,如下。 

        选择器绑定到元素后,在 Inspector 窗口可以看到元素绑定的选择器,如下。可以通过后面的 "x" 号删除选择器。

        6)显示效果

        Label 和 Button 都手动绑定了 ".textColor" 选择器,显示效果如下。 

2.2 C# 类选择器(Type Selector)

        Type 选择器是以元素的 C# 类名命名的选择器(如:Label、Button、VisualElement 等),会自动绑定到对应 Type 的元素上,不需要手动绑定,官方介绍见→Type selectors。

        1)创建选择器

        在 StyleSheets 窗口创建名为 "Label" 的选择器,如下。

        2)修改选择器的属性

        选中 "Label" 选择器,在 Inspector 窗口修改文本样式为斜体,如下。

        3)显示效果

        Label 元素会自动绑定 "Label" 选择器,Button 元素则不会,即使手动将 "Label" 选择器拖拽到 Button 元素上,也不会绑定成功。显示效果如下。

2.3 名称选择器(Name Selector)

        Name 选择器是命名以 "#" 号开头的选择器(如:#Name、#Abc、#Xyz 等),会自动绑定到对应 Name 的元素上,不需要手动绑定,官方介绍见→Name selectors。

        1)修改元素名

        新创建的元素默认元素名为空,修改元素名如下。

        2)创建选择器

        在 StyleSheets 窗口创建名为 "Button1" 的选择器,如下。

        3)修改选择器的属性 

        选中 "Button1" 选择器,在 Inspector 窗口修改背景颜色,如下。 

        4)显示效果

        Button1 元素会自动绑定 "Button1" 选择器,Label1 元素则不会,即使手动将 "Button1" 选择器拖拽到 Label1 元素上,也不会绑定成功。显示效果如下。

2.4 通用选择器(Universal Selector)

        Universal 选择器是以 "*" 号命名的选择器,会自动绑定到所有元素上,不需要手动绑定,官方介绍见→Universal selectors。

        1)创建选择器

        在 StyleSheets 窗口创建名为 "*" 的选择器,如下。

        2)修改选择器的属性 

        选中 "*" 选择器,在 Inspector 窗口修改边框宽度和颜色,如下。 

        3)显示效果

        所有元素都会自动绑定 "*" 选择器,显示效果如下。

3 复杂选择器(Complex Selector) 

        复杂选择器是指由多个简单选择器按照特定规则组合而成的选择器。

3.1 后代选择器(Descendant Selector)

        Descendant 选择器由多个简单选择器通过空格连接而成,它匹配的是某个 UI 元素底下符合规则的所有层级的子元素,官方介绍见→Descendant selectors。

// 在selector1匹配的子元素中匹配selector2, ...
// 选择器的顺序不同匹配的元素也不同
selector1 selector2 {...}

        1)UI 搭建

        UI 层级结构如下,其中 Background、VE1、VE2、VE3 都是 VisualElement,Label1、Label2、Label3 都是 Label。

        创建以下简单选择器。其中,Lable 选择器中修改了字体大小为 30;.red 选择器中修改了背景颜色为红色,并绑定到 VE1,.green 选择器中修改了背景颜色为绿色,并绑定到 VE2;.blue 选择器中修改了背景颜色为蓝色,并绑定到 VE3。

        UI 显示如下。

        2)创建 Descendant 选择器

        在 StyleSheets 窗口创建以下选择器。

  • "#VE1 Label" 选择器:修改字体为斜体;
  • ".green Label" 选择器:修改字体颜色为黑色;
  • "#Background *" 选择器:设置 3px 的黄色边框。

        3)显示效果

        可以看到,"#VE1 Label" 选择器匹配的是 Label1 元素,".green Label" 选择器匹配的是 Label2 元素,"#Background *" 选择器匹配的是 VE1、VE2、VE3、Label1、Label2、Label3 元素。

3.2 子选择器(Child Selector)

        Child 选择器由多个简单选择器通过 " > " 连接而成,它匹配的是某个 UI 元素底下符合规则的第一层级的子元素,官方介绍见→Child selectors。

// 在selector1匹配的子元素中匹配selector2, ...
// 选择器的顺序不同匹配的元素也不同
selector1 > selector2 {...}

        1)UI 搭建

        同 3.1 1)节。

        2)创建 Child 选择器

        在 StyleSheets 窗口创建以下选择器。

  • "#VE1 > Label" 选择器:修改字体为斜体;
  • ".green > Label" 选择器:修改字体颜色为黑色;
  • "#Background > *" 选择器:设置 3px 的黄色边框。

        3)显示效果

        可以看到,"#VE1 > Label" 选择器匹配的是 Label1 元素,".green > Label" 选择器匹配的是 Label2 元素,"#Background > *" 选择器匹配的是 VE1、VE2、VE3 元素。

3.3 多重选择器(Multiple Selector)

        Multiple 选择器由多个简单选择器直接而成,它匹配的是符合所有规则的元素,官方介绍见→Multiple selectors。

// 匹配同时满足selector1、selector2、...的元素
// 选择器的顺序不同匹配的元素相同
selector1selector2 {...}

        说明:Class 选择器可以通过 "." 区分,Name 选择器可以通过 "#" 区分,Type 选择器没有区分符号,因此,一个多重选择器中最多允许有一个 Type 选择器,并且必须放在第一位。 

        1)UI 搭建

        同 3.1 1)节。

        2)创建 Multiple 选择器

        在 StyleSheets 窗口创建以下选择器。

  • "Label#Label1" 选择器:修改字体为斜体;
  • "VisualElement.green" 选择器:设置圆角半径 Radius 为 20 px;
  • "Label*" 选择器:设置 3px 的黄色边框。

        3)显示效果

        可以看到,"Label#Label1" 选择器匹配的是 Label1 元素,"VisualElement.green" 选择器匹配的是 VE2 元素,"Label*" 选择器匹配的是 Label1、Label1、Label3 元素。

4 伪类选择器(Pseudo Class)

        Pseudo 选择器是指由简单选择器和状态符连接而成,它匹配的是特定状态下的元素,官方介绍见→Pseudo-classes。

// 匹配满足selector且进入state状态的元素
selector:state {...}

        状态符主要以下几种。

  • :hover:光标悬浮在元素上。
  • :active:用户与元素交互。
  • :inactive:用户停止与元素交互。
  • :focus:元素获得焦点。
  • :disabled:元素进入 disabled 状态。
  • :enabled:元素进入 enabled 状态。
  • :checked:Toggle 或 RadioButton 被选中。
  • :root:元素成为根元素。

        1)UI 搭建

        同 3.1 1)节。

        2)创建 Pseudo 选择器

        在 StyleSheets 窗口创建以下选择器。

  • "#Label1:hover" 选择器:修改字体为斜体;
  • ".green:hover" 选择器:设置圆角半径 Radius 为 20 px;
  • "*:hover" 选择器:设置 3px 的黄色边框。

        3)显示效果

         可以看到,"#Label1:hover" 选择器匹配的是进入 hover 状态的 Label1 元素,".green:hover" 选择器匹配的是进入 hover 状态的 VE2 元素,"*:hover" 选择器匹配的是进入 hover 状态的 VE1、VE2、VE3、Label1、Label1、Label3 元素。

5 样式切换

        1)样式选择器的添加和删除

// 如果visualElement有StyleName样式, 就将其删除; 如果visualElement没有StyleName样式, 就将其添加
visualElement.ToggleInClassList("StyleName"); // StyleName是样式选择器名, 不需要前面的"."

        说明:只能添加和删除样式类选择器(以 "." 命名开头的选择器),其他选择器都是自动绑定到元素上的。  

        2)uss 样式文件替换

VisualElement root = GetComponent<UIDocument>().rootVisualElement; // 根容器
VisualElementStyleSheetSet styleSheetSet = root.styleSheets; // 样式集合
styleSheetSet.Remove(oldStyleSheet); // 移除旧样式, oldStyleSheet是StyleSheet类型变量, 指向一个uss文件
styleSheetSet.Add(newlightTheme); // 添加新样式, newStyleSheet是StyleSheet类型变量, 指向一个uss文件

6 样式应用

        本节将实现亮主题和暗主题的切换,完整资源见→Unity3D切换样式主题。 

        Page.uxml

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False"><Style src="project://database/Assets/SwitchTheme/StyleSheets/LightTheme.uss?fileID=7433441132597879392&amp;guid=b86be23b06b471b43a7ea453aed7df74&amp;type=3#LightTheme" /><ui:VisualElement name="Background" class="bgColor" style="flex-direction: row; flex-grow: 1; background-image: url(&apos;project://database/Assets/SwitchTheme/Textures/Background_Sky.png?fileID=2800000&amp;guid=49e1c76bfa6ef0546a39fd2bceb69b9a&amp;type=3#Background_Sky&apos;);"><ui:VisualElement name="Left" style="flex-grow: 0; border-right-width: 2px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0); flex-basis: 30%;"><ui:VisualElement name="Top" class="dark top" style="flex-basis: 30%; margin-bottom: 0; border-bottom-width: 2px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0);" /><ui:VisualElement name="Middle" style="flex-basis: auto; flex-grow: 1;"><ui:Label text="Label" display-tooltip-when-elided="true" class="item middleBg middle" style="flex-grow: 1; -unity-text-align: middle-center; font-size: 60px; flex-shrink: 1; margin-top: 5px; margin-bottom: 5px;" /><ui:Label text="Theme" display-tooltip-when-elided="true" name="Theme" class="item middle" style="flex-grow: 1; -unity-text-align: middle-center; font-size: 60px; flex-shrink: 1; margin-top: 5px; margin-bottom: 5px;" /><ui:RadioButtonGroup value="-1" choices="Light,Drak" name="SwitchTheme" class="middle hide" style="flex-grow: 0; font-size: 45px; -unity-text-align: middle-center; align-items: center; justify-content: center; flex-direction: column; margin-left: 0; margin-right: 0; margin-top: 5px; margin-bottom: 5px; flex-shrink: 1;" /><ui:Label text="Label" display-tooltip-when-elided="true" class="item middle" style="flex-grow: 1; -unity-text-align: middle-center; font-size: 60px; flex-shrink: 1; margin-top: 5px; margin-bottom: 5px;" /></ui:VisualElement><ui:VisualElement name="Bottom" style="flex-basis: 25%; border-top-width: 2px; border-left-color: rgb(0, 0, 0); border-right-color: rgb(0, 0, 0); border-top-color: rgb(0, 0, 0); border-bottom-color: rgb(0, 0, 0);"><ui:Label text="Bottom" display-tooltip-when-elided="true" style="flex-shrink: 1; flex-grow: 1; font-size: 100px; -unity-text-align: middle-center;" /></ui:VisualElement></ui:VisualElement><ui:VisualElement name="Right" style="flex-grow: 0; flex-basis: 70%; align-items: center; justify-content: center;"><ui:Label text="Work Space" display-tooltip-when-elided="true" class="right" /></ui:VisualElement></ui:VisualElement>
</ui:UXML>

        LightTheme.uss

Label {color: rgb(48, 47, 47);
}RadioButton:hover {background-color: rgb(217, 217, 217);
}.unity-radio-button__checkmark-background {margin-right: 10px;width: 30px;height: 30px;justify-content: center;align-items: center;border-left-width: 1px;border-right-width: 1px;border-top-width: 1px;border-bottom-width: 1px;border-top-left-radius: 20px;border-bottom-left-radius: 20px;border-top-right-radius: 20px;border-bottom-right-radius: 20px;background-color: rgb(43, 43, 43);border-left-color: rgba(248, 242, 242, 255);border-right-color: rgba(248, 242, 242, 255);border-top-color: rgba(248, 242, 242, 255);border-bottom-color: rgba(248, 242, 242, 255);padding-top: 0;
}.unity-radio-button__checkmark {width: 15px;height: 15px;border-top-left-radius: 10px;border-bottom-left-radius: 10px;border-top-right-radius: 10px;border-bottom-right-radius: 10px;justify-content: center;align-items: center;background-color: rgb(217, 213, 213);
}.bgColor {-unity-background-image-tint-color: rgb(255, 255, 255);
}.top {background-image: url('project://database/Assets/SwitchTheme/Textures/unity_dark.png?fileID=2800000&guid=49ee81a1e2e15df46968d5d1978abc12&type=3#unity_dark');-unity-background-scale-mode: scale-to-fit;
}.middle {background-color: rgba(0, 239, 255, 0.39);
}.right {-unity-text-align: middle-center;-unity-font-style: bold;font-size: 200px;color: rgb(0, 168, 255);justify-content: center;align-items: center;-unity-text-outline-width: 1px;-unity-text-outline-color: rgb(255, 31, 0);text-shadow: 5px 2px 1px rgb(255, 255, 255);
}.hide {display: none;
}.item:hover {background-color: rgb(58, 56, 56);color: rgb(219, 216, 216);
}.middle {background-color: rgba(0, 239, 255, 0.39);
}

        DarkTheme.uss

Label {color: rgb(212, 212, 212);
}RadioButton:hover {background-color: rgb(38, 38, 38);
}.unity-radio-button__checkmark-background {margin-right: 10px;width: 30px;height: 30px;justify-content: center;align-items: center;border-left-width: 1px;border-right-width: 1px;border-top-width: 1px;border-bottom-width: 1px;border-top-left-radius: 20px;border-bottom-left-radius: 20px;border-top-right-radius: 20px;border-bottom-right-radius: 20px;background-color: rgb(255, 255, 255);padding-top: 0;
}.unity-radio-button__checkmark {width: 15px;height: 15px;border-top-left-radius: 10px;border-bottom-left-radius: 10px;border-top-right-radius: 10px;border-bottom-right-radius: 10px;justify-content: center;align-items: center;background-color: rgb(51, 50, 50);
}.bgColor {-unity-background-image-tint-color: rgb(132, 132, 132);
}.top {background-image: url('project://database/Assets/SwitchTheme/Textures/unity_light.png?fileID=2800000&guid=92a215376eed0c9498000506d15b4afe&type=3#unity_light');-unity-background-scale-mode: scale-to-fit;
}.middle {background-color: rgba(46, 44, 44, 0.39);
}.right {-unity-text-align: middle-center;-unity-font-style: bold;font-size: 200px;color: rgb(197, 194, 194);justify-content: center;align-items: center;-unity-text-outline-width: 1px;-unity-text-outline-color: rgb(255, 216, 0);text-shadow: 5px 2px 1px rgb(53, 52, 52);
}.hide {display: none;
}.item:hover {background-color: rgb(214, 211, 211);color: rgb(46, 45, 45);
}

        SwitchTheme.cs

using UnityEngine;
using UnityEngine.UIElements;public class SwitchTheme : MonoBehaviour {private VisualElement root; // 根容器private RadioButtonGroup switchThemeElement; // 切换主题元素private VisualElementStyleSheetSet styleSheetSet; // 主题集合[SerializeField] private StyleSheet lightTheme; // 亮主题, 指向LightTheme.uss文件[SerializeField] private StyleSheet darkTheme; // 暗主题, 指向DarkTheme.uss文件private void Awake() {root = GetComponent<UIDocument>().rootVisualElement;styleSheetSet = root.styleSheets;Label themeLabel = root.Q<Label>("Theme");themeLabel.RegisterCallback<ClickEvent>(OnClick);switchThemeElement = root.Q<RadioButtonGroup>("SwitchTheme");switchThemeElement.RegisterValueChangedCallback(OnValueChanged);}private void OnClick(ClickEvent e) { // 点击回调函数switchThemeElement.ToggleInClassList("hide");}private void OnValueChanged(ChangeEvent<int> e) { // value变化回调函数if (e.newValue == 0) { // 切换为亮主题styleSheetSet.Remove(darkTheme);styleSheetSet.Add(lightTheme);} else { // 切换为暗主题styleSheetSet.Remove(lightTheme);styleSheetSet.Add(darkTheme);}}
}

        运行效果如下。

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

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

相关文章

C++ 结构体

前文 C中的结构体是一种非常有用的数据类型&#xff0c;它允许我们将不同的变量组合在一起&#xff0c;形成一个自定义的数据结构。 结构体在C中的应用非常广泛&#xff0c;它可以用来表示和管理各种实体、对象或数据的属性。比如&#xff0c;在一个学生管理系统中&#xff0c…

阿里云和腾讯云2核2G服务器价格和性能对比

2核2G云服务器可以选择阿里云服务器或腾讯云服务器&#xff0c;腾讯云轻量2核2G3M带宽服务器95元一年&#xff0c;阿里云轻量2核2G3M带宽优惠价108元一年&#xff0c;不只是轻量应用服务器&#xff0c;阿里云还可以选择ECS云服务器u1&#xff0c;腾讯云也可以选择CVM标准型S5云…

实现在一张图片中寻找另一张图片的目标

OpenCV库中的SIFT特征检测算法和FLANN&#xff08;快速最近邻搜索库&#xff09;匹配算法来找到一个图片中的元素在另一个图片中的位置&#xff0c;并在源图片中标出它们的位置。 以下是一个简单的例子&#xff0c;使用OpenCV库&#xff0c;利用SIFT特征检测算法&#xff0c;在…

《向量数据库》——向量数据库Milvus 和大模型出联名款AI原生Milvus Cloud

大模型技术的发展正加速对千行百业的改革和重塑,向量数据库作为大模型的海量记忆体、云计算作为大模型的大算力平台,是大模型走向行业的基石。而电商行业因其高度的数字化程度,成为打磨大模型的绝佳“战场”。 在此背景下,Zilliz 联合亚马逊云科技举办的【向量数据库 X 云计…

云服务器下如何部署Django项目详细操作步骤

前期本人完成了“编写你的第一个 Django 应用程序”&#xff0c;有了一个简单的项目代码&#xff0c;在本地window系统自测没问题了&#xff0c;接下来就想办法部署到服务器上&#xff0c;可以通过公网访问我们的Django项目。将开发机器上运行的开发版软件实际安装到服务器上进…

鼠标知识系列之星闪鼠标

随着 2023.8.4 华为 HDC 大会的落幕&#xff0c;一个新的名词开始进入了人们的视线&#xff1a;星闪 NaerLink&#xff0c;随着星闪技术引入键鼠圈子的还有一个名词&#xff1a;星闪鼠标。 正如我们之前鼠标知识分享系列提到过的&#xff0c;目前市面上的鼠标主要是有线鼠标和…

烟感报警器单片机方案开发,解决方案

烟感报警器也叫做烟雾报警器。烟感报警器适用于火灾发生时有大量烟雾&#xff0c;而正常情况下无烟的场所。例如写字楼、医院、学校、博物馆等场所。烟感报警器一般安装于所需要保护或探测区域的天花板上&#xff0c;因火灾中烟雾比空气轻&#xff0c;更容易向上飘散&#xff0…

在FPGA上快速搭建以太网

在本文中&#xff0c;我们将介绍如何在FPGA上快速搭建以太网 &#xff08;LWIP &#xff09;。为此&#xff0c;我们将使用 MicroBlaze 作为主 CPU 运行其应用程序。 LWIP 是使用裸机设计以太网的良好起点&#xff0c;在此基础上我们可以轻松调整软件应用程序以提供更详细的应用…

【MySQL基础】一条查询和更新语句的执行流程01-02

目录 MySQL的基本架构示意图连接器查询缓存分析器优化器执行器重要的日志模块&#xff1a;redo log重要的日志模块&#xff1a;binlog更新时redo log 和 binlog 两阶段提交 例如在执行下面这个查询语句&#xff1a; mysql> select * from T where ID10&#xff1b;MySQL的基…

Apache Hive之数据查询

文章目录 版权声明数据查询环境准备基本查询准备数据select基础查询分组、聚合JOINRLIKE正则匹配UNION联合Sampling采用Virtual Columns虚拟列 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利…

GPT引领前沿热点、AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。 2、数据可…

vue2中实现 TDesign 树形懒加载

之前我有写过Element ui的树形懒加载 其主要是通过load函数来实现 而TDesign也是照虎画猫 他也是主要靠load 我们先来看一个基本的组件 <template><t-tree :data"items" :load"load" /> </template><script lang"jsx">…

【每天一道算法题】day2-认识时间复杂度

认识时间复杂度&#xff1a; O&#xff1a;读作big O&#xff0c;在数学上指的是上限的意思 常数时间的操作 一个操作如果和样本的数据量没有关系&#xff0c;每次都是固定时间内完成的操作&#xff0c;叫做常数操作。时间复杂度为一个算法流程中&#xff0c;常数操作数量的一…

交友盲盒完整版——详细源码分享

现在目前比较火热的一款app交友盲盒是通过uniappspringboot技术来制作的&#xff0c;原理其实很简单&#xff0c;大家一看便知。 大家自行下载到手机里面去使用即可&#xff0c;不支持ios手机 演示地址&#xff1a;https://share.weiyun.com/l3ovztce 下面就是给大家分享源码了…

【C++】可变参数模板

2023年9月9日&#xff0c;周六下午 这个还是挺难学的&#xff0c;我学了好几天... 在这里我会举大量的示例程序&#xff0c;这样可以有一个更好的理解&#xff0c; 不定期更新。 目录 推荐文章&#xff1a; 示例程序一&#xff1a;拼接字符串 示例程序二&#xff1a;求整…

局域网ntp服务器设置(windows时间同步服务器NetTime)(ubuntu systemd-timesyncd ntp客户端)123端口、ntp校时

文章目录 背景windows如何配置ntp服务器手动配置配置参数AnnounceFlags和Enabled含义 使用软件配置&#xff08;NetTime&#xff09;实操相关疑问&#xff1a;0.nettime.pool.ntp.org是什么&#xff1f; 注意事项请务必检查windows主机123端口是否已被占用&#xff0c;方法请参…

华为云云耀云服务器L实例评测|在Docker环境下部署Ward服务器监控工具

华为云云耀云服务器L实例评测&#xff5c;在Docker环境下部署Ward服务器监控工具 一、前言1.1 云耀云服务器L实例简介1.2 Ward简介1.3 Ward特点 二、本次实践介绍2.1 本次实践简介2.2 本次环境规划 三、购买云耀云服务器L实例3.1 购买云耀云服务器L实例3.3 查看云耀云服务器L实…

Java高级——类加载及执行子系统的案例与实战

类加载及执行子系统的案例与实战 概述类加载器案例TomcatOSGi 字节码案例动态代理Java逆向移植工具 实战——远程执行功能目标思路实现验证&#xff08;未完成&#xff0c;不会写JSP&#xff09; 概述 Class文件以何种格式存储、字节码指令如何执行等都是由JVM控制 字节码生成…

php使用jwt作登录验证

1 在项目根目录下&#xff0c;安装jwt composer require firebase/php-jwt 2 在登录控制器中加入生成token的代码 use Firebase\JWT\JWT; use Firebase\JWT\Key; class Login extends Cross {/*** 显示资源列表** return \think\Response*/public function index(Request $r…

Lua语法结构

Lua基础 注释 print("hello.") -- 单行注释的写法 --[[ 多行注释的写法 --]]标识符 关键字 **and **break**do **else**elseif ****end **falsefor**function **ifinlocalnilnotorrepeatreturnthentrueuntil**while ** 数据类型 nil** boolean**** number**** st…