menu.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  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. <div class="box box-solid">
  13. <div class="box-header with-border">
  14. <h3 class="box-title">菜单</h3>
  15. <div class="box-tools">
  16. <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
  17. </button>
  18. </div>
  19. </div>
  20. <div class="box-body no-padding">
  21. <ul class="nav nav-pills nav-stacked">
  22. {include file="wechat/common/wechat_menu"}
  23. </ul>
  24. </div>
  25. </div>
  26. </div>
  27. <div class="col-md-9 r-col-md-9">
  28. <div class="layui-fluid">
  29. <div class="layui-card">
  30. <div class="col-md-4 l-col-md-4">
  31. <div class="wechat-preview inline-block">
  32. <div class="wechat-header">公众号</div>
  33. <div class="wechat-body"></div>
  34. <div class="wechat-menu-box">
  35. <ul class="wechat-footer notselect"></ul>
  36. </div>
  37. </div>
  38. </div>
  39. <div class="col-md-8 r-col-md-8">
  40. <section class="content clearfix" style="padding-top: 0;">
  41. <div class="layui-editor-box">
  42. <div style="margin-top: 0;" class="layui-tab layui-tab-brief layui-tab-bg layui-tab-content-box">
  43. <ul class="layui-tab-title">
  44. <li class="layui-this">基本信息</li>
  45. </ul>
  46. <form action="" class="layui-form layui-form-pane">
  47. <div class="layui-tab-content">
  48. <div class="layui-tab-item layui-show">
  49. <div class="menu-empty">
  50. <blockquote class="layui-elem-quote text-center menu-border">请在左侧创建菜单...</blockquote>
  51. </div>
  52. <div class="menu-fields-box">
  53. <div class="layui-form-item">
  54. <label class="layui-form-label">菜单名称</label>
  55. <div class="layui-input-block">
  56. <input type="text" name="title" lay-reqtext="请填写菜单名称" lay-verify="required" placeholder="请输入菜单名称" autocomplete="off" class="layui-input">
  57. </div>
  58. </div>
  59. <div class="layui-form-item">
  60. <label class="layui-form-label">菜单类型</label>
  61. <div class="layui-input-block">
  62. <input type="radio" name="type" title="匹配规则" value="click" lay-filter="type">
  63. <input type="radio" name="type" title="跳转网页" value="view" lay-filter="type">
  64. <input type="radio" name="type" title="打开小程序" value="miniprogram" lay-filter="type">
  65. <input type="radio" name="type" title="扫码推事件" value="scancode_push" lay-filter="type">
  66. <input type="radio" name="type" title="扫码推事件且弹出“消息接收中”提示框" value="scancode_waitmsg" lay-filter="type">
  67. <input type="radio" name="type" title="弹出系统拍照发图" value="pic_sysphoto" lay-filter="type">
  68. <input type="radio" name="type" title="弹出拍照或者相册发图" value="pic_photo_or_album" lay-filter="type">
  69. <input type="radio" name="type" title="弹出微信相册发图器" value="pic_weixin" lay-filter="type">
  70. <input type="radio" name="type" title="弹出地理位置选择器" value="location_select" lay-filter="type">
  71. </div>
  72. </div>
  73. <div class="layui-form-item data-type-box" data-type="keys">
  74. <label class="layui-form-label">匹配规则</label>
  75. <div class="layui-input-block">
  76. <select name="key" lay-filter="attr-select">
  77. {if !empty($keys)}
  78. {volist name="keys" id="item"}
  79. <option value="{$item.keys}">{$item.keys}</option>
  80. {/volist}
  81. {/if}
  82. </select>
  83. </div>
  84. </div>
  85. <div class="layui-form-item data-type-box" data-type="url">
  86. <label class="layui-form-label">跳转链接</label>
  87. <div class="layui-input-block">
  88. <textarea class="layui-textarea" name="jump"></textarea>
  89. </div>
  90. </div>
  91. <div class="layui-form-item data-type-box" data-type="mini">
  92. <label class="layui-form-label">链接</label>
  93. <div class="layui-input-block">
  94. <input type="text" name="url" placeholder="请输入小程序链接" autocomplete="off" class="layui-input">
  95. </div>
  96. </div>
  97. <div class="layui-form-item data-type-box" data-type="mini">
  98. <label class="layui-form-label">APPID</label>
  99. <div class="layui-input-block">
  100. <input type="text" name="appid" placeholder="请输入小程序APPID" autocomplete="off" class="layui-input">
  101. </div>
  102. </div>
  103. <div class="layui-form-item data-type-box" data-type="mini">
  104. <label class="layui-form-label">页面</label>
  105. <div class="layui-input-block">
  106. <input type="text" name="pagepath" placeholder="请输入小程序页面" autocomplete="off" class="layui-input">
  107. </div>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. <div class="layui-form-item">
  113. <div class="layui-input-block">
  114. <button class="layui-btn layui-bg-light-blue" lay-filter="layui-submit-filter" lay-submit="">立即提交</button>
  115. <button class="layui-btn layui-btn-primary" type="reset">重置</button>
  116. </div>
  117. </div>
  118. </form>
  119. </div>
  120. </div>
  121. </section>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. </section>
  128. <script id="menu-list-box" type="text/html">
  129. <ul class="wechat-footer notselect">
  130. {{# layui.each(d, function(index, item){ }}
  131. <li class="parent-menu" {{# if(d.length == 1){ }}style="width:50%"{{# } }}{{# if(d.length >= 2){ }}style="width:33.333%"{{# } }}>
  132. <a data-index="{{ index }}">
  133. <i class="icon-sub" ></i>
  134. <span>{{ item.name }}</span>
  135. </a>
  136. <i class="close layui-bg-gray layui-icon" data-index="{{ index }}">ဆ</i>
  137. <div class="sub-menu text-center" >
  138. <ul>
  139. {{# layui.each(item.sub_button, function(j, value){ }}
  140. <li>
  141. <a class="bottom-border" data-index="{{ index }}-{{ j }}">
  142. <span>{{ value.name }}</span>
  143. </a>
  144. <i class="close layui-bg-gray layui-icon" data-index="{{ index }}-{{ j }}">ဆ</i>
  145. </li>
  146. {{# }); }}
  147. {{# if(item.sub_button == undefined || item.sub_button.length <= 4){ }}
  148. <li class="menu-add" data-index="{{ index }}">
  149. <a><i class="icon-add"></i></a>
  150. </li>
  151. {{# } }}
  152. </ul>
  153. <i class="arrow arrow_out"></i>
  154. <i class="arrow arrow_in"></i>
  155. </div>
  156. </li>
  157. {{# }); }}
  158. {{# if(d.length <= 2){ }}
  159. <li class="parent-menu menu-add" {{# if(d.length == 0){ }}style="width:100%"{{# } }}{{# if(d.length == 1){ }}style="width:50%"{{# } }}{{# if(d.length == 2){ }}style="width:33.333%"{{# } }}>
  160. <a><i class="icon-add"></i></a>
  161. </li>
  162. {{# } }}
  163. </ul>
  164. </script>
  165. <script type="text/javascript">
  166. $(function (){
  167. layui.use(["form", "element","layer","laytpl"], function () {
  168. var form = layui.form;
  169. var layer = layui.layer;
  170. var laytpl = layui.laytpl;
  171. var data = JSON.parse('{$data|raw|default="[]"}');
  172. var activeIndex = 0;
  173. var activeChildrenIndex = 0;
  174. var checkChildren = false;
  175. $(".menu-empty").show();
  176. var renderHtml = function (){
  177. laytpl(document.getElementById("menu-list-box").innerHTML).render(data, function (html) {
  178. $(".wechat-menu-box").html(html);
  179. });
  180. };
  181. var sw = function (type){
  182. $('[data-type="keys"]').hide();
  183. $('[data-type="url"]').hide();
  184. $('[data-type="mini"]').hide();
  185. switch (type) {
  186. case "click":
  187. $('[data-type="keys"]').show();
  188. break;
  189. case "view":
  190. $('[data-type="url"]').show();
  191. break;
  192. case "miniprogram":
  193. $('[data-type="mini"]').show();
  194. break;
  195. }
  196. };
  197. renderHtml();
  198. $(document).on("click",".wechat-preview .wechat-footer li > .close",function (event){
  199. var pt = $(this).parent();
  200. var index = $(this).attr("data-index").split("-");
  201. if(index.length == 2){
  202. data[index[0]].sub_button.splice(index[1],1);
  203. }else{
  204. data.splice(index[0],1);
  205. }
  206. $(".menu-fields-box").hide();
  207. $(".menu-empty").show();
  208. //event.preventDefault();
  209. event.stopPropagation();
  210. renderHtml();
  211. });
  212. $(document).on("click",".wechat-footer a",function (event){
  213. if($(this).parent().is(".menu-add")){
  214. return true;
  215. }
  216. $(".menu-empty").hide();
  217. $(".menu-fields-box").show();
  218. $(".wechat-footer a").removeClass("active");
  219. $(this).addClass("active");
  220. var arr = $(this).attr("data-index").split("-");
  221. var array = [];
  222. activeIndex = arr[0];
  223. if(arr.length == 2){
  224. activeChildrenIndex = arr[1];
  225. array = data[activeIndex].sub_button[activeChildrenIndex];
  226. checkChildren = true;
  227. }else{
  228. array = data[activeIndex];
  229. checkChildren = false;
  230. }
  231. sw(array.type);
  232. $('[value="'+(array.type)+'"]').prop("checked",true);
  233. $('[name="title"]').val(array.name);
  234. switch (array.type) {
  235. case "click":
  236. $('[option="'+array.key+'"]').prop("selected",true);
  237. form.render();
  238. break;
  239. case "view":
  240. $('[name="jump"]').val(array.url);
  241. break;
  242. case "miniprogram":
  243. $('[name="url"]').val(array.url);
  244. $('[name="appid"]').val(array.appid);
  245. $('[name="pagepath"]').val(array.pagepath);
  246. break;
  247. }
  248. form.render();
  249. });
  250. $(document).find('[name="title"]').on("input",function (){
  251. if(checkChildren){
  252. data[activeIndex].sub_button[activeChildrenIndex].name = $(this).val();
  253. }else {
  254. data[activeIndex].name = $(this).val();
  255. }
  256. renderHtml();
  257. });
  258. form.on('radio(type)', function(result){
  259. if(checkChildren){
  260. data[activeIndex].sub_button[activeChildrenIndex].type = result.value;
  261. }else {
  262. data[activeIndex].type = result.value;
  263. }
  264. if(result.value == "click"){
  265. var value = $('[name="key"] option:first').val();
  266. if(checkChildren){
  267. data[activeIndex].sub_button[activeChildrenIndex].key = value;
  268. }else {
  269. data[activeIndex].key = value;
  270. }
  271. }
  272. sw(result.value);
  273. });
  274. form.on('select(attr-select)', function(result){
  275. if(checkChildren){
  276. data[activeIndex].sub_button[activeChildrenIndex].key = result.value;
  277. }else {
  278. data[activeIndex].key = result.value;
  279. }
  280. });
  281. $(document).on("input",'[name="jump"]',function(){
  282. if(checkChildren){
  283. data[activeIndex].sub_button[activeChildrenIndex].url = $(this).val();
  284. }else {
  285. data[activeIndex].url = $(this).val();
  286. }
  287. });
  288. $(document).on("input",'[name="url"]',function(){
  289. if(checkChildren){
  290. data[activeIndex].sub_button[activeChildrenIndex].url = $(this).val();
  291. }else {
  292. data[activeIndex].url = $(this).val();
  293. }
  294. });
  295. $(document).on("input",'[name="appid"]',function(){
  296. if(checkChildren){
  297. data[activeIndex].sub_button[activeChildrenIndex].appid = $(this).val();
  298. }else {
  299. data[activeIndex].appid = $(this).val();
  300. }
  301. });
  302. $(document).on("input",'[name="pagepath"]',function(){
  303. if(checkChildren){
  304. data[activeIndex].sub_button[activeChildrenIndex].pagepath = $(this).val();
  305. }else {
  306. data[activeIndex].pagepath = $(this).val();
  307. }
  308. });
  309. $(document).on("click",".menu-add",function (){
  310. if($(this).is(".parent-menu")){
  311. data.push({"name": "请输入名称","type":"click","key":""});
  312. }else{
  313. var index = $(this).attr("data-index");
  314. if(data[index].sub_button == undefined){
  315. delete data[index].type;
  316. delete data[index].key;
  317. data[index].sub_button = [];
  318. }
  319. data[index].sub_button.push({
  320. "name":"请输入名称","type":"click","key":""
  321. });
  322. }
  323. $(".menu-fields-box").hide();
  324. $(".menu-empty").show();
  325. renderHtml();
  326. });
  327. $(document).on("mouseover",".wechat-preview .wechat-footer li",function (){
  328. $(this).find(".close").show();
  329. });
  330. $(document).on("mouseout",".wechat-preview .wechat-footer li",function (){
  331. $(this).find(".close").hide();
  332. });
  333. form.on('submit(layui-submit-filter)', function (r) {
  334. var index = layer.load(1, { shade: [0.2,'#fff'] });
  335. $.post('{:createUrl("menu")}', { post: data }, function (result) {
  336. layer.close(index);
  337. if(result.code){
  338. layer.msg(result.msg, {
  339. time: 3000
  340. },function (){
  341. window.location.reload();
  342. });
  343. }else{
  344. layer.msg(result.msg,{ icon :2 });
  345. }
  346. }, "json");
  347. return false;
  348. });
  349. });
  350. });
  351. </script>
  352. <style type="text/css">
  353. </style>