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

常州建站程序/厦门网络推广外包多少钱

常州建站程序,厦门网络推广外包多少钱,wordpress联系我插件,wordpress onepress基本概念 MVC全名是Model View Controller 是模型(model)-视图(view)-控制器(controller)的缩写 是一种软件设计规范,用一种业务逻辑、数据、界面显示 分离的方法组织代码 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时&#x…

基本概念

MVC全名是Model View Controller
是模型(model)-视图(view)-控制器(controller)的缩写
是一种软件设计规范,用一种业务逻辑、数据、界面显示 分离的方法组织代码
将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MVC在游戏开发中不是必备的,它主要用于开发游戏UI系统逻辑

前期准备

接下来要实现一个小的UI面板,分别实现不使用MVC框架和使用MVC框架的代码,以此作为对比。

Canvas设置

非MVC框架实现

主面板逻辑

MainPanel.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class MainPanel : MonoBehaviour
{//1.获得控件public Text txtName;public Text txtLev;public Text txtMoney;public Text txtGem;public Text txtPower;public Button btnRole;private static MainPanel panel;//2.添加事件//3.更新信息//4.动态显隐//使用静态方法,让NormalMain能够调用public static void ShowMe(){if(panel == null){//实例化面板对象GameObject res = Resources.Load<GameObject>("UI/MainPanel");GameObject obj = Instantiate(res);//设置父对象obj.transform.SetParent(GameObject.Find("Canvas").transform,false);panel = obj.GetComponent<MainPanel>();}//如果隐藏形式是setacive,则显示也要setpanel.gameObject.SetActive(true);//显示完面板 更新panel.UpdateInfo();}public static void HideMe(){if(panel != null){//一. 直接删// Destroy(panel.gameObject);// panel = null;//二. 隐藏panel.gameObject.SetActive(false);}}// Start is called before the first frame update void Start(){//2.添加事件btnRole.onClick.AddListener(ClickBtnRole);}private void ClickBtnRole(){//打开角色面板的逻辑Debug.Log("按钮点击");}//3.更新信息public void UpdateInfo(){//获取玩家数据 更新玩家信息//获取玩家数据的方式 1.网络请求  2.Json  3.xml  4.2进制  5.PlayerPrefs公共类//通过PlayerPrefs来获取本地存储的玩家信息 更新到界面上txtName.text = PlayerPrefs.GetString("PlayerName","阿喆不想学习");txtLev.text = "LV." + PlayerPrefs.GetInt("PlayerLev",1).ToString();txtMoney.text = PlayerPrefs.GetInt("PlayerMoney",999).ToString();txtGem.text = PlayerPrefs.GetInt("PlayerGem",888).ToString();txtPower.text = PlayerPrefs.GetInt("PlayerPower",10).ToString();}
}

NormalMain.cs

    void Update(){if(Input.GetKeyDown(KeyCode.M)){//显示主面板MainPanel.ShowMe();}else if(Input.GetKeyDown(KeyCode.N)){//隐藏主面板MainPanel.HideMe();}}

角色面板逻辑

RolePanel.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class RolePanel : MonoBehaviour
{//1.获得控件public Text txtLev;public Text txtHp;public Text txtAtk;public Text txtDef;public Text txtCrit;public Text txtMiss;public Text txtLuck;public Button btnClose;public Button btnLevUp;private static RolePanel panel;//2.添加事件//3.更新信息//4.动态显隐// Start is called before the first frame update public static void ShowMe(){if(panel == null){//实例化面板对象GameObject res = Resources.Load<GameObject>("UI/RolePanel");GameObject obj = Instantiate(res);//设置父对象obj.transform.SetParent(GameObject.Find("Canvas").transform,false);panel = obj.GetComponent<RolePanel>();}//如果隐藏形式是setacive,则显示也要setpanel.gameObject.SetActive(true);//显示完面板 更新panel.UpdateInfo();}public static void HideMe(){if(panel != null){//一. 直接删// Destroy(panel.gameObject);// panel = null;//二. 隐藏panel.gameObject.SetActive(false);}}void Start(){btnClose.onClick.AddListener(()=>{HideMe();});btnLevUp.onClick.AddListener(()=>{//升级就是数据更新//这里就是获取本地数据int lev = PlayerPrefs.GetInt("PlayerLev",1);int hp= PlayerPrefs.GetInt("PlayerHp",100);; int def= PlayerPrefs.GetInt("PlayerDef",10);int atk= PlayerPrefs.GetInt("PlayerAtk",20);int crit= PlayerPrefs.GetInt("PlayerCrit",20);int miss= PlayerPrefs.GetInt("PlayerMiss",10);int luck= PlayerPrefs.GetInt("PlayerLuck",40);//然后根据升级规则去改变他lev += 1;hp += lev;atk += lev;def += lev;crit += lev;miss += lev;luck += lev;//存起来PlayerPrefs.SetInt("PlayerLev",lev);PlayerPrefs.SetInt("PlayerHp",hp);PlayerPrefs.SetInt("PlayerAtk",atk);PlayerPrefs.SetInt("PlayerDef",def);PlayerPrefs.SetInt("PlayerCrit",crit);PlayerPrefs.SetInt("PlayerMiss",miss);PlayerPrefs.SetInt("PlayerLuck",luck);//同步更新面板上的数据UpdateInfo();//更新主面板的数据MainPanel.Panel.UpdateInfo();});}//更新信息public void UpdateInfo(){txtLev.text = "LV." + PlayerPrefs.GetInt("PlayerLev",1).ToString();txtHp.text = PlayerPrefs.GetInt("PlayerHp",100).ToString();txtAtk.text = PlayerPrefs.GetInt("PlayerAtk",20).ToString();txtDef.text = PlayerPrefs.GetInt("PlayerDef",10).ToString();txtCrit.text = PlayerPrefs.GetInt("PlayerCrit",20).ToString();txtMiss.text = PlayerPrefs.GetInt("PlayerMiss",10).ToString();txtLuck.text = PlayerPrefs.GetInt("PlayerLuck",40).ToString();}
}

MainPanel更新

    public static MainPanel Panel{get{return panel;}} private void ClickBtnRole(){//打开角色面板的逻辑RolePanel.ShowMe();}

MVC框架实现

Model数据脚本

using System.Collections;
using System.Collections.Generic;
using System.Runtime.ConstrainedExecution;
using UnityEngine;
using UnityEngine.Events;/// <summary>
/// 作为一个唯一的数据模型
/// 一般情况下 要不自己是个单例模式对象 
/// 要么自己存在在一个单例模式中
/// </summary>
public class PlayerModel
{//数据内容private string playerName;//用属性是为了能让外部得到它但不能改变他public string PlayerName{get{return playerName;}}private int lev;public int Lev{get{return lev;}}private int money;public int Money{get{return money;}}private int gem;public int Gem{get{return gem;}}private int power;public int Power{get{return power;}}private int hp;public int Hp{get{return hp;}}private int atk;public int Atk{get{return atk;}}private int def;public int Def{get{return def;}}private int crit;public int Crit{get{return crit;}}private int miss;public int Miss{get{return miss;}}private int luck;public int Luck{get{return luck;}}//通知外部更新的事件//通过它来与外部建立联系 而不是直接获取外部的面板private event UnityAction<PlayerModel> updateEvent;//在外部第一次获取这个数据 如何获取//通过单例模式 来达到数据的唯一性 和数据获取private static PlayerModel data = null;public static PlayerModel Data{get{if(data == null){data = new PlayerModel();data.Init();}return data;}}//数据相关的操作//   初始化public void Init(){playerName = PlayerPrefs.GetString("PlayerName","阿喆不想学习");lev = PlayerPrefs.GetInt("PlayerLev",1);money = PlayerPrefs.GetInt("PlayerMoney",9999);gem = PlayerPrefs.GetInt("PlayerGem",8888);power = PlayerPrefs.GetInt("PlayerPower",99);hp= PlayerPrefs.GetInt("PlayerHp",100);; def= PlayerPrefs.GetInt("PlayerDef",10);atk= PlayerPrefs.GetInt("PlayerAtk",20);crit= PlayerPrefs.GetInt("PlayerCrit",20);miss= PlayerPrefs.GetInt("PlayerMiss",10);luck= PlayerPrefs.GetInt("PlayerLuck",40);}//   更新  在这里是升级public void LevUp(){//升级 改变内容lev += 1;hp += lev;atk += lev;def += lev;crit += lev;miss += lev;luck += lev;//改变后保存SaveData();}//   保存public void SaveData(){//把这些数据内容 存储到本地PlayerPrefs.SetString("PlayerName",playerName);PlayerPrefs.SetInt("PlayerLev",lev);PlayerPrefs.SetInt("PlayerMoney",money);PlayerPrefs.SetInt("PlayerGem",gem);PlayerPrefs.SetInt("PlayerPower",power);PlayerPrefs.SetInt("PlayerHp",hp);PlayerPrefs.SetInt("PlayerAtk",atk);PlayerPrefs.SetInt("PlayerDef",def);PlayerPrefs.SetInt("PlayerCrit",crit);PlayerPrefs.SetInt("PlayerMiss",miss);PlayerPrefs.SetInt("PlayerLuck",luck);UpdateInfo();}public void AddEventListener(UnityAction<PlayerModel> function){updateEvent += function;}public void RemoveEventListener(UnityAction<PlayerModel> function){updateEvent -= function;}//通知外面更新数据的方法private void UpdateInfo(){//找到对应的 使用数据的脚本 去更新数据if(updateEvent != null){updateEvent(this);}}
}

View界面脚本

MainView.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class MainView : MonoBehaviour
{//1.找控件public Text txtName;public Text txtLev;public Text txtMoney;public Text txtGem;public Text txtPower;public Button btnRole;public Button btnSkill;//2.提供面板更新的方法给外部public void UpdateInfo(PlayerModel data){txtName.text = data.PlayerName;txtLev.text = "LV." + data.Lev;txtMoney.text = data.Money.ToString();txtGem.text = data.Gem.ToString();txtPower.text = data.Power.ToString();}
}

RoleView.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class RoleView : MonoBehaviour
{//1.找控件public Text txtLev;public Text txtHp;public Text txtAtk;public Text txtDef;public Text txtCrit;public Text txtMiss;public Text txtLuck;public Button btnClose;public Button btnLevUp;//2.提供面板更新的相关方法给外部public void UpdateInfo(PlayerModel data){txtLev.text = "LV." + data.Lev;txtHp.text = data.Hp.ToString();txtAtk.text = data.Atk.ToString();txtDef.text = data.Def.ToString();txtCrit.text = data.Crit.ToString();txtMiss.text = data.Miss.ToString();txtLuck.text = data.Luck.ToString();}
}

Controller业务逻辑

MainController

using System.Collections;
using System.Collections.Generic;
using JetBrains.Annotations;
using UnityEngine;/// <summary>
/// Controller要处理的东西 就是业务逻辑
/// </summary>
public class MainController : MonoBehaviour
{//能够在Controller中得到界面才行private MainView mainView;//面板之间的交互都是通过Controller来实现,我们不想让mainView也变成静态被其它访问,//因此可以设置个静态的 Controller,因为Controller也要被外部访问private static MainController controller = null;public static MainController Controller{get{return controller;}}//1.界面的显隐public static void ShowMe(){if(controller == null){//实例化面板对象GameObject res = Resources.Load<GameObject>("UI/MainPanel");GameObject obj = Instantiate(res);//设置父对象obj.transform.SetParent(GameObject.Find("Canvas").transform,false);controller = obj.GetComponent<MainController>();}//如果隐藏形式是setacive,则显示也要setcontroller.gameObject.SetActive(true);}public static void HideMe(){if(controller != null){controller.gameObject.SetActive(false);}}private void Start(){//获取同样挂载在一个对象上的 view脚本mainView = this.GetComponent<MainView>();//第一次更新mainView.UpdateInfo(PlayerModel.Data);//2.界面 事件的监听 来处理对应的业务逻辑mainView.btnRole.onClick.AddListener(ClickRoleBtn);//PlayerModel.Data.AddEventListener(mainView.UpdateInfo);PlayerModel.Data.AddEventListener(UpdateInfo);}private void ClickRoleBtn(){RoleController.ShowMe();}//3. 界面的更新private void UpdateInfo(PlayerModel data){if(mainView != null){mainView.UpdateInfo(data);}    }private void OnDestroy() {PlayerModel.Data.RemoveEventListener(UpdateInfo);}
}

RoleController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;public class RoleController : MonoBehaviour
{private RoleView roleView;private  static RoleController controller = null;public static RoleController Controller{get{return controller;}}public static void ShowMe(){if(controller == null){//实例化面板对象GameObject res = Resources.Load<GameObject>("UI/RolePanel");GameObject obj = Instantiate(res);//设置父对象obj.transform.SetParent(GameObject.Find("Canvas").transform,false);controller = obj.GetComponent<RoleController>();}//如果隐藏形式是setacive,则显示也要setcontroller.gameObject.SetActive(true);}public static void HideMe(){if(controller != null){controller.gameObject.SetActive(false);}}void Start(){roleView = this.GetComponent<RoleView>();//第一次更新面板roleView.UpdateInfo(PlayerModel.Data);roleView.btnClose.onClick.AddListener(ClickCloseBtn);roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);//PlayerModel.Data.AddEventListener(roleView.UpdateInfo);PlayerModel.Data.AddEventListener(UpdateInfo);}private void ClickCloseBtn(){HideMe();}private void ClickLevUpBtn(){//通过数据模块 进行升级 达到数据改变PlayerModel.Data.LevUp();}// Update is called once per frameprivate void UpdateInfo(PlayerModel data){if(roleView != null){roleView.UpdateInfo(data);}    }private void OnDestroy() {PlayerModel.Data.RemoveEventListener(UpdateInfo);}
}

对比与总结

好处

1.各司其职,互不干涉 --编程思路更清晰
2.有利开发中的分工 -- 多人协同开发时,同步并行
3.有利于组件重用  -- 项目换皮时,功能变化小时,提高开发效率

坏处

1.增加了程序文件的体量  -- 脚本由一变三
2.增加了结构的复杂性  --对于不清楚MVC原理的人不友好
3.效率相对较低     -- 对象之间的相互跳转,始终伴随着一定开销

扩展

MVC的美中不足

M和V之间存在着联系,也就是数据和界面之间存在着耦合性,当数据结构改变时会牵扯界面逻辑随之改动。
在MVC中当需求变化时,需要维护的对象数量会增加

如这一段

改变了PlayerModel中的变量的话,则MainView里的这个函数可能也要调整。

MVX

数据和界面是必备的内容
我们可以通过改变X元素来优化原本的MVC
也就是改变联系和处理M(数据)和V(界面)的方式

MVP:切断View和Model的耦合,让Presenter处理一切
MVVM:MVP的升级版,让ViewModel和V进行双向数据绑定,更新VM等同于更新V,反之同理
MVE:用EventCenter事件中心来分发消息

学习MVX的目的
不要拘泥于框架结构和设计模式要找到一个适合自己项目
一个稳定的,有序的,能满足项目需求的实现方式

MVP

全称为模型(Model)-视图(View)一主持人(Presenter)

Model提供数据,View负责界面,Presenter负责逻辑的处理

它是MVC的一种变式,是针对MVC中M和V存在耦合的优化

与MVC的区别:

在MVC中View会直接从Model中读取数据而不是通过 Controller
而在MVP中View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部。

同样是上面的项目

MVP_MainView.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class MVP_MainView : MonoBehaviour
{//1.找控件public Text txtName;public Text txtLev;public Text txtMoney;public Text txtGem;public Text txtPower;public Button btnRole;public Button btnSkill;// //2.提供面板更新的方法给外部// public void UpdateInfo(string name, int lev, int money, int gem, int power){//     txtName.text = name;//     txtLev.text = "LV." + lev;//     txtMoney.text = money.ToString();//     txtGem.text = gem.ToString();//     txtPower.text = power.ToString();// }
}

MVP_RoleView.cs

public class MVP_RoleView : MonoBehaviour
{//1.找控件public Text txtLev;public Text txtHp;public Text txtAtk;public Text txtDef;public Text txtCrit;public Text txtMiss;public Text txtLuck;public Button btnClose;public Button btnLevUp;//2.提供面板更新的相关方法给外部//方法可选 到时候可以直接在P里面通过访问控件 去修改}

MainPresenter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MainPresenter : MonoBehaviour
{//能够在Presenter中得到界面才行private MVP_MainView mainView;//面板之间的交互都是通过Controller来实现,我们不想让mainView也变成静态被其它访问,//因此可以设置个静态的 Controller,因为Controller也要被外部访问private static MainPresenter presenter = null;public static MainPresenter Presenter{get{return presenter;}}//1.界面的显隐public static void ShowMe(){if(presenter == null){//实例化面板对象GameObject res = Resources.Load<GameObject>("UI/MainPanel");GameObject obj = Instantiate(res);//设置父对象obj.transform.SetParent(GameObject.Find("Canvas").transform,false);presenter = obj.GetComponent<MainPresenter>();}//如果隐藏形式是setacive,则显示也要setpresenter.gameObject.SetActive(true);}public static void HideMe(){if(presenter != null){presenter.gameObject.SetActive(false);}}private void Start(){//获取同样挂载在一个对象上的 view脚本mainView = this.GetComponent<MVP_MainView>();//第一次更新//mainView.UpdateInfo(PlayerModel.Data);//通过P自己的更新方法来更新UpdateInfo(PlayerModel.Data);//2.界面 事件的监听 来处理对应的业务逻辑mainView.btnRole.onClick.AddListener(ClickRoleBtn);//PlayerModel.Data.AddEventListener(mainView.UpdateInfo);PlayerModel.Data.AddEventListener(UpdateInfo);}private void ClickRoleBtn(){//RoleController.ShowMe();RolePresenter.ShowMe();}//3. 界面的更新private void UpdateInfo(PlayerModel data){if(mainView != null){//mainView.UpdateInfo(data);//以前是把数据M传到V中去更新,现在全部由P来做mainView.txtName.text = data.PlayerName;mainView.txtLev.text = "LV." + data.Lev;mainView.txtMoney.text = data.Money.ToString();mainView.txtGem.text = data.Gem.ToString();mainView.txtPower.text = data.Power.ToString();}    }private void OnDestroy() {PlayerModel.Data.RemoveEventListener(UpdateInfo);}
}

RolePresenter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RolePresenter : MonoBehaviour
{private MVP_RoleView roleView;private  static RolePresenter presenter = null;public static RolePresenter Presenter{get{return presenter;}}public static void ShowMe(){if(presenter == null){//实例化面板对象GameObject res = Resources.Load<GameObject>("UI/RolePanel");GameObject obj = Instantiate(res);//设置父对象obj.transform.SetParent(GameObject.Find("Canvas").transform,false);presenter = obj.GetComponent<RolePresenter> ();}//如果隐藏形式是setacive,则显示也要setpresenter.gameObject.SetActive(true);}public static void HideMe(){if(presenter != null){presenter.gameObject.SetActive(false);}}void Start(){roleView = this.GetComponent<MVP_RoleView>();//第一次更新面板UpdateInfo(PlayerModel.Data);roleView.btnClose.onClick.AddListener(ClickCloseBtn);roleView.btnLevUp.onClick.AddListener(ClickLevUpBtn);//PlayerModel.Data.AddEventListener(roleView.UpdateInfo);PlayerModel.Data.AddEventListener(UpdateInfo);}private void ClickCloseBtn(){HideMe();}private void ClickLevUpBtn(){//通过数据模块 进行升级 达到数据改变PlayerModel.Data.LevUp();}// Update is called once per frameprivate void UpdateInfo(PlayerModel data){if(roleView != null){//直接在p中得到V界面的控件,断开M和V的联系roleView.txtLev.text = "LV." + data.Lev;roleView.txtHp.text = data.Hp.ToString();roleView.txtAtk.text = data.Atk.ToString();roleView.txtDef.text = data.Def.ToString();roleView.txtCrit.text = data.Crit.ToString();roleView.txtMiss.text = data.Miss.ToString();roleView.txtLuck.text = data.Luck.ToString();}    }private void OnDestroy() {PlayerModel.Data.RemoveEventListener(UpdateInfo);}
}

MVP同样由缺点,Presenter中的逻辑很多。

但是之后逻辑修改也只用在Presenter中。

MVVM

全称为模型(Model)-视图(View)-视图模型(ViewModel)
Model提供数据,View负责界面,ViewModel负责逻辑的处理
MVVM的由来是MVP(Model-View-Presenter)模式与WPF结合应用时发展演变过来的一种新型框架

数据绑定

将一个用户界面元素(控件)的属性 绑定到 一个类型(对象)实例上的某个属性的方法。

如果开发者有一个MainViewMode类型的实例,那么他就可以把MainViewMode的“Lev”属性绑定到一个Ul中Text的“Text”属性上。“绑定”了这2个属性之后,对Text的Text属性的更改“传播”MainViewMode的Lev属性,而对MainViewMode的Lev属性的更改同样会“传播”到Text的Text属性

MVVM在Unity中水土不服

因为View对象始终由我们来书写,没有UI配置文件(如WPF中的XAML),要想实现传播需要事件/委托,很麻烦。

硬要在Unity中实现MVVM,需要写三模块,并且还要对V和VM进行数据绑定,工作量大,好处也不够明显

Unity的第三方MVVM框架
Loxodon Framework
https://github.com/vovgou/loxodon-framework
uMVVM
https://github.com/MEyes/uMVVM

MVE

全称为模型(Model)-视图(View)-事件中心(EventCenter)
Model提供数据,View负责界面,EventCenter负责数据传递

好处:

利用事件中心的观察者模式
让M和V层的之间的关系更加灵活多变
减少了目前数据层的负载
将数据层事件全部交由事件中心处理

总结

铁打的M和V,流水的X
数据和界面是必备的内容
我们可以通过改变X元素来优化原本的MVC
也就是改变联系和处理M(数据)和V(界面)的方式

不要拘泥于框架结构和设计模式要找到一个适合自己项目的
一个稳定的,有序的,能满足项目需求的实现方式

相关文章:

Unity中的MVC框架

基本概念 MVC全名是Model View Controller 是模型(model)-视图(view)-控制器(controller)的缩写 是一种软件设计规范&#xff0c;用一种业务逻辑、数据、界面显示 分离的方法组织代码 将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时&#x…...

网工内推 | 上市公司网工,Base广东,思科DE/IE认证优先

01 广州赛意信息科技股份有限公司 &#x1f537;招聘岗位&#xff1a;技术架构师 &#x1f537;职责描述&#xff1a; 1、设计、开发和维护工业数据库及其架构&#xff0c;包括数据采集、存储、处理和分析的工具和系统。 2、开发和维护数据管道和工作流程&#xff0c;确保数据…...

ZYNQ AXI4 FDMA内存读写

1 概述 如果用过ZYNQ的都知道,要直接操作PS的DDR 通常是DMA 或者VDMA,然而用过XILINX 的DMA IP 和 VDMA IP,总有一种遗憾,那就是不够灵活,还需要对寄存器配置,真是麻烦。对于我们搞 FPGA 的人来说,最喜欢直接了当,直接用FPGA代码搞定。现在XILINX 的总线接口是AXI4总线…...

签名安全规范:解决【请求对象json序列化时,时间字段被强制转换成时间戳的问题】

文章目录 引言I 签名安全规范1.1 签名生成的通用步骤1.2 签名运算(加密规则)1.3 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)1.4 允许的请求头字段1.5 签名校验工具II 注解校验签名2.1 获取请求数据,并校验签名数据2.2 解决时间格式被强制转换成时间戳的问题…...

Web3.0区块链技术开发方案丨ICO与IDO代币开发

在Web3.0时代的到来下&#xff0c;区块链技术不仅改变着金融领域的格局&#xff0c;也在资金筹集和代币发行方面掀起了一场变革。初始代币发行&#xff08;ICO&#xff09;和去中心化代币发行&#xff08;IDO&#xff09;成为了项目融资的主要方式&#xff0c;其基于区块链技术…...

spring boot 3.x版本 引入 swagger2启动时报错

一&#xff0c;问题 Spring Boot 3.x版本的项目里&#xff0c;准备引入Swagger2作为接口文档&#xff0c;但是项目启动报错&#xff1a; java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present at java.base/sun.reflect.generics.…...

华为机械工程师面试问题

在机械工程师的面试中,面试官可能会提出一系列问题,以评估应聘者的专业知识、技能、经验以及解决问题的能力。以下是一些可能的面试题: 基础知识与技能: 请解释机械工程中常用的几种传动方式,并比较它们的优缺点。描述一下你在机械设计过程中常用的软件,并举例说明你是如…...

一个简单并完整的springboot项目

一个简单并完整的springboot项目 项目地址1&#xff1a;https://download.csdn.net/download/qq_38234785/89398614 项目地址2&#xff1a;https://mbd.pub/o/buranxin/work 一、接口 curl --location --request POST http://localhost:8080/api/test \ --header Cookie: USER…...

SASS基础知识

什么是SASS 1. SASS与CSS的关系 SASS&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种强大的CSS扩展语言&#xff0c;它允许开发者使用变量、嵌套规则、混合宏和更多功能&#xff0c;这些在纯CSS中是不可能做到的。SASS旨在简化CSS代码的维护&#xff0c;并…...

基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善

前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善-CSDN博客 本篇将完善主界面的管理员入库和出库功能&#xff0c;同样的&#xff0c;管理员入库和出库的设计套路适用于动态表的录入和编辑 首先还是介绍一下本项目将要实现的功能 &#xf…...

【MATLAB】概述1

非 ~ 注释 % 定义 >> 数组 赋值 赋值&#xff1a;>> x1 函数 数组 x[x1,x2] 行向量&#xff08;&#xff0c;or ) x[x1;x2] 列向量 x. 转置等间隔向量 1-10 向量&#xff1a;>>xlinspace(1,10,10) 矩阵 矩阵&#xff1a;>>A[1,2,3;4,5,6;7,8,9] …...

容器中运行ip addr提示bash: ip: command not found【笔记】

容器中运行ip addr提示bash: ip: command not found 原因没有安装ip命令。 rootdocker-desktop:/# ip addr bash: ip: command not found rootdocker-desktop:/# apt-get install -y iproute2...

香橙派OrangePi AIpro,助力国产AIoT迈向新的台阶!

前言&#xff1a;很高兴受邀CSDN与OrangePi官方组织的测评活动&#xff0c;本次测评是一块基于AI边缘计算的香橙派开发板OrangePi AIpro。这是 香橙派 联合 华为昇腾 合作精心打造的新一代边缘AI计算产品&#xff0c;于2023年12月初发布&#xff0c;提供 8/20TOPS澎湃算力[1]&a…...

VSCode界面Outline只显示类名和函数名,隐藏变量名

参考链接 https://blog.csdn.net/Zjhao666/article/details/120523879https://blog.csdn.net/Williamcsj/article/details/122401996 VSCode中界面左下角的Outline能够方便快速跳转到文件的某个类或函数&#xff0c;但默认同时显示变量&#xff0c;导致找某个函数时很不方便。…...

运维开发详解:现代IT环境的核心角色

随着信息技术的快速发展和互联网应用的广泛普及&#xff0c;运维开发&#xff08;DevOps&#xff09;在现代IT环境中扮演着越来越重要的角色。本文将详细探讨运维开发的概念、历史背景、关键实践、工具和未来趋势&#xff0c;旨在为读者提供全面的理解。 什么是运维开发&#…...

Docker 容器中运行Certbot获取和管理 SSL 证书

如果你在 Docker 容器中运行 Nginx 并希望使用 Certbot 获取和管理 SSL 证书&#xff0c;可以使用 Certbot 的官方 Docker 镜像来完成这项工作。以下是使用 Docker 和 Certbot 获取 SSL 证书并配置 Nginx 的详细步骤&#xff1a; 1. 拉取 Certbot Docker 镜像 首先&#xff0…...

FL Studio21.2.8中文版水果音乐制作的革新之旅!

在数字化浪潮的推动下&#xff0c;音乐制作领域经历了翻天覆地的变化。从最初的模拟技术到如今的全数字化处理&#xff0c;音乐制作的门槛被大幅降低&#xff0c;越来越多的音乐爱好者和专业人士开始尝试自行创作和编辑音乐。在这个过程中&#xff0c;各种专业音乐制作软件成为…...

03-JavaScript 中的相等判断与隐式类型转换

深入理解 JavaScript 中的相等判断与隐式类型转换 笔记分享 JavaScript 是一门动态类型语言&#xff0c;这意味着变量的类型是在运行时确定的。这种灵活性虽然提供了便利&#xff0c;但也带来了相应的复杂性&#xff0c;特别是在判断相等性时。本文将深入探讨 JavaScript 中相…...

Linux 命令:head

1. 写在前面 本文主要介绍 Linux head 命令&#xff1a;可用于查看文件的开头部分的内容&#xff0c;有一个常用的参数 -n 用于显示行数&#xff0c;默认为 10&#xff0c;即显示 10 行的内容。 关注 公众号 获取最新博文&#xff1a; 滑翔的纸飞机 2. head 命令 head 命令的…...

系统安全及其应用

系统安全及其应用 部署服务器的初始化步骤&#xff1a; 1、配置IP地址&#xff0c;网关&#xff0c;DNS解析 2、安装源&#xff0c;外网&#xff08;在线即可yum&#xff09; 内网&#xff08;只能用源码包编译安装&#xff09; 3、磁盘分区 lvm raid 4、系统权限配置和基础安…...

韩文图片文字识别,这几款软件轻松驾驭韩语文本

在当今信息爆炸的时代&#xff0c;跨语言交流已成为日常生活和工作中的常态。对于需要处理韩文文本的用户来说&#xff0c;韩文图片文字识别技术无疑是一大福音。今天&#xff0c;就为大家介绍几款优秀的韩文图片文字识别软件&#xff0c;让你轻松驾驭韩语文本&#xff0c;提升…...

登录安全分析报告:小米官网注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …...

LVS精益价值管理系统 LVS.Web.ashx SQL注入漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制,帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述 LVS精益…...

【JavaScript脚本宇宙】图表库大盘点:选择最适合你的工具

掌握数据可视化&#xff1a;详解JavaScript图表库 前言 本篇文章将详细解析六种不同的JavaScript图表库。这些库各有特色&#xff0c;由简单到高级&#xff0c;应用广泛&#xff0c;无论你是初学者还是专业开发者&#xff0c;都能在其中找到适合自己的工具。 欢迎订阅专栏&am…...

【Lua】IntelliJ IDEA 写注释或选中变量单词时偶尔会选中相邻的内容或下一行内容

例如: --UI代码local a 0 当你想在a变量上方加一行 --UI代码注释时&#xff0c;会发现敲打daima中文拼音时&#xff08;还未按回车&#xff09;就会选中当前行以及下一行前半部分。 打完按空格就会变成这样子&#xff01; 原因是因为开启了英文检测&#xff0c;需要关掉它。 …...

安全风险 - 组件导出风险

在安全审查中关于组件导出风险是一种常见问题&#xff0c;不同组件都有可能遇到这种问题&#xff0c;而且从一定角度来看的话&#xff0c;如果涉及到三方业务&#xff0c;基本处于无法解决的场景&#xff0c;所以我们需要说明为何无法避免这种风险 组件导出风险能不能规避&…...

【HarmonyOS】应用振动效果实现

一、问题背景&#xff1a; 应用在强提醒场景下&#xff0c;一般会有马达振动的效果&#xff0c;提示用户注意力的关注。 比如消息提醒&#xff0c;扫码提示&#xff0c;删除键确认提示等。 针对高定制化或者固定的振动方式&#xff0c;我们需要有不同的方案实现&#xff0c;马…...

springCloud中将redis共用到common模块

一、 springCloud作为公共模块搭建框架 springCloud 微服务模块中将redis作为公共模块进行的搭建结构图&#xff0c;如下&#xff1a; 二、redis 公共模块的搭建框架 如上架构&#xff0c;代码如下pom.xml 关键代码&#xff1a; <dependencies><!-- SpringBoot Boo…...

基于jeecgboot-vue3的Flowable流程-待办任务(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 这一部分主要讲委派与转办 1、都调用下面的方法 /*** 操作栏*/function getTableAction(record) {return [{label: 处理,onClick: handleProcess.bind(null, record),},{label: 委派,onC…...

如何让Google快速收录?

要让Google快速收录你的网站&#xff0c;可以考虑使用GSI服务&#xff0c;这是一种专门设计来加速网站被Google搜索引擎收录的服务&#xff0c;下面详细解释GSI服务的基本原理和具体好处&#xff1a; GSI服务通过一种名为GPC爬虫池的系统实现&#xff0c;这个系统是基于对Goog…...