fhrons-mobile-next 2.0.0 → 2.0.2

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 (90) hide show
  1. package/.env.poc +8 -0
  2. package/assets/css/colors.js +6 -0
  3. package/assets/css/customVant.less +60 -0
  4. package/assets/css/extra.css +32 -0
  5. package/assets/css/global.css +1 -0
  6. package/assets/css/global.less +1637 -0
  7. package/assets/css/index.js +63 -0
  8. package/assets/css/static.less +607 -0
  9. package/assets/js/func.js +361 -0
  10. package/assets/js/globalData.js +18 -0
  11. package/assets/js/qywxapi.js +484 -0
  12. package/{packages → assets/js}/storage.js +1 -20
  13. package/assets/js/upload.js +269 -0
  14. package/assets/js/validate.js +48 -0
  15. package/assets/js/vant.js +39 -0
  16. package/assets/js/wxapi.js +297 -0
  17. package/assets/vantLang/index.js +172 -0
  18. package/assets/vantLang/lib/en-US.js +95 -0
  19. package/assets/vantLang/lib/es-ES.js +95 -0
  20. package/assets/vantLang/lib/pt-PT.js +96 -0
  21. package/assets/vantLang/lib/zh-CN.js +96 -0
  22. package/assets/vantLang/lib/zh-HK.js +96 -0
  23. package/assets/vantLang/locales/en_US.js +102 -0
  24. package/assets/vantLang/locales/es_ES.js +102 -0
  25. package/assets/vantLang/locales/index.js +12 -0
  26. package/assets/vantLang/locales/pt_PT.js +102 -0
  27. package/assets/vantLang/locales/zh_CN.js +102 -0
  28. package/assets/vantLang/locales/zh_T.js +102 -0
  29. package/babel.config.js +15 -0
  30. package/index.js +68 -33
  31. package/inject-env-plugin.js +29 -0
  32. package/package.json +46 -32
  33. package/packages/areaMobile/index.js +5 -0
  34. package/packages/areaMobile/index.vue +260 -0
  35. package/packages/autoGraph/VueEsign.vue +309 -0
  36. package/packages/autoGraph/index.js +5 -0
  37. package/packages/autoGraph/index.vue +472 -0
  38. package/packages/commonForm/CommonAsyncAreaPicker.vue +223 -0
  39. package/packages/commonForm/CommonDatePicker.vue +152 -0
  40. package/packages/commonForm/CommonForm.vue +786 -0
  41. package/packages/commonForm/CommonFullTimePicker.vue +137 -0
  42. package/packages/commonForm/CommonSinglePicker.vue +121 -0
  43. package/packages/commonForm/CommonYearMonthPicker.vue +127 -0
  44. package/packages/commonForm/index.js +33 -0
  45. package/packages/dialog/index.js +32 -0
  46. package/packages/dialog/index.vue +379 -0
  47. package/packages/index.js +7 -3
  48. package/packages/introduce/index.js +5 -0
  49. package/packages/introduce/index.vue +31 -0
  50. package/packages/loading/Loading.vue +70 -0
  51. package/packages/loading/index.js +43 -0
  52. package/packages/mindMap/index.js +5 -0
  53. package/packages/mindMap/index.vue +437 -0
  54. package/packages/pdfViewer/index.js +12 -0
  55. package/packages/pdfViewer/index.vue +131 -0
  56. package/packages/sharePanel/SheetPanel.vue +316 -0
  57. package/packages/sharePanel/index.js +5 -0
  58. package/packages/sharePanel/index.vue +476 -0
  59. package/packages/sharePanel/props.js +58 -0
  60. package/packages/sharePanel/utils/QyWxShareMixin.js +93 -0
  61. package/packages/sharePanel/utils/shareWay.js +81 -0
  62. package/packages/theme/index copy.js +89 -0
  63. package/packages/theme/index.js +38 -0
  64. package/packages/theme/theme.css +910 -0
  65. package/packages/theme/theme.less +26 -0
  66. package/packages/uploadFile/VanUploadFile.vue +80 -0
  67. package/packages/uploadFile/index.js +5 -0
  68. package/packages/uploadFile/index.vue +725 -0
  69. package/packages/uploadFile/vanUpload.js +5 -0
  70. package/packages/verify/Verify/VerifyPoints.vue +247 -0
  71. package/packages/verify/Verify/VerifySlide.vue +364 -0
  72. package/packages/verify/index.js +5 -0
  73. package/packages/verify/index.vue +416 -0
  74. package/packages/verify/utils/verify.js +53 -0
  75. package/packages/videoPage/index.js +5 -0
  76. package/packages/videoPage/index.vue +440 -0
  77. package/plugins/sensors/fhsensors.js +84 -0
  78. package/plugins/sensors/sensors.js +175 -0
  79. package/plugins/sensors/sensorsFun.js +1387 -0
  80. package/fhrons-mobile-next-2.0.0.tgz +0 -0
  81. package/packages/fhImage/index.js +0 -5
  82. package/packages/fhImage/index.vue +0 -57
  83. package/packages/fhPresetImage/index.js +0 -5
  84. package/packages/fhPresetImage/index.vue +0 -39
  85. package/packages/html2canvas/index.js +0 -29
  86. package/upload copy.js +0 -468
  87. package/utils/tools.js +0 -22
  88. /package/{dist → fhcommon/dist}/fhcommon.min.js +0 -0
  89. /package/{dist → fhcommon/dist}/fhcommon.min.js.LICENSE.txt +0 -0
  90. /package/{upload.js → fhcommon/upload.js} +0 -0
@@ -0,0 +1,379 @@
1
+ <template>
2
+ <div id="CommonCustomDialog">
3
+ <van-overlay :show="showDialog" class="flex-center" :z-index="100" @click="closeOverlay">
4
+ <div class="ps-r w-80 line-height30 bgc-ffffff br12">
5
+ <van-image v-if="content.pic === '1'" :src="content.picUrl" class="br-top-12 over-hidden" :class="content.picClass" />
6
+ <div class="pd20" @click.stop>
7
+ <!-- 弹窗标题 -->
8
+ <h3 v-if="content.dialogTitle" class="ta-c ft18 line-height27 c-23242e fw-500 mb12">{{ content.dialogTitle }}<img v-show="content.logo" class="note" :src="content.logo" alt="" @click="toNote" /></h3>
9
+ <div v-if="content.options" class="radio" :style="{ 'padding-left': content.textareaCfg.placeholder ? '' : '17%' }">
10
+ <van-radio-group v-if="content.textareaCfg.placeholder" v-model="suggestChecked" class="p_radio">
11
+ <van-radio v-for="(item, index) in content.options" :key="index" :name="item.value" icon-size="16px" @click="suggestChanged(item, index)"
12
+ >{{ item.text }}
13
+ <template #icon="props">
14
+ <i class="iconfont ft16 c-c8c9cc" :class="props.checked ? 'icon-dianxuangouxuan theme-color' : 'icon-dianxuan'" />
15
+ </template>
16
+ </van-radio>
17
+ </van-radio-group>
18
+ <van-radio-group v-else v-model="content.checked" direction="horizontal" :checked-color="getThemeColor" @change="changeTypeClick(content.checked)">
19
+ <van-radio v-for="(item, index) in content.options" :key="index" :name="item.value" icon-size="16px"
20
+ >{{ item.text }}
21
+ <template #icon="props">
22
+ <i class="iconfont ft16 c-c8c9cc" :class="props.checked ? 'icon-dianxuangouxuan theme-color' : 'icon-dianxuan'" />
23
+ </template>
24
+ </van-radio>
25
+ </van-radio-group>
26
+ </div>
27
+ <!-- 弹窗文本 -->
28
+ <p v-if="content.dialogContent" class="line-height21 ft14 c-23242e pre-line" :class="content.dialogContent && content.dialogContent.length <= 18 && !content.dialogContent.includes('\n') ? 'ta-c' : ''" v-html="content.dialogContent" />
29
+ <!-- 上传 -->
30
+ <div v-if="content.uploadText" ref="uploadArea">
31
+ <!-- 上传区域 -->
32
+ <div class="theme-color ps-r content-width theme-bg ft14 line-height21 plr12 ptb3 br25 mb12">
33
+ <UploadFile :delete-flag="false" upload-file-id="dialog" class="full-content" :upload-obj="content.uploadObj" @photoChanged="fileChanged">
34
+ <span>{{ content.uploadText }}</span>
35
+ <i class="iconfont icon-youjiantouxian" />
36
+ </UploadFile>
37
+ </div>
38
+ <!-- 文件列表回显区域 -->
39
+ <div v-for="(item, index) in uploadFileList" :key="index" class="ft14 c-23242e line-height21">{{ lengthFilter(item.filename) }}</div>
40
+ </div>
41
+ <!-- 副属文本 -->
42
+ <p v-if="content.dialogSubContent" class="mt12 c-7f808a ft14 line-height21">{{ content.dialogSubContent }}</p>
43
+ <!-- 文本域输入框 -->
44
+ <div v-if="content.textareaCfg && content.textareaCfg.placeholder" class="ps-r mt11" :class="[content.textareaCfg.needWordCount ? 'bgc-f5f pb4 border-box br4' : '']">
45
+ <textarea v-model="content.opinionText" :rows="content.textareaCfg.minRows" class="opinion-input ft12 line-height18 c-c8c9cc" :placeholder="content.textareaCfg.placeholder" :maxlength="content.textareaCfg.maxWordCount ? content.textareaCfg.maxWordCount : ''" />
46
+ <div v-if="content.textareaCfg.needWordCount" class="text-count">
47
+ <span class="c-23242e">{{ (content.opinionText && content.opinionText.length) || 0 }}</span
48
+ >/{{ content.textareaCfg.maxWordCount }}
49
+ </div>
50
+ </div>
51
+ <!-- 弹窗按钮组 -->
52
+ <div v-if="content.btnNum" class="btn-box line-height24 mt20 ft16 ps-r" :class="(content.btn1Text && content.btn1Text.length > 6) || (content.btn2Text && content.btn2Text.length > 6) ? 'flex-column-center' : content.btnNum === '1' ? 'flex-center' : 'flex-center-between'">
53
+ <span v-if="content.btn1Text" :class="btn1Class" class="br22 over-hidden ptb10 ta-c common-btn product-theme-dark-bg mr12" @click="btn1Jump">{{ content.btn1Text }}</span>
54
+ <span v-if="content.btn2Text" :class="btn2Class" class="br22 over-hidden ptb10 ta-c common-btn" @click="btn2Jump">{{ content.btn2Text }}</span>
55
+ </div>
56
+ <!-- 提示语弹窗,模拟toast -->
57
+ <div v-if="isShowToast" class="toast-wrap">
58
+ <div class="toast-box">
59
+ <span class="ft14 c-ffffff line-height20 ta-c prewrap">{{ i18n.t("commoncustomdialog.commoncustomdialog.e8x84h") }}</span>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <img v-if="+content.closeBtn === 1" src="https://dop-pro-1251973116.file.myqcloud.com/upload/img/funzg/icon-gaunbi.svg" class="ps-a close-icon" alt="" @click="forkJump" />
64
+ </div>
65
+ </van-overlay>
66
+ </div>
67
+ </template>
68
+
69
+ <script>
70
+ import { getStorage } from "../../assets/js/storage";
71
+ import { getStringPixelLength } from "../../assets/js/func";
72
+ import UploadFile from "../uploadFile/index.vue";
73
+ import i18n from "../../assets/vantLang";
74
+ export default {
75
+ // 组件名称
76
+ name: "CommonCustomDialog",
77
+ // 局部注册的组件
78
+ components: { UploadFile },
79
+ // 组件参数 接收来自父组件的数据
80
+ props: {},
81
+ // 组件状态值
82
+ data() {
83
+ return {
84
+ i18n,
85
+ showDialog: true,
86
+ content: {
87
+ dialogTitle: "",
88
+ dialogContent: "", // 弹窗的具体内容
89
+ btn1Text: "", // 按钮1的文案
90
+ btn2Text: "", // 按钮2的文案
91
+ btn1JumpMenu: "", // 按钮1的跳转链接
92
+ btn2JumpMenu: "", // 按钮2的跳转链接
93
+ pic: 0, // 0(无配图) 1(有配图)
94
+ picUrl: "", // 配图地址
95
+ picClass: "", // 配图样式
96
+ closeBtn: 0, // 关闭弹窗按钮 1显示 0隐藏
97
+ url: "", // logo的跳转地址
98
+ logo: "", // title旁边logonurl
99
+ options: [], // 选框
100
+ brightBgColor: "",
101
+ opinionText: "",
102
+ textareaCfg: {
103
+ placeholder: "",
104
+ needWordCount: true,
105
+ maxWordCount: 0,
106
+ minRows: 1,
107
+ },
108
+ },
109
+ getThemeColor: getStorage({ name: "themeColor" }),
110
+ suggestChecked: 0,
111
+ reasonText: "",
112
+ uploadFileList: [],
113
+ isShowToast: false,
114
+ };
115
+ },
116
+ computed: {
117
+ btnStyle() {
118
+ if ((this.content.btn1Text && this.content.btn1Text.length > 6) || (this.content.btn2Text && this.content.btn2Text.length > 6)) {
119
+ return "col";
120
+ }
121
+ return "row";
122
+ },
123
+ btn1Class() {
124
+ const obj = {
125
+ "plr12 mb16 full-width": this.btnStyle === "col" && this.content.btnNum === "2",
126
+ "w-50 mr10": this.btnStyle === "row" && this.content.btnNum === "2",
127
+ "c-ffffff fw-500": this.content.btn1Bright === "1",
128
+ "theme-dark-bg": this.content.btn1Bright === "1" && !this.content.brightBgColor,
129
+ brightBgColor: this.content.btn1Bright === "1" && this.brightBgColor,
130
+ "bgc-ffffff c-555661 border-thin bdc-c8c9cc": this.content.btn1Bright === "0" || !this.content.btn1Bright,
131
+ "full-width": this.content.btnNum === "1",
132
+ };
133
+ this.$set(obj, this.content.brightBgColor, this.content.btn1Bright === "1" && this.content.brightBgColor);
134
+ return obj;
135
+ },
136
+ btn2Class() {
137
+ const obj = {
138
+ "plr12 full-width": this.btnStyle === "col",
139
+ "w-50": this.btnStyle === "row" && this.content.btnNum === "2",
140
+ "c-ffffff fw-500": this.content.btn2Bright === "1",
141
+ "theme-dark-bg": this.content.btn2Bright === "1" && !this.content.brightBgColor,
142
+ "bgc-ffffff c-555661 border-thin bdc-c8c9cc": this.content.btn2Bright === "0" || !this.content.btn2Bright,
143
+ "full-width": this.content.btnNum === "1",
144
+ "gradient-bg c-ffffff fw-500 m0a": this.content.btn2Bright === "2",
145
+ };
146
+ this.$set(obj, this.content.brightBgColor, this.content.btn2Bright === "1" && this.content.brightBgColor);
147
+ return obj;
148
+ },
149
+ },
150
+ created() {
151
+ console.log("this.content", this.content);
152
+ },
153
+ methods: {
154
+ btn1Jump() {
155
+ this.jump("btn1", this.content.btn1JumpMenu);
156
+ },
157
+ btn2Jump() {
158
+ this.jump("btn2", this.content.btn2JumpMenu);
159
+ },
160
+ toNote() {
161
+ this.jump("", this.content.url);
162
+ },
163
+ changeTypeClick(type) {
164
+ this.changeTypeClick(type);
165
+ },
166
+ suggestChanged(item, index) {
167
+ this.reasonText = item.text;
168
+ },
169
+ forkJump() {
170
+ this.jump("fork");
171
+ },
172
+ jump(str, url) {
173
+ if (url) {
174
+ if (url === "cancel") {
175
+ this.showDialog = false;
176
+ return;
177
+ }
178
+ if (url.includes("http")) {
179
+ window.location.href = url;
180
+ } else {
181
+ this.$router.push(url);
182
+ }
183
+ } else {
184
+ // 抛出一个方法
185
+ if (str === "btn1") {
186
+ if (typeof this.content.btn1Click === "function") {
187
+ this.btn1Click(); // 点击按钮1的回调函数
188
+ } else {
189
+ this.showDialog = false;
190
+ return;
191
+ }
192
+ } else if (str === "btn2") {
193
+ if (typeof this.content.btn2Click === "function") {
194
+ // 点击按钮2的回调函数
195
+ if (this.content.textareaCfg && this.content.textareaCfg.placeholder) {
196
+ if (this.content.options && this.content.options.length) {
197
+ if (this.reasonText) {
198
+ this.btn2Click(this.reasonText, this.content.opinionText);
199
+ this.showDialog = false;
200
+ this.isShowToast = false;
201
+ } else {
202
+ this.isShowToast = true;
203
+ setTimeout(() => {
204
+ this.isShowToast = false;
205
+ }, 1000);
206
+ return;
207
+ }
208
+ } else {
209
+ this.$loading("加载中。。。");
210
+ this.btn2Click(this.content.opinionText)
211
+ .then((res) => {
212
+ if (res === "success") {
213
+ setTimeout((_) => {
214
+ this.showDialog = false;
215
+ }, 2000);
216
+ }
217
+ })
218
+ .catch((err) => {
219
+ console.log(err);
220
+ })
221
+ .finally((_) => {
222
+ this.$loading(false);
223
+ });
224
+ }
225
+ } else if (this.content?.uploadObj) {
226
+ // 如果点击的是上传弹窗的确定
227
+ if (this.uploadFileList && this.uploadFileList.length) {
228
+ this.btn2Click(this.uploadFileList).then((res) => {
229
+ if (res === "success") {
230
+ setTimeout((_) => {
231
+ this.showDialog = false;
232
+ }, 2000);
233
+ }
234
+ });
235
+ } else {
236
+ this.$toast(i18n.t("workorder.creatorderwork.0tm556"));
237
+ }
238
+ } else if (this.content.asyncClose) {
239
+ this.btn2Click().then((res) => {
240
+ if (res === "success") this.showDialog = false;
241
+ });
242
+ } else {
243
+ this.btn2Click();
244
+ this.showDialog = false;
245
+ }
246
+ } else {
247
+ this.showDialog = false;
248
+ return;
249
+ }
250
+ } else if (str === "fork") {
251
+ if (typeof this.content.forkBtnClick === "function") {
252
+ this.forkBtnClick(() => {
253
+ this.showDialog = false;
254
+ }); // 点击按钮2的回调函数
255
+ } else {
256
+ this.showDialog = false;
257
+ return;
258
+ }
259
+ }
260
+ }
261
+ },
262
+ closeOverlay() {
263
+ if (this.content.closeBtn !== "1") {
264
+ this.showDialog = false;
265
+ }
266
+ },
267
+ // 上传文件事件
268
+ fileChanged(url, base64, filename) {
269
+ this.$set(this, "uploadFileList", [
270
+ {
271
+ imageUrl: url,
272
+ filename: filename,
273
+ },
274
+ ]);
275
+ },
276
+ lengthFilter(val) {
277
+ let result = val;
278
+ const containerWidth = this.$refs.uploadArea.clientWidth;
279
+ const contentWidth = getStringPixelLength(val, `${14 / 37.5}rem Arial`);
280
+ if (contentWidth > containerWidth) {
281
+ const strList = val.split(".");
282
+ const name = strList[0];
283
+ result = `${name.replace(name.substring(4, name.length - 4), "......")}.${strList[1]}`;
284
+ }
285
+ return result;
286
+ },
287
+ },
288
+ };
289
+ </script>
290
+
291
+ <!--使用了scoped属性之后,父组件的style样式将不会渗透到子组件中,-->
292
+ <style scoped lang="less">
293
+ #CommonCustomDialog {
294
+ .close-icon {
295
+ width: 24px;
296
+ height: 24px;
297
+ left: 50%;
298
+ transform: translateX(-50%);
299
+ bottom: -40px;
300
+ }
301
+ .br-top-12 {
302
+ border-radius: 12px 12px 0 0;
303
+ }
304
+ .pre-line {
305
+ white-space: pre-line;
306
+ }
307
+ .note {
308
+ width: 16px;
309
+ height: 16px;
310
+ margin-left: 6px;
311
+ }
312
+ .common-btn {
313
+ width: 240px;
314
+ }
315
+ .radio {
316
+ /deep/.van-radio__label {
317
+ margin-left: 2.5px;
318
+ }
319
+ }
320
+ .opinion-input {
321
+ width: 100%;
322
+ color: #23242e;
323
+ font-size: 14px;
324
+ line-height: 21px;
325
+ border-radius: 4px;
326
+ // padding: 12px;
327
+ padding: 12px 12px 0 12px;
328
+ background-color: #f5f5f9;
329
+ resize: none;
330
+ &::placeholder {
331
+ color: #c8c9cc;
332
+ font-size: 14px;
333
+ }
334
+ }
335
+ .gradient-bg {
336
+ background: linear-gradient(90deg, #158cff 0%, #3da0ff 60%, #0ccaff 100%);
337
+ }
338
+ .p_radio /deep/ .van-radio {
339
+ margin-bottom: 12px;
340
+ &:last-child {
341
+ margin-bottom: 16px;
342
+ }
343
+ }
344
+ .p_radio /deep/ .van-radio__label {
345
+ font-size: 14px;
346
+ line-height: 21px;
347
+ color: #23242e;
348
+ margin-left: 12px;
349
+ }
350
+ .text-count {
351
+ font-size: 14px;
352
+ line-height: 21px;
353
+ color: #c8c9cc;
354
+ display: flex;
355
+ justify-content: flex-end;
356
+ padding-right: 12px;
357
+ box-sizing: border-box;
358
+ }
359
+ .toast-wrap {
360
+ width: 86%;
361
+ position: absolute;
362
+ top: 50%;
363
+ display: flex;
364
+ justify-content: center;
365
+ }
366
+ .toast-box {
367
+ width: fit-content;
368
+ min-width: 96px;
369
+ min-height: 0;
370
+ padding: 8px 12px;
371
+ display: flex;
372
+ align-content: center;
373
+ justify-content: center;
374
+ box-sizing: content-box;
375
+ background-color: rgba(0, 0, 0, 0.7);
376
+ border-radius: 8px;
377
+ }
378
+ }
379
+ </style>
package/packages/index.js CHANGED
@@ -1,3 +1,7 @@
1
-
2
- // export default FHCommon
3
- // export {FHImage,FHPresetImage}
1
+ import Introduce from './introduce'
2
+ import AreaMobile from './areaMobile'
3
+ import AutoGraph from './autoGraph'
4
+ import Verify from './verify'
5
+ import { uploadFile, VanUploadFile } from './uploadFile'
6
+ import SharePanel from './sharePanel'
7
+ export { AutoGraph, Introduce, AreaMobile, Verify, uploadFile, VanUploadFile, SharePanel }
@@ -0,0 +1,5 @@
1
+ import Introduce from './index.vue';
2
+ Introduce.install = (Vue) => {
3
+ Vue.component(Introduce.name, Introduce);
4
+ };
5
+ export default Introduce;
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div id="Introduce">
3
+ 欢迎来到移动端组件库,这里是组件试用区域!
4
+ <van-button type="primary" @click="handleClick">测试</van-button>
5
+ </div>
6
+ </template>
7
+
8
+ <script>
9
+
10
+ // Vue.use(vant)
11
+ // const { Button } = vant
12
+ export default {
13
+ name: 'Introduce',
14
+ // components: { vanButton: Button },
15
+ created () {
16
+ // this.use(vant)
17
+ },
18
+ mounted () {
19
+ console.log(vant)
20
+ vant.Toast('提示')
21
+ },
22
+ methods: {
23
+ handleClick () {
24
+ console.log(vant)
25
+ vant.Toast('提示')
26
+ }
27
+ }
28
+ }
29
+ </script>
30
+
31
+ <style></style>
@@ -0,0 +1,70 @@
1
+ <!-- 功能:loading; 作者:LZJ; 时间:2021年09月29日 10:40:09-->
2
+ <template>
3
+ <div id="Loading" class="flex-column-center z-index100 ps-a" :class="[theme==='dark'?'dark':'']">
4
+ <div class="ps-r loading-container">
5
+ <div class="loading-content ps-a ta-c">
6
+ <van-loading type="spinner" color="#fff" />
7
+ <p class="ft14 mt12 c-ffffff">
8
+ {{ message }}
9
+ </p>
10
+ </div>
11
+ </div>
12
+ </div>
13
+ </template>
14
+
15
+ <script>
16
+ export default {
17
+ // 组件名称
18
+ name: 'Loading',
19
+ // 组件参数 接收来自父组件的数据
20
+ props: {
21
+ show: {
22
+ type: Boolean,
23
+ default: () => false
24
+ },
25
+ message: {
26
+ type: String,
27
+ default: () => ''
28
+ },
29
+ theme: {
30
+ type: String,
31
+ default: () => 'light'
32
+ }
33
+ },
34
+ methods: {
35
+ close () {
36
+ this.$emit('close');
37
+ }
38
+ }
39
+ };
40
+ </script>
41
+
42
+ <!--使用了scoped属性之后,父组件的style样式将不会渗透到子组件中,-->
43
+ <style scoped lang='less'>
44
+ #Loading {
45
+ width: 100%;
46
+ // left: calc(50% - 5rem);
47
+ height: 100vh;
48
+ top: 0;
49
+
50
+ .loading-container {
51
+ width: 140px;
52
+ min-height: 140px;
53
+ border-radius: 16px;
54
+ backdrop-filter: blur(2px);
55
+ transition: all .3s ease;
56
+ background: rgba(0, 0, 0, 70%);
57
+ // box-sizing: border-box;
58
+
59
+ .loading-content {
60
+ left: 50%;
61
+ top: 50%;
62
+ transform: translate(-50%, -50%);
63
+ // padding: 20px 0;
64
+ }
65
+ }
66
+ }
67
+ .dark{
68
+ background-color: rgba(0, 0, 0, 70%);
69
+ }
70
+ </style>
@@ -0,0 +1,43 @@
1
+ // 取到创建的静态组件
2
+ import Loading from './Loading.vue';
3
+ // 返回一个 扩展实例构造器
4
+ const PageLoadingConstructor = Vue.extend(Loading);
5
+
6
+ // 定义弹出loading 的函数
7
+ function showLoading (options = '',theme) {
8
+ const type = typeof options === 'string' ? 1 : typeof options === 'boolean' ? 2 : 0;
9
+ const reLoading = document.getElementById('Loading');
10
+ return new Promise((resolve, reject) => {
11
+ const loadingDom = new PageLoadingConstructor({
12
+ el: document.createElement('div')
13
+ });
14
+ const message = type === 1 ? options : type === 0 ? options.message : loadingDom.message;
15
+ // 如果传进的是字符串
16
+ loadingDom.message = message;
17
+ loadingDom.theme = theme || loadingDom.theme;
18
+ loadingDom.show = true;
19
+ // 需要展示loading框
20
+ if (type === 1 || type === 0) {
21
+ if (reLoading) {
22
+ reLoading.childNodes[0].childNodes[0].childNodes[1].innerText = message;
23
+ reLoading.style.display = 'flex';
24
+ } else {
25
+ document.body.appendChild(loadingDom.$el);
26
+ }
27
+ } else if (type === 2 && !options) { // 如果是布尔值
28
+ loadingDom.show = false;
29
+ if (reLoading) reLoading.style.display = 'none';
30
+ }
31
+ });
32
+ }
33
+
34
+ // 注册为全局函数
35
+ // function registryLoading() {
36
+ // Vue.prototype.$loading = showLoading;
37
+ // }
38
+
39
+ Loading.install = (Vue) => {
40
+ Vue.prototype.$loading = showLoading;
41
+ }
42
+
43
+ export default Loading;
@@ -0,0 +1,5 @@
1
+ import MindMap from './index.vue';
2
+ MindMap.install = (Vue) => {
3
+ Vue.component(MindMap.name, MindMap);
4
+ };
5
+ export default MindMap;