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/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950191208873652224.htm" title="vue element 封装表单" target="_blank">vue element 封装表单</a> <span class="text-muted">影子信息</span> <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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>背景:在前端系统开发中,系统页面涉及到的表单组件比较多,所以进行了简单的封装。封装的包括一些Form表单组件,如下:input输入框、select下拉框、等实现效果:理论知识:表单组件官方链接:点击跳转封装组件:封装组件的思路:不封装element组件,每一个input组件绑定一个form对象,例如官网。简单封装element组件,利用for循环生成form表单的每一项el-form-item。进</div> </li> <li><a href="/article/1950191165710069760.htm" title="前端面试每日 3+1 —— 第39天" target="_blank">前端面试每日 3+1 —— 第39天</a> <span class="text-muted">浪子神剑</span> <div>今天的面试题(2019.05.25)——第39天[html]title与h1、b与strong、i与em的区别分别是什么?[css]写出你知道的CSS水平和垂直居中的方法[js]说说你对模块化的理解[软技能]公钥加密和私钥加密是什么?《论语》,曾子曰:“吾日三省吾身”(我每天多次反省自己)。前端面试每日3+1题,以面试题来驱动学习,每天进步一点!让努力成为一种习惯,让奋斗成为一种享受!欢迎在Iss</div> </li> <li><a href="/article/1950178477592342528.htm" title="前端数据库:IndexedDB从基础到高级使用指南" target="_blank">前端数据库:IndexedDB从基础到高级使用指南</a> <span class="text-muted"></span> <div>文章目录前端数据库:IndexedDB从基础到高级使用指南引言一、IndexedDB概述1.1什么是IndexedDB1.2与其他存储方案的比较二、基础使用2.1打开/创建数据库2.2基本CRUD操作添加数据读取数据更新数据删除数据三、高级特性3.1复杂查询与游标3.2事务高级用法3.3性能优化技巧四、实战案例:构建离线优先的待办事项应用4.1数据库设计4.2同步策略实现五、常见问题与解决方案5.</div> </li> <li><a href="/article/1950169524384886784.htm" title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</a> <span class="text-muted">笙囧同学</span> <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/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div> </li> <li><a href="/article/1950169526440095744.htm" title="从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战" target="_blank">从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战</a> <span class="text-muted"></span> <div>作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:3251736703@qq.com各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是</div> </li> <li><a href="/article/1950164483057971200.htm" title="14.tornado操作之应用Websocket协议实现聊天室功能" target="_blank">14.tornado操作之应用Websocket协议实现聊天室功能</a> <span class="text-muted">孤寒者</span> <a class="tag" taget="_blank" href="/search/Tornado%E6%A1%86%E6%9E%B6%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E6%88%98/1.htm">Tornado框架从入门到实战</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/tornado/1.htm">tornado</a><a class="tag" taget="_blank" href="/search/%E8%81%8A%E5%A4%A9%E5%AE%A4%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0/1.htm">聊天室功能实现</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录:每篇前言:1.什么是WebSocket(1)定义(2)优点(3)和HTTP对比(4)适用场景2.WebSocket关键方法3.本tornado项目中使用WebSocket(1)准备一个聊天室的页面:第一步:编写视图:第二步:编写接口:(app.py中加入以下接口!)第三步:编写前端页面:测试接口——响应OK!(2)使用WebSocket:(3)聊天室的聊天功能的最终实现:第一步:战前准备第二</div> </li> <li><a href="/article/1950144218282389504.htm" title="为什么学习Web前端一定要掌握JavaScript?" target="_blank">为什么学习Web前端一定要掌握JavaScript?</a> <span class="text-muted">web前端学习指南</span> <div>为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。</div> </li> <li><a href="/article/1950143305194991616.htm" title="小架构step系列25:错误码" target="_blank">小架构step系列25:错误码</a> <span class="text-muted">秋千码途</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1概述一个系统中,可能产生各种各样的错误,对这些错误进行编码。当错误发生时,通过这个错误码就有可能快速判断是什么错误,不一定需要查看代码就可以进行处理,提高问题处理效率。有了统一的错误码,还可以标准化错误信息,方便把错误信息纳入文档管理和对错误信息进行国际化等。没有错误码的管理,开发人员就会按自己的理解处理这些错误。有些直接把堆栈直接反馈到前端页面上,使用看不懂这些信息体验很差,也暴露了堆栈信息有</div> </li> <li><a href="/article/1950140903616212992.htm" title="Java朴实无华按天计划从入门到实战(强化速战版-66天)" target="_blank">Java朴实无华按天计划从入门到实战(强化速战版-66天)</a> <span class="text-muted">岫珩</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/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/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E5%AE%89%E6%8E%92/1.htm">时间安排</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/1.htm">学习计划</a> <div>致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1</div> </li> <li><a href="/article/1950132204336115712.htm" title="《跨域资源共享CORS的深层逻辑与前端实践精要》" target="_blank">《跨域资源共享CORS的深层逻辑与前端实践精要》</a> <span class="text-muted"></span> <div>不同源头的资源交互已成为常态,而跨域资源共享(CORS)正是支撑这种交互的隐形架构。现代Web安全体系中平衡开放与防护的精妙设计。理解CORS的深层逻辑,不仅能解决实际开发中的跨域难题,更能触及网络安全与资源流通的核心矛盾,为前端工程师构建稳健的应用提供底层认知支撑。跨域资源共享的诞生,源于网络安全与应用发展的必然冲突。浏览器的同源策略,作为早期网络安全的基石,通过限制不同源文档的交互,有效阻挡了</div> </li> <li><a href="/article/1950131321980383232.htm" title="深入了解 Kubernetes(k8s):从概念到实践" target="_blank">深入了解 Kubernetes(k8s):从概念到实践</a> <span class="text-muted"></span> <div>目录一、k8s核心概念二、k8s的优势三、k8s架构组件控制平面组件节点组件四、k8s+docker运行前后端分离项目的例子1.准备前端项目2.准备后端项目3.创建k8s部署配置文件4.部署应用到k8s集群在当今云计算和容器化技术飞速发展的时代,Kubernetes(简称k8s)已成为容器编排领域的事实标准。无论是互联网巨头、传统企业还是初创公司,都在广泛采用k8s来管理和部署容器化应用。本文将带</div> </li> <li><a href="/article/1950119224630374400.htm" title="大厂都在用的前端缓存策略,你掌握了吗?" target="_blank">大厂都在用的前端缓存策略,你掌握了吗?</a> <span class="text-muted">AI架构全栈开发实战笔记</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>大厂都在用的前端缓存策略,你掌握了吗?关键词:前端缓存、HTTP缓存、ServiceWorker、CDN缓存、缓存策略、性能优化、浏览器缓存摘要:本文将深入探讨前端开发中常用的缓存策略,从浏览器缓存到ServiceWorker,从HTTP缓存头到CDN缓存,全面解析大厂都在使用的高效缓存技术。通过生动的比喻和实际代码示例,帮助开发者理解并掌握这些提升Web应用性能的关键技术。背景介绍目的和范围本文</div> </li> <li><a href="/article/1950115062781898752.htm" title="26. 什么是雪碧图,作用和原理了解吗" target="_blank">26. 什么是雪碧图,作用和原理了解吗</a> <span class="text-muted">yqcoder</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95-CSS/1.htm">前端面试-CSS</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>总结小图合成一张,使用background来使用,减少资源请求一、什么是雪碧图?雪碧图(CSSSprite)是一种前端优化技术,指的是将多个小图标合并成一张大图,通过CSS控制显示其中的某一部分。它常用于网站中图标、按钮等小图较多的场景。二、雪碧图的作用作用说明✅减少HTTP请求次数合并多个图片为一张图,减少请求资源数✅提升页面加载速度尤其在图片较多时效果明显✅避免图片加载闪烁鼠标悬停切换图片时不</div> </li> <li><a href="/article/1950112039502409728.htm" title="H5UI微信小程序前端框架实战指南" target="_blank">H5UI微信小程序前端框架实战指南</a> <span class="text-muted">ai</span> <div>本文还有配套的精品资源,点击获取简介:H5UI是一个为微信小程序开发设计的前端框架,基于H5技术,提供简洁高效的组件库。框架集成了丰富的UI元素,如按钮、表格、导航栏等,简化了界面布局和交互的实现。通过安装、引入、使用组件和事件绑定四个步骤,开发者可以轻松构建功能齐全的应用。了解性能优化等注意事项对于高效开发同样重要。1.微信小程序前端开发框架介绍微信小程序概述微信小程序是微信官方推出的一种无需下</div> </li> <li><a href="/article/1950104854819041280.htm" title="Ubuntu安装LAMP" target="_blank">Ubuntu安装LAMP</a> <span class="text-muted">L_h1</span> <a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>在安装vim时遇到了一个问题:E:无法获得锁/var/lib/dpkg/lock-frontend-open(11:资源暂时不可用)E:无法获取dpkg前端锁(/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?解决办法:强制解锁sudorm/var/lib/dpkg/lock-frontendsudorm/var/cache/apt/archives/locksud</div> </li> <li><a href="/article/1950104727928762368.htm" title="震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!" target="_blank">震惊!DOM变化监控神器MutationObserver,前端开发必知的隐藏武器!</a> <span class="text-muted">coding随想</span> <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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>一、什么是MutationObserver?如果你是一个前端开发者,一定会遇到这样的场景:页面动态加载内容后,某些操作失效了。比如,你写了一个监听按钮点击的代码,但按钮是通过AJAX动态加载的,你的代码根本无法触发。这个时候,你就需要一个“监控哨兵”——MutationObserver,它能实时监听DOM树的变化,帮你捕获那些“暗中作祟”的节点变动。MutationObserver是HTML5引入</div> </li> <li><a href="/article/1950094764498022400.htm" title="Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析" target="_blank">Coze Studio 架构拆解:AI Agent 开发平台项目结构全分析</a> <span class="text-muted">代码简单说</span> <a class="tag" taget="_blank" href="/search/2025%E5%BC%80%E5%8F%91%E5%BF%85%E5%A4%87%28%E9%99%90%E6%97%B6%E7%89%B9%E6%83%A0%29/1.htm">2025开发必备(限时特惠)</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/Coze/1.htm">Coze</a><a class="tag" taget="_blank" href="/search/Studio/1.htm">Studio</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/Agent/1.htm">Agent</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0/1.htm">开发平台</a><a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88/1.htm">全栈</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</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/%E5%9B%BE%E8%A7%A3%E6%9E%B6%E6%9E%84/1.htm">图解架构</a> <div>CozeStudio架构拆解:AIAgent开发平台项目结构全分析标签:CozeStudio项目架构、领域驱动设计DDD、全栈开发规范、Hertz框架、前后端协作、云原生容器、前端测试、IDL接口设计、微服务解耦、AI开发平台源码分析在最近研究AIAgent开发平台的过程中,我深入分析了刚刚开源的CozeStudio项目。这套系统是国内少有的开源全栈AI工程化项目,代码整洁、架构先进,特别是它基于</div> </li> <li><a href="/article/1950075480849838080.htm" title="关于前端的性能优化" target="_blank">关于前端的性能优化</a> <span class="text-muted"></span> <div>性能优化主要涵盖了以下四个方面:(tip:仅代表个人总结,如有不当,还希望看到的大佬多多指示)减少网络请求:合并文件、使用CDN、启用缓存。优化资源加载:代码分割、懒加载、图片压缩。提升渲染性能:减少重绘回流、防抖节流、使用WebWorker。监控和迭代:定期使用工具检测性能,持续优化。一、网络层面优化减少HTTP请求合并文件:将多个CSS或JavaScript文件合并成一个,减少请求次数。使用C</div> </li> <li><a href="/article/1950059723604684800.htm" title="linux网卡显示未知未托管,linux有线网络显示设备未托管" target="_blank">linux网卡显示未知未托管,linux有线网络显示设备未托管</a> <span class="text-muted"></span> <div>NetworkManagerNetworkManager是为了使网络配置尽可能简单而开发的网络管理软件包,如果使用DHCP,NetworkManager会替换默认的路由表、从DHCP服务器获取IP地址并根据情况设置域名服务器,NetworkManager的目标是使网络能够开箱即用。NetworkManager由两部分组成:一个以超级用户运行的守护进程(network-manager);一个前端管理</div> </li> <li><a href="/article/1950053798433058816.htm" title="页面开发样式和布局入门:Vite + Vue 3 + Less" target="_blank">页面开发样式和布局入门:Vite + Vue 3 + Less</a> <span class="text-muted"></span> <div>页面开发样式和布局入门:Vite+Vue3+Less引言在现代前端开发中,样式和布局是页面开发的核心部分。随着技术的不断发展,Vite、Vue3和Less等工具和框架的出现,使得前端开发变得更加高效和灵活。然而,尽管这些工具和框架提供了强大的功能,但在实际开发中仍然会遇到各种样式和布局的问题。本文将结合Vite、Vue3和Less,详细介绍在页面开发中常见的样式和布局问题,并提供解决方案和最佳实践</div> </li> <li><a href="/article/1950046229840850944.htm" title="推客系统小程序机构版开发上线全攻略(2025年最新版)" target="_blank">推客系统小程序机构版开发上线全攻略(2025年最新版)</a> <span class="text-muted">vx_qutudy</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">推客小程序</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/1.htm">推客系统开发</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/1.htm">推客系统源码</a> <div>一、开发前准备:筑牢基础,合规先行1.1注册与认证账号注册:登录微信公众平台注册小程序账号,选择“机构版”类型,获取唯一AppID。资质认证:基础资质:企业营业执照、法人身份证、对公账户信息。特殊资质:涉及支付功能:需办理《增值电信业务经营许可证》(ICP证)。涉及教育/医疗内容:需《互联网信息服务许可证》或相关行业资质。1.2技术选型:高效与扩展并重模块推荐方案前端框架微信原生框架(WXML+W</div> </li> <li><a href="/article/1950042324155297792.htm" title="网络安全第14集" target="_blank">网络安全第14集</a> <span class="text-muted">不灭锦鲤</span> <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/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>前言:小迪安全14集,这集重点内容:0、什么是js渗透测试?在javascript中也存在变量和函数,存在可控变量和函数就有可能存在在漏洞,js开发的web应用和php、java开发的区别是,js能看得到的源代码,php看不到,但是风险就是未授权访问、配置信息泄露(加密算法、key秘钥等),源代码看得到,存在更多的url泄露,从而可能会出现未授权访问,从url,前提:web应用可以采用前端语言或后</div> </li> <li><a href="/article/1950037152830124032.htm" title="怎么判断一个DAPP是否真正去中心化" target="_blank">怎么判断一个DAPP是否真正去中心化</a> <span class="text-muted"></span> <div>判断一个DAPP(去中心化应用)是否真正去中心化,需要从多个维度进行考察。以下是关键评估标准:1.区块链依赖程度✅真正去中心化:核心逻辑和数据处理完全依赖智能合约,运行在区块链上(如以太坊、Solana等)。❌伪去中心化:依赖中心化服务器处理关键数据或业务逻辑,仅前端去中心化。2.智能合约控制权✅去中心化:合约代码开源,无管理员密钥(adminkey)或可升级后门,治理由DAO(去中心化自治组织)</div> </li> <li><a href="/article/1950020001654173696.htm" title="Web前端交互利用Python跟大模型操作" target="_blank">Web前端交互利用Python跟大模型操作</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/%E4%BA%A4%E4%BA%92/1.htm">交互</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>Web前端交互利用Python跟大模型操作一个简单的演示,如何把大模型应用集成到自己的应用场景当中。这里的场景我们模拟的是在吃鸡游戏中,一个作战计划,是否符合老六的行为规范。吃鸡游戏已经风靡很多年,游戏里每个人的游戏风格都不一样,有喜欢钢枪的,有喜欢随机应变的,也有喜欢当老六苟分的。每种风格的游戏方式以及游戏里的行为都不同,所以这里将演示如何应用大模型,去判断一个人的游戏方式,是否符合一个老六的行</div> </li> <li><a href="/article/1950009162180128768.htm" title="尚硅谷微服务尚医通前端npm报错" target="_blank">尚硅谷微服务尚医通前端npm报错</a> <span class="text-muted"></span> <div>尚硅谷微服务尚医通前端npm报错血泪史我的版本的8.0.0,弹幕里说降级npm到6.多就能安装,经过许久挣扎还是各种报错,最后通过一下办法解决解决办法:不需要降低npm版本,办法如下这里需要使用到cnpm:1.导入下载好到的项目2.安装cnpm:npminstallcnpm-g3.安装node-sass:cnpminstallnode-sass4.继续安装:cnpminode-sass-D5.删除</div> </li> <li><a href="/article/1950005000038051840.htm" title="Layui核心语法快速入门指南" target="_blank">Layui核心语法快速入门指南</a> <span class="text-muted">bemyrunningdog</span> <a class="tag" taget="_blank" href="/search/layui/1.htm">layui</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><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Layui基本语法学习指南Layui是一个经典的模块化前端框架,以其轻量易用、组件丰富著称。以下是Layui的核心语法结构和使用方法:一、模块加载机制(核心基础)//标准模块加载语法layui.use(['module1','module2'],function(){//回调函数中获取模块varmod1=layui.module1;varmod2=layui.module2;//模块功能调用mod</div> </li> <li><a href="/article/1950002983613820928.htm" title="前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)" target="_blank">前端基础知识Vue3系列 - 04(Vue3.0 所采用的 Composition Api 与 Vue2.x 使用的 Options Api 有什么不同)</a> <span class="text-muted"></span> <div>开始之前CompositionAPI可以说是Vue3的最大特点,那么为什么要推出CompositionApi,解决了什么问题?通常使用Vue2开发的项目,普遍会存在以下问题:代码的可读性随着组件变大而变差每一种代码复用的方式,都存在缺点TypeScript支持有限以上通过使用CompositionApi都能迎刃而解正文一、OptionsApiOptionsAPI,即大家常说的选项API,即以vue</div> </li> <li><a href="/article/1949984445817745408.htm" title="Vue 工程化开发入门" target="_blank">Vue 工程化开发入门</a> <span class="text-muted">dawn191228</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0/1.htm">前端学习</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><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>文章目录一、Vue工程化开发概述二、Vue脚手架三、项目运行流程四、组件化开发五、组件注册六、总结在当今的前端开发领域,Vue.js以其简洁、高效的特性受到了广泛的欢迎。Vue的工程化开发能够帮助我们更好地组织和管理项目,提高开发效率和代码质量。本文将带你了解Vue工程化开发入门知识,包括脚手架、项目运行流程、组件化以及组件注册。一、Vue工程化开发概述工程化开发是一种将软件开发过程规范化、标准化</div> </li> <li><a href="/article/1949963001104756736.htm" title="Python,C++,go语言开发社会犯罪人群回归社会跟踪与辅助管理APP" target="_blank">Python,C++,go语言开发社会犯罪人群回归社会跟踪与辅助管理APP</a> <span class="text-muted">Geeker-2025</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a> <div>开发一款用于**社会犯罪人群回归社会跟踪与辅助管理**的App,结合Python、C++和Go语言的优势,可以实现高效的数据处理、实时的跟踪监控以及用户友好的前端界面。以下是一个详细的开发方案,涵盖技术选型、功能模块、开发步骤等内容。##技术选型###后端(Python+Go)-**编程语言**:-**Python**:用于数据处理、机器学习(如风险评估、行为预测)、脚本编写等。-**Go**:用</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>