diff --git a/component/pear/css/pear-module/cardTable.css b/component/pear/css/pear-module/cardTable.css new file mode 100644 index 0000000..71449a3 --- /dev/null +++ b/component/pear/css/pear-module/cardTable.css @@ -0,0 +1,92 @@ +.project-list-item { + background-color: #fff; + border-radius: 4px; + cursor: pointer; + transition: all .2s; +} + +.project-list-item:hover { + box-shadow: 2px 0 4px rgba(0, 21, 41, .35); +} + +.project-list-item .project-list-item-cover { + width: 100%; + height: 180px; + display: block; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +.project-list-item-body { + padding: 20px; + border: 1px solid #e8e8e8; +} + +.project-list-item .project-list-item-body>h2 { + font-size: 16px; + color: #333; + margin-bottom: 12px; +} + +.project-list-item .project-list-item-text { + height: 40px; + overflow: hidden; + margin-bottom: 12px; +} + +.project-list-item .project-list-item-desc { + position: relative; +} + +.project-list-item .project-list-item-desc .time { + color: #999; + font-size: 12px; +} + +.project-list-item .project-list-item-desc .ew-head-list { + position: absolute; + right: 0; + top: 0; +} + +.ew-head-list .ew-head-list-item:first-child { + margin-left: 0; +} + +.ew-head-list .ew-head-list-item { + width: 22px; + height: 22px; + border-radius: 50%; + border: 1px solid #fff; + margin-left: -10px; +} + +.ew-head-list .ew-head-list-item { + width: 22px; + height: 22px; + border-radius: 50%; + border: 1px solid #fff; + margin-left: -10px; +} + +.cloud-card-component { + padding: 20px; +} + +.cloud-card-component .layui-laypage .layui-laypage-curr .layui-laypage-em { + border-radius: 0px !important; +} +.ew-table-loading { + padding: 10px 0; + text-align: center; +} +.ew-table-loading > i { + color: #999; + font-size: 30px; +} +.ew-table-loading.ew-loading-float { + position: absolute; + top: 0; + left: 0; + right: 0; +} \ No newline at end of file diff --git a/component/pear/modules/admin.js b/component/pear/modules/admin.js index bbf0028..67a2e30 100644 --- a/component/pear/modules/admin.js +++ b/component/pear/modules/admin.js @@ -109,6 +109,7 @@ layui.define(['table', 'jquery', 'element', 'yaml','form', 'tab', 'menu', 'frame tool: true, width: '100%', height: '100%', + session: param.tab.session, index: 0, tabMax: param.tab.tabMax, closeEvent: function(id) { @@ -119,7 +120,13 @@ layui.define(['table', 'jquery', 'element', 'yaml','form', 'tab', 'menu', 'frame url: param.tab.index.href, title: param.tab.index.title, close: false - }] + }], + success: function(id){ + setTimeout(function(){ + sideMenu.selectItem(id); + bodyTab.positionTab(); + },500) + } }); bodyTab.click(function(id) { if (!param.tab.keepState) { diff --git a/component/pear/modules/cardTable.js b/component/pear/modules/cardTable.js new file mode 100644 index 0000000..df9420c --- /dev/null +++ b/component/pear/modules/cardTable.js @@ -0,0 +1,209 @@ +layui.define(['table', 'laypage','jquery', 'element'], function(exports) { + "use strict"; + var filePath = layui.cache.modules.cardTable + .substr(0, layui.cache.modules.cardTable.lastIndexOf('/')); + // 引入tablePlug.css + layui.link(filePath + '/cardTable.css'); + var MOD_NAME = 'cardTable', + $ = layui.jquery, + element = layui.element, + laypage = layui.laypage; + var _instances = {}; // 记录所有实例 + /* 默认参数 */ + var defaultOption = { + elem: "#currentTableId",// 构建的模型 + url: "",// 数据 url 连接 + loading: true,//是否加载 + limit: 0, //每页数量默认是每行数量的双倍 + linenum: 4, //每行数量 2,3,4,6 + currentPage: 1,//当前页 + limits:[], //页码 + page: true, //是否分页 + layout: ['count', 'prev', 'page', 'next','limit', 'skip'],//分页控件 + request: { + pageName: 'page' //页码的参数名称,默认:page + , limitName: 'limit' //每页数据量的参数名,默认:limit + , idName: 'id' //主键名称,默认:id + , titleName: 'title' //标题名称,默认:title + , imageName: 'image' //图片地址,默认:image + , remarkName: 'remark' //备注名称,默认:remark + , timeName: 'time' //时间名称,默认:time + }, + response: { + statusName: 'code' //规定数据状态的字段名称,默认:code + , statusCode: 0 //规定成功的状态码,默认:0 + , msgName: 'msg' //规定状态信息的字段名称,默认:msg + , countName: 'count' //规定数据总数的字段名称,默认:count + , dataName: 'data' //规定数据列表的字段名称,默认:data + }, + // 完 成 函 数 + done: function () { + + } + }; + var card = function(opt) { + _instances[opt.elem.substring(1)] = this; + this.reload(opt); + }; + /** 参数设置 */ + card.prototype.initOptions = function (opt) { + this.option = $.extend(true, {}, defaultOption, opt); + if (!this.option.limit || this.option.limit == 0) { + this.option.limit = this.option.linenum * 2; + } + if (!this.option.limits || this.option.limits.length == 0) { + this.option.limits = [this.option.limit]; + } + }; + card.prototype.init = function () { + var option = this.option; + var url = option.url; + var html = ""; + html += option.loading == true ? '
' : '
'; + html += ' '; + html += '
'; + $(option.elem).html(html); + // 根 据 请 求 方 式 获 取 数 据 + html = ""; + if (url != null) { + if (!!option.page) { + url = url + '&' + option.request.limitName + '=' + option.limit; + url = url + '&' + option.request.pageName + '=' + option.currentPage; + } + if (!!option.where) { + for (let key in option.where) { + url = url + '&' + key + '=' + option.where[key]; + } + } + var data = getData(url); + data = initData(data, option); + if (data.code != option.response.statusCode) { + html = "

" + data.msg + "

"; + } + else { + option.data = data.data; + option.count = data.count; + // 根据结果进行相应结构的创建 + if (!!option.data && option.data.length > 0) { + html = createComponent(option.elem.substring(1),option.linenum,data.data); + html += "
"; + } + else { + html = "

没有数据

"; + } + } + } + $(option.elem).html(html); + if (option.page) { + // 初始化分页组件 + laypage.render({ + elem: 'cardpage' + , count: option.count, limit: option.limit, limits:option.limits, curr: option.currentPage + , layout: option.layout + , jump: function (obj, first) { + option.limit = obj.limit; + option.currentPage = obj.curr; + if (!first) { + _instances[option.elem.substring(1)].reload(option); + } + } + }); + } + } + card.prototype.reload = function (opt) { + this.initOptions(this.option ? $.extend(true, this.option, opt) : opt); + this.init(); // 初始化表格 + } + + function createComponent(elem,linenum,data) { + var html = "
" + var content = createCards(elem, linenum,data); + var page = ""; + content = content + page; + html += content + "
" + return html; + } + /** 创建指定数量的卡片 */ + function createCards(elem, linenum,data) { + var content = "
"; + for (var i = 0; i < data.length; i++) { + content += createCard(elem, linenum,data[i],i); + } + content += "
"; + return content; + } + /** 创建一个卡片 */ + function createCard(elem, linenum, item, no) { + var line = 12 / linenum; + var card = + '

' + item.title + '

' + item.remark + '
' +item.time + '
' + return card; + } + /** 格式化返回参数 */ + function initData(tempData, option) { + var data = {}; + data.code = tempData[option.response.statusName]; + data.msg = tempData[option.response.msgName]; + data.count = tempData[option.response.countName]; + var dataList = tempData[option.response.dataName]; + alert(JSON.stringify(dataList)); + data.data = []; + for (var i = 0; i < dataList.length; i++) { + var item = {}; + item.id = dataList[i][option.request.idName]; + item.image = dataList[i][option.request.imageName]; + item.title = dataList[i][option.request.titleName]; + item.remark = dataList[i][option.request.remarkName]; + item.time = dataList[i][option.request.timeName]; + data.data.push(item); + } + return data; + } + /** 同 步 请 求 获 取 数 据 */ + function getData(url) { + $.ajaxSettings.async = false; + var data = null; + + $.get(url, function (result) { + data = result; + }); + + $.ajaxSettings.async = true; + return data; + } + //卡片点击事件 + window.cardTableCheckedCard = function (elem,obj) { + $(obj).addClass('layui-table-click').siblings().removeClass('layui-table-click'); + var item = {}; + item.id = obj.id; + item.image = $(obj).find('.project-list-item-cover')[0].src; + item.title = $(obj).find('h2')[0].innerHTML; + item.remark = $(obj).find('.project-list-item-text')[0].innerHTML; + item.time = $(obj).find('.time')[0].innerHTML; + _instances[elem.id].option.checkedItem = item; + } + /** 对外提供的方法 */ + var tt = { + /* 渲染 */ + render: function (options) { + return new card(options); + }, + /* 重载 */ + reload: function (id, opt) { + _instances[id].reload(opt); + }, + /* 获取选中参数 */ + getChecked: function (id) { + var option = _instances[id].option; + var data = option.checkedItem; + var item = {}; + item[option.request.idName] = data.id; + item[option.request.imageName] = data.image; + item[option.request.titleName] = data.title; + item[option.request.remarkName] = data.remark; + item[option.request.timeName] = data.time; + return item; + }, + } + exports(MOD_NAME, tt); +}) diff --git a/component/pear/modules/tab.js b/component/pear/modules/tab.js index e527c44..3dcc6e7 100644 --- a/component/pear/modules/tab.js +++ b/component/pear/modules/tab.js @@ -8,7 +8,9 @@ layui.define(['jquery', 'element'], function(exports) { var pearTab = function(opt) { this.option = opt; }; - + + var tabData = new Array(); + var tabDataCurrent = 0; pearTab.prototype.render = function(opt) { //默认配置值 @@ -21,46 +23,57 @@ layui.define(['jquery', 'element'], function(exports) { width: opt.width, height: opt.height, tabMax: opt.tabMax, - closeEvent: opt.closeEvent + session: opt.session?opt.session:false, + closeEvent: opt.closeEvent, + success: opt.success?opt.success:function(id){} } - + + // 初始化,检索 session 是否开启 + if(option.session){ + // 替换 opt.data 数据 + if(sessionStorage.getItem(option.elem+"-pear-tab-data")!=null){ + tabData = JSON.parse(sessionStorage.getItem(option.elem+"-pear-tab-data")); + option.data = JSON.parse(sessionStorage.getItem(option.elem+"-pear-tab-data")); + tabDataCurrent = sessionStorage.getItem(option.elem+"-pear-tab-data-current"); + tabData.forEach(function(item,index){ + if(item.id == tabDataCurrent){ + option.index = index; + } + }) + }else{ + tabData = opt.data; + } + } + var tab = createTab(option); - $("#" + option.elem).html(tab); - $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-prev").click(function() { rollPage("left", option); }) - $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-next").click(function() { rollPage("right", option); }) - element.init(); - toolEvent(option); - $("#" + option.elem).width(opt.width); $("#" + option.elem).height(opt.height); $("#" + option.elem).css({ position: "relative" }); - closeEvent(option); - + + option.success(sessionStorage.getItem(option.elem+"-pear-tab-data-current")); + // 执行回调 return new pearTab(option); } pearTab.prototype.click = function(callback) { - var elem = this.option.elem; - + var option = this.option; element.on('tab(' + this.option.elem + ')', function(data) { - var id = $("#" + elem + " .layui-tab-title .layui-this").attr("lay-id"); - + sessionStorage.setItem(option.elem+"-pear-tab-data-current",id); callback(id); - }); } @@ -80,9 +93,7 @@ layui.define(['jquery', 'element'], function(exports) { } pearTab.prototype.addTab = function(opt) { - var title = ''; - if (opt.close) { title += '' + opt.title + ''; @@ -96,6 +107,9 @@ layui.define(['jquery', 'element'], function(exports) { opt.url + '" style="width:100%;height:100%;">', id: opt.id }); + tabData.push(opt); + sessionStorage.setItem(this.option.elem+"-pear-tab-data",JSON.stringify(tabData)); + sessionStorage.setItem(this.option.elem+"-pear-tab-data-current",opt.id); element.tabChange(this.option.elem, opt.id); } var index = 0; @@ -152,6 +166,8 @@ layui.define(['jquery', 'element'], function(exports) { opt.url + '" style="width:100%;height:100%;">', id: opt.id }); + tabData.push(opt); + sessionStorage.setItem(elem+"-pear-tab-data",JSON.stringify(tabData)); } else { var isData = false; $.each($(".layui-tab[lay-filter='" + elem + "'] .layui-tab-title li[lay-id]"), function() { @@ -184,45 +200,37 @@ layui.define(['jquery', 'element'], function(exports) { opt.url + '" style="width:100%;height:100%;">', id: opt.id }); + tabData.push(opt); + sessionStorage.setItem(elem+"-pear-tab-data",JSON.stringify(tabData)); + } } + sessionStorage.setItem(elem+"-pear-tab-data-current",opt.id); element.tabChange(elem, opt.id); } - /** 添 加 唯 一 选 项 卡 */ pearTab.prototype.addTabOnly = function(opt, time) { - var title = ''; - if (opt.close) { - title += '' + opt.title + - '' - + ''; } else { - title += '' + opt.title + - '' - + ''; } - if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]").length <= 0) { - if (time != false && time != 0) { - var load = '
' + '
' + '' + '
' + - '
' - + '
'; $("#" + this.option.elem).find(".pear-tab").append(load); var pearLoad = $("#" + this.option.elem).find("#pear-tab-loading" + index); pearLoad.css({ display: "block" }); - setTimeout(function() { pearLoad.fadeOut(500); }, time); @@ -234,10 +242,11 @@ layui.define(['jquery', 'element'], function(exports) { opt.url + '" style="width:100%;height:100%;">', id: opt.id }); + tabData.push(opt); + sessionStorage.setItem(this.option.elem+"-pear-tab-data",JSON.stringify(tabData)); + sessionStorage.setItem(this.option.elem+"-pear-tab-data-current",opt.id); } else { - var isData = false; - //查询当前选项卡数量 if ($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]").length >= this.option.tabMax) { layer.msg("最多打开" + this.option.tabMax + "个标签页", { @@ -247,18 +256,13 @@ layui.define(['jquery', 'element'], function(exports) { }); return false; } - $.each($(".layui-tab[lay-filter='" + this.option.elem + "'] .layui-tab-title li[lay-id]"), function() { - if ($(this).attr("lay-id") == opt.id) { - isData = true; } }) if (isData == false) { - if (time != false && time != 0) { - var load = '
' + '
' + '' + @@ -270,31 +274,30 @@ layui.define(['jquery', 'element'], function(exports) { pearLoad.css({ display: "block" }); - setTimeout(function() { pearLoad.fadeOut(500); }, time); index++; } - element.tabAdd(this.option.elem, { title: title, content: '', id: opt.id }); + tabData.push(opt); + sessionStorage.setItem(this.option.elem+"-pear-tab-data",JSON.stringify(tabData)); + sessionStorage.setItem(this.option.elem+"-pear-tab-data-current",opt.id); } } element.tabChange(this.option.elem, opt.id); + sessionStorage.setItem(this.option.elem+"-pear-tab-data-current",opt.id); } - // 刷 新 指 定 的 选 项 卡 pearTab.prototype.refresh = function(time) { - // 刷 新 指 定 的 选 项 卡 if (time != false && time != 0) { - var load = '
' + '
' + '' + @@ -321,7 +324,7 @@ layui.define(['jquery', 'element'], function(exports) { } } - function tabDelete(elem, id, callback) { + function tabDelete(elem, id, callback,option) { //根据 elem id 来删除指定的 layui title li var tabTitle = $(".layui-tab[lay-filter='" + elem + "']").find(".layui-tab-title"); @@ -329,9 +332,7 @@ layui.define(['jquery', 'element'], function(exports) { // 删除指定 id 的 title var removeTab = tabTitle.find("li[lay-id='" + id + "']"); var nextNode = removeTab.next("li"); - if(!removeTab.hasClass("layui-this")){ - removeTab.remove(); var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("iframe[id='" + id + "']").parent(); tabContent.remove(); @@ -339,72 +340,57 @@ layui.define(['jquery', 'element'], function(exports) { } var currId; - if (nextNode.length) { - nextNode.addClass("layui-this"); currId = nextNode.attr("lay-id"); $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show"); - } else { - var prevNode = removeTab.prev("li"); prevNode.addClass("layui-this"); currId = prevNode.attr("lay-id"); $("#" + elem + " [id='" + currId + "']").parent().addClass("layui-show"); - } callback(currId); + tabData = JSON.parse(sessionStorage.getItem(elem+"-pear-tab-data")); + tabDataCurrent = sessionStorage.getItem(elem+"-pear-tab-data-current"); + tabData = tabData.filter(function(item){ + return item.id!=id; + }) + sessionStorage.setItem(elem+"-pear-tab-data",JSON.stringify(tabData)); + sessionStorage.setItem(elem+"-pear-tab-data-current",currId); removeTab.remove(); // 删除 content var tabContent = $(".layui-tab[lay-filter='" + elem + "']").find("iframe[id='" + id + "']").parent(); + // 删除 tabContent.remove(); } function createTab(option) { var type = ""; - var types = option.type+" "; - if (option.roll == true) { - type = "layui-tab-roll"; } - if (option.tool != false) { type = "layui-tab-tool"; } - if (option.roll == true && option.tool != false) { type = "layui-tab-rollTool"; } - var tab = '
'; - var title = '
    '; - var content = '
    '; - - var control = - '
    • '; + var control = '
      • '; // 处 理 选 项 卡 头 部 - var index = 0; - $.each(option.data, function(i, item) { - var TitleItem = ''; - if (option.index == index) { - TitleItem += '
      • '; - } else { - TitleItem += '
      • '; - } if (item.close) { @@ -414,26 +400,19 @@ layui.define(['jquery', 'element'], function(exports) { // 当 前 选 项 卡 不 允 许 关 闭 TitleItem += '' + item.title + ''; } - TitleItem += '
      • '; - title += TitleItem; - - if (option.index == index) { // 处 理 显 示 内 容 content += '
        ' - } else { - // 处 理 显 示 内 容 content += '
        ' - } index++; }); @@ -455,17 +434,12 @@ layui.define(['jquery', 'element'], function(exports) { function rollPage(d, option) { var $tabTitle = $('#' + option.elem + ' .layui-tab-title'); - var left = $tabTitle.scrollLeft(); - if ('left' === d) { - $tabTitle.animate({ scrollLeft: left - 450 }, 200); - } else { - $tabTitle.animate({ scrollLeft: left + 450 }, 200); @@ -475,7 +449,7 @@ layui.define(['jquery', 'element'], function(exports) { function closeEvent(option) { $(".layui-tab[lay-filter='" + option.elem + "']").on("click", ".layui-tab-close", function() { var layid = $(this).parent().attr("lay-id"); - tabDelete(option.elem, layid, option.closeEvent); + tabDelete(option.elem, layid, option.closeEvent,option); }) } @@ -485,7 +459,7 @@ layui.define(['jquery', 'element'], function(exports) { var currentTab = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title .layui-this"); if (currentTab.find("span").is(".able-close")) { var currentId = currentTab.attr("lay-id"); - tabDelete(option.elem, currentId, option.closeEvent); + tabDelete(option.elem, currentId, option.closeEvent,option); } }) @@ -496,7 +470,7 @@ layui.define(['jquery', 'element'], function(exports) { $.each(tabtitle, function(i) { if ($(this).attr("lay-id") != currentId) { if ($(this).find("span").is(".able-close")) { - tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent); + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent,option); } } }) @@ -507,7 +481,7 @@ layui.define(['jquery', 'element'], function(exports) { var tabtitle = $(".layui-tab[lay-filter='" + option.elem + "'] .layui-tab-title li"); $.each(tabtitle, function(i) { if ($(this).find("span").is(".able-close")) { - tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent); + tabDelete(option.elem, $(this).attr("lay-id"), option.closeEvent,option); } }) }) diff --git a/component/pear/pear.all.js b/component/pear/pear.all.js index 61409bc..8892e5f 100644 --- a/component/pear/pear.all.js +++ b/component/pear/pear.all.js @@ -43,7 +43,8 @@ layui.config({ yaml:"yaml", // yaml 解析组件 context: "context", // 上下文组件 http: "http", // ajax请求组件 - theme: "theme" // 主题转换 + theme: "theme", // 主题转换 + cardTable: "cardTable" }).use(['layer', 'theme'], function () { layui.theme.changeTheme(window, false); diff --git a/component/pear/pear.js b/component/pear/pear.js index 4cf5c0c..4bd2425 100644 --- a/component/pear/pear.js +++ b/component/pear/pear.js @@ -43,8 +43,8 @@ layui.config({ yaml:"yaml", // yaml 解析组件 context: "context", // 上下文组件 http: "http", // ajax请求组件 - theme: "theme" // 主题转换 + theme: "theme", // 主题转换 + cardTable: "cardTable" }).use(['layer', 'theme'], function () { - layui.theme.changeTheme(window, false); }); \ No newline at end of file diff --git a/config/pear.config.yml b/config/pear.config.yml index ac911af..abb360b 100644 --- a/config/pear.config.yml +++ b/config/pear.config.yml @@ -23,6 +23,8 @@ tab: muiltTab: true ## 切换选项卡时,是否刷新页面状态 keepState: true + ## 是否开启 Tab 记忆 + session: true ## 最大可打开的选项卡数量 tabMax: "30" ## 默认选项卡数据 diff --git a/index.html b/index.html index 21e3ca7..beaade6 100644 --- a/index.html +++ b/index.html @@ -85,7 +85,6 @@ image.onload = function(){ $(".layui-nav-img").attr("src", convert.imageToBase64(image)); } - // 框架初始化时会读取 根目录下 pear.config.yml 文件作为初始化配置 // 你可以通过 admin.setConfigPath 方法修改配置文件位置 // 你可以通过 admin.setConfigType 方法修改配置文件类型 diff --git a/view/document/card.html b/view/document/card.html index ab9939d..1ac788a 100644 --- a/view/document/card.html +++ b/view/document/card.html @@ -41,60 +41,17 @@
  • - - - - - - - - - - -