edit.blade.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. @extends('admin.public.base')
  2. @section('body_class')
  3. style="margin: 0 auto;width: 96%;padding: 30px 0px;"
  4. @endsection
  5. @section('content')
  6. <form class="post-form" action="" method="post">
  7. <div class="form-group col-sm-2">
  8. <label class="control-label">课程配图</label>
  9. <div id="thumb">
  10. <a id="thumb-image" href="#" data-toggle="image" class="img-thumb">
  11. <img src="{{path_compat($oldData['thumb'])}}" height="100" />
  12. </a>
  13. <input type="hidden" name="thumb" value="{{$oldData['thumb']}}" id="input-image" />
  14. </div>
  15. </div>
  16. <div class="form-group col-sm-2">
  17. <label class="control-label">课程视频 [720P]</label>
  18. <div id="video_src">
  19. <a id="video_upload" href="javascript:;" class="img-thumb" >
  20. <video src="{{$oldData['video_src']}}" poster="{{$oldData['video_src'] ? path_compat($oldData['thumb']) : path_compat('')}}" height="100" width="100" ></video>
  21. </a>
  22. <input type="hidden" name="video_src" value="{{$oldData['video_src']}}" />
  23. </div>
  24. </div>
  25. <div class="form-group col-sm-4">
  26. <label class="control-label">课程名称</label>
  27. <input class="form-control" required="required" type="text" placeholder="课程名称" maxlength="40" name="name" value="{{$oldData['name']}}" />
  28. </div>
  29. <div class="form-group col-sm-2">
  30. <label class="control-label">课程类型</label>
  31. <select class="form-control" name="type_id" required="required">
  32. @foreach ($typeList as $value)
  33. <option value="{{$value['id']}}" @if( $value['id'] == $oldData['type_id']) selected @endif >{{$value['name']}}</option>
  34. @endforeach
  35. </select>
  36. </div>
  37. <div class="form-group col-sm-2">
  38. <label class="control-label">课程客服</label>
  39. <select class="form-control" name="service_id" >
  40. @foreach ($serviceList as $value)
  41. <option value="{{$value['id']}}" @if( $value['id'] == $oldData['service_id']) selected @endif >{{$value['name']}}</option>
  42. @endforeach
  43. </select>
  44. </div>
  45. <div class="form-group col-sm-4">
  46. <label class="control-label">开始时间</label>
  47. <input class="form-control" required="required" type="datetime-local" placeholder="开始时间" name="start_time" value="{{date('Y-m-d H:i',$oldData['start_time'])}}" />
  48. </div>
  49. <div class="form-group col-sm-4">
  50. <label class="control-label">结束时间</label>
  51. <input class="form-control" required="required" type="datetime-local" placeholder="结束时间" name="end_time" value="{{date('Y-m-d H:i',$oldData['end_time'])}}" />
  52. </div>
  53. <div class="form-group col-sm-12">
  54. <label class="control-label">课程内容</label>
  55. <textarea required="required" id="container" name="content" placeholder="课程内容" >{{$oldData['content']}}</textarea>
  56. </div>
  57. <div class="form-group col-sm-12">
  58. @csrf
  59. <input type="hidden" name="id" value="{{$oldData['id']}}" />
  60. <input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
  61. </div>
  62. </form>
  63. @endsection
  64. @section('javascript')
  65. <script src="/static/ueditor/ueditor.config.js"></script>
  66. <script src="/static/ueditor/ueditor.all.js"></script>
  67. <script type="text/javascript">
  68. var editor = new UE.ui.Editor();
  69. editor.render("container");
  70. </script>
  71. <script type="text/javascript">
  72. $('#video_upload').on('click', function() {
  73. // 定义预签名URL
  74. var signedUrl = '';
  75. var videoSrc = '';
  76. // 请求接口获取签名URL
  77. $.ajax({
  78. url: "{{url('admin/video_course/get_sign_url')}}",
  79. type: 'get',
  80. dataType: 'json',
  81. success: function(data) {
  82. // 判断返回值
  83. if(data.code != 'success'){
  84. art.dialog({content: data.msg,lock: true,ok: function() {}});
  85. return ;
  86. }
  87. // 获取签名URL
  88. signedUrl = data.data.sign_url;
  89. videoSrc = data.data.video_src;
  90. // 没有获取到结果的话,结束
  91. if( !signedUrl ) {
  92. return;
  93. }
  94. // 移除之前上传的表单
  95. $('#form-upload').remove();
  96. // 生成一个表单,并且使用CSRF
  97. $('body').prepend('<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input osctype="btn_upload_file" id="form-upload-file" type="file" name="file" /> @csrf </form>');
  98. $('#form-upload input[name=\'file\']').trigger('click');
  99. },
  100. error: function(xhr, status, error) {
  101. console.error('Error:', error);
  102. }
  103. });
  104. // 上传文件
  105. $(document).off('change', '#form-upload-file').on('change','#form-upload-file',function(){
  106. // 获取文件
  107. const fileInput = document.getElementById('form-upload-file');
  108. const file = fileInput.files[0];
  109. // 如果没有上传文件
  110. if ( !file ) {
  111. art.dialog({content: '请上传文件',lock: true,ok: function() {}});
  112. return ;
  113. }
  114. // // 如果没有上传文件
  115. // if ( file.size >= 524288000 ) {
  116. // art.dialog({content: '上传视频不允许大于500MB',lock: true,ok: function() {}});
  117. // return ;
  118. // }
  119. const result = checkVideoResolution(file);
  120. result.then(function($re){
  121. if( !$re ){
  122. art.dialog({content: '上传视频不允许大于1280*720',lock: true,ok: function() {}});
  123. return ;
  124. }
  125. // 调用上传
  126. upload(file, signedUrl);
  127. });
  128. return ;
  129. })
  130. const checkVideoResolution = (file) => {
  131. return new Promise((resolve, reject) => {
  132. const video = document.createElement('video',{}); // 创建一个临时的video元素
  133. const url = URL.createObjectURL(file); // 创建一个指向文件的URL
  134. video.src = url; // 设置video元素的源为文件URL
  135. video.muted = true; // 静音视频,避免自动播放问题
  136. // 等待元数据加载完成
  137. video.onloadedmetadata = function (){ // 等待元数据加载完成
  138. URL.revokeObjectURL(url); // 释放URL对象
  139. if (video.videoWidth > 1280 || video.videoHeight > 720) {
  140. video.remove();
  141. resolve(false);
  142. } else {
  143. video.remove();
  144. resolve(true);
  145. }
  146. };
  147. })
  148. }
  149. const upload = async (file, presignedUrl) => {
  150. // 提示上传中
  151. art.dialog({id:'loading',lock: true,title:'视频上传中'});
  152. // 上传文件
  153. const response = await fetch(presignedUrl, {method: 'PUT',body: file.slice(0, file.size)});
  154. // 移除loading
  155. art.dialog.list['loading'].close();
  156. // 结果
  157. if (!response.ok) {
  158. art.dialog({content: '上传失败',lock: true,ok: function() {}});
  159. return ;
  160. }
  161. // 显示上传成功的图片
  162. $('#video_upload').html('<video src="'+videoSrc+'" height="100" width="100" ></video>');
  163. $('#video_src input').val(videoSrc);
  164. };
  165. });
  166. </script>
  167. @endsection