layuiAdmin 框架单页面文档

2023-11-05

快速入门

部署

解压文件后,将 layuiAdmin 完整放置在任意目录
通过本地 web 服务器去访问 ./start/index.html 即可运行 Demo
由于 layuiAdmin 可采用前后端分离开发模式,因此你无需将其放置在你的服务端 MVC 框架中,你只需要给 layuiAdmin 主入口页面(我们也称之为:宿主页面)进行访问解析,它即可全权完成自身路由的跳转和视图的呈现,而数据层则完全通过服务端提供的异步接口来完成。

目录说明

  • src/
    layuiAdmin 源代码,通常用于开发环境(如本地),推荐你在本地开发时,将 ./start/index.html 中的 layui.css 和 layui.js 的引入路径由 dist 改为 src 目录。
    src/controller/:存放 JS 业务模块,即对视图进行事件等交互性处理
    src/lib/:layuiAdmin 的核心模块,一般不推荐修改
    src/style/:存放样式,其中 admin.css是核心样式
    src/views/:存放视图文件。其中 layout.html 是整个框架结构的承载,一般不推荐做大量改动。
    src/config.js:layuiAdmin 的全局配置文件,可随意修改。
    src/index.js:layuiAdmin 的入口模块,一般不推荐修改

  • dist/
    通过 gulp 将 layuiAdmin src 目录的源代码进行构建后生成的目录(即:将 JS 和 CSS 文件进行了压缩等处理),通常用于线上环境。关于 gulp 的使用,下文也有介绍。

  • start/
    存放 layuiAdmin 的入口页面、模拟接口数据、layui

宿主页面

你所看到的 start/index.html 是我们提供好的宿主页面,它是整个单页面的承载,所有的界面都是在这一个页面中完成跳转和渲染的。事实上,宿主页面可以放在任何地方,但是要注意修改里面的


路由

layuiAdmin 的路由是采用 location.hash 的机制,即路由地址是放在 ./#/ 后面,并通过 layui 自带的方法: layui.router() 来进行解析。每一个路由都对应一个真实存在的视图文件,且路由地址和视图文件的路径是一致的(相对 views 目录)。因此,你不再需要通过配置服务端的路由去访问一个页面,也无需在 layuiAdmin 内部代码中去定义路由,而是直接通过 layuiAdmin 的前端路由去访问,即可匹配相应目录的视图,从而呈现出页面结果。

路由规则

./#/path1/path2/path3/key1=value1/key2=value2…

一个实际的示例:

./#/user/set
./#/user/set/uid=123/type=1#xxx(下面将以这个为例继续讲解)

当你需要对路由结构进行解析时,你只需要通过 layui 内置的方法 layui.router() 即可完成。如上面的路由解析出来的结果是:

{
 path: ['user','set']
 ,search: {uid: 123, type: 1}
 ,href: 'user/set/uid=123/type=1'
 ,hash: 'xxx'
}

可以看到,不同的结构会自动归纳到相应的参数中,其中:

  • path:存储的是路由的目录结构

  • search:存储的是路由的参数部分

  • href:存储的是 layuiAdmin 的完整路由地址

  • hash:存储的是 layuiAdmin 自身的锚记,跟系统自带的 location.hash 有点类似
    通过 layui.router() 得到路由对象后,你就可以对页面进行个性化操作、异步参数传值等等。如:

//在 JS 中获取路由参数
var router = layui.router();
admin.req({
    url: 'xxx'
    ,data: {
        uid: router.search.uid
    }
});

 <!--  在动态模板中获取路由参数 -->
<script type="text/html" template lay-url="./xxx/?uid={{ layui.router().search.uid }}">
…
</script>

<!-- 或 -->
<script type="text/html" template lay-url="./xxx/" lay-data="{uid:'{{  layui.router().search.uid }}'}">
…
</script>

路由跳转

通过上文的路由规则,你已经大致清楚了 layuiAdmin 路由的基本原理和解析方法。那么如何完成路由的跳转呢?

1、在视图文件的 HTML 代码中,通过对任意元素设定 lay-href="/user/set/uid=123/type=1" ,好处是:任意元素都可以触发跳转。缺点是:只能在浏览器当前选项卡完成跳转(注意:不是 layuiAdmin 的选项卡)
2、直接对 a 标签设定 href,如: text 。好处是:你可以通过设定 target="_blank" 来打开一个浏览器新选项卡。缺点是:只能设置 a 标签,且前面必须加 /#/
3、在 JS 代码中,还可通过 location.hash = '/user/set'; 来跳转。前面无需加 #,它会自动追加。

路由结尾

在路由结尾部分出现的 / 与不出现,是两个完全不同的路由。比如下面这个:

  • user/set
    读取的视图文件是:.views/user/set.html
  • user/set/
    读取的视图文件是:./views/user/set/index.html (TIPS:这里的 index.html 即是目录下的默认主视图,下文会有讲解)
    因此一定要注意结尾处的 /,避免视图读取错误。

视图

这或许是你应用 layuiAdmin 时的主要焦点,在开发过程中,你的大部分精力都可能会聚焦在这里。它取代了服务端 MVC 架构中的 view 层,使得应用开发变得更具扩展性。因此如果你采用 layuiAdmin 的 SPA(单页应用)模式,请务必要抛弃服务端渲染视图的思想,让页面的控制权限重新回归到前端吧!

views 目录存放的正是视图文件,你可以在该目录添加任意的新目录和新文件,通过对应的路由即可访问。

注意:如果是单页面模式,视图文件通常是一段 HTML 碎片,而不能是一个完整的 html 代码结构。

视图与路由的关系

每一个视图文件,都对应一个路由。其中 index.html 是默认文件(你也可以通过 config.js 去重新定义)。视图文件的所在目录决定了路由的访问地址,如:

视图路径 对应的路由地址
./views/user/index.html /user/
./views/user.html /user
./views/user/set/index.html /user/set/
./views/user/set.html /user/set
./views/user/set/base.html /user/set/base

通过上述的表格列举的对应关系,可以总结出:

  • 当视图文件是 index.html,那么路由地址就是它的上级目录(相对 views),以 / 结尾
  • 当视图文件不是 index.html,那么路由地址就是它的上级目录+视图文件名,不以 / 结尾
    值得注意的是:路由路径并非最多只能三级,它可以无限极。但对应的视图也必须存放在相应的层级目录下

视图中加载 JS 模块

在视图文件中,除了写 HTML,也可以写 JavaScript 代码。如:

<div id=“LAY-demo-hello”>Hello layuiAdmin</div>
<script>
layui.use('admin', function(){
  var $ = layui.jquery;
  admin.popup({
    content: $('#LAY-demo-hello').html()
  });
});
</script>

如果该视图对应的 JS 代码量太大,我们更推荐你在 controller 目录下新增一个业务模块,并在视图中直接 layui.use 去加载该模块。下面以控制台主页 index.html 为例:

<div>html区域<div>

<script>
//加载 controller 目录下的对应模块
/*
  小贴士:
    这里 console 模块对应 的 console.js 并不会重复加载,
    然而该页面的视图可能会重新插入到容器,那如何保证脚本能重新控制视图呢?有两种方式:
      1): 借助 layui.factory 方法获取 console 模块的工厂(回调函数)给 layui.use
      2): 直接在 layui.use 方法的回调中书写业务代码,即:
          layui.use('console', function(){ 
            //同 console.js 中的 layui.define 回调中的代码 
          });
          
  这里我们采用的是方式1。其它很多视图中采用的其实都是方式2,因为更简单些,也减少了一个请求数。
  
*/
layui.use('console', layui.factory('console'));
</script>

当视图被渲染后,layui.factory 返回的函数也会被执行,从而保证在不重复加载 JS 模块文件的前提下,保证脚本能重复执行。


动态模板

layuiAdmin 的视图是一个“动静结合”的载体,除了常规的静态模板,你当然还可以在视图中存放动态模板,因此它可谓是焦点中的焦点。

定义模板

在视图文件中,通过下述规则定义模板:

<script type="text/html" template>
  <!-- 动态模板碎片 -->
</script>

下面是一个简单的例子:

<script type="text/html" template>
  当前 layuiAdmin 的版本是:{{ layui.admin.v }}
  路由地址:{{ layui.router().href }}
</script>

在不对动态模板设定数据接口地址的情况下,它能读取到全局对象。但更多时候,一个动态模板应该是对应一个接口地址,如下所示:

<script type="text/html" template lay-url="接口地址">
    我叫:{{ d.data.username }}
    {{# if(d.data.sex === '男'){ }}
        公的
    {{# } else { }}
        母的
    {{# } }}
</script>

模板中的 d 对应的是你接口返回的 json 转化后的一维对象,如:

{
  "code": 0
  ,"data": {
    "username": "贤心"
    ,"sex": "男"
  }
}

那么,上述动态模板最终输出的结果就是:

我叫:贤心
公的

模板基础属性

动态模板支持以下基础属性

  • lay-url
    用于绑定模板的数据接口地址,支持动态模板解析,如:

    <script type="text/html" template lay-url="https://api.xxx.com?id={{ layui.router().search.id }}">
        <!-- 动态模板碎片 -->
     </script>
    
  • lay-type
    用于设定模板的接口请求类型(默认:get),如:

  • lay-data
    用于定义接口请求的参数,其值是一个 JavaScript object 对象,同样支持动态模板解析,如:

  • lay-headers
    用户定义接口请求的 Request Headers 参数,用法与 lay-data 的完全类似,支持动态模板解析。

  • lay-done
    接口请求完毕并完成视图渲染的回调脚本,里面支持写任意的 JavaScript 语句。事实上它是一个封闭的函数作用域,通过给 Function 实例返回的函数传递一个参数 d,用于得到接口返回的数据:

        <script type="text/html" template lay-url="接口地址" lay-done="console.log(d);">
         <!-- 动态模板碎片 -->
        </script>
    

    很多时候,你在动态模板中可能会放入一些类似于 layui 的 form 元素,而有些控件需要执行 form.render() 才会显示,这时,你可以对 lay-done 赋值一个全局函数,如:

      <script type="text/html" template lay-url="接口地址" lay-done="layui.data.done(d);">
         <div class="layui-form" lay-filter="LAY-filter-demo-form">
           <input type="checkbox" title="复选框">
        </div>
      </script>
      
      <!--  注意:别看眼花了,下面可不是动态模板,而是 JS 脚本区域 -->
      <script>
      layui.data.done = function(d){
        layui.use(['form'], function(){
          var form = layui.form;
           form.render(null, 'LAY-filter-demo-form'); //渲染该模板下的动态表单
        });
      };
      </script>
    

TIPS:
1、如果模板渲染完毕需要处理过多的交互,我们强烈推荐你采用上述的方式定义一个全局函数赋值给 lay-done,会极大地减少维护成本。
2、无需担心该全局函数的冲突问题,该函数是一次性的。其它页面即便声明了一个同样的函数,也只是用于新的视图,丝毫不会对之前的视图造成任何影响。
3、layui.data.done 中的 done 可以随意命名,但需与 lay-done 的赋值对应上。

模板语法

动态模板基于 layui 的 laytpl 模块,详细语法可见:
http://www.layui.com/doc/modules/laytpl.html#syntax


登录与接口鉴权

由于 layuiAdmin 接管了视图层,所以不必避免可能会与服务端分开部署,这时你有必要了解一下 layuiAdmin 默认提供的:从 登录 到 接口鉴权,再到 注销 的整个流程。

登录拦截器

进入登入页面登入成功后,会在 localStorage 的本地表中写入一个字段。如: access_token (名称可以在 config.js 自定义)。拦截器判断没有 access_token 时,则会跳转到登入页。尽管可以通过伪造一个假的 access_token 绕过视图层的拦截,但在请求接口时,会自动带上 access_token,服务端应再次做一层校验。

流程

1、打开 config.js ,将 interceptor 参数设置为 true(该参数为 1.0.0-beta6 开始新增)。那么,当其未检查到 access_token 值时,会强制跳转到登录页面,以获取 access_token。
2、打开登录对应的视图文件 views/user/login.html,在代码最下面,你将看到一段已经写好的代码,你需要的是将接口地址改为服务端的真实接口,并返回 access_token 值。
3、layuiAdmin 会将服务端返回的 access_token 值进行本地存储,这时你会发现 layuiAdmin 不再强制跳转到登录页面。并在后面每次请求服务端接口时,都会自动在参数和 Request Headers 中带上 access_token,以便服务端进行鉴权。
4、若鉴权成功,顺利返回数据;若鉴权失败,服务端的 code 应返回 1001(可在 config.js 自定义) , layuiAdmin 将会自动清空本地无效 token 并跳转到登入页。
5、退出登录:重新打开 controller/common.js,搜索 logout,配上注销接口即可。
如果是在其它场景请求的接口,如:table.render(),那么你需要获取本地存储的 token 赋值给接口参数,如下:

//设置全局 table 实例的 token(这样一来,所有 table 实例均会有效)
table.set({
  headers: { //通过 request 头传递
    access_token: layui.data('layuiAdmin').access_token
  }
  ,where: { //通过参数传递
    access_token: layui.data('layuiAdmin').access_token
  }
});

 
//设置单个 table 实例的 token
table.render({
  elem: '#xxxx'
  ,url: 'url'
  ,where: {
    access_token: layui.data('layuiAdmin').access_token
  }
  //,headers: {}
});

事实上,layuiAdmin 的所有 Ajax 请求都是采用 admin.req(options),它会自动传递 access_token,因此推荐你在 JS 执行 Ajax 请求时直接使用它。其中参数 options 和 $.ajax(options) 的参数完全一样。

接口鉴权

我们推荐服务端遵循 JWT(JSON Web Token) 标准进行鉴权。对 JWT 不甚了解的同学,可以去搜索一些相关资料,会极大地增加应用的可扩展性。当然,你也可以直接采用传统的 cookie / session 机制。


文档

基础方法

  • config 模块
    你可以在任何地方通过 layui.setter 得到 config.js 中的配置信息

  • admin 模块
    var admin = layui.admin;

  • admin.req(options)
    Ajax 请求,用法同 $.ajax(options),只是该方法会进行错误处理和 token 的自动传递

  • admin.screen()
    获取屏幕类型,根据当前屏幕大小,返回 0 - 3 的值
    0: 低于768px的屏幕
    1:768px到992px之间的屏幕
    2:992px到1200px之间的屏幕
    3:高于1200px的屏幕

  • admin.exit()
    清除本地 token,并跳转到登入页

  • admin.sideFlexible(status)
    侧边伸缩。status 为 null:收缩;status为 “spread”:展开

  • admin.on(eventName, callback)
    事件监听,下文会有讲解

  • admin.popup(options)
    弹出一个 layuiAdmin 主题风格的 layer 层,参数 options 跟 layer.open(options) 完全相同

  • admin.popupRight(options)
    在屏幕右侧呼出一个面板层。options 同上。

    admin.popupRight({
       id: 'LAY-popup-right-new1' //定义唯一ID,防止重复弹出
       ,success: function(){
         //将 views 目录下的某视图文件内容渲染给该面板
         layui.view(this.id).render('视图文件所在路径');
       }
    });
    
  • admin.resize(callback)
    窗口 resize 事件处理,我们推荐你使用该方法取代 jQuery 的 resize 事件,以避免多页面标签下可能存在的冲突。

  • admin.fullScreen()
    全屏

  • admin.exitScreen()
    退出全屏

  • admin.events

admin.events.refresh()
刷新当前右侧区域

admin.events.closeThisTabs()
关闭当前标签页

admin.events.closeOtherTabs()
关闭其它标签页

admin.events.closeAllTabs()
关闭全部标签页

view 模块

var view = layui.view;
  • view(id)
    获取指定容器,并返回一些视图渲染的方法,如:

      //渲染视图,viewPath 即为视图路径
      view('id').render(viewPath).then(function(){
          //视图文件请求完毕,视图内容渲染前的回调
      }).done(function(){
         //视图文件请求完毕和内容渲染完毕的回调
      }); 
    

//直接向容器插入 html,tpl 为 模板字符;data 是传入的数据。该方法会自动完成动态模板解析
view('id').send(tpl, data);
另外,render 方法支持动态传参,以用于视图内容接受。如:

admin.popup({
  id: 'LAY-popup-test1'
  ,success: function(){
    view(this.id).render('视图文件所在路径', {
       id: 123 //这里的 id 值你可以在一些事件中动态获取(如 table 模块的编辑)
    });
  }
});

那么,在视图文件中,你可以在动态模板中通过 {{ d.params.xxx }} 得到传入的参数,如:

<script type="text/html" template lay-url="http://api.com?id={{ d.params.id }}">
  配置了接口的动态模板,且接口动态获取了 render 传入的参数:{{ d.params.id }}
</script>

<script type="text/html" template>
  也可以直接获取:<input type="hidden" name="id" value="{{ d.params.id }}">
</script>

而如果是在 JS 语句中去获取模板传递过来的变量,可以借助动态模板的 lay-done 属性去实现,如:

<script type="text/html" template lay-done="layui.data.sendParams(d.params)">
  
</script>
然后在 JS 语句中通过执行动态模板 lay-done 中对应的方法得到对应的参数值:

<script>
//定义一个 lay-done 对应的全局方法,以供动态模板执行
layui.data.sendParams = function(params){
  console.log(params.id) //得到传递过来的 id 参数(或其他参数)值
  
  //通过得到的参数值,做一些你想做的事
  //…

  //若需用到 layui 组件,layui.use 需写在该全局方法里面,如:
  layui.use(['table'], function(){
    var table = layui.table;
    table.render({
      elem: ''
      ,url: 'url?id='+ params.id
    });
  });
};
</script>

注意:上述实现需保证 layuiAdmin 为 1.2.0+`

总之,驾驭好 view().render().done(callback) 对您的项目开发至关重要。

ID唯一性

如果你开启了标签页功能,请务必注意 ID 的冲突,尤其是在你自己绑定事件的情况。ID 的命令可以遵循以下规则来规避冲突:

LAY-路由-任意名

以消息中心页面为例,假设它的路由为:/app/message/,那么 ID 应该命名为:

<button class="layui-btn" id="LAY-app-message-del">删除</button>

实用组件

Hover 提示层
通过对元素设置 lay-tips="提示内容" 来开启一个 hover 提示,如:

 <i class="layui-icon layui-icon-tips" lay-tips="要支持的噢" lay-offset="5"></i>

其中 lay-offset 用于定于水平偏移距离(单位px),以调整箭头让其对准元素

事件监听

  • hash
    监听路由地址改变

    // 下述中的 xxx 可随意定义,不可与已经定义的 hash 事件同名,否则会覆盖上一事件
     admin.on('hash(xxx)', function(router){
       console.log(router); //得到路由信息
     });
    
  • side
    监听侧边伸缩
    // 下述中的 xxx 可随意定义,不可与已经定义的 side 事件同名,否则会覆盖上一事件
    admin.on('side(xxx)', function(obj){
    console.log(obj.status); //得到伸缩状态:spread 为展开状态,其它值为收缩状态
    });

兼容性

layuiAdmin 使用到了 layui 的栅格系统,而栅格则是基于浏览器的媒体查询。ie8、9不支持。
所以要在宿主页面(如 start/index.html )加上下面这段保证兼容:

<!-- 让IE8/9支持媒体查询,从而兼容栅格 -->
<!--[if lt IE 9]>
  <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
  <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->  

缓存问题

由于单页面版本的视图文件和静态资源模块都是动态加载的,所以可能存在浏览器的本地缓存问题,事实上我们也考虑到这个,因此,为了避免改动后的文件未及时生效,你只需在入口页面(默认为start/index.html)中,找到 layui.config ,修改其 version 的值即可。

我们推荐你分场景来更新缓存:

场景一:如果项目是在本地开发。你可以设置 version 为动态毫秒数,如:
version: new Date().getTime() //这样你每次刷新页面,都会更新一次缓存
场景二:如果项目是在线上运行。建议你手工更新 version,如:
version: '1.0.0' //每次发布项目时,跟着改动下该属性值即可更新静态资源的缓存

升级事项

从官网更新资源包后,除了 src 和 dist 目录需要注意一下,其它目录和文件均可覆盖,下面以 src 为例(dist 由于是 src 构建后生成的目录,所以本质是和 src 一样的)
src 目录下可以直接覆盖的有:

src/lib/
src/style/
src/index.js

需要灵活调配的有:

src/controller/
src/views/
src/config.js

如果没有改动默认配置,事实上 config.js 也可以覆盖升级
开发过程中,建议同时运行两个 layuiAdmin 。一个是已经实际运用的,一个是 layuiAdmin 本身的 Demo。以便从 Demo 中获取参考和提取示例。

源码构建

当你在 src 目录完成开发后,你可通过 gulp 对 src 源码进行自动化构建,以生成用于线上环境的 dist 目录。并在入口页面中的 layui.config 的 base 参数指向 dist。

在资源包中根目录下看到的 gulpfile.js 是 layuiAdmin 写好的任务脚本,package.json 是任务配置文件,你只需按照以下步骤:

1、step1:确保你的电脑已经安装好了 Node.js,如果未安装,可去官网下载安装
2、step2: 命令行安装 gulp:npm install gulp -g
3、step3:切换到 layuiAdmin 项目根目录(即 gulpfile.js 所在目录),命令行安装任务所依赖的包:npm install
安装完成后,后续只需直接执行命令:gulp 即可完成 src 到 dist 目录的构建

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

layuiAdmin 框架单页面文档 的相关文章

  • Ionic 2:隐藏滚动条并继续滚动

    我只想hide滚动条 在需要滚动的页面中 我正在使用离子2 My 不工作解决方案 scroll content bar overflow hidden 此解决方案隐藏滚动条but使屏幕不可滚动 首先 改变浏览器的自然行为和预期的用户体验是一
  • 从选择 onChange 调用 javascript 函数 [重复]

    这个问题在这里已经有答案了 所以我有一个简单的 HTML 选择框和一个 javascript 警报功能 我希望选择框有一个 onchange 事件来调用 javascript 警报函数 这是我到目前为止所拥有的 HTML div Type
  • 检测 Webkit/Chrome 中 HTML5 数字控件更改的事件?

    HTML5 为我们提供了一些新的输入元素 例如
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • 我可以在 GWT 中使用第三方 Javascript 库吗

    例如穆工具 用 js 编码对我来说很舒服 但显然不适合所有人 你当然可以 最好的事情就是给自己写一些好看的JavaScript 覆盖类型 http code google com webtoolkit doc latest DevGuide
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 如何使用CSS缩放图像以填充div并保持纵横比?

    我想用一个 div 填充img 保持纵横比并根据需要拉伸宽度或高度以适应 div style width 80px height 80px img src div 我怎样才能实现它 如果图像不是二次方的 则必须将其 放大 并根据哪一侧较大而
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • 使用 float:left 与 display:inline-block 的 jQuery UI 拖放排序比较

    我这里有两个例子 这两个例子之间的唯一区别是 一种使用display inline block 另一种使用float left li doc item 显示 内联块 与 li doc item float left 我的问题是 displa
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 如何知道 .keyup() 是否是字符键(jQuery)

    如何知道 keyup 是否是字符键 jQuery input keyup function if key is a character such as a b A b c 5 3 2 etc not enter key or shift o
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • 如何在React中动态分配属性?

    这是一个有两个参数的函数 我要创建的标签的名称 具有以下属性的对象 Using React 我创建一个组件并将该元素渲染到 DOM 问题是我想向元素添加属性 但它不允许循环在元素内设置属性 var Element function elem
  • 为什么 call 比 apply 快那么多?

    我想知道是否有人知道why call比apply 在 Chrome 中 速度大约快 4 倍 在 Firefox 中快 30 倍 我什至可以制作自定义原型 apply2 在大多数情况下 运行速度是apply 这个想法取自角度 Function
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这

随机推荐

  • java中score用法,Lucene 8.x 使用 FunctionScoreQuery 实现自定义的文档评分

    在使用不管是 Lucene 或者 ElasticSearch 进行全文搜索中 检索到文档很简单 但是把搜索者最想要的结果排在最前面 这是最具挑战性的 我们举个最简单的例子 假设我们需要做一个博客搜索 当我们用 Lucene 默认的匹配度进行
  • 怎么看服务器是中毒了还是被攻击?

    服务器是企业或个人重要的信息系统设备之一 它的正常运行对于企业和个人的业务和日常生活都非常重要 然而 服务器也很容易成为黑客攻击的目标 一旦遭到攻击 会对系统的正常运行和数据安全产生严重影响 在服务器出现异常情况时 如何判断是中毒还是被攻击
  • JSTL——jstl标签简介

    文章目录 1 jstl简介以及jstl标签库导入 2 set标签 3 if标签 4 choose when标签 5 forEach标签 1 jstl简介以及jstl标签库导入 1 jstl全称Jsp Standarded Tag Libra
  • VTK安装与配置补充

    本文参考 https blog csdn net Robin Chou article details 50476007 1 CMake的安装 CMake安装是用来对VTK编译前的配置工作 此博客中使用的是CMake2 8 CMake的下载
  • 【毕业设计】基于红外热释电的房间人数计数系统 - 单片机 物联网嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 4 1 PIR传感器 4 2 mlx90614红外传感器 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新
  • SD卡/TF卡简记

    文章目录 MicroSD卡与SD卡关系与区别 对比NM卡 XQD卡 CFexpress卡 SD规格标识 FAQ 拍摄1080p或2k视频需要什么速度的sd卡 拍摄4k视频需要什么速度的sd卡 拍摄8k视频需要什么速度的sd卡 MicroSD
  • BH1750 传感器实战教学 —— 驱动移植篇

    前言 上一篇 BH1750 的实战教学我们说明的实际应用中传感器的硬件设计 BH1750 传感器实战教学 硬件设计篇 我们提到过在本次使用的芯片为 51 内核 I2C 通讯驱动实现与 STM32 上还是有很大区别的 对于我们来说 已经掌握了
  • 【python数据分析】jupyter notebook常用快捷键

    相信不少人在学习python数据分析会用到jupyter notebook 而作为一个刚刚接触的插件 往往不会使用快捷键加快我们的学习或开发 这里就给大家分享一下jupyter notebook常用快捷键 总的来说 分为2种模式 一 命令模
  • 几个常用的匹配html标签的正则

    1 去除 a 标签 保留中间的文字 原字符串 a href www baidu com 点我跳转百度 a 正则 lt a A s gt gt 替换为 1 结果 点我跳转百度 2 去除指定标签及其里面的内容 原字符串 span style c
  • OP-TEE是如何使用RPMB来实现可信存储的

    1 目的 写这篇博客主要是为了记录这段时间的成果 方便自己和有需要的人理解可信存储 以及OP TEE是如何实现可信存储的 最近在重构公司的可信存储的实现 主要是想将Trust Storage的主要逻辑实现从user space挪到kerne
  • 互联网+SC联盟解决大学生五大难题!

    这是一个历史性的时刻 互联网 SC联盟 震撼面世 小编能想到的类似事件有宇宙大爆炸 恐龙灭绝 第一个人类诞生 中国四大发明 天呐 相信你也迫不及待地想了解了 赶紧阅读下文 来做第一个见证人吧 一 SC是什么意思 Study and Care
  • unity3D基础操作之01--unity3d窗口界面介绍

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 最常使用5种窗口 1 Scene场景编辑窗口 2 Game游戏运行窗口 需要注意的是 3 Hierarchy场景物体列表窗口 4 Project项目资源列表窗口 需
  • 【多线程操作】线程池模拟实现

    目录 一 线程池的作用 二 线程池的模拟实现 1 线程模块 Thread hpp 2 线程锁模块 LockGuard hpp 3 任务模块 Task hpp 4 线程池核心 ThreadPool hpp 一 线程池的作用 线程池是用来维护多
  • linux系统之字符设备驱动——点灯

    linux系统之字符设备驱动 点灯 1 原理图 底板 核心板 RGB RED GPIOA28 RGB GREEN GPIOE13 RGB BLUE GPIOB12 2 驱动代码 驱动代码程序 led dev c Author your na
  • C语言结构体中字符数组的问题

    第一个程序 include
  • 贪心之练习

    学习安排根据 代码随想录 贪心基础理论知识 贪心的思想 局部选优 全局最优 贪心的套路 先用贪心模拟 是否能举出反例 如果没有反例 用贪心 ps 也可以说没有套路 就是莽 练习 leetcode 55 跳跃游戏 略 leetcode 45
  • SpringMVC实现文件上传(常见报错解决:404、405、409)

    目录 传统方式的文件上传 SpringMVC普通方式的文件上传 SpringMVC跨服务器的文件上传 409错误 403 405错误 404错误 gt 本文源码 传统方式的文件上传 所需jar包
  • case when then else end语句的用法

    case具有两种格式 简单case函数和case搜索函数 简单case函数 case sex when 1 then 男 when 2 then 女 else 其他 end case搜索函数 经常用的是这个 case when sex 1
  • Java中字符编码问题和中文占几个字节的问题(ASCII Unicode UTF-8 )

    ASCII码 在计算机内部 所有的信息最终都表示为一个二进制的字符串 每一个二进制位 bit 有0和1两种状态 因此八个二进制位就可以组合出256种状态 这被称为一个字节 byte 也就是说 一个字节一共可以用来表示256种不同的状态 每一
  • layuiAdmin 框架单页面文档

    快速入门 部署 解压文件后 将 layuiAdmin 完整放置在任意目录 通过本地 web 服务器去访问 start index html 即可运行 Demo 由于 layuiAdmin 可采用前后端分离开发模式 因此你无需将其放置在你的服