userinfo.html 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
  4. </head>
  5. <body>
  6. <div class="layui-form timo-compile user-info-page">
  7. <div class="user-info">
  8. <div class="user-avatar-box">
  9. <img class="user-avatar" th:src="@{${user.avatarUrl}}" alt="头像">
  10. <span class="edit-avatar" th:attr="data-url=@{/rbac/user/avatar}">修改头像</span>
  11. </div>
  12. <ul class="detail-info">
  13. <li>账号:<span th:text="${user.username}" th:title="${user.username}"></span></li>
  14. <li>昵称:<span th:text="${user.screenName}" th:title="${user.screenName}"></span></li>
  15. <li>电话:<span th:text="${user.mobile}" th:title="${user.mobile}"></span></li>
  16. </ul>
  17. </div>
  18. <form class="user-edit" th:action="@{/rbac/user/update}">
  19. <input type="hidden" name="userId" th:value="${user.id}"/>
  20. <div class="layui-form-item">
  21. <label class="layui-form-label">显示名</label>
  22. <div class="layui-input-inline">
  23. <input class="layui-input" type="text" name="screenName" placeholder="请输入用户昵称" th:value="${user.screenName}">
  24. </div>
  25. </div>
  26. <div class="layui-form-item">
  27. <label class="layui-form-label">手机号</label>
  28. <div class="layui-input-inline">
  29. <input class="layui-input" type="text" name="mobile" placeholder="请输入电话号码" th:value="${user.mobile}">
  30. </div>
  31. </div>
  32. <!--<div class="layui-form-item">
  33. <label class="layui-form-label">邮箱</label>
  34. <div class="layui-input-inline">
  35. <input class="layui-input" type="text" name="email" placeholder="请输入邮箱" th:value="${user.email}">
  36. </div>
  37. </div>-->
  38. <!--<div class="layui-form-item">
  39. <label class="layui-form-label">选择性别</label>
  40. <div class="layui-input-inline">
  41. <input type="radio" name="gender" value="0" title="女" checked><div class="layui-unselect layui-form-radio layui-form-radioed"><i class="layui-anim layui-icon"></i><div>男</div></div>
  42. <input type="radio" name="gender" value="1" title="男" th:checked="${user.gender} eq 1"><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div>女</div></div>
  43. <input type="radio" name="gender" value="2" title="未知" th:checked="${user.gender} eq 2"><div class="layui-unselect layui-form-radio"><i class="layui-anim layui-icon"></i><div>未知</div></div>
  44. </div>
  45. </div>-->
  46. <div class="layui-form-item timo-finally">
  47. <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
  48. <a class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</a>
  49. </div>
  50. </form>
  51. <!-- 编辑头像面板 -->
  52. <div class="canvas-panel">
  53. <img class="canvas-bg"/>
  54. <div class="canvas-shade"></div>
  55. <canvas class="canvas-crop"></canvas>
  56. </div>
  57. <div class="canvas-group layui-btn-group">
  58. <button class="upload-close layui-btn layui-btn-primary layui-btn-sm">取消</button>
  59. <button class="upload-btn layui-btn layui-btn-primary layui-btn-sm">保存</button>
  60. </div>
  61. </div>
  62. <script th:replace="/common/template :: script"></script>
  63. <script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
  64. <script type="text/javascript" th:src="@{/js/plugins/jquery.mousewheel.min.js}"></script>
  65. <script>
  66. layui.use(['jquery','upload'], function () {
  67. var $ = layui.jquery;
  68. var upload = layui.upload;
  69. $(".user-edit").on("mousedown", function () {
  70. $(this).css("opacity", 1);
  71. });
  72. /* 修改头像 */
  73. var image = new Image();
  74. var panel = $(".canvas-panel");
  75. var bgImg = $(".canvas-bg");
  76. var canvas = $(".canvas-crop");
  77. // 激活或停止移动
  78. var moveEvent = false;
  79. var screenX = 0, screenY = 0;
  80. var moveTop = 0, moveLeft = 0;
  81. panel.on("mousedown",function (e) {
  82. screenX = e.screenX;
  83. screenY = e.screenY;
  84. moveTop = parseFloat(bgImg.css("top"));
  85. moveLeft = parseFloat(bgImg.css("left"));
  86. moveEvent = true;
  87. });
  88. panel.on("mouseup",function (e) {
  89. moveEvent = false;
  90. });
  91. panel.on("mousemove", function (e) {
  92. if (moveEvent){
  93. bgImg.css("left", moveLeft + e.screenX - screenX);
  94. bgImg.css("top", moveTop + e.screenY - screenY);
  95. renderPanel();
  96. }
  97. });
  98. panel.on("mousewheel", function(event, delta) {
  99. var dir = delta > 0 ? 'Up' : 'Down';
  100. var width = parseFloat(bgImg.css("width"));
  101. var height = parseFloat(bgImg.css("height"));
  102. if (dir == 'Up') {
  103. delta = 1;
  104. } else {
  105. delta = -1;
  106. }
  107. bgImg.css("width", width * (1 + 0.1 * delta));
  108. bgImg.css("height", height * (1 + 0.1 * delta));
  109. bgImg.css("left", parseFloat(bgImg.css("left")) - (width * 0.1 / 2) * delta);
  110. bgImg.css("top", parseFloat(bgImg.css("top")) - (height * 0.1 / 2) * delta);
  111. renderPanel();
  112. return false;
  113. });
  114. // 渲染画布面板
  115. function renderPanel() {
  116. canvas[0].width = 256;
  117. canvas[0].height = 256;
  118. var imgScale = image.width / bgImg.width();
  119. var context = canvas[0].getContext('2d');
  120. var sx = (bgImg.width() * imgScale / 2 ) - canvas.width() / 2 * imgScale,
  121. sy = (bgImg.height() * imgScale / 2) - canvas.height() / 2 * imgScale,
  122. sw = canvas.width() * imgScale, sh = canvas.height() * imgScale;
  123. var moveX = panel.width() / 2 - parseFloat(bgImg.css("left")) - bgImg.width() / 2;
  124. var moveY = panel.height() / 2 - parseFloat(bgImg.css("top")) - bgImg.height() / 2;
  125. context.drawImage(image, sx + moveX * imgScale, sy + moveY * imgScale, sw, sh, 0, 0, canvas[0].width, canvas[0].height);
  126. }
  127. var files = [];
  128. var uploadInst = upload.render({
  129. elem: '.edit-avatar'
  130. ,field: 'picture'
  131. ,url: $('.edit-avatar').data('url')
  132. ,exts: 'jpg|png|gif|jpeg'
  133. ,auto: false
  134. ,bindAction: ".upload-btn"
  135. // 选择文件回调
  136. ,choose: function(obj){
  137. obj.preview(function(index, file, result){
  138. panel.show();
  139. $(".canvas-group").show();
  140. image.src = result;
  141. image.onload = function(){
  142. bgImg.attr("src", result);
  143. if(bgImg.width() >= bgImg.height()){
  144. bgImg.css("height", canvas.width());
  145. }else {
  146. bgImg.css("width", canvas.height());
  147. }
  148. bgImg.css("top", (panel.height() - bgImg.height()) / 2);
  149. bgImg.css("left", (panel.width() - bgImg.width()) / 2);
  150. renderPanel();
  151. }
  152. });
  153. }
  154. ,before: function(obj){
  155. files = obj.pushFile();
  156. var index, file;
  157. for(index in files) {
  158. file = files[index];
  159. }
  160. var dataurl = canvas[0].toDataURL(file.type, 0.92);
  161. var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
  162. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  163. while(n--){
  164. u8arr[n] = bstr.charCodeAt(n);
  165. }
  166. files[index] = new File([u8arr], file.name, {type:mime});
  167. }
  168. ,done: function(res, index){
  169. if(res.code === 0){
  170. panel.hide();
  171. $(".canvas-group").hide();
  172. layer.msg("修改头像成功", {offset: '15px', time: 3000, icon: 1});
  173. $(".user-avatar").attr("src", canvas[0].toDataURL());
  174. delete files[index];
  175. }else {
  176. layer.msg(res.msg, {offset: '15px', time: 3000, icon: 2});
  177. }
  178. }
  179. });
  180. // 关闭裁切面板及清空文件
  181. $(".upload-close").on("click", function () {
  182. panel.hide();
  183. $(".canvas-group").hide();
  184. });
  185. });
  186. </script>
  187. </body>
  188. </html>