index.html 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
  4. <style>
  5. a{
  6. color: #005980;
  7. }
  8. .widget-small{
  9. background-color: #FFFFFF;
  10. overflow: hidden;
  11. text-align: center;
  12. border-radius: 2px;
  13. box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);
  14. }
  15. .widget-small .fa{
  16. float: left;
  17. width: 40%;
  18. line-height: 80px;
  19. color: #FFFFFF;
  20. }
  21. .widget-user .fa{
  22. background-color: #029789;
  23. }
  24. .widget-visit .fa{
  25. background-color: #17a2b8;
  26. }
  27. .widget-message .fa{
  28. background-color: #fbad4c;
  29. }
  30. .widget-like .fa{
  31. background-color: #ff646d;
  32. }
  33. .widget-small-info{
  34. float: left;
  35. text-align: left;
  36. width: 40%;
  37. margin-left: 20px;
  38. margin-top: 18px;
  39. line-height: 24px;
  40. }
  41. .widget-small-info h4{
  42. font-size: 18px;
  43. }
  44. .widget-small-info span{
  45. font-size: 16px;
  46. }
  47. .project-introduce{
  48. min-height: 466px;
  49. }
  50. .project-introduce h4{
  51. font-weight: bold;
  52. margin-top: 12px;
  53. margin-bottom: 8px;
  54. }
  55. .project-introduce li{
  56. list-style: decimal;
  57. margin-left: 28px;
  58. }
  59. .alert {
  60. padding: 15px;
  61. margin-bottom: 10px;
  62. border: 1px solid transparent;
  63. border-radius: 4px;
  64. }
  65. .alert-info {
  66. color: #31708f;
  67. background-color: #d9edf7;
  68. border-color: #bce8f1;
  69. }
  70. </style>
  71. </head>
  72. <body class="timo-layout-page">
  73. <div class="layui-row layui-col-space15">
  74. <div class="layui-col-md4">
  75. <div class="layui-card">
  76. <div class="layui-card-body">
  77. <form id="form2">
  78. <div class="layui-form-item layui-form-text">
  79. <textarea id="myTextarea" placeholder="实时同步" class="layui-textarea" name="text"></textarea>
  80. </div>
  81. <div class="layui-form-item timo-finally">
  82. <button class="layui-btn button-submit2"><i class="fa fa-times-circle"></i> 清空</button>
  83. </div>
  84. </form>
  85. </div>
  86. </div>
  87. </div>
  88. <div class="layui-col-md4">
  89. <div class="layui-card">
  90. <div class="layui-card-body">
  91. <form id="form1">
  92. <div class="layui-form-item layui-form-text">
  93. <textarea id="myTextarea1" placeholder="请输入内容(enter 键发布, ctrl+enter 键换行)" class="layui-textarea" name="text"></textarea>
  94. </div>
  95. <div class="layui-form-item timo-finally">
  96. <button class="layui-btn button-submit"><i class="fa fa-check-circle"></i> 发布</button>
  97. <button class="layui-btn button-submit1"><i class="fa fa-times-circle"></i> 清空</button>
  98. </div>
  99. </form>
  100. </div>
  101. </div>
  102. </div>
  103. <div class="layui-col-md4">
  104. <div class="layui-card">
  105. <div class="layui-card-header">
  106. <span><i class="fa fa-table"></i> 状态时间线</span>
  107. </div>
  108. <div class="layui-card-body">
  109. <ul class="flow-default layui-timeline" id="LAY_demo1" style="height: 500px;overflow: auto">
  110. <!--<li id="li2" class="layui-timeline-item">
  111. <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
  112. <div class="layui-timeline-content layui-text">
  113. <h3 class="layui-timeline-title">v2.0.1</h3>
  114. <p>
  115. 1.更新:重命名菜单类型为:目录、菜单、按钮. 重写Shiro“记住我”系列化数据,减少cookie体积<br>
  116. </p>
  117. </div>
  118. </li>-->
  119. </ul>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. <script th:src="@{/js/plugins/jquery-3.4.1.min.js}" charset="utf-8"></script>
  125. <script th:src="@{/lib/echarts-4.7.0/echarts.js}" charset="utf-8"></script>
  126. <script type="text/javascript" th:inline="javascript">
  127. $(document).on("click", ".button-submit", function (e) {
  128. e.preventDefault();
  129. var form = $(this).parents("form");
  130. var url = form.attr("action");
  131. var serializeArray = form.serializeArray();
  132. var payload = serializeArray[0].value
  133. if (payload === '') {
  134. layer.msg('请输入内容', {offset: '15px', time: 5000, icon: 2});
  135. return
  136. }
  137. document.getElementById("form1").reset();
  138. var jsonData = {}
  139. jsonData.event = 'event_content'
  140. jsonData.payload = payload
  141. ws.send(JSON.stringify(jsonData))
  142. });
  143. $(document).on("click", ".button-submit1", function (e) {
  144. e.preventDefault();
  145. document.getElementById("form1").reset();
  146. });
  147. $(document).keypress(function(e) {
  148. if((e.which === 13 && e.ctrlKey) || (e.which === 10 && e.ctrlKey)){
  149. // 这里实现换行
  150. var content = $("#myTextarea1").val();
  151. $("#myTextarea1").val(content+"\n");
  152. }else if(e.which === 13){
  153. // 避免回车键换行
  154. e.preventDefault();
  155. var content = $("#myTextarea1").val();
  156. submitData(content)
  157. }
  158. });
  159. function submitData(content) {
  160. if (content === '') {
  161. layer.msg('请输入内容', {offset: '15px', time: 5000, icon: 2});
  162. return
  163. }
  164. document.getElementById("form1").reset();
  165. var jsonData = {}
  166. jsonData.event = 'event_content'
  167. jsonData.payload = content
  168. ws.send(JSON.stringify(jsonData))
  169. };
  170. document.getElementById("myTextarea").addEventListener("input", function() {
  171. const event = {}
  172. event.event = 'sync'
  173. event.payload = this.value
  174. ws.send(JSON.stringify(event))
  175. });
  176. $(document).on("click", ".button-submit2", function (e) {
  177. e.preventDefault();
  178. document.getElementById("form2").reset();
  179. });
  180. function add1(title, content) {
  181. var h3 = document.createElement("h3");
  182. h3.className = 'layui-timeline-title'
  183. h3.innerHTML = title
  184. var p = document.createElement("p");
  185. p.innerHTML = content
  186. var i = document.createElement("i");
  187. i.className = 'layui-icon layui-timeline-axis'
  188. i.innerHTML = '&#xe63f;'
  189. var div = document.createElement("div");
  190. div.className = 'layui-timeline-content layui-text'
  191. div.appendChild(h3)
  192. div.appendChild(p)
  193. var li = document.createElement("li");
  194. li.className = 'layui-timeline-item'
  195. li.appendChild(i)
  196. li.appendChild(div)
  197. var ul = document.getElementById("LAY_demo1");
  198. ul.prepend(li);
  199. }
  200. var connected = false
  201. var ws
  202. function initWebSocket() {
  203. if ("WebSocket" in window) {
  204. var host1 = window.location.host
  205. var url = 'wss://' + host1 + '/ws/message'
  206. ws = new WebSocket(url);
  207. ws.onopen = function() {
  208. connected = true
  209. // Web Socket 已连接上,使用 send() 方法发送数据
  210. console.log("websocket connected...");
  211. };
  212. ws.onclose = function() {
  213. connected = false
  214. console.log("websocket connection closed...");
  215. reconnect()
  216. };
  217. ws.onerror = function () {
  218. connected = false
  219. console.log("websocket connection error...");
  220. //reconnect()
  221. };
  222. ws.onmessage = function (evt) {
  223. var event = JSON.parse(evt.data)
  224. var eventType = event.event
  225. var title = new Date().getTime()
  226. add1(title, event.payload)
  227. //document.getElementById("myTextarea").value = evt.data
  228. }
  229. } else {
  230. // 浏览器不支持 WebSocket
  231. alert("您的浏览器不支持 WebSocket!");
  232. }
  233. }
  234. function reconnect() {
  235. if (connected) return
  236. setTimeout(function () {
  237. console.log('websocket reconnecting...')
  238. initWebSocket()
  239. }, 5000)
  240. }
  241. initWebSocket()
  242. </script>
  243. </body>
  244. </html>