dataParse.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div class="flex">
  3. <codeEditor class="params flex1" ref="mirrorRef" mode="" :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'" @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 mirrorRef = ref()
  45. onMounted(() => {
  46. content.value = props.script! || emptyFunction
  47. })
  48. async function saveCode() {
  49. const funStr = mirrorRef.value.getValue()
  50. if (funStr === '') {
  51. return toSave(funStr)
  52. }
  53. await validate()
  54. toSave(funStr)
  55. }
  56. function toSave(data: string) {
  57. api.product.script({
  58. key: route.params.id,
  59. scriptInfo: data
  60. }).then(() => {
  61. ElMessage.success('保存成功')
  62. emit('updateScript', data)
  63. })
  64. }
  65. function validate() {
  66. return new Promise((resolve, reject) => {
  67. const funStr = mirrorRef.value.getValue()
  68. const worker = new Worker('./worker.js');
  69. // 向 Worker 发送消息
  70. worker.postMessage({ type: 'validateFunctionString', functionString: funStr });
  71. // 监听 Worker 返回的消息
  72. worker.addEventListener('message', ({ data }) => {
  73. worker.terminate()
  74. if (data.isOk) return resolve(true)
  75. ElMessage.error(data.message)
  76. reject()
  77. });
  78. })
  79. }
  80. async function mock() {
  81. outputData.value = ''
  82. await validate()
  83. if (!inputData.value) return ElMessage.error('请输入参数')
  84. const funStr = mirrorRef.value.getValue()
  85. if (funStr === '') {
  86. return ElMessage.error('请先输入可执行脚本')
  87. }
  88. const worker = new Worker('./worker.js');
  89. // 向 Worker 发送消息
  90. worker.postMessage({ type: 'runFunction', functionString: funStr, functionName: functionName.value, params: inputData.value });
  91. // 监听 Worker 返回的消息
  92. worker.addEventListener('message', ({ data }) => {
  93. worker.terminate()
  94. if (data.isOk) {
  95. return outputData.value = typeof data.data === 'object' ? JSON.stringify(data.data, null, 2) : data.data
  96. }
  97. ElMessage.error(data.message)
  98. });
  99. }
  100. </script>
  101. <style lang="scss" scoped>
  102. :deep(.CodeMirror) {
  103. height: calc(100vh - 340px);
  104. }
  105. .input,
  106. .output {
  107. margin-top: 14px;
  108. :deep(.el-textarea__inner) {
  109. height: calc(50vh - 200px);
  110. }
  111. }
  112. </style>