• layui好用的组件基本使用


    目录

    1.动态菜单的实现

    2. layui from 提交事件

    1.在此介绍一下时间组件 laydate 组件

    3.layer 怎么实现自定义组件

    4.排座与保存下图片的插件介绍

    5.select插件多选演示

    6.签字插件介绍 签字后保存图片


    1.动态菜单的实现

    1.菜单实现代码

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2.    pageEncoding="UTF-8"%>
    3. <html>
    4. <head>
    5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    6.  <title>layout 后台大布局 - Layuititle>
    7. <%@ include file="common/head.jsp" %>
    8. <style type="text/css">
    9. /* css:first-child 获取首元素   */
    10. #fundiv ul li:first-child i{
    11.  display: none;
    12. }
    13. style>
    14. head>
    15. <body class="layui-layout-body">
    16. <div class="layui-layout layui-layout-admin">
    17.  <div class="layui-header">
    18.    <div class="layui-logo">layui 后台布局div>
    19.    
    20.    <ul class="layui-nav layui-layout-right">
    21.      <li class="layui-nav-item">
    22.        <a href="javascript:;">
    23.          <img src="http://t.cn/RCzsdCq" class="layui-nav-img">
    24.          贤心
    25.        a>
    26.        <dl class="layui-nav-child">
    27.          <dd><a href="">基本资料a>dd>
    28.          <dd><a href="">安全设置a>dd>
    29.        dl>
    30.      li>
    31.      <li class="layui-nav-item"><a href="">退了a>li>
    32.    ul>
    33.  div>
    34.  <div class="layui-side layui-bg-black">
    35.    <div class="layui-side-scroll">
    36.      
    37.      <ul class="layui-nav layui-nav-tree" id="ullb"  lay-filter="test">
    38.        
    39.      ul>
    40.    div>
    41.  div>
    42.  <div class="layui-body" >
    43.    
    44.    <div style="padding: 15px;">
    45. •    
    46.    <div class="layui-tab " id="fundiv" lay-filter="demo" lay-allowclose="true">
    47.  <ul class="layui-tab-title">
    48.    <li class="layui-this ">主页li>
    49.  ul>
    50.  <div class="layui-tab-content" >
    51.    <div class="layui-tab-item layui-show" >
    52.      1. 我个人比较喜欢卡片风格的,所以你发现又是以卡片的风格举例
    53.      2. 删除功能适用于所有风格
    54.    div>
    55.  div>  
    56. div>            
    57.    div>
    58.  div>
    59.  <div class="layui-footer">
    60.    
    61.    © layui.com - 底部固定区域
    62.  div>
    63. div>
    64. <script>
    65. let element =null;
    66. let $ =null;
    67. let layer =null;
    68. //JavaScript代码区域
    69. layui.use(['element','jquery','layer'], function(){
    70.  //定义需要的元素
    71.  element = layui.element;
    72.  $ = layui.jquery;
    73.  layer=layui.layer;
    74.  //请求菜单数据 map 进行传的值
    75.  $.post("moduleAction.action?methodName=queryModule",{},function(ms){
    76.  let nod;
    77.  $.each(ms.data,function(index,value){
    78.  //第一行默认打开  
    79.  let opened=index==0?"layui-nav-itemed":"";
    80.  
    81.  nod=$('
    82. '">
    83. ');
  •  nod.append(''+value.name+'');
  •  
  •  let d2=$('
    '
    );
  •  console.log(value.modules)
  •  $.each(value.modules,function(i,v){
  • })
  •  nod.append(d2);
  •  //将拼接号的菜单 追加到 ul中
  •  $("#ullb").append(nod);
  • })
  • // console.log(nod)
  •  //刷新ui
  •  element.render("ullb")
  •  //保证是 传过来的数据自动转为json
  • },'json')
  • });
  • //定义选项卡的方法
  • /**
  • * name 选项卡名字
  •   id 选项卡的id 就是数据库菜单id 用于切换选项卡
  • */
  • function openFuncTab(name,id,url){
  • let tag=$("li[lay-id="+id+"]").length;
  • if(tag==0){
  • element.tabAdd('demo', {
  •        title:name //用于演示
  •        //引入页面
  •       ,content:''
  •       ,id:id //实际使用一般是规定好的id,这里以时间戳模拟下
  •     })
  •   }
  •  
  •  element.tabChange('demo', id); //切换到:用户管理
  • //调用自适应高度的方法
  • setIframeHeight();
  •  //窗口改变时 自动刷新
  • $(window).resize(function(){
  • setIframeHeight();
  • })
  • }
  • //设置自适应高度
  • function setIframeHeight(){
  • //获取最外部 的高度
  • let bodyheig= $(".layui-body").height();
  •  //调整引入的 iframe 的高度
  • $(".myiframe").css("height",bodyheig-85);
  • // console.log(bodyheig)
  • }
  • script>
  • body>
  • html>
  • 2.获取动态菜单数据

     

    2. layui from 提交事件

    layui使用原始的from自动提交事件 可能会导致数据丢失 所以我们采用layui给我们提供的提交事件

    1.在此介绍一下时间组件 laydate 组件

    主要功能:年选择器、年月选择器、日期选择器、时间选择器、日期时间选择器 五种类型的选择方式为基本核心,并且均支持范围选择(即双控件)。 模块加载名称:laydate,独立版本:http://www.layui.com/laydate/

    一·基础参数选项 通过核心方法:laydate.render(options) 来设置基础参数,也可以通过方法:laydate.set(options) 来设定全局基础参数. elem - 绑定元素是必填项;用于绑定执行日期渲染的元素,值一般为选择器,或DOM对象 laydate.render({ elem: '#test' //或 elem: document.getElementById('test')、elem: lay('#test') 等 });

    二·type - 控件选择类型:用于单独提供不同的选择器类型

    年选择器

    年月选择器

    时间选择器

    日期时间选择器

    三·range - 开启左右面板范围选择 类型:Boolean/String,默认值:false

    如果设置 true,将默认采用 “ - ” 分割。 你也可以直接设置 分割字符。五种选择器类型均支持左右面板的范围选择。

    image.png

    laydate.render({ elem: '#test6' ,range: true }); 四·format - 自定义格式:类型:String,默认值:yyyy-MM-dd;通过日期时间各自的格式符和长度,来设定一个你所需要的日期格式。layDate 支持的格式如下:

    //自定义日期格式 laydate.render({ elem: '#test' ,format: 'yyyy年MM月dd日' //可任意组合 }); 五·value - 初始值:类型:String,默认值:new Date() //传入符合format格式的字符给初始值

    laydate.render({ elem: '#test' ,value: '2018-08-18' //必须遵循format参数设定的格式 });

    //传入Date对象给初始值 laydate.render({ elem: '#test' ,value: new Date(1534766888000) //参数即为:2018-08-20 20:08:08 的时间戳 }); 六·控件初始打开的回调 控件在打开时触发,回调返回一个参数:初始的日期时间对象 laydate.render({ elem: '#test' ,ready: function(date){ console.log(date); //得到初始的日期时间对象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0} } }); 七·日期时间被切换后的回调 年月日时间被切换时都会触发。回调返回三个参数,分别代表:生成的值、日期时间对象、结束的日期时间对象 laydate.render({ elem: '#test' ,change: function(value, date, endDate){ console.log(value); //得到日期生成的值,如:2017-08-18 console.log(date); //得到日期时间对象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0} console.log(endDate); //得结束的日期时间对象,开启范围选择(range: true)才会返回。对象成员同上。 } }); 八·控件选择完毕后的回调 点击日期、清空、现在、确定均会触发。回调返回三个参数,分别代表:生成的值、日期时间对象、结束的日期时间对象 laydate.render({ elem: '#test' ,done: function(value, date, endDate){ console.log(value); //得到日期生成的值,如:2017-08-18 console.log(date); //得到日期时间对象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0} console.log(endDate); //得结束的日期时间对象,开启范围选择(range: true)才会返回。对象成员同上。 } }); 九·弹出控件提示 事实上,执行核心方法 laydate.render(options) 会返回一个当前实例对象。其中包含一些成员属性和方法,比如:hint方法 var ins1 = laydate.render({ elem: '#test' ,change: function(value, date, endDate){ ins1.hint(value); //在控件上弹出value值 } }); 十·其他

    2.layui 提交事件

    须知 form是layui中的组件之一 所以使用之前需要放在包裹在 组件中 引入 form 或者 layui.from

     

    1. //提交表单
    2. form.on('submit(meetinginfo)', function(data) {
    3. console.log(data);
    4. //获取form提交的时间输入框数据 进行分割
    5. let dt = data.field.meetingDt;
    6. let start = dt.split("至")[0].trim();
    7. let end = dt.split("至")[1].trim();
    8. //添加属性
    9. //将时间分别保存下来
    10. data.field["startTime"] = start;
    11. data.field["endTime"] = end;
    12. console.log(data);
    13. //发送异步请求
    14. $.ajax({
    15. url: ctx + '/meetingInfoAction.action?methodName=addMeetingInfo',
    16. data: data.field,
    17. type: 'post',
    18. dataType: 'json',
    19. success: function(resp) {
    20. //判断是否成功
    21. if(resp.code==0){
    22. layer.msg(resp.msg,{icon:1});
    23. }else{
    24. layer.msg(resp.msg,{icon:5})
    25. }
    26. }
    27. })
    28. return false;
    29. });

    3.layer 怎么实现自定义组件

    首先编写 引入文件 config文件 ⬇

    1. layui.config({
    2. base : 'static/js/module/' // 假设这是test.js所在的目录
    3. }).extend({ // 设定模块别名
    4. test : 'test' // 如果test.js是在根目录,也可以不用设定别名
    5. });`

    在编写自己需要的组件

    1. layui.define(function(exports) {
    2. var obj = {
    3. hello : function(str) {
    4. alert('Hello ' + (str || 'test'));
    5. },
    6. hello02: function(str) {
    7. alert('Hello02 ' + (str || 'test'));
    8. }
    9. };
    10. // 输出test接口
    11. exports('test', obj);
    12. });

    目录结构

     

    最后引入组件 进行使用

     查看一下效果

    4.排座与保存下图片的插件介绍

    1,排座源代码 需要自己添加一个桌位图

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2.    pageEncoding="UTF-8"%>
    3. html>
    4. <html>
    5. <head>
    6. <base href="${pageContext.request.contextPath }/static/"/>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <link href="js/layui/css/layui.css" rel="stylesheet" type="text/css"/>
    9. <script type="text/javascript" src="js/jquery/jquery-3.3.1.min.js">script>
    10. <script type="text/javascript" src="js/layui/layui.js">script>
    11. <script type="text/javascript" src="js/html2canvas/html2canvas.js">script>
    12. <title>会议座位安排title>
    13. head>
    14. <style type="text/css">
    15. * {
    16. padding: 0;
    17. margin: 0;
    18. }
    19. body {
    20. width: 100%;
    21. height: 100%;
    22. /* background: red; */
    23. }
    24. .tips {
    25. /* position: absolute; */
    26. background: #eee;
    27. display: inline-block;
    28. height: 60px;
    29. /* width: 60px; */
    30. line-height: 60px;
    31. text-align: center;
    32. margin: 5px;
    33. padding: 0 10px;
    34. }
    35. .add {
    36. position: fixed;
    37. right: 10px;
    38. top: 10px;
    39. display:inline;
    40. }
    41. #tu {
    42. width: 100%;
    43. height: 100%;
    44. /* background: lightblue; */
    45. /*background: url('u=3318199716,2583790385&fm=26&gp=0.jpg');*/
    46. }
    47. .layui-input{
    48. height:30px;
    49. }
    50. style>
    51. <body id="screen_body">
    52.    <div id="tu">div>
    53.    
    54. <div class="add">
    55. <div style="display:inline-block;">
    56. <input id="dan_input" type="text" value="" class="layui-input">
    57. div>
    58. <div style="display:inline-block;">
    59. <button onclick="return addDanMu()" class="layui-btn layui-btn-sm">添加座位button><input id="jie_input" type="button" class="layui-btn layui-btn-sm" value='确定'>
    60. div>
    61. div>
    62. body>
    63. <script type="text/javascript">
    64. var $id = function(id) {
    65. return document.getElementById(id);
    66. }
    67. //会议排座拖拽
    68. var dragF = {
    69. locked: false,
    70. lastObj: undefined,
    71. drag: function(obj) {
    72. $id(obj).onmousedown = function(e) {
    73. var e = e ? e : window.event;
    74. if (!window.event) {
    75. e.preventDefault();
    76. } /* 阻止标注浏览器下拖动a,img的默认事件 */
    77. dragF.locked = true;
    78. $id(obj).style.position = "absolute";
    79. $id(obj).style.zIndex = "100";
    80. if (dragF.lastObj && dragF.lastObj != $id(obj)) { /* 多元素拖动需要恢复上次元素状态 */
    81. dragF.lastObj.style.zIndex = "1";
    82. }
    83. dragF.lastObj = $id(obj);
    84. var tempX = $id(obj).offsetLeft;
    85. var tempY = $id(obj).offsetTop;
    86. dragF.x = e.clientX;
    87. dragF.y = e.clientY;
    88. document.onmousemove = function(e) {
    89. var e = e ? e : window.event;
    90. if (dragF.locked == false) return false;
    91. $id(obj).style.left = tempX + e.clientX - dragF.x + "px";
    92. $id(obj).style.top = tempY + e.clientY - dragF.y + "px";
    93. if (window.event) {
    94. e.returnValue = false;
    95. } /* 阻止ie下a,img的默认事件 */
    96. }
    97. document.onmouseup = function() {
    98. dragF.locked = false;
    99. }
    100. }
    101. }
    102. }
    103. script>
    104. <script type="text/javascript">
    105. var layer;
    106. layui.use(['layer'],function(){
    107. layer=layui.layer;
    108. //TODO 初始化会议排座:根据会议ID获取参会的所有人员的名字(主持人+参会人+列席人)
    109. arrangeSeat();
    110. //绘制会议排座图片
    111. $("#jie_input").on("click", function(event) {
    112. $('.add').hide();
    113. event.preventDefault();
    114. html2canvas(document.getElementById("screen_body")).then(function(canvas) {
    115. var dataUrl = canvas.toDataURL();
    116. //console.log(dataUrl);
    117. var param = {};
    118. param['seatPic'] = dataUrl;
    119. param['id'] = '${param.id}';
    120. //console.log(param);
    121. //TODO 此处需要完成会议排座图片上传操作
    122. $.ajax({
    123. //此处保存的是base64 数据 需要转换成图片
    124. url: '../meetingInfoAction.action?methodName=addArrangeSeat',
    125. data: param,
    126. type: 'post',
    127. dataType: 'json',
    128. success: function(resp) {
    129. if(resp.code == 0) {
    130. layer.msg("保存成功!",{icon: 1},function (){
    131. //先得到当前iframe层的索引
    132. var index = parent.layer.getFrameIndex(window.name);
    133. //再执行关闭
    134. parent.layer.close(index);
    135. //调用父窗口的查询方法更新数据
    136. //parent.loadMeetingInfo();
    137. })
    138. }else{
    139. layer.msg(resp.msg);
    140. }
    141. }
    142. })
    143. });
    144. });
    145. });
    146. //初始化排座人员信息
    147. //默认加载坐席人员
    148. function arrangeSeat() {
    149. $.ajax({
    150. url: "../meetingInfoAction.action?methodName=listUsersMeetingInfo",
    151. data: {
    152. id: '${param.id}'
    153. },
    154. type: 'get',
    155. dataType: 'json',
    156. success: function(resp) {
    157. //console.log(resp);
    158. $.each(resp.data, function(i,v) {
    159. $("#dan_input").val(v.name);
    160. addDanMu();
    161. });
    162. }
    163. });
    164. }
    165. //添加会议排座
    166. function addDanMu() {
    167. var dan = document.getElementById("dan_input").value;
    168. if (dan == "") {
    169. layer.msg('请输入弹幕~', {icon: 4});
    170. //alert("请输入弹幕~");
    171. return false;
    172. } else {
    173. document.getElementById("dan_input").value = ""; //清空 弹幕输入框
    174. // var br = document.createElement("BR"); //
    175. var node = document.createElement("DIV"); //
    176. var tipsArr = document.getElementsByClassName('tips');
    177. var i;
    178. // console.log(parseInt(tipsArr[tipsArr.length-1].id.substr(4))+1);
    179. if (tipsArr.length == 0) {
    180. i = 1
    181. } else {
    182. i = parseInt(tipsArr[tipsArr.length - 1].id.substr(4)) + 1;
    183. }
    184. // var aNode = document.createElement("P");   //

    185. node.setAttribute("class", "tips");
    186. node.setAttribute("id", "tips" + i);
    187. node.setAttribute("onmouseover", "dragF.drag('tips" + i + "');");
    188. var textnode = document.createTextNode(dan); // 创建个 文本节点, 将用户输入的弹幕,存入 创建的 元素节点

    189. // aNode.appendChild(textnode);
    190. node.appendChild(textnode);
    191. // document.body.appendChild(br);
    192. // document.body.appendChild(node);
    193. document.getElementById("tu").appendChild(node);
    194. return true;
    195. }
    196. }
    197. //下载
    198. /* function downloadFile(fileName, content) {
    199. let aLink = document.createElement('a');
    200. let blob = this.base64ToBlob(content); //new Blob([content]);
    201. let evt = document.createEvent("HTMLEvents");
    202. evt.initEvent("click", true, true); //initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为
    203. aLink.download = fileName;
    204. aLink.href = URL.createObjectURL(blob);
    205. // aLink.dispatchEvent(evt);
    206. //aLink.click()
    207. aLink.dispatchEvent(new MouseEvent('click', {
    208. bubbles: true,
    209. cancelable: true,
    210. view: window
    211. })); //兼容火狐
    212. } */
    213. //base64转blob
    214. /* function base64ToBlob(code) {
    215. let parts = code.split(';base64,');
    216. let contentType = parts[0].split(':')[1];
    217. let raw = window.atob(parts[1]);
    218. let rawLength = raw.length;
    219. let uInt8Array = new Uint8Array(rawLength);
    220. for (let i = 0; i < rawLength; ++i) {
    221. uInt8Array[i] = raw.charCodeAt(i);
    222. }
    223. return new Blob([uInt8Array], {
    224. type: contentType
    225. });
    226. } */
    227. script>
    228. html>
    229. 2.将base64转为图片文件方法 java
    230. //base64字符串转化成图片
    231. public static boolean GenerateImage(String imgStr)
    232. {   //对字节数组字符串进行Base64解码并生成图片
    233.    if (imgStr == null) //图像数据为空
    234.        return false;
    235.    BASE64Decoder decoder = new BASE64Decoder();
    236.    try
    237.   {
    238.        //Base64解码
    239.        byte[] b = decoder.decodeBuffer(imgStr);
    240.        for(int i=0;i
    241.       {
    242.            if(b[i]<0)
    243.           {//调整异常数据
    244.                b[i]+=256;
    245.           }
    246.       }
    247.        //生成jpeg图片
    248.        String imgFilePath = "D:\\课件与作业\\作业\\1.jpg";//新生成的图片
    249.        OutputStream out = new FileOutputStream(imgFilePath);
    250.        out.write(b);
    251.        out.flush();
    252.        out.close();
    253.        return true;
    254.   }
    255.    catch (Exception e)
    256.   {
    257.   e.printStackTrace();
    258.        return false;
    259.   }
    260. }

    5.select插件多选演示

    formSelects-v4.js 基于Layui的多选解决方案

    文档地址分享 ↓

    formSelects 基于Layui的多选解决方案 (hnzzmsf.github.io)

    效果图:

     

     

    6.签字插件介绍 签字后保存图片

    效果演示 保存后像后天发送base64数据

    签字前端代码实现

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2.    pageEncoding="UTF-8"%>
    3. html>
    4. <html>
    5. <head>
    6. <%@include file="/common/head.jsp" %>
    7. <link rel="stylesheet" type="text/css" href="${ctx}/static/js/sign/css/www.jsdaima.com.css">
    8. <link rel="stylesheet" type="text/css" href="${ctx}/static/js/sign/font/iconfont.css">
    9. <script type="text/javascript" src="${ctx}/static/js/sign/layui-sign.js">script>
    10. head>
    11. <style>
    12. body{
    13. margin:5px;
    14. }
    15. style>
    16. <script>
    17. layui.use(['form'], function() {
    18. let form = layui.form;
    19. //根据用户选择的会议记录填写会议标题及会议内容 此处可越过
    20. form.val('audit', $.extend({}, parent.row||{}));
    21. });
    22. //获取签字图片数据
    23. function getData() {
    24. return document.getElementById("canvas").toDataURL("image/png");
    25. }
    26. script>
    27. <body>
    28. <div style="padding:10px 20px 10px 10px;">
    29.    <form class="layui-form layui-form-pane" lay-filter="audit">
    30. <input type="hidden" id="id" name="id"/>
    31. <input type="hidden" id="auditor" value="${sessionScope.user.id }"/>
    32.        <div class="layui-form-item">
    33.            <label class="layui-form-label">会议标题label>
    34.            <div class="layui-input-block">
    35.               <input type="text" name="title" autocomplete="off" class="layui-input" readonly="readonly">
    36.            div>
    37.        div>
    38.        <div class="layui-form-item layui-form-text">
    39.    <label class="layui-form-label">会议内容label>
    40.    <div class="layui-input-block">
    41.      <textarea placeholder="请输入内容" name="content" class="layui-textarea" readonly="readonly">textarea>
    42.    div>
    43. div>
    44.   <div class="canvasBox">
    45. <div class="contro">
    46. <ul class="drawType">
    47. <li data-name="pen" data-nameNum="0">
    48. <span class="icon iconfont icon-qianbi">span>
    49. <span class="iconAlert">铅笔span>
    50. li>
    51. <li class="remote">
    52. <span class="icon iconfont icon-delete">span>
    53. <span class="iconAlert">清空span>
    54. li>
    55. ul>
    56. div>
    57. <div class="canvasDraw">
    58. <div class="drawFont" data-type="hide">
    59. <span class="intoFont">span>
    60. <input type="text" class="intoFontInput">
    61. div>
    62. <canvas id="canvas" width="624" height="150">canvas>
    63. div>
    64. div>
    65. <div class="layui-form-item" style="text-align:center;">
    66.   <button type="button" lay-submit="audit" lay-filter="user" class="layui-btn layui-btn-normal">审核button>
    67.   <button type="reset" class="layui-btn">重置button>
    68. div>
    69.    form>
    70. div>
    71. body>
    72. html>

    获取的数据发送至后台 使用上面给的base64方法可解析成图片

  • 相关阅读:
    buuctf [BJDCTF2020]Easy MD5
    React使用create-react-app创建react项目
    数据结构【红黑树模拟实现】
    Vue3中的常用组件通信大总结 包括最Vue3.4defineModel()实现组件双向绑定
    如何训练神经网络模型,神经网络模型是干嘛的
    【Torch】torch.load( )系列语句解读解读,易学易用
    文本关键信息抽取-面向复杂文本结构的实体关系联合抽取研究(论文研读)(二)
    第46节——redux中使用不可变数据+封装immer中间件——了解
    rsync远程同步
    【算法|动态规划No.22】leetcode115. 不同的子序列
  • 原文地址:https://blog.csdn.net/qq_62898618/article/details/126364497