ui-process-h5 0.1.36 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/build/configure/README.md +212 -0
  2. package/build/configure/package.json +28 -0
  3. package/build/scripts/postinstall.mjs +14 -0
  4. package/build/scripts/switch-cli.mjs +4 -0
  5. package/build/scripts/utils.mjs +60 -0
  6. package/index.html +12 -0
  7. package/package.json +51 -20
  8. package/src/App.vue +222 -0
  9. package/src/assets/font-icon/iconfont.scss +57 -0
  10. package/src/assets/font-icon/iconfont.ttf +0 -0
  11. package/src/assets/img/arrow-right.png +0 -0
  12. package/src/assets/img/arrow.png +0 -0
  13. package/src/assets/img/check.png +0 -0
  14. package/src/assets/js/auth.js +65 -0
  15. package/src/assets/js/errorCode.js +6 -0
  16. package/src/assets/js/message.js +352 -0
  17. package/src/assets/js/request.js +99 -0
  18. package/src/assets/js/toast.js +239 -0
  19. package/src/assets/js/top.js +229 -0
  20. package/src/assets/js/utils.js +83 -0
  21. package/src/assets/js/vuePopper.js +123 -0
  22. package/src/assets/query.png +0 -0
  23. package/src/assets/status/check.png +0 -0
  24. package/src/assets/status/del.png +0 -0
  25. package/src/main.js +17 -0
  26. package/src/packages/attchUpload/index.js +374 -0
  27. package/src/packages/attchUpload/index.scss +143 -0
  28. package/src/packages/attchUpload/index.vue +173 -0
  29. package/src/packages/downSelect/index.js +99 -0
  30. package/src/packages/downSelect/index.scss +86 -0
  31. package/src/packages/downSelect/index.vue +57 -0
  32. package/src/packages/index.js +6 -0
  33. package/src/packages/popup/index.js +73 -0
  34. package/src/packages/popup/index.scss +173 -0
  35. package/src/packages/popup/index.vue +80 -0
  36. package/src/packages/preview/index.js +36 -0
  37. package/src/packages/preview/index.vue +15 -0
  38. package/src/packages/previewImage/index.js +281 -0
  39. package/src/packages/previewImage/index.scss +76 -0
  40. package/src/packages/previewImage/index.vue +53 -0
  41. package/src/packages/process/index.js +923 -0
  42. package/src/packages/process/index.scss +175 -0
  43. package/src/packages/process/index.vue +263 -0
  44. package/src/packages/process/operation/backNode.vue +485 -0
  45. package/src/packages/process/operation/cancel.vue +518 -0
  46. package/src/packages/process/operation/ccTask.vue +473 -0
  47. package/src/packages/process/operation/complete.vue +1126 -0
  48. package/src/packages/process/operation/counterSign.vue +590 -0
  49. package/src/packages/process/operation/delegateTask.vue +587 -0
  50. package/src/packages/process/operation/msgList.vue +174 -0
  51. package/src/packages/process/operation/restart.vue +316 -0
  52. package/src/packages/submitPopup/index.js +644 -0
  53. package/src/packages/submitPopup/index.scss +88 -0
  54. package/src/packages/submitPopup/index.vue +154 -0
  55. package/src/packages/tab/index.js +236 -0
  56. package/src/packages/tab/index.scss +177 -0
  57. package/src/packages/tab/index.vue +155 -0
  58. package/src/packages/tip/index.js +80 -0
  59. package/src/packages/tip/index.scss +121 -0
  60. package/src/packages/tip/index.vue +57 -0
  61. package/src/packages/viewAttchList/index.js +134 -0
  62. package/src/packages/viewAttchList/index.scss +76 -0
  63. package/src/packages/viewAttchList/index.vue +112 -0
  64. package/src/style.css +80 -0
  65. package/vite.config.ts +107 -0
  66. package/packages/components/approval/index.js +0 -0
  67. package/packages/components/process/index.js +0 -8
  68. package/packages/components/process/src/attchlist-upload.vue +0 -585
  69. package/packages/components/process/src/operation/backNode.vue +0 -141
  70. package/packages/components/process/src/operation/cancel.vue +0 -170
  71. package/packages/components/process/src/operation/ccTask.vue +0 -170
  72. package/packages/components/process/src/operation/complete.vue +0 -224
  73. package/packages/components/process/src/operation/counterSign.vue +0 -178
  74. package/packages/components/process/src/operation/delegateTask.vue +0 -168
  75. package/packages/components/process/src/operation/restart.vue +0 -172
  76. package/packages/components/process/src/popup.vue +0 -230
  77. package/packages/components/process/src/process.vue +0 -900
  78. package/packages/components/process/src/tab.vue +0 -459
  79. package/packages/components/process/src/tip.vue +0 -207
  80. package/packages/index.js +0 -4
  81. /package/{packages/components/process/theme → src/assets}/img/add-file.png +0 -0
  82. /package/{packages/components/process/theme → src/assets}/img/del.png +0 -0
  83. /package/{packages/components/process/theme → src/assets}/img/doc.png +0 -0
  84. /package/{packages/components/process/theme → src/assets}/img/file.png +0 -0
  85. /package/{packages/components/process/theme → src/assets}/img/image.png +0 -0
  86. /package/{packages/components/process/theme → src/assets}/img/pdf.png +0 -0
  87. /package/{packages/components/process/theme → src/assets}/img/xls.png +0 -0
  88. /package/{packages/components/process/theme → src/assets}/img/zip.png +0 -0
  89. /package/{packages/components/process/theme → src/assets}/status/error.png +0 -0
  90. /package/{packages/components/process/theme → src/assets}/status/loading.png +0 -0
  91. /package/{packages/components/process/theme → src/assets}/status/success.png +0 -0
  92. /package/{packages/components/process/src → src/packages/process}/operation/index.js +0 -0
@@ -0,0 +1,99 @@
1
+ import { defineComponent } from "vue-demi";
2
+ import arrow from "@/assets/img/arrow.png";
3
+ import check from "@/assets/img/check.png";
4
+
5
+ export default defineComponent({
6
+ name: "TopDownSelect",
7
+ props: {
8
+ // 传入数组 控制当前选项
9
+ option: {
10
+ type: Array,
11
+ default: [],
12
+ },
13
+ // 样式控制
14
+ optionStyle: {
15
+ type: String,
16
+ default: "",
17
+ },
18
+ // 蒙层显示
19
+ maskShow: {
20
+ type: Boolean,
21
+ default: true,
22
+ },
23
+ // 边框显示
24
+ border: {
25
+ type: Boolean,
26
+ default: false,
27
+ },
28
+ // 默认选择
29
+ defaultValue: {
30
+ type: String,
31
+ default: "",
32
+ },
33
+ // 提示
34
+ placeholder: {
35
+ type: String,
36
+ default: "请选择",
37
+ },
38
+ },
39
+ data() {
40
+ return {
41
+ value: {
42
+ id: "",
43
+ text: "",
44
+ },
45
+ lists: [],
46
+ expand: false,
47
+ active: "",
48
+ activeItem: {},
49
+ };
50
+ },
51
+ watch: {
52
+ // 监听渲染
53
+ option: {
54
+ handler(val, preVal) {
55
+ if (val && val.length) {
56
+ this.lists = val;
57
+ console.log("select::::",val,this.lists)
58
+ }
59
+ },
60
+ immediate: true,
61
+ deep: true,
62
+ },
63
+ defaultValue: {
64
+ handler(val, preVal) {
65
+ this.active = val;
66
+ let data = this.lists.filter((v, i) => {
67
+ return v.id == val;
68
+ });
69
+ this.activeItem = data[0];
70
+ this.$emit("change", this.activeItem);
71
+ },
72
+ },
73
+ },
74
+ computed: {
75
+ arrow() {
76
+ return arrow;
77
+ },
78
+ check() {
79
+ return check;
80
+ },
81
+ },
82
+ methods: {
83
+ // 展开当前下拉
84
+ handleExpand() {
85
+ this.expand ? (this.expand = false) : (this.expand = true);
86
+ // console.log("handleExpand", this.expand);
87
+ },
88
+
89
+ // 点击选择
90
+ handleClick(item, index) {
91
+ // console.log("当前选择:::", item, index);
92
+ if (this.active == item.id) return;
93
+ this.active = item.id;
94
+ this.activeItem = item;
95
+ this.expand = false;
96
+ this.$emit("change", this.activeItem, this.lists);
97
+ },
98
+ },
99
+ });
@@ -0,0 +1,86 @@
1
+ .top-select {
2
+ width: 100%;
3
+ position: relative;
4
+ background-color: #fff;
5
+
6
+ &-menu {
7
+ width: 100%;
8
+ height: 48px;
9
+ font-size: 15px;
10
+ display: flex;
11
+ justify-content: center;
12
+ align-items: center;
13
+ position: relative;
14
+ z-index: 80;
15
+ background-color: #fff;
16
+ box-shadow: 0 2px 12px rgba(100, 101, 102, 0.12);
17
+
18
+ &-border {
19
+ box-shadow: none;
20
+ }
21
+
22
+ &-placeholder {
23
+ color: #888;
24
+ }
25
+
26
+ &--arrow {
27
+ width: 10px;
28
+ height: 10px;
29
+ transition: transform 0.3s ease;
30
+ margin-left: 8px;
31
+ transform: rotate(0);
32
+ }
33
+
34
+ .arrow-active {
35
+ transform: rotate(180deg);
36
+ }
37
+ }
38
+
39
+ &-option {
40
+ width: 100%;
41
+ // height: 100%;
42
+ position: fixed;
43
+ z-index: 79;
44
+ // top: 48px;
45
+ left: 0;
46
+ transition: transform 0.3s ease;
47
+
48
+ &-border {
49
+ box-shadow: 0 2px 12px rgba(100, 101, 102, 0.12);
50
+ }
51
+
52
+ .option-items {
53
+ padding: 10px 16px;
54
+ height: 44px;
55
+ box-sizing: border-box;
56
+ font-size: 14px;
57
+ display: flex;
58
+ align-items: center;
59
+ position: relative;
60
+ z-index: 70;
61
+ background-color: #fff;
62
+ justify-content: space-between;
63
+
64
+ &-active {
65
+ color: #3c9cff;
66
+ font-weight: 600;
67
+ }
68
+
69
+ &-check {
70
+ width: 20px;
71
+ height: 20px;
72
+ }
73
+ }
74
+ &-mask {
75
+ background-color: #000;
76
+ opacity: 0.7;
77
+ width: 100%;
78
+ height: 100vh;
79
+ position: fixed;
80
+ z-index: 69;
81
+ transition: all 0.3s ease;
82
+ top: 0;
83
+ left: 0;
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div class="top-select">
3
+ <div
4
+ class="top-select-menu"
5
+ @click="handleExpand"
6
+ :class="[
7
+ border && 'top-select-menu-border',
8
+ !activeItem.name && 'top-select-menu-placeholder',
9
+ ]"
10
+ >
11
+ {{ activeItem.name ? activeItem.name : placeholder }}
12
+ <img
13
+ class="top-select-menu--arrow"
14
+ :src="arrow"
15
+ :class="[expand ? 'arrow-active' : '']"
16
+ />
17
+ </div>
18
+ <div
19
+ v-if="maskShow"
20
+ class="top-select-option-mask"
21
+ :style="
22
+ expand
23
+ ? 'visibility: visible; opacity: .7;'
24
+ : 'visibility: hidden; opacity: 0;'
25
+ "
26
+ ></div>
27
+ <div
28
+ v-if="lists && lists.length"
29
+ class="top-select-option"
30
+ :class="[border && 'top-select-option-border']"
31
+ :style="`${
32
+ expand
33
+ ? 'transform: translateY(2%);visibility: visible; opacity: 1;'
34
+ : 'transform: translateY(-50%);visibility: hidden; opacity: 0'
35
+ };${optionStyle ? optionStyle : ''}`"
36
+ >
37
+ <div
38
+ class="option-items"
39
+ v-for="(v, i) in lists"
40
+ :key="v.id"
41
+ @click="handleClick(v, i)"
42
+ :class="[active == v.id ? 'option-items-active' : '']"
43
+ >
44
+ {{ v.name }}
45
+ <img
46
+ class="option-items-check"
47
+ v-if="active == v.id"
48
+ :src="check"
49
+ />
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </template>
54
+ <script src="./index.js"></script>
55
+ <style lang="scss" scoped>
56
+ @import "./index.scss";
57
+ </style>
@@ -0,0 +1,6 @@
1
+ import TopProcess from "./process/index.vue";
2
+ import attchViews from "./attchUpload/index.vue";
3
+ import ViewAttchList from "./viewAttchList/index.vue";
4
+ import TopSumbitPopup from "./submitPopup/index.vue";
5
+
6
+ export { TopProcess, attchViews, TopSumbitPopup, ViewAttchList };
@@ -0,0 +1,73 @@
1
+ import { defineComponent } from "vue-demi";
2
+
3
+ export default defineComponent({
4
+ name: "TopPopup",
5
+ props: {
6
+ titleText: { default: "top-popup", type: String }, // 标题文本
7
+ context: { default: "内容", type: String }, // 内容文本
8
+ cancelText: { default: "取消", type: String }, // 取消按钮文案
9
+ comfigText: { default: "确定", type: String }, // 确定按钮文案
10
+ comfig: { default: null, type: Function }, // 确定方法
11
+ cancel: { default: null, type: Function }, // 取消方法
12
+ isMask: { default: true, type: Boolean }, // 是否开启蒙版
13
+ isMaskClose: { default: true, type: Boolean }, // 蒙版关闭功能
14
+ isTips: { default: false, type: Boolean }, //判断当前是否为dialog,
15
+ isDrawer: { default: false, type: Boolean }, // 抽屉模式
16
+ visible: { default: false, type: Boolean }, // 展示
17
+ isIndex: { type: Number }, // 层级
18
+ width: { type: String, default: "95vw" },
19
+ className: { type: String, default: "" },
20
+ },
21
+ data() {
22
+ return {
23
+ show: false,
24
+ top: 0,
25
+ };
26
+ },
27
+ watch: {
28
+ visible: {
29
+ handler(val, preVal) {
30
+ this.show = val;
31
+ },
32
+ immediate: true,
33
+ },
34
+ },
35
+
36
+ methods: {
37
+ handleOpen() {
38
+ this.show = true;
39
+ this.top = window.scrollY;
40
+ document.body.position = "fixed";
41
+ document.body.top = -this.top + "px";
42
+ },
43
+ handleClose() {
44
+ document.body.position = "";
45
+ document.body.top = "";
46
+ window.scrollTo(0, this.top);
47
+ this.show = false;
48
+ this.$emit("update:visible", false);
49
+
50
+ // this.$destroy();
51
+ },
52
+ handleCancel() {
53
+ typeof this.cancel === "function" && this.cancel();
54
+ this.handleClose();
55
+ },
56
+ handleComfig() {
57
+ typeof this.comfig === "function" && this.comfig();
58
+ },
59
+ },
60
+ mounted() {
61
+ // 渲染组件到body
62
+ this.$nextTick(() => {
63
+ if (document.getElementsByClassName("process-warp")[0]) {
64
+ const body = document.getElementsByClassName("process-warp")[0];
65
+ if (body.append) {
66
+ body.append(this.$el);
67
+ } else {
68
+ body.appendChild(this.$el);
69
+ }
70
+ }
71
+ });
72
+ },
73
+ });
@@ -0,0 +1,173 @@
1
+ .top-popup-zindex{
2
+ position: relative;
3
+ }
4
+
5
+ .top-popup {
6
+ width: 100%;
7
+ position: fixed;
8
+ left: 0;
9
+ background-color: #fff;
10
+ border-radius: 20px 20px 0 0;
11
+ padding: 0 20px;
12
+ box-sizing: border-box;
13
+ transition: transform 0.3s ease;
14
+ bottom: 0;
15
+ }
16
+ .top-popup-mask {
17
+ position: fixed;
18
+ width: 100vw;
19
+ height: 100vh;
20
+ background-color: #000;
21
+ opacity: 0.7;
22
+ top: 0;
23
+ left: 0;
24
+ transition: all 0.3s ease;
25
+ }
26
+ .top-popup-header {
27
+ display: flex;
28
+ justify-content: space-between;
29
+ align-items: center;
30
+ padding: 10px 0;
31
+ font-size: 15px;
32
+ background-color: #fff;
33
+ position: relative;
34
+ }
35
+
36
+ .top-popup-header .header-title {
37
+ font-size: 16px;
38
+ font-weight: 700;
39
+ color: #333;
40
+ }
41
+
42
+ .top-popup-header .header-cancel {
43
+ color: #333;
44
+ }
45
+ .top-popup-header .header-comfig {
46
+ color: #1389ff;
47
+ }
48
+
49
+ .top-popup-body {
50
+ overflow-x: hidden;
51
+ overflow-y: auto;
52
+ max-height: 80vh;
53
+ min-height: 65vh;
54
+ }
55
+
56
+ .top-tips {
57
+ width: 80vw;
58
+ /* height: 200px; */
59
+ border-radius: 11px;
60
+ background-color: #fff;
61
+ position: fixed;
62
+ top: calc(50% - 100px);
63
+ left: calc(50% - 40vw);
64
+ box-sizing: border-box;
65
+ transition: all 0.3s ease;
66
+ }
67
+
68
+ .top-tips-header {
69
+ display: flex;
70
+ flex-direction: row;
71
+ justify-content: center;
72
+ padding-top: 25px;
73
+ font-size: 15px;
74
+ color: #323233;
75
+ background-color: #fff;
76
+ border-radius: 11px;
77
+ }
78
+
79
+ .top-tips-body {
80
+ display: flex;
81
+ flex-direction: row;
82
+ justify-content: center;
83
+ align-items: center;
84
+ padding: 20px;
85
+ padding-top: 8px;
86
+ font-size: 14px;
87
+ color: #6c6c6c;
88
+ }
89
+
90
+ .top-tips-footer {
91
+ display: flex;
92
+ flex-direction: row;
93
+ border-top-color: #f5f5f5;
94
+ border-top-style: solid;
95
+ border-top-width: 1px;
96
+ position: relative;
97
+ }
98
+ .top-tips-footer::before {
99
+ content: "";
100
+ position: absolute;
101
+ width: 100%;
102
+ height: 0.5px;
103
+ top: 0;
104
+ left: 0;
105
+ background-color: #f2f2f2;
106
+ }
107
+
108
+ .top-tips-btn {
109
+ display: flex;
110
+ flex: 1;
111
+ flex-direction: row;
112
+ justify-content: center;
113
+ align-items: center;
114
+ height: 45px;
115
+ position: relative;
116
+ font-size: 16px;
117
+ color: #333;
118
+ }
119
+
120
+ .top-tips-btn:last-child {
121
+ color: #ee0a24;
122
+ }
123
+
124
+ .top-tips-btn:last-child::before {
125
+ content: "";
126
+ position: absolute;
127
+ width: 1px;
128
+ height: 100%;
129
+ top: 0;
130
+ left: 0;
131
+ background-color: #f2f2f2;
132
+ }
133
+
134
+ .top-popup-drawer {
135
+ width: 95vw;
136
+ height: 100vh;
137
+ position: fixed;
138
+ right: 0;
139
+ background-color: #f2f3ff;
140
+ box-sizing: border-box;
141
+ transition: transform 0.3s ease;
142
+ bottom: 0;
143
+ transform: translateX(100%);
144
+ }
145
+ .top-popup-drawer--active {
146
+ transform: translateX(0);
147
+ }
148
+
149
+ .top-popup-drawer-header {
150
+ display: flex;
151
+ justify-content: space-between;
152
+ align-items: center;
153
+ padding: 10px 20px;
154
+ font-size: 15px;
155
+ position: relative;
156
+ background-color: #fff;
157
+ z-index: 100;
158
+ }
159
+
160
+ .top-popup-drawer-header::after{
161
+ content: "";
162
+ position: absolute;
163
+ left: 0;
164
+ bottom: 0;
165
+ width: 100%;
166
+ height: 1px;
167
+ background-color: #f2f2f2;
168
+ }
169
+
170
+ .top-popup-drawer--body {
171
+ height: calc(100% - 40px);
172
+ overflow-y: auto;
173
+ }
@@ -0,0 +1,80 @@
1
+ <template>
2
+ <div
3
+ class="top-popup-zindex"
4
+ :style="`${isIndex ? `z-index:${isIndex}` : ''}`"
5
+ :class="className"
6
+ >
7
+ <div
8
+ class="top-popup-mask"
9
+ :style="
10
+ show && isMask
11
+ ? 'visibility: visible; opacity: .7;'
12
+ : 'visibility: hidden; opacity: 0;'
13
+ "
14
+ @click="isMaskClose && handleClose()"
15
+ ></div>
16
+ <div
17
+ v-if="!isTips && !isDrawer"
18
+ class="top-popup"
19
+ :style="
20
+ show
21
+ ? 'transform: translateY(0)'
22
+ : 'transform: translateY(100%)'
23
+ "
24
+ >
25
+ <div class="top-popup-header">
26
+ <div class="header-cancel" @click="handleCancel">
27
+ {{ cancelText }}
28
+ </div>
29
+ <div class="header-title">{{ titleText }}</div>
30
+ <div class="header-comfig" @click="handleComfig">
31
+ {{ comfigText }}
32
+ </div>
33
+ </div>
34
+ <div class="top-popup-body">
35
+ <slot name="default"></slot>
36
+ </div>
37
+ </div>
38
+ <div
39
+ v-else-if="!isTips && isDrawer"
40
+ class="top-popup-drawer"
41
+ :class="show ? 'top-popup-drawer--active' : ''"
42
+ :style="width ? `width:${width};` : ''"
43
+ >
44
+ <div class="top-popup-drawer-header">
45
+ <div class="header-cancel" @click="handleCancel">
46
+ 关闭
47
+ </div>
48
+ <div class="header-title">{{ titleText }}</div>
49
+ <div class="header-comfig" style="width: 20px;"></div>
50
+ </div>
51
+ <div class="top-popup-drawer--body">
52
+ <slot name="default"></slot>
53
+ </div>
54
+ </div>
55
+ <div
56
+ class="top-tips"
57
+ v-else-if="isTips && !isDrawer"
58
+ :style="
59
+ show
60
+ ? 'visibility: visible; opacity: 1; transform: scale(1)'
61
+ : 'visibility: hidden; opacity: 0; transform: scale(1.2)'
62
+ "
63
+ >
64
+ <div class="top-tips-header">{{ titleText }}</div>
65
+ <div class="top-tips-body">{{ context }}</div>
66
+ <div class="top-tips-footer">
67
+ <div class="top-tips-btn" @click="handleCancel">
68
+ {{ cancelText }}
69
+ </div>
70
+ <div class="top-tips-btn" @click="handleComfig">
71
+ {{ comfigText }}
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </template>
77
+ <script src="./index.js"></script>
78
+ <style lang="scss" scoped>
79
+ @import "./index.scss";
80
+ </style>
@@ -0,0 +1,36 @@
1
+ import { defineComponent } from "vue-demi";
2
+
3
+ export default defineComponent({
4
+ name: "PreView",
5
+ props: {
6
+ file: {
7
+ type: String,
8
+ default: "",
9
+ },
10
+ },
11
+ data() {
12
+ return {
13
+ url: "",
14
+ video: ["mp4", "avi", "rmvb"],
15
+ videoShow: false,
16
+ };
17
+ },
18
+ watch: {
19
+ file: {
20
+ handler(val, preVal) {
21
+ if (
22
+ this.video.includes(val.substring(val.lastIndexOf(".") + 1))
23
+ ) {
24
+ this.videoShow = true;
25
+ this.url = val;
26
+ } else {
27
+ this.videoShow = false;
28
+ let ssl = val.indexOf("https://") == -1 ? 0 : 1;
29
+ this.url = `https://wdyl.ddzg.cn:8089/?ssl=${ssl}&furl=${val}`;
30
+ }
31
+ },
32
+ immediate: true,
33
+ deep: true,
34
+ },
35
+ },
36
+ });
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div style="width: 100%; height: calc(100% - 40px);" v-if="url">
3
+ <video style="height: 100%; width: 100vw;" controls v-if="videoShow">
4
+ <source :src="url" type="video/mp4" />
5
+ </video>
6
+
7
+ <iframe
8
+ v-else
9
+ style="height: 100%; border: unset; width: 100vw;"
10
+ :src="url"
11
+ >
12
+ </iframe>
13
+ </div>
14
+ </template>
15
+ <script src="./index.js"></script>