editor.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. <div class="row content-nav inline-page-box">
  2. <div class="col-xs-12">
  3. <ul>
  4. <li><a href="javascript:;"><i></i>&nbsp;微信管理</a></li>
  5. <li><a href="javascript:;">公众号</a></li>
  6. </ul>
  7. </div>
  8. </div>
  9. <section class="content">
  10. <div class="row">
  11. <div class="col-md-3 l-col-md-3">
  12. <a href="{:createUrl('editor')}" class="btn btn-primary btn-block margin-bottom">添加图片</a>
  13. <div class="box box-solid">
  14. <div class="box-header with-border">
  15. <h3 class="box-title">菜单</h3>
  16. <div class="box-tools">
  17. <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
  18. </button>
  19. </div>
  20. </div>
  21. <div class="box-body no-padding">
  22. <ul class="nav nav-pills nav-stacked">
  23. {include file="wechat/common/wechat_menu"}
  24. </ul>
  25. </div>
  26. </div>
  27. </div>
  28. <div class="col-md-9 r-col-md-9">
  29. <div class="layui-fluid">
  30. <div class="layui-card">
  31. <div class="col-md-3">
  32. <div class="article-left">
  33. <div class="layui-card-body">
  34. <div class="ls-box">
  35. <div id="left-wrap"></div>
  36. </div>
  37. <a class="article-add"><i class="fa fa-plus"></i></a>
  38. </div>
  39. </div>
  40. </div>
  41. <div class="col-md-9">
  42. <div class="article-right">
  43. <section class="content clearfix" style="padding-top: 0;">
  44. <div class="layui-editor-box">
  45. <div style="margin-top: 0;" class="layui-tab layui-tab-brief layui-tab-bg layui-tab-content-box">
  46. <ul class="layui-tab-title">
  47. <li class="layui-this">基本信息</li>
  48. </ul>
  49. <form action="" class="layui-form layui-form-pane">
  50. <div class="layui-tab-content">
  51. <div class="layui-tab-item layui-show">
  52. <div class="layui-form-item">
  53. <label class="layui-form-label">文章标题</label>
  54. <div class="layui-input-block">
  55. <input type="text" name="title" value="" lay-reqtext="请填写文章标题" lay-verify="required" placeholder="请输入文章标题" autocomplete="off" class="layui-input">
  56. </div>
  57. </div>
  58. <div class="layui-form-item">
  59. <label class="layui-form-label">文章作者</label>
  60. <div class="layui-input-block">
  61. <input type="text" name="author" value="" lay-reqtext="请填写文章作者" lay-verify="required" placeholder="请输入文章作者" autocomplete="off" class="layui-input">
  62. </div>
  63. </div>
  64. <div class="layui-form-item clearfix">
  65. <div class="layui-upload clearfix">
  66. <button type="button" class="layui-btn layui-bg-light-blue" id="uploadfiy-btn"><i class="layui-icon"></i>上传图片</button>
  67. <blockquote class="layui-elem-quote layui-quote-nm clearfix" style="margin-top: 10px;">
  68. 预览图:
  69. <div class="layui-upload-list" id="uploadfiy-list-box">
  70. </div>
  71. </blockquote>
  72. </div>
  73. </div>
  74. <div class="layui-form-item">
  75. <script id="container" style="width:100%;height: 500px;" name="content" type="text/plain"></script>
  76. </div>
  77. <div class="layui-form-item data-type">
  78. <label class="layui-form-label">摘要</label>
  79. <div class="layui-input-block">
  80. <textarea class="layui-textarea" name="digest"></textarea>
  81. </div>
  82. </div>
  83. <div class="layui-form-item">
  84. <label class="layui-form-label">原文链接</label>
  85. <div class="layui-input-block">
  86. <input type="text" name="content_source_url" value="" placeholder="请输入原文链接" autocomplete="off" class="layui-input">
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. <div class="layui-form-item">
  92. <div class="layui-input-block">
  93. <button class="layui-btn layui-bg-light-blue" lay-filter="layui-submit-filter" lay-submit="">立即提交</button>
  94. <button class="layui-btn layui-btn-primary" type="reset">重置</button>
  95. </div>
  96. </div>
  97. </form>
  98. </div>
  99. </div>
  100. </section>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. </div>
  107. </section>
  108. <script id="left" type="text/html">
  109. {{# layui.each(d, function(index, item){ }}
  110. <div class="article-item-wrap">
  111. <div class="article-item" style="background-image:url({{ item.local_url }})">
  112. <span class="article-item-top">
  113. <a class="layui-icon dd">&#x1006;</a>
  114. <!-- a class="layui-icon down">&#xe61a;</a -->
  115. <!-- a class="layui-icon up">&#xe619;</a -->
  116. </span>
  117. <span class="article-title">{{ item.title }}</span>
  118. </div>
  119. <hr>
  120. </div>
  121. {{# }); }}
  122. {{# if(d.length === 0){ }}
  123. <div class="article-item-wrap">
  124. <div class="article-item active" style="background-image:url(/static/images/default.jpg)">
  125. <span class="article-item-top">
  126. <a class="layui-icon dd">&#x1006;</a>
  127. <!-- a class="layui-icon down">&#xe61a;</a -->
  128. <!-- a class="layui-icon up">&#xe619;</a -->
  129. </span>
  130. <span class="article-title">新建图文</span>
  131. </div>
  132. <hr>
  133. </div>
  134. {{# } }}
  135. </script>
  136. <script id="images-list-box" type="text/html">
  137. {{# layui.each(d.images, function(index, item){ }}
  138. <div class="uploadfiy-box">
  139. <input type="hidden" name="attachment_id[]" value="{{ item.id }}">
  140. <a class="upload-image"><img src="{{ item.path }}"></a>
  141. <div class="uploadfiy-button">
  142. <a href="javascript:;" class="n6-insert">插入</a>
  143. {{# if(d.local_url.length > 0 && d.local_url == item.path){ }}
  144. <a href="javascript:;" class="n6-thumb active">封面</a>
  145. {{# } else { }}
  146. <a href="javascript:;" class="n6-thumb">封面</a>
  147. {{# } }}
  148. <a href="javascript:;" class="n6-delete">删除</a>
  149. </div>
  150. </div>
  151. {{# }); }}
  152. </script>
  153. <script type="text/javascript" src="{__SYSTEM_PATH__}/js/ueditor/ueditor.config.js"></script>
  154. <script type="text/javascript" src="{__SYSTEM_PATH__}/js/ueditor/ueditor.all.min.js"></script>
  155. <script type="text/javascript">
  156. UE.getEditor('container').addListener("ready", function (){
  157. var ue = UE.getEditor('container');
  158. layui.use(["form", "element","layer","upload","laytpl"], function() {
  159. var form = layui.form;
  160. var layer = layui.layer;
  161. var upload = layui.upload;
  162. var laytpl = layui.laytpl;
  163. var data = JSON.parse('{$data.article|raw|default="[]"}');
  164. var pid = '{$data.id|default="0"}';
  165. var activeIndex = 0;
  166. var renderHtml = function (){
  167. laytpl(document.getElementById("left").innerHTML).render(data, function (html) {
  168. $("#left-wrap").html(html);
  169. $(document).find(".article-item").eq(activeIndex).addClass("active");
  170. $(document).find('[name="title"]').val(data[activeIndex].title);
  171. $(document).find('[name="author"]').val(data[activeIndex].author);
  172. $(document).find('.article-item').eq(activeIndex).css("background-image",data[activeIndex].photo);
  173. UE.getEditor('container').setContent(data[activeIndex].content,false);
  174. $(document).find('[name="digest"]').val(data[activeIndex].digest);
  175. $(document).find('[name="content_source_url"]').val(data[activeIndex].content_source_url);
  176. });
  177. };
  178. var renderImage = function (){
  179. var image = data[activeIndex];
  180. laytpl(document.getElementById("images-list-box").innerHTML).render(image, function (html) {
  181. $(".layui-upload-list").html(html);
  182. });
  183. };
  184. $(document).find('[name="title"]').on("input",function (){
  185. data[activeIndex].title = $(this).val();
  186. renderHtml();
  187. });
  188. $(document).find('[name="author"]').on("input",function (){
  189. data[activeIndex].author = $(this).val();
  190. renderHtml();
  191. });
  192. $(document).find('[name="content"]').on("input",function (){
  193. data[activeIndex].content = $(this).val();
  194. renderHtml();
  195. });
  196. UE.getEditor('container').addListener('blur',function(editor){
  197. data[activeIndex].content = UE.getEditor('container').getContent();
  198. renderHtml();
  199. });
  200. $(document).find('[name="digest"]').on("input",function (){
  201. data[activeIndex].digest = $(this).val();
  202. renderHtml();
  203. });
  204. $(document).find('[name="content_source_url"]').on("input",function (){
  205. data[activeIndex].content_source_url = $(this).val();
  206. renderHtml();
  207. });
  208. var i = 0;
  209. $(document).on("click",".article-add",function (){
  210. data.push({
  211. "id": "0",
  212. "title":"新建图文-"+(i+1),
  213. "show_cover_pic":1,
  214. "author": "管理员",
  215. "local_url": "/static/images/default.jpg",
  216. "images":[],
  217. "content": "请填写内容",
  218. "digest": "",
  219. "content_source_url": ""
  220. });
  221. i++;
  222. renderHtml();
  223. renderImage();
  224. });
  225. {if !empty($data)}
  226. renderHtml();
  227. {else}
  228. $(".article-add").trigger("click");
  229. {/if}
  230. $(document).on("click",".article-item",function () {
  231. var index = $(this).index(".article-item");
  232. activeIndex = index;
  233. renderHtml();
  234. renderImage();
  235. });
  236. $(document).on("click",".article-item-top",function (e){
  237. var index = $(this).index(".article-item-top");
  238. if($(e.target).is(".up")){
  239. if(index!=0){
  240. data[index] = data.splice(index-1, 1, data[index])[0];
  241. }else{
  242. data.push(data.shift());
  243. }
  244. }else if($(e.target).is(".down")){
  245. if(index!=data.length-1){
  246. data[index] = data.splice(index+1, 1, data[index])[0];
  247. }else{
  248. data.unshift(data.splice(index,1)[0]);
  249. }
  250. }else if($(e.target).is(".dd")){
  251. if($(".article-item-top").length <= 1){
  252. return false;
  253. }
  254. data.splice(index,1);
  255. }else{
  256. return false;
  257. }
  258. var arr = [];
  259. for(var i in data){
  260. if(data[i]){
  261. arr.push(data[i]);
  262. }
  263. }
  264. data = arr;
  265. activeIndex = 0;
  266. renderHtml();
  267. });
  268. //多图片上传
  269. upload.render({
  270. elem: '#uploadfiy-btn'
  271. ,url: '{:createUrl("common.uploadfiy/upload")}'
  272. ,multiple: true
  273. ,exts: 'jpg|png|gif|bmp|jpeg'
  274. ,data: {
  275. module: function (){
  276. return "wechat";
  277. },
  278. method: function (){
  279. return "article";
  280. }
  281. }
  282. ,done: function(res){
  283. if(!res.code){
  284. data[activeIndex].images.push({
  285. "id":res.data.id,
  286. "path":res.data.src
  287. });
  288. renderImage();
  289. }else{
  290. layer.msg(res.msg,{ icon : 2 });
  291. }
  292. }
  293. });
  294. $(document).on("click",".n6-insert",function (){
  295. var pt = $(this).parent().parent();
  296. UE.getEditor('container').setContent('<p><img src="'+pt.find("img").attr("src")+'"></p>', true);
  297. return false;
  298. });
  299. $(document).on("click",".n6-thumb",function (){
  300. if($(this).is(".active")){
  301. $(this).removeClass("active");
  302. return false;
  303. }
  304. $(".n6-thumb").removeClass("active");
  305. $(this).addClass("active");
  306. var pt = $(this).parent().parent();
  307. data[activeIndex].local_url = pt.find("img").attr("src");
  308. renderHtml();
  309. return false;
  310. });
  311. $(document).on("click",".n6-delete",function (){
  312. var index = $(this).index(".n6-delete");
  313. var pt = $(this).parent().parent();
  314. $.post('{:createUrl("common.uploadfiy/delete")}',{
  315. path : pt.find("img").attr("src")
  316. },function (result){
  317. if(result.code){
  318. data[activeIndex].images.splice(index,1);
  319. renderImage();
  320. pt.remove();
  321. }else{
  322. layer.msg(result.msg,{ icon : 2 });
  323. }
  324. },"json");
  325. return false;
  326. });
  327. form.on('submit(layui-submit-filter)', function (r) {
  328. var index = layer.load(1, { shade: [0.2,'#fff'] });
  329. $.post('{:createUrl("editor")}', { pid:pid,post:data }, function (result) {
  330. layer.close(index);
  331. if(result.code){
  332. layer.msg(result.msg, {
  333. time: 0
  334. ,btn: ['继续发布', '返回列表']
  335. ,yes: function(index){
  336. window.location.href = '{:createUrl("editor")}';
  337. }
  338. ,btn2: function (index, layero){
  339. window.location.href = '{:createUrl("index")}';
  340. }
  341. });
  342. }else{
  343. layer.msg(result.msg,{ icon :2 });
  344. }
  345. }, "json");
  346. return false;
  347. });
  348. });
  349. });
  350. </script>
  351. <style type="text/css">
  352. .article-left {
  353. width: 100%;
  354. background: #fff;
  355. }
  356. .article-right{
  357. overflow: hidden;
  358. width: 100%;
  359. position: relative;
  360. display: inline-block;
  361. background: #fff;
  362. }
  363. .article-left .article-item {
  364. height: 150px;
  365. cursor: pointer;
  366. max-width: 270px;
  367. overflow: hidden;
  368. position: relative;
  369. border: 1px solid #ccc;
  370. background-size: cover;
  371. background-position: center center;
  372. }
  373. .article-left .article-item.active {
  374. border: 1px solid #44b549 !important;
  375. }
  376. .article-left .article-item a {
  377. color: #fff;
  378. width: 30px;
  379. height: 30px;
  380. float: right;
  381. font-size: 12px;
  382. margin-top: -1px;
  383. line-height: 34px;
  384. text-align: center;
  385. margin-right: -1px;
  386. background-color: rgba(0, 0, 0, .5);
  387. }
  388. .article-left .article-title {
  389. bottom: 0;
  390. color: #fff;
  391. width: 272px;
  392. display: block;
  393. padding: 0 5px;
  394. max-height: 6em;
  395. overflow: hidden;
  396. margin-left: -1px;
  397. position: absolute;
  398. text-overflow: ellipsis;
  399. background: rgba(0, 0, 0, .7);
  400. }
  401. .article-item .article-item-top { display: none; }
  402. .article-item:hover .article-item-top {
  403. display: block;
  404. }
  405. .article-left .article-add {
  406. color: #999;
  407. display: block;
  408. font-size: 22px;
  409. text-align: center;
  410. cursor: pointer;
  411. }
  412. </style>