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/1835509897106649088.htm" title="Long类型前后端数据不一致" target="_blank">Long类型前后端数据不一致</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835497792265613312.htm" title="【加密社】Solidity 中的事件机制及其应用" target="_blank">【加密社】Solidity 中的事件机制及其应用</a> <span class="text-muted">加密社</span> <a class="tag" taget="_blank" href="/search/%E9%97%B2%E4%BE%83/1.htm">闲侃</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/1.htm">智能合约</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a> <div>加密社引言在Solidity合约开发过程中,事件(Events)是一种非常重要的机制。它们不仅能够让开发者记录智能合约的重要状态变更,还能够让外部系统(如前端应用)监听这些状态的变化。本文将详细介绍Solidity中的事件机制以及如何利用不同的手段来触发、监听和获取这些事件。事件存储的地方当我们在Solidity合约中使用emit关键字触发事件时,该事件会被记录在区块链的交易收据中。具体而言,事件</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835448238103162880.htm" title="springboot+vue项目实战一-创建SpringBoot简单项目" target="_blank">springboot+vue项目实战一-创建SpringBoot简单项目</a> <span class="text-muted">苹果酱0567</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/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/%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/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一</div> </li> <li><a href="/article/1835437775344726016.htm" title="博客网站制作教程" target="_blank">博客网站制作教程</a> <span class="text-muted">2401_85194651</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java</div> </li> <li><a href="/article/1835428317084348416.htm" title="最简单将静态网页挂载到服务器上(不用nginx)" target="_blank">最简单将静态网页挂载到服务器上(不用nginx)</a> <span class="text-muted">全能全知者</span> <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/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/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/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>最简单将静态网页挂载到服务器上(不用nginx)如果随便弄个静态网页挂在服务器都要用nignx就太麻烦了,所以直接使用Apache来搭建一些简单前端静态网页会相对方便很多检查Web服务器服务状态:sudosystemctlstatushttpd#ApacheWeb服务器如果发现没有安装web服务器:安装Apache:sudoyuminstallhttpd启动Apache:sudosystemctl</div> </li> <li><a href="/article/1835427057752961024.htm" title="补充元象二面" target="_blank">补充元象二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.请尽可能详细地说明,防抖和节流的区别,应用场景?你的回答中不要写出示例代码。防抖(Debounce)和节流(Throttle)是两种常用的前端性能优化技术,它们的主要区别在于如何处理高频事件的触发。以下是防抖和节流的区别和应用场景的详细说明:防抖和节流的定义防抖:在一段时间内,多次执行变为只执行最后一次。防抖的原理是,当事件被触发后,设置一个延迟定时器。如果在这个延迟时间内事件再次被触发,则重</div> </li> <li><a href="/article/1835420753252675584.htm" title="微信小程序开发注意事项" target="_blank">微信小程序开发注意事项</a> <span class="text-muted">jun778895</span> <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><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>微信小程序开发是一个融合了前端开发、用户体验设计、后端服务(可选)以及微信小程序平台特性的综合性项目。这里,我将详细介绍一个典型的小程序开发项目的全过程,包括项目规划、设计、开发、测试及部署上线等各个环节,并尽量使内容达到或超过2000字的要求。一、项目规划1.1项目背景与目标假设我们要开发一个名为“智慧校园助手”的微信小程序,旨在为学生提供一站式校园生活服务,包括课程表查询、图书馆座位预约、食堂</div> </li> <li><a href="/article/1835411044768509952.htm" title="字节二面" target="_blank">字节二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文</div> </li> <li><a href="/article/1835398064727224320.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/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>点击上传文件import{ElNotification}from'element-plus'import{API_CONFIG}from'../config/index.js'import{UploadFilled}from'@element-plus/icons-vue'import{reactive}from'vue'import{BASE_URL}from'../config/index'i</div> </li> <li><a href="/article/1835385458356482048.htm" title="uniapp实现动态标记效果详细步骤【前端开发】" target="_blank">uniapp实现动态标记效果详细步骤【前端开发】</a> <span class="text-muted">2401_85123349</span> <a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a> <div>第二个点在于实现将已经被用户标记的内容在下一次获取后刷新它的状态为已标记。这是什么意思呢?比如说上面gif图中的这些人物对象,有一些已被该用户添加为关心,那么当用户下一次进入该页面时,这些已经被添加关心的对象需要以“红心”状态显现出来。这个点的难度还不算大,只需要在每一次获取后端的内容后对标记对象进行状态更新即可。II.动态标记效果实现思路和步骤首先,整体的思路是利用动态类名对不同的元素进行选择。</div> </li> <li><a href="/article/1835373236217540608.htm" title="360前端星计划-动画可以这么玩" target="_blank">360前端星计划-动画可以这么玩</a> <span class="text-muted">马小蜗</span> <div>动画的基本原理定时器改变对象的属性根据新的属性重新渲染动画functionupdate(context){//更新属性}constticker=newTicker();ticker.tick(update,context);动画的种类1、JavaScript动画操作DOMCanvas2、CSS动画transitionanimation3、SVG动画SMILJS动画的优缺点优点:灵活度、可控性、性能</div> </li> <li><a href="/article/1835368019430305792.htm" title="Vue + Express实现一个表单提交" target="_blank">Vue + Express实现一个表单提交</a> <span class="text-muted">九旬大爷的梦</span> <div>最近在折腾一个cms系统,用的vue+express,但是就一个表单提交就弄了好久,记录一下。环境:Node10+前端:Vue服务端:Express依赖包:vueexpressaxiosexpress-formidableelement-ui(可选)前言:axiosget请求参数是:paramsaxiospost请求参数是:dataexpressget接受参数是req.queryexpresspo</div> </li> <li><a href="/article/1835354447627251712.htm" title="前端知识点" target="_blank">前端知识点</a> <span class="text-muted">ZhangTao_zata</span> <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/css/1.htm">css</a> <div>下面是一个最基本的html代码body{font-family:Arial,sans-serif;margin:20px;}//JavaScriptfunctionthatdisplaysanalertwhencalledfunctionshowMessage(){alert("Hello!Youclickedthebutton.");}MyFirstHTMLPageWelcometoMyPage</div> </li> <li><a href="/article/1835352325032603648.htm" title="第三十一节:Vue路由:前端路由vs后端路由的了解" target="_blank">第三十一节:Vue路由:前端路由vs后端路由的了解</a> <span class="text-muted">曹老师</span> <div>1.认识前端路由和后端路由前端路由相对于后端路由而言的,在理解前端路由之前先对于路由有一个基本的了解路由:简而言之,就是把信息从原地址传输到目的地的活动对于我们来说路由就是:根据不同的url地址展示不同的页面内容1.1后端路由以前咱们接触比较多的后端路由,当改变url地址时,浏览器会向服务器发送请求,服务器根据这个url,返回不同的资源内容后端路由的特点就是前端每次跳转到不同url地址,都会重新访</div> </li> <li><a href="/article/1835350917352878080.htm" title="华雁智科前端面试题" target="_blank">华雁智科前端面试题</a> <span class="text-muted">因为奋斗超太帅啦</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AF%95%E9%9D%A2%E8%AF%95%E9%97%AE%E9%A2%98%E6%95%B4%E7%90%86/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><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>1.var变量的提升题目:vara=1functionfun(){console.log(b)varb=2}fun()console.log(a)正确输出结果:undefined、1答错了,给一个大嘴巴子,错误答案输出结果为:2,1此题主要考察var定义的变量,作用域提升的问题,相当于varaa=1functionfun(){varbconsole.log(b)b=2}fun()console.l</div> </li> <li><a href="/article/1835350535818014720.htm" title="如何建设数据中台(五)——数据汇集—打破企业数据孤岛" target="_blank">如何建设数据中台(五)——数据汇集—打破企业数据孤岛</a> <span class="text-muted">weixin_47088026</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E5%92%8C%E6%80%BB%E7%BB%93/1.htm">学习记录和总结</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E5%8F%B0/1.htm">中台</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%8F%B0/1.htm">数据中台</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>数据汇集——打破企业数据孤岛要构建企业级数据中台,第一步就是将企业内部各个业务系统的数据实现互通互联,打破数据孤岛,主要通过数据汇聚和交换来实现。企业采集的数据可以是线上采集、线下数据采集、互联网数据采集、内部数据采集等。线上数据采集主要载体分为互联网和移动互联网两种,对应有系统平台、网页、H5、小程序、App等,可以采用前端或后端埋点方式采集数据。线下数据采集主要是通过硬件来采集,例如:WiFi</div> </li> <li><a href="/article/1835343473629294592.htm" title="分布式锁和spring事务管理" target="_blank">分布式锁和spring事务管理</a> <span class="text-muted">暴躁的鱼</span> <a class="tag" taget="_blank" href="/search/%E9%94%81%E5%8F%8A%E4%BA%8B%E5%8A%A1/1.htm">锁及事务</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>最近开发一个小程序遇到一个需求需要实现分布式事务管理业务需求用户在使用小程序的过程中可以查看景点,对景点地区或者城市标记是否想去,那么需要统计一个地点被标记的人数,以及记录某个用户对某个地点是否标记为想去,用两个表存储数据,一个地点表记录改地点被标记的次数,一个用户意向表记录某个用户对某个地点是否标记为想去。由于可能有多个用户同时标记一个地点,每个用户在前端点击想去按钮之后,后台接收到请求,从数据</div> </li> <li><a href="/article/1835340577596600320.htm" title="前端CSS面试常见题" target="_blank">前端CSS面试常见题</a> <span class="text-muted">剑亦未配妥</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/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/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>边界塌陷盒模型有两种:W3C盒模型和IE盒模型,区别在于宽度是否包含边框定义:同时给兄弟/父子盒模型设置上下边距,理论上边距值是两者之和,实际上不是注意:浮动和定位不会产生边界塌陷;只有块级元素垂直方向才会产生margin合并margin计算方案margin同为正负:取绝对值大的值一正一负:求和父子元素边界塌陷解决父元素可以通过调整padding处理;设置overflowhidden,触发BFC子</div> </li> <li><a href="/article/1835331376895848448.htm" title="【JS】前端文件读取FileReader操作总结" target="_blank">【JS】前端文件读取FileReader操作总结</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/%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>前端文件读取FileReader操作总结FileReader是JavaScript中的一个WebAPI,它允许web应用程序异步读取用户计算机上的文件(或原始数据缓冲区)的内容,例如读取文件以获取其内容,并在不将文件发送到服务器的情况下在客户端使用它。这对于处理图片、文本文件等非常有用,尤其是当你想要在用户界面中即时显示文件内容或进行文件预览时。创建FileReader对象首先,你需要创建一个Fi</div> </li> <li><a href="/article/1835331375377510400.htm" title="【前端】vue 报错:The template root requires exactly one element" target="_blank">【前端】vue 报错:The template root requires exactly one element</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/%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>【前端】vue报错:Thetemplaterootrequiresexactlyoneelement在Vue.js中,当你遇到错误“Thetemplaterootrequiresexactlyoneelement”时,这通常意味着你的Vue组件的模板(template)根节点不是单一的元素。Vue要求每个组件的模板必须有一个根元素来包裹所有的子元素。这个错误通常出现在以下几种情况:模板中有多个并行</div> </li> <li><a href="/article/1835302949362954240.htm" title="从单体到微服务:FastAPI ‘挂载’子应用程序的转变" target="_blank">从单体到微服务:FastAPI ‘挂载’子应用程序的转变</a> <span class="text-muted">黑金IT</span> <a class="tag" taget="_blank" href="/search/fastapi/1.htm">fastapi</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/fastapi/1.htm">fastapi</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>在现代Web应用开发中,模块化架构是一种常见的设计模式,它有助于将大型应用程序分解为更小、更易于管理的部分。FastAPI,作为一个高性能的PythonWeb框架,提供了强大的支持来实现这种模块化设计。通过“挂载”子应用程序,我们可以为不同的功能区域(如前端接口、管理员接口和用户中心)创建独立的应用程序,并将它们整合到一个主应用程序中。本文将详细介绍如何在FastAPI中使用“挂载”子应用程序的方</div> </li> <li><a href="/article/1835296397365178368.htm" title="创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几" target="_blank">创建一个完整的购物商城系统是一个复杂的项目,涉及前端(用户界面)、后端(服务器逻辑)、数据库等多个部分。由于篇幅限制,我无法在这里提供一个完整的系统代码,但我可以分别给出一些关键部分的示例代码,涵盖几</a> <span class="text-muted">uthRaman</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>前端(HTML/CSS/JavaScript)grsyzp.cnHTML页面结构(index.html)html购物商城欢迎来到购物商城JavaScript(Ajax请求商品数据,app.js)javascriptdocument.addEventListener('DOMContentLoaded',function(){fetch('/api/products').then(response=</div> </li> <li><a href="/article/1835293121953492992.htm" title="了解 UNPKG:前端开发者的包管理利器" target="_blank">了解 UNPKG:前端开发者的包管理利器</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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>在现代前端开发中,JavaScript包管理和模块化是至关重要的,而npm则是最流行的JavaScript包管理器之一。不过,随着前端项目复杂性的增加,有时候我们希望快速引入外部依赖,而无需本地安装和构建。此时,CDN(内容分发网络)成为了一种方便快捷的解决方案,而UNPKG就是这种方式中的佼佼者。什么是UNPKG?UNPKG是一个基于npm的内容分发网络(CDN),它允许开发者直接通过URL从n</div> </li> <li><a href="/article/1835291483406692352.htm" title="前端three.js的Sprite模拟下雪动画效果" target="_blank">前端three.js的Sprite模拟下雪动画效果</a> <span class="text-muted">qq_35430208</span> <a class="tag" taget="_blank" href="/search/three.js/1.htm">three.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/%E4%B8%89%E7%BB%B4%E5%9C%BA%E6%99%AF%E4%B8%AD%E4%B8%8B%E9%9B%AA%E6%95%88%E6%9E%9C/1.htm">三维场景中下雪效果</a><a class="tag" taget="_blank" href="/search/threejs%E5%AE%9E%E7%8E%B0%E4%B8%8B%E9%9B%AA%E6%95%88%E6%9E%9C/1.htm">threejs实现下雪效果</a> <div>一、效果如图所示:二、原理同下雨一样三、完整代码:index.jsimport*asTHREEfrom'three';import{OrbitControls}from'three/addons/controls/OrbitControls.js';importmodelfrom'./model.js';//模型对象//场景constscene=newTHREE.Scene();scene.add</div> </li> <li><a href="/article/1835243206963458048.htm" title="系列3:【深入】qiankun动态与按需加载子应用—像电影一样控制出现时机" target="_blank">系列3:【深入】qiankun动态与按需加载子应用—像电影一样控制出现时机</a> <span class="text-muted">rabbit_it</span> <a class="tag" taget="_blank" href="/search/qiankun%E5%AD%A6%E4%B9%A0/1.htm">qiankun学习</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/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a> <div>一、引言:为何需要动态加载在现代前端开发中,性能优化始终是一个关键问题。对于微前端架构而言,管理多个子应用带来了前所未有的灵活性,但也对资源的加载和使用效率提出了更高要求。假设你的微前端项目就像一场电影,而子应用是场景或演员。在不同的情节中,我们只需要特定的场景和演员出现,而不需要所有场景和演员一开始就站在舞台上等待。这时,动态加载和按需加载就成为了关键工具——让需要的内容在正确的时机上场,节省性</div> </li> <li><a href="/article/1835239047803531264.htm" title="ODOO不同版本与平台选择" target="_blank">ODOO不同版本与平台选择</a> <span class="text-muted">chouchengyin2080</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>1.10.0vs11.0vs8.0截至2017年底,最新的ODOO发布版为ODOO11.0,但功能上有一定精简(去除财务模块,去除工作流支持),技术上变动较大(代码逐步迁移至Python3,前端框架改写得抽象)。所以如果是从生产使用的角度来讲,ODOO10.0是当前最好选择,因为其更稳定,第三方模块也更多更全面。而如果是ODOO技术爱好从业者,则逐步迁移至ODOO11.0也有必要,因为其底层技术架</div> </li> <li><a href="/article/1835221149026447360.htm" title="Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数" target="_blank">Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数</a> <span class="text-muted">qcidyu</span> <a class="tag" taget="_blank" href="/search/%E5%A5%BD%E7%94%A8%E7%9A%84%E5%B7%A5%E5%85%B7%E9%9B%86%E5%90%88/1.htm">好用的工具集合</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81%E6%95%88%E7%8E%87/1.htm">代码效率</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%8A%80%E5%B7%A7/1.htm">前端技巧</a><a class="tag" taget="_blank" href="/search/Vue%E5%BC%80%E5%8F%91/1.htm">Vue开发</a><a class="tag" taget="_blank" href="/search/%E7%BB%84%E5%90%88%E5%BC%8F%E5%87%BD%E6%95%B0/1.htm">组合式函数</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E5%9D%97%E7%AE%A1%E7%90%86/1.htm">模块管理</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%85%A5/1.htm">自动导入</a><a class="tag" taget="_blank" href="/search/Nuxt/1.htm">Nuxt</a><a class="tag" taget="_blank" href="/search/Kit/1.htm">Kit</a> <div>title:NuxtKit自动导入功能:高效管理你的模块和组合式函数date:2024/9/14updated:2024/9/14author:cmdragonexcerpt:通过使用NuxtKit的自动导入功能,您可以更高效地管理和使用公共函数、组合式函数和VueAPI。无论是单个导入、目录导入还是从第三方模块导入,您都可以通过简单的API调用轻松实现。categories:前端开发tags:N</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>