jq插件:jqgrid和validform的二次封装

做久了vue和react框架项目,偶尔也需要做做原生的项目。不可否认vue的双向绑定机制确实很香,但是也是建立在原生js基础上。所以,只有做更多的原生js项目,才能更加了解vue框架的底层原理。在日常开发中,也会不可避免的会遇到原生开发的需求。这里主要介绍下jqgrid和validform这两种插件的用法及二次封装

1. 表格数据处理插件:jqGrid

插件使用api说明:jqGrid APi 详解_小戴BOTAOY演示博客

官方api文档说明:jqGrid demos-jqGrid实例-中文-mn886.net

colModel参数说明:https://www.cnblogs.com/qing123/p/3801691.html 

jqgrid是一款基于jq的表单数据处理插件, 在做表格渲染时,可以让我们只关注数据的处理,而不用去注重dom的元素,而且插件自带的增删改查操作,以及自定义事件的方法都可以帮助我们处理各种各样不同的业务需求。多达几十个参数的配置和十几种实例方法的选择。可以说基本上能满足大部分的表格业务需求了。

效果展示

 jqgrid本身的框架样式并不美观,不过好在提供了几种皮肤选择。这里用的bootstrap皮肤,主要是做一下按钮的美化。引入的bootstrap版本是Bootstrap v3.3.7

jqgrid的配置项和方法实在太多了,因此这里做了极致封装。我们先来看下封装后的使用代码:

<div class="jarviswidget  jarviswidget-sortable">
    <div class="widget-body" id="content">
        <div class="table-responsive">
            <table id="jqgrid"></table>
        </div>
    </div>
</div>
<div id="jqgrid_pager"></div>

<script>
    //api文档说明 https://www.yii666.com/article/423468.html?action=onAll colModel参数说明:https://www.cnblogs.com/qing123/p/3801691.html
    $(document).ready(function() {
        // 初始化 jqGrid
        var jqgridTable = createJqGridTable();

        var obj = [
            {"value":"id","title":"ID",editable:false},
            {"value":"pname","title":"字典分组"},
            {"value":"fieldName","title":"字典类型"},
            {"value":"text","title":"字典标签"},
            {"value":"realValue","title":"字典键值"},
            {"value":"remark","title":"备注"},
        ]
        jqgridTable.createGrid({
            caption: "数据列表",  //表格标题,可以去掉
            showRowNumbers:'true', //是否展示序号列,默认展示true.可以去掉
            url: "/manage/system/dictionary/list", // 数据源URL
            colData:obj,
        });
        jqgridTable.setupNavGridEvents({editurl:"/manage/system/dictionary/saveOrUpdate",refresh:true,search:false,edit : true,add : true,del : true})  //导航栏内置操作事件
    });
</script>

 就是这么简单,不过百行代码就可以完成一个表格数据的显示,增删改操作。导航栏自带的增删改操作传递的参数就是数据列表中的键值。也是比较符合通常情况下前后端列表对接的参数需求的。当然,如果你需要额外自定义也是可以的。下面我们再来看看封装方法。

 /***表格封装jqgrid  开始 ***/
      function createJqGridTable() {
        var jqgridTable = {
          createGrid: function (options) {
            var defaultOptions = {
              // 默认的jqGrid配置项
              gridId:'#jqgrid',
              contentId:'content',
              url: "",
              data:"",
              datatype: "json",
              mtype: "post",//向后台请求数据的ajax的类型。可选post,get
              showRowNumbers:false,
              colData:[],
              colNames: [],
              colModel: [],
              rowNum: 10,
              rowList: [10, 20, 30],
              pager: "#jqgrid_pager",
              sortname: "", // 默认排序列
              sortorder: "desc", // 默认排序方式
              viewrecords: true, // 显示总记录数
              caption: "",        // 表格标题
              height: "auto",     //自适应高度
              autowidth: true,     //自适应宽度
              multiselect: false,  //是否多选
              onSelectRow: null,
              ondblClickRow: null,
              jsonReader : {
                id:"id",           //设置唯一标识
                repeatitems: true, // 指示每个行数据是否是一个包含字段名和值的对象
                root: "rows",        // 数据列表
                page:"page",         //当前页
                total: "total",        // 总页数
                records:"records"  //总条数
              },
              cmTemplate: { cellattr: function (rowId, cellValue, rowData, colData) { return 'style="line-height:30px"'; } },
              loadComplete: null,
              gridComplete:null,  //jqGrid 渲染完成触发
              beforeProcessing: function (data) {  //数据加载之前的操作
                if(options.showRowNumbers){
                  var rows = data.rows;
                  for (var i = 0; i < rows.length; i++) {
                  var row = rows[i];
                  row.rowNumber = i + 1;
                }
                }
                
              },
              beforeRequest: function () {   //请求前处理
                var postData = $(this).jqGrid('getGridParam', 'postData');
                var form = document.getElementById("queryForm");
                var formData = serializeForm(form);
                var obj = $.extend({}, postData, formData);
                console.log("请求前传参:",obj);
                $(this).jqGrid('setGridParam', { postData: obj });
              },
            };
            // 合并默认配置和传入的配置项
            var gridOptions = $.extend({}, defaultOptions, options);

            //表数据处理
            if (gridOptions.showRowNumbers) {  //是否展示序号列
              gridOptions.colNames.push("序号");
              gridOptions.colModel.push({
                name: "rowNumber",
                index: "rowNumber",
                width: 50,
                align: "center",
                sortable: false,
                resizable: false,
                fixed: true, 
              });
            }
            

            $.each(gridOptions.colData, function(index, col) {
              gridOptions.colNames.push(col.title);
              var colModelItem = {
                name: col.value,
                index: col.value,
                width: col.width || 150,
                align: col.align || "center",
                editable: col.editable || true,
              };
              // 将 col 对象中的属性复制到 colModelItem 对象中
              $.extend(colModelItem, col);
              gridOptions.colModel.push(colModelItem);
            });
            // 创建jqGrid实例
            jsongrid = $(gridOptions.gridId).jqGrid(gridOptions);
            // 监听窗口大小变化事件
            $(window).on('resize.jqGrid', function () {
              $(gridOptions.gridId).jqGrid('setGridWidth', $("#" + gridOptions.contentId).width());
            });
            jqGridAfterLoadComplete();  //样式调整-表格数据
          },

          // 封装导航栏操作事件
          setupNavGridEvents: function (options) {
            var defaultOptions = {
              gridId:'#jqgrid',  //导航id
              pager:'#jqgrid_pager',
              refresh: false,
              search: false,
              edit: false,
              add: false,
              del: false,
              editurl: "", // 默认为空
            };

            var navGridOptions = $.extend({}, defaultOptions, options);

            $(navGridOptions.gridId).jqGrid('navGrid', navGridOptions.pager, navGridOptions,
                {
                  // 编辑操作的处理函数
                  closeAfterEdit: true,
                  beforeShowForm:null,  //显示弹窗前方法
                  onclickSubmit: null,  // 请求前
                  afterComplete: handleResponse
                },
                {
                  // 添加操作的处理函数
                  closeAfterAdd: true,
                  beforeShowForm:null,  //显示弹窗前方法
                  onclickSubmit: null,  // 请求前
                  beforeSubmit: function (postdata, formid) {
                    // 在提交之前修改 id 字段的值
                    postdata.id = '';
                    return [true, ''];
                  },
                  afterComplete: handleResponse
                },
                {
                  // 删除操作的处理函数
                  closeAfterDel: true,
                  beforeShowForm:null,  //显示弹窗前方法
                  onclickSubmit: null,  // 请求前
                  afterComplete: handleResponse
                }
            );
            // 设置 editurl
            if (navGridOptions.editurl) {
              $(navGridOptions.gridId).jqGrid('setGridParam', { editurl: navGridOptions.editurl });
            }
            jqGridAfterLoadComplete();  //样式调整-导航栏
          },

        }
        return jqgridTable;
      }
// 处理响应数据
    function handleResponse(response, postdata) {
      console.log(response, postdata);
      var result = response.responseJSON;
      showDialog({ msg: result.retMsg });
    }
    function serializeForm(form) {
      var formData = {};
      var dataArray = $(form).serializeArray();

      $(dataArray).each(function(index, field) {
        formData[field.name] = field.value;
      });
      return formData;
    }
    /***** 样式调整 *****/
    function jqGridAfterLoadComplete() {
      console.log("动态加载样式...")
      // remove classes
      $(".ui-jqgrid").removeClass("ui-widget ui-widget-content");
      $(".ui-jqgrid-view").children().removeClass("ui-widget-header ui-state-default");
      $(".ui-jqgrid-labels, .ui-search-toolbar").children().removeClass("ui-state-default ui-th-column ui-th-ltr");
      $(".ui-jqgrid-pager").removeClass("ui-state-default");
      $(".ui-jqgrid").removeClass("ui-widget-content");



      // add classes
      $(".ui-jqgrid-htable").addClass("table table-bordered table-hover");
      $(".ui-jqgrid-btable").addClass("table table-bordered table-striped");

      //样式优化
      $(".widget-body").css({padding:"0",border: "none"});

      $(".ui-pg-div").removeClass().addClass("btn btn-sm btn-primary");
      $(".ui-icon.ui-icon-plus").removeClass().addClass("fa fa-plus");
      $(".ui-icon.ui-icon-pencil").removeClass().addClass("fa fa-pencil").parent(".btn-primary").removeClass("btn-primary").addClass("btn-success");
      $(".ui-icon.ui-icon-trash").removeClass().addClass("fa fa-trash-o").parent(".btn-primary").removeClass("btn-primary").addClass("btn-danger");
      $(".ui-icon.ui-icon-search").removeClass().addClass("fa fa-search");
      $(".ui-icon.ui-icon-refresh").removeClass().addClass("fa fa-refresh");
      $(".ui-icon.ui-icon-disk").removeClass().addClass("fa fa-save").parent(".btn-primary").removeClass("btn-primary").addClass("btn-success");
      $(".ui-icon.ui-icon-cancel").removeClass().addClass("fa fa-times").parent(".btn-primary").removeClass("btn-primary").addClass("btn-danger");

      $( ".ui-icon.ui-icon-seek-prev" ).wrap( "<div class='btn btn-sm btn-default'></div>" );
      $(".ui-icon.ui-icon-seek-prev").removeClass().addClass("fa fa-backward");

      $( ".ui-icon.ui-icon-seek-first" ).wrap( "<div class='btn btn-sm btn-default'></div>" );
      $(".ui-icon.ui-icon-seek-first").removeClass().addClass("fa fa-fast-backward");

      $( ".ui-icon.ui-icon-seek-next" ).wrap( "<div class='btn btn-sm btn-default'></div>" );
      $(".ui-icon.ui-icon-seek-next").removeClass().addClass("fa fa-forward");

      $( ".ui-icon.ui-icon-seek-end" ).wrap( "<div class='btn btn-sm btn-default'></div>" );
      $(".ui-icon.ui-icon-seek-end").removeClass().addClass("fa fa-fast-forward");
    }
    /***表格封装结束***/

 后端返回列表数据格式:

 2.表单校验插件:validform

官方使用文档说明:http://www.5imoban.net/view/validform/document.html#getstart  

作为表单校验,主要用来校验表单是否必填吗,以及填入的数据格式是否正确。validform这个插件还是比较好用的,封装后会自动将表单的值做序列化处理传给后端。如果想额外加其他参数,也是可以在提交的时候进行插入一个type=hidden的表单值即可。先来看使用代码:

<div class="widget-body no-padding">
      <form action="/manage/system/dept/deptSaveOrUpdate" method="post" id="basicForm" class="smart-form" novalidate="novalidate">
        <fieldset>
          <div class="row">
            <section class="col col-4">
              <label class="label">分组名</label>
              <label class="input">
                <input type="text"  name="pname"  datatype="s5-16"  errormsg="昵称至少5个字符,最多16个字符!" />
              </label>
            </section>
            <section class="col col-4">
              <label class="label">字段名</label>
              <label class="input">
                <input type="text" name="fieldName"  class="invalid"  id="fieldName" datatype="s4-16"  errormsg="别名至少4个字符" />
              </label>
            </section>
          </div>
        </fieldset>
        <footer>
        	<input type="hidden" name="id" />
          <button type="submit" name="submit" id="btn_oper" class="btn btn-primary"> 保存 </button>
          <a class="btn btn-primary" href="#/manage/system/dept/deptsList" click="location.go(-1);"> 返回 </a>
        </footer>
      </form>
    </div>

<script type="text/javascript">
	pageSetUp();
    //表单验证及回调
    $(document).ready(function() {
     commonValidateForm({
      id: "#basicForm",
      beforeCheck:function(curform){
          var id=123;
          curform.find('[name="id"]').val(id); // 将额外参数值设置到隐藏字段
      },
      callBack:function (data){
          console.log("提交成功",data);
          //window.history.go(-1)
          return true;
      },
    });
</script>

validform的配置项及回调方法并不多,还是比较好上手的,看一下官方文档基本就会用了。下面是封装代码。

 //公共的表单验证.  使用文档说明:http://www.5imoban.net/view/validform/document.html#getstart  https://blog.csdn.net/kexiaoling/article/details/49639813
      //函数的主要参数是一个包含配置选项的对象 o,其中包括以下属性:
      // id:表单的选择器,默认为 #basicForm。
      // postonce:是否启用防止重复提交功能,默认为 true。
      // btnReset:重置按钮的选择器,默认为 #btn_reset。
      // btnSubmit:提交按钮的选择器,默认为 #btn_oper。
      // isReset:是否在提交后重置表单,默认为 true。
      // isReload:是否在提交后重新加载页面,默认为 false。
      // callBack:提交成功后的回调函数,默认为空函数。
      // beforeCheck:提交前的回调函数,默认为空函数。
      // datatype:自定义验证规则的配置对象,默认为空对象。
      // fillModel:与重置事件绑定的回调函数,用于填充表单数据,默认为空对象。
      // resetEventCallBack:重置事件的回调函数,默认为一个函数,会调用 fillModel 来填充表单数据。
      // 函数返回一个 Validform 实例,通过该实例可以调用 Validform 插件提供的方法。
      //
      // 函数内部使用了 Validform 的配置选项来初始化表单验证,包括:
      //
      // showAllError:是否显示所有错误信息,默认为 true。
      // ajaxPost:是否使用 Ajax 提交表单,默认为 true。
      // tiptype:提示信息的显示方式的回调函数。
      // beforeSubmit:提交前的回调函数,用于进行一些准备工作。
      // callback:提交后的回调函数,处理服务器返回的数据。
      function commonValidateForm(o) {
        o = o ? o : {};
        var defaults = {
          id: "#basicForm",
          postonce: true,
          btnReset: "#btn_reset",
          btnSubmit: "#btn_oper",
          isReset: true,
          isReload: false,
          callBack: function() {},
          beforeCheck: function() {},
          datatype:{
            // "*":"不能为空!",
            // "*6-16":"请填写6到16位任意字符!",
            // "n":"请填写数字!",
            // "n6-16":"请填写6到16位数字!",
            // "s":"不能输入特殊字符!",
            // "s6-18":"请填写6到18位字符!",
            // "p":"请填写邮政编码!",
            // "m":"请填写手机号码!",
            // "e":"邮箱地址格式不对!",
            // "url":"请填写网址!"
          },
          //此属性和resetEventCallBack事件绑定了.点击reset事件后,会自动回调resetEventCallBack方法,调用fillModel来填充表单数据.
          fillModel: {},
          resetEventCallBack: function() {
            $(o.id).fill(o.fillModel);
          }
        };
        o = $.extend(true, defaults, o);

        return validFormPlug = $(o.id).Validform({
          showAllError: false,
          ajaxPost: true,
          tipSweep:true,
          postonce: o.postonce,
          btnSubmit: o.btnSubmit,
          btnReset: o.btnReset,
          resetEventCallBack: o.resetEventCallBack,
          tiptype:function(msg,o,cssctl){
            console.log(msg,o);
            if (o.type === 3) {
              // 验证失败
              if (o.obj.attr("errormsg")) {
                cocoMessage.info(msg, 1000);
              } else {
                cocoMessage.info(msg, 1000);
              }
            }
          },
          // tiptype: function(msg,o,cssctl){
          //   //msg:提示信息;
          //   //o:{obj:*,type:*,curform:*}, obj指向的是当前验证的表单元素(或表单对象),type指示提示的状态,值为1、2、3、4, 1:正在检测/提交数据,2:通过验证,3:验证失败,4:提示ignore状态, curform为当前form对象;
          //   //cssctl:内置的提示信息样式控制函数,该函数需传入两个参数:显示提示信息的对象 和 当前提示的状态(既形参o中的type);
          //   console.log(msg,o);
          //   if(!o.obj.is("form")&&o.type==3){//验证表单元素时o.obj为该表单元素,全部验证通过提交表单时o.obj为该表单对象;
          //     console.log("提交表单");
          //     cocoMessage.info(msg, 1000);
          //   }else{
          //     console.log("验证通过");
          //   }
          // },
          datatype:o.datatype,
          beforeSubmit: function(curform) {
            alertLoading("正在提交...", 0);
            o.beforeCheck(curform);
          },
          callback: function(data) {
            alertHide();
            validFormPlug.resetStatus(); //重置表单提交状态.

            //## 表单提交后处理
            alertSuccess(data.retMsg, varSaveOrUpdateShowTime);
            setTimeout(function() {
              var callFlag = o.callBack(data); //回调方法
              if(callFlag){	//如果返回 true,则不继续处理
                return;
              }
              //默认是重置表单
              if (o.isReset) {
                validFormPlug.resetForm()
                // commonBaseForm(); //绑定事件
              }
              //可配置成重新刷新页面
              if (o.isReload) {
                location.reload();
              }
            }, varSaveOrUpdateShowTime);
            //## End 表单提交后处理
          }
        });
      }

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cortex-A7核PWM实验--STM32MP157

实验目的&#xff1a;驱动风扇&#xff0c;蜂鸣器&#xff0c;马达进行工作 目录 一&#xff0c;PWM相关概念 有源蜂鸣器和无源蜂鸣器 二&#xff0c;分析电路图&#xff0c;框图 三&#xff0c;分析RCC章节 1&#xff0c;确定总线连接 2&#xff0c;根据总线内容确定基…

SQL语句优化

当表中有百万数据的时候&#xff0c;我们要怎么去查询数据&#xff0c;平时写的sql也许就会很慢了。 SQL的执行顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE<where_co…

【Luniux】解决Ubuntu外接显示器不显示的问题

Luniux】解决Ubuntu外接显示器不显示的问题 文章目录 Luniux】解决Ubuntu外接显示器不显示的问题1. 检查nvidia显卡驱动是否正常2. 更新驱动3. 检查显示器是否能检测到Reference 1. 检查nvidia显卡驱动是否正常 使用命令行 nvidia-smi来检查显卡驱动是否正常&#xff0c;如果…

gRPC + Spring Boot 编程教程 - piot

在本文中&#xff0c;您将学习如何实现通过 gRPC 通信的 Spring Boot 应用程序。gRPC 是一个现代开源远程过程调用 (RPC) 框架&#xff0c;可以在任何环境中运行。默认情况下&#xff0c;它使用 Google 的 Protocol Buffer 来序列化和反序列化结构化数据。当然&#xff0c;我们…

Ceph入门到精通-LVS基础知识

LB集群: &#xff08;Load Balancing&#xff09;即负载均衡集群,其目的是为了提高访问的并发量及提升服务器的性能&#xff0c;其 实现方式分为硬件方式和软件方式。 硬件实现方式&#xff1a; 常用的有 F5公司的BIG-IP系列、A10公司的AX系列、Citrix公司的 NetScaler系列…

HUT23级训练赛

目录 A - tmn学长的字符串1 B - 帮帮神君先生 C - z学长的猫 D - 这题用来防ak E - 这题考察FFT卷积 F - 这题考察二进制 G - 这题考察高精度 H - 这题考察签到 I - 爱派克斯&#xff0c;启动! J - tmn学长的字符串2 K - 秋奕来买瓜 A - tmn学长的字符串1 思路&#x…

华为OD机试 - VLAN资源池 - 回溯、双指针(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、核心思想2、具体解题思路 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&…

什么是NetDevOps

NetDevOps 是一种新兴的方法&#xff0c;它结合了 NetOps 和 DevOps 的流程&#xff0c;即将网络自动化集成到开发过程中。NetDevOps 的目标是将虚拟化、自动化和 API 集成到网络基础架构中&#xff0c;并实现开发和运营团队之间的无缝协作。 开发运营&#xff08;DevOps&…

敏捷研发管理软件及敏捷管理流程

Scrum中非常强调公开、透明、直接有效的沟通&#xff0c;这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求&#xff0c;故事&#xff0c;任务之间的流转状态&#xff0c;可以使团队成员更加快速适应敏捷开发流程。 …

JVM知识点(二)

1、G1垃圾收集器 -XX:MaxGCPauseMillis10&#xff0c;G1的参数&#xff0c;表示在任意1s时间内&#xff0c;停顿时间不能超过10ms&#xff1b;G1将堆切分成很多小堆区&#xff08;Region&#xff09;&#xff0c;每一个Region可以是Eden、Survivor或Old区&#xff1b;这些区在…

【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询

「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 在from子句中使用子查询 五、合并查询 一、基本查询回顾…

解密算法与数据结构面试:程序员如何应对挑战

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Windows版本Docker安装详细步骤

文章目录 下载地址安装异常处理docker desktop requires a newer wsl 下载地址 https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe 安装 双击下载的文件Docker Desktop Installer.exe进行安装 点击OK 开始安装 安装完成点击Close and restart&…

电脑不安装软件,怎么将手机文件传输到电脑?

很多人都知道&#xff0c;AirDroid有网页版&#xff08;web.airdroid.com&#xff09;。 想要文件传输&#xff0c;却不想在电脑安装软件时&#xff0c;AirDroid的网页版其实也可以传输文件。 然而&#xff0c;要将文件从手机传输文件到网页端所在的电脑时&#xff0c;如果按…

“惠医通-医院挂号订单平台”

结合已学习过的vue3和TS完成的项目&#xff0c;便于患者对自己想要就诊的科室进行挂号&#xff0c;付款 一&#xff1a;项目简介 前端技术栈 Vue3 TS vue-router Element-ui Axios Pinia 项目架构 二&#xff1a;主要模块 1. axios二次封装 1.1 创建实例 //利用axios.creat…

视频融合平台EasyCVR视频汇聚平台关于小区高空坠物安全实施应用方案设计

近年来&#xff0c;随着我国城市化建设的推进&#xff0c;高楼大厦越来越多&#xff0c;高空坠物导致的伤害也屡见不鲜&#xff0c;严重的影响到人们的生命安全。像在日常生活中一些不起眼的小东西如烟头、鸡蛋、果核、易拉罐&#xff0c;看似伤害不大&#xff0c;但只要降落的…

Go【gin和gorm框架】实现紧急事件登记的接口

简单来说&#xff0c;就是接受前端微信小程序发来的数据保存到数据库&#xff0c;这是我写的第二个接口&#xff0c;相比前一个要稍微简单一些&#xff0c;而且因为前端页面也是我写的&#xff0c;参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…

①matlab的命令掌握

目录 输入命令 命名变量 保存和加载变量 使用内置的函数和常量 输入命令 1.您可以通过在命令行窗口中 MATLAB 提示符 (>>) 后输入命令 任务 使用命令 3*5 将数值 3 和 5 相乘。 答案 3*5 2.除非另有指定&#xff0c;否则 MATLAB 会将计算结果存储在一个名为 ans…

美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以?

周末的时候,有一位小伙伴提了一些关于 ConcurrentHashMap 的问题,都是他最近面试遇到的。原提问如下(星球原贴地址:https://t.zsxq.com/11jcuezQs ): 整个提问看着非常复杂,其实归纳来说就是两个问题: ConcurrentHashMap 为什么 key 和 value 不能为 null?ConcurrentH…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型&#xff0c;JAVA 定义实体类 Id Long id 2、查询数据库&#xff0c;此数据存在 3、使用 shell 查询&#xff0c;查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决&#xff08;一&#xff09; long 在 mongo中为 int64 类型…