Open Harmony开发之分布式账本

简介

Demo基于Open Harmony系统使用ETS语言进行编写,本Demo主要通过设备认证、分布式拉起、分布式数据管理等功能来实现。

应用效果

  1. 设备认证,获取同一个局域网内的设备ID,并拉起应用

  1. 添加数据并在另一台设备显示该数据

开发步骤

1.新建Openharmony ETS工程

在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择ETS语言,最后点击Finish即创建成功。

2.界面代码编写
首页界面

 build() {Flex({ direction: FlexDirection.Column}) {//发现设备Button('发现设备', { type: ButtonType.Normal, stateEffect: true }).borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() =>{this.fun()})//设备认证Button('authDevice', { type: ButtonType.Normal, stateEffect: true }).borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() =>{this.authDevice()})// 拉起应用Button('拉起应用', { type: ButtonType.Normal, stateEffect: true }).borderRadius(8).backgroundColor(0x317aff).width(90).onClick(() =>{this.startAb()})Stack({alignContent:Alignment.TopEnd}){Text('家庭账本').fontSize(20).fontWeight(FontWeight.Bold).width('100%').margin({left:12}).onClick(() =>{//          routePage()this.fun()})Image("/picture/add.png").width(40).height(40).align(Alignment.Start).margin({right:12}).onClick(() =>{routePage()})}.width(350).height(60).margin({top:10,bottom:10})Flex({direction: FlexDirection.Column, alignItems:ItemAlign.Start,}){Text("2022年12月").fontSize(20).fontColor(Color.White)Text("结余").fontSize(20).fontColor(Color.White).margin({top:30}).align(Alignment.Start)Text("总支出0|总收入0").fontSize(16).fontColor(Color.White).margin({top:10}).align(Alignment.Start)}.backgroundColor("#665A5A").height(230).layoutWeight(1).padding(10).onClick(() =>{routePage()})Tabs() {TabContent() {ProjectList()}.tabBar("项目")TabContent() {Statistics()}.tabBar("统计")}}.width('100%').height('100%').padding({left:12,right:12})}

底部TabContent 项目模块

@Component
struct ProjectList {remoteDataManager = new RemoteDataManager()@State ProjectData: Array<any> = []TestData:any[] =  []TestKvData: Array<any> = []kvManager = nullkvStore = nullSTORE_ID = 'store_accountbook'aboutToAppear(){try {const config = {userInfo: {userId: '0',userType: 0},bundleName: 'com.example.accountbookets'}factory.createKVManager(config).then((manager) => {this.kvManager = managerlet options ={createIfMissing: true,encrypt: false,backup: false,autoSync: true,kvStoreType: 1,securityLevel: 3}this.kvManager.getKVStore(this.STORE_ID, options).then((store) => {this.kvStore = storethis.kvStore.get("key2").then((data) => {this.ProjectData = JSON.parse(data)})}).catch((err) => {})}).catch((err) => {})} catch (e) {}}@Builder ProjectItem(image, name, des,time,money) {Flex({ direction: FlexDirection.Row,alignItems: ItemAlign.Center }){Image($r("app.media.icon1")).width(30).height(30)Column() {Text(name).fontSize(16).fontColor(Color.Black)Text('11:20').fontSize(16).fontColor(Color.Gray)}.alignItems(HorizontalAlign.Start).margin({left:15})Text('HUAWEI').fontSize(12).fontColor(Color.Black).margin({left:20})Text(des).fontSize(14).fontColor(Color.Gray).margin({left:15})Column() {Text('-100').fontSize(16).fontColor(Color.Black)Text(time).fontSize(16).fontColor(Color.Gray)}.alignItems(HorizontalAlign.Start).margin({left:20})}.width(400).height(50).margin({top:10})}build() {List() {ForEach(this.ProjectData, (item) => {ListItem() {this.ProjectItem(item.image, item.name, item.des,item.time,item.money)}.onClick(() => {})}, (item) => JSON.stringify(item)) {}}}
}

底部TabContent 统计模块

@Component
struct Statistics{build(){Flex({ direction: FlexDirection.Row}){Tabs() {TabContent() {PayList()}.tabBar("支出分类")TabContent() {}.tabBar("成员分类")}}}
}

统计模块里面的TabContent

@Component
struct PayList {private PayData: PayBean[] = initializeOnStartup()@Builder PayItem(previewUrl, title, describe) {Flex({ direction: FlexDirection.Row,alignItems: ItemAlign.Center }){Image(previewUrl).width(30).height(30)Text(title).fontSize(16).fontColor(Color.Black).margin({left:8})Text('100%').fontSize(12).fontColor(Color.Black).margin({left:8})Progress({ value: 20, total: 150, style: ProgressStyle.Linear }).color(Color.Red).value(150).width(200)Text('-100').fontSize(14).fontColor(Color.Gray).margin({left:8})}.width(400).height(50).margin({top:10})}build() {List() {ForEach(this.PayData, (item) => {ListItem() {this.PayItem(item.image, item.name, item.des)}.onClick(() => {console.info("点击我")router.push({uri: "pages/VideoPlayer",})})}, (item) => JSON.stringify(item)) {}}}
}
2) add.ets页面

build() {Flex({ direction: FlexDirection.Column,alignItems: ItemAlign.Center}) {Flex({ direction: FlexDirection.Row,alignItems: ItemAlign.Center}){Image("/picture/icon_back.png").width(35).height(35).onClick(() =>{router.push({uri: "pages/index",})})Text("加一笔").fontSize(20).fontWeight(FontWeight.Bold).margin({left:20})}.margin({top:10}).padding({left:20}).height(100).width(500)Stack({alignContent: Alignment.TopStart}){Tabs() {TabContent() {pay({payTime:$strTime,payRemark:$strRemark,payType:$strType})}.tabBar("支出")TabContent() {Income()}.tabBar("收入")}.height(450)}.width(500).height(500)Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center}){Text("输入金额").fontColor(Color.Black).fontSize(20).margin({right:15}).width(100)TextInput({ placeholder: '100', text:this.strMoney }).type(InputType.Normal).placeholderColor(Color.Gray).placeholderFont({ size: 20, weight: 2}).enterKeyType(EnterKeyType.Search).caretColor(Color.Green).width(250).height(40).borderRadius('20px')}.width(400).height(50)Text('保存').fontColor(Color.White).fontSize(20).margin({top:20}).textAlign(TextAlign.Center).width(380).height(80).backgroundColor("#FE4F16").onClick(() =>{TestData.push({image:"/picture/icon1.png",title:'canyin',des:'ceshi',time:'2021',money:'50'})if (AppStorage.Get("key1") == null) {AppStorage.SetAndLink("key1", TestData)this.remoteDataManager.dataChange("key2", JSON.stringify(TestData))}else{this.TestStorageData = AppStorage.Get("key1")//
//            this.TestStorageData.push({image:"/picture/icon1.png",title:'canyin',des:'beizhu',time:'2021',money:'50'})//具体代码this.TestStorageData.push({image:"/picture/icon1.png",title:this.strType,des:this.strRemark,time:this.strTime,money:this.strMoney})AppStorage.SetAndLink("key1", this.TestStorageData)let str = JSON.stringify(this.TestStorageData)this.TestKvData = JSON.parse(str)this.remoteDataManager.dataChange("key2", JSON.stringify(this.TestKvData))}router.push({uri: "pages/index",})})}.width('100%').height('100%')}

add页面支出模块

@Component
struct pay{@Link payTime:string@Link payRemark:string@Link payType:string@State private index:number = 0@State strType:string = "canyin"@State AccountData: Array<any> = [{ previewUrl: "/picture/icon1.png", title: "canyin" ,number:0},{ previewUrl: "/picture/icon2_2.png", title: "gouwu" ,number:1},{ previewUrl: "/picture/icon3_3.png", title: "jiaotong" ,number:2},{ previewUrl: "/picture/icon4_4.png", title: "fuwu" ,number:3},{ previewUrl: "/picture/icon5_5.png", title: "jiaoyu" ,number:4},{ previewUrl: "/picture/icon6_6.png", title: "yundong" ,number:5},{ previewUrl: "/picture/icon7_7.png", title: "luxing" ,number:6},{ previewUrl: "/picture/icon8_8.png", title: "yiliao" ,number:7},
//    { previewUrl: "/picture/icon9_9.png", title: "生活" ,number:9},
//    { previewUrl: "/picture/icon10_10.png", title: "宠物" ,number:10},]@Builder ProItem(previewUrl, title,number) {Stack() {Flex({direction: FlexDirection.Column}) {if (this.index == number) {if (number == 0) {Image("/picture/icon1.png").width(60).height(60)}else if (number == 1) {Image("/picture/icon2.png").width(60).height(60)}else if (number == 2) {Image("/picture/icon3.png").width(60).height(60)}else if (number == 3) {Image("/picture/icon4.png").width(60).height(60)}else if (number == 4) {Image("/picture/icon5.png").width(60).height(60)}else if (number == 5) {Image("/picture/icon6.png").width(60).height(60)}else if (number == 6) {Image("/picture/icon7.png").width(60).height(60)}else if (number == 7) {Image("/picture/icon8.png").width(60).height(60)}else if (number == 8) {Image("/picture/icon9.png").width(60).height(60)}else if (number == 9) {Image("/picture/icon10.png").width(60).height(60)}}else{if (number == 0) {Image("/picture/icon1_1.png").width(60).height(60)}else{Image(previewUrl).width(60).height(60)}}Column() {Text(title).fontSize(16).fontColor(Color.Black)}.alignItems(HorizontalAlign.Center)}}.height(100).width(100).margin({bottom: 16})}build(){Flex({direction: FlexDirection.Column}){Grid(){ForEach(this.AccountData, (item) => {GridItem() {this.ProItem(item.previewUrl, item.title,item.number)}.onClick(() => {console.info("点击我")this.index = item.numberthis.payType = this.AccountData[this.index].title})}, (item) => JSON.stringify(item)) {}}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr 1fr 1fr').columnsGap(8).rowsGap(8).height(200)
//      Time()
//      Remark()// ******************时间**********************Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center}){Text("时间").fontColor(Color.Black).fontSize(20).margin({right:15}).width(70)TextInput({ placeholder: '输入收支时间', text: this.payTime }).type(InputType.Normal).placeholderColor(Color.Gray).placeholderFont({ size: 20, weight: 2}).enterKeyType(EnterKeyType.Search).caretColor(Color.Green).width(300).height(40).borderRadius('20px').backgroundColor(Color.White).onChange((value: string) => {this.payTime = value})}.margin({top:20,left:15}).width(200)//*******************备注********************Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center}){Text("备注").fontColor(Color.Black).fontSize(20).margin({right:15}).width(70)TextInput({ placeholder: '输入说明', text: this.payRemark }).type(InputType.Normal).placeholderColor(Color.Gray).placeholderFont({ size: 20, weight: 2}).enterKeyType(EnterKeyType.Search).caretColor(Color.Green)//        .layoutWeight(8).height(40).width(300).borderRadius('20px').backgroundColor(Color.White).onChange((value: string) => {this.payRemark = value})}.margin({top:20,left:15}).width(50).height(50)}.height('100%').layoutWeight(1)}
}

收入模块代码

@Component
struct Income{build(){Flex({direction: FlexDirection.Column}){Time()Remark()}}
}

时间模块

@Component
struct Time{@State inputTime:string = ''build(){Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center}){Text("时间").fontColor(Color.Black).fontSize(20).margin({right:15}).width(70)TextInput({ placeholder: '2021', text: this.inputTime }).type(InputType.Normal).placeholderColor(Color.Gray).placeholderFont({ size: 20, weight: 2}).enterKeyType(EnterKeyType.Search).caretColor(Color.Green).width(300).height(40).borderRadius('20px').backgroundColor(Color.White)}.margin({top:20,left:15}).width(200)}
}

备注模块

@Component
struct Remark{@State inputRemark:string = ''build(){Flex({direction: FlexDirection.Row,alignItems: ItemAlign.Center}){Text("备注").fontColor(Color.Black).fontSize(20).margin({right:15}).width(70)TextInput({ placeholder: 'ceshe', text: this.inputRemark }).type(InputType.Normal).placeholderColor(Color.Gray).placeholderFont({ size: 20, weight: 2}).enterKeyType(EnterKeyType.Search).caretColor(Color.Green)
//        .layoutWeight(8).height(40).width(300).borderRadius('20px').backgroundColor(Color.White)}.margin({top:20,left:15}).width(50).height(50)}
}
3.设备认证

设备认证是依赖 DeviceManager 组件来实现的,详细代码参考源码RemoteDeviceModel.ets

1.创建DeviceManager实例

 registerDeviceListCallback(callback) {if (typeof (this.#deviceManager) === 'undefined') {deviceManager.createDeviceManager('com.example.tictactoegame', (error, value) => {if (error) returnthis.#deviceManager = value;this.registerDeviceListCallback_(callback);});} else {this.registerDeviceListCallback_(callback);}}

2.查询可信设备列表

 var list = this.#deviceManager.getTrustedDeviceListSync();if (typeof (list) != 'undefined' && typeof (list.length) != 'undefined') {this.deviceList = list;}

3.注册设备上下线监听

this.#deviceManager.on('deviceStateChange', (data) => {switch (data.action) {case 0:this.deviceList[this.deviceList.length] = data.device;this.callback();if (this.authCallback != null) {this.authCallback();this.authCallback = null;}break;case 2:if (this.deviceList.length > 0) {for (var i = 0; i < this.deviceList.length; i++) {if (this.deviceList[i].deviceId === data.device.deviceId) {this.deviceList[i] = data.device;break;}}}this.callback();break;case 1:if (this.deviceList.length > 0) {var list = [];for (var i = 0; i < this.deviceList.length; i++) {if (this.deviceList[i].deviceId != data.device.deviceId) {list[i] = data.device;}}this.deviceList = list;}this.callback();break;default:break;}});

4.设备发现

this.#deviceManager.on('deviceFound', (data) => {for (let i = 0; i < this.discoverList.length; i++) {if (that.discoverList[i].deviceId === data.device.deviceId) {return;}}this.discoverList[this.discoverList.length] = data.device;this.callback();});

5.设备认证

authDevice(deviceInfo, callback){let extraInfo = {"targetPkgName": 'com.example.tictactoegame',"appName": 'com.example.tictactoegame',"appDescription": 'com.example.tictactoegame',"business": '0'};let authParam = {"authType": 1,"appIcon": '',"appThumbnail": '',"extraInfo": extraInfo};this.#deviceManager.authenticateDevice(deviceInfo, authParam, (err, data) => {if (err) {this.authCallback = null;} else {this.authCallback = callback;}});}
4.数据管理

分布式数据管理 依赖@ohos.data.distributedData模块实现,详细参考源码RemoteDataManager.ets

1.导入该模块

import factory from '@ohos.data.distributedData';

2.创建KVManager实例,用于管理数据库对象

  registerDataListCallback(callback) {let that = thisif (this.kvManager == null) {try {const config = {userInfo: {userId: '0',userType: 0},bundleName: 'com.example.tictactoegame'}factory.createKVManager(config).then((manager) => {that.kvManager = managerthat.registerDataListCallback_(callback)}).catch((err) => {})} catch (e) {}} else {this.registerDataListCallback_(callback)}}

3.创建并获取KVStore数据库

registerDataListCallback_(callback) {let that = thisif (that.kvManager == null) {callback()return}if (that.kvStore == null) {try {let options ={createIfMissing: true,encrypt: false,backup: false,autoSync: true,kvStoreType: 1,securityLevel: 3}this.kvManager.getKVStore(this.STORE_ID, options).then((store) => {that.kvStore = storethat._registerDataListCallback_(callback)}).catch((err) => {})} catch (e) {}} else {this._registerDataListCallback_(callback)}}

4.订阅指定类型的数据变更通知

  _registerDataListCallback_(callback) {let that = thisif (that.kvManager == null) {callback()return}this.kvStore.on('dataChange', 1, function(data) {if (data) {that.arr = data.updateEntriescallback()}})}

5.添加指定类型键值对到数据库

  startAbilityContinuation(deviceId) {let wantValue = {bundleName: 'com.example.tictactoegame',abilityName: 'com.example.tictactoegame.MainAbility',deviceId: deviceId,parameters: {uri: 'pages/Fight'}};featureAbility.startAbility({ want: wantValue }).then(() => {router.replace({ uri: 'pages/Fight' })});}
5.远程拉起设备app

使用 FeatureAbility 模块的startAbility接口拉起远程设备app

  startAbilityContinuation(deviceId) {let wantValue = {bundleName: 'com.example.tictactoegame',abilityName: 'com.example.tictactoegame.MainAbility',deviceId: deviceId,parameters: {uri: 'pages/Fight'}};featureAbility.startAbility({ want: wantValue }).then(() => {router.replace({ uri: 'pages/Fight' })});}
6.添加数据

新建一个账单数据 添加到分布式数据

this.remoteDataManager.dataChange("key2", JSON.stringify(this.TestKvData))

在另一台设备监听并获取显示该条数据

 private onPageShow() {this.remoteDataManager.registerDataListCallback(() => {let arr = this.remoteDataManager.arr[0]this.strTest = arr.value.valuethis.ProjectData = JSON.parse(this.strTest)}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:https://qr21.cn/FV7h05

入门必看:https://qr21.cn/FV7h05
1.  应用开发导读(ArkTS)
2.  ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05
1.  基本概念
2.  构建第一个ArkTS应用
3.  ……

开发基础知识:https://qr21.cn/FV7h05
1.  应用基础知识
2.  配置文件
3.  应用数据管理
4.  应用安全管理
5.  应用隐私保护
6.  三方应用调用管控机制
7.  资源分类与访问
8.  学习ArkTS语言
9.  ……

基于ArkTS 开发:https://qr21.cn/FV7h05
1.  Ability开发
2.  UI开发
3.  公共事件与通知
4.  窗口管理
5.  媒体
6.  安全
7.  网络与链接
8.  电话服务
9.  数据管理
10.  后台任务(Background Task)管理
11.  设备管理
12.  设备使用信息统计
13.  DFX
14.  国际化开发
15.  折叠屏系列
16.  ……

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

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

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

相关文章

安卓使用okhttpfinal下载文件,附带线程池下载使用

1.导入okhttp包 implementation cn.finalteam:okhttpfinal:2.0.7 2.单个下载 package com.example.downloading;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log; import android.view.View;import java.io.File;import c…

大数据分布式计算工具Spark数据计算实战讲解(map方法,flatmap方法,reducebykey方法)

数据计算 map方法 PySpark的数据计算&#xff0c;都是基于RDD对象来进行的&#xff0c;那么如何进行呢&#xff1f; 自然是依赖&#xff0c;RDD对象内置丰富的&#xff1a;成员方法&#xff08;算子&#xff09; 功能&#xff1a;map算子&#xff0c;是将rdd的数据一条条处…

Java 小项目开发日记 01(注册接口的开发)

Java 小项目开发日记 01&#xff08;注册接口的开发&#xff09; 1.项目需求 完成注册接口 2.项目目录 3. 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

NWatch-Alarm闹钟功能实现

文章目录 W25Q64初始化SPI初始化W25Q初始化 AlARM模块初始化AlARM模块绘制Draw函数AlARM的更新函数AlARM中最重要的函数 W25Q64初始化 W25Q64用来存储用户设置的闹钟值&#xff0c;开机的时候自动读取闹钟记录。 SPI初始化 使用CubeMx自动配置。 #define SPI1CS_ON HAL_GP…

3d模型导出简单线条的步骤---模大狮模型网

导出简单线条的3D模型通常涉及以下步骤&#xff1a; 创建线条模型&#xff1a;首先&#xff0c;在您的3D建模软件中创建或导入包含线条的模型。这可以是简单的线框模型&#xff0c;也可以是由线条构成的复杂形状。确保您的模型中只包含您希望导出的线条部分。 选择导出格式&am…

Python的自然语言处理库NLTK介绍

NLTK&#xff08;Natural Language Toolkit&#xff09;简介 NLTK是Python中一个领先的自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了文本处理的基础设施&#xff0c;包括分词&#xff08;tokenization&#xff09;、词性标注&#xff08;part-of-speech tag…

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中&#xff0c;很多网友都反馈过想要在目标检测的图片上&#xff0c;显示计数功能。其实官方已经实现了这个功能&#xff0c;只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程&#xff0c;教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…

前端Ajax获取当前外网IP地址并通过腾讯接口解析地理位置

目录 一、获取访问端IP地址 二、可用的IP获取接口 1、韩小韩IP获取接口&#xff1a; 2、ipify API 附3、失败的太平洋接口 三、腾讯位置服务-IP位置查询接口 一、获取访问端IP地址 原计划使用后端HttpServletRequest 获取访问端的IP地址&#xff0c;但在nginx和堡垒机等阻…

峟思科普小(1)型土石坝安全监测设备的基本配置与策略

土石坝&#xff0c;作为水利工程中的重要组成部分&#xff0c;其安全性能直接关系到下游人民的生命财产安全。为了确保土石坝的安全运行&#xff0c;必须对其进行科学有效的安全监测。本文将详细阐述小(1)型土石坝安全监测设备的基本配置与策略。 首先&#xff0c;对于存在渗漏…

JVM运行时数据区——运行时数据区及线程概述

文章目录 1、运行时数据区概述2、线程3、小结 内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM在程序执行期间把它所管理的内存分为若干个不同的数据区域。这些不同的数据区域可以分为两种类型&#xff…

“智农”-农业一体化管控平台

大棚可视化|设施农业可视化|农业元宇宙|农业数字孪生|大棚物联网|大棚数字孪生|农业一体化管控平台|智慧农业可视化|智农|农业物联网可视化|农业物联网数字孪生|智慧农业|大棚三维可视化|智慧大棚可视化|智慧大棚|农业智慧园区|数字农业|数字大棚|农业大脑|智慧牧业数字孪生|智…

【饮食】如何有效的补充维生素,矿物质?学习笔记(附膳食营养素参考摄入量DRIs)

程序员养生指南之 【饮食】如何有效的补充维生素&#xff0c;矿物质&#xff1f;学习笔记&#xff08;附膳食营养素参考摄入量DRIs&#xff09; 文章目录 一、维生素补充1、需要补充维生素的情况2、食补&#xff1a;缺啥补啥3、补充剂&#xff08;无脑吃&#xff09; 二、膳食营…

Android 跨进程通信aidl及binder机制详解(一)

前言 上文中描述了&#xff0c;什么是绑定服务、以及创建一个绑定服务都可以通过哪些方式&#xff0c;同时说了通过扩展Binder类来创建一个绑定服务&#xff0c;并使用一个例子来说明了客户端与服务端的绑定过程&#xff0c;最后又总结了绑定服务的生命周期与调用过程。由于上…

(unity学习)一些效果的学习

一、学习视频 【Unity教程】零基础带你从小白到超神 二、效果实现 三、问题解决 Unity 点击UI与点击屏幕冲突的解决方案 关于unity UI界面操作与场景内操作不冲突问题

Unity安装与简单设置

安装网址&#xff1a;https://unity.cn 设置语言&#xff1a; 设置安装位置&#xff1a;否则C盘就会爆了 获取一个个人的资格证&#xff1a; 开始安装&#xff1a; 安装完毕。 添加模块&#xff1a;例如简体中文 新建项目&#xff1a; 布局2*3、单栏布局、 设置…

4. client-go 编程式交互

Kubernetes 系统使用 client-go 作为 Go 语言的官方编程式交互客户端库&#xff0c;提供对 Kubernetes API Server 服务的交互访问。Kubernetes 的源码中已经集成了 client-go 的源码&#xff0c;无须单独下载。client-go 源码路径为 vendor/k8s.io/client-go。 开发者经常使用…

前端架构: 脚手架之包管理工具的案例对比及workspace特性的基本使用

Npm WorkSpace 特性 1 &#xff09;使用或不使用包管理工具的对比 vue-cli 这个脚手架使用 Lerna 管理&#xff0c;它的项目显得非常清晰在 vue-cli 中包含很多 package 点开进去&#xff0c;每一个包都有package.json它里面有很多项目&#xff0c;再没有 Lerna 之前去维护和管…

threehit二次注入案例

君衍. 一、环境搭建1、conn.php源码&#xff1a;2、register.php源码3、login.php源码4、index.php源码5、demo.php源码 二、数据库环境搭建1、注意点一2、注意点二报错原因 三、复现过程1、user12、user23、user34、user45、user56、user6-name7、user7-table8、user8-column9…

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握与文件打开、关闭相关的函数&#xff0c;以及与读写操作相关的常用方法的…

vue中scss样式污染引发的思考

新做了一个项目&#xff0c;就是在登录后&#xff0c;就会产生左侧菜单的按钮颜色不一样。 然后发现样式是从这里传过来的 然后发现是登录页面的css给污染了 就是加了scope就把这个问题解决了 然后想总结一下这个思路&#xff1a;就是如何排查污染样式&#xff0c; 如果出现…