add_article.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. {extend name="public/container"}
  2. {block name='head_top'}
  3. <style>
  4. .layui-form-item .special-label{
  5. width: 50px;
  6. float: left;
  7. height: 30px;
  8. line-height: 38px;
  9. margin-left: 10px;
  10. margin-top: 5px;
  11. border-radius: 5px;
  12. background-color: #0092DC;
  13. text-align: center;
  14. }
  15. .layui-form-item .special-label i{
  16. display: inline-block;
  17. width: 18px;
  18. height: 18px;
  19. font-size: 18px;
  20. color: #fff;
  21. }
  22. .layui-form-item .label-box{
  23. border: 1px solid;
  24. border-radius: 10px;
  25. position: relative;
  26. padding: 10px;
  27. height: 30px;
  28. color: #fff;
  29. background-color: #393D49;
  30. text-align: center;
  31. cursor: pointer;
  32. display: inline-block;
  33. line-height: 10px;
  34. }
  35. .layui-form-item .label-box p{
  36. line-height: inherit;
  37. }
  38. .cate{
  39. margin-top:10px;
  40. }
  41. .edui-default .edui-for-image .edui-icon{
  42. background-position: -380px 0px;
  43. }
  44. </style>
  45. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/third-party/zeroclipboard/ZeroClipboard.js"></script>
  46. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/ueditor.config.js"></script>
  47. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/ueditor.all.min.js"></script>
  48. {/block}
  49. {block name="content"}
  50. <div class="layui-fluid" style="background: #fff">
  51. <div class="layui-row layui-col-space15" id="app" v-cloak>
  52. <form action="" class="layui-form">
  53. <div class="layui-col-md12">
  54. <div class="layui-card">
  55. <div class="layui-card-body">
  56. <div class="layui-form-item">
  57. <label class="layui-form-label required">新闻标题:</label>
  58. <div class="layui-input-block">
  59. <input type="text" name="title" v-model.trim="formData.title" autocomplete="off" placeholder="请输入新闻标题" maxlength="20" class="layui-input">
  60. </div>
  61. </div>
  62. <div class="layui-form-item cate">
  63. <label class="layui-form-label required">新闻分类:</label>
  64. <div class="layui-input-block">
  65. <select class="chosen-select" v-model="formData.cid" style="width:100%;" lay-filter="getSelect">
  66. <option value="0" >选择分类</option>
  67. <option v-for="(item,idx) in all" :value="idx" :key="idx">{{item}}</option>
  68. </select>
  69. </div>
  70. </div>
  71. <div class="layui-form-item">
  72. <label class="layui-form-label required">新闻简介:</label>
  73. <div class="layui-input-block">
  74. <textarea placeholder="请输入新闻简介" v-model="formData.synopsis" class="layui-textarea"></textarea>
  75. </div>
  76. </div>
  77. <div class="layui-form-item">
  78. <label class="layui-form-label required">新闻封面:(500*334)</label>
  79. <div class="layui-input-block">
  80. <div class="upload-image-box" v-if="formData.image_input">
  81. <img :src="formData.image_input" alt="">
  82. <div class="mask">
  83. <p><i class="fa fa-eye" @click="look(formData.image_input)"></i><i class="fa fa-trash-o" @click="formData.image_input = ''"></i></p>
  84. </div>
  85. </div>
  86. <div class="upload-image" v-show="!formData.image_input" @click="upload('image_input')">
  87. <div class="fiexd"><i class="fa fa-plus"></i></div>
  88. <p>上传图片</p>
  89. </div>
  90. </div>
  91. </div>
  92. <div class="layui-form-item cate">
  93. <label class="layui-form-label required">新闻标签:</label>
  94. <div class="layui-input-inline">
  95. <input type="text" v-model="label" name="price_min" placeholder="最多4个字" autocomplete="off" maxlength="4" class="layui-input">
  96. </div>
  97. <div class="layui-input-inline" style="width: auto;">
  98. <button type="button" class="layui-btn layui-btn-normal" @click="addLabrl" >
  99. <i class="layui-icon">&#xe654;</i>
  100. </button>
  101. </div>
  102. <div class="layui-form-mid layui-word-aux">输入标签名称后点击”+“号按钮添加;最多写入4个字;点击标签即可删除</div>
  103. </div>
  104. <div v-if="formData.label.length" class="layui-form-item">
  105. <div class="layui-input-block">
  106. <button v-for="(item,index) in formData.label" :key="index" type="button" class="layui-btn layui-btn-normal layui-btn-sm" @click="delLabel(index)">{{item}}</button>
  107. </div>
  108. </div>
  109. <div class="layui-form-item">
  110. <label class="layui-form-label">新闻排序:</label>
  111. <div class="layui-input-inline">
  112. <input type="number" name="sort" v-model="formData.sort" min="0" max="9999" class="layui-input" v-sort>
  113. </div>
  114. </div>
  115. <div class="layui-form-item">
  116. <label class="layui-form-label">插入视频:</label>
  117. <div class="layui-input-block">
  118. <input type="text" name="title" v-model="link" style="width:50%;display:inline-block;margin-right: 10px;" autocomplete="off" placeholder="请输入视频链接" class="layui-input">
  119. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" @click="uploadVideo">确认添加</button>
  120. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="ossupload">上传视频</button>
  121. </div>
  122. <div class="layui-input-block" style="width: 50%;margin-top: 20px" v-show="is_video">
  123. <div class="layui-progress" style="margin-bottom: 10px">
  124. <div class="layui-progress-bar layui-bg-blue" :style="'width:'+videoWidth+'%'"></div>
  125. </div>
  126. <button type="button" class="layui-btn layui-btn-sm layui-btn-danger" @click="cancelUpload">取消</button>
  127. </div>
  128. <div class="layui-form-mid layui-word-aux">输入链接将视为添加视频直接添加,请确保视频链接的正确性</div>
  129. </div>
  130. <div class="layui-form-item">
  131. <label class="layui-form-label required">新闻内容:</label>
  132. <div class="layui-input-block">
  133. <textarea id="editor">{{formData.content}}</textarea>
  134. </div>
  135. </div>
  136. <div class="layui-form-item submit" style="margin-bottom: 10px">
  137. <div class="layui-input-block">
  138. <button class="layui-btn layui-btn-normal" type="button" @click="save">{$id ? '确认修改':'立即提交'}</button>
  139. <button class="layui-btn layui-btn-primary clone" @click="clone_form">取消</button>
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144. </div>
  145. </form>
  146. </div>
  147. </div>
  148. <script type="text/javascript" src="{__ADMIN_PATH}js/layuiList.js"></script>
  149. {/block}
  150. {block name='script'}
  151. <script>
  152. var id={$id};
  153. var article=<?=isset($article) ? $article : "{}"?>;
  154. var all={$all};
  155. require(['vue','zh-cn','request','aliyun-oss','plupload','OssUpload'],function(Vue) {
  156. new Vue({
  157. el: "#app",
  158. directives: {
  159. sort: {
  160. bind: function (el, binding, vnode) {
  161. var vm = vnode.context;
  162. el.addEventListener('change', function () {
  163. if (!this.value || this.value < 0) {
  164. vm.formData.sort = 0;
  165. } else if (this.value > 9999) {
  166. vm.formData.sort = 9999;
  167. } else {
  168. vm.formData.sort = parseInt(this.value);
  169. }
  170. });
  171. }
  172. }
  173. },
  174. data: {
  175. formData: {
  176. title:article.title || '',
  177. cid:article.cid || 0,
  178. synopsis:article.synopsis || '',
  179. sort:article.sort || 0,
  180. image_input:article.image_input || '',
  181. label:article.label || [],
  182. content:article.profile ? (article.profile.content || '') : '',
  183. },
  184. all:all,
  185. but_title:'上传视频',
  186. link:'',
  187. label:'',
  188. mask:false,
  189. ue:null,
  190. uploader:null,
  191. is_video:false,
  192. videoWidth:0,
  193. },
  194. methods:{
  195. uploadVideo:function(){
  196. var link = this.link.trim();
  197. if (link) {
  198. if (link.indexOf('http') || link.indexOf('mp4') !== link.length - 3) {
  199. layui.layer.msg('请输入正确的视频链接', {icon: 5});
  200. } else {
  201. this.setContent(this.link);
  202. }
  203. }
  204. },
  205. setContent:function(link){
  206. this.ue.setContent('<div><video style="width: 100%" src="'+link+'" class="video-ue" controls="controls">\n' +
  207. 'your browser does not support the video tag\n' +
  208. '</video></div><br>',true);
  209. },
  210. save:function(){
  211. var that=this;
  212. that.formData.content = that.ue.getContent();
  213. if(!that.formData.title) return layList.msg('请输入新闻标题');
  214. if(that.formData.cid<=0) return layList.msg('请选择新闻分类');
  215. if(!that.formData.synopsis) return layList.msg('请输入新闻简介');
  216. if(!that.formData.image_input) return layList.msg('请上传新闻封面');
  217. if (!that.formData.label.length) return layList.msg('请添加新闻标签');
  218. if (!that.formData.content) {
  219. return layList.msg('请编辑新闻内容');
  220. }
  221. layList.loadFFF();
  222. layList.basePost(layList.U({a:'save_article',q:{id:id}}),that.formData,function (res) {
  223. layList.loadClear();
  224. if(parseInt(id)==0) {
  225. layList.layer.confirm('添加成功,您要继续添加新闻吗?', {
  226. btn: ['继续添加', '立即提交'] //按钮
  227. }, function (index) {
  228. layList.layer.close(index);
  229. }, function () {
  230. parent.layer.closeAll();
  231. window.location.href = layList.U({a: 'index', p: {type: 1}});
  232. });
  233. }else{
  234. layList.msg('修改成功',function () {
  235. parent.layer.closeAll();
  236. window.location.href = layList.U({a: 'index', p: {type: 1}});
  237. })
  238. }
  239. },function (res) {
  240. layList.loadClear();
  241. layList.msg(res.msg);
  242. });
  243. },
  244. clone_form:function(){
  245. if (parseInt(id) == 0) {
  246. var that = this;
  247. if(that.formData.image_input) return layList.msg('请先删除上传的图片在尝试取消');
  248. parent.layer.closeAll();
  249. }
  250. parent.layer.closeAll();
  251. },
  252. //取消
  253. cancelUpload:function(){
  254. this.uploader.stop();
  255. this.is_video = false;
  256. this.videoWidth = 0;
  257. },
  258. //上传图片
  259. upload:function(key,count){
  260. ossUpload.createFrame('请选择图片',{fodder:key,max_count:count === undefined ? 0 : count},{w:800,h:550});
  261. },
  262. //删除图片
  263. delect:function(act,key,index){
  264. var that=this;
  265. switch (act){
  266. case 1:
  267. Ks3.delObject({Key: key},function () {
  268. that.formData.image_input={};
  269. },function () {
  270. that.formData.image_input={};
  271. });
  272. break;
  273. }
  274. },
  275. delLabel:function (index) {
  276. this.formData.label.splice(index,1);
  277. this.$set(this.formData,'label',this.formData.label);
  278. },
  279. addLabrl:function () {
  280. if(this.label){
  281. if(this.label.length > 4) return layList.msg('您输入的标签字数太长');
  282. var length=this.formData.label.length;
  283. if(length >= 2) return layList.msg('标签最多添加2个');
  284. for(var i=0;i<length;i++){
  285. if(this.formData.label[i]==this.label) return layList.msg('请勿重复添加');
  286. }
  287. this.formData.label.push(this.label);
  288. this.$set(this.formData,'label',this.formData.label);
  289. this.label='';
  290. }
  291. },
  292. //查看图片
  293. look:function(pic){
  294. parent.$eb.openImage(pic);
  295. },
  296. //鼠标移入事件
  297. enter:function(item){
  298. if(item){
  299. item.is_show=true;
  300. }else{
  301. this.mask=true;
  302. }
  303. },
  304. //鼠标移出事件
  305. leave:function(item){
  306. if(item){
  307. item.is_show=false;
  308. }else{
  309. this.mask=false;
  310. }
  311. },
  312. changeIMG:function(key,value,multiple){
  313. if(multiple){
  314. var that = this;
  315. value.map(function (v) {
  316. that.formData[key].push({pic:v,is_show:false});
  317. });
  318. this.$set(this.formData,key,this.formData[key]);
  319. }else{
  320. this.$set(this.formData,key,value);
  321. }
  322. }
  323. },
  324. mounted:function () {
  325. var that = this;
  326. this.$nextTick(function () {
  327. layList.form.render();
  328. layList.form.on('select(getSelect)',function (data) {
  329. that.formData.cid = data.value;
  330. });
  331. //实例化编辑器
  332. UE.registerUI('选择图片', function (editor, uiName) {
  333. var btn = new UE.ui.Button({
  334. name: uiName,
  335. title: uiName,
  336. cssRules: 'background-position: -380px 0;',
  337. onclick: function() {
  338. ossUpload.createFrame(uiName, { fodder: editor.key }, { w: 800, h: 550 });
  339. }
  340. });
  341. return btn;
  342. });
  343. that.ue = UE.getEditor('editor');
  344. that.uploader = ossUpload.upload({
  345. id:'ossupload',
  346. mime_types: [
  347. {title: "Mp4 files", extensions: "mp4"}
  348. ],
  349. FilesAddedSuccess:function(){
  350. that.is_video = true;
  351. },
  352. uploadIng:function (file) {
  353. that.videoWidth = file.percent;
  354. },
  355. success:function (res) {
  356. layList.msg('上传成功');
  357. that.videoWidth = 0;
  358. that.is_video = false;
  359. that.setContent(res.url);
  360. },
  361. fail:function (err) {
  362. that.videoWidth = 0;
  363. that.is_video = false;
  364. layList.msg(err);
  365. }
  366. })
  367. }.bind(this));
  368. window.changeIMG = that.changeIMG;
  369. //选择图片插入到编辑器中
  370. window.insertEditor = function(list){
  371. that.ue.execCommand('insertimage', list);
  372. }
  373. },
  374. updated:function(){
  375. layList.form.render();
  376. }
  377. })
  378. })
  379. </script>
  380. {/block}