jQuery EasyUI中文实战教程从零基础入门到企业级项目案例开发详解
前言:为什么选择jQuery EasyUI?
在Web开发领域,尤其是企业级内部管理系统开发中,快速构建美观、功能强大的用户界面是至关重要的。jQuery EasyUI正是为此而生的一个轻量级前端UI框架。它基于jQuery构建,提供了丰富的UI组件,如数据网格(DataGrid)、表单验证、对话框、树形菜单等,能够极大地提升开发效率。
与Bootstrap等通用框架不同,EasyUI专注于数据密集型应用,特别适合后台管理系统、ERP、CRM等企业级应用的开发。它的学习曲线平缓,对于熟悉jQuery的开发者来说,几乎可以无缝上手。本教程将从零基础开始,逐步深入,最终通过一个完整的企业级项目案例,带你全面掌握jQuery EasyUI的开发精髓。
第一部分:零基础入门篇
1. 环境搭建与Hello World
1.1 下载与引入
首先,我们需要从官方网站或GitHub下载jQuery EasyUI的库文件。推荐下载开发版,因为它包含了完整的源码和示例,便于学习和调试。
下载后,解压到你的项目目录中。一个基本的HTML页面需要引入以下文件:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>EasyUI Hello World</title> <!-- 1. 引入jQuery核心库 --> <script type="text/javascript" src="jquery.min.js"></script> <!-- 2. 引入EasyUI的核心CSS --> <link rel="stylesheet" type="text/css" href="easyui/themes/default/easyui.css"> <!-- 3. 引入EasyUI的图标CSS --> <link rel="stylesheet" type="text/css" href="easyui/themes/icon.css"> <!-- 4. 引入EasyUI的核心JS --> <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script> <!-- 5. 引入EasyUI的中文语言包 --> <script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js"></script> </head> <body> <!-- 这里将放置我们的EasyUI组件 --> </body> </html> 代码解析:
- 顺序至关重要:必须先引入jQuery,再引入EasyUI。因为EasyUI是依赖于jQuery的插件。
- 主题:
themes/default/easyui.css定义了EasyUI组件的默认外观。你可以更换default为其他主题,如black、bootstrap等。 - 语言包:
easyui-lang-zh_CN.js用于将界面中的提示信息(如“请选择一行数据”)汉化。
1.2 第一个组件:可折叠的面板(Panel)
Panel是EasyUI中最基础的容器组件。我们来创建一个简单的面板。
<body> <div id="p" class="easyui-panel" style="width:500px;height:200px;padding:10px;" data-options="title:'我的第一个面板',iconCls:'icon-save',collapsible:true"> 欢迎来到jQuery EasyUI的世界!这是一个简单的面板组件。 </div> </body> 代码解析:
- HTML结构:我们只需要一个
<div>标签。 - CSS类:
class="easyui-panel"是关键,它告诉EasyUI将这个div渲染成一个面板组件。 - 内联样式:
style属性定义了面板的宽度、高度和内边距。 - data-options:这是EasyUI的魔法所在。它是一个HTML5自定义属性,用于配置组件的选项。这里我们设置了:
title: 面板标题。iconCls: 标题栏图标(icon-save对应一个软盘图标)。collapsible: 是否可折叠。
效果:一个带有标题、保存图标、可折叠按钮的面板就生成了。无需编写一行JavaScript代码!
2. 核心概念:属性、事件与方法
EasyUI组件的交互主要通过三种方式控制:
- 属性(Options):配置组件的静态特征,如宽度、高度、是否显示等。
- 事件(Events):组件在特定时刻触发的动作,如点击按钮、加载数据完成等。
- 方法(Methods):通过JavaScript代码主动调用的功能,如刷新表格、打开对话框等。
2.1 使用JavaScript初始化组件
虽然data-options很方便,但在复杂场景下,我们更常用JavaScript来初始化组件,这样代码更清晰,也更容易控制。
<body> <div id="p2" style="width:500px;height:200px;padding:10px;"> 这个面板是用JS初始化的。 </div> <script> $(function(){ $('#p2').panel({ title: 'JS初始化的面板', iconCls: 'icon-edit', collapsible: true, // 这是一个事件 onOpen: function(){ console.log('面板被打开了!'); } }); // 调用方法:折叠面板 // setTimeout(function(){ // $('#p2').panel('collapse', true); // true表示带动画效果 // }, 3000); }); </script> </body> 代码解析:
$(function(){ ... }):这是jQuery的文档就绪函数,确保DOM加载完成后再执行JS。$('#p2').panel({ ... }):通过选择器选中元素,然后调用.panel()方法,并传入一个配置对象(包含属性和事件)。onOpen:这是一个事件回调函数,当面板打开时触发。$('#p2').panel('collapse', true):这是调用方法。第一个参数是方法名'collapse',后面的参数是传递给该方法的参数。这里我们用注释演示了如何在3秒后通过JS代码折叠面板。
第二部分:核心组件详解
1. 数据网格(DataGrid) - 企业应用的灵魂
DataGrid是EasyUI中最强大、最常用的组件,用于以表格形式展示和操作数据。
1.1 基础表格渲染
假设我们有一段JSON数据,需要展示在表格中。
<body> <table id="dg" style="width:700px;height:300px"></table> <script> // 模拟的后端数据 var data = [ {"id":1, "name":"张三", "email":"zhangsan@example.com", "city":"北京"}, {"id":2, "name":"李四", "email":"lisi@example.com", "上海"}, {"id":3, "name":"王五", "email":"wangwu@example.com", "广州"} ]; $(function(){ $('#dg').datagrid({ data: data, // 直接加载本地数据 fitColumns: true, // 自动扩展列宽以适应表格宽度 striped: true, // 显示斑马线 rownumbers: true, // 显示行号 columns: [[ { field: 'id', title: 'ID', width: 50 }, { field: 'name', title: '姓名', width: 100 }, { field: 'email', title: '邮箱', width: 150 }, { field: 'city', title: '城市', width: 80 } ]] }); }); </script> </body> 代码解析:
columns:这是DataGrid的核心配置。它是一个二维数组,支持表头分组。每个字段配置对象包含:field: 对应JSON数据中的键名。title: 表头显示的文本。width: 列宽。
fitColumns: true:当列总宽度超过表格宽度时,自动缩放列宽,避免出现横向滚动条(在某些情况下可能需要禁用)。
1.2 远程数据加载与分页
在实际项目中,数据通常来自服务器,并且需要分页。DataGrid内置了强大的分页支持。
<body> <table id="dg_remote" style="width:700px;height:300px"></table> <script> $(function(){ $('#dg_remote').datagrid({ url: '/api/users', // 后端数据接口地址 method: 'GET', // 请求方式 pagination: true, // 启用分页栏 pageSize: 10, // 默认每页显示10条 pageList: [10, 20, 50], // 可选的每页条数 columns: [[ { field: 'id', title: 'ID', width: 50 }, { field: 'name', title: '姓名', width: 100 }, { field: 'status', title: '状态', width: 80, formatter: function(value, row, index){ // 格式化器:将状态码转换为中文 if (value == 1) return '<span style="color:green">正常</span>'; if (value == 0) return '<span style="color:red">禁用</span>'; return value; }} ]] }); }); </script> </body> 后端数据格式约定: 当pagination: true时,EasyUI会向后端发送两个关键参数:
page: 当前页码。rows: 每页显示条数。
后端需要返回特定格式的JSON:
{ "total": 100, // 总记录数 "rows": [ // 当前页的数据数组 {"id":1, "name":"张三", "status":1}, {"id":2, "name":"李四", "status":0} ] } 代码解析:
url: 指向后端API。EasyUI会自动附加page和rows参数。formatter: 这是一个非常有用的属性。它是一个函数,接收单元格的值、当前行数据和行索引,返回格式化后的HTML字符串。这里我们将状态码1和0渲染成了带颜色的中文文本。
2. 表单(Forms)与验证
企业应用中充满了数据录入,EasyUI提供了强大的表单组件和验证机制。
2.1 基础表单与验证规则
<body> <form id="ff" method="post"> <div style="margin-bottom:20px"> <label>用户名:</label> <input class="easyui-validatebox" type="text" name="username" data-options="required:true,missingMessage:'请输入用户名'" /> </div> <div style="margin-bottom:20px"> <label>邮箱:</label> <input class="easyui-validatebox" type="text" name="email" data-options="validType:'email',invalidMessage:'邮箱格式不正确'" /> </div> <div style="margin-bottom:20px"> <label>年龄:</label> <input class="easyui-numberbox" type="text" name="age" data-options="min:18,max:100,required:true" /> </div> <div> <a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">提交</a> <a href="javascript:void(0)" class="easyui-linkbutton" onclick="clearForm()">重置</a> </div> </form> <script> function submitForm(){ // 1. 进行表单验证 $('#ff').form('validate', { onSubmit: function(){ // 这里可以做一些提交前的额外逻辑 console.log('正在提交表单...'); return true; // 返回false则停止提交 }, success: function(data){ // data是后端返回的JSON字符串,需要解析 var result = JSON.parse(data); if(result.success){ $.messager.alert('提示', '提交成功!'); } else { $.messager.alert('错误', '提交失败:' + result.msg); } } }); // 注意:实际项目中,这里通常会调用 $('#ff').form('submit', { url: '...' }); // 为了演示,我们手动模拟一下 if($('#ff').form('validate')){ // 模拟提交 $.post('/api/save', $('#ff').serialize(), function(res){ // 这里的res应该是JSON对象 if(res.success) $.messager.alert('提示', '提交成功!'); }); } } function clearForm(){ $('#ff').form('clear'); // 清空表单数据 } </script> </body> 代码解析:
easyui-validatebox:基础验证框。通过data-options设置:required: true: 必填。validType: 内置验证类型,如'email'、'url'、'length[5,10]'等。
easyui-numberbox:数字输入框,自动限制输入为数字,并可设置范围。$('#ff').form('validate'):调用表单的validate方法,触发表单内所有验证框的验证。如果全部通过,返回true。$.messager.alert:EasyUI提供的消息提示框,比原生的alert更美观。
第三部分:企业级项目案例 - 员工管理系统
我们将开发一个简单的员工管理系统,包含员工列表展示、新增/编辑员工、删除员工功能。
1. 项目结构
/employee-system ├── index.html # 主页面 ├── js/ │ └── app.js # 业务逻辑JS └── css/ └── style.css # 自定义样式 2. 页面布局 (index.html)
使用layout组件构建经典的后台管理系统布局:顶部、左侧菜单、主内容区。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>企业员工管理系统</title> <link rel="stylesheet" type="text/css" href="easyui/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="easyui/themes/icon.css"> <script type="text/javascript" src="easyui/jquery.min.js"></script> <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script> <script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript" src="js/app.js"></script> </head> <body class="easyui-layout" style="height:100vh;"> <!-- 顶部 --> <div data-options="region:'north',title:'企业员工管理系统',split:true" style="height:60px; padding:10px; font-size:20px; font-weight:bold;"> <span>欢迎管理员: admin</span> <a href="javascript:void(0)" onclick="logout()" style="float:right;">退出</a> </div> <!-- 左侧菜单 --> <div data-options="region:'west',title:'系统菜单',split:true" style="width:200px;"> <div class="easyui-accordion" style="width:100%;height:100%;"> <div title="员工管理" data-options="iconCls:'icon-man'" style="padding:10px;"> <ul class="easyui-tree"> <li onclick="openEmployeeTab()">员工信息管理</li> </ul> </div> <div title="系统设置" data-options="iconCls:'icon-set'" style="padding:10px;"> <ul class="easyui-tree"> <li>用户管理</li> <li>角色管理</li> </ul> </div> </div> </div> <!-- 主内容区 (使用Tabs实现多页签) --> <div data-options="region:'center',title:'工作区'"> <div id="mainTabs" class="easyui-tabs" style="width:100%;height:100%;"> <div title="首页" style="padding:20px;overflow:hidden;"> <div style="margin-top:20px;font-size:18px;text-align:center;"> 欢迎使用系统,请从左侧菜单选择功能。 </div> </div> </div> </div> </body> </html> 3. 业务逻辑 (js/app.js)
这里我们将实现核心功能:在Tab中打开员工管理页面,渲染DataGrid,并实现增删改查。
// 全局配置:让所有ajax请求自动带上token等(此处省略) $.ajaxSetup({ error: function(xhr, status, error) { if (xhr.status === 401) { $.messager.alert('错误', '登录已过期,请重新登录!', 'warning', function(){ window.location.reload(); }); } } }); // 1. 打开员工管理Tab页 function openEmployeeTab() { var tabPanel = $('#mainTabs'); var tabTitle = '员工信息'; // 检查Tab是否已存在 if (tabPanel.tabs('exists', tabTitle)) { tabPanel.tabs('select', tabTitle); return; } // 动态创建Tab内容 var content = ` <div class="easyui-layout" data-options="fit:true"> <!-- 顶部工具栏 --> <div data-options="region:'north',border:false" style="height:50px;padding:10px;"> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" onclick="addEmployee()">新增</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-edit" onclick="editEmployee()">编辑</a> <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-remove" onclick="deleteEmployee()">删除</a> <input id="searchbox" class="easyui-searchbox" data-options="prompt:'请输入姓名搜索',searcher:doSearch" style="width:200px;"></input> </div> <!-- 数据表格区域 --> <div data-options="region:'center',border:false"> <table id="employeeGrid" class="easyui-datagrid" style="width:100%;height:100%" data-options="url:'api/employees',method:'get',pagination:true,fitColumns:true,rownumbers:true,striped:true,toolbar:'#tb'"> <thead> <tr> <th data-options="field:'ck',checkbox:true"></th> <th data-options="field:'id',width:50">ID</th> <th data-options="field:'name',width:100">姓名</th> <th data-options="field:'dept',width:100">部门</th> <th data-options="field:'salary',width:100,formatter:formatSalary">薪资</th> <th data-options="field:'entryDate',width:100">入职日期</th> </tr> </thead> </table> </div> </div> `; tabPanel.tabs('add', { title: tabTitle, content: content, closable: true, iconCls: 'icon-man' }); } // 格式化薪资 function formatSalary(value, row, index) { if (value) return '¥' + value; return ''; } // 2. 搜索功能 function doSearch(value) { $('#employeeGrid').datagrid('load', { name: value // 将搜索条件作为参数发送给后端 }); } // 3. 新增员工 (使用Dialog) function addEmployee() { // 如果Dialog已存在,直接打开 if ($('#empDialog').length === 0) { $('body').append(` <div id="empDialog" class="easyui-dialog" style="width:400px;height:300px;padding:20px;" data-options="title:'员工信息',modal:true,closed:true,buttons:'#dlg-buttons'"> <form id="empForm" method="post"> <input type="hidden" name="id" /> <div style="margin-bottom:15px"> <label>姓名:</label> <input class="easyui-validatebox" name="name" data-options="required:true" style="width:200px" /> </div> <div style="margin-bottom:15px"> <label>部门:</label> <select class="easyui-combobox" name="dept" data-options="panelHeight:'auto',editable:false" style="width:200px"> <option value="技术部">技术部</option> <option value="市场部">市场部</option> <option value="人事部">人事部</option> </select> </div> <div style="margin-bottom:15px"> <label>薪资:</label> <input class="easyui-numberbox" name="salary" data-options="min:0,precision:2" style="width:200px" /> </div> <div style="margin-bottom:15px"> <label>入职日期:</label> <input class="easyui-datebox" name="entryDate" style="width:200px" /> </div> </form> </div> <div id="dlg-buttons"> <a href="javascript:void(0)" class="easyui-linkbutton" onclick="saveEmployee()">保存</a> <a href="javascript:void(0)" class="easyui-linkbutton" onclick="$('#empDialog').dialog('close')">取消</a> </div> `); } // 清空表单并打开 $('#empForm').form('clear'); $('#empDialog').dialog('open').dialog('setTitle', '新增员工'); } // 4. 编辑员工 function editEmployee() { var row = $('#employeeGrid').datagrid('getSelected'); if (!row) { $.messager.alert('提示', '请先选择要编辑的员工!'); return; } // 确保Dialog已创建 if ($('#empDialog').length === 0) addEmployee(); // 加载数据 $('#empForm').form('load', row); $('#empDialog').dialog('open').dialog('setTitle', '编辑员工'); } // 5. 保存员工 (新增或更新) function saveEmployee() { // 验证表单 if (!$('#empForm').form('validate')) return; var formData = $('#empForm').serializeObject(); // 需要扩展jQuery方法或手动获取 // 模拟保存请求 $.ajax({ url: 'api/employee/save', type: 'POST', data: formData, success: function(result) { if (result.success) { $.messager.alert('提示', '保存成功!'); $('#empDialog').dialog('close'); $('#employeeGrid').datagrid('reload'); // 刷新表格 } else { $.messager.alert('错误', '保存失败:' + result.msg); } } }); } // 6. 删除员工 function deleteEmployee() { var row = $('#employeeGrid').datagrid('getSelected'); if (!row) { $.messager.alert('提示', '请先选择要删除的员工!'); return; } $.messager.confirm('确认', '您确定要删除 ' + row.name + ' 吗?', function(r) { if (r) { // 模拟删除请求 $.post('api/employee/delete', {id: row.id}, function(result) { if (result.success) { $('#employeeGrid').datagrid('reload'); } else { $.messager.alert('错误', '删除失败!'); } }); } }); } // 扩展jQuery,支持serializeObject,方便获取表单数据 $.fn.serializeObject = function() { var o = {}; var a = this.serializeArray(); $.each(a, function() { if (o[this.name]) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; }; // 模拟退出 function logout() { $.messager.confirm('确认', '确定要退出系统吗?', function(r){ if (r){ window.location.reload(); } }); } 4. 案例总结与技术点
在这个案例中,我们综合运用了以下EasyUI高级特性:
- Layout布局:
easyui-layout构建了页面骨架,region属性定义区域。 - Tabs页签:
easyui-tabs实现了多页签工作区,支持动态添加和关闭,这是后台管理系统的标配。 - Accordion折叠面板:用于左侧菜单,节省空间。
- 动态渲染:通过JavaScript动态生成Tab内的HTML字符串,实现了按需加载,提升性能。
- Dialog对话框:用于表单的弹出式编辑,
modal:true使其成为模态框,背景不可操作。 - 表单组件组合:在Dialog中使用了
validatebox、combobox(下拉框)、numberbox、datebox(日期选择器)等多种组件。 - 数据交互:
datagrid('load', params):动态加载数据并传递参数(用于搜索)。datagrid('reload'):刷新当前页面数据。form('load', data):将JSON数据填充到表单。dialog('open')/dialog('close'):控制对话框显示。
第四部分:高级技巧与最佳实践
1. 自定义主题
EasyUI默认主题是蓝色的,但企业可能有自己的品牌色。 方法:
- 使用官方提供的主题生成器(Theme Roller)。
- 直接修改
easyui/themes/default/easyui.css中的CSS变量(不推荐,升级困难)。 - 创建自己的主题文件夹,复制
default主题的CSS,修改颜色值,然后在HTML中引入新CSS。
2. 性能优化
- 使用
loader:对于大型应用,可以使用$.parser.onComplete回调,在所有组件解析完毕后再显示页面,避免页面闪烁。 - 避免全局解析:如果页面很大,可以使用
$.parser.parse('#container')只解析指定容器内的组件,而不是默认的整个页面。 - 数据缓存:对于不常变化的下拉框数据,可以一次性加载并缓存,避免每次打开表单都请求。
3. 与现代前端框架结合
虽然EasyUI是基于jQuery的,但也可以在Vue或React中使用(虽然不推荐在新项目中这样做,但在维护老项目时很有用)。 Vue示例:
// 在Vue的mounted生命周期钩子中初始化 mounted() { this.$nextTick(() => { $('#dg').datagrid({ ... }); }); }, beforeDestroy() { // 销毁组件,防止内存泄漏 $('#dg').datagrid('destroy'); } 4. 常见问题排查
- 图标不显示:检查
icon.css路径是否正确,或者是否引入了自定义图标包。 - 中文不显示:确保引入了
easyui-lang-zh_CN.js,且路径正确。 - DataGrid不加载数据:检查浏览器控制台Network面板,看请求是否发出,后端返回的数据格式是否符合
{total:0, rows:[]}规范。 - 验证不生效:确保调用了
form('validate'),且输入框有class="easyui-validatebox"。
结语
jQuery EasyUI虽然不像Vue、React那样是现代前端框架,但它在企业级快速开发领域依然占有一席之地。它的优势在于简单、高效、稳定。通过本教程的学习,你应该已经掌握了从基础组件使用到构建完整企业级应用的流程。
记住,优秀的开发者不仅仅是会用工具,更是理解工具背后的设计思想。在实际项目中,多思考如何封装通用的组件(如通用的查询面板、通用的CRUD对话框),将重复的代码抽象出来,这样才能真正发挥EasyUI的威力,实现从入门到精通的跨越。
支付宝扫一扫
微信扫一扫