@lambo-design/shared 1.0.0-beta.31 → 1.0.0-beta.310

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 (235) hide show
  1. package/config/config.js +20 -3
  2. package/config/index.js +7 -2
  3. package/config/locale.js +61 -0
  4. package/config/themes/atrovirens/atrovirens.css +589 -0
  5. package/config/themes/atrovirens/atrovirens.css.map +1 -0
  6. package/config/themes/atrovirens/atrovirens.less +680 -0
  7. package/config/themes/atrovirens/var.less +688 -0
  8. package/config/themes/blue/blue.css +589 -0
  9. package/config/themes/blue/blue.css.map +1 -0
  10. package/config/themes/blue/blue.less +683 -0
  11. package/config/themes/blue/var.less +691 -0
  12. package/config/themes/blue-white/blue-white.css +589 -0
  13. package/config/themes/blue-white/blue-white.css.map +1 -0
  14. package/config/themes/blue-white/blue-white.less +684 -0
  15. package/config/themes/blue-white/var.less +690 -0
  16. package/config/themes/blue-white-big/blue-white-big.css +589 -0
  17. package/config/themes/blue-white-big/blue-white-big.css.map +1 -0
  18. package/config/themes/blue-white-big/blue-white-big.less +684 -0
  19. package/config/themes/blue-white-big/var.less +690 -0
  20. package/config/themes/blue-white-tight/blue-white-tight.css +590 -0
  21. package/config/themes/blue-white-tight/blue-white-tight.css.map +1 -0
  22. package/config/themes/blue-white-tight/blue-white-tight.less +684 -0
  23. package/config/themes/blue-white-tight/var.less +692 -0
  24. package/config/themes/canglan/canglan.css +588 -0
  25. package/config/themes/canglan/canglan.css.map +1 -0
  26. package/config/themes/canglan/canglan.less +681 -0
  27. package/config/themes/canglan/var.less +692 -0
  28. package/config/themes/cuiwei/cuiwei.css +589 -0
  29. package/config/themes/cuiwei/cuiwei.css.map +1 -0
  30. package/config/themes/cuiwei/cuiwei.less +681 -0
  31. package/config/themes/cuiwei/var.less +690 -0
  32. package/config/themes/danqing/danqing.css +589 -0
  33. package/config/themes/danqing/danqing.css.map +1 -0
  34. package/config/themes/danqing/danqing.less +681 -0
  35. package/config/themes/danqing/danqing.wxss +576 -0
  36. package/config/themes/danqing/var.less +695 -0
  37. package/config/themes/deep/deep.css +589 -0
  38. package/config/themes/deep/deep.css.map +1 -0
  39. package/config/themes/deep/deep.less +681 -0
  40. package/config/themes/deep/var.less +693 -0
  41. package/config/themes/default/default.css +403 -57
  42. package/config/themes/default/default.css.map +1 -1
  43. package/config/themes/default/default.less +380 -16
  44. package/config/themes/default/var.less +389 -11
  45. package/config/themes/eap/eap.css +589 -0
  46. package/config/themes/eap/eap.css.map +1 -0
  47. package/config/themes/eap/eap.less +684 -0
  48. package/config/themes/eap/var.less +692 -0
  49. package/config/themes/gold/gold.css +589 -0
  50. package/config/themes/gold/gold.css.map +1 -0
  51. package/config/themes/gold/gold.less +684 -0
  52. package/config/themes/gold/var.less +385 -5
  53. package/config/themes/index.js +26 -4
  54. package/config/themes/lime/lime.css +589 -0
  55. package/config/themes/lime/lime.css.map +1 -0
  56. package/config/themes/lime/lime.less +684 -0
  57. package/config/themes/lime/var.less +384 -5
  58. package/config/themes/orange/orange.css +353 -7
  59. package/config/themes/orange/orange.css.map +1 -1
  60. package/config/themes/orange/orange.less +365 -0
  61. package/config/themes/orange/var.less +385 -5
  62. package/config/themes/red/red.css +353 -7
  63. package/config/themes/red/red.css.map +1 -1
  64. package/config/themes/red/red.less +365 -0
  65. package/config/themes/red/var.less +385 -5
  66. package/config/themes/sichuan/sichuan.css +589 -0
  67. package/config/themes/sichuan/sichuan.css.map +1 -0
  68. package/config/themes/sichuan/sichuan.less +684 -0
  69. package/config/themes/sichuan/var.less +690 -0
  70. package/config/themes/theme-atrovirens.js +571 -0
  71. package/config/themes/theme-blue.js +571 -0
  72. package/config/themes/theme-bw.js +571 -0
  73. package/config/themes/theme-bwb.js +571 -0
  74. package/config/themes/theme-bwt.js +572 -0
  75. package/config/themes/theme-canglan.js +573 -0
  76. package/config/themes/theme-cuiwei.js +573 -0
  77. package/config/themes/theme-danqing.js +574 -0
  78. package/config/themes/theme-deep.js +571 -0
  79. package/config/themes/theme-default.js +378 -60
  80. package/config/themes/theme-eap.js +571 -0
  81. package/config/themes/theme-gold.js +326 -8
  82. package/config/themes/theme-lime.js +326 -8
  83. package/config/themes/theme-orange.js +560 -29
  84. package/config/themes/theme-red.js +563 -33
  85. package/config/themes/theme-sichuan.js +571 -0
  86. package/config/themes/theme-white.js +571 -0
  87. package/config/themes/white/var.less +691 -0
  88. package/config/themes/white/white.css +589 -0
  89. package/config/themes/white/white.css.map +1 -0
  90. package/config/themes/white/white.less +684 -0
  91. package/directives/module/print.js +1 -0
  92. package/directives/module/vue-print-nb/README.md +63 -0
  93. package/directives/module/vue-print-nb/print.js +94 -0
  94. package/directives/module/vue-print-nb/printarea.js +532 -0
  95. package/index.js +7 -1
  96. package/nstyles/common.less +197 -0
  97. package/nstyles/components/404.less +46 -0
  98. package/nstyles/components/button.less +34 -0
  99. package/nstyles/components/date-picker.less +41 -0
  100. package/nstyles/components/drawer.less +20 -0
  101. package/nstyles/components/dropdown.less +18 -0
  102. package/nstyles/components/excel-flow.less +72 -0
  103. package/nstyles/components/form.less +313 -0
  104. package/nstyles/components/index.less +23 -0
  105. package/nstyles/components/layout/collect.less +10 -0
  106. package/nstyles/components/layout/detail-view.less +107 -0
  107. package/nstyles/components/layout/full-screen.less +7 -0
  108. package/nstyles/components/layout/index.less +7 -0
  109. package/nstyles/components/layout/other-menu.less +142 -0
  110. package/nstyles/components/layout/page-view.less +101 -0
  111. package/nstyles/components/layout/sider-trigger.less +41 -0
  112. package/nstyles/components/layout/tags-nav.less +113 -0
  113. package/nstyles/components/modal.less +90 -0
  114. package/nstyles/components/n-button.less +131 -0
  115. package/nstyles/components/n-image-preview.less +131 -0
  116. package/nstyles/components/n-model/index.less +19 -0
  117. package/nstyles/components/n-model/report-index.less +43 -0
  118. package/nstyles/components/n-panel.less +41 -0
  119. package/nstyles/components/n-picker.less +37 -0
  120. package/nstyles/components/n-sign.less +17 -0
  121. package/nstyles/components/n-tooltip.less +10 -0
  122. package/nstyles/components/panel.less +31 -0
  123. package/nstyles/components/select.less +3 -0
  124. package/nstyles/components/sign.less +27 -0
  125. package/nstyles/components/table.less +412 -0
  126. package/nstyles/components/tree.less +166 -0
  127. package/nstyles/components/upload.less +174 -0
  128. package/nstyles/index.less +5 -0
  129. package/nstyles/reset.less +73 -0
  130. package/nstyles/third/ag.less +206 -0
  131. package/nstyles/third/icons/sort-desc.svg +1 -0
  132. package/nstyles/third/icons/sort-up.svg +1 -0
  133. package/nstyles/third/icons/sorting.svg +1 -0
  134. package/nstyles/third/index.less +11 -0
  135. package/nstyles/third/view-design.less +378 -0
  136. package/nstyles/variables/base.less +143 -0
  137. package/nstyles/variables/index.less +4 -0
  138. package/nstyles/variables/theme/default/button.less +7 -0
  139. package/nstyles/variables/theme/default/common.less +60 -0
  140. package/nstyles/variables/theme/default/index.less +7 -0
  141. package/nstyles/variables/theme/default/layout.less +40 -0
  142. package/nstyles/variables/theme/default/table.less +37 -0
  143. package/nstyles/variables/theme/default/tag.less +3 -0
  144. package/nstyles/variables/theme/default/upload.less +3 -0
  145. package/nstyles/variables/theme/index.less +13 -0
  146. package/nstyles/variables/theme/lsv/button.less +7 -0
  147. package/nstyles/variables/theme/lsv/common.less +39 -0
  148. package/nstyles/variables/theme/lsv/index.less +5 -0
  149. package/nstyles/variables/theme/lsv/layout.less +21 -0
  150. package/nstyles/variables/theme/lsv/table.less +20 -0
  151. package/nstyles/variables/theme/lsv/tag.less +3 -0
  152. package/nstyles/variables/theme/small/button.less +7 -0
  153. package/nstyles/variables/theme/small/common.less +41 -0
  154. package/nstyles/variables/theme/small/index.less +5 -0
  155. package/nstyles/variables/theme/small/layout.less +21 -0
  156. package/nstyles/variables/theme/small/table.less +17 -0
  157. package/nstyles/variables/theme/small/tag.less +3 -0
  158. package/package.json +28 -7
  159. package/plugin/index.js +12 -0
  160. package/plugin/module/date-format.js +30 -0
  161. package/plugin/module/loading.js +26 -0
  162. package/plugin/module/warn-handler.js +11 -0
  163. package/styles/image/indicator-card-header.png +0 -0
  164. package/styles/image/inspur.png +0 -0
  165. package/styles/image/lan_navigator.png +0 -0
  166. package/styles/image/layout-header-bg-canglan.png +0 -0
  167. package/styles/image/layout-header-bg-cuiwei.png +0 -0
  168. package/styles/image/lv_navigator.png +0 -0
  169. package/utils/ajax/abort-controller.js +68 -0
  170. package/utils/ajax/cancel-token.js +69 -0
  171. package/utils/ajax/content-type.js +30 -0
  172. package/utils/ajax/headers.js +11 -0
  173. package/utils/ajax/interceptors.js +30 -5
  174. package/utils/ajax/sseFetchUtil.js +118 -0
  175. package/utils/ajax/throttle.js +46 -0
  176. package/utils/assist.js +155 -27
  177. package/utils/base64.js +126 -0
  178. package/utils/blob.js +47 -0
  179. package/utils/context-menu.js +65 -0
  180. package/utils/crypto/aes.js +23 -0
  181. package/utils/crypto/index.js +10 -0
  182. package/utils/crypto/rsa.js +23 -0
  183. package/utils/date.js +334 -305
  184. package/utils/dict/built-in-dict.js +20 -0
  185. package/utils/dict/index.js +191 -0
  186. package/utils/event.js +72 -0
  187. package/utils/excel.js +373 -241
  188. package/utils/file.js +19 -0
  189. package/utils/form/validate.js +29 -0
  190. package/utils/half-year.js +68 -0
  191. package/utils/index.js +37 -0
  192. package/utils/json.js +44 -0
  193. package/utils/locale/en-US.js +172 -0
  194. package/utils/locale/zh-CN.js +172 -0
  195. package/utils/lodop.js +5 -0
  196. package/utils/menu/index.js +292 -15
  197. package/utils/mime_type.js +67 -0
  198. package/utils/modelerUtil.js +4 -1
  199. package/utils/n/api.js +38 -0
  200. package/utils/n/date.js +57 -0
  201. package/utils/n/index.js +10 -0
  202. package/utils/n/is-type.js +176 -0
  203. package/utils/n/number.js +144 -0
  204. package/utils/n/permission-cache.js +11 -0
  205. package/utils/n/reuqest/axiosN.js +17 -0
  206. package/utils/n/reuqest/content-type.js +19 -0
  207. package/utils/n/reuqest/interceptors.js +95 -0
  208. package/utils/n/reuqest/url-params.js +12 -0
  209. package/utils/n/storage.js +51 -0
  210. package/utils/n/token.js +51 -0
  211. package/utils/n/user-cache.js +11 -0
  212. package/utils/n/user.js +34 -0
  213. package/utils/n/uuid.js +16 -0
  214. package/utils/n-generator-routers.js +208 -0
  215. package/utils/n-router.js +205 -0
  216. package/utils/n-theme.js +30 -0
  217. package/utils/number.js +72 -15
  218. package/utils/oss.js +57 -0
  219. package/utils/platform.js +824 -33
  220. package/utils/quarter.js +58 -0
  221. package/utils/storage.js +198 -0
  222. package/utils/style.js +24 -0
  223. package/utils/theme.js +98 -3
  224. package/utils/transfer-queue.js +7 -0
  225. package/utils/transform.js +205 -0
  226. package/utils/type.js +102 -0
  227. package/utils/util.js +795 -0
  228. package/utils/vForm.js +349 -0
  229. package/utils/validator.js +181 -0
  230. package/config/themes/gold/default.css +0 -243
  231. package/config/themes/gold/default.css.map +0 -1
  232. package/config/themes/gold/default.less +0 -320
  233. package/config/themes/lime/default.css +0 -243
  234. package/config/themes/lime/default.css.map +0 -1
  235. package/config/themes/lime/default.less +0 -320
@@ -0,0 +1,118 @@
1
+ class CustomEventSource {
2
+ constructor(url, options) {
3
+ this.url = url;
4
+ this.options = options || {};
5
+ this.listeners = {};
6
+ this.awaitConnect()
7
+ }
8
+
9
+ async awaitConnect() {
10
+ const response = await fetch(this.url, { ...this.options, method: 'POST' });
11
+ const reader = response.body.getReader();
12
+ await this.readStream(reader);
13
+ }
14
+
15
+ async readStream(reader) {
16
+ let done, value, chunk = '';
17
+ const decoder = new TextDecoder('utf-8');
18
+ do {
19
+ ({done, value} = await reader.read());
20
+ if (done) {
21
+ this.dispatchEvent('message_finished');
22
+ } else {
23
+ chunk += decoder.decode(value, { stream: true })
24
+ if (chunk && chunk.trim().endsWith("}")) {
25
+ const lines = chunk.split('\n');
26
+ // chunk = '';
27
+ for (let line of lines) {
28
+ if (line.startsWith('data:')) {
29
+ const data = line.substring(5).trim(); // 去掉 'data:' 前缀
30
+ if (data) {
31
+ try {
32
+ const jsonData = JSON.parse(data);
33
+ }catch (e) {
34
+ // 解析失败,说明数据可能不完整,等待更多数据
35
+ console.warn("JSON 解析失败,等待更多数据:", e);
36
+ break;
37
+ }
38
+ this.dispatchEvent('message', { data: data });
39
+ }
40
+ } else if (line.startsWith("{") && line.endsWith("}")) {
41
+ try {
42
+ const jsonData = JSON.parse(line);
43
+ }catch (e) {
44
+ console.warn("JSON 解析失败,等待更多数据:", e);
45
+ break;
46
+ }
47
+ this.dispatchEvent('message', { data: line });
48
+ }
49
+ }
50
+ chunk = '';
51
+ }
52
+ }
53
+ } while (!done);
54
+ }
55
+
56
+ connect() {
57
+ fetch(this.url, { ...this.options, method: 'POST' })
58
+ .then(response => {
59
+ if (response.ok && response.body) {
60
+ const reader = response.body.getReader();
61
+ this.read(reader);
62
+ } else {
63
+ throw new Error('Failed to connect to the SSE endpoint.');
64
+ }
65
+ })
66
+ .catch(error => {
67
+ console.error('Connection error:', error);
68
+ this.dispatchEvent('message_finished',error);
69
+ });
70
+ }
71
+
72
+ read(reader) {
73
+ reader.read().then(({done,value}) => {
74
+ if (done) {
75
+ this.dispatchEvent('message_finished');
76
+ } else {
77
+ const decoder = new TextDecoder('utf-8');
78
+ const chunk = decoder.decode(value, { stream: true });
79
+ if (chunk) {
80
+ const lines = chunk.split('\n');
81
+ for (let line of lines) {
82
+ if (line.startsWith('data:')) {
83
+ const data = line.substring(5).trim(); // 去掉 'data:' 前缀
84
+ if (data) {
85
+ this.dispatchEvent('message', { data: data });
86
+ }
87
+ } else if (line.startsWith("{") && line.endsWith("}")) {
88
+ this.dispatchEvent('message', { data: line });
89
+ }
90
+ }
91
+ }
92
+
93
+ this.read(reader);
94
+ }
95
+ }).catch(error => {
96
+ console.error('Read error:', error);
97
+ this.dispatchEvent('message_finished',error);
98
+ });
99
+ }
100
+
101
+ addEventListener(type, listener) {
102
+ if (!this.listeners[type]) {
103
+ this.listeners[type] = [];
104
+ }
105
+ this.listeners[type].push(listener);
106
+ }
107
+
108
+ dispatchEvent(type, event) {
109
+ if (this.listeners[type]) {
110
+ this.listeners[type].forEach(listener => listener(event));
111
+ }
112
+ }
113
+ }
114
+
115
+ export default CustomEventSource;
116
+ export {
117
+ CustomEventSource
118
+ }
@@ -0,0 +1,46 @@
1
+ const requestObjMap = {};
2
+
3
+ const getPendingUrl = (config) => {
4
+ const { url, method, data, headers } = config;
5
+ // 生成请求唯一标识
6
+ return [url, method, JSON.stringify(data), JSON.stringify(headers)].join('&');
7
+ };
8
+ /**
9
+ * 防止重复提交
10
+ * 防抖(debounce)和节流(throttle)
11
+ */
12
+ export function throttle(config) {
13
+ if (config) {
14
+ // 是否需要防止数据重复提交
15
+ const isRepeatSubmit = (config.headers || {}).repeatSubmit === false ;
16
+
17
+ if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
18
+ const requestObj = {
19
+ url: config.url,
20
+ data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
21
+ time: new Date().getTime()
22
+ }
23
+ const requestId = getPendingUrl(config);
24
+
25
+ const lastRequestObj = requestObjMap[requestId];
26
+
27
+ if (lastRequestObj === undefined || lastRequestObj === null || lastRequestObj === '') {
28
+ requestObjMap[requestId] = requestObj;
29
+ } else {
30
+ const lastUrl = lastRequestObj.url;
31
+ const lastData = lastRequestObj.data;
32
+ const lastTime = lastRequestObj.time;
33
+ // 间隔时间(ms),小于此时间视为重复提交
34
+ const interval = 10000;
35
+ if (lastUrl === requestObj.url && lastData === requestObj.data
36
+ && requestObj.time - lastTime < interval) {
37
+ const message = '数据正在处理,请勿重复提交';
38
+ console.warn(`[${lastUrl}]: ` + message);
39
+ return Promise.reject(new Error(message));
40
+ } else {
41
+ requestObjMap[requestId] = requestObj;
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
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,65 @@
1
+ /**
2
+ * 禁用浏览器右键菜单
3
+ *
4
+ * 此函数会禁用整个文档的右键菜单(上下文菜单)
5
+ * 可以通过传递元素参数来限制禁用范围
6
+ *
7
+ * @param {HTMLElement} [element=document] - 要禁用右键菜单的元素,默认为整个文档
8
+ */
9
+ export function disableRightClick(element = document) {
10
+ // 添加事件监听器
11
+ element.addEventListener('contextmenu', preventRightClick);
12
+ }
13
+
14
+
15
+ /**
16
+ * 启用浏览器右键菜单
17
+ *
18
+ * 此函数会移除之前添加的右键菜单禁用
19
+ *
20
+ * @param {HTMLElement} [element=document] - 要重新启用右键菜单的元素
21
+ */
22
+ export function enableRightClick(element = document) {
23
+ // 移除事件监听器
24
+ element.removeEventListener('contextmenu', preventRightClick);
25
+ }
26
+
27
+ /**
28
+ * 禁用右键菜单的事件处理函数
29
+ * 这是一个独立的命名函数,可以被引用和移除
30
+ */
31
+ function preventRightClick(event) {
32
+ // 阻止默认的右键菜单行为
33
+ event.preventDefault();
34
+
35
+ // 可选:显示自定义提示
36
+ showNotification("右键菜单已被禁用");
37
+ }
38
+ /**
39
+ * 显示通知
40
+ *
41
+ * @param {string} message - 要显示的消息内容
42
+ */
43
+ function showNotification(message) {
44
+ const notification = document.createElement('div');
45
+ notification.className = 'notification';
46
+ notification.textContent = message;
47
+ notification.id = 'contextmenu';
48
+ let exists = document.getElementById('contextmenu')
49
+ if(!exists){
50
+ document.body.appendChild(notification);
51
+ // 显示通知
52
+ setTimeout(() => {
53
+ notification.classList.add('show');
54
+ }, 10);
55
+
56
+ // 2秒后隐藏并移除通知
57
+ setTimeout(() => {
58
+ notification.classList.remove('show');
59
+ setTimeout(() => {
60
+ document.body.removeChild(notification);
61
+ }, 500);
62
+ }, 2000);
63
+ }
64
+
65
+ }
@@ -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;
@@ -0,0 +1,23 @@
1
+ import NodeRSA from "node-rsa";
2
+
3
+ /**
4
+ * 默认公钥
5
+ * @type {string}
6
+ */
7
+ const defaultPublicKey = `-----BEGIN PUBLIC KEY-----
8
+ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyhhlApSAjPWRjzg+wSIfALbrC
9
+ Ti4GVBYYBjfMYKU0O9z6EGQAXSLPW+S4VYm4LKtKXuKoeF441KU2HvnGM63cTIYt
10
+ T4lGbTGeYfsbeWNs1u9G9J+DrfKK8HsVB1IZIqhbMf0x7KGMeoQ2SN4KtbaPIwhl
11
+ IPfXzuLZiCW90l+a/wIDAQAB
12
+ -----END PUBLIC KEY-----`;
13
+
14
+ /**
15
+ * 使用RSA算法对data进行加密
16
+ * @param data 要加密的内容
17
+ * @param publicKey 不传使用默认公钥
18
+ * @returns {string|Buffer}
19
+ */
20
+ export default function rsa(data, publicKey = defaultPublicKey) {
21
+ let nodeRSA = new NodeRSA(publicKey, "pkcs8-public");
22
+ return nodeRSA.encrypt(data, "base64");
23
+ }