form.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. {extend name='admin@main'}
  2. {block name="style"}{include file='wechat@news/form-style'}{/block}
  3. {block name='content'}
  4. <div id="NewsEditor" class="layui-clear nowrap padding-bottom-30">
  5. <div class="layui-card news-left">
  6. <div class="layui-card-body layui-hide">
  7. <div ng-if="list.length > 0" ng-repeat="x in list">
  8. <div class="news-item transition" ng-click="setItem($index,$event)" style="{{x.style}}" ng-class="x.active?'active':''">
  9. <a ng-click="delItem($index, $event)" class="transition layui-icon layui-hide">&#x1006;</a>
  10. <a ng-click="dnItem($index, $event)" class="transition layui-icon layui-hide">&#xe61a;</a>
  11. <a ng-click="upItem($index, $event)" class="transition layui-icon layui-hide">&#xe619;</a>
  12. <span class="news-title" ng-bind="x.title"></span>
  13. </div>
  14. <hr>
  15. </div>
  16. <div ng-if="list.length<1" class="news-item transition active">
  17. <a ng-click="delItem($index, $event)" class="transition layui-icon layui-hide">&#x1006;</a>
  18. <a ng-click="dnItem($index, $event)" class="transition layui-icon layui-hide">&#xe61a;</a>
  19. <a ng-click="upItem($index, $event)" class="transition layui-icon layui-hide">&#xe619;</a>
  20. <span class="news-title"></span>
  21. <hr>
  22. </div>
  23. <a class='article-add transition' ng-click="addItem()" data-text-tip="添加图文"><i class="fa fa-plus"></i></a>
  24. </div>
  25. </div>
  26. <div class="layui-card news-right">
  27. <div class="layui-card-body">
  28. <form class="layui-form padding-20" role="form" name="news" onsubmit="return false">
  29. <label class="layui-form-item relative block">
  30. <span class="color-green">文章标题</span>
  31. <input maxlength="64" ng-model="item.title" required placeholder="请在这里输入标题" name='title' class="layui-input">
  32. </label>
  33. <label class="layui-form-item relative block">
  34. <span class="color-green">文章作者</span>
  35. <input maxlength="64" ng-model="item.author" required placeholder="请输入文章作者" name='author' class="layui-input">
  36. </label>
  37. <div class="layui-form-item label-required-prev">
  38. <span class="color-green">图文封面大图片</span>
  39. <div class="layui-clear">
  40. <div class="upload-image-box pull-left transition" data-tips-image="{{item.local_url}}" style="{{item.style}}">
  41. <input ng-model="item.local_url" data-auto-none value="{{item.local_url}}" type="hidden" name="local_url">
  42. </div>
  43. <div class="pull-left padding-top-15 padding-left-15">
  44. <button type="button" data-title="上传图片" data-file="btn" data-type="jpg,png,jpeg" data-field="local_url" class="layui-btn layui-btn-sm layui-btn-primary">上传图片</button>
  45. <br>
  46. <label class="think-checkbox notselect margin-top-15">
  47. <input ng-model="item.show_cover_pic" ng-checked="!!item.show_cover_pic" data-auto-none type="checkbox" value="1" name="show_cover_pic"> 在正文顶部显示此图片
  48. </label>
  49. </div>
  50. </div>
  51. <p class="color-desc">封面大图片建议尺寸 900像素 * 500像素</p>
  52. </div>
  53. <div class="layui-form-item label-required-prev">
  54. <span class="color-green">图文文章内容</span>
  55. <textarea ng-model="item.content" name='content'></textarea>
  56. </div>
  57. <label class="layui-form-item relative block">
  58. <span class="help-block">摘要选填,如果不填写会默认抓取正文前54个字</span>
  59. <textarea ng-model="item.digest" name="digest" class="layui-textarea" style="height:80px;line-height:18px"></textarea>
  60. </label>
  61. <label class="layui-form-item relative block">
  62. <span class="help-block">原文链接 <span class="color-blue">选填</span>,填写之后在图文左下方会出现此链接</span>
  63. <input pattern="^(http:\/\/|^https:\/\/|^\/\/)((\w|=|\?|\.|\/|&|-)+)" placeholder="请输入跳转链接地址" ng-model="item.content_source_url" maxlength="200" name='content_source_url' class="layui-input">
  64. </label>
  65. <div class="layui-form-item text-center padding-top-30">
  66. <input ng-model="x.read_num" type="hidden">
  67. <button ng-click="submit()" type="button" class="layui-btn">保存图文</button>
  68. </div>
  69. </form>
  70. </div>
  71. </div>
  72. </div>
  73. {/block}
  74. {block name='script'}
  75. <script>
  76. require(['angular', 'ckeditor'], function () {
  77. var $form = $('form[name="news"]');
  78. var $vali = $form.vali().data('validate');
  79. var editor = window.createEditor('[name="content"]');
  80. var app = angular.module("NewsEditor", []).run(callback);
  81. angular.bootstrap(document.getElementById(app.name), [app.name]);
  82. function callback($rootScope) {
  83. $rootScope.list = [];
  84. $rootScope.item = {};
  85. $.form.load('{:request()->url()}', {output: 'json'}, 'get', function (ret) {
  86. return $rootScope.$apply(function () {
  87. apply((ret.data || {articles: []}).articles || []);
  88. }), false;
  89. });
  90. function apply(list) {
  91. if (list.length < 1) list.push({
  92. title: '新建图文',
  93. author: '管理员',
  94. content: '文章内容',
  95. read_num: 0,
  96. local_url: '__ROOT__/static/plugs/uploader/theme/image.png',
  97. });
  98. for (var i in list) {
  99. list[i].active = false;
  100. list[i].style = "background-image:url('" + list[i].local_url + "')";
  101. }
  102. $rootScope.list = list;
  103. $rootScope.item = $rootScope.list[0];
  104. $rootScope.setItemValue('active', true);
  105. setTimeout(function () {
  106. $vali.checkAllInput();
  107. editor.setData($rootScope.item.content);
  108. $('.layui-card-body.layui-hide').removeClass('layui-hide');
  109. }, 100);
  110. }
  111. $rootScope.upItem = function (index, $event) {
  112. $event.stopPropagation();
  113. var tmp = [], cur = $rootScope.list[index];
  114. if (index < 1) return false;
  115. for (var i in $rootScope.list) {
  116. (parseInt(i) === parseInt(index) - 1) && tmp.push(cur);
  117. (parseInt(i) !== parseInt(index)) && tmp.push($rootScope.list[i]);
  118. }
  119. apply(tmp);
  120. };
  121. $rootScope.dnItem = function (index, $event) {
  122. $event.stopPropagation();
  123. var tmp = [], cur = $rootScope.list[index];
  124. if (index > $rootScope.list.length - 2) return false;
  125. for (var i in $rootScope.list) {
  126. (parseInt(i) !== parseInt(index)) && tmp.push($rootScope.list[i]);
  127. (parseInt(i) === parseInt(index) + 1) && tmp.push(cur);
  128. }
  129. apply(tmp);
  130. };
  131. $rootScope.delItem = function (index, $event) {
  132. $event.stopPropagation();
  133. var list = $rootScope.list, temp = [];
  134. for (var i in list) (parseInt(i) !== parseInt(index)) && temp.push(list[i]);
  135. apply(temp);
  136. };
  137. $rootScope.setItem = function (index, $event) {
  138. $event.stopPropagation();
  139. $vali.checkAllInput();
  140. if ($form.find('.validate-error').size() > 0) return 0;
  141. if (editor.getData().length < 1) return $.msg.tips('文章内容不能为空,请输入文章内容!');
  142. for (var i in $rootScope.list) {
  143. if (parseInt(i) !== parseInt(index)) {
  144. $rootScope.list[i].active = false;
  145. } else {
  146. $rootScope.item.content = editor.getData();
  147. $rootScope.item = $rootScope.list[i];
  148. editor.setData($rootScope.item.content);
  149. $rootScope.setItemValue('active', true);
  150. }
  151. }
  152. };
  153. $rootScope.setItemValue = function (name, value) {
  154. $rootScope.item[name] = value;
  155. $rootScope.item.style = "background-image:url('" + $rootScope.item.local_url + "')";
  156. };
  157. $rootScope.addItem = function () {
  158. if ($rootScope.list.length > 7) return $.msg.tips('最多允许增加7篇文章哦!');
  159. $rootScope.list.push({
  160. title: '新建图文',
  161. author: '管理员',
  162. content: '文章内容',
  163. read_num: 0,
  164. local_url: '__ROOT__/static/plugs/uploader/theme/image.png',
  165. style: "background-image:url('__ROOT__/static/plugs/uploader/theme/image.png')"
  166. });
  167. };
  168. $rootScope.submit = function () {
  169. $vali.checkAllInput();
  170. if ($form.find('.validate-error').size() > 0) {
  171. return $.msg.tips('表单验证不成功,请输入需要的内容!');
  172. }
  173. $rootScope.item.content = editor.getData();
  174. var data = [];
  175. for (var i in $rootScope.list) data.push({
  176. id: $rootScope.list[i].id,
  177. title: $rootScope.list[i].title,
  178. author: $rootScope.list[i].author,
  179. digest: $rootScope.list[i].digest,
  180. content: $rootScope.list[i].content,
  181. read_num: $rootScope.list[i].read_num,
  182. local_url: $rootScope.list[i].local_url,
  183. show_cover_pic: $rootScope.list[i].show_cover_pic ? 1 : 0,
  184. content_source_url: $rootScope.list[i].content_source_url,
  185. });
  186. $.form.load('{:request()->url()}', {data: data}, "post");
  187. };
  188. $('[name="local_url"]').on('change', function () {
  189. var value = this.value;
  190. $rootScope.$apply(function () {
  191. $rootScope.setItemValue('local_url', value);
  192. });
  193. });
  194. }
  195. });
  196. </script>
  197. {/block}