lock.html 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <!DOCTYPE html>
  2. <html lang="zh" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta th:content="${session.csrf_token}" name="csrf-token"/>
  7. <!--360浏览器优先以webkit内核解析-->
  8. <title>锁定屏幕</title>
  9. <link th:href="@{favicon.ico}" rel="shortcut icon"/>
  10. <link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
  11. <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
  12. <style>.lockscreen{background:#d2d6de;height:auto;}.lockscreen .lockscreen-name{text-align:center;font-weight:600;margin-top:50px;margin-bottom:30px;}.lockscreen-wrapper{max-width:400px;margin:10% auto;z-index:800;position:relative;}.lockscreen .lockscreen-name{text-align:center;font-weight:600;margin-top:50px;margin-bottom:30px;}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:150px}.lockscreen-time{width:100%;color:#fff;font-size:60px;display:inline-block;text-align:center;font-family:'Open Sans',sans-serif;font-weight:300;}</style>
  13. </head>
  14. <body class="lockscreen">
  15. <div class="lockscreen-wrapper">
  16. <div class="lockscreen-time"></div>
  17. <div class="lockscreen-name">[[ ${user.loginName} ]] / [[${#strings.defaultString(user.userName, '-')}]]</div>
  18. <div class="lockscreen-item">
  19. <div class="lockscreen-image">
  20. <img th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}" th:onerror="this.src='img/profile.jpg'" class="img-circle" alt="User Image">
  21. </div>
  22. <form class="lockscreen-credentials" method="post" action="#" onsubmit="return false;">
  23. <div class="input-group">
  24. <input type="password" name="password" autocomplete="off" class="form-control" placeholder="密码">
  25. <div class="input-group-btn">
  26. <button type="button" class="btn" onclick="unlock()"><i class="fa fa-arrow-right text-muted"></i></button>
  27. </div>
  28. </div>
  29. </form>
  30. </div>
  31. <div class="help-block text-center" style="margin-top: 50px;">系统锁屏,请输入密码登录!</div>
  32. <div class="text-center">
  33. <a th:href="@{logout}">退出重新登录</a>
  34. </div>
  35. </div>
  36. <script src="../static/js/jquery.min.js" th:src="@{/js/jquery.min.js}"></script>
  37. <script src="../static/js/bootstrap.min.js" th:src="@{/js/bootstrap.min.js}"></script>
  38. <script src="../static/js/three.min.js" th:src="@{/js/three.min.js}"></script>
  39. <script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
  40. <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
  41. </body>
  42. <script th:inline="javascript">
  43. var ctx = [[@{/}]];
  44. Date.prototype.format = function(fmt) {
  45. var o = {
  46. "M+" : this.getMonth()+1, //月份
  47. "d+" : this.getDate(), //日
  48. "h+" : this.getHours(), //小时
  49. "m+" : this.getMinutes(), //分
  50. "s+" : this.getSeconds(), //秒
  51. "q+" : Math.floor((this.getMonth()+3)/3), //季度
  52. "S" : this.getMilliseconds() //毫秒
  53. };
  54. if (/(y+)/.test(fmt)) {
  55. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  56. }
  57. for (var k in o) {
  58. if (new RegExp("(" + k + ")").test(fmt)) {
  59. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  60. }
  61. }
  62. return fmt;
  63. }
  64. $(function() {
  65. $('.lockscreen-time').text((new Date()).format('hh:mm:ss'));
  66. setInterval(function() {
  67. $('.lockscreen-time').text((new Date()).format('hh:mm:ss'));
  68. }, 500);
  69. init();
  70. animate();
  71. });
  72. $(document).keydown(function(event) {
  73. if (event.keyCode == 13) {
  74. unlock();
  75. }
  76. });
  77. function unlock() {
  78. var username = $("input[name='username']").val();
  79. var password = $("input[name='password']").val();
  80. if ($.common.isEmpty(password)) {
  81. $.modal.msg("请输入密码");
  82. return;
  83. }
  84. var index = "";
  85. var config = {
  86. url: ctx + "unlockscreen",
  87. type: "post",
  88. dataType: "json",
  89. data: { password: password },
  90. beforeSend: function(xhr) {
  91. var csrftoken = $('meta[name=csrf-token]').attr('content');
  92. xhr.setRequestHeader("csrf_token", csrftoken);
  93. index = layer.load(2, {shade: false});
  94. },
  95. success: function(result) {
  96. if (result.code == web_status.SUCCESS) {
  97. location.href = ctx + 'index';
  98. } else {
  99. $.modal.msg(result.msg);
  100. $("input[name='password']").val("");
  101. }
  102. layer.close(index);
  103. }
  104. };
  105. $.ajax(config);
  106. };
  107. var container;
  108. var camera, scene, projector, renderer;
  109. var PI2 = Math.PI * 2;
  110. var programFill = function(context) {
  111. context.beginPath();
  112. context.arc(0, 0, 1, 0, PI2, true);
  113. context.closePath();
  114. context.fill();
  115. };
  116. var programStroke = function(context) {
  117. context.lineWidth = 0.05;
  118. context.beginPath();
  119. context.arc(0, 0, 1, 0, PI2, true);
  120. context.closePath();
  121. context.stroke();
  122. };
  123. var mouse = { x: 0, y: 0 }, INTERSECTED;
  124. function init() {
  125. container = document.createElement('div');
  126. container.id = 'bgc';
  127. container.style.position = 'absolute';
  128. container.style.zIndex = '0';
  129. container.style.top = '0px';
  130. $(".lockscreen-wrapper").before(container);
  131. camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 10000);
  132. camera.position.set(0, 300, 500);
  133. scene = new THREE.Scene();
  134. for (var i = 0; i < 100; i++) {
  135. var particle = new THREE.Particle(new THREE.ParticleCanvasMaterial({ color: Math.random() * 0x808080 + 0x808080, program: programStroke }));
  136. particle.position.x = Math.random() * 800 - 400;
  137. particle.position.y = Math.random() * 800 - 400;
  138. particle.position.z = Math.random() * 800 - 400;
  139. particle.scale.x = particle.scale.y = Math.random() * 10 + 10;
  140. scene.add(particle);
  141. }
  142. projector = new THREE.Projector();
  143. renderer = new THREE.CanvasRenderer();
  144. renderer.setSize(window.innerWidth, window.innerHeight - 10);
  145. container.appendChild(renderer.domElement);
  146. document.addEventListener('mousemove', onDocumentMouseMove, false);
  147. window.addEventListener('resize', onWindowResize, false);
  148. };
  149. function onWindowResize() {
  150. camera.aspect = window.innerWidth / window.innerHeight;
  151. camera.updateProjectionMatrix();
  152. renderer.setSize(window.innerWidth, window.innerHeight - 10);
  153. };
  154. function onDocumentMouseMove(event) {
  155. event.preventDefault();
  156. mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  157. mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  158. };
  159. function animate() {
  160. requestAnimationFrame(animate);
  161. render();
  162. };
  163. var radius = 600;
  164. var theta = 0;
  165. function render() {
  166. theta += 0.2;
  167. camera.position.x = radius * Math.sin(theta * Math.PI / 360);
  168. camera.position.y = radius * Math.sin(theta * Math.PI / 360);
  169. camera.position.z = radius * Math.cos(theta * Math.PI / 360);
  170. camera.lookAt(scene.position);
  171. camera.updateMatrixWorld();
  172. var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5);
  173. projector.unprojectVector(vector, camera);
  174. var ray = new THREE.Ray(camera.position, vector.subSelf(camera.position).normalize());
  175. var intersects = ray.intersectObjects(scene.children);
  176. if (intersects.length > 0) {
  177. if (INTERSECTED != intersects[0].object) {
  178. if (INTERSECTED) INTERSECTED.material.program = programStroke;
  179. INTERSECTED = intersects[0].object;
  180. INTERSECTED.material.program = programFill;
  181. }
  182. } else {
  183. if (INTERSECTED) INTERSECTED.material.program = programStroke;
  184. INTERSECTED = null;
  185. }
  186. renderer.render(scene, camera);
  187. }
  188. </script>
  189. </html>