定制app开发使用Layui制作界面及功能

本期精彩:定制app开发使用前端框架Layui定制app开发制作常用界面,定制app开发并且实现对应的功能 b( ̄▽ ̄)d 

一、什么是Layui

  1. 定制app开发是一套开源的 Web UI 解决方案,定制app开发采用自身经典的模块化规范,定制app开发并遵循原生 HTML/CSS/JS 定制app开发的开发方式,极易上手,拿来即用,定制app开发其风格简约轻盈,定制app开发而组件优雅丰盈,定制app开发从源代码到使用方法的每一处细节都经过精心雕琢,非常适合网页界面的快速开发
  2. layui区别于那些基于MVVM 底层的前端框架,却并非逆道而行,而是信奉返璞归真之道
  3. 准确地说,它更多是面向后端开发者,你无需涉足前端各种工具,只需面对浏览器本身,让一切你所需要的元素与交互,从这里信手拈来
  •    官方网站:https://www.layui.com/(已下线)
  •    参考地址:http://layui.org.cn/demo/index.html(非官网)👇

它是由国人开发(作者贤心)的,16年出厂的框架,其主要提供了很多好看、方便的样式,并且基本拿来即用,和Bootstrap有些相似,但该框架有个极大的好处就是定义了很多前后端交互的样式接口,如分页表格,只需在前端配置好接口,后端则按照定义好的接口规则返回数据,即可完成页面的展示,极大减少了后端人员的开发成本

二、Layui、Easyui与Bootstrap的对比

1、layui、easyui、bootstrap的对比

有趣的对比方式👇
easyui=jquery+html4(用来做后台的管理界面) 半老徐娘,风韵犹存
bootstrap=jquery+html5  要钱
layui 清纯少女

2、 layui和bootstrap对比(这两个都属于UI渲染框架)

a、历史发展对比

  • layui是国人开发的一套框架,2016年出来的,现在已更新到2.X版本了。比较新,轻量级,样式简单好看(目前官网已下架,开源了)
  • bootstrap 相对来说是比较成熟的一个框架,现在已经更新到4.X版本。是一个很成熟的框架,这个大部分人一般都用过

b、适用范围对比

  • layui其实更偏向与后端开发人员使用,在服务端页面上有非常好的效果,适合做后台框架
  • layui 是提供给后端开发人员最好的ui框架,基于DOM驱动,在实现前端交互上比较麻烦,页面的增删改查都需要查询DOM元素。所以在不需要交互的时候,用layui还是不错的(说这句话的人,只能说明你对layui不了解)
  • bootstrap 在前端响应式方面做得很好,PC端和移动端表现都不错,适合做网站

如果是类似官网,且需要同时满足PC端和移动端效果,bootstrap 表现很好,但是如果是要交互的网站,比如商城之类,layui显然更好,前后端分离

c、大小对比

  • layui 轻量级
  • bootsrap 因为成熟,所以使用方便,但是同时也是因为成熟,就显得有些冗余

3、layui和easyui对比

  1. easyui 是非开源的,有需要解决的问题的话,就只能等官方更新了
  2. layui是开源的,社区比较活跃,解决问题还是比较快的
  3. easyui诞生的早些,所以功能相对完善一些,很多功能都能是比较健全的
  4. layui就相对来说少一些了,不过,功能都是像官网说的,精雕细琢
  5. layui更符合现在的审美

三、Layui的使用

使用前的引入 

第一步: 将layui下载到本地

第二步:将其完整地放置到你的项目目录(或静态资源服务器)

 第三步:并在页面中分别引入👇

  1. <!-- 引入 layui.css -->
  2. <link rel="stylesheet" href="xxx/layui.css">
  3. <!-- 引入 layui.js -->
  4. <script src="xxx/layui.js">

扩展一个layui(自定义模块)

  1、确认模块名,假设为:test.js文件放入项目任意目录下(注意:不用放入layui目录)

  2、编写test.js

  1. layui.define(function(exports){//模块也可以依赖其它模块,如layui.define('layer',callback);
  2.       var obj = {
  3.          hello: function(str){
  4.             alert('Hello '+ (str||'test'));
  5.          }
  6.       };
  7.       //输出test接口
  8.       exports('test', obj);
  9.    });   

  3、设定扩展模块所在的目录,然后就可以在别的JS文件中使用

  1.  layui.config({
  2.       base: '/res/js/' //假设这是test.js所在的目录
  3.    }).extend({ //设定模块别名
  4.       test: 'test' //如果test.js是在根目录,也可以不用设定别名
  5.    });
  6.    //使用test
  7.    layui.use('test', function(){
  8.       var test = layui.test;
  9.       test.hello('World!'); //弹出Hello World!
  10.    });

四、登陆界面及功能的制作 

1、导入相关jar包
 

2、代码的编写

  • 为了方便后续的导入和使用,我们可以将导入Layui的代码和一些其他的公共方法等封装在一个通用帮助类CommonUtils中👇 
  1. public class CommonUtils {
  2. public static void toJson(String code,String msg,HttpServletResponse resp) {
  3. try {
  4. ObjectMapper mapper=new ObjectMapper();
  5. Map<String,Object> json=new HashMap<String,Object>();
  6. json.put("code", code);
  7. json.put("msg", msg);
  8. mapper.writeValue(resp.getOutputStream(), json);
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. public static void toJson(String code,Object data,HttpServletResponse resp) {
  14. try {
  15. ObjectMapper mapper=new ObjectMapper();
  16. Map<String,Object> json=new HashMap<String,Object>();
  17. json.put("code", code);
  18. json.put("data", data);
  19. mapper.writeValue(resp.getOutputStream(), json);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. public static void toJson(String code,int total,Object data,HttpServletResponse resp) {
  25. try {
  26. ObjectMapper mapper=new ObjectMapper();
  27. Map<String,Object> json=new HashMap<String,Object>();
  28. json.put("code", code);
  29. json.put("data", data);
  30. json.put("total",total);
  31. mapper.writeValue(resp.getOutputStream(), json);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. /**
  37. * 根据ResultSet数据集,利用反射机制动态赋值并返回List<T>
  38. * @param rs ResultSet数据集
  39. * @param clazz 实体类对象
  40. * @return 返回List实体集合
  41. * @throws Exception
  42. */
  43. public static <T> List<T> toList(ResultSet rs,Class<T> clazz) throws Exception{
  44. //定义实体集合
  45. List<T> lst=new ArrayList<T>();
  46. //获取ResultSet的metadata列信息
  47. ResultSetMetaData metaData = rs.getMetaData();
  48. //获取对象属性集合
  49. Field[] fields=clazz.getDeclaredFields();
  50. //循环ResultSet
  51. while(rs.next()) {
  52. //反射机制实例化
  53. T obj = clazz.newInstance();
  54. for (int i = 0; i < metaData.getColumnCount(); i++) {
  55. //获取列名
  56. String columnName=metaData.getColumnLabel(i+1).toUpperCase();
  57. for (Field field : fields) {
  58. //判断属性名与列名是否相同
  59. if(field.getName().toUpperCase().equals(columnName)) {
  60. //获取属性对应的set方法名,方法名首字母大写
  61. String methodName="set"+field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1);
  62. //获取属性对应的set方法
  63. Method method = obj.getClass().getDeclaredMethod(methodName, field.getType());
  64. //设置访问权限
  65. method.setAccessible(true);
  66. //执行set方法,将数据存储到对象中的相应属性中
  67. method.invoke(obj, rs.getObject(columnName));
  68. break;
  69. }
  70. }
  71. }
  72. lst.add(obj);
  73. }
  74. return lst;
  75. }
  76. /**
  77. * 多表查询时返回结果集,利用反射机制赋值
  78. * @param rs
  79. * @return 返回List<Map<String,Object>>
  80. * @throws Exception
  81. */
  82. public static List<Map<String,Object>> toList(ResultSet rs) throws Exception{
  83. //定义实体集合
  84. List<Map<String,Object>> lst=new ArrayList<Map<String,Object>>();
  85. //获取ResultSet的metadata列信息
  86. ResultSetMetaData metaData = rs.getMetaData();
  87. Map<String,Object> set=null;
  88. while(rs.next()) {
  89. set=new HashMap<String,Object>();
  90. for (int i = 0; i < metaData.getColumnCount(); i++) {
  91. String columnName=metaData.getColumnLabel(i+1);
  92. set.put(columnName, rs.getObject(columnName));
  93. }
  94. lst.add(set);
  95. }
  96. return lst;
  97. }
  98. }
  • 编写用户实体类
  1. public class User {
  2. private String name;
  3. private String password;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public String getPassword() {
  11. return password;
  12. }
  13. public void setPassword(String password) {
  14. this.password = password;
  15. }
  16. @Override
  17. public String toString() {
  18. return "User [name=" + name + ", password=" + password + "]";
  19. }
  20. }
  • 参考并使用Layui官方文档编写登陆界面

        1、先封装样式

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%
  4. request.setAttribute("ctx", request.getContextPath());
  5. %>
  6. <meta name="viewport" content="width=device-width,initial-scale=1.33,minimum-scale=1.0,maximum-scale=1.0">
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="renderer" content="webkit">
  10. <meta http-equiv="Content-Language" content="zh-CN">
  11. <link rel="stylesheet" rev="stylesheet" href="${ctx}/css/iconfont.css" type="text/css" media="all">
  12. <link rel="stylesheet" rev="stylesheet" href="${ctx}/css/login.css" type="text/css" media="all">
  13. <link rel="stylesheet" rev="stylesheet" href="${ctx}/js/layui/css/layui.css" type="text/css" media="all">
  14. <script type="text/javascript" src="${ctx}/js/layui/layui.js"></script>
  15. <script type="text/javascript" src="${ctx}/js/config.js"></script>
  16. <script>
  17. var ctx = "${ctx}";
  18. </script>

        2、登陆界面代码

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <html>
  4. <head>
  5. <%@include file="/common/head.jsp" %>
  6. <style>
  7. body {
  8. color: #;
  9. }
  10. a {
  11. color: #;
  12. }
  13. a:hover {
  14. color: #;
  15. }
  16. .bg-black {
  17. background-color: #;
  18. }
  19. .tx-login-bg {
  20. background: url(images/bg.jpg) no-repeat 0 0;
  21. }
  22. </style>
  23. <script type="text/javascript">
  24. layui.use(['jquery','layer'], function() {
  25. let $ = layui.jquery;
  26. let layer = layui.layer;
  27. $("#login").click(function() {
  28. $.ajax({
  29. url: ctx + "/loginAction.action?methodName=login",
  30. data: {
  31. name: $("#username").val(),
  32. password: $("#password").val()
  33. },
  34. type: 'post',
  35. dataType: 'json',
  36. success: function(resp) {
  37. if(resp.code == 1) {
  38. layer.alert('酷毙了', {icon: 1});
  39. } else {
  40. layer.alert('失败了', {icon: 5});
  41. }
  42. }
  43. })
  44. })
  45. });
  46. </script>
  47. </head>
  48. <body class="tx-login-bg">
  49. <div class="tx-login-box">
  50. <div class="login-avatar bg-black"><i class="iconfont icon-wode"></i></div>
  51. <ul class="tx-form-li row">
  52. <li class="col-24 col-m-24"><p><input type="text" id="username" placeholder="登录账号" class="tx-input"></p></li>
  53. <li class="col-24 col-m-24"><p><input type="password" id="password" placeholder="登录密码" class="tx-input"></p></li>
  54. <li class="col-24 col-m-24"><p class="tx-input-full"><button id="login" class="tx-btn tx-btn-big bg-black">登录</button></p></li>
  55. <li class="col-12 col-m-12"><p><a href="#" class="f-12 f-gray">新用户注册</a></p></li>
  56. <li class="col-12 col-m-12"><p class="ta-r"><a href="#" class="f-12 f-gray">忘记密码</a></p></li>
  57. </ul>
  58. </div>
  59. </body>
  60. </html>

3、最终效果

登陆成功时👇 

登陆失败时👇 

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发