carousel.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <style type="text/css">
  2. .xm-label-block {
  3. background-color: #287bd2
  4. }
  5. .input-img-preview {
  6. z-index: 999999999;
  7. }
  8. </style>
  9. <!-- 正文开始 -->
  10. <div class="layui-fluid">
  11. <div class="layui-card">
  12. <div class="layui-card-body">
  13. <div class="layui-tab layui-tab-brief">
  14. <table id="dataTable" lay-filter="dataTable"></table>
  15. </div>
  16. </div>
  17. </div>
  18. </div>
  19. <script type="text/html" id="toolBarTpl">
  20. <div class="layui-btn-group fl">
  21. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle table-toolbar-btn">&nbsp;添加</a >
  22. <a table-data="{'url':'store/banner/plectron','action':'put',param:{'status': 1}}" class="layui-btn layui-btn-sm layui-icon layui-icon-play table-toolbar-btn">&nbsp;启用</a >
  23. <a table-data="{'url':'store/banner/plectron','action':'put',param:{'status': 0}}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-pause table-toolbar-btn">&nbsp;冻结</a>
  24. <a table-data="{'url':'store/banner/plectron','action':'delete'}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-close table-toolbar-btn">&nbsp;删除</a>
  25. </div>
  26. </script>
  27. <!-- 表格操作列 -->
  28. <script type="text/html" id="tableBarUser">
  29. <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="view">查看</a>
  30. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  31. <a class="layui-btn layui-btn-danger layui-btn-xs" perm-show="delete:/store/banner/<id>" lay-event="del">删除</a>
  32. </script>
  33. <!-- 表格状态列 -->
  34. <script type="text/html" id="tableStateCarousel">
  35. <input type="checkbox" value="{{ d.status }}" switch-data="{'url':'store/banner/{{ d.id }}','action':'put'}" lay-skin="switch" lay-filter="ckDataTableState"
  36. lay-text="正常|锁定" {{d.status==1?'checked':''}}/>
  37. </script>
  38. <!-- 表单弹窗 -->
  39. <script type="text/html" id="modelCarousel">
  40. <form id="modelCarouselForm" lay-filter="modelCarouselForm" class="layui-form model-form">
  41. <input name="id" type="hidden"/>
  42. <div class="layui-form-item">
  43. <label class="layui-form-label layui-form-required">轮播位置</label>
  44. <div class="layui-input-block">
  45. <input name="name" placeholder="轮播位置" type="text" class="layui-input" maxlength="80"
  46. lay-verType="tips" lay-verify="required" required/>
  47. </div>
  48. </div>
  49. <div class="layui-form-item">
  50. <label class="layui-form-label layui-form-required">轮播备注</label>
  51. <div class="layui-input-block">
  52. <textarea name="description" placeholder="请输入内容" class="layui-textarea" maxlength="200"></textarea>
  53. </div>
  54. </div>
  55. <div class="layui-form-item text-right">
  56. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  57. <button class="layui-btn" perm-show="put:/store/banner/<id>" lay-filter="modelSubmitCarousel" lay-submit>保存</button>
  58. </div>
  59. </form>
  60. </script>
  61. <!--轮播图列表-->
  62. <script type="text/html" id="modelCarouselItem">
  63. <table class="layui-table" id="CarouselItemTb" lay-filter="CarouselItemTb"></table>
  64. </script>
  65. <!-- 表格操作列 -->
  66. <script type="text/html" id="CarouselItemTabbar">
  67. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  68. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  69. </script>
  70. <script type="text/html" id="CarouselItemToolbar">
  71. <div class="layui-btn-group fl">
  72. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle-fine carousel-item-add-btn">&nbsp;添加</a>
  73. <a table-data="{'table':'CarouselItemTb','url':'store/banner/item/plectron','action':'put',param:{'status': 1}}" class="layui-btn layui-btn-sm layui-icon layui-icon-play table-toolbar-btn">&nbsp;启用</a >
  74. <a table-data="{'table':'CarouselItemTb','url':'store/banner/item/plectron','action':'put',param:{'status': 0}}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-pause table-toolbar-btn">&nbsp;停用</a>
  75. <a table-data="{'table':'CarouselItemTb','url':'store/banner/item/plectron','action':'delete'}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-close table-toolbar-btn">&nbsp;删除</a>
  76. </div>
  77. </script>
  78. <script type="text/html" id="modelCarouselItemEdit">
  79. <form id="modelCarouselEditForm" lay-filter="modelCarouselEditForm" class="layui-form model-form">
  80. <input name="id" type="hidden"/>
  81. <input name="banner_id" type="hidden"/>
  82. <div class="layui-form-item">
  83. <label class="layui-form-label">轮播名称</label>
  84. <div class="layui-input-block">
  85. <input name="name" placeholder="请输入轮播名称" type="text" class="layui-input" maxlength="20"
  86. lay-verType="tips" lay-verify="required" required/>
  87. </div>
  88. </div>
  89. <div class="layui-form-item">
  90. <label class="layui-form-label">跳转类型</label>
  91. <div class="layui-input-block">
  92. <select id="openType" name="open_type" lay-filter="required">
  93. <option value="0">无跳转</option>
  94. <option value="1">内链</option>
  95. <option value="2">外链</option>
  96. </select>
  97. </div>
  98. </div>
  99. <div class="layui-form-item" id="openUrl">
  100. <label class="layui-form-label">跳转地址</label>
  101. <div class="layui-input-block">
  102. <input name="open_url" type="text" placeholder="请输入跳转地址" class="layui-input"/>
  103. </div>
  104. </div>
  105. <div class="layui-form-item">
  106. <label class="layui-form-label">轮播图片</label>
  107. <div class="layui-input-block">
  108. <input type="text" name="img" value="" class="layui-input layui-disabled" style="padding-right: 80px;" disabled="">
  109. <button class="layui-btn icon-btn dialog-file-choose" data-input="img" type="button" style="position: absolute;top: 0;right: 0px;cursor: pointer;"><i class="layui-icon"></i>上传图片</button>
  110. <div class="img-preview-box img" style="display: flex;flex-wrap: wrap;align-content: space-between;background: #f7f7f7;">
  111. <img class="input-img-preview" src="../../assets/images/placeholder-refund.png" style="height: 100px;margin: 8px;">
  112. </div>
  113. </div>
  114. </div>
  115. <div class="layui-form-item">
  116. <label class="layui-form-label">是否启用</label>
  117. <div class="layui-input-block">
  118. <select name="status" lay-verType="msg" lay-verify="required" required>
  119. <option value="0">禁用</option>
  120. <option value="1">启用</option>
  121. </select>
  122. </div>
  123. </div>
  124. <div class="layui-form-item text-right">
  125. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  126. <button class="layui-btn" perm-show="put:/store/banner/item/<id>" lay-filter="modelSubmitCarouselEdit" lay-submit>保存</button>
  127. </div>
  128. </form>
  129. </script>
  130. <!-- js部分 -->
  131. <script>
  132. layui.use(['layer', 'form', 'table', 'util', 'notice','md5', 'admin', 'setter', 'fileChoose'], function () {
  133. var $ = layui.jquery;
  134. var layer = layui.layer;
  135. var form = layui.form;
  136. var table = layui.table;
  137. var util = layui.util;
  138. var admin = layui.admin;
  139. var notice = layui.notice;
  140. var setter = layui.setter;
  141. var md5 = layui.md5;
  142. var fileChoose = layui.fileChoose;
  143. form.render('select');
  144. // 渲染表格
  145. var insTb = table.render({
  146. elem: '#dataTable',
  147. url: setter.baseServer + 'store/banner',
  148. page: true,
  149. toolbar: '#toolBarTpl',
  150. cellMinWidth: 100,
  151. cols: [[
  152. {type: 'numbers'},
  153. {field: 'name', title: '轮播图位置'},
  154. {field: 'description', title: '说明', width: 200},
  155. {
  156. field: 'created_at', sort: true, templet: function (d) {
  157. return util.toDateString(d.created_at * 1e3);
  158. }, title: '创建时间', width: 180
  159. },
  160. {field: 'status', templet: '#tableStateCarousel', title: '状态', width: 120},
  161. {fixed:'right', align: 'center', toolbar: '#tableBarUser', title: '操作', minWidth: 200}
  162. ]],
  163. done:function () {
  164. admin.renderPerm()
  165. }
  166. });
  167. // 搜索
  168. form.on('submit(formSubSearchUser)', function (data) {
  169. insTb.reload({where: data.field}, 'data');
  170. });
  171. // 工具条点击事件
  172. table.on('tool(dataTable)', function (obj) {
  173. var data = obj.data;
  174. var layEvent = obj.event;
  175. if (layEvent === 'edit') { // 修改
  176. showEditModel(data);
  177. } else if (layEvent === 'view') { // 查看
  178. showCarouselModel(data);
  179. }else if (layEvent === 'del') { // 删除
  180. layer.confirm('确定要删除“' + data.name + '”吗?', {
  181. skin: 'layui-layer-admin',
  182. shade: .1
  183. }, function (i) {
  184. layer.close(i);
  185. layer.load(2);
  186. admin.req('store/banner/' + data.id, function (r) {
  187. layer.closeAll('loading');
  188. if (r.code === 10000) {
  189. notice.msg(r.message, {icon: 1});
  190. insTb.reload({}, 'data');
  191. } else {
  192. notice.msg(r.message, {icon: 2});
  193. }
  194. }, 'DELETE');
  195. });
  196. }
  197. });
  198. // 显示表单弹窗
  199. function showEditModel(data) {
  200. admin.open({
  201. type: 1,
  202. area: '420px', //宽高
  203. title: (data ? '修改' : '添加') + '轮播位置',
  204. content: $('#modelCarousel').html(),
  205. success: function (layero, dIndex) {
  206. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  207. $(layero).children('.layui-table').css('margin', '0');
  208. // 回显数据
  209. form.val('modelCarouselForm', data);
  210. // 表单提交事件
  211. form.on('submit(modelSubmitCarousel)', function (form) {
  212. layer.load(2);
  213. admin.req('store/banner' + (data ? '/' + form.field.id : ''), form.field, function (res) {
  214. layer.closeAll('loading');
  215. if (res.code === 10000) {
  216. layer.close(dIndex);
  217. notice.msg(res.message, {icon: 1});
  218. insTb.reload({}, 'data');
  219. } else {
  220. notice.msg(res.message, {icon: 2});
  221. }
  222. }, data ? 'PUT' : 'POST');
  223. return false;
  224. });
  225. }
  226. });
  227. }
  228. // ******************************
  229. var carouseTb;
  230. var bannerId;
  231. function showCarouselModel(data) {
  232. // 所属轮播位置ID
  233. bannerId = data.id;
  234. admin.open({
  235. type: 1,
  236. area: '750px',
  237. title: '查看轮播图',
  238. content: $('#modelCarouselItem').html(),
  239. success: function (layero, dIndex) {
  240. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  241. // 渲染表格
  242. carouseTb = table.render({
  243. elem: '#CarouselItemTb',
  244. url: setter.baseServer + 'store/banner/' + bannerId,
  245. page: true,
  246. height: 300,
  247. toolbar: '#CarouselItemToolbar',
  248. cols: [[
  249. {type: 'checkbox'},
  250. {field: 'name', title: '轮播图', width: 100},
  251. {field: 'src', templet: function (d) {
  252. return '<img src="' + (d.img || '../../assets/images/placeholder-refund.png') + '" style="height: 100%" class="input-img-preview"/>';
  253. }, sort: true, title: '图片', width: 160,height: 200
  254. },
  255. {field: 'open_type', templet: function (d) {
  256. var type = "无跳转";
  257. if (d.open_type == 1){
  258. type = "内链"
  259. }else if(d.open_type == 2) {
  260. type = "外链"
  261. }
  262. return type;
  263. },title: '跳转方式', width: 100},
  264. {field: 'open_url', title: '跳转地址', width: 100},
  265. {field: 'status', templet: function (d) {
  266. return '<a class="layui-btn ' + (d.status == 0 ? 'layui-btn-danger': '' ) + ' layui-btn-xs">' + (d.status == 0 ? '停用': '启用' )+ '</a>';
  267. }, title: '状态', width: 120},
  268. {fixed: "right",align: 'center', toolbar: '#CarouselItemTabbar', title: '操作', minWidth: 200}
  269. ]]
  270. });
  271. // 工具条点击事件
  272. table.on('tool(CarouselItemTb)', function (obj) {
  273. var data = obj.data;
  274. var layEvent = obj.event;
  275. if (layEvent === 'edit') { // 修改
  276. showCarouselEditModel(data);
  277. }else if (layEvent === 'del') { // 删除
  278. layer.confirm('确定要删除“' + data.name + '”吗?', {
  279. skin: 'layui-layer-admin',
  280. shade: .1
  281. }, function (i) {
  282. layer.close(i);
  283. layer.load(2);
  284. admin.req('store/banner/item/delete/' + data.id, function (r) {
  285. layer.closeAll('loading');
  286. if (r.code === 10000) {
  287. notice.msg(r.message, {icon: 1});
  288. carouseTb.reload({}, 'data');
  289. } else {
  290. notice.msg(r.message, {icon: 2});
  291. }
  292. }, 'DELETE');
  293. });
  294. }
  295. });
  296. }
  297. });
  298. }
  299. // 添加
  300. $(document).on('click','.carousel-item-add-btn', function () {
  301. showCarouselEditModel();
  302. });
  303. // 显示表单弹窗
  304. function showCarouselEditModel(data) {
  305. admin.open({
  306. type: 1,
  307. area: ['420px'], //宽高
  308. title: (data ? '修改' : '添加') + '轮播图',
  309. content: $('#modelCarouselItemEdit').html(),
  310. success: function (layero, dIndex) {
  311. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  312. // 回显数据
  313. // 无论如何都追加所属ID banner_id
  314. form.val('modelCarouselEditForm', $.extend({},data, {banner_id: bannerId}));
  315. // 是否显示跳转地址
  316. (data && data.open_type > 0) ? $("#openUrl").show(): $("#openUrl").hide();
  317. // 选择跳转类型
  318. $(document).on('change','#openType', function () {
  319. var val = $(this).val();
  320. if (val > 0) {
  321. $("#openUrl").show();
  322. }else
  323. $("#openUrl").hide();
  324. // 置空
  325. $('input[name="open_url"]').value = "";
  326. });
  327. if(data) {
  328. $(".img-preview-box.img").empty();
  329. $(".img-preview-box.img").append('<img class="input-img-preview" src="' + data.img + '" style="height: 100px;margin: 8px;"/>')
  330. }
  331. //../../assets/images/placeholder-refund.png
  332. form.render('radio');
  333. form.render('select');
  334. // 表单提交事件
  335. form.on('submit(modelSubmitCarouselEdit)', function (form) {
  336. // 判断下链接地址
  337. if(form.field.open_type > 0 && form.field.open_url == ""){
  338. notice.msg("跳转地址不能为空", {icon: 2});
  339. return false;
  340. }
  341. layer.load(2);
  342. admin.req('store/banner/item' + (data ? '/update/' + form.field.id : '/create'), form.field, function (res) {
  343. layer.closeAll('loading');
  344. if (res.code === 10000) {
  345. layer.close(dIndex);
  346. notice.msg(res.message, {icon: 1});
  347. carouseTb.reload({}, 'data');
  348. } else {
  349. notice.msg(res.message, {icon: 2});
  350. }
  351. }, data ? 'PUT' : 'POST');
  352. return false;
  353. });
  354. }
  355. });
  356. }
  357. });
  358. </script>