avatar.html 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>{$site_info.site_name}</title>
  5. <meta name="keywords" content=""/>
  6. <meta name="description" content="">
  7. <include file="public@head"/>
  8. <link type="text/css" rel="stylesheet" href="__TMPL__/public/assets/simpleboot3/cropper/cropper.css" />
  9. <style type="text/css">
  10. .tab-content {
  11. overflow: visible;
  12. }
  13. .uploaded_avatar_area {
  14. margin-top: 20px;
  15. }
  16. .uploaded_avatar_btns {
  17. margin-top: 20px;
  18. }
  19. .uploaded_avatar_area .uploaded_avatar_btns {
  20. display: none;
  21. }
  22. /* avatarCropper */
  23. .avatarwrap, .avatar-Tools {
  24. width: 475px;
  25. height: 310px;
  26. margin: 20px 0 0 0;
  27. }
  28. .avatarwrap .avatar-cropper {
  29. float: left;
  30. width: 300px;
  31. height: 300px;
  32. border: 1px solid #3e4664;
  33. display: block;
  34. overflow: hidden;
  35. }
  36. .avatar-cropper img {
  37. max-width: 100%;
  38. }
  39. .avatarwrap .avatar-preview {
  40. float: left;
  41. width: 150px;
  42. margin: 0 0 0 22px;
  43. }
  44. .avatar-preview .UserPreview {
  45. width: 100%;
  46. margin: 0;
  47. }
  48. .UserPreview .img-preview {
  49. width: 150px;
  50. height: 150px;
  51. border: 1px solid #3e4664;
  52. margin: 0 0 20px 0;
  53. padding: 0;
  54. display: block;
  55. overflow: hidden;
  56. }
  57. .UserPreview .preview-md {
  58. width: 80px;
  59. height: 80px;
  60. }
  61. .UserPreview .preview-sm {
  62. width: 30px;
  63. height: 30px;
  64. margin: 0;
  65. }
  66. .avatar-Tools {
  67. margin: 0;
  68. height: auto;
  69. }
  70. .avatar-Tools .btn-group {
  71. margin: 0 0 5px 0;
  72. }
  73. .avatar-Tools .btnsave {
  74. margin: 1px 0 0 0;
  75. }
  76. .avatar-Tools>.btn-group>.btn {
  77. width: 75.5px;
  78. }
  79. </style>
  80. </head>
  81. <body class="body-white" id="top">
  82. <include file="public@nav"/>
  83. <div class="container tc-main">
  84. <div class="row">
  85. <div class="col-md-3">
  86. <include file="public@usernav"/>
  87. </div>
  88. <div class="col-md-9">
  89. <div class="tabs">
  90. <ul class="nav nav-tabs">
  91. <li class="active"><a href="#one" data-toggle="tab"><i class="fa fa-user"></i> 修改头像</a></li>
  92. </ul>
  93. <div class="tab-content">
  94. <div class="tab-pane active" id="one">
  95. <div class="avatarwrap">
  96. <div id="jqueryCropper" class="avatar-cropper">
  97. <img id="userAvatarImage" src="{:cmf_get_user_avatar_url($avatar)}">
  98. </div>
  99. <div class="avatar-preview">
  100. <div class="UserPreview">
  101. <div class="img-preview preview-lg"></div>
  102. <div class="img-preview preview-md"></div>
  103. <div class="img-preview preview-sm"></div>
  104. </div>
  105. </div>
  106. </div>
  107. <div class="avatar-Tools">
  108. <div class="btn-group">
  109. <button type="button" class="btn eventBtn" role="group" data-method="setDragMode" data-option="move" title="移动图片"><span class="fa fa-arrows"></span> 移动</button>
  110. <button type="button" class="btn eventBtn" role="group" data-method="setDragMode" data-option="crop" title="裁剪图片"><span class="fa fa-crop"></span> 裁剪</button>
  111. <button type="button" class="btn eventBtn" role="group" data-method="rotate" data-option="-10" title="向左旋转图片"><span class="fa fa-rotate-left"></span> 左旋</button>
  112. <button type="button" class="btn eventBtn" role="group" data-method="rotate" data-option="10" title="向又旋转图片"><span class="fa fa-rotate-right"></span> 右旋</button>
  113. </div>
  114. <div class="btn-group">
  115. <label class="btn btn-primary eventBtn" for="inputImage" title="打开图片">
  116. <input type="file" class="sr-only" id="inputImage" name="file" accept=".jpg,.jpeg,.png">
  117. <span class="fa fa-upload"></span> 上传
  118. </label>
  119. <button type="button" class="btn btn-primary eventBtn" role="group" data-method="reset" title="重置图片"><span class="fa fa-refresh"></span> 重置</button>
  120. </div>
  121. <button id="saveavatar" type="button" class="btn btn-success btn-lg btn-block btnsave eventBtn"><i class="fa fa-save"></i> 确认保存</button>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. <include file="public@footer"/>
  129. </div>
  130. <!-- /container -->
  131. <include file="public@scripts"/>
  132. <script src="__TMPL__/public/assets/simpleboot3/cropper/cropper.js"></script>
  133. <script src="__TMPL__/public/assets/simpleboot3/cropper/jquery-cropper.min.js"></script>
  134. <script src="__TMPL__/public/assets/simpleboot3/canvas-to-blob/canvas-to-blob.min.js"></script>
  135. <script type="text/javascript">
  136. // 初始化变量
  137. <php>$uploadedImageName = empty($avatar) ? '' : 'temp_image.jpg';</php>
  138. var nzc = $("#jqueryCropper");
  139. var nzi = $('#userAvatarImage');
  140. var n2i = $('#inputImage');
  141. var originalImageURL = n2i.attr('src');
  142. var uploadedImageName = '{$uploadedImageName}';
  143. var uploadedImageType = 'image/jpeg';
  144. var uploadedImageURL = '';
  145. var uploadedParams = {};
  146. var options = {
  147. aspectRatio: 1 / 1,
  148. preview: '.img-preview',
  149. viewMode: 2
  150. };
  151. // ready事件
  152. $(function(){
  153. // 监听工具栏按钮
  154. $('button[data-method]').on('click',function(){
  155. nzi.cropper($(this).data('method'), $(this).data('option'))
  156. })
  157. // 监听上传控件内容变更
  158. n2i.change(function () {
  159. var files = this.files;
  160. var file;
  161. if (!nzi.data('cropper')) {
  162. return;
  163. }
  164. if (files && files.length) {
  165. file = files[0];
  166. if (/^image\/\w+$/.test(file.type)) {
  167. uploadedImageName = file.name;
  168. uploadedImageType = file.type;
  169. if (uploadedImageURL) {
  170. URL.revokeObjectURL(uploadedImageURL);
  171. }
  172. uploadedImageURL = URL.createObjectURL(file);
  173. nzi.cropper('destroy').attr('src', uploadedImageURL).cropper(options);
  174. n2i.val('');
  175. } else {
  176. window.alert('Please choose an image file.');
  177. }
  178. }
  179. })
  180. // 监听保存
  181. $('#saveavatar').on('click',function (){
  182. // 禁用所有控件
  183. $('.eventBtn').prop('disabled', true);
  184. $('.btnsave').html('<i class="fa fa-spinner fa-pulse fa-fw"></i> 上传中');
  185. // 判断是否有数据
  186. let tmp_img = nzi.cropper('getCroppedCanvas',{width: 512,height: 512})
  187. if(!tmp_img) alert('请上传图片。');
  188. // 转blob上传
  189. tmp_img.toBlob(function (blob){
  190. // 创建form
  191. var formData = new FormData();
  192. formData.append('file', blob, uploadedImageName);
  193. // 禁用cropper
  194. nzi.cropper('disable')
  195. // ajax 上传
  196. Wind.use("noty", function () {
  197. $.ajax("{:cmf_url('user/Profile/avatarUpload')}", {
  198. method: "POST",
  199. data: formData,
  200. processData: false,
  201. contentType: false,
  202. success: function (e) {
  203. delay_url = e.url
  204. noty({text: e.msg,type: ((e.code == 0) ? 'error' : 'success'),layout: 'center'})
  205. $('.eventBtn').prop('disabled', false);
  206. $('.btnsave').html('<i class="fa fa-save"></i> 确认保存');
  207. nzi.cropper('enable')
  208. if(e.url != '') {
  209. setTimeout(function(){ window.location.href = e.url }, (e.wait-1)*1000)
  210. }
  211. console.log(e)
  212. },
  213. error: function (e) {
  214. noty({text: '网络连接失败。',type: 'error',layout: 'center'})
  215. $('.eventBtn').prop('disabled', false);
  216. $('.btnsave').html('<i class="fa fa-save"></i> 确认保存');
  217. nzi.cropper('enable')
  218. }
  219. })
  220. })
  221. }, "image/jpeg", 0.85);
  222. });
  223. // 初始化裁剪窗口
  224. nzi.cropper(options);
  225. })
  226. </script>
  227. </body>
  228. </html>