add.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. {extend name="public/layout" /} {block name="title"}视频添加{/block} {block name="head"} {include file="public/head"}
  2. <style>
  3. #douyin {
  4. display: none;
  5. }
  6. video {
  7. width: 144px;
  8. height: 253px;
  9. margin: 30px 0px;
  10. }
  11. html {
  12. background: #fff;
  13. }
  14. @media screen and (max-width: 450px) {
  15. .layui-form-item {
  16. position: relative;
  17. }
  18. .layui-form-item .layui-input-inline {
  19. padding-right: 40px !important;
  20. }
  21. .adding {
  22. position: absolute;
  23. right: 10px;
  24. top: 0;
  25. }
  26. }
  27. .layui-btn-primary {
  28. color: #249EFB;
  29. border: 1px solid #249EFB;
  30. }
  31. .layui-btn-primary:hover {
  32. background-color: #E3F7FF;
  33. color: #249EFB;
  34. }
  35. .layui-border-btn,
  36. .layui-border-btn:hover {
  37. border: 1px solid #249EFB;
  38. background-color: #fff;
  39. color: #249EFB;
  40. }
  41. .colorRed {
  42. color: red;
  43. }
  44. #upload-drag{height: 150px;width:250px;}
  45. .layui-upload-drag {
  46. width: 128px;
  47. height: 90px;
  48. }
  49. .imageDiv{position: absolute;top:0;left:0;width:100%;height: 100%;background: rgba(230,230,230,.5);display: none;}
  50. .imageDiv i{display: block;width:18px;height: 18px;position: absolute;top:0;left:0;bottom:0;right: 0;margin:auto;}
  51. </style>
  52. {/block} {block name="body"}
  53. <body>
  54. <form class="layui-form" lay-filter="layuiadmin-app-form-list" id="layuiadmin-app-form-list"
  55. style="padding: 20px 30px 0 0;">
  56. <div class="layui-form-item">
  57. <label class="layui-form-label"><span class="colorRed">*</span>标题</label>
  58. <div class="layui-input-inline" style="width:70%;">
  59. <input type="text" name="title" lay-verify="required" placeholder="请输入标题" autocomplete="off"
  60. class="layui-input">
  61. </div>
  62. </div>
  63. <div class="layui-form-item">
  64. <label class="layui-form-label"><span class="colorRed">*</span>分类</label>
  65. <div class="layui-input-inline">
  66. <select name="type" lay-filter="type" id="type" lay-verify="required" lay-search>
  67. <option value="">请选择分类</option>
  68. {volist name="type" id="t"}
  69. <option value="{$t.id}">{$t.name}</option>
  70. {/volist}
  71. </select>
  72. </div>
  73. <i class="layui-icon layui-icon-add-circle adding" style="font-size: 32px" id="addType"></i>
  74. </div>
  75. <div class="layui-form-item">
  76. <label class="layui-form-label">标签</label>
  77. <div class="layui-input-inline">
  78. <select name="label" id="label" lay-filter="type2">
  79. <option value="">请选择标签</option>
  80. </select>
  81. </div>
  82. <i class="layui-icon layui-icon-add-circle adding" style="font-size: 32px" id="addLabel"></i>
  83. </div>
  84. <div class="layui-form-item layui-hide">
  85. <label class="layui-form-label"><span class="colorRed">*</span>视频</label>
  86. <div class="layui-input-inline" style="width: 290px;">
  87. <!-- <input type="radio" name="myradio" value="local_name" /> 上传文件名字保持本地文件名字-->
  88. <input type="radio" name="myradio" value="random_name" checked=true /> 上传文件名字是随机文件名, 后缀保留
  89. </div>
  90. </div>
  91. <div class="layui-form-item">
  92. <label class="layui-form-label">视频封面图</label>
  93. <div class="layui-input-inline isimgupload" style="position: relative;">
  94. <div class="" id="upload-drag">
  95. <div class="layui-upload-drag">
  96. <i class="layui-icon">&#xe681;</i>
  97. <p>上传图片</p>
  98. </div>
  99. </div>
  100. <div class="imageDiv"><i class="layui-icon layui-icon-delete" prop="del"></i></div>
  101. </div>
  102. </div>
  103. <div class="layui-form-item">
  104. <label class="layui-form-label">分享封面</label>
  105. <div class="layui-input-inline isimgupload" style="position: relative;">
  106. <div class="" id="upload-share-drag">
  107. <div class="layui-upload-drag">
  108. <i class="layui-icon">&#xe681;</i>
  109. <p>上传图片</p>
  110. </div>
  111. </div>
  112. <div class="imageDiv"><i class="layui-icon layui-icon-delete" prop="del"></i></div>
  113. </div>
  114. </div>
  115. <div class="layui-form-item">
  116. <label class="layui-form-label"></label>
  117. <div><i style="color: red;margin-right:5px;">*</i>上传分享封面图宽高比例5:4,图片大小不超过1M</div>
  118. </div>
  119. <div class="layui-form-item">
  120. <label class="layui-form-label"><span class="colorRed">*</span>视频</label>
  121. <div class="layui-input-inline" style="width: 290px;display: block;" id="container">
  122. <a class="layui-btn btn layui-border-btn" id="selectfiles" href="javascript:void(0);">选择视频</a>
  123. <a class="layui-btn btn layui-border-btn" id="postfiles" href="javascript:void(0);">开始上传</a>
  124. <div id="ossfile"></div>
  125. <div id="symbshowed"></div>
  126. <!--报错信息返回展示-->
  127. <pre id="console"></pre>
  128. <input type="hidden" value="" id="fileuri">
  129. <!--上传到OSS哪个文件下,在这里定义-->
  130. <input type="hidden" value="Video" id="category_name">
  131. </div>
  132. </div>
  133. <div class="layui-form-item videolimit">
  134. <label class="layui-form-label"></label>
  135. <div><i style="color:red;margin-right:5px;">*</i><span id="limitVA">上传视频大小不超过280M</span></div>
  136. </div>
  137. <div class="layui-form-item">
  138. <label class="layui-form-label"><i style="color:red;">*</i> 视频格式:</label>
  139. <div class="layui-input-block lh45 mdl20" style="max-width: 300px !important;">
  140. <input type="radio" id="1" class="radio_input" lay-filter="video_type"
  141. name="video_type" value="0" title="全屏" checked>
  142. <input type="radio" id="2" class="radio_input" lay-filter="video_type"
  143. name="video_type" value="1" title="横屏">
  144. </div>
  145. </div>
  146. <div class="layui-form-item">
  147. <label class="layui-form-label"><span class="colorRed">*</span>视频描述</label>
  148. <div class="layui-input-block" style="width: 70%;">
  149. <textarea name="description" style="width: 100%; height: 100px;" autocomplete="off" class="layui-textarea"></textarea>
  150. <div class="layui-form-mid layui-word-aux" id="dy">
  151. <a href="javascript:;" style="color: red;text-decoration-line: underline;">点击抓取抖音视频</a>
  152. </div>
  153. </div>
  154. </div>
  155. <div class="layui-form-item" id="douyin">
  156. <label class="layui-form-label">抖音地址</label>
  157. <div class="layui-input-inline">
  158. <input type="text" id="douyinurl" placeholder="请粘贴抖音分享地址" autocomplete="off" class="layui-input">
  159. </div>
  160. <div class="layui-input-inline">
  161. <a class="layui-btn layui-btn-primary" id="catch">抓取</a>
  162. </div>
  163. </div>
  164. <div class="layui-form-item">
  165. <label class="layui-form-label">继续添加</label>
  166. <div class="layui-input-block">
  167. <input type="checkbox" name="adding" title="" lay-skin="primary" {if condition="$adding eq 1"
  168. }checked{/if}>
  169. </div>
  170. </div>
  171. <div class="layui-form-item ">
  172. <label class="layui-form-label"></label>
  173. <input type="button" class="layui-btn btn layui-btn-primary" lay-submit
  174. lay-filter="layuiadmin-app-form-submit" id="layuiadmin-app-form-submit" value="确认添加">
  175. </div>
  176. <div class="layui-form-item">
  177. <!-- <input type="button" lay-submit lay-filter="layuiadmin-app-form-submit" id="layuiadmin-app-form-submit" value="确认添加"> -->
  178. <!-- <input type="button" lay-submit lay-filter="layuiadmin-app-form-edit" id="layuiadmin-app-form-edit" value="确认编辑"> -->
  179. </div>
  180. <input type="hidden" name="douyin_url" value="">
  181. </form>
  182. </body>
  183. {/block}
  184. {block name="js"}
  185. <script type="text/javascript" src="__STATIC__/js/plupload/js/plupload.full.min.js"></script>
  186. <script type="text/javascript" src="__STATIC__/js/plupload/ossupload.js"></script>
  187. <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.3.1.min.js" async></script>
  188. <script>
  189. layui.config({
  190. base: '__LAYUI__/',
  191. urlbase: '/sys'
  192. }).extend({
  193. index: 'lib/index' //主入口模块
  194. }).use(['index', 'form', 'element', 'upload'], function () {
  195. var form = layui.form,
  196. upload = layui.upload,
  197. element = layui.element,
  198. $ = layui.jquery;
  199. var objdata = {};
  200. form.on('submit(layuiadmin-app-form-submit)', function (data) {
  201. if ($(data.elem).hasClass('layui-btn-disabled')) return false;
  202. $(data.elem).addClass('layui-btn-disabled');
  203. var index = parent.layer.getFrameIndex(window.name);
  204. var formData = new FormData(data.form);
  205. var bodyjson = JSON.parse(localStorage.getItem('videodata'));
  206. formData.append('video_url', $('#fileuri').val());
  207. if(bodyjson.cover){
  208. formData.append('cover', bodyjson.cover);
  209. }console.log(bodyjson);
  210. if(bodyjson.cover_share_img){
  211. formData.append('cover_share_img', bodyjson.cover_share_img);
  212. }
  213. formData.delete('file');
  214. var load = layer.load(1, { shade: [0.8, '#000'] })
  215. $.ajax({
  216. url: '{:url("video/addSave")}',
  217. data: formData,
  218. type: 'post',
  219. dataType: 'json',
  220. processData: false,
  221. contentType: false,
  222. success: function (res) {
  223. if (res.code == 0) {
  224. objdata = {};
  225. localStorage.setItem('videodata', '');
  226. layer.msg('添加成功', {
  227. icon: 1,
  228. time: 1000
  229. }, function () {
  230. var adding = $("input[name='adding']").is(":checked");
  231. if (adding) {
  232. // window.location.reload();
  233. location.href = "{:url('video/add')}?adding=1";
  234. } else {
  235. var index = parent.layer.getFrameIndex(window.name);
  236. parent.layer.close(index);
  237. parent.layui.table.reload('layui-table-video');
  238. }
  239. });
  240. } else {
  241. layer.close(load);
  242. layer.msg(res.msg);
  243. }
  244. $(data.elem).removeClass('layui-btn-disabled');
  245. }
  246. });
  247. });
  248. //下拉框关联
  249. var typeData = JSON.parse('{$label|raw}');
  250. form.on('select(type)', function (data) {
  251. var typeJson = typeData[data.value];
  252. var typeLabel = $('#label');
  253. typeLabel.empty().append('<option value="">请选择标签</option>');
  254. for (r in typeJson) {
  255. typeLabel.append('<option value=' + r + '>' + typeJson[r] + '</option>');
  256. }
  257. form.render();
  258. cache();
  259. });
  260. form.on('select(type2)', function (data) {
  261. cache();
  262. })
  263. $('#dy').click(function () {
  264. var display = $('#douyin').css('display');
  265. if (display == 'none') {
  266. $('#douyin').show();
  267. } else {
  268. $('#douyin').hide();
  269. }
  270. });
  271. $('.isimgupload').hover(function(){
  272. if($(this).find('#upload-drag').length>0 && $("#upload-drag:has(img.fmimages)").length>0){
  273. $(this).find('.imageDiv').show();
  274. }
  275. if($(this).find('#upload-share-drag').length>0 && $("#upload-share-drag:has(img.fmimages)").length>0){
  276. $(this).find('.imageDiv').show();
  277. }
  278. },function(){
  279. $(this).find('.imageDiv').hide();
  280. })
  281. if (localStorage.getItem('videodata')) {
  282. var bodyjson = JSON.parse(localStorage.getItem('videodata'));
  283. if (bodyjson) {
  284. $('input[name="title"]').val(bodyjson.title);
  285. if (bodyjson.type) {
  286. set_select('type', bodyjson.type);
  287. }
  288. var typeJson = typeData[bodyjson.type];
  289. var typeLabel = $('#label');
  290. typeLabel.empty().append('<option value="">请选择标签</option>');
  291. for (r in typeJson) {
  292. typeLabel.append('<option value=' + r + '>' + typeJson[r] + '</option>');
  293. }
  294. if (bodyjson.label) {
  295. set_select('label', bodyjson.label);
  296. }
  297. objdata['cover'] = bodyjson.cover;
  298. if (bodyjson.cover) {
  299. $('#upload-drag').html('<img class="fmimages" src="' + bodyjson.cover + '" style="width:100%;height:100%">');
  300. }
  301. $('.layui-textarea').text(bodyjson.description);
  302. if (bodyjson.video_url) {
  303. $('#fileuri').val(bodyjson.video_url);
  304. $('#symbshowed').html('<video controls src="https://o.nczyzs.com/' + bodyjson.video_url + '" name="media"><source src="https://o.nczyzs.com/' + bodyjson.video_url + '" type="video/mp4"></video>')
  305. }
  306. form.render();
  307. }
  308. }
  309. $('#postfiles').click(function () {
  310. $('#fileuri').val('');
  311. var timess = setInterval(function () {
  312. if ($('#ossfile').find('.progress-bar').attr('aria-valuenow') == 100) {
  313. setTimeout(function () {
  314. objdata['video_url'] = $('#fileuri').val();
  315. cache();
  316. }, 1000)
  317. clearInterval(timess);
  318. }
  319. }, 100)
  320. })
  321. function set_select(id, value) {
  322. let obj = $("#" + id);
  323. let names = '';
  324. for (var i = 0; i < obj.find('option').length; i++) {
  325. if (obj.find('option').eq(i).val() == value) {
  326. obj.find("option").eq(i).attr("selected", true);
  327. names = obj.find('option').eq(i).html();
  328. }
  329. }
  330. setTimeout(function () {
  331. obj.parent().find(".layui-select-title").find("input").val(names);
  332. }, 500)
  333. }
  334. $('input,textarea').off('input').on('input', function (obj) {
  335. cache();
  336. })
  337. function cache() {
  338. setTimeout(function () {
  339. var formarray = $("form").serializeArray();
  340. for (var i in formarray) {
  341. objdata[formarray[i]['name']] = formarray[i]['value']
  342. }
  343. objdata['video_url'] = $('#fileuri').val();
  344. var datas = JSON.stringify(objdata);
  345. localStorage.setItem('videodata', datas);
  346. }, 500)
  347. }
  348. //抖音抓取
  349. $("#catch").click(function () {
  350. var load = layer.load(1, { shade: [0.8, '#FFFFFF'] })
  351. var url = $('#douyinurl').val();
  352. $.ajax({
  353. url: "{:url('video/catch')}",
  354. data: {
  355. link: url
  356. },
  357. success: function (res) {
  358. layer.close(load);
  359. if (res.code == 0) {
  360. var form_div = $('#layuiadmin-app-form-list');
  361. form_div.find('input[name=title]').val(res.data.title);
  362. form_div.find('textarea').text(res.data.desc);
  363. $('#symbshowed').html('<video controls="" name="media"><source src="' +
  364. res
  365. .data.video + '" type="video/mp4"></video>');
  366. form_div.find('input[name=douyin_url]').val(res.data.video);
  367. $('#symbshowed').show();
  368. } else {
  369. layer.msg(res.msg);
  370. }
  371. }
  372. });
  373. });
  374. var loadIndex = null;
  375. //拖拽上传
  376. upload.render({
  377. elem: '#upload-drag',
  378. url: '/upload/',
  379. accept: 'image',
  380. exts: 'png|jpg|jpeg',
  381. auto: false,
  382. field: 'file',
  383. size: 3 * 1024,
  384. choose: function (obj) {
  385. loadIndex = layer.load(1, { shade: [0.8, '#000'] });
  386. obj.preview(function (index, file, result) {
  387. ossuploadimg(file).then(f => {
  388. layer.close(loadIndex);
  389. let fileCover = `https://o.nczyzs.com/${f}`;
  390. objdata['cover'] = fileCover;
  391. $('#upload-drag').html('<img class="fmimages" src="' + result + '" style="height: 100%;width:100%;">');
  392. cache();
  393. })
  394. });
  395. },
  396. });
  397. //拖拽上传
  398. upload.render({
  399. elem: '#upload-share-drag',
  400. url: '/upload/',
  401. accept: 'image',
  402. exts: 'png|jpg|jpeg',
  403. auto: false,
  404. field: 'file',
  405. size: 3 * 1024,
  406. choose: function (obj) {
  407. loadIndex = layer.load(1, { shade: [0.8, '#000'] });
  408. obj.preview(function (index, file, result) {
  409. ossuploadimg(file).then(f => {
  410. layer.close(loadIndex);
  411. let fileCover = `https://o.nczyzs.com/${f}`;
  412. objdata['cover_share_img'] = fileCover;
  413. $('#upload-share-drag').html('<img class="fmimages" src="' + result + '" style="height: 100%;width:100%;">');
  414. cache();
  415. })
  416. });
  417. },
  418. });
  419. function ossuploadimg(file) {
  420. return new Promise((resolve,reject) => {
  421. var client = new OSS({
  422. region: "oss-cn-hangzhou",
  423. accessKeyId: "LTAI5tHjWupJSCAycy2yVbQZ",
  424. accessKeySecret: "eNFicm77Cfq3u7ZnQyw1urFmFNpf3w",
  425. bucket: "zyzswzh",
  426. secure: true
  427. });
  428. var date = new Date().getTime();
  429. var objectName = 'Video/' + date + "/" + Date.now() + ".jpeg";
  430. client.put(objectName, file).then(function (result) {
  431. resolve(result.name);
  432. }).catch(function (error) {
  433. reject(error)
  434. });
  435. })
  436. }
  437. $('.imageDiv').on('click', function(e) {
  438. var that = this;
  439. layer.confirm('确定删除该图片么?',{title: ['信息', 'color:#333333;background-color:#D8E6F1;'],}, function(index) {
  440. var imgDiv = $('#upload-drag').find('img');
  441. imgDiv.remove();
  442. objdata['cover'] = '';
  443. $('#upload-drag').html('<div class="layui-upload-drag"><i class="layui-icon">&#xe681;</i><p>上传图片</p></div>');
  444. layer.close(index);
  445. cache();
  446. });
  447. });
  448. //添加分类
  449. $('#addType').click(function () {
  450. layer.prompt({
  451. title: ['添加分类', 'color:#333333;background-color:#D8E6F1;'],
  452. }, function (value, index, elem) {
  453. var value = $.trim(value);
  454. if (value == '') {
  455. layer.msg('请输入分类名称', { anim: 6 });
  456. return false;
  457. }
  458. if (value.length > 6) {
  459. layer.msg('分类名称超长', { anim: 6 });
  460. return false;
  461. }
  462. $.post('{:url("video/addtype")}', {
  463. value: value
  464. }, function (res) {
  465. if (res.code == 0) {
  466. $('#type').append("<option selected value='" + res.data.id + "'>" + res.data.value + "</option>")
  467. form.render();
  468. layer.msg(res.msg, {
  469. anim: 0
  470. }, function () {
  471. layer.close(index); //再执行关闭
  472. });
  473. } else {
  474. layer.msg(res.msg, {
  475. anim: 6
  476. });
  477. }
  478. });
  479. });
  480. });
  481. //添加分类下的标签
  482. $('#addLabel').click(function () {
  483. var checktTypeId = $('#type').val();
  484. if (checktTypeId == '') {
  485. layer.msg('请先选择归属分类', { anim: 6 });
  486. return false;
  487. }
  488. layer.prompt({
  489. title: ['添加标签', 'color:#333333;background-color:#D8E6F1;'],
  490. }, function (value, index, elem) {
  491. var value = $.trim(value);
  492. if (value == '') {
  493. layer.msg('请输入标签名称', { anim: 6 });
  494. return false;
  495. }
  496. if (value.length > 6) {
  497. layer.msg('标签名称超长', { anim: 6 });
  498. return false;
  499. }
  500. $.post('{:url("video/addtype")}', {
  501. value: value, id: checktTypeId
  502. }, function (res) {
  503. if (res.code == 0) {
  504. $('#label').append("<option selected value='" + res.data.id + "'>" + res.data.value + "</option>")
  505. form.render();
  506. layer.msg(res.msg, {
  507. anim: 0
  508. }, function () {
  509. layer.close(index); //再执行关闭
  510. });
  511. } else {
  512. layer.msg(res.msg, {
  513. anim: 6
  514. });
  515. }
  516. });
  517. });
  518. });
  519. });
  520. </script>
  521. {/block}