南宁市网站维护与推广公司/app拉新推广一手接单平台
标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。
打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作,然后通过分布式流转实现随机传递炸弹给下一位用户的效果。那么这样一款传炸弹应用如何进行开发呢?
完整的项目结构目录如下:
├─entry
│ └─src
│ └─main
│ │ config.json // 应用配置
│ │
│ ├─ets
│ │ └─MainAbility
│ │ │ app.ets //ets应用程序主入口
│ │ │
│ │ └─pages
│ │ CommonLog.ets // 日志类
│ │ game.ets // 游戏首页
│ │ RemoteDeviceManager.ets // 设备管理类
│ │
│ └─resources // 静态资源目录
│ ├─base
│ │ ├─element
│ │ │
│ │ ├─graphic
│ │ ├─layout
│ │ ├─media // 存放媒体资源
│ │ │
│ │ └─profile
│ └─rawfile
我们可以分为如下 3 步:编写声明式 UI 界面、添加分布式能力和编写游戏逻辑。
一、编写声明式UI界面
1. 新增工程
在 DevEco Studio 中点击 File -> New Project ->Standard Empty Ability->Next,Language 选择 ETS 语言,最后点击 Finish 即创建成功。
图1 新建工程
2. 编写游戏页面
图2 游戏界面效果图
效果图如上可以分为两部分:
- 顶部状态提示栏
首先在 @entry 组件入口 build() 中使用 Stack 作为容器,达到图片和文字堆叠的效果;
接着依次写入 Image 包裹的两个 Text 组件;
Stack() {Image($r(<span class="hljs-string">"app.media.title"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>)Column() {Text(<span class="hljs-keyword">this</span>.duration.toString() + <span class="hljs-string">'ms'</span>).fontColor(Color.White)Text(<span class="hljs-keyword">this</span>.touchText).fontColor(Color.White)}}
- 中间游戏炸弹九宫格区域
使用 Grid 网格容器来编写九宫格区域;
在 GridItem 中 Stack (容器依次添加方块背景图片和炸弹图片;
在 visibility 属性中用 bombIndex 变量值来决定炸弹显示的位置;
通过 onClick 点击事件和 GestureGroup 组合手势加入单击、双击和长按的监听事件;
Stack() {Image($r(<span class="hljs-string">"app.media.title"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>)Column() {Text(<span class="hljs-keyword">this</span>.duration.toString() + <span class="hljs-string">'ms'</span>).fontColor(Color.White)Text(<span class="hljs-keyword">this</span>.touchText).fontColor(Color.White)}}
3. 添加弹窗
- 创建规则游戏弹窗
1)通过 @CustomDialog 装饰器来创建自定义弹窗,使用方式可参考:
自定义弹窗文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-methods-custom-dialog-box.md
2)规则弹窗效果如下,弹窗组成由两个 Text 和两个 Image 竖向排列组成,所以我们可以在 build()下使用 Column 容器来包裹,组件代码如下;
图3 游戏规则
@CustomDialogstruct RuleDialog {controller: CustomDialogControllerconfirm: () => <span class="hljs-keyword">void</span>invite: () => <span class="hljs-keyword">void</span>@Consume deviceList: RemoteDevice[]build() {Column() {Text(<span class="hljs-string">'游戏规则'</span>).fontSize(<span class="hljs-number">30</span>).margin(<span class="hljs-number">20</span>)Text(<span class="hljs-string">'炸弹会随机出现在9个方块内,需要在规定时间内完成指定操作(点击、双击或长按),即可将炸弹传递给下一个人,小心炸弹可是会越来越快的喔!'</span>).fontSize(<span class="hljs-number">24</span>).margin({ bottom: <span class="hljs-number">10</span> })Image($r(<span class="hljs-string">"app.media.btn_start"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>).margin(<span class="hljs-number">10</span>).onClick(() => {console.info(TAG + <span class="hljs-string">'Click start game'</span>)<span class="hljs-keyword">if</span> (checkTrustedDevice(<span class="hljs-keyword">this</span>.remoteDeviceModel)) {<span class="hljs-keyword">this</span>.controller.close()<span class="hljs-keyword">this</span>.confirm()}})Image($r(<span class="hljs-string">"app.media.btn_Invite"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>).margin(<span class="hljs-number">10</span>).onClick(() => {<span class="hljs-keyword">this</span>.invite()})}.width(<span class="hljs-string">'90%'</span>).margin(<span class="hljs-number">20</span>).backgroundColor(Color.White)}}
3)在 @entry 创建 CustomDialogController 对象并传入弹窗所需参数,后面可通过该对象 open() 和 close() 方法进行打开和关闭弹窗;
@Provide deviceList: RemoteDevice[] = []
private ruleDialog: CustomDialogController = <span class="hljs-keyword">new</span> CustomDialogController({builder: RuleDialog({invite: () => <span class="hljs-keyword">this</span>.InvitePlayer(),confirm: () => <span class="hljs-keyword">this</span>.startGame(),deviceList: <span class="hljs-keyword">this</span>.deviceList}),autoCancel: <span class="hljs-literal">false</span>
})
- 创建游戏失败弹窗,并添加动画效果
图4 游戏失败弹窗动画
1)编写弹窗布局:将游戏失败文本、炸弹图片和再来一局按钮图片放置于 Column 容器中;
2)用变量来控制动画起始和结束的位置:用 Flex 容器包裹炸弹图片,并用 @State 装饰变量 toggle,通过变量来动态修改 [Flex]的direction 属性;
@State toggle: boolean = <span class="hljs-literal">true</span>
private controller: CustomDialogController
@Consume deviceList: RemoteDevice[]
private confirm: () => <span class="hljs-keyword">void</span>
private interval = <span class="hljs-literal">null</span>build() {Column() {Text(<span class="hljs-string">'游戏失败'</span>).fontSize(<span class="hljs-number">30</span>).margin(<span class="hljs-number">20</span>)Flex({direction: <span class="hljs-keyword">this</span>.toggle ? FlexDirection.Column : FlexDirection.ColumnReverse,alignItems: ItemAlign.Center}){Image($r(<span class="hljs-string">"app.media.bomb"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">80</span>)}.height(<span class="hljs-number">200</span>)Image($r(<span class="hljs-string">"app.media.btn_restart"</span>)).objectFit(ImageFit.Contain).height(<span class="hljs-number">120</span>).margin(<span class="hljs-number">10</span>).onClick(() => {<span class="hljs-keyword">this</span>.controller.close()<span class="hljs-keyword">this</span>.confirm()})}.width(<span class="hljs-string">'80%'</span>).margin(<span class="hljs-number">50</span>).backgroundColor(Color.White)
}
3)设置动画效果:使用 animateTo 显式动画接口炸弹位置切换时添加动画,并且设置定时器定时执行动画;
aboutToAppear() {<span class="hljs-keyword">this</span>.setBombAnimate()
}setBombAnimate() {<span class="hljs-keyword">let</span> fun = () => {<span class="hljs-keyword">this</span>.toggle = !<span class="hljs-keyword">this</span>.toggle;}<span class="hljs-keyword">this</span>.interval = setInterval(() => {animateTo({ duration: <span class="hljs-number">1500</span>, curve: Curve.Sharp }, fun)}, <span class="hljs-number">1600</span>)
}
二、添加分布式流转
分布式流转需要在同一网络下通过 DeviceManager 组件进行设备间发现和认证,获取到可信设备的 deviceId 调用 FeatureAbility.startAbility(parameter),即可把应用程序流转到另一设备。
原本分布式流转应用流程如下:
- 创建 DeviceManager 实例;
- 调用实例的 startDeviceDiscovery(),开始设备发现未信任设备;
- 设置设备状态监听 on(‘deviceStateChange’,callback),监听设备上下线状态;
- 设置设备状态监听 on(‘deviceFound’,callback),监听设备发现;
- 传入未信任设备参数,调用实例 authenticateDevice 方法,对设备进行 PIN 码认证;
- 若是已信任设备,可通过实例的 getTrustedDeviceListSync() 方法来获取设备信息;
- 将设备信息中的 deviceId 传入featureAbility.startAbility 方法,实现流转;
- 流转接收方可通过featureAbility.getWant() 获取到发送方携带的数据;
- 注销设备发现监听 off(‘deviceFound’);
- 注销设备状态监听 off(‘deviceStateChange’);
项目中将上面设备管理封装至 RemoteDeviceManager,通过 RemoteDeviceManager 的四个方法来动态维护 deviceList 设备信息列表。
图5 分布式流转
项目实现分布式流转只需如下流程:
1. 创建RemoteDeviceManager实例
1)导入 RemoteDeviceManager
import {RemoteDeviceManager} from <span class="hljs-string">'./RemoteDeviceManager'</span>
2)声明 @Provide 装饰的设备列表变量 deviceList,和创建 RemoteDeviceManager 实例。
@Provide deviceList: RemoteDevice[] = []
private remoteDm: RemoteDeviceManager = <span class="hljs-keyword">new</span> RemoteDeviceManager(<span class="hljs-keyword">this</span>.deviceList)
2. 刷新设备列表
在生命周期 aboutToAppear 中,调用刷新设备列表和开始发现设备。
aboutToAppear 定义:函数在创建自定义组件的新实例后,在执行其 build 函数之前执行。
aboutToAppear() {<span class="hljs-keyword">this</span>.remoteDm.refreshRemoteDeviceList() <span class="hljs-comment">// 刷新设备列表</span><span class="hljs-keyword">this</span>.remoteDm.startDeviceDiscovery() <span class="hljs-comment">// 开始发现设备</span>
}
3. 设备认证
invitePlayer(remoteDevice:RemoteDevice) {<span class="hljs-keyword">if</span> (remoteDevice.status == RemoteDeviceStatus.ONLINE) {prompt.showToast({ message: <span class="hljs-string">"Already invited!"</span> })<span class="hljs-keyword">return</span>}<span class="hljs-keyword">this</span>.remoteDm.authDevice(remoteDevice).then(() => {prompt.showToast({ message: <span class="hljs-string">"Invite success! deviceName="</span> + remoteDevice.deviceName })}).catch(() => {prompt.showToast({ message: <span class="hljs-string">"Invite fail!"</span> })})
}
4. 跨设备流转
从 deviceList 中获取设备列表在线的设备 Id,通过 featureAbility.startAbility 进行流转。
async startAbilityRandom() {<span class="hljs-keyword">let</span> deviceId = <span class="hljs-keyword">this</span>.getRandomDeviceId() <span class="hljs-comment">// 随机获取设备id</span>CommonLog.info(<span class="hljs-string">'featureAbility.startAbility deviceId='</span> + deviceId);<span class="hljs-keyword">let</span> bundleName = await getBundleName()<span class="hljs-keyword">let</span> wantValue = {bundleName: bundleName,abilityName: <span class="hljs-string">'com.sample.bombgame.MainAbility'</span>,deviceId: deviceId,parameters: {ongoing: <span class="hljs-literal">true</span>,transferNumber: <span class="hljs-keyword">this</span>.transferNumber + <span class="hljs-number">1</span>}};featureAbility.startAbility({want: wantValue}).then((data) => {CommonLog.info(<span class="hljs-string">' featureAbility.startAbility finished, '</span> + <span class="hljs-built_in">JSON</span>.stringify(data));featureAbility.terminateSelf((error) => {CommonLog.info(<span class="hljs-string">'terminateSelf finished, error='</span> + error);});});
}
5. 注销监听
在声明周期 aboutToDisappear 进行注销监听。
aboutToDisappear 定义:函数在自定义组件析构消耗之前执行。
aboutToDisappear() {<span class="hljs-keyword">this</span>.remoteDm.stopDeviceDiscovery() <span class="hljs-comment">// 注销监听</span>
}
三、编写游戏逻辑
1. 开始游戏
startGame() {CommonLog.info(<span class="hljs-string">'startGame'</span>);<span class="hljs-keyword">this</span>.randomTouchRule() <span class="hljs-comment">// 随机游戏点击规则</span><span class="hljs-keyword">this</span>.setRandomBomb() <span class="hljs-comment">// 随机生成炸弹位置</span><span class="hljs-keyword">this</span>.stopCountDown() <span class="hljs-comment">// 停止倒计时</span><span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.transferNumber < <span class="hljs-number">10</span>) {<span class="hljs-keyword">this</span>.duration = <span class="hljs-number">3000</span> - <span class="hljs-keyword">this</span>.transferNumber * <span class="hljs-number">100</span>} <span class="hljs-keyword">else</span> {<span class="hljs-keyword">this</span>.duration = <span class="hljs-number">2000</span>}<span class="hljs-keyword">const</span> interval: number = <span class="hljs-number">500</span><span class="hljs-comment">// 开始倒计时</span><span class="hljs-keyword">this</span>.timer = setInterval(() => {<span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.duration <= interval) {<span class="hljs-keyword">this</span>.duration = <span class="hljs-number">0</span>clearInterval(<span class="hljs-keyword">this</span>.timer)<span class="hljs-keyword">this</span>.timer = <span class="hljs-literal">null</span><span class="hljs-keyword">this</span>.gameFail()} <span class="hljs-keyword">else</span> {<span class="hljs-keyword">this</span>.duration -= interval}}, interval)
}
2. 判断输赢
编写判断逻辑,用于不同的点击事件中调用。
/*** 判断游戏输赢* @param operation 点击类型*/
judgeGame(operation:RuleType) {this.stopCountDown()if (operation != this.ruleText) {this.gameFail()} else {prompt.showToast({ message: "finish" })this.bombIndex = -1this.startAbilityRandom()}
}
3. 游戏失败
游戏失败,弹出游戏失败弹框。
gameFail() {prompt.showToast({message: <span class="hljs-string">'Game Fail'</span>})CommonLog.info(<span class="hljs-string">'gameFail'</span>);<span class="hljs-keyword">this</span>.gameFailDialog.open()
}
四、项目下载和导入
项目仓库地址:
https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/FA/Entertainment/BombGame
1)git下载
git clone https:<span class="hljs-comment">//gitee.com/openharmony-sig/knowledge_demo_temp.git</span>
2)项目导入
打开 DevEco Studio,点击 File->Open->下载路径/FA/Entertainment/BombGame
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- ……
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向
相关文章:

简单3步,OpenHarmony上跑起ArkUI分布式小游戏
标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作&am…...

GPT-3和自然语言处理的前沿:思考AI大模型的发展
引言 自然语言处理(NLP)是人工智能(AI)领域中最富有挑战性和活跃的研究领域之一。近年来,随着深度学习技术的发展和计算能力的提高,大型语言模型,尤其是OpenAI的GPT-3,已成为推动该…...

傅里叶变换例题
目录 傅里叶转化例题: 时移 频移 尺度 时域卷积性质:卷积==乘机...

基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试
添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下: 实现了一个RESTful API,提供了以下两个接口 : POST请求 /users:用于创建新的用户。GET请求 /users:用于获取所有用户的列…...

Java 中建造者模式,请用代码具体举例
建造者模式是一种创建型设计模式,它允许你创建一个复杂对象的不同部分并将它们组装在一起,以产生最终的对象。以下是一个简单的 Java 示例,演示了建造者模式的用法: // 产品类 class Computer {private String cpu;private String…...

Tomcat 启动闪退问题解决方法
总体思路 解决Tomcat闪退问题,您可以尝试以下几种方法: 检查安装过程:确保您的Tomcat安装过程没有遗漏任何步骤。如果是zip包形式的Tomcat,解压后通常不需要额外配置环境变量。编辑启动脚本:打开Tomcat安装目录下的bi…...

使用docker部署数据可视化平台Metabase
目前公司没有人力开发数据可视化看板,因此考虑自己搭建开源可视化平台MetaBase。在此记录下部署过程~ 一、镜像下载 docker pull metabase/metabase:latest 运行结果如下: 二、创建容器 docker run -dit --name matebase -p 3000:3000\ -v /home/loc…...

数图智慧零售解决方案,赋能零售行业空间资源价值最大化
数图智慧零售解决方案 赋能零售行业空间资源价值最大 在激烈的市场竞争中,如何更好地提升空间资源价值,提高销售额,成为行业关注的焦点。近日,NIQ发布的《2024年中国饮料行业趋势与展望》称,“在传统零售业态店内&…...

Django中的实时通信:WebSockets与异步视图的结合【第167篇—实时通信】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中,实时通信已经成为了必不可少的功能之一。无论是在线聊天、…...

R 格式(蓝桥杯)
文章目录 R 格式【问题描述】解题思路高精度乘法高精度加法 R 格式 【问题描述】 小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法…...

Intellij idea的快速配置详细使用
IntelliJ IDEA是一款强大的集成开发环境(IDE),支持多种编程语言,包括Java、Kotlin、Scala等。以下是关于IntelliJ IDEA的快速配置和使用的详细步骤: 一、安装 前往IntelliJ IDEA的官方网站或可靠的软件下载平台&…...

JavaEE:JVM
基本介绍 JVM:Java虚拟机,用于解释执行Java字节码 jdk:Java开发工具包 jre:Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言,而java不想重新编译,希望能直接执行。Java先通过javac把.java…...

Linux基础|线程池Part.1|线程池的定义和运行逻辑
线程池的定义和运行逻辑 多线程的问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…...

蓝队面试经验总结
Sql注入 1、sql注入漏洞原理 开发者没有在网页传参点做好过滤,导致恶意 sql 语句拼接到数据库进行执行 2、sql注入分类 联合注入 、布尔盲注 、时间盲注 、堆叠注入 、宽字节注入 、报错注入 3、堆叠注入原理 在 mysql 中,分号 代表一个查询语句的…...

MySQL命令分类与大纲
一、数据库管理 创建与删除数据库 CREATE DATABASE:创建新数据库DROP DATABASE:删除已存在的数据库ALTER DATABASE:修改数据库属性 切换与查看数据库 USE:选择当前工作数据库SHOW DATABASES:列出所有可用数据库 二、…...

windows编译xlnt,获取Excel表里的数据
用git拉取项目 这个文件是空的 要用git拉下来,使用终端编译xlnt库 点击解决方案 运行生成 然后新建项目,配置好库, #include <iostream> #include <xlnt/xlnt.hpp>int main() {// 打开 Excel 文件xlnt::workbook workbook;workb…...

c#字段和属性的区别
在C#中,字段(fields)和属性(properties)都是类的成员,它们提供了类存储数据的方式,但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类或结构的状态信息。字段是类的数据成员&…...

微软正式发布Copilot for Security
微软公司近日宣布,其备受期待的安全自动化解决方案——Copilot for Security现已全面上市,面向全球用户开放。这一创新工具的推出标志着微软在提升企业安全防护能力方面迈出了重要一步,同时也为安全专业人士提供了强大的支持。 Copilot for …...

AI大模型日报#0416:李飞飞《2024年人工智能指数报告》、Sora加入Adobe、李彦宏聊百度大模型之路
导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 刚刚,李飞飞团队发布《2024年人工智能指数报告》:10大趋势,揭示AI大模型的“喜”与“忧” 摘…...

OpenCV轻松入门(八)——图片卷积
对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积。 卷积需要4个嵌套循环,所以它并不快,除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波 图像滤波是尽…...

鸿蒙HarmonyOS开发规范-完善中
代码规范 所有文件,包括自动生成的编译文件package.json都要格式化(IDE快捷键CtrlAltL);函数命名,C大驼峰,TS、JS小驼峰,函数命名注意动宾结构;静态常量需使用全大写,文…...

神经网络压缩图像
简介 典型的压缩管道由四个组件组成: 编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z。 量化:截断 z z z以丢弃一些不重要的信息 熵编码:使用某种形式的熵编码(例如&…...

Catagory(rt)
继承(IMP融合):支持super命令码;继承推荐重写 分类(IMP替换):不支持super命令码;分类推荐组合 //替换(原来没了/破坏掉原来IMP/分类(替换特性)) 情况1: 自封装(组件化)开源库>分类推荐组合 情况2:逆向分析> 有意替换>分类IMP替换 #import "CatagoryViewContro…...

Games104 现代游戏引擎3
Sprite Animation 序列帧动画 自由度(degrees of freedom,DoF)对于刚体而言描述它的运动需要3个位移3个旋转,一共6个自由度 顶点动画(per-vertex animation)利用网格的顶点来控制运动。此时网格上的每个顶…...

【云计算】混合云分类
《混合云》系列,共包含以下 3 篇文章: 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀Ὠ…...

探索分布式系统监控zabbix------------自动发现与自动注册
目录 一、部署 zabbix 服务端 二、部署 zabbix 客户端 2.1环境准备 2.2服务端和客户端都配置时间同步 (ntp) 2.2.1服务端zbx-server 2.2.2服务端zabbix-agent01客户端 2.3客户端配置时区,与服务器保持一致 2.4设置 zabbix 的下载源&…...

权限管理Ranger详解
文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…...

WPF Extended.Wpf.Toolkit 加载界面
1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…...

【切换网络连接后】VMware虚拟机网络配置【局域网通信】
初次安装Linux虚拟机以及切换网络都需要配置虚拟机网络, 从而使得win主机内通过远程连接工具能够连接该虚拟机, 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作,以及局域网通信的一些基础知识。 …...

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长
国内鞋服零售企业经过多年的发展,已经形成诸多家喻户晓的品牌,但近年来一些企业的库存问题也时常显现,高库存不仅困扰着品牌商,也使一些多年合作良好的经销商深受其害,当下的订货会制度在初期帮助企业解决了盲目生产的…...