index.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. {extend name="public/layout" /} {block name="title"}文章列表{/block} {block name="body"}
  2. <style type="text/css">
  3. html,
  4. body {
  5. display: block;
  6. min-width: 1100px;
  7. height: 100%;
  8. overflow: hidden;
  9. }
  10. .layui-table thead tr,
  11. .layui-table-header {
  12. background-color: #D8E6F1 !important;
  13. }
  14. .layui-table-sort {
  15. display: inline-block !important;
  16. }
  17. .layui-fluid {
  18. display: block;
  19. box-shadow: 0 0 4px 0 #B6CADE;
  20. border-radius: 5px;
  21. margin: 15px;
  22. background-color: #ffffff;
  23. height:92% !important;
  24. }
  25. .layui-form-label{
  26. width: auto;
  27. }
  28. .layui-btn-primary {
  29. color: #249EFB;
  30. border: 1px solid #249EFB;
  31. }
  32. .layui-btn-primary:hover {
  33. background-color: #E3F7FF;
  34. color: #249EFB;
  35. }
  36. .layui-table-page>div {
  37. display: flex;
  38. justify-content: flex-start;
  39. }
  40. .layui-btn-xs,.layui-btn-xs:hover {
  41. border: 1px solid #249EFB;
  42. background-color: #fff;
  43. color: #249EFB;
  44. padding: 0px 10px;
  45. }
  46. .layui-btn-danger,.layui-btn-danger:hover{
  47. color: #FF5722;
  48. background-color: #fff;
  49. border: 1px solid #FF5722;
  50. padding: 0px 10px;
  51. }
  52. .layui-inline {
  53. display: flex;
  54. align-items: center;
  55. }
  56. .flexBox {
  57. display: flex;
  58. align-items: center;
  59. justify-content: space-between;
  60. }
  61. .flex-sub {
  62. flex:1;
  63. display: flex;
  64. align-items: center;
  65. justify-content: flex-end;
  66. }
  67. .layui-input-inline {
  68. flex:1;
  69. }
  70. .layui-form-item .layui-input-inline {
  71. width: auto !important;
  72. max-width: 200px;
  73. }
  74. /* 手机端预览效果样式 */
  75. .page_article_mask {
  76. width: 100%;
  77. height: 100%;
  78. position: fixed;
  79. top: 0px;
  80. left: 0px;
  81. background-color: rgba(0,0,0,0.5);
  82. z-index: 9999;
  83. display: flex;
  84. justify-content: center;
  85. align-items: center;
  86. }
  87. .page_article_phone {
  88. width: 410px;
  89. height: 95vh;
  90. max-height: 820px !important;
  91. background: url('__STATIC__/img/phoneModel.png');
  92. background-size: 100% 100%;
  93. display: flex;
  94. justify-content: center;
  95. align-items: center;
  96. }
  97. .page_article_box {
  98. width: 375px;
  99. height: 96%;
  100. position: relative;
  101. overflow-y: auto;
  102. overflow-x: hidden;
  103. padding: 16px 5px 75px;
  104. box-sizing: border-box;
  105. background-color: #fff;
  106. border-radius: 30px;
  107. margin-right: 4px;
  108. }
  109. /* 设置滚动条的样式 */
  110. .page_article_box::-webkit-scrollbar {
  111. width:2px;
  112. }
  113. /* 滚动槽 */
  114. .page_article_box::-webkit-scrollbar-track {
  115. -webkit-box-shadow:inset006pxrgba(0,0,0,0.3);
  116. border-radius:10px;
  117. }
  118. /* 滚动条滑块 */
  119. .page_article_box::-webkit-scrollbar-thumb {
  120. background:rgba(0,0,0,0.3);
  121. -webkit-box-shadow:inset006pxrgba(0,0,0,0.5);
  122. }
  123. .page_article_title {
  124. font-size: 20px;
  125. color: #222;
  126. font-weight: 700;
  127. text-align: center;
  128. margin: 0px 0px 14px;
  129. }
  130. .page_article_type {
  131. width: 100%;
  132. text-align: left;
  133. font-size: 13px;
  134. color: #384855;
  135. margin-top: 6px;
  136. margin-bottom: 20px;
  137. }
  138. .page_article_richText {
  139. width: 100%;
  140. height: auto;
  141. padding-top: 5px;
  142. }
  143. .page_article_richText img {
  144. width: 100% !important;
  145. margin: 0px !important;
  146. padding: 0px !important;
  147. }
  148. .page_article_richText video {
  149. width: 100% !important;
  150. }
  151. .lay-close {
  152. position: absolute;
  153. top: 30px;
  154. right: 25%;
  155. color: #fff;
  156. font-size: 38px !important;
  157. font-weight: 700;
  158. cursor: pointer;
  159. }
  160. .layui-tab-title .layui-this:after {
  161. width: 50px;
  162. height: 4px !important;
  163. background-color: #249EFB;
  164. top: 38px !important;
  165. left: 50%;
  166. transform: translateX(-50%);
  167. border: none;
  168. border:1px solid #249EFB !important;
  169. }
  170. .layui-card{box-shadow: none !important;}
  171. </style>
  172. <body>
  173. <div class="layui-fluid">
  174. <div class="layui-card">
  175. <div class="layui-tab layui-tab-brief height100_">
  176. <ul class="layui-tab-title rst_box_top">
  177. <li data-index="1" class="font16 layui_video_list layui-this"><a href="{:url('article/index')}">图文列表</a></li>
  178. <li data-index="2" class="font16 layui_video_tjss"><a href="{:url('article/statistics_data_list')}">数据统计</a></li>
  179. </ul>
  180. <div class="layui-tab-content pd0 mdt20" style="padding: 0;">
  181. <div class="layui-tab-item layui-show">
  182. <div class="layui-form layui-card-header layuiadmin-card-header-auto">
  183. <div class="layui-form-item flexBox">
  184. {auth:check name="article/add"}
  185. <div class="layui-inline">
  186. <button class="layui-btn layuiadmin-btn-list layui-btn-primary" data-type="add">添加文章</button>
  187. <a type="button" class="layui-btn layui-btn-primary" id="cate_administration">分类管理</a>
  188. <a type="button" class="layui-btn layui-btn-primary" id="cate_administration_labels">标签管理</a>
  189. </div>
  190. {/auth:check}
  191. <div class="flex-sub">
  192. <div class="layui-inline" style="margin-right: 0px;">
  193. <label class="layui-form-label">标题</label>
  194. <div class="layui-input-inline">
  195. <input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input">
  196. </div>
  197. </div>
  198. <div class="layui-inline" style="margin-right: 0px;">
  199. <label class="layui-form-label">分类</label>
  200. <div class="layui-input-inline">
  201. <select name="type" lay-filter="type" id="type" lay-search>
  202. <option value="">请选择分类</option>
  203. {volist name="type" id="t"}
  204. <option value="{$t.id}">{$t.name}</option>
  205. {/volist}
  206. </select>
  207. </div>
  208. </div>
  209. <div class="layui-inline" style="margin-right: 0px;">
  210. <label class="layui-form-label">标签</label>
  211. <div class="layui-input-inline">
  212. <select name="label" id="label" lay-search>
  213. <option value="">请选择标签</option>
  214. </select>
  215. </div>
  216. </div>
  217. <div class="layui-inline" style="margin-right: 0px;">
  218. <label class="layui-form-label">上传人</label>
  219. <div class="layui-input-inline">
  220. <select name="employee_id" id="employee" lay-search>
  221. <option value="">请选择人员</option>
  222. {volist name="employee" id="e"}
  223. <option value="{$e.id}">{$e.name}</option>
  224. {/volist}
  225. </select>
  226. </div>
  227. </div>
  228. <div class="layui-inline">
  229. <label class="layui-form-label">上传时间</label>
  230. <div class="layui-input-inline select-date">
  231. <input type="text" name="add_time" id="select_date" placeholder="开始时间 - 结束时间" autocomplete="off" class="layui-input">
  232. </div>
  233. </div>
  234. <div class="layui-inline" style="margin-right: 0;">
  235. <button class="layui-btn layuiadmin-btn-list submitbtn" lay-submit lay-filter="LAY-app-contlist-search">
  236. <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
  237. </button>
  238. </div>
  239. </div>
  240. </div>
  241. </div>
  242. <div class="layui-card-body" style="text-align: center;">
  243. <table id="layui-table-article" lay-filter="layui-table-article"></table>
  244. <script type="text/html" id="layui-tagsbar">
  245. {auth:check name="article/add"}
  246. <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">编辑</a>
  247. {/auth:check}
  248. {auth:check name="data/cluedata"}
  249. <a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="evidence-clue-list">线索记录</a>
  250. {/auth:check}
  251. {auth:check name="article/del"}
  252. <a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
  253. {/auth:check}
  254. {auth:check name="dailyTasks/assign_org"}
  255. <a class="layui-btn layui-btn-xs" lay-event="daily-tasks">设置任务</a>
  256. {/auth:check}
  257. <a class="layui-btn layui-btn-xs" lay-event="preview">预览</a>
  258. </script>
  259. <script type="text/html" id="show">
  260. <input type="checkbox" name="show" value="{{d.id}}" lay-skin="switch" lay-text="上架|下架" lay-filter="show" {{ d.publish == 1 ? 'checked' : '' }}>
  261. </script>
  262. <script type="text/html" id="cover_img">
  263. {{# if(d.cover_img){ }}
  264. <img src="{{d.cover_img}}?x-oss-process=image/resize,w_50" style="width: 30px;height: 30px;"/>
  265. {{# }else{ }}
  266. <span style="color: #cccccc;">无</span>
  267. {{# } }}
  268. </script>
  269. </div>
  270. </div>
  271. <div class="layui-tab-item">
  272. <iframe class="data_lists layadmin-iframe" src="" style="width: 100%;height:100%;" scrolling="0" frameborder="0"></iframe>
  273. </div>
  274. </div>
  275. </div>
  276. </div>
  277. </div>
  278. <!-- 预览手机端效果 -->
  279. <div class="page_article_mask layui-hide">
  280. <div class="page_article_phone">
  281. </div>
  282. <i class="layui-icon layui-icon-close lay-close"></i>
  283. </div>
  284. {/block} {block name="js"}
  285. <script type="text/html" id="titletpl">
  286. {{# if(d.title){ }}
  287. <span>{{d.title}}</span>
  288. {{# }else{ }}
  289. <span style="color: #cccccc;">无</span>
  290. {{# } }}
  291. </script>
  292. <script type="text/html" id="contenttpl">
  293. {{# if(d.content){ }}
  294. <span>{{d.content}}</span>
  295. {{# }else{ }}
  296. <span style="color: #cccccc;">无</span>
  297. {{# } }}
  298. </script>
  299. <script type="text/html" id="typetpl">
  300. {{# if(d.type){ }}
  301. <span>{{d.type}}</span>
  302. {{# }else{ }}
  303. <span style="color: #cccccc;">无</span>
  304. {{# } }}
  305. </script>
  306. <script type="text/html" id="labeltpl">
  307. {{# if(d.label){ }}
  308. <span>{{d.label}}</span>
  309. {{# }else{ }}
  310. <span style="color: #cccccc;">无</span>
  311. {{# } }}
  312. </script>
  313. <script type="text/html" id="employee_name">
  314. {{# if(d.employee_name){ }}
  315. <span>{{d.employee_name}}</span>
  316. {{# }else{ }}
  317. <span style="color: #cccccc;">无</span>
  318. {{# } }}
  319. </script>
  320. <script>
  321. layui.config({
  322. base: '__LAYUI__/',
  323. urlbase: '/sys'
  324. }).extend({
  325. index: 'lib/index' //主入口模块
  326. }).use(['index', 'table', 'form','laydate'], function () {
  327. var $ = layui.$,
  328. table = layui.table,
  329. form = layui.form,
  330. laydate = layui.laydate,
  331. scrollTopNum = 0;
  332. //日期范围
  333. laydate.render({
  334. elem: '#select_date'
  335. , type: 'date'
  336. , range: true
  337. , trigger: 'click'//呼出事件改成click
  338. });
  339. document.onkeydown=function(event){
  340. var e = event || window.event || arguments.callee.caller.arguments[0];
  341. if(e && e.keyCode==13){
  342. $(".submitbtn").trigger("click");
  343. }
  344. };
  345. $('.layui_video_tjss').on('click',function(){
  346. $('.layui-fluid').css({'height':'100%'})
  347. // $('.data_lists').attr('src',"{:url('article/statistics_data_list')}");
  348. })
  349. $('.layui_video_list').on('click',function(){
  350. $('.layui-fluid').css({'height':'auto'})
  351. })
  352. //监听搜索
  353. form.on('submit(LAY-app-contlist-search)', function (data) {
  354. var field = data.field;
  355. //执行重载
  356. table.reload('layui-table-article', {
  357. where: field
  358. ,page: {
  359. curr: 1
  360. }
  361. });
  362. });
  363. //分类管理
  364. $("#cate_administration").click(function(){
  365. layer.open({
  366. type: 2,
  367. title: ['分类管理', 'color:#333333;background-color:#D8E6F1;'],
  368. content : '{:url("article/cate_article")}',
  369. resize: false,
  370. area: ['80%', '80%'],
  371. end: function () {
  372. location.reload();
  373. }
  374. });
  375. })
  376. //标签管理
  377. $("#cate_administration_labels").click(function(){
  378. layer.open({
  379. type: 2,
  380. title: ['标签管理', 'color:#333333;background-color:#D8E6F1;'],
  381. content : '{:url("article/cate_article_labels")}',
  382. resize: false,
  383. area: ['80%', '80%'],
  384. end: function () {
  385. location.reload();
  386. }
  387. });
  388. })
  389. //下拉框关联
  390. var typeData = JSON.parse('{$label|raw}');
  391. form.on('select(type)', function (data) {
  392. var typeJson = typeData[data.value];
  393. var typeLabel = $('#label');
  394. typeLabel.empty().append('<option value="">请选择标签</option>');
  395. for (r in typeJson) {
  396. typeLabel.append('<option value=' + r + '>' + typeJson[r] + '</option>');
  397. }
  398. form.render();
  399. });
  400. var $ = layui.$,
  401. active = {
  402. add: function () {
  403. layer.open({
  404. type: 2,
  405. title: ['添加文章', 'color:#333333;background-color:#D8E6F1;'],
  406. content: '{:url("article/add")}',
  407. resize: false,
  408. area: ['80%', '80%'],
  409. // btn: ['确定', '取消'],
  410. yes: function (index, layero) {
  411. //点击确认触发 iframe 内容中的按钮提交
  412. var submit = layero.find('iframe').contents().find("#layuiadmin-app-form-submit");
  413. submit.click();
  414. }
  415. });
  416. }
  417. };
  418. $('.layui-btn.layuiadmin-btn-list').on('click', function () {
  419. var type = $(this).data('type');
  420. active[type] ? active[type].call(this) : '';
  421. });
  422. table.render({
  423. elem: '#layui-table-article',
  424. url: '{:url("article/list")}',
  425. page: true,
  426. limit: 20,
  427. height: 'full-220',
  428. cols: [
  429. [{
  430. align:'center',
  431. type: 'numbers',
  432. field: 'id',
  433. fixed: 'left',
  434. title: '序号',
  435. }, {
  436. align:'center',
  437. templet: '#cover_img',
  438. width:100,
  439. title: '封面图片',
  440. }, {
  441. align:'center',
  442. field: 'title',
  443. title: '标题',
  444. minWidth: 150,
  445. templet: '#titletpl',
  446. }, {
  447. align:'center',
  448. field: 'type',
  449. title: '分类',
  450. maxWidth: 100,
  451. templet: '#typetpl',
  452. }, {
  453. align:'center',
  454. field: 'label',
  455. title: '标签',
  456. maxWidth: 100,
  457. templet: '#labeltpl',
  458. }, {
  459. align:'center',
  460. field: 'view_times',
  461. title: '浏览次数',
  462. sort: true,
  463. minWidth: 110
  464. }, {
  465. align: 'center',
  466. title: '转发次数',
  467. sort: true,
  468. field: 'shared_times',
  469. minWidth: 110
  470. }, {
  471. align: 'center',
  472. title: '浏览时长',
  473. sort: true,
  474. field: 'visit_due_time',
  475. minWidth: 110
  476. }, {
  477. align:'center',
  478. title: '展示',
  479. minWidth: 100,
  480. templet:'#show'
  481. }, {
  482. align:'center',
  483. field: 'uploadtime',
  484. title: '上传时间',
  485. sort: true,
  486. minWidth: 110
  487. }, {
  488. align:'center',
  489. templet: '#employee_name',
  490. title: '上传人',
  491. sort: true,
  492. minWidth: 110
  493. }, {
  494. title: '操作',
  495. width: 380,
  496. align: 'center',
  497. fixed: 'right',
  498. toolbar: '#layui-tagsbar'
  499. }]
  500. ],
  501. text: '对不起,加载出现异常!'
  502. });
  503. table.on('sort(layui-table-article)', function (obj) {
  504. table.reload('layui-table-article', {
  505. initSort: obj
  506. , where: {
  507. order: obj.field + ' ' + obj.type
  508. }
  509. });
  510. });
  511. //监听工具条
  512. table.on('tool(layui-table-article)', function (obj) {
  513. var data = obj.data;
  514. if (obj.event === 'del') {
  515. layer.confirm('确定删除此文章?',{title: ['信息', 'color:#333333;background-color:#D8E6F1;'],}, function (index) {
  516. $.ajax({
  517. url: "{:url('article/del')}",
  518. data: {
  519. id: data.id
  520. },
  521. type: 'post'
  522. });
  523. obj.del();
  524. layer.close(index);
  525. });
  526. } else if (obj.event === 'edit') {
  527. layer.open({
  528. type: 2,
  529. title: ['编辑文章', 'color:#333333;background-color:#D8E6F1;'],
  530. content: '{:url("article/edit")}?id=' + data.id,
  531. resize: false,
  532. area: ['80%', '80%'],
  533. btn: ['确定', '取消'],
  534. yes: function (index, layero) {
  535. var submit = layero.find('iframe').contents().find(
  536. "#layuiadmin-app-form-submit");
  537. submit.click();
  538. },
  539. end: function() {
  540. scrollPostion(scrollTopNum);
  541. setTimeout(() => {
  542. $('.layui-table-main').scroll(function (e) {
  543. scrollTopNum = $(this).scrollTop();
  544. console.log(scrollTopNum, '<<<记录位置');
  545. })
  546. }, 800);
  547. }
  548. });
  549. }else if (obj.event === 'evidence-clue-list') {
  550. layer.open({
  551. type : 2,
  552. title: ['素材线索数据', 'color:#333333;background-color:#D8E6F1;'],
  553. content: "{:url('data/cluedata')}?type=article&id=" + data.id,
  554. resize: false,
  555. area : ['80%', '80%']
  556. });
  557. } else if (obj.event === 'daily-tasks') {
  558. layer.open({
  559. type: 2,
  560. title: ['设置任务', 'color:#333333;background-color:#D8E6F1;'],
  561. content: "{:url('dailyTasks/assign_org')}?type=article&id=" + data.id,
  562. resize: false,
  563. area: ['80%', '80%']
  564. });
  565. } else if (obj.event === 'preview') {
  566. requestArticleDetail(data.id);
  567. }
  568. });
  569. setTimeout(() => {
  570. $('.layui-table-main').scroll(function (e) {
  571. scrollTopNum = $(this).scrollTop();
  572. console.log(scrollTopNum, '<<<记录位置');
  573. })
  574. }, 800)
  575. function scrollPostion(num) {
  576. $('.layui-table-main').scrollTop(num)
  577. }
  578. $('.lay-close').click(function(){
  579. $('.page_article_mask').addClass('layui-hide');
  580. })
  581. function requestArticleDetail(id) {
  582. $.ajax({
  583. type: 'post',
  584. url: '{:url("article/preview_read")}',
  585. data: {
  586. id: id
  587. },
  588. success: function (res) {
  589. if (res.code == 0) {
  590. $('.page_article_mask').removeClass('layui-hide');
  591. setArticleDetailHtml(res.data)
  592. }
  593. }
  594. })
  595. }
  596. function setArticleDetailHtml(data) {
  597. let htmls = `<div class="page_article_box">
  598. <div class="page_article_title">
  599. ${data.title}
  600. </div>
  601. <div class="page_article_richText">${data.content}</div>
  602. </div>`;
  603. $('.page_article_phone').html(htmls);
  604. }
  605. /**
  606. * ${data.type?`<div class="page_article_type">
  607. #${data.type}#
  608. </div>`:''}
  609. * */
  610. form.on('switch(show)', function (obj) {
  611. var id = obj.value;
  612. $.ajax({
  613. type: "post",
  614. url: '{:url("article/publish")}',
  615. data: {
  616. id: id
  617. },
  618. success: function (res) {
  619. layer.msg(res.msg, {time: 2000});
  620. }
  621. });
  622. });
  623. });
  624. </script>
  625. </body>
  626. {/block}