You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
6.6 KiB

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>TMP</title>
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <script src="./vue.global.js"></script>
  7. <script src="./dayjs/dayjs.min.js"></script>
  8. <script src="./dayjs/plugin/customParseFormat.js"></script>
  9. <script src="./dayjs/plugin/weekday.js"></script>
  10. <script src="./dayjs/plugin/localeData.js"></script>
  11. <script src="./dayjs/plugin/weekOfYear.js"></script>
  12. <script src="./dayjs/plugin/weekYear.js"></script>
  13. <script src="./dayjs/plugin/advancedFormat.js"></script>
  14. <script src="./dayjs/plugin/quarterOfYear.js"></script>
  15. <script src="./ant-design-vue/antd.min.js"></script>
  16. <link href="./ant-design-vue/reset.min.css" rel="stylesheet">
  17. </head>
  18. <body>
  19. <div id="app" class="h-full">
  20. <a-row class="h-full">
  21. <a-col :span="6">
  22. <div style="display:flex;padding:5px;">
  23. <a-input v-model:value="wsUrl" style="margin-right:5px;"></a-input>
  24. <a-button v-if="null === ws" @click="actionConnect">Connect</a-button>
  25. <a-button v-else @click="actionDisconnect">DisConnect</a-button>
  26. </div>
  27. <a-menu mode="inline" :items="actionMenuItems" @click="actionGroupMenuItemClick"></a-menu>
  28. </a-col>
  29. <a-col :span="12" style="background-color: #f1f1f1;display:flex;flex-direction: column;">
  30. <div v-if="null !== actionActiveGroup"
  31. style="height:0;flex-grow: 1;overflow-y: auto;margin-bottom: 10px;padding: 10px;">
  32. <div v-for="item in actionActiveGroup.items" class="action" style="margin-bottom: 5px;">
  33. <div style="margin-right:5px;">
  34. <a-input :value="item.fnName" disabled />
  35. </div>
  36. <div v-for="param in item.params">
  37. <a-input v-model:value="item.values[param]" :placeholder="param" />
  38. </div>
  39. <a-button style="margin-left:5px;" @click="actionActionExecute(item)">DOIT</a-button>
  40. </div>
  41. </div>
  42. <div style="padding:10px;">
  43. <a-textarea v-model:value="rawRequestContent" style="margin-bottom: 5px;"></a-textarea>
  44. <div>
  45. <a-button @click="actionSendRawRequest">Send</a-button>
  46. </div>
  47. </div>
  48. </a-col>
  49. <a-col :span="6" style="overflow-y: auto;height: 100%;">
  50. <a-collapse v-model:activeKey="activeKey">
  51. <a-collapse-panel v-for="(entry,index) in logs" :key="index" :header="entry.title">
  52. <div style="white-space: pre-wrap;">
  53. {{entry.content}}
  54. </div>
  55. </a-collapse-panel>
  56. </a-collapse>
  57. </a-col>
  58. </a-row>
  59. </div>
  60. <script>
  61. const { createApp } = Vue
  62. createApp({
  63. data() {
  64. return {
  65. actions: [],
  66. actionActiveGroup: null,
  67. rawRequestContent: '',
  68. logs: [],
  69. wsUrl: "ws://" + window.location.hostname + ":19001",
  70. ws: null,
  71. wsMessageIndex: 0,
  72. requests: {},
  73. }
  74. },
  75. computed: {
  76. actionMenuItems() {
  77. return this.actions.map(i => ({ key: i.key, label: i.key }));
  78. }
  79. },
  80. methods: {
  81. // connect
  82. actionConnect() {
  83. this.ws = new WebSocket(this.wsUrl);
  84. this.ws.onclose = () => this.ws = null;
  85. this.ws.onmessage = event => {
  86. let data = JSON.parse(event.data);
  87. let responseEntry = {};
  88. responseEntry.title = `${data.messageType}`;
  89. responseEntry.content = JSON.stringify(data, null, 2);
  90. this.logs.push(responseEntry);
  91. if ('Ack' === data.messageType && 'FNScheduler' === data.fromClass && 'geFnList' === data.fromFn) {
  92. this.actionListReload(data);
  93. }
  94. };
  95. this.ws.onopen = () => {
  96. this.wsMessageIndex++;
  97. let request = {};
  98. request.messageId = this.wsMessageIndex;
  99. request.timeStamp = Math.floor(Date.now() / 1000);
  100. request.messageType = 'Command';
  101. request.className = 'FNScheduler';
  102. request.fnName = 'geFnList';
  103. request.params = {};
  104. this.wsCall(request);
  105. }
  106. },
  107. // disconnect
  108. actionDisconnect() {
  109. this.ws.close();
  110. },
  111. // action list reload
  112. actionListReload(response) {
  113. let data = response.rely;
  114. if (undefined === data) {
  115. return;
  116. }
  117. this.actions = [];
  118. for (let action of data.fnlist) {
  119. let group = this.actions.find(i => i.key === action.className);
  120. if (undefined === group) {
  121. group = { key: action.className, items: [] };
  122. this.actions.push(group);
  123. }
  124. item = structuredClone(action);
  125. item.values = {};
  126. group.items.push(item);
  127. }
  128. },
  129. // action group menu item click
  130. actionGroupMenuItemClick(event) {
  131. this.actionActiveGroup = this.actions.find(i => i.key === event.key);
  132. },
  133. // action execute
  134. actionActionExecute(item) {
  135. this.wsMessageIndex++;
  136. let request = {};
  137. request.messageId = this.wsMessageIndex;
  138. request.timeStamp = Math.floor(Date.now() / 1000);
  139. request.messageType = 'Command';
  140. request.className = item.className;
  141. request.fnName = item.fnName;
  142. request.params = {};
  143. for (let i = 0; i < item.params.length; i++) {
  144. let param = item.params[i];
  145. let type = item.paramsTypeInfo[i];
  146. let value = item.values[param];
  147. switch (type) {
  148. case 'int32_t': value *= 1; break;
  149. case 'string': /* nothing to do here */ break;
  150. default: /* throw an exception is required. */
  151. }
  152. request.params[param] = value;
  153. }
  154. this.wsCall(request);
  155. },
  156. // raw request send
  157. actionSendRawRequest() {
  158. let request = JSON.parse(this.rawRequestContent);
  159. this.wsCall(request);
  160. },
  161. // ws call
  162. wsCall(request) {
  163. if (null === this.ws) {
  164. return;
  165. }
  166. let requestEntry = {};
  167. requestEntry.title = `${request.messageType} : ${request.className}.${request.fnName}`;
  168. requestEntry.content = JSON.stringify(request, null, 2);
  169. this.logs.push(requestEntry);
  170. this.ws.send(JSON.stringify(request));
  171. },
  172. },
  173. })
  174. .use(antd)
  175. .mount('#app');
  176. </script>
  177. <style>
  178. .h-full {
  179. height: 100%;
  180. }
  181. .action {
  182. display: flex;
  183. flex-direction: row;
  184. }
  185. </style>
  186. </body>
  187. </html>