diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..c13fe1f
--- /dev/null
+++ b/src/assets/icons/svg/chart.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/assets/icons/svg/checkbox.svg b/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..4e04af0
--- /dev/null
+++ b/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/assets/icons/svg/client.svg b/src/assets/icons/svg/client.svg
new file mode 100644
index 0000000..cdb2cfa
--- /dev/null
+++ b/src/assets/icons/svg/client.svg
@@ -0,0 +1,18 @@
+
+
diff --git a/src/assets/icons/svg/clipboard.svg b/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..fbe9e7f
--- /dev/null
+++ b/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/svg/code.svg b/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..cc643f2
--- /dev/null
+++ b/src/assets/icons/svg/code.svg
@@ -0,0 +1,11 @@
+
+
diff --git a/src/assets/icons/svg/color.svg b/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..379b22e
--- /dev/null
+++ b/src/assets/icons/svg/color.svg
@@ -0,0 +1,14 @@
+
+
diff --git a/src/directive/module/clipboard.js b/src/directive/module/clipboard.js
new file mode 100644
index 0000000..4dbb944
--- /dev/null
+++ b/src/directive/module/clipboard.js
@@ -0,0 +1,57 @@
+/**
+ * v-clipboard 文字复制剪贴
+ * Copyright (c) 2021 muyu
+ */
+
+import Clipboard from 'clipboard'
+
+export default {
+ bind(el, binding, vnode) {
+ switch (binding.arg) {
+ case 'success':
+ el._vClipBoard_success = binding.value;
+ break;
+ case 'error':
+ el._vClipBoard_error = binding.value;
+ break;
+ default: {
+ const clipboard = new Clipboard(el, {
+ text: () => binding.value,
+ action: () => binding.arg === 'cut' ? 'cut' : 'copy'
+ });
+ clipboard.on('success', e => {
+ const callback = el._vClipBoard_success;
+ callback && callback(e);
+ });
+ clipboard.on('error', e => {
+ const callback = el._vClipBoard_error;
+ callback && callback(e);
+ });
+ el._vClipBoard = clipboard;
+ }
+ }
+ },
+ update(el, binding) {
+ if (binding.arg === 'success') {
+ el._vClipBoard_success = binding.value;
+ } else if (binding.arg === 'error') {
+ el._vClipBoard_error = binding.value;
+ } else {
+ el._vClipBoard.text = function () {
+ return binding.value;
+ };
+ el._vClipBoard.action = () => binding.arg === 'cut' ? 'cut' : 'copy';
+ }
+ },
+ unbind(el, binding) {
+ if (!el._vClipboard) return
+ if (binding.arg === 'success') {
+ delete el._vClipBoard_success;
+ } else if (binding.arg === 'error') {
+ delete el._vClipBoard_error;
+ } else {
+ el._vClipBoard.destroy();
+ delete el._vClipBoard;
+ }
+ }
+}
diff --git a/src/views/tool/build/CodeTypeDialog.vue b/src/views/tool/build/CodeTypeDialog.vue
new file mode 100644
index 0000000..7e8058b
--- /dev/null
+++ b/src/views/tool/build/CodeTypeDialog.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+
+ 确定
+
+
+
+
+
+