index.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. {extend name="admin@main"}
  2. {block name='content'}
  3. <div id="MenuEditor" class="layui-hide think-box-shadow" style="width:910px">
  4. <div class='mobile-preview inline-block'>
  5. <div class='mobile-header'>公众号</div>
  6. <div class='mobile-body'></div>
  7. <ul class='mobile-footer notselect'>
  8. <li class="parent-menu" style="{{getItemStyle(list)}}" ng-repeat="one in list">
  9. <a ng-click="setActiveItem(one)" ng-class="{true:'active'}[one.active]">
  10. <i class="icon-sub" ng-if="one.sub_button.length>0"></i> <span ng-bind="one.name"></span>
  11. </a>
  12. <i class="close layui-bg-gray layui-icon" ng-click="delItem(one)">&#x1006;</i>
  13. <div class="sub-menu text-center" ng-if="one.active||one.show">
  14. <ul>
  15. <li ng-repeat="two in one.sub_button">
  16. <a class="bottom-border" ng-click="setActiveItem(one,two)" ng-class="{true:'active'}[two.active]"><span ng-bind="two.name"></span></a>
  17. <i class="close layui-bg-gray layui-icon" ng-click="delItem(one,two)">&#x1006;</i>
  18. </li>
  19. <li class="menu-add" ng-if="one.sub_button.length<5"><a ng-click="addItem(one.sub_button)"><i class="icon-add"></i></a></li>
  20. </ul>
  21. <i class="arrow arrow_out"></i>
  22. <i class="arrow arrow_in"></i>
  23. </div>
  24. </li>
  25. <li class="parent-menu menu-add" style="{{getItemStyle(list)}}" ng-if="list.length<3">
  26. <a ng-click="addItem(list)"><i class="icon-add"></i></a>
  27. </li>
  28. </ul>
  29. </div>
  30. <div class="absolute inline-block layui-card margin-left-10" style="border:1px solid #ccc;height:578px;width:570px">
  31. <div class="layui-card-header layui-bg-gray text-center">菜单编辑</div>
  32. <div class="layui-card-body" ng-if="list.length<1">
  33. <blockquote class="layui-elem-quote border-0 text-center">请在左侧创建菜单...</blockquote>
  34. </div>
  35. <div class="layui-card-body" ng-if="list.length>0">
  36. <form class="layui-form menu-form" autocomplete="off" style="padding-right:80px;">
  37. <div class="layui-form-item margin-top-20">
  38. <label class="layui-form-label">菜单名称</label>
  39. <div class="layui-input-block">
  40. <input required name="menu-name" ng-model="item.name" class="layui-input" placeholder="请输入菜单名称">
  41. <span class="help-block">字数不超过13个汉字或40个字母</span>
  42. </div>
  43. </div>
  44. <div class="layui-form-item margin-top-20" ng-if="!item.sub_button||item.sub_button.length<1">
  45. <label class="layui-form-label label-required">菜单类型</label>
  46. <div class="layui-input-block">
  47. {foreach $menuTypes as $key => $type}
  48. <label class="think-radio layui-elip"><input lay-ignore type="radio" ng-model="item.type" name="menu-type" value="{$key}"> {$type}</label>
  49. {/foreach}
  50. </div>
  51. </div>
  52. <div class="layui-form-item margin-top-20" ng-if="item.type==='customservice'">
  53. <label class="layui-form-label">提示文字</label>
  54. <div class="layui-input-block">
  55. <textarea required class="layui-textarea" ng-model="item.content"></textarea>
  56. </div>
  57. </div>
  58. <div class="layui-form-item margin-top-20" ng-if="(!item.sub_button||item.sub_button.length<1)&&item.type==='click'">
  59. <label class="layui-form-label">匹配规则</label>
  60. <div class="layui-input-block">
  61. <select required class="layui-select" lay-filter="key" lay-search>
  62. <option value="{{x.keys}}" ng-selected="x.keys===item.key" ng-repeat="x in keys" ng-bind="x.keys"></option>
  63. </select>
  64. </div>
  65. </div>
  66. <div class="layui-form-item margin-top-20" ng-if="item.type==='view'">
  67. <label class="layui-form-label">跳转链接</label>
  68. <div class="layui-input-block">
  69. <textarea required class="layui-textarea" ng-model="item.url" placeholder="请输入跳转链接"></textarea>
  70. </div>
  71. </div>
  72. <div ng-if="item.type==='miniprogram'">
  73. <div class="layui-form-item margin-top-20">
  74. <label class="layui-form-label">小程序链接</label>
  75. <div class="layui-input-block">
  76. <input type="text" required class="layui-input" ng-model="item.url" placeholder="请输入小程序链接">
  77. </div>
  78. </div>
  79. <div class="layui-form-item margin-top-20">
  80. <label class="layui-form-label">小程序APPID</label>
  81. <div class="layui-input-block">
  82. <input type="text" required class="layui-input" ng-model="item.appid" placeholder="请输入小程序APPID">
  83. </div>
  84. </div>
  85. <div class="layui-form-item margin-top-20">
  86. <label class="layui-form-label">小程序页面</label>
  87. <div class="layui-input-block">
  88. <input type="text" required class="layui-input" ng-model="item.pagepath" placeholder="请输入小程序页面">
  89. </div>
  90. </div>
  91. </div>
  92. </form>
  93. </div>
  94. </div>
  95. <div class="text-center margin-top-20">
  96. {if auth("edit")}
  97. <button class="layui-btn menu-submit" ng-click="submit()">保存发布</button>
  98. {/if}
  99. {if auth("cancel")}
  100. <button data-load='{:url("cancel")}' class="layui-btn layui-btn-danger">取消发布</button>
  101. {/if}
  102. </div>
  103. </div>
  104. <script>
  105. require(['angular'], function () {
  106. var $form = $('.menu-form').vali();
  107. var $vali = $form.vali().data('validate');
  108. $('#MenuEditor.layui-hide').removeClass('layui-hide');
  109. var app = angular.module("MenuEditor", []).run(callback);
  110. angular.bootstrap(document.getElementById(app.name), [app.name]);
  111. function callback($rootScope) {
  112. $rootScope.item = {};
  113. $rootScope.list = [];
  114. $rootScope.keys = [];
  115. $.form.load('{:url("index")}', {output: 'json'}, 'get', function (ret) {
  116. return $rootScope.$apply(function () {
  117. $rootScope.keys = ret.data.keysdata || [];
  118. $rootScope.list = ret.data.menudata || [];
  119. if ($rootScope.list.length < 1) $rootScope.list = [{name: '请输入名称', type: 'click', sub_button: []}];
  120. for (var i in $rootScope.list) $rootScope.list[i].sub_button = $rootScope.list[i].sub_button || [];
  121. $rootScope.list[0].show = true;
  122. $rootScope.list[0].active = true;
  123. $rootScope.item = $rootScope.list[0];
  124. }), false;
  125. });
  126. // 动态计算宽度
  127. $rootScope.getItemStyle = function (list) {
  128. return 'width:' + (100 / (list.length >= 3 ? 3 : (list.length + 1))) + '%';
  129. };
  130. // 增加菜单选项
  131. $rootScope.addItem = function (list) {
  132. $vali.checkAllInput();
  133. if ($form.find('.validate-error').size() > 0) {
  134. return $.msg.tips('表单验证不成功,请输入需要的内容!');
  135. }
  136. list.push({name: '请输入名称', type: 'click', sub_button: []});
  137. };
  138. // 移除菜单
  139. $rootScope.delItem = function (one, two) {
  140. var tmp = [], _two = null;
  141. if (two) {
  142. for (var i in one.sub_button) if (one.sub_button[i] !== two) {
  143. tmp.push(one.sub_button[i]);
  144. if (one.sub_button[i].active) _two = one.sub_button[i];
  145. }
  146. one.sub_button = tmp;
  147. return $rootScope.setActiveItem(one, _two);
  148. }
  149. for (var i in $rootScope.list) if (one !== $rootScope.list[i]) tmp.push($rootScope.list[i]);
  150. $rootScope.list = tmp;
  151. if ($rootScope.list.length > 1) $rootScope.setActiveItem($rootScope.list[0])
  152. };
  153. // 切换选择菜单
  154. $rootScope.setActiveItem = function (one, two) {
  155. for (var i in $rootScope.list) {
  156. $rootScope.list[i].show = ($rootScope.list[i] === one);
  157. $rootScope.list[i].active = two ? false : ($rootScope.list[i] === one);
  158. }
  159. for (var i in $rootScope.list) for (var j in $rootScope.list[i].sub_button) {
  160. $rootScope.list[i].sub_button[j].active = ($rootScope.list[i].sub_button[j] === two)
  161. }
  162. $rootScope.item = two || one || {};
  163. $rootScope.item.type = $rootScope.item.type || 'click';
  164. if ($rootScope.item.type === 'click') setTimeout(function () {
  165. form.render('select');
  166. $rootScope.item.key = $('[lay-filter="key"]').val();
  167. }, 50);
  168. };
  169. // 下拉列表处理
  170. $rootScope.$watch('item', function () {
  171. if ($rootScope.item.type === 'click') setTimeout(function () {
  172. form.render('select');
  173. }, 50)
  174. }, true);
  175. form.on('select(key)', function (data) {
  176. $rootScope.item.key = data.value;
  177. });
  178. // 提交数据
  179. $rootScope.submit = function () {
  180. $vali.checkAllInput();
  181. if ($form.find('.validate-error').size() > 0) return false;
  182. $.form.load('{:url("edit")}', {data: angular.toJson($rootScope.list)}, 'post');
  183. }
  184. }
  185. })
  186. </script>
  187. {/block}