js树形控件zTree使用总结

文章目录

  • 一、`zTree`简介
    • 1.1、`zTree`的特点
    • 1.2、`zTree`文件介绍
  • 二、`zTree`的基本使用
    • 2.1、`zTree`的创建
    • 2.2、`zTree`的配置
    • 2.3、`zTree`的数据格式
      • 2.3.1、标准数据格式
      • 2.3.2、简单数据格式
    • 2.4、`zTree`的常用方法
      • 2.4.1、获取`zTree`对象
      • 2.4.2、增加节点
      • 2.4.3、勾选或取消勾选全部节点
      • 2.4.4、勾选或取消勾选单个节点
      • 2.4.5、**编辑节点**
      • 2.4.6、展开或折叠全部节点
      • 2.4.7、根据节点属性查找结点
      • 2.4.8、获取被勾选或未被勾选的节点集合
      • 2.4.9、获取输入框勾选状态被改变的节点集合
  • 三、`zTree`的常用操作
    • 3.1、`ajax`请求数据并创建`zTree`
    • 3.2、节点单击操作
    • 3.3、节点复选框事件
    • 3.4、实现`zTree`的右键增删改操作
      • 3.4.1、首先定义右键弹出面板
      • 3.4.2、实现`zTree`右键单击事件回调函数
      • 3.4.3、新增节点
      • 3.4.4、编辑节点
      • 3.4.5、节点编辑状态离开时触发事件
      • 3.4.6、删除节点数据
    • 3.5、一些总结
  • 四、最后

一、zTree简介

zTreeAPI文档:http://www.treejs.cn/v3/api.php

zTree的在线示例:http://www.treejs.cn/v3/demo.php

树形控件的使用是应用开发过程中必不可少的。zTree 是一个依靠 jQuery 实现的多功能树插件。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。

1.1、zTree的特点

  • 最新版的zTree将核心代码按照功能进行了分割,不需要的代码可以不用加载,如普通使用只需要加载核心的jquery.ztree.core-3.5.js,需要使用勾选功能加载jquery.ztree.excheck-3.5.min.js,需要使用编辑功能加载jquery.ztree.exedit-3.5.min.js
  • 采用了延迟加载技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀
  • 兼容 IEFireFoxChromeOperaSafari 等浏览器
  • 支持 JSON 数据
  • 支持静态 和 Ajax 异步加载节点数据
  • 支持任意更换皮肤 / 自定义图标(依靠css
  • 支持极其灵活的 checkboxradio 选择功能
  • 提供多种事件响应回调
  • 灵活的编辑(增/删/改/查)功能,可随意拖拽节点,还可以多节点拖拽
  • 在一个页面内可同时生成多个 Tree 实例
  • 简单的参数配置实现,灵活多变的功能

1.2、zTree文件介绍

zTree官网下载的zTree包括以下组成部分

  • metroStyle文件夹:zTreemetro风格样式相关文件(图片及css样式表)。
  • zTreeStyle文件夹:zTree的标准风格样式文件夹(图片及css样式表)
  • js文件:zTree.all.js是完整的js库,可单纯加载此文件实现所有zTree功能,ztree.core、ztree.excheck、ztree.exedit、ztree.exhide是对ztree按照功能进行的分割,分别对应基本功能、复选功能、编辑功能、显隐功能。

二、zTree的基本使用

2.1、zTree的创建

在页面中添加对zTreejscss引用,由于zTree基于JQueryJQuery的引用是必须的。

<!DOCTYPE html>
<HTML>
<HEAD><TITLE> ZTREE DEMO </TITLE><meta http-equiv="content-type" content="text/html; charset=UTF-8"><link rel="stylesheet" href="zTreeStyle/zTreeStyle.css" type="text/css"><script type="text/javascript" src="jquery-1.4.2.js"></script><script type="text/javascript" src="jquery.ztree.core-3.x.js"></script><SCRIPT LANGUAGE="JavaScript">var zTreeObj;var setting = {};        // zTree 的参数配置,后面详解var zNodes = [           // zTree 的数据属性,此处使用标准json格式{name: "test1", open: true, children: [{ name: "test1_1" }, { name: "test1_2" }]},{name: "test2", open: true, children: [{ name: "test2_1" }, { name: "test2_2" }]}];$(document).ready(function () {zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes); //初始化zTree,三个参数一次分别是容器(zTree 的容器 className 别忘了设置为 "ztree")、参数配置、数据源});</SCRIPT>
</HEAD>
<BODY><div><ul id="treeDemo" class="ztree"></ul> </div>
</BODY>
</HTML>

运行结果如下:

2.2、zTree的配置

zTree的配置采用JSON格式,按照配置的类型分为view(可视界面相关配置)、data(数据相关配置)、check(复选框相关配置)、callback(各类事件的回调函数配置)、asynczTree异步加载配置),一下是我们经常会使用到的一些配置及说明,其他详细配置可以参考zTree官方API文档的详细介绍。

var setting = {view: {selectedMulti: true, //设置是否能够同时选中多个节点showIcon: true,      //设置是否显示节点图标showLine: true,      //设置是否显示节点与节点之间的连线showTitle: true,     //设置是否显示节点的title提示信息},data: {simpleData: {enable: false,   //设置是否启用简单数据格式(zTree支持标准数据格式跟简单数据格式,上面例子中是标准数据格式)idKey: "id",     //设置启用简单数据格式时id对应的属性名称pidKey: "pId"    //设置启用简单数据格式时parentId对应的属性名称,ztree根据id及pid层级关系构建树结构}},check:{enable: true         //设置是否显示checkbox复选框},callback: {onClick: onClick,             //定义节点单击事件回调函数onRightClick: OnRightClick,   //定义节点右键单击事件回调函数beforeRename: beforeRename,   //定义节点重新编辑成功前回调函数,一般用于节点编辑时判断输入的节点名称是否合法onDblClick: onDblClick,       //定义节点双击事件回调函数onCheck: onCheck              //定义节点复选框选中或取消选中事件的回调函数},async: {enable: true,                      //设置启用异步加载type: "get",                       //异步加载类型:post和getcontentType: "application/json",   //定义ajax提交参数的参数类型,一般为json格式url: "/Design/Get",                //定义数据请求路径autoParam: ["id=id", "name=name"]  //定义提交时参数的名称,=号前面标识节点属性,后面标识提交时json数据中参数的名称}
};

需要注意的是,zTree的事件回调部分,基本上每一个事件都对应一个beforeXXX事件,比如onClick事件对应有一个beforeOnClick事件,主要用于控制相关事件是否允许执行,如果before事件返回false,则取消执行对应相关事件。

2.3、zTree的数据格式

zTree的每一个节点都是一个treeNode对象,treeNode对象经常用到的属性和方法如下:

treeNode: {name,       //节点显示的文本checked,    //节点是否勾选,ztree配置启用复选框时有效open,       //节点是否展开icon,       //节点的图标iconOpen,   //节点展开式的图标iconClose,  //节点折叠时的图标id,         //节点的标识属性,对应的是启用简单数据格式时idKey对应的属性名,并不一定是id,如果setting中定义的idKey:"zId",那么此处就是zIdpId,        //节点parentId属性,命名规则同idchildren,   //得到该节点所有孩子节点,直接下级,若要得到所有下属层级节点,需要自己写递归得到isParent,   //判断该节点是否是父节点,一般应用中通常需要判断只有叶子节点才能进行相关操作,或者删除时判断下面是有子节点时经常用到。getPath()   //得到该节点的路径,即所有父节点,包括自己,此方法返回的是一个数组,通常用于创建类似面包屑导航的东西A-->B-->C 
}

zTree的数据源一般有标准数据格式、简单数据格式两种,标准数据格式通过指定节点的chidren属性构建层级关系,而简单数据格式根据根据idpid属性构建层级关系,我们在应用开发中使用关系型数据库,一般采用的都是简单数据格式。

2.3.1、标准数据格式

var nodes = [{name: "父节点1", children: [{name: "子节点1"},{name: "子节点2"}]}
];

2.3.2、简单数据格式

var nodes = [{id:1, pId:0, name: "父节点1"},{id:11, pId:1, name: "子节点1"},{id:12, pId:1, name: "子节点2"}
];

2.4、zTree的常用方法

2.4.1、获取zTree对象

var treeObj = $.fn.zTree.getZTreeObj("tree");

2.4.2、增加节点

addNodes(parentNode,index,newNodes,isSlient)

parentNode:指定的父节点,如果增加根节点,请设置 parentNodenull 即可

index:新节点插入的位置(从 0 开始),index = -1 时,插入到最后,此参数可忽略

newNodes:需要增加的节点数据 JSON 对象集合,数据只需要满足 zTree 的节点数据必需的属性即可

isSilenttrue 时,添加节点后不展开父节点,其他值或缺省状态都自动展开

2.4.3、勾选或取消勾选全部节点

checkAllNodes(checked);

checked参数为true时全部勾选,为false时全部取消勾选。

2.4.4、勾选或取消勾选单个节点

checkNode(node, checked, checkedTypeFlag,callbackFlag);

node:要进行操作的节点

checked:为true勾选,为false取消勾选

checkeTypeFlag:为true表示对当前结点的子节点及父节点进行勾选状态的联动,为false不联动

callbackFlag:为true时表示执行beforeOnCheckonCheck事件的回调函数,为false不执行

2.4.5、编辑节点

edit(node);

使节点处于编辑状态,必须引用jquery.ztree.exedit 扩展。

2.4.6、展开或折叠全部节点

expandAll(expand);

expandtrue是展开所有节点,为false是折叠所有节点。

2.4.7、根据节点属性查找结点

getNodesByParam(key,value, parentNode);

key:属性名

value:属性值

parentNode:是否在指定节点下查找,为null表示整个树查找。

2.4.8、获取被勾选或未被勾选的节点集合

getCheckedNodes(checked);

checkedtrue表示获取所有被勾选的节点集合,为false表示所有未被勾选的节点集合

2.4.9、获取输入框勾选状态被改变的节点集合

getChangeCheckedNodes()

三、zTree的常用操作

3.1、ajax请求数据并创建zTree

$(function () {var setting = {                 //此处根据自己需要进行配置view: {selectedMulti: false},data: {simpleData: {enable: true}},callback: {onClick: onDesignTreeClick,onRightClick: OnRightClick,beforeRename: beforeRename,onCheck:onCheck}};$.ajax({type: "Get",url: "/Design/GetDesignTreeData",                  //ajax请求地址success: function (data) {$.fn.zTree.init($("#treeZo"), setting, data);  //加载数据},});
});

后台代码如下,可以根据需要返回你想要的任何数据,绑定到zTree上,然后通过treeNode.属性名取到对应的值,实现一些界面逻辑操作。

public ActionResult GetDesignTreeData() {var result = _designAppService.GetDesignTreeData();List<ModelTreeViewModel> treeModels = new List<ModelTreeViewModel>();bool open = false;foreach (var design in result.Designs){if (design.ParentId == Guid.Empty)open = true;else open = false;treeModels.Add(new ModelTreeViewModel() { Id = design.Id.ToString(), PId = design.ParentId.ToString(), Name = design.Name, Open = open, Data = design.Remarks ?? "", ViewPoint = design.ViewPoint ?? "", Checked = true });}return Json(treeModels, JsonRequestBehavior.AllowGet);
}

3.2、节点单击操作

节点单击事件会捕获事件对象ezTree的唯一标识treeId,当前选中的节点对象treeNode三个参数。根据实际需求可获取treeNode中包含的任何属性数据,进行相关操作

function onClick(e, treeId, treeNode) {if (treeNode.isParent)  //如果不是叶子结点,结束return;alert(treeNode.name);   //获取当前结点上的相关属性数据,执行相关逻辑
};

3.3、节点复选框事件

一般情况下我们会直接使用treeObj.getCheckedNodes(true)获取所有选中的节点,然后遍历所有选中的节点进行相关操作,当面对大数据量时,这种操作方法便不可取,可通过getChangeCheckedNodes()方法获取勾选状态被改变的节点集合,值针对状态改变的节点做相应处理。

function onCheck() {var treeObj = $.fn.zTree.getZTreeObj("treeDemo");  //获取树对象var nodes = treeObj.getChangeCheckedNodes();       //获取勾选状态改变的节点var designIds = [];var status = 0;                                    //定义初始勾选状态为未勾选if (nodes[0].checked)status = 1;                                    //如果状态改变节点为勾选状态,说明当前操作是从未勾选变为已勾选。$.each(nodes, function (i, item) {designIds.push(item.id);                       //将状态改变的节点id输出到数组item.checkedOld = item.checked;                //这句话很关键,将节点的初始状态置为当前状态。否则每次勾选操作获取状态改变节点时只会跟树初始化的状态相比较。})$.ajax({type: "Post",url: "/Design/GetRelationComponentIdsByDesigns",data: { "designIds": designIds },success: function (data) {RealBimOcx.BatchAddSubClrInfoBegin();$.each(data.result, function (i, item) {if (status == 1)                                         //这里根据发生改变的节点是勾选还是为勾选进行相关逻辑操作。RealBimOcx.AddSubClrInfo(item, 255, 255, 0);elseRealBimOcx.AddSubClrInfo(item, 0, 255, 0);if (i % 100 == 0) {RealBimOcx.BatchAddSubClrInfoEnd();RealBimOcx.BatchAddSubClrInfoBegin();}})RealBimOcx.BatchAddSubClrInfoEnd();}})
};

3.4、实现zTree的右键增删改操作

3.4.1、首先定义右键弹出面板

<div id="rMenu" style="z-index:100;"><ul><li id="m_add" onclick="addTreeNode();">新增节点</li><li id="m_del" onclick="removeTreeNode();">删除节点</li><li id="m_edit" onclick="editTreeNode();" style="border-bottom:1px solid #cecece">编辑节点</li><li id="m_left">升级</li><li id="m_right">降级</li><li id="m_up">上移</li><li id="m_down" style="border-bottom:1px solid #cecece">下移</li><li id="m_reset" onclick="resetTree();">重置节点</li>
<li id="m_open" onclick="treeOpen()">展开所有</li><li id="m_stop" onclick="treeStop()">收起所有</li></ul>
</div>

3.4.2、实现zTree右键单击事件回调函数

//右键单击回调函数
function OnRightClick(event, treeId, treeNode) {$("#treeZo").hide();if (!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) {zTree.cancelSelectedNode();showRMenu("root", event.clientX, event.clientY);   //根据鼠标位置显示右键操作面板} else if (treeNode && !treeNode.noR) {zTree.selectNode(treeNode);showRMenu("node", event.clientX, event.clientY);}$("#treeZo").show();
}
//根据节点类型,控制右键操作菜单哪些可用哪些不可用
function showRMenu(type, x, y) {$("#rMenu ul").show();if (type == "root") {$("#m_del").hide();$("#m_edit").hide();$("#m_left").hide();$("#m_right").hide();$("#m_up").hide();$("#m_down").hide();$("#m_add").addClass('mboder');} else {$("#m_del").show();$("#m_edit").show();$("#m_left").show();$("#m_right").show();$("#m_up").show();$("#m_down").show();$("#m_add").removeClass('mboder');}rMenu.css({ "top": y + "px", "left": x + "px", "visibility": "visible" });$("body").bind("mousedown", onBodyMouseDown);
}
//以藏右键面板
function hideRMenu() {if (rMenu) rMenu.css({ "visibility": "hidden" });$("body").unbind("mousedown", onBodyMouseDown);
}
//单击页面其他位置 隐藏右键面板
function onBodyMouseDown(event) {  if (!(event.target.id == "rMenu" || $(event.target).parents("#rMenu").length > 0)) {rMenu.css({ "visibility": "hidden" });}
}

3.4.3、新增节点

//增加节点
function addTreeNode() {hideRMenu();var name = new Date().getTime(); //利用时间戳生成节点名称,保证节点名称唯一var newNode = {name: name};if (zTree.getSelectedNodes()[0]) {newNode.checked = zTree.getSelectedNodes()[0].checked;newNode.pid = zTree.getSelectedNodes()[0].id;zTree.addNodes(zTree.getSelectedNodes()[0], newNode);} else {zTree.addNodes(null, newNode);}var node = zTree.getNodeByParam("name", name, null);  //得到新增加的节点zTree.selectNode(node);   //选中新增加的节点zTree.editName(node);     //让新增加的节点处于编辑状态
}

3.4.4、编辑节点

function editTreeNode() {var nodes = zTree.getSelectedNodes();  //得到选中节点集合if (nodes && nodes.length > 0) {var parent = nodes[0].getParentNode();  //得到选中节点的父节点if (parent) {nodes[0].pid = parent.id;  //如果选中节点父节点存在,将当前结点的pid属性值设置为父节点的id}zTree.editName(nodes[0]);  //让选中节点处于编辑状态}hideRMenu();     //隐藏右键面板
};

3.4.5、节点编辑状态离开时触发事件

//编辑并保存节点
function beforeRename(treeId, treeNode, newName, isCancel) {if (newName.length == 0) {   //节点名称判断alert("不能为空。");return false;}else {$.ajax({                  //数据入库type: "Post",url: "/Design/InsertOrUpdate",data: { "dto": { "Id": treeNode.id, "ParentId": treeNode.pid, "Name": newName } },success: function (data) {if (data.result == "Faild") {layerAlert("保存失败。");return false;}else {treeNode.id = data.result;  //将返回的id赋值给当前结点return true;}}});}
};

3.4.6、删除节点数据

function removeTreeNode() {hideRMenu();var nodes = zTree.getSelectedNodes();if (nodes && nodes.length > 0) {if (nodes[0].children && nodes[0].children.length > 0) {alert("包含下级,无法删除。");} else {if (confirm("该操作会将关联数据同步删除,是否确认删除?") == true) {$.ajax({type: "Post",url: "/Design/Delete",data: { "id": nodes[0].id },success: function (data) {if (data.result == "Success") {zTree.removeNode(nodes[0]);}else {alert("删除失败。");}}});};}}
};

3.5、一些总结

我们通常使用到树形控件做授权或关联类似的操作,一般会先全部取消勾选,然后根据选中的数据关联对树控件的复选框进行选中操作,在大数据量时,大约几万条数据,全部取消勾选+根据关联数据勾选相关节点这个操作通过js执行会很慢,这种情况建议在后台通过关联关系重新组织zTree需要的数据源,对每条数据(对应树节点)设置checked属性,然后再前台页面重新加载树,这种操作速度要快得多。

$.ajax({type: "Get",url: "/Model/GetRelationModelTreeData?designId=" + treeNode.id + "&t=" + new Date(),success: function (data) {//$.each(data.result, function (i, item) {//    var node = modelTree.getNodeByParam("id", item, null);//    modelTree.checkNode(node, true, true);//});$.fn.zTree.init($("#treejian"), setting1, data.result); //改为重新加载,比js循环勾选速度要快。}
});

四、最后

本人每篇文章都是一字一句码出来,希望对大家有所帮助,多提提意见。顺手来个三连击,点赞👍收藏💖关注✨,一起加油☕

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

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

相关文章

视频汇聚/云存储平台EasyCVR级联上级播放后一直发流是什么原因?

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

【Web前端实操12】将一个100*100的盒子,变成圆形

将一个100*100的盒子&#xff0c;变成圆形&#xff0c;是一个简单的实操&#xff0c;想要完成这个实操&#xff0c;最关键的是一个知识点&#xff0c;使用 CSS3 border-radius 属性&#xff0c;你可以给任何元素制作 "圆角" border-radius 属性&#xff0c;可以使用…

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…

【Linux】shell外壳和权限

文章目录 shell外壳用户切换权限 shell外壳 什么是shell外壳呢&#xff1f;首先我们应该知道&#xff0c;用户和操作系统内核是不能直接接触的&#xff0c;因为首先操作系统本身就很难去操作&#xff0c;另一方面也是为了操作系统安全考虑&#xff0c;不能让用户直接去操作内核…

JeecgBoot 3.6.1实现Modal对话框,以为审核数据为例

JeecgBoot 3.6.1实现Modal对话框 vue使用的是3.0版本 文章目录 JeecgBoot 3.6.1实现Modal对话框前言一、列表页面关键代码示例二、textAuditModal.vue代码示例三、test.api.ts总结 前言 在工作中&#xff0c;有一个需求&#xff0c;要求&#xff0c;在数据列表页&#xff0c;…

SUBMIT指定用户名错误

1、SUBMIT说明 在ABAP中&#xff0c;SUBMIT关键字用于运行另一个ABAP程序。通过SUBMIT关键字&#xff0c;可以在当前程序内部调用其他程序&#xff0c;而无需关闭当前程序。 SUBMIT语句的一般语法如下&#xff1a; "--------------------斌将军-------------------- SUB…

Java接收curl发出的中文请求无法解析

最近做项目遇到了这种情况&#xff0c;Java接收curl发出的中文请求无法解析&#xff0c;英文请求一切正常&#xff0c;中文请求则对方服务器无法解析&#xff0c;可以猜测是中文导致的编码问题&#xff0c;但是奇怪的是&#xff0c;本地输出json也没有乱码&#xff0c;编解码正…

leetcode:三数之和---双指针

问题&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

bean的一生

你曾读spring源码 “不知所云”、“绞尽脑汁”、“不知所措”嘛&#x1f923;&#x1f923;&#x1f923; 那这篇文章可能会对你有所帮助&#xff0c;小编尝试用简单、易懂的例子来模拟spring经典代码&#x1f449;Spring Bean生命周期及扩展点&#xff0c; 让你能够****轻松…

Linux系统Shell脚本编程之条件语句

一、条件测试 Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功&#xff0c;当返回值为0时表示成功&#xff0c;否则表示失败或异常&#xff08;非0值&#xff09;。使用专门的测试工具 test 命令&#xff0c;可以对特定条件进行测试&#xff0c;并…

BurpSuite Pro 2023.12.1.2下载与破解-最新版BurpSuite Pro

本文在我的博客地址是&#xff1a;https://h4cker.zip/post/f05ae2e66da503f6383dffe48cdf5bac 上一次BurpSuite的分享还是在2020年 由于CSDN有防盗链&#xff0c;我自己的博客都无法访问这篇博文的图片了 至于为什么再写一次&#xff0c;是因为我看到群里这张图&#xff1a;…

小型洗衣机哪家好?专门洗内衣内裤的小型洗衣机

内衣专用的洗衣机是一种专门设计用于洗涤内衣和贴身衣物的小型洗衣机。相比于普通的大型洗衣机&#xff0c;这样的小型洗衣机在设计和功能上有很大的区别。内衣专用的迷你洗衣机可以有效地保护内衣和贴身衣物的质量和卫生。在传统的洗衣机中&#xff0c;如果经常将内衣裤、袜子…

mask transformer相关论文阅读

前面讲了mask-transformer对医学图像分割任务是非常适用的。本文就是总结一些近期看过的mask-transformer方面的论文。 因为不知道mask transformer是什么就看了一些论文。后来得出结论&#xff0c;应该就是生成mask的transformer就是mask transformer。 相关论文&#xff1a; …

【复现】奥威亚视屏云平台文件读取漏洞_27

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 奥威亚视屏云平台拥有丰富的应用模块&#xff0c;包括结对帮扶、网络教研、教研共同体、优课汇聚、教学资源、在线巡课、AI课堂分…

eBay在人工智能道路上的成败得失:衡量标准是关键

我是2006年加入eBay的。2009年&#xff0c;这家公司的运营状况非常糟糕&#xff0c;其股价创历史新低&#xff08;远低于近24美元的历史高位&#xff09;&#xff0c;还出现削减各项成本、负增长、市场占有率降低、技术团队缺乏创新能力等情况。 简而言之&#xff0c;eBay公司…

从零开始:Git 上传与使用指南

Git 是一种非常强大的版本控制系统&#xff0c;它可以帮助您在多人协作开发项目中更好地管理代码版本&#xff0c;并确保每个团队成员都能及时地获取最新的代码更改。在使用 Git 进行版本控制之前&#xff0c;您需要先进行一些设置&#xff0c;以确保您的代码能够顺利地与远程仓…

【C++】类与对象(上)

我们好像在没接触过编程语言时就听说 C语言时面向过程&#xff0c;而CPP&#xff0c;java…是面向对象&#xff0c; 当时看不懂也不理解&#xff0c;现在看懂了却还是没有理解 本篇文章我们会一起初步认识C的灵魂&#xff1a;类 目录 面向过程与面向对象的初步认识&#xff1…

量子网络是什么

量子网络是基于量子力学规律对量子信息进行存储、处理和传输的物理装置&#xff0c;是实现量子通讯和大规模量子计算的基础。清华大学研究团队利用同种离子的双类型量子比特编码&#xff0c;在国际上首次实现无串扰的量子网络节点&#xff0c;对未来实现量子通讯和大规模量子计…

程序媛的mac修炼手册-- 如何用Python节省WPS会员费

上篇分享了如何用微博爬虫&#xff0c;咱举例爬了女明星江疏影的微博数据。今天就用这些数据&#xff0c;给大家安利一下怎么用Python实现WPS中部分Excel付费功能。 MacOS系统自带的工具&#xff0c;绝大多数都非常顶&#xff0c;除Numbers外。当然&#xff0c;page比起word来&…

gin中使用swagger生成接口文档

想要使用gin-swagger为你的代码自动生成接口文档&#xff0c;一般需要下面三个步骤&#xff1a; 按照swagger要求给接口代码添加声明式注释&#xff0c;具体参照声明式注释格式。使用swag工具扫描代码自动生成API接口文档数据使用gin-swagger渲染在线接口文档页面 第一步&…