dataParse.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <div class="flex" style="align-items: stretch;">
  3. <codeEditor class="params flex1" ref="mirrorRef" style="height: calc(100vh - 340px)" mode="application/json" :content="content"></codeEditor>
  4. <div class="mock" style="width: 300px;margin-left: 20px;">
  5. <el-radio-group v-model="functionName">
  6. <el-radio-button label="parse">parse</el-radio-button>
  7. <el-radio-button label="send">send</el-radio-button>
  8. </el-radio-group>
  9. <el-input class="input" v-model="inputData" type="textarea" placeholder="请输入入参,以字符串的方式,如果是对象字符串会在执行时自动转换为对象再执行"></el-input>
  10. <el-input class="input" v-model="outputData" type="textarea" readonly placeholder="此处显示执行结果"></el-input>
  11. </div>
  12. </div>
  13. <el-button type="primary" style="margin-top:20px" v-auth="'save'" @click="saveCode">保存脚本</el-button>
  14. <el-button type="primary" style="margin-top:20px" v-auth="'debug'" :loading="runing" @click="mock">调试</el-button>
  15. </template>
  16. <script lang="ts" setup>
  17. import { onMounted, ref } from 'vue';
  18. import codeEditor from '/@/components/codeEditor/index.vue'
  19. import { ElMessage } from 'element-plus';
  20. import api from '/@/api/device';
  21. import { useRoute } from 'vue-router';
  22. const emptyFunction = `
  23. // 下面是预制的空的方法,请不要修改函数名称,直接在内部编写函数即可
  24. // 此处是设备功能调用应答数据解析
  25. function parse (data) {
  26. // 此处编写对数据的处理
  27. return data
  28. }
  29. // 此处是设备功能调用发送数据解析
  30. function send (data) {
  31. // 此处编写对数据的处理
  32. return data
  33. }
  34. `
  35. const route = useRoute();
  36. const emit = defineEmits(['updateScript'])
  37. const props = defineProps({
  38. script: String
  39. })
  40. const inputData = ref('')
  41. const outputData = ref('')
  42. const content = ref('')
  43. const functionName = ref('parse')
  44. const runing = ref(false)
  45. const mirrorRef = ref()
  46. onMounted(() => {
  47. content.value = props.script! || emptyFunction
  48. })
  49. async function saveCode() {
  50. const funStr = mirrorRef.value.getValue()
  51. if (funStr === '') {
  52. return toSave(funStr)
  53. }
  54. await validate()
  55. toSave(funStr)
  56. }
  57. function toSave(data: string) {
  58. api.product.script({
  59. key: route.params.id,
  60. scriptInfo: data
  61. }).then(() => {
  62. ElMessage.success('保存成功')
  63. emit('updateScript', data)
  64. })
  65. }
  66. function validate() {
  67. return new Promise((resolve, reject) => {
  68. const funStr = mirrorRef.value.getValue()
  69. const worker = new Worker('./worker.js');
  70. // 向 Worker 发送消息
  71. worker.postMessage({ type: 'validateFunctionString', functionString: funStr });
  72. // 监听 Worker 返回的消息
  73. worker.addEventListener('message', ({ data }) => {
  74. worker.terminate()
  75. if (data.isOk) return resolve(true)
  76. ElMessage.error(data.message)
  77. reject()
  78. });
  79. })
  80. }
  81. async function mock() {
  82. outputData.value = ''
  83. await validate()
  84. if (!inputData.value) return ElMessage.error('请输入参数')
  85. const funStr = mirrorRef.value.getValue()
  86. if (funStr === '') {
  87. return ElMessage.error('请先输入可执行脚本')
  88. }
  89. // 远程调试
  90. runing.value = true
  91. api.product.scriptRun({
  92. functionName: functionName.value,
  93. scriptInfo: funStr,
  94. jsonData: inputData.value,
  95. }).then((res: any) => {
  96. // outputData.value = typeof res.data === 'object' ? JSON.stringify(res.data, null, 2) : res.data
  97. outputData.value = res.data
  98. }).finally(() => {
  99. runing.value = false
  100. })
  101. // 本地调试
  102. // const worker = new Worker('./worker.js');
  103. // // 向 Worker 发送消息
  104. // worker.postMessage({ type: 'runFunction', functionString: funStr, functionName: functionName.value, params: inputData.value });
  105. // // 监听 Worker 返回的消息
  106. // worker.addEventListener('message', ({ data }) => {
  107. // worker.terminate()
  108. // if (data.isOk) {
  109. // return outputData.value = typeof data.data === 'object' ? JSON.stringify(data.data, null, 2) : data.data
  110. // }
  111. // ElMessage.error(data.message)
  112. // });
  113. }
  114. </script>
  115. <style lang="scss" scoped>
  116. :deep(.CodeMirror) {
  117. height: calc(100vh - 340px);
  118. }
  119. .input,
  120. .output {
  121. margin-top: 14px;
  122. :deep(.el-textarea__inner) {
  123. height: calc(50vh - 200px);
  124. }
  125. }
  126. </style>