当前位置: 首页 > 编程日记 > 正文

openstack页面自定义插件使用详解(django、ajax、post)(zTree为例)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如有转载,请保留源作者博客信息。

Better Me的博客:blog.csdn.net/tantexian

如需交流,欢迎大家博客留言。


1、鉴于国内java开发人员比较多,java web方面的技术比较成熟。所以用python django(openstack)框架和java的strurs做个类比,让大家能够更直观的理解、更快的进入到开发中:


附图大致对比下,具体细节,自行查找相关资料:

2、接下来正式开始讲解,如何在openstack中使用自定义插件,本文以Jquery zTree树形插件为例。
第一步封装url地址,请求数据,在urls中自定义url:
为了方便后续大家复制代码,也顺带附上源代码
urlpatterns = patterns('',
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<tenant_id>[^/]+)/update/$',views.UpdateIsolationView.as_view(), name='update'),
    url(r'^(?P<tenant_id>[^/]+)/tree/$',views.TreeView.as_view(), name='tree'),
    url(r'^(?P<tenant_id>[^/]+)/get_tree_data/$',views.JSONGetView.as_view(), name='get_tree_data'),
    url(r'^(?P<tenant_id>[^/]+)/set_tree$',views.JSONSetView.as_view(), name='set_tree'),
)


3、根据url规则匹配到对应的views的JSONGetView类:

from django.views import generic
from django.http import HttpResponse # noqa
import json
class JSONGetView(generic.View):
    def get(self, request, *args, **kwargs):  #定义get方法
        tenant_id = self.kwargs["tenant_id"]  #从url中截取参数值tenant_id
        aggregates = []
        try:
            aggregates = api.nova.aggregate_details_list(self.request)
            api.nova.isolatation_tree_list(self.request, tenant_id)
        except Exception:
            exceptions.handle(request,
                              _('Unable to retrieve host aggregates list.'))
        aggregates.sort(key=lambda aggregate: aggregate.name.lower())
#调用底层api 构造 zTree的数据
        tree_list = []
        for ag in aggregates:
            tree_data = {}
            tree_data['id'] = ag.availability_zone
            tree_data['name'] = ag.availability_zone
            tree_data['pId'] = 'NULL'
            tree_data['open'] = 'true'
            if tree_data not in tree_list:
                tree_list.append(tree_data)
            tree_data = {}
            tree_data['id'] = ag.name
            tree_data['name'] = ag.name
            tree_data['pId'] = ag.availability_zone
            tree_data['open'] = 'true'
            if tree_data not in tree_list:
                tree_list.append(tree_data)
            for hostname in ag.hosts:
                tree_data = {}
                tree_data['id'] = hostname
                tree_data['name'] = hostname
                tree_data['pId'] = ag.name
                tree_data['open'] = 'true'
                if tree_data not in tree_list:
                    tree_list.append(tree_data)
        result = json.dumps(tree_list)  #此处将python对象转换成json对象
        print (result)
        return HttpResponse(result,content_type="application/json")

4、到此获取数据的url完成,测试下url(浏览器直接访问):
http://192.168.10.31/dashboard/admin/isolations/2a4fe5e733e44982b1d576c5a0fe4bfd/get_tree_data/
得到数据:
[{
"open": "true",
"pId": "NULL",
"id": "zone1",
"name": "zone1"
},
{
"open": "true",
"pId": "zone1",
"id": "ag1",
"name": "ag1"
},
{
"open": "true",
"pId": "ag1",
"id": "node32",
"name": "node32"
},
{
"open": "true",
"pId": "ag1",
"id": "node31",
"name": "node31"
},
{
"open": "true",
"pId": "zone1",
"id": "ag2",
"name": "ag2"
},
{
"open": "true",
"pId": "ag2",
"id": "node33",
"name": "node33"
},
{
"open": "true",
"pId": "NULL",
"id": "zone2",
"name": "zone2"
},
{
"open": "true",
"pId": "zone2",
"id": "ag3",
"name": "ag3"
},
{
"open": "true",
"pId": "ag3",
"id": "node35",
"name": "node35"
},
{
"open": "true",
"pId": "ag3",
"id": "node34",
"name": "node34"
}]
url能正确获取数据,测试通过。


5、用ajax在html页面中请求该url获取数据:
先附上页面模板代码:

其中javascript要写在标签{% block modal-body %}中才能失效,具体的zTree的js导入本文使用了为压缩的方式,直接导入。


{# add by ttx 2014-9-25#}
  <link rel="stylesheet" href="{{ STATIC_URL }}dashboard/js/zTree/css/demo.css" type="text/css">
 <link rel="stylesheet" href="{{ STATIC_URL }}dashboard/js/zTree/css/zTreeStyle/zTreeStyle.css" type="text/css">
 <script type="text/javascript" src="{{ STATIC_URL }}dashboard/js/zTree/js/jquery.ztree.core-3.5.js"></script>
 <script type="text/javascript" src="{{ STATIC_URL }}dashboard/js/zTree/js/jquery.ztree.excheck-3.5.js"></script>
zTree插件路径:

详解ajax请求:
var url = '/dashboard/admin/isolations/{{ tenant_id }}/get_tree_data';  #此处为ajax的url地址,与步骤4中浏览器访问一致
 $.ajax({  #其中$代表Jquery插件,ajax为Jquery插件的方法
             type: "get",  #type主要有get、post。其中get用于获取数据,是幂等操作、post用于跟新数据
             async: false,  #false代码同步刷新,true代表异步刷新。本示例需要等到数据返回再进行tree的渲染,因此需要同步
             url: url,  #请求的url地址
             dataType: "json",  #数据返回类型为json
              success: function (data) {  #ajax请求成功之后得到数据data,执行success:后面function里面代码
                           json = JSON.stringify(data);
                           host_tree_data = JSON.parse(json)
                }
});
更多ajax详细使用讲解请自行参考相关资料。

后续就是具体的zTree根据得到的数据host_tree_data ,生成zone、aggregate、host的节点树,附上简单代码,不详解:
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}create_image_form{% endblock %}
{% block form_action %}{% url 'horizon:admin:images:create' %}{% endblock %}
{% block form_attrs %}enctype="multipart/form-data"{% endblock %}
{% block modal-header %}{% trans "Isolatation tree" %}{% endblock %}
{% block modal-body %}
 <SCRIPT type="text/javascript">
  <!--
  var setting = {
   view: {
    selectedMulti: false
   },
   check: {
    enable: true
   },
   data: {
    simpleData: {
     enable: true
    }
   },
   callback: {
    beforeCheck: beforeCheck,
    onCheck: onCheck
   }
  };
  var code, log, className = "dark";
  function beforeCheck(treeId, treeNode) {
   className = (className === "dark" ? "":"dark");
   showLog("[ "+getTime()+" beforeCheck ]&nbsp;&nbsp;&nbsp;&nbsp;" + treeNode.name );
   return (treeNode.doCheck !== false);
  }
  function onCheck(e, treeId, treeNode) {
   showLog("[ "+getTime()+" onCheck ]&nbsp;&nbsp;&nbsp;&nbsp;" + treeNode.name );
            getAllChangeNodes()
  }
        function getAllChangeNodes() {
   var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
            var nodes = treeObj.getChangeCheckedNodes();
            $('#mytest').html(JSON.stringify(nodes));
            var url = '/dashboard/admin/isolations/{{ tenant_id }}/set_tree';
            var data={};
            data["jsonTree"] = JSON.stringify(nodes);
            jQuery.ajax({
                type:"POST",
                url : url,
                data:data,
                dataType : "json",
                beforeSend: function(xhr, settings){
                      var csrftoken = $.cookie('csrftoken');
                      xhr.setRequestHeader("X-CSRFToken", csrftoken);
                  },
                success : function(data) {
                }
            });
  }
  function showLog(str) {
   if (!log) log = $("#log");
   log.append("<li class='"+className+"'>"+str+"</li>");
   if(log.children("li").length > 6) {
    log.get(0).removeChild(log.children("li")[0]);
   }
  }
  function getTime() {
   var now= new Date(),
   h=now.getHours(),
   m=now.getMinutes(),
   s=now.getSeconds(),
   ms=now.getMilliseconds();
   return (h+":"+m+":"+s+ " " +ms);
  }
  function checkNode(e) {
   var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
   type = e.data.type,
   nodes = zTree.getSelectedNodes();
   if (type.indexOf("All")<0 && nodes.length == 0) {
    alert("请先选择一个节点");
   }
   if (type == "checkAllTrue") {
    zTree.checkAllNodes(true);
   } else if (type == "checkAllFalse") {
    zTree.checkAllNodes(false);
   } else {
    var callbackFlag = $("#callbackTrigger").attr("checked");
    for (var i=0, l=nodes.length; i<l; i++) {
     if (type == "checkTrue") {
      zTree.checkNode(nodes[i], true, false, callbackFlag);
     } else if (type == "checkFalse") {
      zTree.checkNode(nodes[i], false, false, callbackFlag);
     } else if (type == "toggle") {
      zTree.checkNode(nodes[i], null, false, callbackFlag);
     }else if (type == "checkTruePS") {
      zTree.checkNode(nodes[i], true, true, callbackFlag);
     } else if (type == "checkFalsePS") {
      zTree.checkNode(nodes[i], false, true, callbackFlag);
     } else if (type == "togglePS") {
      zTree.checkNode(nodes[i], null, true, callbackFlag);
     }
    }
   }
  }
  function setAutoTrigger(e) {
   var zTree = $.fn.zTree.getZTreeObj("treeDemo");
   zTree.setting.check.autoCheckTrigger = $("#autoCallbackTrigger").attr("checked");
   $("#autoCheckTriggerValue").html(zTree.setting.check.autoCheckTrigger ? "true" : "false");
  }
  $(document).ready(function(){
            var url = '/dashboard/admin/isolations/{{ tenant_id }}/get_tree_data';
            $.ajax({
                       type: "get",
                       async: false,
                       url: url,
                       dataType: "json",
                       success: function (data) {
                           json = JSON.stringify(data);
                           host_tree_data = JSON.parse(json)
                       }
                   });
            var zNodes =[
                            { id:1, pId:0, name:"1", open:true},
                            { id:11, pId:1, name:"1-1"},
                            { id:12, pId:1, name:"1-2"},
                            { id:111, pId:11, name:"1-1-1","checked":"true"},
                            { id:112, pId:11, name:"1-1-2"},
                        ];
   $.fn.zTree.init($("#treeDemo"), setting, host_tree_data);
   $("#checkTrue").bind("click", {type:"checkTrue"}, checkNode);
   $("#checkFalse").bind("click", {type:"checkFalse"}, checkNode);
   $("#toggle").bind("click", {type:"toggle"}, checkNode);
   $("#checkTruePS").bind("click", {type:"checkTruePS"}, checkNode);
   $("#checkFalsePS").bind("click", {type:"checkFalsePS"}, checkNode);
   $("#togglePS").bind("click", {type:"togglePS"}, checkNode);
   $("#checkAllTrue").bind("click", {type:"checkAllTrue"}, checkNode);
   $("#checkAllFalse").bind("click", {type:"checkAllFalse"}, checkNode);
   $("#autoCallbackTrigger").bind("change", {}, setAutoTrigger);
  });
  //-->
 </SCRIPT>
<h1>用 zTree 方法 勾选 checkbox</h1>
<h6>[ 文件路径: excheck/checkbox_fun.html ]</h6>
<div class="content_wrap">
 <div class="zTreeDemoBackground left">
  <ul id="treeDemo" class="ztree"></ul>
 </div>
</div>
 <div>
  <ul class="info">
            <div id="mytest">11111111111111111111111111111111111111111111</div>
   <li class="title"><h2>1、beforeCheck / onCheck 事件回调函数控制</h2>
    <ul class="list">
    <li>利用 beforeCheck / onCheck 事件回调函数 可以控制是否允许 更改 节点勾选状态,这里简单演示如何监控此事件</li>
    <li><p>这里还演示了 checkNode / checkAllNodes 方法触发 beforeCheck / onCheck 事件回调函数的情况,试试看:<br/>
     &nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" id="autoCallbackTrigger" /> setting.check.autoCheckTrigger: <span id="autoCheckTriggerValue">false</span><br/>
     &nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" id="callbackTrigger" checked /> 执行勾选方法是否触发 callback <br/>
     &nbsp;&nbsp;&nbsp;&nbsp;单节点--[ <a id="checkTrue" href="#" title="不想勾选我就不勾选你..." οnclick="return false;">勾选</a> ]
     &nbsp;&nbsp;&nbsp;&nbsp;[ <a id="checkFalse" href="#" title="不想取消勾选我就不取消你..." οnclick="return false;">取消勾选</a> ]
     &nbsp;&nbsp;&nbsp;&nbsp;[ <a id="toggle" href="#" title="你想怎样?..." οnclick="return false;">勾选 切换</a> ]<br/>
     &nbsp;&nbsp;&nbsp;&nbsp;单节点 ( 影响父子 )--[ <a id="checkTruePS" href="#" title="不想勾选我就不勾选你..." οnclick="return false;">勾选</a> ]
     &nbsp;&nbsp;&nbsp;&nbsp;[ <a id="checkFalsePS" href="#" title="不想取消勾选我就不取消你..." οnclick="return false;">取消勾选</a> ]
     &nbsp;&nbsp;&nbsp;&nbsp;[ <a id="togglePS" href="#" title="你想怎样?..." οnclick="return false;">勾选 切换</a> ]<br/>
     &nbsp;&nbsp;&nbsp;&nbsp;全部节点--[ <a id="checkAllTrue" href="#" title="不管你有多NB,统统都要听我的!!" οnclick="return false;">勾选</a> ]
     &nbsp;&nbsp;&nbsp;&nbsp;[ <a id="checkAllFalse" href="#" title="不管你有多NB,统统都要听我的!!" οnclick="return false;">取消勾选</a> ]</p>
    </li>
    <li><p><span class="highlight_red">使用 zTreeObj.checkNode / checkAllNodes 方法,详细请参见 API 文档中的相关内容</span><br/>
     beforeCheck / onCheck log:<br/>
     <ul id="log" class="log" style="height:130px;"></ul></p>
    </li>
    </ul>
   </li>
   <li class="title"><h2>2、setting 配置信息说明</h2>
    <ul class="list">
    <li>同 "checkbox 勾选操作" 中的说明</li>
    </ul>
   </li>
   <li class="title"><h2>3、treeNode 节点数据说明</h2>
    <ul class="list">
    <li>同 "checkbox 勾选操作" 中的说明</li>
    </ul>
   </li>
  </ul>
 </div>
{% endblock %}
{% block modal-footer %}
  <input class="btn btn-primary pull-right" type="submit" value="{% trans "Save" %}" />
  <a href="{% url 'horizon:admin:images:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}
跟多zTree使用,请自行参考zTree官网:www.ztree.me/

页面最终展示:
此处的zTree页面比较丑,可以修改css样式,调整,附上bootstrap风格的树形插件样式。 http://www.js-css.cn/jscode/nav/nav23/

到此通过ajax获取数据到页面展示讲解完毕。

6、讲完ajax从后台获取数据到前台接下来讲解,如何通过ajax,把页面的数据传递给后台处理:
附上代码:
function getAllChangeNodes() {
   var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
            var nodes = treeObj.getChangeCheckedNodes();
            $('#mytest').html(JSON.stringify(nodes));  #JSON.stringify(nodes)将js对象nodes,转化为json对象
            var url = '/dashboard/admin/isolations/{{ tenant_id }}/set_tree';
            var data={};  #url中传递的数据,相当于$url?jsonTree=JSON.stringify(nodes)
            data["jsonTree"] = JSON.stringify(nodes);
            jQuery.ajax({
                type:"POST",  #ajax类型,post进来进行更新
                url : url,
                data:data,
                dataType : "json",
                beforeSend: function(xhr, settings){  #此处的beforeSend用来解决ajax在django中报csrftoken错误
                      var csrftoken = $.cookie('csrftoken');
                      xhr.setRequestHeader("X-CSRFToken", csrftoken);
                  },
                success : function(data) {  #ajax请求成功之后执行
                }
            });
  }

根据上述 url = '/dashboard/admin/isolations/{{ tenant_id }}/set_tree';到urls.py中找对应匹配的url:
urlpatterns = patterns('',
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<tenant_id>[^/]+)/update/$',views.UpdateIsolationView.as_view(), name='update'),
    url(r'^(?P<tenant_id>[^/]+)/tree/$',views.TreeView.as_view(), name='tree'),
    url(r'^(?P<tenant_id>[^/]+)/get_tree_data/$',views.JSONGetView.as_view(), name='get_tree_data'),
    url(r'^(?P<tenant_id>[^/]+)/set_tree$',views.JSONSetView.as_view(), name='set_tree'),
)



根据url匹配规则,跟进到 JSONSetView:
class JSONSetView(generic.View):
    def post(self, request, *args, **kwargs):  #因为ajax的请求类型为post因此实现post函数,否则会报错
        tenant_id = self.kwargs["tenant_id"]  #从URL中获取tenant_id
        json_tree = request.POST.get("jsonTree")  #从ajax发过来的请求中获取jsonTree json数据
        tree_change_nodes = json.loads(json_tree)  #将页面传递的json数据,转换为python对象,具体转换规则自行参考
#此处根据前端传送的数据,调用api传递给后端处理
        api.nova.isolatation_add_tree(request, tenant_id, tree_change_nodes) 
        return HttpResponse(tree_change_nodes,content_type="application/json")

讲解完毕!

转载于:https://my.oschina.net/tantexian/blog/625940

相关文章:

lazyload.js实现图片异步延迟加载

所谓图片异步加载&#xff0c;意思是不用一次把图片全部加载完&#xff0c;你可以叫它延迟加载&#xff0c;缓冲加载都行。 看看你有没有这种需求&#xff1a;某篇文章图片很多&#xff0c;如果在载入文章时就载入所有图片&#xff0c;无疑会延缓载入速度&#xff0c;让用户等…

postfilter中文什么意思_Filterpost请求中文字符编码的过滤器 --学习笔记

java代码&#xff1a;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Lo…

错误:You can't specify target table 'xxx' for update in FROM clause的解决

今天在MySQL数据库删除重复数据的时候遇到了一个问题。如下脚本&#xff1a; DELETE FROM tempA WHERE tid IN ( SELECT MAX(tid) AS tid FROM tempA GROUP BY name,age ) 会出现报错信息&#xff1a; You cant specify target table tempA for update in FROM clause 大致意思…

HTTPS的七个神话(译文)

原文网址&#xff1a;http://blog.httpwatch.com/2011/01/28/top-7-myths-about-https/ 译文地址&#xff1a;http://www.ruanyifeng.com/blog/2011/02/seven_myths_about_https.html 误解七&#xff1a;HTTPS无法缓存 许多人以为&#xff0c;出于安全考虑&#xff0c;浏览器不…

蓝牙写入数据库_蓝牙 数据写入 简单易懂版(适合没写过蓝牙的看)

//字符串转arrbufferfunction string2buffer(str) {// 首先将字符串转为16进制let val ""for (let i 0; i < str.length; i) {if (val ) {val str.charCodeAt(i).toString(16)} else {val , str.charCodeAt(i).toString(16)}}// 将16进制转化为ArrayBufferr…

Educational Codeforces Round 9 F. Magic Matrix 最小生成树

F. Magic Matrix题目连接&#xff1a; http://www.codeforces.com/contest/632/problem/F Description Youre given a matrix A of size n  n. Lets call the matrix with nonnegative elements magic if it is symmetric (so aij  aji), aii  0 and aij ≤ max(aik, …

【SqlServer】SqlServer中的更新锁(UPDLOCK)

UPDLOCK.UPDLOCK 的优点是允许您读取数据&#xff08;不阻塞其它事务&#xff09;并在以后更新数据&#xff0c;同时确保自从上次读取数据后数据没有被更改。当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁&#xff0c;从而加上锁的记录在其它的线程中是不能更改的只能…

Oracle CDC (Change Data Capture)更新数据捕获——概述

Change Data Capture能高效识别并捕获数据的插入、修改和删除&#xff0c;使更新数据供个人或应用使用。 CDC从oracle 9i开始引入&#xff0c;//TODO 在11G R2之后的版本里将取消支持&#xff0c;被Oracle GoldenGate取代。 CDC的一些概念 CDC有同步和异步两种模式&#xff0c;…

flutter ios启动白屏_Flutter技术架构概览

前言最近在整理各种技术架构&#xff0c;给自己的列了个TODO list&#xff0c;希望能在几个月的时间内&#xff0c;研究完各种前端技术架构&#xff0c;包括移动端技术架构。今天分享一下自己整理的flutter技术架构。完整的技术架构TODO list可以去我的github仓库查看&#xff…

SQL Relay开源的数据库池连接代理服务器

一、SQL Relay是什么&#xff1f; SQL Relay是一个开源的数据库池连接代理服务器 二、SQL Relay支持哪些数据库&#xff1f;* Oracle* MySQL* mSQL* PostgreSQL* Sybase* MS SQL Server* IBM DB2* Interbase* Sybase* SQLite* Lago* ODBC* MS Access三、安装和配置&#xff1b;…

关于Android开源库分享平台,(GitClub)微信小程序的开发体验

七八月份的深圳一直在下雨&#xff0c;总有人说雨天适合窝在家看书&#xff0c;对于程序开发者来说更是难得的学习机会。我们502工作室的小伙伴利用这个时间学习了一下微信小程序开发&#xff0c;并上线了一个GitClub小程序&#xff0c;目前功能有些简陋&#xff0c;难免有辣眼…

RSync实现文件备份同步

rsync是类unix系统下的数据镜像备份工具&#xff0c;从软件的命名上就可以看出来了——remote sync。它的特性如下&#xff1a;1、可以镜像保存整个目录树和文件系统。2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。3、无须特殊权限即可安装。4、优化的流程&#…

Hibernate annotation多对多配置

角色&#xff08;用户组&#xff09;&#xff0c;用户多对多。 角色实体配置&#xff1a; private Set<TAuthUser> users;ManyToManyJoinTable(name"t_auth_user_role",joinColumns{JoinColumn(name"role_id")},inverseJoinColumns{JoinColumn(name&…

ajax中的url如何传递变量_如何创建和参数化UDT数据类型中的变量及IN,OUT 等参数?...

从数据类型的意义上说 UDT 并不被 CPU 所识别&#xff0c;而是在离线程序中自定义(组合)的数据类型。 S7 程序的自定义数据类型并不能装载到 S7 CPU 中。UDT 是由递增的编辑器创建并编辑或由源文件的编译而生成。 当在块调用中进行变量传递时是不能将 UDT 作为内存地址区域来传…

[雪峰磁针石博客]kotlin书籍汇总

2019独角兽企业重金招聘Python工程师标准>>> 下载地址 Learning Kotlin by Building Android Applications - 2018 初级 Develop amazing applications that will help you understand and explore the fundamentals of Kotlin while covering 3 various types of p…

web集群时session同步的3种方法

web集群时session同步的3种方法在做了web集群后&#xff0c;你肯定会首先考虑session同步问题&#xff0c;因为通过负载均衡后&#xff0c;同一个IP访问同一个页面会被分配到不同的服务器上&#xff0c;如果session不同步的话&#xff0c;一个登录用户&#xff0c;一会是登录状…

属于python文件的操作有_Python的文件操作

1、初始文件操作1、使用python读写文件使用open()函数获取文件句柄&#xff0c;就可以操作文件了&#xff0c;根据打开方式不同能执行的操作也不同。打开方式有&#xff1a;r、w、a、r、w、a、rb、wb、ab、rb、wb、ab&#xff0c;默认用的是r模式2、只读操作(r、rb)2.1、只读模…

[iOS]开发者证书和描述文件的作用

先说下证书吧。 然后是描述文件 转载于:https://www.cnblogs.com/wangqi1221/p/5240273.html

单元格编辑后级联汇总刷新

单元格编辑 级联刷新 PDERPDB db new PDERPDB(); int conid 0; int pid 0; string sql ""; string sqlC ""; if (int.TryParse(Pid, out pid)) { sql string.Format(" UPDATE JL_Project set PCMoney{0} where Pid{1};", pcmoney, Pid); }…

HTTP 协议的通用头域via 的意义以及作用

列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器&#xff0c;他们用 什么协议&#xff08;和版本&#xff09;发送的请求。 当客户端请求到达第一个代理服务器时&#xff0c;该服务器会在自己发出的请求里面 添…

6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版...

课本源码部分 第6章 树和二叉树 - 树的双亲表示法 ——《数据结构》-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ 《数据结构-C语言版》&#xff08;严蔚敏,吴伟民版&#xff09;课本源码习题集解析使用说明 课本源码合辑 链接☛☛☛ 《数据结构》课本源码合辑 习题集全解析 …

压力测试 闪存_产品评测 | HPE Nimble AF全闪存系列,诠释真正的高端存储

随着AI、互联网、大数据等技术快速发展&#xff0c;企业对存储设备的需求已踏上一个更高的级别&#xff0c;高性能、低延时、大容量等多种需求的应用场景愈发常见&#xff0c;在这种情况下&#xff0c;寻求能够满足相应工作负载能力的存储设备已成为企业IT管理者的当务之急。这…

Mysql无法选取非聚合列

教程所示图片使用的是 github 仓库图片&#xff0c;网速过慢的朋友请移步>>> &#xff08;原文&#xff09;Mysql 无法选取非聚合列。 更多讨论或者错误提交&#xff0c;也请移步。 1. 前言 最近升级博客&#xff0c;给文章页面底部增加了两个按钮&#xff0c;可以直接…

网络设置巨形帧_Trunk的概念与设置

在二层交换机的性能参数中&#xff0c;常常提到一个重要的指标&#xff1a;TRUNK &#xff0c;许多的二层交换机产品在介绍其性能时&#xff0c;都会提到能够支持TRUNK 功能&#xff0c;从而可以为互连的交换机之间提供更好的传输性能。那到底什么是TRUNK呢&#xff1f;使用TRU…

epoll使用详解

epoll的工作原理是&#xff0c;你如果想进行IO操作时&#xff0c;先向epoll查询是否可读或可写&#xff0c;如果处于可读或可写状态后&#xff0c;epoll会通过epoll_wait函数通知你&#xff0c;此时你再进行进一步的recv或send操作。epoll仅仅是一个异步事件的通知机制&#xf…

软件测试(一)

最近的时间内&#xff0c;我印象最深刻的Bug是在上学期的javaweb的大作业中。 其中的要求是在工作人员的每一条记录后面添加一个修改按钮&#xff0c;要求把前一个页面的内容带入到下一个页面中&#xff0c;由于密码采用的是MD5的加密&#xff0c;所以带入到后面的页面中的内容…

网络分流器-网络分流器IP网络路由交换测试技术探讨

网络分流器1 . 与流量相关的L2-3层高级测试技术探讨戎腾网络分流器: 对于一个L2-3层网络设备&#xff0c;最基本、最重要的测试是流量转发性能测试。作为一个网络转发设备&#xff0c;首先要保证可以高速、低时延、稳定地转发流量。相关的性能测试通常是通过流量生成器&#xf…

浅谈https\ssl\数字证书

在互联网安全通信方式上&#xff0c;目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了。本文追本溯源围绕这个模式谈一谈。 名词解释 首先解释一下上面的几个名词&#xff1a; https&#xff1a;在http(超文本传输协议)基础上提出的一种安全的http协议&#xf…

input不管用 vue_Vue自定义指令实现快速读取Excel

前几天因为业务需求&#xff0c;所维护的而后台中出现了大量关于上传下载Excel的操作。因为我们的后台是基于Vue&#xff0c;并且是在 vue-element-admin 的基础上结合实际需求开发而来。vue-element-admin 中也有一些相关操作 Excel 的示例&#xff0c;都十分清晰明了&#xf…

数据结构——算法之(010)( 字符串的左旋转操作)

【申明&#xff1a;本文仅限于自我归纳总结和相互交流&#xff0c;有纰漏还望各位指出。 联系邮箱&#xff1a;Mr_chenping163.com】 题目&#xff1a;定义字符串的左旋转操作&#xff1a;把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cde…