article.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. <style type="text/css">
  2. .xm-label-block {
  3. background-color: #287bd2
  4. }
  5. </style>
  6. <!-- 正文开始 -->
  7. <div class="layui-fluid">
  8. <div class="layui-card">
  9. <div class="layui-card-body">
  10. <div class="layui-form toolbar" id="tbToolBar">
  11. <div class="layui-form-item">
  12. <div class="layui-inline">
  13. <label class="layui-form-label w-auto">用户名:</label>
  14. <div class="layui-input-inline mr0">
  15. <input name="keyword" class="layui-input" type="text" placeholder="用户名"/>
  16. </div>
  17. </div>
  18. <div class="layui-inline">
  19. <label class="layui-form-label w-auto">分 类:</label>
  20. <div class="layui-input-inline mr0">
  21. <select id="categorySearch" name="category_id" lay-filter="xmFilter">
  22. <option value=""></option>
  23. </select>
  24. </div>
  25. </div>
  26. <div class="layui-inline" style="padding-right: 110px;">
  27. <button class="layui-btn icon-btn" lay-filter="formSubSearchUser" lay-submit>
  28. <i class="layui-icon">&#xe615;</i>查询
  29. </button>
  30. <button class="layui-btn icon-btn article-category">
  31. <i class="layui-icon">&#xe66b;</i>文章分类
  32. </button>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="layui-tab layui-tab-brief">
  37. <table id="dataTable" lay-filter="dataTable"></table>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. <script type="text/html" id="toolBarTpl">
  43. <div class="layui-btn-group fl">
  44. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle-fine article-add-btn">&nbsp;添加</a>
  45. <a table-data="{'url':'store/article/plectron','action':'put',param:{'status': 1}}" class="layui-btn layui-btn-sm layui-icon layui-icon-play table-toolbar-btn">&nbsp;启用</a >
  46. <a table-data="{'url':'store/article/plectron','action':'put',param:{'status': 0}}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-pause table-toolbar-btn">&nbsp;禁用</a>
  47. <a table-data="{'url':'store/article/plectron','action':'delete'}" confirm class="layui-btn layui-btn-sm layui-icon layui-icon-close table-toolbar-btn">&nbsp;删除</a>
  48. </div>
  49. </script>
  50. <!-- 表格操作列 -->
  51. <script type="text/html" id="tableBarUser">
  52. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  53. <a class="layui-btn layui-btn-danger layui-btn-xs" perm-show="delete:/store/article/<id>" lay-event="del">删除</a>
  54. </script>
  55. <!-- 表格状态列 -->
  56. <script type="text/html" id="tableStateUser">
  57. <input type="checkbox" value="{{ d.status }}" switch-data="{'url':'store/article/{{ d.id }}','action':'put'}" lay-skin="switch" lay-filter="ckDataTableState"
  58. lay-text="正常|发布" {{d.status==1?'checked':''}}/>
  59. </script>
  60. <!-- 表单弹窗 -->
  61. <script type="text/html" id="modelArticle">
  62. <form id="modelArticleForm" lay-filter="modelArticleForm" class="layui-form model-form">
  63. <input name="id" type="hidden"/>
  64. <div class="model-form-body" style="max-height: 500px;">
  65. <div class="layui-form-item">
  66. <label class="layui-form-label layui-form-required">文章标题</label>
  67. <div class="layui-input-block">
  68. <select name="category_id" id="categorySel" lay-verify="required" lay-filter="xmFilter">
  69. <option value=""></option>
  70. </select>
  71. </div>
  72. </div>
  73. <div class="layui-form-item">
  74. <label class="layui-form-label layui-form-required">文章标题</label>
  75. <div class="layui-input-block">
  76. <input name="title" placeholder="请输入文章标题" type="text" class="layui-input" maxlength="80"
  77. lay-verType="tips" lay-verify="required" required/>
  78. </div>
  79. </div>
  80. <div class="layui-form-item">
  81. <label class="layui-form-label">文章摘要</label>
  82. <div class="layui-input-block">
  83. <textarea name="summary" placeholder="请输入文章摘要" class="layui-textarea" maxlength="200"></textarea>
  84. </div>
  85. </div>
  86. <div class="layui-form-item">
  87. <label class="layui-form-label layui-form-required">文章内容</label>
  88. <div class="layui-input-block">
  89. <textarea name="content" id="articleCkEditor"></textarea>
  90. </div>
  91. </div>
  92. </div>
  93. <div class="layui-form-item text-right">
  94. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  95. <button class="layui-btn" perm-show="put:/store/article/<id>" lay-filter="modelSubmitArticle" lay-submit>保存</button>
  96. </div>
  97. </form>
  98. </script>
  99. <!--// 文章分类-->
  100. <script type="text/html" id="modelArticleCate">
  101. <table class="layui-table" id="ArticleCateTb" lay-filter="ArticleCateTb"></table>
  102. </script>
  103. <!--文章分类操作-->
  104. <script type="text/html" id="ArticleCateToolbar">
  105. <div class="layui-btn-group fl">
  106. <a class="layui-btn layui-btn-sm layui-icon layui-icon-add-circle-fine article-cate-add-btn">&nbsp;添加</a>
  107. <a class="layui-btn layui-btn-sm layui-icon layui-icon-refresh article-cate-refresh-btn">&nbsp;刷新</a>
  108. </div>
  109. </script>
  110. <!-- 表格操作列 -->
  111. <script type="text/html" id="ArticleCateTabbar">
  112. <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
  113. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  114. </script>
  115. <script type="text/html" id="modelArticleCateEdit">
  116. <form id="modelArticleCateEditForm" lay-filter="modelArticleCateEditForm" class="layui-form model-form">
  117. <input name="id" type="hidden"/>
  118. <div class="layui-form-item">
  119. <label class="layui-form-label">分类名称</label>
  120. <div class="layui-input-block">
  121. <input name="name" placeholder="请输入分类名称" type="text" class="layui-input" maxlength="20"
  122. lay-verType="tips" lay-verify="required" required/>
  123. </div>
  124. </div>
  125. <div class="layui-form-item text-right">
  126. <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
  127. <button class="layui-btn" perm-show="put:/store/product/category/<id>" lay-filter="modelSubmitArticleCateEdit" lay-submit>保存</button>
  128. </div>
  129. </form>
  130. </script>
  131. <!-- js部分 -->
  132. <script>
  133. layui.use(['layer', 'form', 'table', 'util', 'notice','md5', 'admin', 'setter','CKEDITOR'], function () {
  134. var $ = layui.jquery;
  135. var layer = layui.layer;
  136. var form = layui.form;
  137. var table = layui.table;
  138. var util = layui.util;
  139. var admin = layui.admin;
  140. var notice = layui.notice;
  141. var setter = layui.setter;
  142. var CKEDITOR = layui.CKEDITOR;
  143. // 获取所有分类
  144. var category = [];
  145. layer.load(2);
  146. admin.req('store/article/category', {}, function (res) {
  147. layer.closeAll('loading');
  148. if (10000 == res.code) {
  149. category = res.data.list;
  150. $.each(category, function (index, item) {
  151. $('#categorySearch').append('<option value="'+ item.id +'">'+ item.name +'</option>');// 下拉菜单里添加元素
  152. });
  153. form.render('select');
  154. } else {
  155. layer.msg('获取分类列表失败', {icon: 2});
  156. }
  157. }, 'GET');
  158. form.render('select');
  159. // 渲染表格
  160. var insTb = table.render({
  161. elem: '#dataTable',
  162. url: setter.baseServer + 'store/article',
  163. page: true,
  164. // toolbar: true,
  165. toolbar: '#toolBarTpl',
  166. cellMinWidth: 100,
  167. cols: [[
  168. {type: 'checkbox'},
  169. {field: 'title', title: '标题', width: 200},
  170. {field: 'category', title: '分类',templet: function (d) {
  171. return '<span class="layui-badge layui-badge-gray">' + d.category.name +'</span>' || '未分类';
  172. }},
  173. {field: 'summary', title: '摘要', width: 200},
  174. {
  175. field: 'created_at', sort: true, templet: function (d) {
  176. return util.toDateString(d.created_at * 1e3);
  177. }, title: '创建时间', width: 180
  178. },
  179. {field: 'status', templet: '#tableStateUser', title: '状态', width: 120},
  180. {fixed:'right', align: 'center', toolbar: '#tableBarUser', title: '操作', minWidth: 200}
  181. ]],
  182. done:function () {
  183. admin.renderPerm()
  184. }
  185. });
  186. // 分类
  187. $(document).on('click','.article-category', function () {
  188. showArticleCateTbModel();
  189. });
  190. // 添加
  191. $(document).on('click','.article-add-btn', function () {
  192. showEditModel();
  193. });
  194. // 搜索
  195. form.on('submit(formSubSearchUser)', function (data) {
  196. insTb.reload({where: data.field}, 'data');
  197. });
  198. // 工具条点击事件
  199. table.on('tool(dataTable)', function (obj) {
  200. var data = obj.data;
  201. var layEvent = obj.event;
  202. if (layEvent === 'edit') { // 修改
  203. showEditModel(data);
  204. } else if (layEvent === 'del') { // 删除
  205. layer.confirm('确定要删除“' + data.title + '”吗?', {
  206. skin: 'layui-layer-admin',
  207. shade: .1
  208. }, function (i) {
  209. layer.close(i);
  210. layer.load(2);
  211. admin.req('store/article/' + data.id, function (r) {
  212. layer.closeAll('loading');
  213. if (r.code === 10000) {
  214. notice.msg(r.message, {icon: 1});
  215. insTb.reload({}, 'data');
  216. } else {
  217. notice.msg(r.message, {icon: 2});
  218. }
  219. }, 'DELETE');
  220. });
  221. } else if (layEvent === 'restore') { // 恢复
  222. layer.confirm('确定要恢复“' + data.title + '”吗?', {
  223. skin: 'layui-layer-admin',
  224. shade: .1
  225. }, function (i) {
  226. layer.close(i);
  227. layer.load(2);
  228. admin.req('store/article/' + data.id + '/restore',function (r) {
  229. layer.closeAll('loading');
  230. if (r.code === 10000) {
  231. notice.msg(r.message, {icon: 1});
  232. insTb.reload({}, 'data');
  233. } else {
  234. notice.msg(r.message, {icon: 2});
  235. }
  236. }, 'POST');
  237. });
  238. }
  239. });
  240. // 显示表单弹窗
  241. var articleEdt;
  242. function showEditModel(data) {
  243. admin.open({
  244. id:"LAY_modelArticle",
  245. type: 1,
  246. area: '720px', //宽高
  247. title: (data ? '修改' : '添加') + '文章',
  248. content: $('#modelArticle').html(),
  249. success: function (layero, dIndex) {
  250. // 渲染富文本编辑器
  251. var articleEdt = CKEDITOR.replace('articleCkEditor', {height: 420,
  252. language: 'zh-cn', //简体中文
  253. toolbar : [
  254. //加粗 斜体, 下划线 穿过线 下标字 上标字
  255. ['Bold','Italic','Underline','Strike','Subscript','Superscript'],
  256. // 数字列表 实体列表 减小缩进 增大缩进
  257. ['NumberedList','BulletedList','-','Outdent','Indent'],
  258. //左对 齐 居中对齐 右对齐 两端对齐
  259. ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
  260. //超链接 取消超链接 锚点
  261. ['Link','Unlink','Anchor'],
  262. //图片 flash 表格 水平线 表情 特殊字符 分页符
  263. ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
  264. '/',
  265. // 样式 格式 字体 字体大小
  266. ['Styles','Format','Font','FontSize'],
  267. //文本颜色 背景颜色
  268. ['TextColor','BGColor'],
  269. //全屏 显示区块
  270. ['Maximize', 'ShowBlocks','-']
  271. ]
  272. });
  273. articleEdt.on('fileUploadRequest', function (evt) {
  274. let xhr = evt.data.fileLoader.xhr;
  275. xhr.setRequestHeader('Authorization', setter.getToken());
  276. });
  277. CKEDITOR.instances.pageCkEditor;
  278. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  279. $.each(category, function (index, item) {
  280. let ichecked = "";
  281. if (data) ichecked = data.category_id === item.id ? "selected": "";
  282. $('#categorySel').append('<option value="'+ item.id +'" ' + ichecked + '>'+ item.name +'</option>');// 下拉菜单里添加元素
  283. });
  284. // 回显数据
  285. form.val('modelArticleForm', data);
  286. form.render('radio');
  287. form.render('select');
  288. // 表单提交事件
  289. form.on('submit(modelSubmitArticle)', function (form) {
  290. // 追加数据
  291. var content = articleEdt.getData();
  292. if (content === '') {
  293. notice.msg("文章内容不能为空", {icon: 2});
  294. return false;
  295. }
  296. form.field.content = articleEdt.getData();
  297. layer.load(2);
  298. admin.req('store/article' + (data ? '/' + form.field.id : ''), form.field, function (res) {
  299. layer.closeAll('loading');
  300. if (res.code === 10000) {
  301. layer.close(dIndex);
  302. notice.msg(res.message, {icon: 1});
  303. insTb.reload({}, 'data');
  304. } else {
  305. notice.msg(res.message, {icon: 2});
  306. }
  307. }, data ? 'PUT' : 'POST');
  308. return false;
  309. });
  310. return false;
  311. }
  312. });
  313. }
  314. var articleCateTb;
  315. // 展示商品分类
  316. function showArticleCateTbModel () {
  317. admin.open({
  318. id: 'LAY_ArticleCate',
  319. type: 1,
  320. area: '720px', //宽高
  321. title: '文章分类',
  322. content: $('#modelArticleCate').html(),
  323. success: function (layero, dIndex) {
  324. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  325. // 渲染表格
  326. articleCateTb = table.render({
  327. elem: '#ArticleCateTb',
  328. url: setter.baseServer + 'store/article/category',
  329. page: true,
  330. height: 500,
  331. defaultToolbar: false,
  332. toolbar: "#ArticleCateToolbar",
  333. cols: [[
  334. {type: 'numbers'},
  335. {field: 'name', title: '分类名称', width: 150},
  336. {
  337. field: 'created_at', sort: true, templet: function (d) {
  338. return util.toDateString(d.created_at * 1e3);
  339. }, title: '创建时间', width: 180
  340. },
  341. {fixed: "right",align: 'center', toolbar: '#ArticleCateTabbar', title: '操作', minWidth: 200}
  342. ]]
  343. });
  344. // 工具条点击事件
  345. table.on('tool(ArticleCateTb)', function (obj) {
  346. var data = obj.data;
  347. var layEvent = obj.event;
  348. if (layEvent === 'edit') { // 修改
  349. showArticleCateEditModel(data);
  350. }else if (layEvent === 'del') { // 删除
  351. layer.confirm('确定要删除“' + data.name + '”吗?', {
  352. skin: 'layui-layer-admin',
  353. shade: .1
  354. }, function (i) {
  355. layer.close(i);
  356. layer.load(2);
  357. admin.req('store/article/category/delete/' + data.id, function (r) {
  358. layer.closeAll('loading');
  359. if (r.code === 10000) {
  360. notice.msg(r.message, {icon: 1});
  361. articleCateTb.reload({}, 'data');
  362. } else {
  363. notice.msg(r.message, {icon: 2});
  364. }
  365. }, 'DELETE');
  366. });
  367. }
  368. });
  369. }
  370. })
  371. }
  372. // 刷新
  373. $(document).on('click','.article-cate-refresh-btn', function () {
  374. articleCateTb.reload({}, 'data');
  375. });
  376. // 添加
  377. $(document).on('click','.article-cate-add-btn', function () {
  378. showArticleCateEditModel();
  379. });
  380. // 显示表单弹窗
  381. function showArticleCateEditModel(data) {
  382. admin.open({
  383. id: 'LAY_ArticleCateEdit',
  384. type: 1,
  385. area: ['420px'], //宽高
  386. title: (data ? '修改' : '添加') + '文章分类',
  387. content: $('#modelArticleCateEdit').html(),
  388. success: function (layero, dIndex) {
  389. $(layero).children('.layui-layer-content').css('overflow', 'visible');
  390. // 回显数据
  391. form.val('modelArticleCateEditForm',data);
  392. form.render('radio');
  393. form.render('select');
  394. // 表单提交事件
  395. form.on('submit(modelSubmitArticleCateEdit)', function (form) {
  396. layer.load(2);
  397. admin.req('store/article/category' + (data ? '/update/' + form.field.id : '/create'), form.field, function (res) {
  398. layer.closeAll('loading');
  399. if (res.code === 10000) {
  400. layer.close(dIndex);
  401. notice.msg(res.message, {icon: 1});
  402. articleCateTb.reload({}, 'data');
  403. } else {
  404. notice.msg(res.message, {icon: 2});
  405. }
  406. }, data ? 'PUT' : 'POST');
  407. return false;
  408. });
  409. }
  410. });
  411. }
  412. });
  413. </script>