blockly.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <div class="ablockly">
  3. <el-button type="primary" @click="go" class="btnPosition">下一步</el-button>
  4. <div id="blocklyDiv"></div>
  5. <xml id="toolbox" style="display: none">
  6. <category name="逻辑" colour="%{BKY_LOGIC_HUE}">
  7. <block type="controls_if"></block>
  8. <block type="logic_compare"></block>
  9. <block type="logic_operation"></block>
  10. <block type="logic_negate"></block>
  11. <block type="logic_boolean"></block>
  12. </category>
  13. <sep></sep>
  14. <category id="catIOTScreen" name="屏幕" colour="#5cb2d6">
  15. <block type="iot_lcd_screeninit"></block>
  16. </category>
  17. <sep></sep>
  18. <category id="cat" name="人脸识别" colour="#ee783a">
  19. <block type="iot_lcd_faceinit"></block>
  20. </category>
  21. </xml>
  22. </div>
  23. </template>
  24. <style scoped>
  25. .ablockly,
  26. #blocklyDiv {
  27. width: 100%;
  28. height: 100%;
  29. }
  30. .btnPosition {
  31. position: fixed;
  32. right: 130px;
  33. bottom: 35px;
  34. z-index: 999999;
  35. }
  36. </style>
  37. <script>
  38. // 引入Blockly
  39. import Blockly from "blockly";
  40. // 引入想要转换的语言,语言有php python dart lua javascript
  41. import * as JavaScript from "blockly/javascript";
  42. import * as Blocks from "blockly/blocks";
  43. // 引入语言包并使用
  44. import * as hans from "blockly/msg/zh-hans";
  45. Blockly.setLocale(hans);
  46. //引入媒体文件:我是在github上下载的blockly源码,将源码中的media文件放入我项目中的public文件夹下
  47. //忽略被vue错认为组件的blockly中的标签,不止以下这些,请发现一个忽略一个
  48. import Vue from "vue";
  49. Vue.config.ignoredElements.push("xml");
  50. Vue.config.ignoredElements.push("block");
  51. Vue.config.ignoredElements.push("field");
  52. Vue.config.ignoredElements.push("category");
  53. Vue.config.ignoredElements.push("sep");
  54. Vue.config.ignoredElements.push("value");
  55. Vue.config.ignoredElements.push("statement");
  56. Vue.config.ignoredElements.push("mutation");
  57. export default {
  58. data() {
  59. return {
  60. that: this,
  61. };
  62. },
  63. methods: {
  64. // 代码生成器
  65. myUpdateFunction(event) {
  66. var code = Blockly.JavaScript.workspaceToCode(this.workspace);
  67. },
  68. // 获取blockly工作区中的code和xml结构
  69. getBlockData() {
  70. const code = Blockly.JavaScript.workspaceToCode(this.workspace);
  71. const xml = Blockly.Xml.workspaceToDom(this.workspace);
  72. const xmlText = Blockly.Xml.domToText(xml);
  73. },
  74. // 回显工作区中的xml结构
  75. setBlockData(xmlText) {
  76. this.clearBlockData();
  77. const xml = Blockly.Xml.textToDom(xmlText);
  78. Blockly.Xml.domToWorkspace(xml, this.workspace);
  79. },
  80. // 清空工作区
  81. clearBlockData() {
  82. this.workspace.clear();
  83. },
  84. //下一步
  85. go() {
  86. this.$router.push("./function?isCamera=" + false);
  87. },
  88. },
  89. mounted() {
  90. this.workspace = Blockly.inject("blocklyDiv", {
  91. //工具栏
  92. toolbox: document.getElementById("toolbox"),
  93. //网格效果
  94. grid: { spacing: 20, length: 3, colour: "#ccc", snap: true },
  95. //媒体资源
  96. media: "../assets/img/",
  97. //垃圾桶
  98. trashcan: true,
  99. });
  100. //工作区监听代码生成器
  101. this.workspace.addChangeListener(this.myUpdateFunction);
  102. Blockly.Blocks["iot_lcd_screeninit"] = {
  103. init: function () {
  104. this.appendDummyInput().appendField(
  105. new Blockly.FieldImage(
  106. require("../assets/img/screen_init_header.png"),
  107. 45,
  108. 45
  109. )
  110. );
  111. this.appendDummyInput().appendField("LCD屏幕打开");
  112. this.setInputsInline(false);
  113. this.setPreviousStatement(true);
  114. this.setNextStatement(true);
  115. this.setColour("#5cb2d6");
  116. this.setTooltip("");
  117. this.setHelpUrl("");
  118. },
  119. };
  120. Blockly.JavaScript.iot_lcd_screeninit = function (block) {
  121. var _code = "";
  122. return _code;
  123. };
  124. Blockly.Blocks["iot_lcd_faceinit"] = {
  125. init: function () {
  126. this.appendDummyInput().appendField(
  127. new Blockly.FieldImage(
  128. require("../assets/img/face_recognition_header.png"),
  129. 45,
  130. 45
  131. )
  132. );
  133. this.appendDummyInput().appendField("人脸辨识");
  134. this.setInputsInline(false);
  135. this.setPreviousStatement(true);
  136. this.setNextStatement(true);
  137. this.setColour("#ee783a");
  138. this.setTooltip("");
  139. this.setHelpUrl("");
  140. },
  141. };
  142. Blockly.JavaScript.iot_lcd_faceinit = function (block) {
  143. var _code = "";
  144. return _code;
  145. };
  146. },
  147. };
  148. </script>