@lambo-design/shared 1.0.0-beta.38 → 1.0.0-beta.382

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 (260) hide show
  1. package/config/config.js +24 -3
  2. package/config/index.js +7 -2
  3. package/config/locale.js +61 -0
  4. package/config/themes/atrovirens/atrovirens.css +590 -0
  5. package/config/themes/atrovirens/atrovirens.css.map +1 -0
  6. package/config/themes/atrovirens/atrovirens.less +681 -0
  7. package/config/themes/atrovirens/var.less +689 -0
  8. package/config/themes/blue/blue.css +590 -0
  9. package/config/themes/blue/blue.css.map +1 -0
  10. package/config/themes/blue/blue.less +684 -0
  11. package/config/themes/blue/var.less +692 -0
  12. package/config/themes/blue-208/blue-208.css +590 -0
  13. package/config/themes/blue-208/blue-208.css.map +1 -0
  14. package/config/themes/blue-208/blue-208.less +685 -0
  15. package/config/themes/blue-208/var.less +691 -0
  16. package/config/themes/blue-digital/blue-digital.css +590 -0
  17. package/config/themes/blue-digital/blue-digital.css.map +1 -0
  18. package/config/themes/blue-digital/blue-digital.less +684 -0
  19. package/config/themes/blue-digital/var.less +692 -0
  20. package/config/themes/blue-leaf/blue-leaf.css +590 -0
  21. package/config/themes/blue-leaf/blue-leaf.css.map +1 -0
  22. package/config/themes/blue-leaf/blue-leaf.less +685 -0
  23. package/config/themes/blue-leaf/var.less +691 -0
  24. package/config/themes/blue-white/blue-white.css +590 -0
  25. package/config/themes/blue-white/blue-white.css.map +1 -0
  26. package/config/themes/blue-white/blue-white.less +685 -0
  27. package/config/themes/blue-white/var.less +691 -0
  28. package/config/themes/blue-white-big/blue-white-big.css +590 -0
  29. package/config/themes/blue-white-big/blue-white-big.css.map +1 -0
  30. package/config/themes/blue-white-big/blue-white-big.less +685 -0
  31. package/config/themes/blue-white-big/var.less +691 -0
  32. package/config/themes/blue-white-tight/blue-white-tight.css +591 -0
  33. package/config/themes/blue-white-tight/blue-white-tight.css.map +1 -0
  34. package/config/themes/blue-white-tight/blue-white-tight.less +685 -0
  35. package/config/themes/blue-white-tight/var.less +693 -0
  36. package/config/themes/canglan/canglan.css +590 -0
  37. package/config/themes/canglan/canglan.css.map +1 -0
  38. package/config/themes/canglan/canglan.less +682 -0
  39. package/config/themes/canglan/var.less +693 -0
  40. package/config/themes/cuiwei/cuiwei.css +590 -0
  41. package/config/themes/cuiwei/cuiwei.css.map +1 -0
  42. package/config/themes/cuiwei/cuiwei.less +682 -0
  43. package/config/themes/cuiwei/var.less +691 -0
  44. package/config/themes/danqing/danqing.css +590 -0
  45. package/config/themes/danqing/danqing.css.map +1 -0
  46. package/config/themes/danqing/danqing.less +682 -0
  47. package/config/themes/danqing/danqing.wxss +576 -0
  48. package/config/themes/danqing/var.less +696 -0
  49. package/config/themes/deep/deep.css +590 -0
  50. package/config/themes/deep/deep.css.map +1 -0
  51. package/config/themes/deep/deep.less +682 -0
  52. package/config/themes/deep/var.less +694 -0
  53. package/config/themes/default/default.css +404 -57
  54. package/config/themes/default/default.css.map +1 -1
  55. package/config/themes/default/default.less +381 -16
  56. package/config/themes/default/var.less +390 -11
  57. package/config/themes/eap/eap.css +590 -0
  58. package/config/themes/eap/eap.css.map +1 -0
  59. package/config/themes/eap/eap.less +685 -0
  60. package/config/themes/eap/var.less +693 -0
  61. package/config/themes/gold/gold.css +590 -0
  62. package/config/themes/gold/gold.css.map +1 -0
  63. package/config/themes/gold/gold.less +685 -0
  64. package/config/themes/gold/var.less +386 -5
  65. package/config/themes/hubei/hubei.css +591 -0
  66. package/config/themes/hubei/hubei.css.map +1 -0
  67. package/config/themes/hubei/hubei.less +685 -0
  68. package/config/themes/hubei/var.less +693 -0
  69. package/config/themes/index.js +34 -4
  70. package/config/themes/lime/lime.css +590 -0
  71. package/config/themes/lime/lime.css.map +1 -0
  72. package/config/themes/lime/lime.less +685 -0
  73. package/config/themes/lime/var.less +385 -5
  74. package/config/themes/orange/orange.css +354 -7
  75. package/config/themes/orange/orange.css.map +1 -1
  76. package/config/themes/orange/orange.less +366 -0
  77. package/config/themes/orange/var.less +386 -5
  78. package/config/themes/red/red.css +354 -7
  79. package/config/themes/red/red.css.map +1 -1
  80. package/config/themes/red/red.less +366 -0
  81. package/config/themes/red/var.less +386 -5
  82. package/config/themes/sichuan/sichuan.css +590 -0
  83. package/config/themes/sichuan/sichuan.css.map +1 -0
  84. package/config/themes/sichuan/sichuan.less +685 -0
  85. package/config/themes/sichuan/var.less +691 -0
  86. package/config/themes/theme-atrovirens.js +572 -0
  87. package/config/themes/theme-b208.js +572 -0
  88. package/config/themes/theme-bd.js +572 -0
  89. package/config/themes/theme-bl.js +572 -0
  90. package/config/themes/theme-blue.js +572 -0
  91. package/config/themes/theme-bw.js +572 -0
  92. package/config/themes/theme-bwb.js +572 -0
  93. package/config/themes/theme-bwt.js +573 -0
  94. package/config/themes/theme-canglan.js +574 -0
  95. package/config/themes/theme-cuiwei.js +574 -0
  96. package/config/themes/theme-danqing.js +575 -0
  97. package/config/themes/theme-deep.js +572 -0
  98. package/config/themes/theme-default.js +378 -56
  99. package/config/themes/theme-eap.js +572 -0
  100. package/config/themes/theme-gold.js +327 -5
  101. package/config/themes/theme-hubei.js +574 -0
  102. package/config/themes/theme-lime.js +327 -5
  103. package/config/themes/theme-orange.js +561 -29
  104. package/config/themes/theme-red.js +564 -33
  105. package/config/themes/theme-sichuan.js +572 -0
  106. package/config/themes/theme-white.js +572 -0
  107. package/config/themes/white/var.less +692 -0
  108. package/config/themes/white/white.css +590 -0
  109. package/config/themes/white/white.css.map +1 -0
  110. package/config/themes/white/white.less +685 -0
  111. package/directives/module/draggable-menu.js +94 -0
  112. package/directives/module/print.js +1 -0
  113. package/directives/module/vue-print-nb/README.md +63 -0
  114. package/directives/module/vue-print-nb/print.js +94 -0
  115. package/directives/module/vue-print-nb/printarea.js +532 -0
  116. package/index.js +7 -1
  117. package/nstyles/common.less +197 -0
  118. package/nstyles/components/404.less +46 -0
  119. package/nstyles/components/button.less +34 -0
  120. package/nstyles/components/date-picker.less +41 -0
  121. package/nstyles/components/drawer.less +20 -0
  122. package/nstyles/components/dropdown.less +18 -0
  123. package/nstyles/components/excel-flow.less +72 -0
  124. package/nstyles/components/form.less +314 -0
  125. package/nstyles/components/index.less +23 -0
  126. package/nstyles/components/layout/collect.less +10 -0
  127. package/nstyles/components/layout/detail-view.less +107 -0
  128. package/nstyles/components/layout/full-screen.less +7 -0
  129. package/nstyles/components/layout/index.less +7 -0
  130. package/nstyles/components/layout/other-menu.less +142 -0
  131. package/nstyles/components/layout/page-view.less +101 -0
  132. package/nstyles/components/layout/sider-trigger.less +41 -0
  133. package/nstyles/components/layout/tags-nav.less +113 -0
  134. package/nstyles/components/modal.less +90 -0
  135. package/nstyles/components/n-button.less +131 -0
  136. package/nstyles/components/n-image-preview.less +131 -0
  137. package/nstyles/components/n-model/index.less +19 -0
  138. package/nstyles/components/n-model/report-index.less +43 -0
  139. package/nstyles/components/n-panel.less +41 -0
  140. package/nstyles/components/n-picker.less +37 -0
  141. package/nstyles/components/n-sign.less +17 -0
  142. package/nstyles/components/n-tooltip.less +10 -0
  143. package/nstyles/components/panel.less +31 -0
  144. package/nstyles/components/select.less +3 -0
  145. package/nstyles/components/sign.less +27 -0
  146. package/nstyles/components/table.less +526 -0
  147. package/nstyles/components/tree.less +260 -0
  148. package/nstyles/components/upload.less +174 -0
  149. package/nstyles/index.less +5 -0
  150. package/nstyles/reset.less +73 -0
  151. package/nstyles/third/ag.less +226 -0
  152. package/nstyles/third/icons/sort-desc.svg +1 -0
  153. package/nstyles/third/icons/sort-up.svg +1 -0
  154. package/nstyles/third/icons/sorting.svg +1 -0
  155. package/nstyles/third/index.less +11 -0
  156. package/nstyles/third/view-design.less +402 -0
  157. package/nstyles/variables/base.less +143 -0
  158. package/nstyles/variables/index.less +4 -0
  159. package/nstyles/variables/theme/default/button.less +7 -0
  160. package/nstyles/variables/theme/default/common.less +60 -0
  161. package/nstyles/variables/theme/default/index.less +7 -0
  162. package/nstyles/variables/theme/default/layout.less +40 -0
  163. package/nstyles/variables/theme/default/table.less +37 -0
  164. package/nstyles/variables/theme/default/tag.less +3 -0
  165. package/nstyles/variables/theme/default/upload.less +3 -0
  166. package/nstyles/variables/theme/index.less +13 -0
  167. package/nstyles/variables/theme/lsv/button.less +7 -0
  168. package/nstyles/variables/theme/lsv/common.less +39 -0
  169. package/nstyles/variables/theme/lsv/index.less +5 -0
  170. package/nstyles/variables/theme/lsv/layout.less +21 -0
  171. package/nstyles/variables/theme/lsv/table.less +20 -0
  172. package/nstyles/variables/theme/lsv/tag.less +3 -0
  173. package/nstyles/variables/theme/small/button.less +7 -0
  174. package/nstyles/variables/theme/small/common.less +41 -0
  175. package/nstyles/variables/theme/small/index.less +5 -0
  176. package/nstyles/variables/theme/small/layout.less +21 -0
  177. package/nstyles/variables/theme/small/table.less +17 -0
  178. package/nstyles/variables/theme/small/tag.less +3 -0
  179. package/package.json +28 -7
  180. package/plugin/index.js +12 -0
  181. package/plugin/module/date-format.js +30 -0
  182. package/plugin/module/loading.js +26 -0
  183. package/plugin/module/warn-handler.js +11 -0
  184. package/styles/image/indicator-card-header.png +0 -0
  185. package/styles/image/inspur.png +0 -0
  186. package/styles/image/lan_navigator.png +0 -0
  187. package/styles/image/layout-header-bg-canglan.png +0 -0
  188. package/styles/image/layout-header-bg-cuiwei.png +0 -0
  189. package/styles/image/layout-header-bg-gold.png +0 -0
  190. package/styles/image/lv_navigator.png +0 -0
  191. package/utils/ajax/abort-controller.js +70 -0
  192. package/utils/ajax/cancel-reason.js +25 -0
  193. package/utils/ajax/cancel-token.js +83 -0
  194. package/utils/ajax/content-type.js +30 -0
  195. package/utils/ajax/headers.js +16 -0
  196. package/utils/ajax/interceptors.js +49 -10
  197. package/utils/ajax/sseFetchUtil.js +127 -0
  198. package/utils/ajax/throttle.js +49 -0
  199. package/utils/assist.js +155 -27
  200. package/utils/base64.js +126 -0
  201. package/utils/blob.js +47 -0
  202. package/utils/context-menu.js +264 -0
  203. package/utils/crypto/aes.js +23 -0
  204. package/utils/crypto/index.js +10 -0
  205. package/utils/crypto/rsa.js +23 -0
  206. package/utils/date.js +334 -305
  207. package/utils/dict/built-in-dict.js +20 -0
  208. package/utils/dict/index.js +191 -0
  209. package/utils/event.js +72 -0
  210. package/utils/excel.js +504 -290
  211. package/utils/file.js +19 -0
  212. package/utils/form/validate.js +29 -0
  213. package/utils/getChild.js +87 -0
  214. package/utils/half-year.js +68 -0
  215. package/utils/index.js +37 -0
  216. package/utils/json.js +44 -0
  217. package/utils/locale/en-US.js +180 -0
  218. package/utils/locale/zh-CN.js +184 -0
  219. package/utils/lodop.js +5 -0
  220. package/utils/menu/generatorDynamicRouter.js +304 -0
  221. package/utils/menu/index.js +482 -15
  222. package/utils/mime_type.js +67 -0
  223. package/utils/modelerUtil.js +4 -1
  224. package/utils/n/api.js +42 -0
  225. package/utils/n/date.js +57 -0
  226. package/utils/n/index.js +10 -0
  227. package/utils/n/is-type.js +176 -0
  228. package/utils/n/number.js +144 -0
  229. package/utils/n/permission-cache.js +11 -0
  230. package/utils/n/reuqest/axiosN.js +17 -0
  231. package/utils/n/reuqest/content-type.js +19 -0
  232. package/utils/n/reuqest/interceptors.js +95 -0
  233. package/utils/n/reuqest/url-params.js +12 -0
  234. package/utils/n/storage.js +51 -0
  235. package/utils/n/token.js +51 -0
  236. package/utils/n/user-cache.js +11 -0
  237. package/utils/n/user.js +34 -0
  238. package/utils/n/uuid.js +16 -0
  239. package/utils/n-generator-routers.js +208 -0
  240. package/utils/n-router.js +205 -0
  241. package/utils/n-theme.js +30 -0
  242. package/utils/number.js +72 -15
  243. package/utils/oss.js +57 -0
  244. package/utils/platform.js +971 -31
  245. package/utils/quarter.js +58 -0
  246. package/utils/storage.js +198 -0
  247. package/utils/style.js +24 -0
  248. package/utils/theme.js +98 -3
  249. package/utils/transfer-queue.js +7 -0
  250. package/utils/transform.js +205 -0
  251. package/utils/type.js +102 -0
  252. package/utils/util.js +795 -0
  253. package/utils/vForm.js +349 -0
  254. package/utils/validator.js +181 -0
  255. package/config/themes/gold/default.css +0 -243
  256. package/config/themes/gold/default.css.map +0 -1
  257. package/config/themes/gold/default.less +0 -320
  258. package/config/themes/lime/default.css +0 -243
  259. package/config/themes/lime/default.css.map +0 -1
  260. package/config/themes/lime/default.less +0 -320
package/utils/assist.js CHANGED
@@ -25,6 +25,23 @@ export function deepCopy(data) {
25
25
  }
26
26
  return o;
27
27
  }
28
+ export function deepMerge(target, ...sources) {
29
+ if (!sources.length) return target;
30
+ const source = sources.shift();
31
+
32
+ if (isObject(target) && isObject(source)) {
33
+ for (const key in source) {
34
+ if (isObject(source[key])) {
35
+ if (!target[key]) Object.assign(target, { [key]: {} });
36
+ deepMerge(target[key], source[key]);
37
+ } else {
38
+ Object.assign(target, { [key]: source[key] });
39
+ }
40
+ }
41
+ }
42
+
43
+ return deepMerge(target, ...sources);
44
+ }
28
45
 
29
46
  export function typeOf(obj) {
30
47
  const toString = Object.prototype.toString;
@@ -43,42 +60,153 @@ export function typeOf(obj) {
43
60
  return map[toString.call(obj)];
44
61
  }
45
62
 
46
- export function operateBtn(vm, h, currentRow, operationName, operation, type, permission) {
47
- return h('Button', {
48
- props: {
49
- type: type,
50
- size: "small",
51
- ghost: true,
52
- },
53
- directives: [(permission === '' || permission === null) ? '' : {
54
- name: "permission",
55
- value: permission
56
- }],
57
- style: {
58
- margin: '0 2px'
59
- },
60
- on: {
61
- 'click': () => {
62
- operation(vm, currentRow);
63
- }
63
+ export function operateBtn(vm, h, currentRow, operationName, operation, type, permission, disabled = false) {
64
+ let renderOption = {
65
+ props: {
66
+ type: type,
67
+ size: "small",
68
+ ghost: true,
69
+ disabled: disabled
70
+ },
71
+ style: {
72
+ margin: '0 2px'
73
+ },
74
+ on: {
75
+ 'click': () => {
76
+ operation(vm, currentRow);
64
77
  }
65
- }, operationName);
78
+ }
79
+ }
80
+ if(permission){
81
+ renderOption['directives'] = [{
82
+ name: "permission",
83
+ value: permission
84
+ }]
85
+ }
86
+
87
+ return h('Button', renderOption, operationName);
66
88
 
67
89
  }
68
90
 
69
- export function operateHref(vm, h, currentRow, operationName, operation) {
70
- return h('a', {
71
- style: {
72
- margin: '0 4px'
73
- },
91
+ export function operateHref(vm, h, currentRow, operationName, operation, type, permission, disabled = false) {
92
+ let renderOption = {
93
+ style: {
94
+ margin: '0 4px',
95
+ color: disabled ? '#ccc' : '',
96
+ cursor: disabled ? 'not-allowed' : '',
97
+ pointerEvents: disabled ? 'none' : ''
98
+ },
74
99
  on: {
75
100
  'click': () => {
76
101
  operation(vm, currentRow);
77
102
  }
78
103
  }
79
- }, operationName);
104
+ }
105
+ if(permission){
106
+ renderOption['directives'] = [{
107
+ name: "permission",
108
+ value: permission
109
+ }]
110
+ }
111
+
112
+ return h('a', renderOption, operationName);
113
+ }
114
+
115
+ export function operateMore(vm, h, operation) {
116
+ return h("Dropdown", {
117
+ style: {
118
+ marginLeft: "4px",
119
+ },
120
+ props: {
121
+ transfer: true,
122
+ }
123
+ }, [
124
+ h("a", {
125
+ style: {
126
+ margin: '0 4px',
127
+ borderBottom: '0px solid #CC9900',
128
+ }
129
+ }, [
130
+ h("span", "更多"),
131
+ h("Icon", {
132
+ props: {
133
+ type: "ios-arrow-down"
134
+ },
135
+ })
136
+ ]),
137
+ h('DropdownMenu', {
138
+ slot: "list",
139
+ }, operation)
140
+ ]);
141
+ }
142
+
143
+ export function renderTooltip(vm, h, content , { theme= 'dark', maxWidth= 300 }) {
144
+ return h("Tooltip", {
145
+ props: {
146
+ maxWidth: maxWidth,
147
+ theme: theme,
148
+ content: content
149
+ },
150
+ class:"ivu-table-cell-tooltip"
151
+ }, [
152
+ h('span', {
153
+ class:"ivu-table-cell-tooltip-content"
154
+ }, content)
155
+ ]);
80
156
  }
81
157
 
82
158
  export function isJson(arg) {
83
- return typeof (arg) == "object" && Object.prototype.toString.call(arg).toLowerCase() == "[object object]" && !arg.length
84
- };
159
+ return typeof (arg) == "object" && Object.prototype.toString.call(arg).toLowerCase() === "[object object]" && !arg.length
160
+ }
161
+
162
+
163
+ export function isObject(item) {
164
+ return (item && typeof item === 'object' && !Array.isArray(item));
165
+ }
166
+
167
+ export function copyToClipboard(text){
168
+ return new Promise((resolve, reject) => {
169
+ // 现代浏览器方案
170
+ if (navigator.clipboard) {
171
+ navigator.clipboard.writeText(text).then(() => {
172
+ resolve(true);
173
+ }).catch(err => {
174
+ // 现代API失败时尝试传统方案
175
+ fallbackCopy(text, resolve, reject);
176
+ });
177
+ } else {
178
+ // 传统浏览器方案
179
+ fallbackCopy(text, resolve, reject);
180
+ }
181
+ });
182
+ }
183
+
184
+ export function fallbackCopy(text, resolve, reject) {
185
+ try {
186
+ const textArea = document.createElement('textarea');
187
+ textArea.value = text;
188
+ textArea.style.position = 'fixed'; // 避免触发滚动
189
+ textArea.style.left = '-9999px';
190
+ textArea.setAttribute('readonly', '');
191
+ document.body.appendChild(textArea);
192
+ textArea.select();
193
+ // 兼容移动端
194
+ if (textArea.setSelectionRange) {
195
+ const range = document.createRange();
196
+ range.selectNodeContents(textArea);
197
+ const sel = window.getSelection();
198
+ sel.removeAllRanges();
199
+ sel.addRange(range);
200
+ textArea.setSelectionRange(0, textArea.value.length);
201
+ }
202
+ const success = document.execCommand('copy');
203
+ document.body.removeChild(textArea);
204
+ if (success) {
205
+ resolve(true);
206
+ } else {
207
+ reject(new Error('复制失败'));
208
+ }
209
+ } catch (err) {
210
+ reject(err);
211
+ }
212
+ }
@@ -0,0 +1,126 @@
1
+ let Base64 = {
2
+ Base64Chars:
3
+ "abcdefghijklmnopqrstuv" +
4
+ "wxyzABCDEFGHIJKLMNOP" +
5
+ "QRSTUVWXYZ0123456789@*-",
6
+ /**
7
+ * Encode a string to a Base64 string follow Bse64 regular.
8
+ * @param s, a normal string
9
+ * @return a Base64 string
10
+ */
11
+ encode: function (s) {
12
+ if (!s || s.length == 0) return s;
13
+
14
+ var d = "";
15
+ var b = this.ucs2_utf8(s);
16
+ var b0, b1, b2, b3;
17
+ var len = b.length;
18
+ var i = 0;
19
+ while (i < len) {
20
+ var tmp = b[i++];
21
+ b0 = (tmp & 0xfc) >> 2;
22
+ b1 = (tmp & 0x03) << 4;
23
+ if (i < len) {
24
+ tmp = b[i++];
25
+ b1 |= (tmp & 0xf0) >> 4;
26
+ b2 = (tmp & 0x0f) << 2;
27
+ if (i < len) {
28
+ tmp = b[i++];
29
+ b2 |= (tmp & 0xc0) >> 6;
30
+ b3 = tmp & 0x3f;
31
+ } else {
32
+ b3 = 64; // 1 byte "-" is supplement
33
+
34
+ }
35
+ } else {
36
+ b2 = b3 = 64; // 2 bytes "-" are supplement
37
+
38
+ }
39
+
40
+ d += this.Base64Chars.charAt(b0);
41
+ d += this.Base64Chars.charAt(b1);
42
+ d += this.Base64Chars.charAt(b2);
43
+ d += this.Base64Chars.charAt(b3);
44
+ }
45
+
46
+ return d;
47
+
48
+ },
49
+
50
+ /**
51
+ * Encodes a ucs2 string to a utf8 integer array.
52
+ * @param s, a string
53
+ * @return an integer array
54
+ */
55
+ ucs2_utf8: function (s) {
56
+ if (!s) return null;
57
+ var d = new Array();
58
+ if (s == "") return d;
59
+
60
+ var c = 0, i = 0, j = 0;
61
+ var len = s.length;
62
+ while (i < len) {
63
+ c = s.charCodeAt(i++);
64
+ if (c <= 0x7f) {
65
+ // 1 byte
66
+
67
+ d[j++] = c;
68
+ } else if ((c >= 0x80) && (c <= 0x7ff)) {
69
+ // 2 bytes
70
+
71
+ d[j++] = ((c >> 6) & 0x1f) | 0xc0;
72
+ d[j++] = (c & 0x3f) | 0x80;
73
+ } else {
74
+ // 3 bytes
75
+
76
+ d[j++] = (c >> 12) | 0xe0;
77
+ d[j++] = ((c >> 6) & 0x3f) | 0x80;
78
+ d[j++] = (c & 0x3f) | 0x80;
79
+ }
80
+ }
81
+
82
+ return d;
83
+ },
84
+ /**
85
+ * Encodes a utf8 integer array to a ucs2 string.
86
+ * @param s, an integer array
87
+ * @return a string
88
+ */
89
+ utf8_ucs2: function (s) {
90
+ if (!s) return null;
91
+ var len = s.length;
92
+ if (len == 0) return "";
93
+
94
+ var d = "";
95
+ var c = 0, i = 0, tmp = 0;
96
+ while (i < len) {
97
+ c = s[i++];
98
+ if ((c & 0xe0) == 0xe0) {
99
+ // 3 bytes
100
+
101
+ tmp = (c & 0x0f) << 12;
102
+ c = s[i++];
103
+ tmp |= ((c & 0x3f) << 6);
104
+ c = s[i++];
105
+ tmp |= (c & 0x3f);
106
+ } else if ((c & 0xc0) == 0xc0) {
107
+ // 2 bytes
108
+
109
+ tmp = (c & 0x1f) << 6;
110
+ c = s[i++];
111
+ tmp |= (c & 0x3f);
112
+ } else {
113
+ // 1 byte
114
+
115
+ tmp = c;
116
+ }
117
+
118
+ d += String.fromCharCode(tmp);
119
+ }
120
+
121
+ return d;
122
+ }
123
+ };
124
+ export {
125
+ Base64
126
+ }
package/utils/blob.js ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 将base64转换为Blob
3
+ *
4
+ * @param base64Data base64数据
5
+ * @param contentType 数据的MIME Type,如 png 为 image/png
6
+ * @returns Blob数据
7
+ */
8
+ export function base64ToBlob(base64Data, contentType) {
9
+ contentType = contentType || ''
10
+ const sliceSize = 1024
11
+ const byteCharacters = atob(base64Data)
12
+ const bytesLength = byteCharacters.length
13
+ const slicesCount = Math.ceil(bytesLength / sliceSize)
14
+ const byteArrays = new Array(slicesCount)
15
+
16
+ for (let sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
17
+ const begin = sliceIndex * sliceSize
18
+ const end = Math.min(begin + sliceSize, bytesLength)
19
+
20
+ const bytes = new Array(end - begin)
21
+ for (let offset = begin, i = 0; offset < end; ++i, ++offset) {
22
+ bytes[i] = byteCharacters[offset].charCodeAt(0)
23
+ }
24
+ byteArrays[sliceIndex] = new Uint8Array(bytes)
25
+ }
26
+ return new Blob(byteArrays, { type: contentType })
27
+ }
28
+
29
+ export function blobToBase64(blob, hasPrefix = true) {
30
+ return new Promise((resolve) => {
31
+ const reader = new FileReader()
32
+ reader.onload = function () {
33
+ // const base64Data = (reader?.result || '')
34
+ let base64Data = '';
35
+ if (reader !== null && reader !== undefined) {
36
+ base64Data = reader.result || '';
37
+ }
38
+ if (hasPrefix) {
39
+ resolve(base64Data)
40
+ return
41
+ }
42
+ const base64WithoutPrefix = base64Data.split(',')[1]
43
+ resolve(base64WithoutPrefix)
44
+ }
45
+ reader.readAsDataURL(blob)
46
+ })
47
+ }
@@ -0,0 +1,264 @@
1
+ /**
2
+ * 兼容子窗口/Top窗口的快捷键/右键/F12禁用工具
3
+ * 核心:右键/F12/Ctrl+c.s 统一配置读取
4
+ */
5
+
6
+ // 初始化目标窗口列表
7
+ let targetWindows = [];
8
+ function initTargetWindows() {
9
+ const topWin = window.top || window;
10
+ const selfWin = window;
11
+ targetWindows = topWin === selfWin ? [topWin] : [topWin, selfWin];
12
+ }
13
+ initTargetWindows();
14
+
15
+ let disabledShortcuts = [];
16
+
17
+ // 右键 禁用/启用
18
+ export function disableRightClick(element = document) {
19
+ enableRightClick();
20
+ targetWindows.forEach(win => {
21
+ const targetDoc = win.document === element.ownerDocument ? element : win.document;
22
+ targetDoc.addEventListener('contextmenu', preventRightClick, {
23
+ capture: true,
24
+ passive: false,
25
+ once: false
26
+ });
27
+
28
+ // 绑定到window
29
+ win.addEventListener('contextmenu', preventRightClick, {
30
+ capture: true,
31
+ passive: false
32
+ });
33
+
34
+ win.addEventListener('mouseup', preventRightClickByMouseUp, {
35
+ capture: true,
36
+ passive: false
37
+ });
38
+ });
39
+ }
40
+
41
+ export function enableRightClick(element = document) {
42
+ targetWindows.forEach(win => {
43
+ const targetDoc = win.document === element.ownerDocument ? element : win.document;
44
+ targetDoc.removeEventListener('contextmenu', preventRightClick, { capture: true });
45
+
46
+ win.removeEventListener('contextmenu', preventRightClick, { capture: true });
47
+
48
+ win.removeEventListener('mouseup', preventRightClickByMouseUp, { capture: true });
49
+ });
50
+ }
51
+
52
+ /**
53
+ * 右键核心拦截函数
54
+ */
55
+ function preventRightClick(e) {
56
+ // 统一配置读取
57
+ const ownerDocument = e.currentTarget.ownerDocument;
58
+ const currentWin = (ownerDocument != null ? ownerDocument.defaultView : undefined) || e.currentTarget;
59
+ const top = currentWin.top;
60
+ const contextMenuConfig = currentWin.contextMenu || (top != null ? top.contextMenu : undefined);
61
+
62
+ if (contextMenuConfig !== '0') return;
63
+
64
+ e.preventDefault();
65
+ e.stopPropagation();
66
+ e.stopImmediatePropagation();
67
+ return false;
68
+ }
69
+
70
+ /**
71
+ * 监听mouseup事件拦截右键
72
+ */
73
+ function preventRightClickByMouseUp(e) {
74
+ if (e.button !== 2) return;
75
+
76
+ const ownerDocument = e.currentTarget.ownerDocument;
77
+ const currentWin = (ownerDocument != null ? ownerDocument.defaultView : undefined) || e.currentTarget;
78
+ const top = currentWin.top;
79
+ const contextMenuConfig = currentWin.contextMenu || (top != null ? top.contextMenu : undefined);
80
+
81
+ if (contextMenuConfig === '0') {
82
+ e.preventDefault();
83
+ e.stopPropagation();
84
+ e.stopImmediatePropagation();
85
+ return false;
86
+ }
87
+ }
88
+
89
+ // 自定义快捷键 禁用/启用
90
+ export function disableShortcutKeys(shortcuts = []) {
91
+ enableShortcutKeys();
92
+ disabledShortcuts = shortcuts
93
+ .filter(shortcut => shortcut && shortcut.trim())
94
+ .map(shortcut => shortcut.trim().toLowerCase().replace(/\+/g, '+'));
95
+
96
+ targetWindows.forEach(win => {
97
+ win.addEventListener('keydown', preventConfiguredShortcuts, { capture: true, passive: false });
98
+ });
99
+ }
100
+
101
+ export function enableShortcutKeys() {
102
+ targetWindows.forEach(win => {
103
+ win.removeEventListener('keydown', preventConfiguredShortcuts, { capture: true });
104
+ });
105
+ disabledShortcuts = [];
106
+ }
107
+
108
+ function preventConfiguredShortcuts(e) {
109
+ const currentWin = e.currentTarget;
110
+
111
+ const top = currentWin.top;
112
+ const shortcutKeyConfig = currentWin.shortcutKey || (top != null ? top.shortcutKey : undefined);
113
+
114
+ if (shortcutKeyConfig !== '0') return;
115
+
116
+ const pressedKeys = [];
117
+ if (e.ctrlKey) pressedKeys.push('ctrl');
118
+ if (e.shiftKey) pressedKeys.push('shift');
119
+ if (e.altKey) pressedKeys.push('alt');
120
+ pressedKeys.push(e.key.toLowerCase());
121
+ const pressedShortcut = pressedKeys.join('+');
122
+ // console.log("disabledShortcuts===", disabledShortcuts)
123
+ // console.log("pressedShortcut===", pressedShortcut)
124
+ if (disabledShortcuts.includes(pressedShortcut)) {
125
+ e.preventDefault();
126
+ e.stopPropagation();
127
+ e.stopImmediatePropagation();
128
+ // showNotification(`${pressedShortcut.toUpperCase()} 功能已被禁用`);
129
+ }
130
+ }
131
+
132
+ // F12禁用/启用
133
+ export function disableF12(element = document) {
134
+ enableF12();
135
+ targetWindows.forEach(win => {
136
+ const targetElement = win.document === element.ownerDocument ? element : win.document;
137
+ targetElement.addEventListener('keydown', preventF12, { capture: true, passive: false });
138
+ win.addEventListener('keydown', preventF12, { capture: true, passive: false });
139
+ });
140
+ }
141
+
142
+ export function enableF12(element = document) {
143
+ targetWindows.forEach(win => {
144
+ const targetElement = win.document === element.ownerDocument ? element : win.document;
145
+ targetElement.removeEventListener('keydown', preventF12, { capture: true });
146
+ win.removeEventListener('keydown', preventF12, { capture: true });
147
+ });
148
+ }
149
+
150
+ // F12拦截函数
151
+ function preventF12(e) {
152
+
153
+ const ownerDocument = e.currentTarget.ownerDocument;
154
+ const currentWin = (ownerDocument != null ? ownerDocument.defaultView : undefined) || e.currentTarget;
155
+
156
+ const top = currentWin.top;
157
+ const shortcutF12Config = currentWin.shortcutF12 || (top != null ? top.shortcutF12 : undefined);
158
+
159
+ if (shortcutF12Config !== '0') return;
160
+
161
+ const isF12 = e.key.toLowerCase() === 'f12' || e.keyCode === 123 || e.code === 'F12';
162
+ if (isF12) {
163
+ e.preventDefault();
164
+ e.stopPropagation();
165
+ e.stopImmediatePropagation();
166
+ return false;
167
+ }
168
+ }
169
+
170
+ // 文字选中 禁用/启用
171
+ export function disableTextSelection(element = document) {
172
+ enableTextSelection();
173
+ targetWindows.forEach(win => {
174
+ const targetDoc = win.document === element.ownerDocument ? element : win.document;
175
+
176
+
177
+ targetDoc.addEventListener('selectstart', preventTextSelection, {
178
+ capture: true,
179
+ passive: false
180
+ });
181
+
182
+ targetDoc.addEventListener('mousedown', preventTextSelectionByMouseDown, {
183
+ capture: true,
184
+ passive: false
185
+ });
186
+
187
+ targetDoc.body.style.userSelect = 'none';
188
+ targetDoc.body.style.webkitUserSelect = 'none';
189
+ targetDoc.body.style.mozUserSelect = 'none';
190
+ });
191
+ }
192
+
193
+ export function enableTextSelection(element = document) {
194
+ targetWindows.forEach(win => {
195
+ const targetDoc = win.document === element.ownerDocument ? element : win.document;
196
+
197
+ targetDoc.removeEventListener('selectstart', preventTextSelection, { capture: true });
198
+ targetDoc.removeEventListener('mousedown', preventTextSelectionByMouseDown, { capture: true });
199
+
200
+ targetDoc.body.style.userSelect = '';
201
+ targetDoc.body.style.webkitUserSelect = '';
202
+ targetDoc.body.style.mozUserSelect = '';
203
+ });
204
+ }
205
+
206
+ /**
207
+ * 文字选中拦截
208
+ */
209
+ function preventTextSelection(e) {
210
+
211
+ const ownerDocument = e.currentTarget.ownerDocument;
212
+ const currentWin = (ownerDocument != null ? ownerDocument.defaultView : undefined) || e.currentTarget;
213
+
214
+ const top = currentWin.top;
215
+ const textSelectedConfig = currentWin.textSelected || (top != null ? top.textSelected : undefined);
216
+
217
+ if (textSelectedConfig !== '0') return;
218
+
219
+ e.preventDefault();
220
+ e.stopPropagation();
221
+ e.stopImmediatePropagation();
222
+ return false;
223
+ }
224
+
225
+ /**
226
+ * 适配一些其他浏览器的文字选中
227
+ */
228
+ function preventTextSelectionByMouseDown(e) {
229
+ if (e.button !== 0) return;
230
+
231
+ const ownerDocument = e.currentTarget.ownerDocument;
232
+ const currentWin = (ownerDocument != null ? ownerDocument.defaultView : undefined) || e.currentTarget;
233
+
234
+ const top = currentWin.top;
235
+ const textSelectedConfig = currentWin.textSelected || (top != null ? top.textSelected : undefined);
236
+
237
+ if (textSelectedConfig !== '0') return;
238
+
239
+ e.preventDefault();
240
+ e.stopPropagation();
241
+ return false;
242
+ }
243
+
244
+ function showNotification(message) {
245
+ const notification = document.createElement('div');
246
+ notification.className = 'notification';
247
+ notification.textContent = message;
248
+ notification.id = 'contextmenu';
249
+ let exists = document.getElementById('contextmenu')
250
+ if(!exists){
251
+ document.body.appendChild(notification);
252
+
253
+ setTimeout(() => {
254
+ notification.classList.add('show');
255
+ }, 10);
256
+
257
+ setTimeout(() => {
258
+ notification.classList.remove('show');
259
+ setTimeout(() => {
260
+ document.body.removeChild(notification);
261
+ }, 500);
262
+ }, 2000);
263
+ }
264
+ }
@@ -0,0 +1,23 @@
1
+ import * as CryptoJS from 'crypto-js';
2
+
3
+ const AES_KEY = 'gYj2iqBV5AzxC8H0';
4
+ const AES_IV = 'z5c8fSuHX1PxWtIg';
5
+
6
+ let aes = {
7
+ encrypt(message,key = AES_KEY,iv = AES_IV) {
8
+ return CryptoJS.AES.encrypt(message, key, {
9
+ mode: CryptoJS.mode.CBC,
10
+ padding: CryptoJS.pad.Pkcs7,
11
+ iv: iv
12
+ })
13
+ },
14
+ decrypt(ciphertext,key = AES_IV,iv = AES_IV) {
15
+ return CryptoJS.AES.decrypt(ciphertext, key, {
16
+ mode: CryptoJS.mode.CBC,
17
+ padding: CryptoJS.pad.Pkcs7,
18
+ iv: iv
19
+ }).toString(CryptoJS.enc.Utf8)
20
+ }
21
+ }
22
+
23
+ export default aes;
@@ -1,5 +1,7 @@
1
1
  import sm3 from "./sm3";
2
2
  import md5 from "./md5";
3
+ import NodeRSA from "node-rsa";
4
+ import {Base64} from '../base64'
3
5
 
4
6
  let crypto = {}
5
7
  crypto.sm3 = function (s) {
@@ -35,4 +37,12 @@ crypto.md5 = function (s, add) {
35
37
  return md5.MD5(s);
36
38
  };
37
39
 
40
+ crypto.encodePwd = function (s,pk){
41
+ if (!pk) {
42
+ pk = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD2iolFHi+6bUh+V6JPr2gFJQsC0QNsq2EwI0MAPlI5AaizBHRVMjX1H73ptuDSiT3QZh4kk74w+eDLyYj4JXo1SvvDw5w378SLhUIDzH0zrlt3oleT3kiPQxC17yM3Os/wrtHO7IC+KGo9qrg+LJFyR/fYYHcyH9i+JAejBEnJQIDAQAB`
43
+ }
44
+ let nodeRSA = new NodeRSA(pk, "pkcs8-public");
45
+ return Base64.encode(nodeRSA.encrypt(s, 'base64'));
46
+ }
47
+
38
48
  export default crypto;