EasyWeb 前端开发文档

EasyWeb 前端开发文档

1.简介

基于jquery、layui的管理系统模板,单页面、响应式、支持mvvm、极易上手!

  • 演示地址:https://whvse.gitee.io/easywebpage/
  • 演示账号:随便输    密码:随便输

 EasyWeb包含前后台,
前台地址,
分离版后台地址,
不分离版后台地址,
后台基于springboot、mybatis、mybatis-plus、Security、OAuth2等,不分离版权限使用shiro。

 此文档包含分离和不分离版本的前端开发指南,两者的使用是有些区别的,
不同的地方在文档中都着重指明了,参考文档使用即可。

1.1.使用框架

描述 框架
核心框架 Layui、jQuery
路由框架 Q.js (纯js轻量级路由框架)
mvvm框架 pandyle.js (专为jquery编写的mvvm)
主要特色 单页面 / 响应式 / 简约 / 极易上手

1.2.项目结构

|-assets
|     |-css                     // 样式
|     |-images                  // 图片
|     |-libs                    // 第三方库
|
|-pages            // html组件
|     |-system                  // 系统管理页面
|     |-xxxxxx                  // 其他业务页面
|     |-tpl                     // 公用组件
|     |     |-message.html                 // 消息
|     |-console.html            // 主页一
|     |-header.html             // 头部
|     |-side.html               // 侧导航
|
|-module                // js模块 (使用layui的模块开发方式)
|     |-admin.js                // admin模块
|     |-config.js                // config模块
|     |-index.js                // index模块
|
|-index.html            // 主界面
|-login.html            // 登陆界面

不分离版没有pages目录,不分离版的页面由后台输出,前端只有assets和module

2.快速开始

  快速开始之前请确保你已经接触过layui并了解layui的使用,
尤其是layui模块的使用。否则看本文档会比较吃力。

2.1.导入项目

  1. 直接下载项目,或使用git下载;

  2. 使用IDEA(WebStorm)或者HBuilder等前端开发工具进行开发;

  3. 运行login.html或者index.html启动:

    [图片上传失败...(image-8cb507-1639444934181)]

2.2.添加一个业务界面

注意:以下操作针对于分离版本,不分离版本菜单维护在数据库,页面由后台渲染,不需要前端有复杂的操作。

比如你要做一个CMS系统,添加一个文章管理界面:

  • 第一步:

    在pages文件夹下面建一个目录cms,然后新建一个页面article.html

    [图片上传失败...(image-f424e7-1639444934181)]

    article.html完整代码:

     

    文章管理

    首页 文章管理
    搜索:
  • 第二步:

    在module/config.js里面找到menus变量,添加如下所示:

    [图片上传失败...(image-89d3c3-1639444934181)]

  • 第三步:

    运行项目,查看效果

    [图片上传失败...(image-36214a-1639444934181)]

2.3.添加第三方layui扩展模块

分离版本和不分离版本添加layui扩展模块都按如下方式来。

请参考项目里面formSelects的添加方法。

  • 第一步: 把下载的模块放在module文件夹下面

  • 第二步: 打开index.html

     layui.config({
         base: 'module/'
     }).extend({
         formSelects: 'formSelects/formSelects-v4'
     }).use(['config', 'admin', 'formSelects'], function () {
         var config = layui.config;
         var admin = layui.admin;
         var formSelects = layui.formSelects;
    
     });
    

  如果你的模块没有文件夹直接在module里面就不需要写extend了,如果你的模块有独立的文件夹,像formSelects一样,
就需要在extend里面明确指出模块的位置。

[图片上传失败...(image-c70190-1639444934181)]


3.开发指南

3.1.开发规范

阅读开发规范之前请先了解前面“项目结构”的介绍。

  1. css、图片、第三方lib(layui扩展模块除外)全部放在“/assets/”下面;
  2. layui扩展模块放在“module”下面,例如项目里面“formSelects”模块;
  3. 页面html放在“pages”下面。

注意:不分离版本html不需要放在“pages”下面,随便放,因为是后端渲染,前端只需要访问后端的url。
比如我这里不分离版本是放在templates目录下面,templates是SpringBoot默认的视图目录。

3.2.入口index.html

index.html是项目的主入口,打开index.html你会看到如下代码:

layui.config({
    base: 'module/'
}).extend({
    formSelects: 'formSelects/formSelects-v4'
}).use(['config', 'admin','index'], function () {
    var config = layui.config;
    var admin = layui.admin;
    var index = layui.admin;
    
});

  这段代码首先告诉了lauyui扩展模块都位于“module/”下面,然后扩展模块因为formSelects使用了文件夹
存放,所以需要在“extend”中明确指出formSelects模块js的位置。  为什么admin.js、config.js不需要写extend,
因为admin和config是直接放在module里面。

  接着index.html里面使用了“config”、“admin”等模块,所以admin模块里面的一些方法也就即刻执行了。
admin提供的默认事件也就生效了。

注意:不分离版本去除了config.js,所以index.html不需要加载config。

3.3.“config”模块介绍

注意:不分离版本去除了config.js,不分离的项目也不需要前端做任何配置和缓存。

“config”模块主要是配置项目的一些基本参数。

名称 类型 描述
base_server 变量 服务器接口地址
tableName 变量 本地存储表名(token等都会存储在本地中)
pageTabs 变量 是否开启多标签模式,(不分离版本在index.js中配置)
getToken 方法 获取缓存的token
putToken 方法 缓存token
removeToken 方法 清除缓存的token
menus 变量 侧导航菜单数组,侧导航根据menus自动渲染
getUser 方法 获取缓存的用户信息
putUser 方法 缓存用户的信息

注意:因为我这边的后台返回的token是这样的

{
    "access_token": "950a7cc9-5a8a-42c9-a693-40e817b1a4b0",
    "token_type": "bearer",
    "refresh_token": "773a0fcd-6023-45f8-8848-e141296cb3cb",
    "expires_in": 27036,
    "scope": "select"
}

  所以我这边的token不是一个字符串存储的,是用json存储的,getToken返回的是一个json对象,
如果你的token只是一个字符串,请修改getToken方法和admin里面的req方法,当然我建议最好
命令你的后台人员按这个json格式返回数据,这个是一个标准的格式。

3.3.1.“config”使用示例

layui.use(['config'], function () {
    var config = layui.config;

    var token = config.getToken();  // 获取token
    var access_token = token.access_token;  //获取access_token
    
    config.putToken(xxx);
});

3.3.2.“menus”数组介绍

config.js里面的menus格式如下:

menus: [{
    name: '主页',
    url: 'javascript:;',
    icon: 'layui-icon-home',
    subMenus: [{
        name: '主页一',
        url: '#!console',
        path: 'console.html'
    }]
}, {
    name: '系统管理',
    icon: 'layui-icon-set',
    url: 'javascript:;',
    subMenus: [{
        name: '用户管理',
        url: '#!user',  // 这里url不能带斜杠
        path: 'system/user.html',
        auth: 'post:/user/query'
    }, {
        name: '角色管理',
        url: '#!role',
        path: 'system/role.html',
        auth: 'get:/role'
    }]
}, {
    name: '多级菜单',
    url: 'javascript:;',
    icon: 'layui-icon-unlink',
    subMenus: [{
        name: '二级菜单',
        url: 'javascript:;',
        subMenus: [{
            name: '三级菜单',
            url: 'javascript:;'
        }]
    }]
}, {
    name: '一级菜单',
    url: 'javascript:;',
    icon: 'layui-icon-unlink'
},{
    name: '我是隐藏菜单',
    url: '#!userDetail',
    path: 'system/user_detail.html',
    hidden: true
}]

  index.js里面会自动使用menus数组渲染左侧导航栏,并且会使用url作为关键字自动注册路由监听。
目前只设定了最多支持三菜单,原因是因为模板引擎渲染无法使用递归,所以写了三层循环,如果你需要更多级的菜单,
继续加循环就可以了,主要是因为无法递归,并不是无法做到无限级。

  • path 表示html所在的路径,会在pages目录下面寻找。
  • url 是路由的关键字,也就是说点击这个菜单,浏览器地址栏的url会变成/#!xxx
  • auth 表示这个菜单需要什么权限,index.js渲染的时候会自动判断权限,没有权限不会渲染出来,不写auth不会进行判断。
  • hidden 表示菜单是否渲染到左侧导航栏,比如用户详情界面,不需要渲染到左侧导航,name最好也填写,因为在多标签功能中,
    name是作为选项卡的标题。建议隐藏的菜单都写在最后面,不要写在subMenus里面,当然写在哪都可以实现。
    如何打开隐藏的菜单,直接使用即可,或者Q.go('userDetail')

 上面的menus数组已经展示了各种不同的写法,根部不同场景决定某些参数是否填写。

注意:

  路由关键字url不能带/,在EasyWeb1.0版本中,url是以#!system/xxx这种格式作为关键字的,这种注册方法
是把system/开头的所有url一起注册,但是在2.0版本中使用的是循环menus数组一个一个注册,所以url有/就会变成第一种格式,是不正确的。

3.4.admin模块介绍

admin模块做了很多的操作,这里只重点介绍admin对外封装的一些操作方法。

不分离版本admin.js去掉了hasPerm方法,其他方法可以放心使用。

3.4.1.admin提供的默认事件

使用示例:

全屏
折叠导航

  只需要在DOM节点上面添加ew-event="xx"即可,此时这个DOM节点就会自动加入相关的点击事件了。全部事件如下表:

事件 描述
flexible 折叠侧导航
refresh 刷新主体部分
back 浏览器后退
theme 打开主题设置弹窗
fullScreen 全屏切换
leftPage 左滚动选项卡
rightPage 右滚动选项卡
closeThisTabs 关闭当前选项卡
closeOtherTabs 关闭其他选项卡
closeAllTabs 关闭全部选项卡
closeDialog 关闭元素所在的layer弹窗

3.4.2.admin提供的方法

使用示例:

layui.use(['admin'], function () {
    var admin = layui.admin;

    admin.flexible(true);    // 折叠侧导航
});

全部方法:

方法 参数 描述
flexible(expand) true和false 折叠侧导航
activeNav(url) a标签里面的href值 设置侧导航栏选中
refresh() 刷新主体部分
popupRight(path) html地址 右侧弹出弹窗
closePopupRight() 关闭右侧弹出
popupCenter(object) 见单独说明 中间弹出弹窗
finishPopupCenter() 关闭中间弹出弹窗并回调finish方法
closePopupCenter() 关闭中间弹出弹窗
open(object) 见单独说明 封装layer弹出弹窗
req(url, data, success, method) 见单独说明 封装的ajax请求,req只返回json
ajax(object) 见单独说明 封装的ajax请求
hasPerm(auth) 权限标识 判断用户是否有权限,不分离版本无此方法
putTempData(key, value) key,value 缓存临时数据
getTempData(key,) key 获取缓存的临时数据
rollPage(d) 方向 滚动选项卡tab


首先说明一下admin为什么要封装那么多layer的弹窗,因为admin封装的弹窗都是支持弹窗的内容是一个单独的页面,
并且不是以iframe的方式嵌入页面,也就是单页面的形式。


3.4.2.1.右侧弹出弹窗popupRight

使用示例:

admin.popupRight('pages/tpl/message.html');

分离版本填写独立的html页面即可,不分离版本填写后台的url(Controller)

“message.html”里面也可以有js代码,如下所示:

  • 通知
  • 私信
  • 待办

注意:因为是单页面,不是iframe,所以页面里面请不要写 </code>之类的东西。</p> </blockquote> <p>效果图:</p> <p>[图片上传失败...(image-1717f7-1639444934181)]</p> <h5>3.4.2.2.中间弹出弹窗popupCenter</h5> <p>  admin封装的popupCenter虽然没有什么特别的样式,但是带有回调的功能。</p> <p>使用示例(一般用在表单弹窗,如添加、修改用户等):</p> <pre><code class="javascript">admin.popupCenter({ title: '添加用户', path: 'pages/system/user_form.html', finish: function () { // 这个方法就是回调的功能,用户添加成功之后让表格reload table.reload('user-table', {}); } }); </code></pre> <p><strong>参数说明:</strong></p> <table> <thead> <tr> <th style="text-align:left">参数</th> <th style="text-align:left">类型</th> <th style="text-align:left">是否必须</th> <th style="text-align:left">描述</th> </tr> </thead> <tbody> <tr> <td style="text-align:left">title</td> <td style="text-align:left">变量</td> <td style="text-align:left">否</td> <td style="text-align:left">标题,不写没有标题</td> </tr> <tr> <td style="text-align:left"><code>path</code></td> <td style="text-align:left">变量</td> <td style="text-align:left">是</td> <td style="text-align:left">html路径</td> </tr> <tr> <td style="text-align:left"><code>finish</code></td> <td style="text-align:left">方法</td> <td style="text-align:left">否</td> <td style="text-align:left">finish回调</td> </tr> <tr> <td style="text-align:left">success</td> <td style="text-align:left">方法</td> <td style="text-align:left">否</td> <td style="text-align:left">html渲染完毕的回调</td> </tr> <tr> <td style="text-align:left">end</td> <td style="text-align:left">方法</td> <td style="text-align:left">否</td> <td style="text-align:left">弹窗关闭的回调</td> </tr> <tr> <td style="text-align:left">...</td> <td style="text-align:left">...</td> <td style="text-align:left">...</td> <td style="text-align:left">省略更多参数</td> </tr> </tbody> </table> <p><br></p> <blockquote> <p>请注意,除了<code>path</code>和<code>finish</code>是popupCenter新增的参数,其他参数均与layer的open参数一样,但是<code>type</code>和<code>content</code>参数无效,<br> type固定是1(页面层),content会被path的内容覆盖。</p> </blockquote> <p><br></p> <p>“user_form.html”内容如下:</p> <pre><code class="html"><form id="user-form" lay-filter="user-form" class="layui-form model-form"> <!-- ...省略表单内容 --> </form> <script> layui.use(['admin', 'form'], function () { var admin = layui.admin; var form = layui.form; // 表单提交事件 form.on('submit(user-form-submit)', function (data) { layer.load(2); // 这里是用admin封装的ajax请求 admin.req('user', data.field, function (data) { layer.closeAll('loading'); if (data.code == 200) { layer.msg('添加成功', {icon: 1}); // 这里是关键,调用这个方法就触发finish回调并且关闭弹窗 admin.finishPopupCenter(); } else { layer.msg('添加失败', {icon: 2}); } }, 'POST'); return false; }); }); </script> </code></pre> <p>示例图:</p> <p>[图片上传失败...(image-e1f1ee-1639444934181)]</p> <p>完整示例代码:</p> <pre><code class="javascript">// 全部参数都写 admin.popupCenter({ title: '添加用户', path: 'pages/system/user_form.html', finish: function () { // finish回调 }, success: function() { // user_form.html成功渲染到弹窗中 }, end: function() { // 弹窗关闭 } }); // 只写必须参数 admin.popupCenter({path: 'pages/system/user_form.html'}); </code></pre> <p><br></p> <h5>3.4.2.3.封装的layer弹窗open</h5> <p>  前面讲了admin所封装的弹窗目的是在不使用iframe的前提下支持使用独立的页面,这样便于我们维护代码,减少一个页面里面的代码量。</p> <p>使用方法:</p> <pre><code class="javascript">admin.open({ title: 'xxx', path: 'system/user_form.html', success: function(){ } }); </code></pre> <p>参数说明:</p> <p>  <code>path</code>是新增的参数,其他参数均为layer.open的参数,但是<code>type</code>和<code>content</code>参数无效,type固定是1(页面层),<br> content会被path的内容覆盖,open没有finish方法,popupCenter才有。</p> <p><br></p> <p><strong>如何让弹窗出现滚动条?</strong></p> <p>  弹窗的默认高度是自适应的,设置了宽高后内容超出是无法出现滚动条的,因为出现弹窗里面的下拉框select下拉会出现滚动条,所以amdin.css里面<br> 禁止了弹窗的滚动条,如果你需要弹窗出现滚动条,请使用如下的方式:</p> <pre><code class="javascript">admin.open({ title: 'xxxxx', area: ['500px','300px'], path: 'system/user/editForm', success: function (layero, index) { // 关键代码, ↑↑↑↑↑↑↑↑↑↑↑↑↑(上面的两个参数不要忘了) $(layero).children('.layui-layer-content').css('overflow-y', 'scroll'); } }); </code></pre> <p>只需要在success回调方法里面手动加上样式就可以了。</p> <pre><code class="javascript">// 写scroll可以防止弹窗内表格出现滚动条 $(layero).children('.layui-layer-content').css('overflow-y', 'scroll'); // 弹窗内没有表格使用auto即可 $(layero).children('.layui-layer-content').css('overflow-y', 'auto'); // 水平垂直都有滚动条使用overflow $(layero).children('.layui-layer-content').css('overflow', 'auto'); </code></pre> <p>admin.popupCenter也同样支持此使用方法</p> <p><br></p> <h5>3.4.2.4.封装的ajax请求req</h5> <blockquote> <p>注意:req不支持指定返回的数据类型(json、html、text等),只会返回json的数据。</p> </blockquote> <p>  admin模块封装的ajax请求会自动传递token(access_token),并且会自动把PUT、DELETE请求转成POST、GET请求<br> 然后加参数_method,因为浏览器不支持PUT、DELETE请求的参数传递,具体原因请百度一下,<strong>不分离版本不会进行此操作</strong>。</p> <p>  另外分离版本和不分离版本封装的ajax和req都会检验状态码(401登录过期,403没有权限),登录过期会自动跳转到登录界面。</p> <p>使用示例:</p> <pre><code class="javascript">// 不传递参数的写法 admin.req('user', {}, function (data) { console.log(JSON.stringify(data)); }, 'GET'); // 传递参数的写法 admin.req('user', { userId: 'xxx', userName: '张三' }, function (data) { console.log(JSON.stringify(data)); }, 'POST'); </code></pre> <p><strong>方法参数说明:</strong></p> <ul> <li>第一个参数: 接口地址,会自动在前面加入config.base_server</li> <li>第二个参数: 传给服务器的参数</li> <li>第三个参数: 请求成功的回调(如果出现http错误404,401等,也会进入这个回调,并且data里面会有code、msg两个参数,<br> code是http的错误码,msg是错误信息)</li> <li>第四个参数: 请求的方法(GET、POST、PUT、DELETE)</li> </ul> <p> req还会自动判断token是否过期,如果token过期会自动跳转到登录页面,不分离版本是根据code判断401为登录过期。</p> <h5>3.4.2.5.封装的ajax请求ajax</h5> <p>使用方法:</p> <pre><code class="javascript">admin.ajax({ url: 'xxxx', data: { aa:'' }, dataType: 'json', type: 'POST', success: function(result,status,xhr) { } }); </code></pre> <p> 使用方法跟<code>$.ajax</code>一模一样,admin封装只是在success之后先判断是否为登录过期和没有权限,然后再执行你的success方法。</p> <p> 使用参数也跟<code>$.ajax</code>一样,请到http://www.runoob.com/jquery/ajax-ajax.html文档中查看<code>$.ajax</code>的参数说明。</p> <p><br></p> <h5>3.4.2.6.判断是否有权限hasPerm</h5> <blockquote> <p>注意:不分离版本没有此方法。</p> </blockquote> <p>  这个方法是用来判断当前登录的用户是否有某一权限的操作,使用这个方法的前提是在index.js里面有一个获取<br> 服务器的user信息并使用config.putUser方法缓存,并且user里面包含了权限列表,因为admin会调用config.getUser获取<br> 用户信息从而获取用户的权限列表。</p> <p>  我这里面服务器返回的用户json信息如下所示,如果你的服务器返回的信息跟下面不一样,请修改hasPerm方法:</p> <pre><code class="json">{ "userId": "admin", "username": "admin", "nickName": "管理员", "authorities": [{ "authority": "get:/role" }, { "authority": "put:/role" }] } </code></pre> <p>authorities就是用户的权限集合,authority是权限标识。</p> <p>使用示例,下面的示例是演示没有删除用户的权限隐藏删除按钮:</p> <pre><code class="html"><div> <button id="btn-delete">删除</button> </div> <script> layui.use(['admin'], function () { var admin = layui.admin; if(!admin.hasPerm('delete:user')) { $('#btn-delete').hide(); // remove()也可以 } }); </script> </code></pre> <blockquote> <p>如果你担心把按钮隐藏了没有什么卵用,会点技术就可以把按钮在弄出来了,这个担心完全是多余的。<br> 因为后台的接口也会有权限验证的,如果没有权限接口会返回{ code: 401, msg: "没有访问权限" },<br> 既然后台限制了,界面为什么还要限制,因为这是需求,如你项目没有隐藏按钮的需求可以不用隐藏。</p> </blockquote> <h5>3.4.2.7.缓存临时数据putTempData</h5> <p>  这个方法是用来把一些临时数据放在session中,页面关闭数据就会失效。 适当使用缓存可以<br> 减少接口请求次数,提升用户体验。</p> <p>使用示例:</p> <pre><code class="javascript"> admin.putTempData('t_name', '张三'); // 缓存数据 var tName = admin.getTempData('t_name'); // 获取缓存数据 console.log(tName); </code></pre> <p><strong>使用场景:</strong></p> <p>  前面讲了popupCenter弹出添加用户的界面,如果是修改用户,是不是应该传递user的信息呢,<br> 因为修改界面需要回显user的信息,这时就可以用putTempData了,当然也有别的办法传递,这里就不一一演示了。</p> <p>修改用户按钮的界面(user.html):</p> <pre><code class="html"><button id="btn-update">修改用户</button> <script> layui.use(['admin'], function () { var admin = layui.admin; admin.putTempData('t_user', {name: 'xx', sex: 'male'}); // 关键代码 admin.popupCenter({ title: '修改用户', path: 'pages/system/user_form.html', finish: function () { } }); }); </script> </code></pre> <p>修改用户弹窗的界面(user_form.html):</p> <pre><code class="html"><form id="user-form" lay-filter="user-form" class="layui-form model-form"> <!-- ...省略表单内容 --> </form> <script> layui.use(['admin', 'form'], function () { var admin = layui.admin; var form = layui.form; var user = admin.getTempData('t_user'); // 关键代码 form.val('user-form', user); //回显数据 }); </script> </code></pre> <h5>3.4.2.8 滚动选项卡 rollPage</h5> <p>使用示例:</p> <pre><code class="javascript">// 向左滚动 admin.rollPage('left'); // 滚动到当前选中的选项卡 admin.rollPage('auto'); // 向右滚动 admin.rollPage(); </code></pre> <p>参数说明:</p> <ul> <li>left - 向左滚动</li> <li>auto - 滚动到当前选项卡</li> <li>其他 - 向右滚动,不写参数就是向右滚动</li> </ul> <h3>3.5.index模块介绍</h3> <p>  index模块主要是用于加载index.html的<br> header、side等,获取用户的信息,判断是否开启选项卡改变页面局部等操作,说白了就是用来初始化后台布局的,用于给主体部分的界面<br> 做准备,虽然index.js里面代码行数也不少,但是仔细看就能看懂,注释也都写了,如果你需要<br> 微微修改阅读几遍就可以上手修改了,下面只介绍两个其他页面会用到的封装方法。</p> <blockquote> <p>需要注意的是:分离和不分离版本的index.js和index.html里面的一些写法有很些不同,请注意不要用混淆了。</p> </blockquote> <h4>3.5.1.打开新页面或选项卡Tab</h4> <pre><code class="javascript">layui.use(['index'], function () { var index = layui.index; // 不分离用后台地址 index.openNewTab({ title:'个人信息', url:'system/user/myInfo?userId=1', menuId: 'myInfo' }); // 分离用html页面 index.openNewTab({ title: '个人信息', url: 'pages/system/myInfo.html', menuId: 'myInfo' }); // 当然这行代码一般会写在按钮点击事件里面,直接写在这里就立即打开新页面了 }); </code></pre> <ul> <li> <code>title</code> 如果开启了多标签,title是选项卡的标题</li> <li> <code>url</code> 打开的页面地址</li> <li> <code>menuId</code> 这个参数是一个id标识,浏览器地址栏会变成<code>#!menuId</code>。</li> </ul> <p>这个功能的使用场景请见<code>3.8.1</code>章节</p> <h4>3.5.2.关闭选项卡</h4> <pre><code class="javascript">layui.use(['index'], function () { var index = layui.index; var menuId = 'myInfo'; index.closeTab(menuId); }); </code></pre> <hr> <h3>3.6.admin提供的css公共类</h3> <blockquote> <p>分离和不分离版本css都是一样的,这部分文档就不需要注意什么了,哈哈~</p> </blockquote> <h4>3.6.1.辅助类</h4> <table> <thead> <tr> <th style="text-align:left">类名(class)</th> <th style="text-align:left">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align:left">icon-btn</td> <td style="text-align:left">带图标的按钮,如果你的按钮用了图标加上类这个更好看</td> </tr> <tr> <td style="text-align:left">date-icon</td> <td style="text-align:left">在元素的右边加入日期的图标</td> </tr> <tr> <td style="text-align:left">layui-link</td> <td style="text-align:left">用于a标签,字体颜色为layui的绿色风格</td> </tr> <tr> <td style="text-align:left">layui-text</td> <td style="text-align:left">用于a标签的上层,a标签字体颜色为蓝色</td> </tr> <tr> <td style="text-align:left">pull-right</td> <td style="text-align:left">右浮动</td> </tr> <tr> <td style="text-align:left">inline-block</td> <td style="text-align:left">设置元素display为inline-block</td> </tr> </tbody> </table> <p>[图片上传失败...(image-d2b892-1639444934181)]</p> <hr> <p>[图片上传失败...(image-59c488-1639444934181)]</p> <hr> <p>[图片上传失败...(image-c2d39e-1639444934181)]</p> <hr> <p>[图片上传失败...(image-434d3b-1639444934181)]</p> <pre><code class="html"><!-- 日期图标 --> <input class="layui-input date-icon" type="text" placeholder="请选择日期范围"/> <!-- 图标按钮 --> <button class="layui-btn icon-btn"><i class="layui-icon layui-icon-search"></i>搜索</button> <button class="layui-btn icon-btn"><i class="layui-icon layui-icon-add-1"></i>添加</button> <!-- 绿色超链接 --> <a href="javascript:;" class="layui-link">帐号注册</a> <a href="javascript:;" class="layui-link pull-right">忘记密码?</a> <!-- 蓝色超链接 --> <div class="layui-text"> <a href="http://www.layui.com/">layui-v2.3.0</a> <a href="https://github.com/itorr/q.js">q.js</a> <a href="https://gitee.com/pandarrr/pandyle">pandyle.js</a> </div> </code></pre> <h4>3.6.2.表格上方的工具栏</h4> <table> <thead> <tr> <th style="text-align:left">类名(class)</th> <th style="text-align:left">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align:left">search-input</td> <td style="text-align:left">表格上面的输入框样式</td> </tr> <tr> <td style="text-align:left">toolbar</td> <td style="text-align:left">表格上方工具栏样式</td> </tr> </tbody> </table> <pre><code class="html"><div class="layui-card-body"> <div class="layui-form toolbar"> <!-- 关键代码toolbar --> 搜索: <select> <option value="">-请选择-</option> <option value="user_id">ID</option> <option value="username">账号</option> </select>  <!-- 关键代码search-input --> <input class="layui-input search-input" type="text" placeholder="输入关键字"/>  <button class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button> <button class="layui-btn icon-btn"><i class="layui-icon"></i>添加</button> </div> <table class="layui-table" id="user-table" lay-filter="user-table"></table> </div> </code></pre> <p>[图片上传失败...(image-b849dc-1639444934181)]</p> <h4>3.6.3.弹窗里面的表单</h4> <table> <thead> <tr> <th style="text-align:left">类名(class)</th> <th style="text-align:left">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align:left">model-form</td> <td style="text-align:left">弹窗里面的表单样式</td> </tr> <tr> <td style="text-align:left">model-form-footer</td> <td style="text-align:left">弹窗里面表单底部操作按钮容器的样式</td> </tr> </tbody> </table> <pre><code class="html"><form class="layui-form model-form"> <!-- 关键代码model-form --> <div class="layui-form-item"> <label class="layui-form-label">账号</label> <div class="layui-input-block"> <input name="username" placeholder="请输入账号" type="text" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">性别</label> <div class="layui-input-block"> <input type="radio" name="sex" value="男" title="男" checked/> <input type="radio" name="sex" value="女" title="女"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">角色</label> <div class="layui-input-block"> <select name="roleId" xm-select="roleId" lay-verify="required"> </select> </div> </div> <!-- 关键代码model-form-footer --> <div class="layui-form-item model-form-footer"> <button class="layui-btn layui-btn-primary close" type="button">取消</button> <button class="layui-btn" lay-filter="user-form-submit" lay-submit>保存</button> </div> </form> </code></pre> <p>[图片上传失败...(image-22463-1639444934181)]</p> <h4>3.6.4.完全基于layui后台大布局</h4> <p>  EasyWeb完全基于layui的后台大布局进行样式修改,html结构是完全基于layui的后台大布局的,所以项目里面的<br> admin.css你可以用于任何layui后台大布局的页面,加入之后你的页面就得到EasyWeb的样式了, 但是侧导航栏<br> 的折叠事件、全屏等事件是写在admin.js里面的,所以建议你直接使用EasyWeb的框架,当然如果你有自己的基于layui后台<br> 大布局的框架,完全可以使用我的admin.css。</p> <h3>3.7.鼠标经过自动弹出tips层</h3> <p>使用示例:</p> <pre><code class="html"><button class="layui-btn" lay-tips="大家好!">按钮</button> </code></pre> <p>  只需要在你的DOM节点上面添加<code>lay-tips="xxx"</code>,然后这个节点在鼠标滑过的时候就会自动显示tips层了,简单吧!</p> <p><strong>默认提示位置在元素的上面,修改位置可以这样做:</strong></p> <pre><code class="html"><button class="layui-btn" lay-tips="大家好!" lay-direction="2">按钮</button> </code></pre> <p>再加一个<code>lay-direction</code>属性就可以了,参数如下:</p> <ul> <li>1 - 上面,默认,可以不写</li> <li>2 - 右边</li> <li>3 - 下面</li> <li>4 - 左边</li> </ul> <p>效果图:</p> <p>[图片上传失败...(image-250a03-1639444934181)]</p> <h3>3.8.路由的使用</h3> <p>  路由这里使用的是Q.js框架,如果你的左侧菜单是配置在config.menus里面的话,不需要自己注册路由监听,<br> index.js里面会自动帮你注册。</p> <p>  如果你需要自己添加路由注册监听的话,请参考q.js的开发文档:Q.js。</p> <p><strong>注意:</strong><br><br>   EasyWeb里面使用的q.js进行过修改,我在里面加了一个刷新的方法,所以请不要擅自替换q.js文件,如果你发现<br> q.js框架出来新版本了,请联系我进行替换,请多多包含,不要嫌麻烦,以免出问题。</p> <h4>3.8.1.打开不在导航栏中的页面</h4> <p>  比如用户详情、个人信息这些页面,它们不在左侧导航中,但是想打开新页面或者选项卡,<br> 又比如添加用户、修改用户这个页面现在是用弹窗的形式,如果想用新页面的形式该怎么实现:</p> <p><strong>第一种实现方式:</strong><br><br>  在分离版本中,你只需要在config.js的menus数组中添加一个隐藏的菜单:</p> <pre><code class="javascript">menus: [{ name: '个人信息', url: '#!myInfo', path: 'system/my_info.html', hidden: true }] </code></pre> <p>html中跳转:</p> <pre><code class="html"><a href="#!myInfo">个人信息</a> </code></pre> <p>js中跳转:</p> <pre><code class="javascript">Q.go('myInfo'); </code></pre> <blockquote> <p>或许你已经注意到了,这种方式跳转的界面是一个固定页面,如果我们想要传递一些参数,<br> 它就无法满足,所以有了第二种实现方式。</p> </blockquote> <p><strong>第二种实现方式:</strong><br></p> <pre><code class="javascript">layui.use(['index'], function () { var index = layui.index; // 不分离用后台地址 index.openNewTab({ title:'个人信息', url:'system/user/myInfo?userId=1', menuId: 'myInfo' }); // 分离用html页面 index.openNewTab({ title: '个人信息', url: 'pages/system/myInfo.html', menuId: 'myInfo' }); // 当然这行代码一般会写在按钮点击事件里面,直接写在这里就立即打开新页面了 }); </code></pre> <ul> <li> <code>title</code> 如果开启了多标签,title是选项卡的标题</li> <li> <code>url</code> 打开的页面地址</li> <li> <code>menuId</code> 这个参数是一个id标识,如果id一样就只会存在一个tab,也就是说打开一次没有关闭就不会再打开新的页面,<br> 比如用户详情页面,如果你想userA的详情和userB的详情是两个页面,可以同时存在选项卡中,menuId就不要写一样的。</li> </ul> <blockquote> <p>注意:<br><br> 分离版本两种方式都可以用,不分离版本只能用第二种方式,再分离版本中不能使用<code>?</code>问号传递参数,建议使用<br> 临时缓存的方式传递参数。</p> </blockquote> <p>请到<code>3.5.1</code>和<code>3.5.2</code>章节查看跟这个使用场景相关的其他功能方法。</p> <hr> <h3>3.9.mvvm数据绑定、组件等</h3> <p>  虽然现在vue很流行,但是jquery的许多方法仍然很好用,所以现在很多项目里面既有vue,又有jquery,<br> 然而对于开发一个后台管理系统来说,我们仅仅用了vue的数据渲染功能,大部分还是用的jquery的代码,这样一来项目<br> 就显得有点不伦不类了。</p> <p>  但是对于前后端分离来说,mvvm的框架渲染数据确实很方便,很强大,layui虽然提供了模板引擎,<br> 但是写法别扭,还麻烦,pandyle.js是一个为jquery打造的mvvm框架,还提供了类似vue组件的写法。</p> <p>  EasyWeb里面的头部header、side等都是使用的它的组件的写法,还有一些下拉框select的渲染也是用的它提供的mvvm的写法。</p> <p>  我这里就不提供pandyle.js的用法了,以免跟不上pandyle作者的更新脚步,<br> 大家可以到这里pandyle.js查看pandyle的开发文档。</p> <blockquote> <p>注意:<br><br>   不分离版本没有引入pandyle.js,不分离版本的header和side是使用beetl的布局功能实现的,如果你需要在<br> 不分离版本中使用mvvm,请自行在idnex.html中引入pandyle.js。</p> </blockquote> <h3>3.10.主题功能</h3> <p>  EasyWeb包含前后台,所以开发时间比较紧张,暂时只提供了两套主题,但是提供了一个主题生成器,<br> 请使用主题生成器定制化你的样式:EasyWeb主题生成器。</p> <p> EasyWeb的主题生成器可以深度定制主题,样式深度到按钮、单选框、下拉框、选项卡等样式。</p> <h3>3.11.不分离版本</h3> <p>注意:</p> <p>  你从EasyWebPage这个地址下载下来的项目是前后端分离版本的,如果你需要前后端不分离版本的页面和后台,<br> 请从easyweb-shiro下载。 easyweb-shiro是Java语言开发的,如果你是<br> php或其他后台语言,想要使用不分离版的页面,请联系作者辅助你结合到你的项目中,因为不分离版本页面跟后台耦合比较大,<br> 分离出静态页面意义不大,所以不分离版本作者就没有独立再维护成纯静态页面了。</p> <h3>3.12.树形表格treeTable</h3> <p>在layui的数据表格上进行扩展实现的。</p> <p>treeTable项目地址:https://gitee.com/whvse/treetable-lay。</p> <ul> <li>演示地址: https://whvse.gitee.io/treetable-lay/ </li> </ul> <p>截图:</p> <p>树形表格1:</p> <p>[图片上传失败...(image-e9353f-1639444934181)]</p> <p>树形表格2:</p> <p>[图片上传失败...(image-3697b1-1639444934181)]</p> <h2>4.项目截图</h2> <p>[图片上传失败...(image-72245d-1639444934181)]</p> <p>[图片上传失败...(image-4cb828-1639444934181)]</p> <p>[图片上传失败...(image-7e6670-1639444934181)]</p> <p>[图片上传失败...(image-d7568b-1639444934181)]</p> <hr> <h2>5.更新日志</h2> <ul> <li><strong>2018-07-22 - 增加树形表格的功能</strong></li> </ul> <h3>- 增加树形表格的功能 [treeTable] (#_312树形表格treeTable)</h3> <ul> <li> <p><strong>2018-07-20 - 发布不分离版的easyweb-shiro稳定版本</strong></p> <ul> <li>不分离版没有config.js,但是同样支持分离版的所有功能</li> <li>改进路由的注册方法,全部由框架自动完成,开发方式与传统一样,但是可以轻松的使用路由功能提升操作体验</li> </ul> </li> <li> <p><strong>2018-07-12 - 增加主题、多标签</strong></p> <ul> <li>增加多标签tab功能,并且增加自由切换是否开启多标签功能</li> </ul> </li> </ul> <h1>- 增加主题切换功能,上线 主题生成器 ,自由生成主题样式</h1> <ul> <li> <p><strong>2018-06-28 - 发布全新2.0版本</strong></p> <ul> <li>引入pandyle.js(mvvm框架),填补layui模板引擎的短板</li> <li>采用模块化开发方式,定义admin、config等公用模块,封装ajax请求</li> <li>界面优化,借鉴layadmin的设计风格,改版登录页面</li> </ul> </li> <li> <p><strong>2018-02-11 - 发布EasyWeb1.0版本</strong></p> <ul> <li>基于layui后台大布局、q.js路由框架搭建出第一个版本</li> <li>1.0 版本在easyweb的gitee附件中下载</li> </ul> </li> </ul> <h2>6.联系方式</h2> <h3>6.1.欢迎加入“前后端分离技术交流群”</h3> <p>[图片上传失败...(image-541317-1639444934181)]</p> <h3>6.2.我要打赏</h3> <p>  都是猿友,撸码不易,如果这个轮子对你有用,不妨打赏一下!<br> 码云已开启捐赠功能,谢谢支持!</p> <p>  EasyWeb目前提供了“路由+mvvm分离版”、“基于oauth2的后台”、“基于shiro的不分离版”、“不分离版的页面”、<br> “EasyWeb主题生成器”、“前端开发文档”等项目,并且全部开源,欢迎加入一起开发,或者提交pull requests。</p> </article>���� </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1636557382903455744"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(EasyWeb 前端开发文档)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1899384937878974464.htm" title="Dash 简介" target="_blank">Dash 简介</a> <span class="text-muted">tankusa</span> <a class="tag" taget="_blank" href="/search/dash/1.htm">dash</a> <div>Dash是一个基于Python的开源框架,专门用于构建数据分析和数据可视化的Web应用程序。Dash由Plotly团队开发,旨在帮助数据分析师、数据科学家和开发人员快速创建交互式的、基于数据的Web应用,而无需深入掌握前端技术(如HTML、CSS和JavaScript)。Dash的核心优势在于其简单易用性和强大的功能。通过Dash,用户可以使用纯Python代码来构建复杂的Web应用,而无需编写繁</div> </li> <li><a href="/article/1899375098146648064.htm" title="Zookeeper【概念(集中式到分布式、什么是分布式 、CAP定理 、什么是Zookeeper、应用场景、为什么选择Zookeeper 、基本概念) 】(一)-全面详解(学习总结---从入门到深化)" target="_blank">Zookeeper【概念(集中式到分布式、什么是分布式 、CAP定理 、什么是Zookeeper、应用场景、为什么选择Zookeeper 、基本概念) 】(一)-全面详解(学习总结---从入门到深化)</a> <span class="text-muted">童小纯</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6%E5%A4%A7%E5%85%A8---%E5%85%A8%E9%9D%A2%E8%AF%A6%E8%A7%A3/1.htm">中间件大全---全面详解</a><a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步如果感觉博主的文章还不错的话,请三连支持一下博主哦博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人目录Zookeeper概念_集中式到分布</div> </li> <li><a href="/article/1899366676525281280.htm" title="Yarn:包管理优化与工作空间的最佳实践" target="_blank">Yarn:包管理优化与工作空间的最佳实践</a> <span class="text-muted"></span> <div>在现代前端开发中,包管理工具是不可或缺的工具之一。Yarn作为一个快速、可靠且安全的包管理工具,相对于npm,提供了一些独特的功能和优化,尤其是在工作空间管理和性能优化方面尤为突出。本文将深入探讨Yarn的专业使用,包括其工作空间的强大功能、性能优化技术以及在大型项目中的最佳实践。Yarn简介Yarn是由Facebook开发的一个JavaScript包管理工具,它旨在解决npm的一些关键问题,如安</div> </li> <li><a href="/article/1899361476049694720.htm" title="数字IC前端设计究竟怎样?薪资前景如何?" target="_blank">数字IC前端设计究竟怎样?薪资前景如何?</a> <span class="text-muted">IC观察者</span> <a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E6%88%90%E7%94%B5%E8%B7%AF/1.htm">集成电路</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9FIC/1.htm">模拟IC</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F%E7%89%88%E5%9B%BE/1.htm">模拟版图</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F%E7%89%88%E5%9B%BE%E5%85%A5%E9%97%A8/1.htm">模拟版图入门</a> <div>数字ic前端岗位介绍:数字ic前端设计处于数字IC设计流程的前端,属于数字IC设计类岗位的一种。数字ic前端设计主要分成几种层次的设计:IPlevel,unitlevel,fullchip/SoClevel,gatelevel等。作为数字IC前端工程师,为了让写的RTL代码没有bug,会经常与验证工程师要求debugcase;为了了解芯片整体架构和功能属性,还要与架构工程师打交道;还要与后端工程师</div> </li> <li><a href="/article/1899360717161689088.htm" title="tauri + vue3 如何实现在一个页面上局部加载外部网页?" target="_blank">tauri + vue3 如何实现在一个页面上局部加载外部网页?</a> <span class="text-muted">bug菌¹</span> <a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88Bug%E8%B0%83%E4%BC%98%28%E5%AE%9E%E6%88%98%E7%89%88%29/1.htm">全栈Bug调优(实战版)</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/CSDN%E9%97%AE%E7%AD%94%E8%A7%A3%E6%83%91%28%E5%85%A8%E6%A0%88%E7%89%88%29/1.htm">CSDN问答解惑(全栈版)</a><a class="tag" taget="_blank" href="/search/tauri/1.htm">tauri</a><a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a> <div>本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!问题描述  tauriv1(1.6左右)+vue3我想在vue3前端页面上在一个页面而不是window.open打开一个新的窗口去加载外部网页我想在一个页面中局部中间加载一个外部网页(试过</div> </li> <li><a href="/article/1899350382295969792.htm" title="Monorepo与pnpm:前端项目管理的完美搭档" target="_blank">Monorepo与pnpm:前端项目管理的完美搭档</a> <span class="text-muted">秋の本名</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/pnpm/1.htm">pnpm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/mojo/1.htm">mojo</a> <div>一、什么是pnpmpnpm又称performantnpm,翻译过来就是高性能的npm。1.节省磁盘空间提高安装效率pnpm通过使用硬链接和符号链接(又称软链接)的方式来避免重复安装以及提高安装效率。硬链接:和原文件共用一个磁盘地址,相当于别名的作用,如果更改其中一个内容,另一个也会跟着改变符号链接(软链接):是一个新的文件,指向原文件路径地址,类似于快捷方式官网原话:当使用npm时,如果你有100</div> </li> <li><a href="/article/1899343573246078976.htm" title="web前端期末大作业:婚纱网页主题网站设计——唯一旅拍婚纱公司网站HTML+CSS+JavaScript" target="_blank">web前端期末大作业:婚纱网页主题网站设计——唯一旅拍婚纱公司网站HTML+CSS+JavaScript</a> <span class="text-muted">IT-司马青衫</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>‍静态网站的编写主要是用HTMLDⅣV+CSSJS等来完成页面的排版设计‍,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉导航栏、鼠标划过效果等知识点,学生网页作业源码,制作水平和原创度都适合学习或交作业用,记得点赞。精彩专栏推荐【作者主页——获取更多优质源码】【web前端期末大作业——毕设项目精品实战案例(1</div> </li> <li><a href="/article/1899339285023223808.htm" title="Webpack打包构建流程" target="_blank">Webpack打包构建流程</a> <span class="text-muted">码上跑步</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>webpack的打包构建流程为什么需要打包?在前端有非常多的资源,如css、js、vue、vue、图片、字体等。有些资源需要加工处理1.ts->jsts-loader2.css->css-loader+style-loader3.图片->file-loader+url-loader4.html->html-webpack-plugin需要对产物进行优化optimization(webpack优化配</div> </li> <li><a href="/article/1899338906130771968.htm" title="webpack" target="_blank">webpack</a> <span class="text-muted">码上跑步</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>webpack介绍webpack是一个构建工具,实现了模块化管理项目.他的工作方式是用各种loader将各种资源转化为js文件或者对js文件进行压缩编译亦或对静态资源进行处理.官网:webpack由来模块化存在一些问题1.ESM的兼容性问题2.模块文件过多,网络请求频繁3.前端的所有资源包括html和css都需要模块化构建工具应运而生,需要一个集编译,模块打包,支持不同的资源的模块打包工具.Web</div> </li> <li><a href="/article/1899333108369518592.htm" title="前端实现版本更新自动检测✅" target="_blank">前端实现版本更新自动检测✅</a> <span class="text-muted">水煮白菜王</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>作者简介:水煮白菜王,一位资深前端劝退师文章专栏:前端专栏,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。感谢支持目录一、背景二、实现原理2.1逻辑2.2一些好处三、具体实现3.1工程化封装3.2关键方法解析脚本哈希获取:对比逻辑:四、全部代码4.1vue34.2vue2五、注意事项与常见问题5.1可能出现的问题5.2浏览器兼容方案一、背景在现代Web应用中,部署前端版本更新后及</div> </li> <li><a href="/article/1899333110311481344.htm" title="什么是XSS" target="_blank">什么是XSS</a> <span class="text-muted">藤原千花的败北</span> <a class="tag" taget="_blank" href="/search/web%E6%BC%8F%E6%B4%9E/1.htm">web漏洞</a><a class="tag" taget="_blank" href="/search/xss/1.htm">xss</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a> <div>文章目录前言1.前端知识2.什么是XSS3.漏洞挖掘4.参考前言之前对XSS的理解就是停留在弹窗,认为XSS这种漏洞真的是漏洞吗?安全学习了蛮久了,也应该对XSS有更进一步的认识了。1.前端知识现代浏览器是一个高度复杂的软件系统,由多个核心组件协同工作,旨在高效、安全地呈现网页内容并执行交互逻辑。对一般用户来讲,其主要功能就是向服务器发出请求,在窗口中展示用户所选择的网络资源。这里所说的资源一般是</div> </li> <li><a href="/article/1899329200700059648.htm" title="springMVC RestFul接口设计模式详解,包括前后端设计详解。@GetMapping、@PostMapping、@PutMapping@DeleteMapping@PathVariable" target="_blank">springMVC RestFul接口设计模式详解,包括前后端设计详解。@GetMapping、@PostMapping、@PutMapping@DeleteMapping@PathVariable</a> <span class="text-muted">漫慢丶</span> <a class="tag" taget="_blank" href="/search/springmvc/1.htm">springmvc</a><a class="tag" taget="_blank" href="/search/restful/1.htm">restful</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>目录1、什么是RestFul接口设计模式2、使用该接口设计模式后端还需要配置什么3、使用该接口设计模式前端需要注意什么4、Controller具体实现方式1、什么是RestFul接口设计模式RestFul这是一种springmvc接口的设计模式,用来区别不同类型的请求,来匹配控制器处理映射。例如请求URL为/test/那么中根据Get、put、post等请求方式,就可以具体映射到对应的控制器方法。</div> </li> <li><a href="/article/1899317091039768576.htm" title="【推荐项目】 043-停车管理系统" target="_blank">【推荐项目】 043-停车管理系统</a> <span class="text-muted">蜗牛 | ICU</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/1.htm">推荐项目</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>043-停车管理系统介绍使用springbootvuejsmysql技术搭建框架。智能停车管理系统描述后端框架:采用SpringBoot与MySQL的强强联合,为系统提供稳健、高效的服务支撑。前端框架:前端选用Vue.js,打造流畅、美观的用户交互界面。管理员功能:用户信息管理:轻松管理用户信息,包括新增、编辑、删除及查询用户。界面清晰,操作便捷,确保用户数据的安全与准确。车位信息管理:实时查看车</div> </li> <li><a href="/article/1899301955566628864.htm" title="Garfish 源码解析 —— 一个微应用是如何被挂载的" target="_blank">Garfish 源码解析 —— 一个微应用是如何被挂载的</a> <span class="text-muted">moonrailgun</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E7%A8%8B%E5%8C%96/1.htm">工程化</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>背景Garfish是字节跳动webinfra团队推出的一款微前端框架包含构建微前端系统时所需要的基本能力,任意前端框架均可使用。接入简单,可轻松将多个前端应用组合成内聚的单个产品因为当前对Garfish的解读极少,而微前端又是现代前端领域相当重要的一环,因此写下本文,同时也是对学习源码的一个总结本文基于garfish#0d4cc0c82269bce8422b0e9105b7fe88c2efe42a</div> </li> <li><a href="/article/1899301829213220864.htm" title="Vue3 基础教程:从入门到实践 (保姆级教学)" target="_blank">Vue3 基础教程:从入门到实践 (保姆级教学)</a> <span class="text-muted">前段技术人</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a> <div>一、Vue3简介Vue.js是一款用于构建用户界面的JavaScript框架,而Vue3作为其最新的主要版本,带来了诸多令人瞩目的改进与新特性,使其在前端开发领域备受青睐。(一)Vue3的优势性能提升:Vue3重写了虚拟DOM算法,显著提高了挂载、更新和渲染的速度。在处理大型列表或频繁数据更新的场景时,Vue3的表现更为出色,能够为用户带来更流畅的交互体验。例如,一个包含大量商品信息的电商产品列表</div> </li> <li><a href="/article/1899300566526390272.htm" title="SpringBoot + vue 管理系统" target="_blank">SpringBoot + vue 管理系统</a> <span class="text-muted">m0_51274464</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>SpringBoot+vue管理系统文章目录SpringBoot+vue管理系统1、成品效果展示2、项目准备3、项目开发3.1、部门管理3.1.1、前端核心代码3.1.2、后端代码实现3.2、员工管理3.2.1、前端核心代码3.2.2、后端代码实现3.3、班级管理3.3.1、前端核心代码3.3.2、后端代码实现3.4、学生管理3.4.1、前端核心代码3.4.2、后端代码实现3.5、数据统计3.5.</div> </li> <li><a href="/article/1899299809274163200.htm" title="web前端高级JavaScript - 闭包的应用及循环事件绑定的N中解决办法" target="_blank">web前端高级JavaScript - 闭包的应用及循环事件绑定的N中解决办法</a> <span class="text-muted">一笑程序猴</span> <a class="tag" taget="_blank" href="/search/WEB%E5%89%8D%E7%AB%AF%E9%AB%98%E7%BA%A7%E6%95%99%E7%A8%8B/1.htm">WEB前端高级教程</a><a class="tag" taget="_blank" href="/search/%E9%97%AD%E5%8C%85%E5%BA%94%E7%94%A8/1.htm">闭包应用</a><a class="tag" taget="_blank" href="/search/%E5%BE%AA%E7%8E%AF%E4%BA%8B%E4%BB%B6%E7%BB%91%E5%AE%9A/1.htm">循环事件绑定</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%B4%A2%E5%BC%95/1.htm">自定义索引</a> <div>闭包在循环事件绑定中的应用场景描述:在页面上有3个button按钮,当点击每个按钮时输出当前按钮的索引值,要求用循环来绑定每个按钮的事件,看下面的代码。button1button2button3varbuttons=document.querySelectorAll('button');for(vari=0;i<buttons.length;i++){buttons[i].onclick=func</div> </li> <li><a href="/article/1899272198774910976.htm" title="自助洗车小程序开发方案详解" target="_blank">自助洗车小程序开发方案详解</a> <span class="text-muted">ALLSectorSorft</span> <a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a> <div>自助洗车小程序开发设计详细扩写一、系统架构设计(一)技术栈选型1.前端:微信小程序(原生开发):直接基于微信官方提供的开发框架,能充分利用微信的原生能力,如小程序的启动速度快、与微信生态的无缝衔接等。开发过程中可使用微信开发者工具进行代码编写、调试和预览,通过WXML(类似HTML)、WXSS(类似CSS)和JavaScript构建用户界面和交互逻辑。例如利用微信原生的组件库,快速搭建出美观且符合</div> </li> <li><a href="/article/1899253285739622400.htm" title="Spring Cloud Alibaba微服务架构实战教程—17分布式缓存下Redis设计" target="_blank">Spring Cloud Alibaba微服务架构实战教程—17分布式缓存下Redis设计</a> <span class="text-muted">江湖一点雨</span> <a class="tag" taget="_blank" href="/search/%E6%9C%80%E6%96%B0SpringCloud/1.htm">最新SpringCloud</a><a class="tag" taget="_blank" href="/search/Alibaba%E5%AE%9E%E6%88%98%E5%BC%80%E5%8F%91/1.htm">Alibaba实战开发</a><a class="tag" taget="_blank" href="/search/redis%E7%BC%93%E5%AD%98%E8%AE%BE%E8%AE%A1/1.htm">redis缓存设计</a><a class="tag" taget="_blank" href="/search/springcloud/1.htm">springcloud</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%88%98/1.htm">微服务实战</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/alibaba/1.htm">alibaba</a><a class="tag" taget="_blank" href="/search/java%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98/1.htm">java开发实战</a> <div>前言大多数的文章,开头就是告诉你使用redis做缓存,怎么怎么样,而本系列,不打算采用这样无趣的写法,这和直接搬运有什么区别?笔者力求读者能得到更大程度的系统学习,会从为什么使用缓存来给大家进行学习。问问大家,当系统的执行速度慢怎么办?对于更新速度不是很快的站点,可以采用静态化来避免过多的数据查询。通常前端使用Freemaker或Velocity、thymeleaf等模板引擎来实现页面的静态化。对</div> </li> <li><a href="/article/1899245347633426432.htm" title="前端开发使用的 安卓模拟器_【译】移动开发中的仿真器与模拟器" target="_blank">前端开发使用的 安卓模拟器_【译】移动开发中的仿真器与模拟器</a> <span class="text-muted">weixin_39976748</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E4%BD%BF%E7%94%A8%E7%9A%84/1.htm">前端开发使用的</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%8D%93%E6%A8%A1%E6%8B%9F%E5%99%A8/1.htm">安卓模拟器</a> <div>译者注:本文主要涉及到两个概念:Emulator和Simulator。通常我们在工作中可能统统习惯称为“模拟器”,但实际上二者有所不同。为了分清概念,本文将Emulator译作“仿真器”,Simulator译作“模拟器”。听起来可能略拗口,如产生生理或心理不适,敬请谅解。仿真器(Emulator),又称仿真程序,在软件工程中指可以使计算机或者其他多媒体平台(掌上电脑,手机)能够运行其他平台上的程序</div> </li> <li><a href="/article/1899237506642145280.htm" title="Apipost一站式API工具评测:整合Postman+Swagger+JMeter三大功能,打造全流程开发解决方案" target="_blank">Apipost一站式API工具评测:整合Postman+Swagger+JMeter三大功能,打造全流程开发解决方案</a> <span class="text-muted"></span> <div>作为一名Java开发者,始终追求开发过程的高效性。使用IntelliJIDEA编写代码只是开始。一般来说,代码完成后,我们会切换到Postman进行API调试。在确保API表现符合预期后,我们会使用Swagger为前端团队生成文档。最后,再使用JMeter进行性能和负载测试,以确保API工作流顺畅且自动化。Apipost=Postman+Swagger+JMeter然而,这种多工具的方法存在诸多挑</div> </li> <li><a href="/article/1899228193169141760.htm" title="前端的架构设计与演化实例" target="_blank">前端的架构设计与演化实例</a> <span class="text-muted">weixin_30677073</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a> <div>前言本文介绍我在实际的前端项目中的架构设计,展示因为需求变化而导致架构变化的过程。全文分为三个阶段,分别对应三次需求的变化,给出了对应的架构设计。在第一个阶段中,我使用面向过程设计;在第二个阶段和在第三个阶段中,我使用面向对象设计。本文内容策略依赖项第一个阶段需求架构设计项目示例代码序列图重构领域模型分析当前设计第二个阶段需求架构设计分析当前设计重构项目示例代码序列图分析具体实现重构领域模型思考:</div> </li> <li><a href="/article/1899227185437274112.htm" title="前端的架构" target="_blank">前端的架构</a> <span class="text-muted">so_cruel</span> <div>一、组件化和模式设计层面1、JS中的继承和扩展在实际的操作中,不需要自己去写太多的这种继承,主要用库,像jquary中的extend。2,、组件化:一般常用的组件有两个,requirejs和sea.js二、做前端架构前需要想什么1、除了技术基础外,应当了解需求,然后进行模块的边界划分;2、如何设计友好接口;3、自动化的发布和快速迭代;4、如何降低维护成本。三、优化和扩展四、自动化最后再提一句,学好</div> </li> <li><a href="/article/1899224539468984320.htm" title="react 和 reflux" target="_blank">react 和 reflux</a> <span class="text-muted">yunhai.du</span> <a class="tag" taget="_blank" href="/search/Java%E5%BC%80%E5%8F%91/1.htm">Java开发</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a> <div>目录一、介绍:二、特征:三、组成:四、react的基本概念:五、JSX语法:六、生命周期:七、简单的使用:一、介绍:react:最早来源于FaceBook,后来因为其独特的设计思想和惊人的性能被广大用户喜欢,现在是最受欢迎的前端框架之一。reflux:React的设计目的是管理视图层,所以对于大型应用来说,我们还需要数据层面的复用。所以facebook设计了flux架构,并官方发布了dispath</div> </li> <li><a href="/article/1899208387200086016.htm" title="P11:利用marked+highlight.js重构前台文章详细页面" target="_blank">P11:利用marked+highlight.js重构前台文章详细页面</a> <span class="text-muted">知其黑、受其白</span> <a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/Hooks%2BLaravel/1.htm">Hooks+Laravel</a><a class="tag" taget="_blank" href="/search/%E5%88%B6%E4%BD%9C%E5%8D%9A%E5%AE%A2/1.htm">制作博客</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a> <div>ReactHooks+Laravel前端博客实战阐述安装marked和highlight.js重构`detailed.js`文件增加Code的高亮显示CSS样式的更换MySQL数据阐述之前我们在博客文章详细页使用了react-markdown模块,但是这个插件的配置项还是太少了,而且我也没做太多的技术调研,所以我决定转回我目前项目中使用的一套方案marked+highlight.js。这个方案是比</div> </li> <li><a href="/article/1899197792258158592.htm" title="vue懒加载" target="_blank">vue懒加载</a> <span class="text-muted">CV_CodeMan</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>Vue懒加载懒加载(LazyLoad)一直是前端的优化方案之一。简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载。它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据。这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度。懒加载多用于图片,因为它属于流量的大头。最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上</div> </li> <li><a href="/article/1899173068501217280.htm" title="【开源精选】《前端铺子》:打造你的全能型小程序开发助手" target="_blank">【开源精选】《前端铺子》:打造你的全能型小程序开发助手</a> <span class="text-muted">平淮齐Percy</span> <div>【开源精选】《前端铺子》:打造你的全能型小程序开发助手qdpz-uniapp项目基于vue-uniapp,使用colorUi与uView框架,完美支持微信小程序,包含功能:自定义TabBar与顶部、地图轨迹回放、电子签名、自定义相机/键盘、拍照图片水印、在线答题、证件识别、周边定位查询、文档预览、各种图表、行政区域、海报生成器、视频播放、主题切换、时间轴、瀑布流、排行榜、渐变动画、加载动画、请求封</div> </li> <li><a href="/article/1899164243538800640.htm" title="前端之vue2原理(全)" target="_blank">前端之vue2原理(全)</a> <span class="text-muted">yh502956003</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>一、组件通信总结(有些不建议使用,打破vue单向数据流,可能出问题)常用父子组件通信:1.propevent;2.$ref$refs;3.$slots$scopedSlots(插槽);4..sync(修饰符),5.$listeners//子组件通过$listeners获取父组件传递过来的所有处理函数、$parent$children//可以获取子组件或父组件的实例;6.attribute//(父组</div> </li> <li><a href="/article/1899143317325672448.htm" title="DeepSeek源码解析(1)" target="_blank">DeepSeek源码解析(1)</a> <span class="text-muted">白鹭凡</span> <a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>下载github的DeepSeek-V3-main源码,目录如下文章适合入门小白学习,因为我也是小白,本来作为一名前端开发,因为行业不好混所以跑来学ai的。初步看它的代码并不多,主要是inference目录,convert.py#1.导入标准库importos#os是Python的标准库之一,提供了与操作系统交互的功能,比如文件路径操作、环境变量管理等。importshutil#shutil也是P</div> </li> <li><a href="/article/1899138274493001728.htm" title="「MySQL 数据库优化」降低存储与查询成本的最佳实践" target="_blank">「MySQL 数据库优化」降低存储与查询成本的最佳实践</a> <span class="text-muted">网罗开发</span> <a class="tag" taget="_blank" href="/search/python%E9%9B%86/1.htm">python集</a><a class="tag" taget="_blank" href="/search/%E7%BB%88%E7%AB%AF%E9%9B%86/1.htm">终端集</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>网罗开发(小红书、快手、视频号同名)  大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、HarmonyOS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。图书作者:《ESP32-C3物联网工程开发实战》图书作者:《SwiftUI入门,进阶与实战》超级个体:CO</div> </li> <li><a href="/article/77.htm" title="算法 单链的创建与删除" target="_blank">算法 单链的创建与删除</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div> 先创建结构体 struct student { int data; //int tag;//标记这是第几个 struct student *next; }; // addone 用于将一个数插入已从小到大排好序的链中 struct student *addone(struct student *h,int x){ if(h==NULL) //?????? </div> </li> <li><a href="/article/204.htm" title="《大型网站系统与Java中间件实践》第2章读后感" target="_blank">《大型网站系统与Java中间件实践》第2章读后感</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">java中间件</a> <div>       断断续续花了两天时间试读了《大型网站系统与Java中间件实践》的第2章,这章总述了从一个小型单机构建的网站发展到大型网站的演化过程---整个过程会遇到很多困难,但每一个屏障都会有解决方案,最终就是依靠这些个解决方案汇聚到一起组成了一个健壮稳定高效的大型系统。          看完整章内容,</div> </li> <li><a href="/article/331.htm" title="zeus持久层spring事务单元测试" target="_blank">zeus持久层spring事务单元测试</a> <span class="text-muted">deng520159</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/jdbc/1.htm">jdbc</a> <div>今天把zeus事务单元测试放出来,让大家指出他的毛病, 1.ZeusTransactionTest.java 单元测试   package com.dengliang.zeus.webdemo.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; import </div> </li> <li><a href="/article/458.htm" title="Rss 订阅 开发" target="_blank">Rss 订阅 开发</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E8%AE%A2%E9%98%85/1.htm">订阅</a><a class="tag" taget="_blank" href="/search/rss/1.htm">rss</a><a class="tag" taget="_blank" href="/search/%E8%A7%84%E8%8C%83/1.htm">规范</a> <div>                RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Site Summary的缩写,1.0与2.0走的是两个体系)。   RSS</div> </li> <li><a href="/article/585.htm" title="分页查询实现" target="_blank">分页查询实现</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E9%A1%B5%E6%9F%A5%E8%AF%A2/1.htm">分页查询</a> <div>在查询列表时我们常常会用到分页,分页的好处就是减少数据交换,每次查询一定数量减少数据库压力等等。 按实现形式分前台分页和服务器分页: 前台分页就是一次查询出所有记录,在页面中用js进行虚拟分页,这种形式在数据量较小时优势比较明显,一次加载就不必再访问服务器了,但当数据量较大时会对页面造成压力,传输速度也会大幅下降。 服务器分页就是每次请求相同数量记录,按一定规则排序,每次取一定序号直接的数据</div> </li> <li><a href="/article/712.htm" title="spring jms异步消息处理" target="_blank">spring jms异步消息处理</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/jms/1.htm">jms</a> <div>spring JMS对于异步消息处理基本上只需配置下就能进行高效的处理。其核心就是消息侦听器容器,常用的类就是DefaultMessageListenerContainer。该容器可配置侦听器的并发数量,以及配合MessageListenerAdapter使用消息驱动POJO进行消息处理。且消息驱动POJO是放入TaskExecutor中进行处理,进一步提高性能,减少侦听器的阻塞。具体配置如下: </div> </li> <li><a href="/article/839.htm" title="highCharts柱状图" target="_blank">highCharts柱状图</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/hightCharts/1.htm">hightCharts</a><a class="tag" taget="_blank" href="/search/%E6%9F%B1%E5%9B%BE/1.htm">柱图</a> <div>第一步:导入 exporting.js,grid.js,highcharts.js;第二步:写controller   @Controller@RequestMapping(value="${adminPath}/statistick")public class StatistickController {  private UserServi</div> </li> <li><a href="/article/966.htm" title="我的spring学习笔记2-IoC(反向控制 依赖注入)" target="_blank">我的spring学习笔记2-IoC(反向控制 依赖注入)</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/Spring+%E6%95%99%E7%A8%8B/1.htm">Spring 教程</a><a class="tag" taget="_blank" href="/search/spring3+%E6%95%99%E7%A8%8B/1.htm">spring3 教程</a><a class="tag" taget="_blank" href="/search/Spring+%E5%85%A5%E9%97%A8/1.htm">Spring 入门</a> <div>IoC(反向控制 依赖注入)这是Spring提出来了,这也是Spring一大特色。这里我不用多说,我们看Spring教程就可以了解。当然我们不用Spring也可以用IoC,下面我将介绍不用Spring的IoC。 IoC不是框架,她是java的技术,如今大多数轻量级的容器都会用到IoC技术。这里我就用一个例子来说明: 如:程序中有 Mysql.calss 、Oracle.class 、SqlSe</div> </li> <li><a href="/article/1093.htm" title="TLS java简单实现" target="_blank">TLS java简单实现</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/keystore/1.htm">keystore</a><a class="tag" taget="_blank" href="/search/tls/1.htm">tls</a><a class="tag" taget="_blank" href="/search/secure/1.htm">secure</a> <div>  1. SSLServer.java package ssl; import java.io.FileInputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.security.KeyStore; import </div> </li> <li><a href="/article/1220.htm" title="Zip解压压缩文件" target="_blank">Zip解压压缩文件</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/Zip%E6%A0%BC%E5%BC%8F%E8%A7%A3%E5%8E%8B/1.htm">Zip格式解压</a><a class="tag" taget="_blank" href="/search/Zip%E6%B5%81%E7%9A%84%E4%BD%BF%E7%94%A8/1.htm">Zip流的使用</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E8%A7%A3%E5%8E%8B/1.htm">文件解压</a> <div>   ZIP文件的解压缩实质上就是从输入流中读取数据。Java.util.zip包提供了类ZipInputStream来读取ZIP文件,下面的代码段创建了一个输入流来读取ZIP格式的文件; ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));     &n</div> </li> <li><a href="/article/1347.htm" title="underscore.js 学习(一)" target="_blank">underscore.js 学习(一)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/underscore/1.htm">underscore</a> <div>        工作中需要用到underscore.js,发现这是一个包括了很多基本功能函数的js库,里面有很多实用的函数。而且它没有扩展 javascript的原生对象。主要涉及对Collection、Object、Array、Function的操作。       学</div> </li> <li><a href="/article/1474.htm" title="java jvm常用命令工具——jstatd命令(Java Statistics Monitoring Daemon)" target="_blank">java jvm常用命令工具——jstatd命令(Java Statistics Monitoring Daemon)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jstatd/1.htm">jstatd</a> <div>1.介绍         jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。         jstatd是基于RMI的,所以在运行jstatd的服务</div> </li> <li><a href="/article/1601.htm" title="【Spring框架三】Spring常用注解之Transactional" target="_blank">【Spring框架三】Spring常用注解之Transactional</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/transactional/1.htm">transactional</a> <div>Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力,如下是@Transactional注解的定义:   /* * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version </div> </li> <li><a href="/article/1728.htm" title="我(程序员)的前进方向" target="_blank">我(程序员)的前进方向</a> <span class="text-muted">bitray</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a> <div>作为一个普通的程序员,我一直游走在java语言中,java也确实让我有了很多的体会.不过随着学习的深入,java语言的新技术产生的越来越多,从最初期的javase,我逐渐开始转变到ssh,ssi,这种主流的码农,.过了几天为了解决新问题,webservice的大旗也被我祭出来了,又过了些日子jms架构的activemq也开始必须学习了.再后来开始了一系列技术学习,osgi,restful.....</div> </li> <li><a href="/article/1855.htm" title="nginx lua开发经验总结" target="_blank">nginx lua开发经验总结</a> <span class="text-muted">ronin47</span> <div>使用nginx lua已经两三个月了,项目接开发完毕了,这几天准备上线并且跟高德地图对接。回顾下来lua在项目中占得必中还是比较大的,跟PHP的占比差不多持平了,因此在开发中遇到一些问题备忘一下 1:content_by_lua中代码容量有限制,一般不要写太多代码,正常编写代码一般在100行左右(具体容量没有细心测哈哈,在4kb左右),如果超出了则重启nginx的时候会报 too long pa</div> </li> <li><a href="/article/1982.htm" title="java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶" target="_blank">java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> import java.util.Stack; public class ReverseStackRecursive { /** * Q 66.颠倒栈。 * 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。 * 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。 *1. Pop the top element *2. Revers</div> </li> <li><a href="/article/2109.htm" title="正确理解Linux内存占用过高的问题" target="_blank">正确理解Linux内存占用过高的问题</a> <span class="text-muted">cfyme</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>Linux开机后,使用top命令查看,4G物理内存发现已使用的多大3.2G,占用率高达80%以上: Mem:   3889836k total,  3341868k used,   547968k free,   286044k buffers Swap:  6127608k total,&nb</div> </li> <li><a href="/article/2236.htm" title="[JWFD开源工作流]当前流程引擎设计的一个急需解决的问题" target="_blank">[JWFD开源工作流]当前流程引擎设计的一个急需解决的问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a> <div>      当我们的流程引擎进入IRC阶段的时候,当循环反馈模型出现之后,每次循环都会导致一大堆节点内存数据残留在系统内存中,循环的次数越多,这些残留数据将导致系统内存溢出,并使得引擎崩溃。。。。。。       而解决办法就是利用汇编语言或者其它系统编程语言,在引擎运行时,把这些残留数据清除掉。</div> </li> <li><a href="/article/2363.htm" title="自定义类的equals函数" target="_blank">自定义类的equals函数</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/equals/1.htm">equals</a> <div>仅作笔记使用 public class VectorQueue { private final Vector<VectorItem> queue; private class VectorItem { private final Object item; private final int quantity; public VectorI</div> </li> <li><a href="/article/2490.htm" title="Linux下安装R语言" target="_blank">Linux下安装R语言</a> <span class="text-muted">datageek</span> <a class="tag" taget="_blank" href="/search/R%E8%AF%AD%E8%A8%80+linux/1.htm">R语言 linux</a> <div>命令如下:sudo gedit  /etc/apt/sources.list1、deb http://mirrors.ustc.edu.cn/CRAN/bin/linux/ubuntu/ precise/ 2、deb http://dk.archive.ubuntu.com/ubuntu hardy universesudo apt-key adv --keyserver ke</div> </li> <li><a href="/article/2617.htm" title="如何修改mysql 并发数(连接数)最大值" target="_blank">如何修改mysql 并发数(连接数)最大值</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>MySQL的连接数最大值跟MySQL没关系,主要看系统和业务逻辑了   方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MYSQL即可   方法二:MySQL的最大连接数默认是100客户端登录:mysql -uusername -ppass</div> </li> <li><a href="/article/2744.htm" title="单一功能原则" target="_blank">单一功能原则</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/1.htm">面向对象的程序设计</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1/1.htm">软件设计</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%8E%9F%E5%88%99/1.htm">编程原则</a> <div>单一功能原则[ 编辑]     SOLID 原则 单一功能原则 开闭原则 Liskov代换原则 接口隔离原则 依赖反转原则 查   论   编 在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有</div> </li> <li><a href="/article/2871.htm" title="POJO、VO和JavaBean区别和联系" target="_blank">POJO、VO和JavaBean区别和联系</a> <span class="text-muted">fanmingxing</span> <a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/javabean/1.htm">javabean</a> <div>POJO和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Plain Ordinary Java Object / Plain Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,但是JavaBean则比POJO复杂很多,JavaBean是一种组件技术,就好像你做了一个扳子,而这个扳子会在很多地方被</div> </li> <li><a href="/article/2998.htm" title="SpringSecurity3.X--LDAP:AD配置" target="_blank">SpringSecurity3.X--LDAP:AD配置</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/SpringSecurity/1.htm">SpringSecurity</a> <div>前面介绍过基于本地数据库验证的方式,参考http://hanqunfeng.iteye.com/blog/1155226,这里说一下如何修改为使用AD进行身份验证【只对用户名和密码进行验证,权限依旧存储在本地数据库中】。   将配置文件中的如下部分删除: <!-- 认证管理器,使用自定义的UserDetailsService,并对密码采用md5加密--> </div> </li> <li><a href="/article/3125.htm" title="mac mysql 修改密码" target="_blank">mac mysql 修改密码</a> <span class="text-muted">IXHONG</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>$ sudo /usr/local/mysql/bin/mysqld_safe –user=root & //启动MySQL(也可以通过偏好设置面板来启动)$ sudo /usr/local/mysql/bin/mysqladmin -uroot password yourpassword //设置MySQL密码(注意,这是第一次MySQL密码为空的时候的设置命令,如果是修改密码,还需在-</div> </li> <li><a href="/article/3252.htm" title="设计模式--抽象工厂模式" target="_blank">设计模式--抽象工厂模式</a> <span class="text-muted">kerryg</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>抽象工厂模式:     工厂模式有一个问题就是,类的创建依赖于工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。我们采用抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。     总结:这个模式的好处就是,如果想增加一个功能,就需要做一个实现类,</div> </li> <li><a href="/article/3379.htm" title="评"高中女生军训期跳楼”" target="_blank">评"高中女生军训期跳楼”</a> <span class="text-muted">nannan408</span> <div>   首先,先抛出我的观点,各位看官少点砖头。那就是,中国的差异化教育必须做起来。    孔圣人有云:有教无类。不同类型的人,都应该有对应的教育方法。目前中国的一体化教育,不知道已经扼杀了多少创造性人才。我们出不了爱迪生,出不了爱因斯坦,很大原因,是我们的培养思路错了,我们是第一要“顺从”。如果不顺从,我们的学校,就会用各种方法,罚站,罚写作业,各种罚。军</div> </li> <li><a href="/article/3506.htm" title="scala如何读取和写入文件内容?" target="_blank">scala如何读取和写入文件内容?</a> <span class="text-muted">qindongliang1922</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>直接看如下代码: package file import java.io.RandomAccessFile import java.nio.charset.Charset import scala.io.Source import scala.reflect.io.{File, Path} /** * Created by qindongliang on 2015/</div> </li> <li><a href="/article/3633.htm" title="C语言算法之百元买百鸡" target="_blank">C语言算法之百元买百鸡</a> <span class="text-muted">qiufeihu</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何? 代码如下: #include <stdio.h> int main() { int cock,hen,chick; /*定义变量为基本整型*/ for(coc</div> </li> <li><a href="/article/3760.htm" title="Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详细介绍AvatarNode" target="_blank">Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详细介绍AvatarNode</a> <span class="text-muted">wyz2009107220</span> <a class="tag" taget="_blank" href="/search/NameNode/1.htm">NameNode</a> <div>正如大家所知,NameNode在Hadoop系统中存在单点故障问题,这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。 1. Secondary NameNode 原理:Secondary NN会定期的从NN中读取editlog,与自己存储的Image进行合并形成新的metadata image 优点:Hadoop较早的版本都自带,</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>