@utogether/udp-core 1.0.1-beta.16 → 1.0.1-beta.17

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 (122) hide show
  1. package/build/plugins.ts +39 -39
  2. package/dist/{403-RBzulrcG.js → 403-C3cfjZIT.js} +1 -1
  3. package/dist/{404-DX-dU_6C.js → 404-Bg3j7QIo.js} +1 -1
  4. package/dist/{500-BCTk0__d.js → 500-CMT7Zyy7.js} +1 -1
  5. package/dist/{AuthorityInfo-BADTOenq.js → AuthorityInfo-B1mvqs4x.js} +1 -1
  6. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-Cv46yAx_.js → AuthorityInfo.vue_vue_type_style_index_0_lang-DwoW7QWO.js} +1 -1
  7. package/dist/{Company-B-61KrWd.js → Company-qTguidK8.js} +3 -3
  8. package/dist/{CompanyPanel-CawSrEff.js → CompanyPanel-BBC-o-k3.js} +8 -8
  9. package/dist/{Department-CrzJPtvP.js → Department-C3mKZOnK.js} +3 -3
  10. package/dist/{DepartmentPanel-DYuL8H-j.js → DepartmentPanel-CNdpOHBT.js} +3 -3
  11. package/dist/{DesignPanel-DEAv6V68.js → DesignPanel-D9jrRCoG.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-BsnXZ2td.js → DesignPanel.vue_vue_type_style_index_0_lang-A-Aj1Hl0.js} +2 -2
  13. package/dist/{DictView-BuO-2b-c.js → DictView-CgdVkSiP.js} +1 -1
  14. package/dist/{InvOrganization-CBgKBJAn.js → InvOrganization-RE7s3vBq.js} +1 -1
  15. package/dist/{Org-BaQw2r-o.js → Org-wXDGvTrS.js} +1 -1
  16. package/dist/{Preview-DvCrmKNk.js → Preview-Pvt1__BV.js} +1 -1
  17. package/dist/{ReportDefine-DyhWz0as.js → ReportDefine-xEQsgFyv.js} +1 -1
  18. package/dist/{ReportDesign-DgZ2f2zv.js → ReportDesign-jOSuEFH9.js} +2 -2
  19. package/dist/{ReportQuery-DTZYbCDi.js → ReportQuery-DxEmmGiN.js} +1 -1
  20. package/dist/{ReportQueryFrom-B-vtJegP.js → ReportQueryFrom-CFlxfS5M.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-D6izgxph.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-iHpiYz8f.js} +1 -1
  22. package/dist/{ReportTemplate-DA1ZqKGf.js → ReportTemplate-Dtz3aet7.js} +1 -1
  23. package/dist/{Role-mbqoav5t.js → Role-B_NsHIyE.js} +3 -3
  24. package/dist/{RoleAssign-ltEJIEcr.js → RoleAssign-C9wm4zq4.js} +8 -8
  25. package/dist/{RolePanel-u90v9eS0.js → RolePanel-BlHidBR0.js} +1 -1
  26. package/dist/{RolePanel-1g1a-G8D.js → RolePanel-DWM9mfNs.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-D9YxpGnt.js → RolePanel.vue_vue_type_script_setup_true_lang-Cn4RRzXm.js} +1 -1
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-LC4Egk-Q.js → RolePanel.vue_vue_type_script_setup_true_lang-DVQ9aqb1.js} +3 -3
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-DZ3W1epK.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCm-_i8O.js} +1 -1
  30. package/dist/{Staff-CJ2GgCL3.js → Staff-BfDc61QS.js} +3 -3
  31. package/dist/{StaffInfo-3KkodDCK.js → StaffInfo-BaJFo4mg.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-CW-isIxJ.js → StaffInfo.vue_vue_type_script_setup_true_lang-Bwj4x1wu.js} +1 -1
  33. package/dist/{StaffPanel-DoXPSoY5.js → StaffPanel-B6I2ZS6A.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-DvhGnOMZ.js → StaffPanel.vue_vue_type_script_setup_true_lang-vbyS4w3V.js} +2 -2
  35. package/dist/{SysUser-BuIZhMPh.js → SysUser-B_r9LYc5.js} +2 -2
  36. package/dist/{SysUserPanel-t1GJcJGM.js → SysUserPanel-C4ajcHPV.js} +1 -1
  37. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-CDDkFLlN.js → SysUserPanel.vue_vue_type_script_setup_true_lang-8Q0VvC9B.js} +43 -39
  38. package/dist/{SystemMenu-DuLEL6_l.js → SystemMenu-CyPG23uP.js} +2 -2
  39. package/dist/{UserInfo-WWby4lts.js → UserInfo-BkoGt4ib.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-B06ZSrJV.js → UserInfo.vue_vue_type_style_index_0_lang-DrzF1YYG.js} +1 -1
  41. package/dist/{childView-B0-EAoAi.js → childView-9vEO8ymO.js} +1 -1
  42. package/dist/{childView-IYY4L8VK.js → childView-Dh0NyiQe.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-CjF8nZuj.js → childView.vue_vue_type_style_index_0_lang-BOeoZuAK.js} +2 -2
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-B56v6yK7.js → childView.vue_vue_type_style_index_0_lang-CMOjfXBX.js} +1 -1
  45. package/dist/{code-rule-DDLdi3pP.js → code-rule-C7jI_1gJ.js} +1 -1
  46. package/dist/core.es.js +1 -1
  47. package/dist/{cron-task-p3-AFN1w.js → cron-task-Dg9DJXvv.js} +1 -1
  48. package/dist/{frameView-B_WAZErD.js → frameView-CeR-_hjB.js} +1 -1
  49. package/dist/{index-24fnvUBy.js → index-Bb7gIEvu.js} +611 -569
  50. package/dist/{layoutView-CoEp2afn.js → layoutView-wsLHrEeX.js} +1340 -1337
  51. package/dist/{login-DP0oP70W.js → login-CluzzdqH.js} +2 -2
  52. package/dist/{lov-view-BDoZRK-v.js → lov-view-BvQCvwbW.js} +2 -2
  53. package/dist/{menuInfo-5Xls76qB.js → menuInfo-B8RLelIC.js} +1 -1
  54. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-BfZczW9a.js → menuInfo.vue_vue_type_style_index_0_lang-DvkapEZr.js} +1 -1
  55. package/dist/{pda-app-DxGYn4G7.js → pda-app-D3LNmD9a.js} +2 -2
  56. package/dist/{resource-BnYWe_-Q.js → resource-D8JA_03-.js} +1 -1
  57. package/dist/{su-welcome-B2rNhhDH.js → su-welcome-BjxeEKSo.js} +1 -1
  58. package/dist/{sys-config-Bb4WkxZK.js → sys-config-sbeLk9bP.js} +1 -1
  59. package/dist/udp-core.css +1 -9
  60. package/index.ts +48 -48
  61. package/package.json +1 -1
  62. package/src/App.vue +65 -65
  63. package/src/components/SuCharts/src/UserInfo.vue +78 -78
  64. package/src/components/SuScrollTree/ScrollPanel.vue +170 -175
  65. package/src/components/udp/{grid.vue → grid/index.vue} +27 -24
  66. package/src/components/udp/index.ts +2 -9
  67. package/src/components/udp/utils.ts +60 -107
  68. package/src/layout/components/lay-navbar/index.vue +239 -239
  69. package/src/layout/components/lay-panel/index.vue +150 -150
  70. package/src/layout/components/lay-search/index.vue +25 -25
  71. package/src/layout/components/lay-select-org/index.vue +64 -64
  72. package/src/layout/components/lay-sidebar/horizontal.vue +190 -190
  73. package/src/layout/components/lay-sidebar/mixNav.vue +260 -260
  74. package/src/layout/components/lay-sidebar/sidebar-logo.vue +92 -92
  75. package/src/layout/components/lay-tag/index.vue +20 -48
  76. package/src/layout/hooks/useNav.ts +173 -173
  77. package/src/layout/hooks/useTag.ts +5 -3
  78. package/src/layout/types.ts +3 -2
  79. package/src/main.ts +9 -6
  80. package/src/plugins/i18n/en.ts +302 -302
  81. package/src/plugins/i18n/zh.ts +356 -354
  82. package/src/plugins/vxe-table/index.ts +116 -53
  83. package/src/plugins/vxe-table/render.tsx +956 -956
  84. package/src/router/index.ts +186 -177
  85. package/src/router/modules/remaining.ts +58 -58
  86. package/src/router/utils.ts +393 -377
  87. package/src/store/modules/app.ts +1 -3
  88. package/src/store/modules/multiTags.ts +110 -109
  89. package/src/store/modules/permission.ts +113 -100
  90. package/src/style/button.scss +85 -85
  91. package/src/style/login.css +336 -336
  92. package/src/style/vxetable.scss +13 -3
  93. package/src/views/organization/company/CompanyPanel.vue +259 -259
  94. package/src/views/organization/department/DepartmentPanel.vue +269 -283
  95. package/src/views/system/menu/SystemMenu.vue +183 -183
  96. package/src/views/system/menu/menuInfo.vue +363 -363
  97. package/src/views/system/role/UserInfo.vue +195 -195
  98. package/src/views/system/role-assign/RoleAssign.vue +57 -57
  99. package/src/views/system/role-assign/RolePanel.vue +139 -139
  100. package/src/views/system/sys/sys-config.vue +336 -336
  101. package/src/views/system/sysUser/SysUserPanel.vue +279 -278
  102. package/src/views/uapp/pda/pda-app.vue +208 -208
  103. package/src/views/udev/dict/DictView.vue +118 -118
  104. package/src/views/udev/dict/childView.vue +1 -1
  105. package/src/views/udev/lov/lov-view.vue +91 -91
  106. package/src/views/ulogin/login.vue +323 -323
  107. package/src/views/upms/interface/log-out.vue +101 -101
  108. package/src/views/urpt/design/DesignPanel.vue +507 -507
  109. package/types/global.d.ts +230 -230
  110. package/src/components/udp/count-down.vue +0 -536
  111. package/src/components/udp/flip-down/FlipCard/flip-card.vue +0 -251
  112. package/src/components/udp/flip-down/FlipCard/interfaces.ts +0 -4
  113. package/src/components/udp/flip-down/FlipClock/flip-clock.vue +0 -113
  114. package/src/components/udp/form-upload.vue +0 -482
  115. package/src/components/udp/form.vue +0 -112
  116. package/src/components/udp/lov.vue +0 -388
  117. package/src/components/udp/modal-form.vue +0 -190
  118. package/src/components/udp/modal-grid.vue +0 -298
  119. package/src/components/udp/upload.vue +0 -423
  120. package/src/utils/udp/http/index.ts +0 -294
  121. package/src/utils/udp/http/types.d.ts +0 -49
  122. package/src/utils/udp/useRender.ts +0 -431
@@ -1,323 +1,323 @@
1
- <template>
2
- <!-- <img :src="bg" class="wave" /> -->
3
- <div :key="refreshKey" class="login-container" :style="bgStyle">
4
- <div v-if="!bgStyle.backgroundImage" class="img pr-24">
5
- <img :src="welcome" />
6
- </div>
7
- <div class="login-box">
8
- <div class="login-form">
9
- <h2 v-motion :initial="{ opacity: 0, y: 100 }" :enter="{ opacity: 1, y: 0, transition: { delay: 100 } }">
10
- {{ sysConfig['title'] }}
11
- </h2>
12
- <div
13
- v-motion
14
- class="input-group user focus"
15
- :initial="{ opacity: 0, y: 100 }"
16
- :enter="{ opacity: 1, y: 0, transition: { delay: 200 } }"
17
- >
18
- <div class="icon">
19
- <IconifyIconOffline :icon="UserFill" width="30" height="30" />
20
- </div>
21
- <div>
22
- <i class="ri-logout-box-line" />
23
- <h5>{{ $t('message.udp.userName') }}</h5>
24
- <input
25
- v-model.trim="contextInfo.username"
26
- v-focus
27
- type="text"
28
- class="input"
29
- @blur="onUserBlur"
30
- @keyup.enter="onLogin"
31
- />
32
- </div>
33
- </div>
34
- <div
35
- v-motion
36
- class="input-group pwd focus"
37
- :initial="{ opacity: 0, y: 100 }"
38
- :enter="{
39
- opacity: 1,
40
- y: 0,
41
- transition: { delay: 300 }
42
- }"
43
- >
44
- <div class="icon">
45
- <IconifyIconOffline :icon="LockFill" width="30" height="30" />
46
- </div>
47
- <div>
48
- <h5>{{ $t('message.udp.password') }}</h5>
49
- <input
50
- v-model.trim="contextInfo.passWord"
51
- type="password"
52
- class="input"
53
- @blur="onPwdBlur"
54
- @keyup.enter="onLogin"
55
- />
56
- </div>
57
- </div>
58
- <button
59
- v-motion
60
- class="btn"
61
- :initial="{ opacity: 0, y: 10 }"
62
- :enter="{ opacity: 1, y: 0, transition: { delay: 400 } }"
63
- :disabled="loading"
64
- :class="{ loading: loading }"
65
- @click="onLogin"
66
- >
67
- {{ $t('message.udp.login') }}
68
- </button>
69
- </div>
70
- </div>
71
- <div v-if="sysConfig.techSupport === 'Y'" class="absolute flex justify-center w-full font-bold bottom-1">
72
- <img :src="utogether" class="!h-10" style="height: 40px" />
73
- <span class="flex flex-row justify-center" style="width: 300px">
74
- <span style="font-size: 0; text-align: center">
75
- <a
76
- href="http://www.u-together.cn/"
77
- target="_blank"
78
- class="!inline-block"
79
- style="margin-bottom: -5px; font-size: 17px; color: #fff; mix-blend-mode: difference"
80
- :style="{ color: sysConfig.baseColor || '#FFF' }"
81
- >
82
- 深圳友聚信息技术有限公司
83
- </a>
84
- <a
85
- href="http://www.u-together.cn/"
86
- target="_blank"
87
- class="!inline-block"
88
- style="font-size: 12px; color: #fff; mix-blend-mode: difference"
89
- :style="{ color: sysConfig.baseColor || '#FFF' }"
90
- >
91
- SHENZHEN U-TOGETHER CO. LTD
92
- </a>
93
- </span>
94
- <span class="flex items-center text-white" style="width: 75px; font-size: 10px">技术支持</span>
95
- </span>
96
- </div>
97
- </div>
98
- </template>
99
-
100
- <script lang="ts">
101
- export default { name: 'LoginView' };
102
- </script>
103
-
104
- <script setup lang="ts">
105
- import { ref, reactive, onBeforeMount } from 'vue';
106
- import { useRouter } from 'vue-router';
107
- import { useI18n } from 'vue-i18n';
108
- // import io from 'socket.io-client';
109
- import { useFavicon } from '@vueuse/core';
110
- import { isEmpty, toDateString } from 'xe-utils';
111
- import { removeClass, storageLocal, errorMessage, cookies, delay } from '@utogether/utils';
112
- import to from 'await-to-js';
113
- // import JSEencrypt from 'jsencrypt';
114
- import { useSystemStoreHook } from '../../store/modules/system';
115
- import { useLayout } from '../../layout/hooks/useLayout';
116
- import { useDataThemeChange } from '../../layout/hooks/useDataThemeChange';
117
- import { getBaseURL, getServiceApi } from '../../api';
118
- import { initDict } from '../../api/user';
119
- import { kTOKEN, kCKTOKEN, kLOGINER, kSYSCONFIG } from '../../contant';
120
- import { getPlatform, getBrower } from '../../utils/browers';
121
- import { onLogined } from '../../utils/lifecycle';
122
- // import bg from '../../assets/svg/bg.svg?component';
123
- import utogether from '../../assets/images/utogether.png';
124
- import welcome from '../../assets/images/welcome.png';
125
-
126
- import LockFill from '@iconify-icons/ri/lock-fill';
127
- import UserFill from '@iconify-icons/ri/user-3-fill';
128
-
129
- interface IContextProps {
130
- username: string;
131
- passWord: string;
132
- verify: number | null;
133
- svg: any;
134
- domain: string;
135
- }
136
- interface IRSAPublic {
137
- publicKeyExponent: string;
138
- publicKeyModulus: string;
139
- requestKey: string;
140
- }
141
- const contextInfo: IContextProps = reactive({
142
- username: '',
143
- passWord: '',
144
- requestKey: '',
145
- verify: null,
146
- svg: null,
147
- domain: ''
148
- });
149
- const publicRSA: IRSAPublic = reactive({
150
- publicKeyExponent: '10001',
151
- publicKeyModulus:
152
- 'a12708ab26367e1711bd767f6bb1f29afbd85380185723d7b492230e2567c95cf5718eca745da0643400ca619fbeec892df61abe1f71ad3b822d076ed831080c53782edf8c0627ee95c57e2bee12fe55da2b3cadec59947a75ccccbbf36fb3b781c93b4bf51489789f1c0849f9023a16ec70bef41a504785e1082b6f13588e29',
153
- requestKey: ''
154
- });
155
-
156
- const bgStyle = ref({
157
- backgroundImage: '',
158
- backgroundRepeat: 'no-repeat',
159
- backgroundPosition: 'center'
160
- });
161
- const refreshKey = ref(0);
162
-
163
- const sysConfig = ref<IRecord>({});
164
- const router = useRouter();
165
- const { t } = useI18n();
166
- const serviceApi = getServiceApi();
167
- // const { $config } = useGlobal();
168
-
169
- const { initStorage } = useLayout();
170
- const { overallStyle, dataThemeChange } = useDataThemeChange();
171
- initStorage();
172
-
173
- const loading = ref(false);
174
- // 登录
175
- const onLogin = async () => {
176
- // insertLoginInfo();
177
- // return;
178
- const { username, passWord, verify } = contextInfo;
179
- if (isEmpty(username) || isEmpty(passWord)) {
180
- return errorMessage(t('message.tip.loginFailure'));
181
- }
182
- // @ts-ignore
183
- setMaxDigits(200);
184
- // @ts-ignore
185
- const rsakeypair = new RSAKeyPair(publicRSA.publicKeyExponent, '', publicRSA.publicKeyModulus);
186
- // @ts-ignore
187
- const password = encryptedString(rsakeypair, passWord.split('').reverse().join(''));
188
- // const key = new JSEencrypt();
189
- // key.setPublicKey(
190
- // '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChJwirJjZ+FxG9dn9rsfKa+9hTgBhXI9e0kiMOJWfJXPVxjsp0XaBkNADKYZ++7Ikt9hq+H3GtO4ItB27YMQgMU3gu34wGJ+6VxX4r7hL+VdorPK3sWZR6dczMu/Nvs7eByTtL9RSJeJ8cCEn5AjoW7HC+9BpQR4XhCCtvE1iOKQIDAQAB-----END PUBLIC KEY-----'
191
- // );
192
- // const password = key.encrypt(passWord);
193
- // // console.log('password1 ===', password1);
194
- // console.log('password ===', password);
195
- const param = {
196
- username,
197
- password,
198
- requestKey: publicRSA.requestKey,
199
- verify: verify,
200
- domain: getBaseURL()
201
- };
202
- loading.value = true;
203
- const [err, data] = await to(serviceApi.post('/uath/login', param));
204
- if (err) {
205
- loading.value = false;
206
- return;
207
- }
208
- useSystemStoreHook().setSessionKey(data);
209
- cacheToken(data);
210
- cookies.set(kLOGINER, username);
211
- if (!storageLocal.getItem('kLov')) {
212
- initDict().then(res => useSystemStoreHook().setDict(res));
213
- }
214
- // initSocket(username);
215
- await delay(100);
216
- // 执行登录成功后的函数
217
- onLogined();
218
- router.push('/');
219
- insertLoginInfo(username);
220
- loading.value = false;
221
- };
222
-
223
- function onUserBlur() {
224
- if (contextInfo.username.length === 0) removeClass(document.querySelector('.user'), 'focus');
225
- }
226
-
227
- function onPwdBlur() {
228
- if (contextInfo.passWord.length === 0) removeClass(document.querySelector('.pwd'), 'focus');
229
- }
230
-
231
- /**
232
- * @description: 缓存token
233
- * @param {*} token token数据
234
- * @return {*}
235
- */
236
- const cacheToken = token => {
237
- const { access_token, expires_in, refresh_token } = token;
238
- const cache = {
239
- accessToken: access_token,
240
- refreshToken: refresh_token,
241
- // expires: Date.now() + expires_in
242
- expires: Date.now() + expires_in * 1000
243
- };
244
-
245
- cookies.set(kCKTOKEN, token.access_token);
246
- const dataString = JSON.stringify(cache);
247
- expires_in > 0 ? cookies.set(kTOKEN, dataString) : cookies.set(kTOKEN, dataString);
248
- };
249
-
250
- // let socketIo = null;
251
- // const initSocket = username => {
252
- // socketIo = io(`ws://119.145.169.186:10006/webSocket/${username}`, {
253
- // transports: ['websocket']
254
- // });
255
- // socketIo.on('connection', res => {
256
- // console.log('connection', res);
257
- // });
258
- // socketIo.on('connected', res => {
259
- // console.log('connected', res);
260
- // });
261
- // socketIo.on('close', res => {
262
- // console.log('connected', res);
263
- // });
264
- // socketIo.on('message', res => {
265
- // console.log('message', res);
266
- // // ElNotification({
267
- // // title: '您有一条新的消息',
268
- // // message: res,
269
- // // type: 'success'
270
- // // });
271
- // });
272
- // };
273
-
274
- const insertLoginInfo = username => {
275
- const userAgent = navigator.userAgent.toLowerCase();
276
- const { browser, browserVersion } = getBrower(userAgent);
277
- const obj = {
278
- userName: username,
279
- loginTime: toDateString(new Date()),
280
- browser,
281
- browserVersion,
282
- operatingSystem: getPlatform(userAgent)
283
- };
284
- serviceApi.post('/upfm/v1/userMonitor', obj);
285
- };
286
-
287
- const getSysConfig = async () => {
288
- const [err, data]: [Error, any] = await to(serviceApi.get('/upfm/v1/sysConfig', {}));
289
- if (!err) {
290
- const config: any = {};
291
- data.list?.forEach(item => {
292
- config[item.configCode] = item.configValue;
293
- if (item.fileName) {
294
- config[item.configCode] = getBaseURL() + '/ufil' + item.configValue;
295
- }
296
- });
297
- const title = data.list?.find(f => f.configCode === 'title')?.configValue;
298
- config['title'] = title || 'U-DP';
299
- sysConfig.value = config;
300
- bgStyle.value = {
301
- backgroundImage: config['backgroundImg'] ? `url(${config['backgroundImg']})` : ``,
302
- // backgroundImage: config['backgroundImg'] ? `url(${config['backgroundImg']})` : `url1(${welcome})`,
303
- backgroundRepeat: 'no-repeat',
304
- backgroundPosition: 'center'
305
- };
306
- console.log('bgStyle=', bgStyle);
307
- const favicon = useFavicon();
308
- favicon.value = config.favicon || utogether;
309
- storageLocal.setItem(kSYSCONFIG, config);
310
- }
311
- };
312
-
313
- dataThemeChange(overallStyle.value);
314
-
315
- onBeforeMount(() => {
316
- getSysConfig();
317
- // cookies.addPrefix('sitzone-mes');
318
- });
319
- </script>
320
-
321
- <style scoped>
322
- @import url('../../style/login.css');
323
- </style>
1
+ <template>
2
+ <!-- <img :src="bg" class="wave" /> -->
3
+ <div :key="refreshKey" class="login-container" :style="bgStyle">
4
+ <div v-if="!bgStyle.backgroundImage" class="img pr-24">
5
+ <img :src="welcome" />
6
+ </div>
7
+ <div class="login-box">
8
+ <div class="login-form">
9
+ <h2 v-motion :initial="{ opacity: 0, y: 100 }" :enter="{ opacity: 1, y: 0, transition: { delay: 100 } }">
10
+ {{ sysConfig['title'] }}
11
+ </h2>
12
+ <div
13
+ v-motion
14
+ class="input-group user focus"
15
+ :initial="{ opacity: 0, y: 100 }"
16
+ :enter="{ opacity: 1, y: 0, transition: { delay: 200 } }"
17
+ >
18
+ <div class="icon">
19
+ <IconifyIconOffline :icon="UserFill" width="30" height="30" />
20
+ </div>
21
+ <div>
22
+ <i class="ri-logout-box-line" />
23
+ <h5>{{ $t('message.udp.userName') }}</h5>
24
+ <input
25
+ v-model.trim="contextInfo.username"
26
+ v-focus
27
+ type="text"
28
+ class="input"
29
+ @blur="onUserBlur"
30
+ @keyup.enter="onLogin"
31
+ />
32
+ </div>
33
+ </div>
34
+ <div
35
+ v-motion
36
+ class="input-group pwd focus"
37
+ :initial="{ opacity: 0, y: 100 }"
38
+ :enter="{
39
+ opacity: 1,
40
+ y: 0,
41
+ transition: { delay: 300 }
42
+ }"
43
+ >
44
+ <div class="icon">
45
+ <IconifyIconOffline :icon="LockFill" width="30" height="30" />
46
+ </div>
47
+ <div>
48
+ <h5>{{ $t('message.udp.password') }}</h5>
49
+ <input
50
+ v-model.trim="contextInfo.passWord"
51
+ type="password"
52
+ class="input"
53
+ @blur="onPwdBlur"
54
+ @keyup.enter="onLogin"
55
+ />
56
+ </div>
57
+ </div>
58
+ <button
59
+ v-motion
60
+ class="btn"
61
+ :initial="{ opacity: 0, y: 10 }"
62
+ :enter="{ opacity: 1, y: 0, transition: { delay: 400 } }"
63
+ :disabled="loading"
64
+ :class="{ loading: loading }"
65
+ @click="onLogin"
66
+ >
67
+ {{ $t('message.udp.login') }}
68
+ </button>
69
+ </div>
70
+ </div>
71
+ <div v-if="sysConfig.techSupport === 'Y'" class="absolute flex justify-center w-full font-bold bottom-1">
72
+ <img :src="utogether" class="!h-10" style="height: 40px" />
73
+ <span class="flex flex-row justify-center" style="width: 300px">
74
+ <span style="font-size: 0; text-align: center">
75
+ <a
76
+ href="http://www.u-together.cn/"
77
+ target="_blank"
78
+ class="!inline-block"
79
+ style="margin-bottom: -5px; font-size: 17px; color: #fff; mix-blend-mode: difference"
80
+ :style="{ color: sysConfig.baseColor || '#FFF' }"
81
+ >
82
+ 深圳友聚信息技术有限公司
83
+ </a>
84
+ <a
85
+ href="http://www.u-together.cn/"
86
+ target="_blank"
87
+ class="!inline-block"
88
+ style="font-size: 12px; color: #fff; mix-blend-mode: difference"
89
+ :style="{ color: sysConfig.baseColor || '#FFF' }"
90
+ >
91
+ SHENZHEN U-TOGETHER CO. LTD
92
+ </a>
93
+ </span>
94
+ <span class="flex items-center text-white" style="width: 75px; font-size: 10px">技术支持</span>
95
+ </span>
96
+ </div>
97
+ </div>
98
+ </template>
99
+
100
+ <script lang="ts">
101
+ export default { name: 'LoginView' };
102
+ </script>
103
+
104
+ <script setup lang="ts">
105
+ import { ref, reactive, onBeforeMount } from 'vue';
106
+ import { useRouter } from 'vue-router';
107
+ import { useI18n } from 'vue-i18n';
108
+ // import io from 'socket.io-client';
109
+ import { useFavicon } from '@vueuse/core';
110
+ import { isEmpty, toDateString } from 'xe-utils';
111
+ import { removeClass, storageLocal, errorMessage, cookies, delay } from '@utogether/utils';
112
+ import to from 'await-to-js';
113
+ // import JSEencrypt from 'jsencrypt';
114
+ import { useSystemStoreHook } from '../../store/modules/system';
115
+ import { useLayout } from '../../layout/hooks/useLayout';
116
+ import { useDataThemeChange } from '../../layout/hooks/useDataThemeChange';
117
+ import { getBaseURL, getServiceApi } from '../../api';
118
+ import { initDict } from '../../api/user';
119
+ import { kTOKEN, kCKTOKEN, kLOGINER, kSYSCONFIG } from '../../contant';
120
+ import { getPlatform, getBrower } from '../../utils/browers';
121
+ import { onLogined } from '../../utils/lifecycle';
122
+ // import bg from '../../assets/svg/bg.svg?component';
123
+ import utogether from '../../assets/images/utogether.png';
124
+ import welcome from '../../assets/images/welcome.png';
125
+
126
+ import LockFill from '@iconify-icons/ri/lock-fill';
127
+ import UserFill from '@iconify-icons/ri/user-3-fill';
128
+
129
+ interface IContextProps {
130
+ username: string;
131
+ passWord: string;
132
+ verify: number | null;
133
+ svg: any;
134
+ domain: string;
135
+ }
136
+ interface IRSAPublic {
137
+ publicKeyExponent: string;
138
+ publicKeyModulus: string;
139
+ requestKey: string;
140
+ }
141
+ const contextInfo: IContextProps = reactive({
142
+ username: '',
143
+ passWord: '',
144
+ requestKey: '',
145
+ verify: null,
146
+ svg: null,
147
+ domain: ''
148
+ });
149
+ const publicRSA: IRSAPublic = reactive({
150
+ publicKeyExponent: '10001',
151
+ publicKeyModulus:
152
+ 'a12708ab26367e1711bd767f6bb1f29afbd85380185723d7b492230e2567c95cf5718eca745da0643400ca619fbeec892df61abe1f71ad3b822d076ed831080c53782edf8c0627ee95c57e2bee12fe55da2b3cadec59947a75ccccbbf36fb3b781c93b4bf51489789f1c0849f9023a16ec70bef41a504785e1082b6f13588e29',
153
+ requestKey: ''
154
+ });
155
+
156
+ const bgStyle = ref({
157
+ backgroundImage: '',
158
+ backgroundRepeat: 'no-repeat',
159
+ backgroundPosition: 'center'
160
+ });
161
+ const refreshKey = ref(0);
162
+
163
+ const sysConfig = ref<IRecord>({});
164
+ const router = useRouter();
165
+ const { t } = useI18n();
166
+ const serviceApi = getServiceApi();
167
+ // const { $config } = useGlobal();
168
+
169
+ const { initStorage } = useLayout();
170
+ const { overallStyle, dataThemeChange } = useDataThemeChange();
171
+ initStorage();
172
+
173
+ const loading = ref(false);
174
+ // 登录
175
+ const onLogin = async () => {
176
+ // insertLoginInfo();
177
+ // return;
178
+ const { username, passWord, verify } = contextInfo;
179
+ if (isEmpty(username) || isEmpty(passWord)) {
180
+ return errorMessage(t('message.tip.loginFailure'));
181
+ }
182
+ // @ts-ignore
183
+ setMaxDigits(200);
184
+ // @ts-ignore
185
+ const rsakeypair = new RSAKeyPair(publicRSA.publicKeyExponent, '', publicRSA.publicKeyModulus);
186
+ // @ts-ignore
187
+ const password = encryptedString(rsakeypair, passWord.split('').reverse().join(''));
188
+ // const key = new JSEencrypt();
189
+ // key.setPublicKey(
190
+ // '-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChJwirJjZ+FxG9dn9rsfKa+9hTgBhXI9e0kiMOJWfJXPVxjsp0XaBkNADKYZ++7Ikt9hq+H3GtO4ItB27YMQgMU3gu34wGJ+6VxX4r7hL+VdorPK3sWZR6dczMu/Nvs7eByTtL9RSJeJ8cCEn5AjoW7HC+9BpQR4XhCCtvE1iOKQIDAQAB-----END PUBLIC KEY-----'
191
+ // );
192
+ // const password = key.encrypt(passWord);
193
+ // // console.log('password1 ===', password1);
194
+ // console.log('password ===', password);
195
+ const param = {
196
+ username,
197
+ password,
198
+ requestKey: publicRSA.requestKey,
199
+ verify: verify,
200
+ domain: getBaseURL()
201
+ };
202
+ loading.value = true;
203
+ const [err, data] = await to(serviceApi.post('/uath/login', param));
204
+ if (err) {
205
+ loading.value = false;
206
+ return;
207
+ }
208
+ useSystemStoreHook().setSessionKey(data);
209
+ cacheToken(data);
210
+ cookies.set(kLOGINER, username);
211
+ if (!storageLocal.getItem('kLov')) {
212
+ initDict().then(res => useSystemStoreHook().setDict(res));
213
+ }
214
+ // initSocket(username);
215
+ await delay(100);
216
+ // 执行登录成功后的函数
217
+ onLogined();
218
+ router.push('/');
219
+ insertLoginInfo(username);
220
+ loading.value = false;
221
+ };
222
+
223
+ function onUserBlur() {
224
+ if (contextInfo.username.length === 0) removeClass(document.querySelector('.user'), 'focus');
225
+ }
226
+
227
+ function onPwdBlur() {
228
+ if (contextInfo.passWord.length === 0) removeClass(document.querySelector('.pwd'), 'focus');
229
+ }
230
+
231
+ /**
232
+ * @description: 缓存token
233
+ * @param {*} token token数据
234
+ * @return {*}
235
+ */
236
+ const cacheToken = token => {
237
+ const { access_token, expires_in, refresh_token } = token;
238
+ const cache = {
239
+ accessToken: access_token,
240
+ refreshToken: refresh_token,
241
+ // expires: Date.now() + expires_in
242
+ expires: Date.now() + expires_in * 1000
243
+ };
244
+
245
+ cookies.set(kCKTOKEN, token.access_token);
246
+ const dataString = JSON.stringify(cache);
247
+ expires_in > 0 ? cookies.set(kTOKEN, dataString) : cookies.set(kTOKEN, dataString);
248
+ };
249
+
250
+ // let socketIo = null;
251
+ // const initSocket = username => {
252
+ // socketIo = io(`ws://119.145.169.186:10006/webSocket/${username}`, {
253
+ // transports: ['websocket']
254
+ // });
255
+ // socketIo.on('connection', res => {
256
+ // console.log('connection', res);
257
+ // });
258
+ // socketIo.on('connected', res => {
259
+ // console.log('connected', res);
260
+ // });
261
+ // socketIo.on('close', res => {
262
+ // console.log('connected', res);
263
+ // });
264
+ // socketIo.on('message', res => {
265
+ // console.log('message', res);
266
+ // // ElNotification({
267
+ // // title: '您有一条新的消息',
268
+ // // message: res,
269
+ // // type: 'success'
270
+ // // });
271
+ // });
272
+ // };
273
+
274
+ const insertLoginInfo = username => {
275
+ const userAgent = navigator.userAgent.toLowerCase();
276
+ const { browser, browserVersion } = getBrower(userAgent);
277
+ const obj = {
278
+ userName: username,
279
+ loginTime: toDateString(new Date()),
280
+ browser,
281
+ browserVersion,
282
+ operatingSystem: getPlatform(userAgent)
283
+ };
284
+ serviceApi.post('/upfm/v1/userMonitor', obj);
285
+ };
286
+
287
+ const getSysConfig = async () => {
288
+ const [err, data]: [Error, any] = await to(serviceApi.get('/upfm/v1/sysConfig', {}));
289
+ if (!err) {
290
+ const config: any = {};
291
+ data.list?.forEach(item => {
292
+ config[item.configCode] = item.configValue;
293
+ if (item.fileName) {
294
+ config[item.configCode] = getBaseURL() + '/ufil' + item.configValue;
295
+ }
296
+ });
297
+ const title = data.list?.find(f => f.configCode === 'title')?.configValue;
298
+ config['title'] = title || 'U-DP';
299
+ sysConfig.value = config;
300
+ bgStyle.value = {
301
+ backgroundImage: config['backgroundImg'] ? `url(${config['backgroundImg']})` : ``,
302
+ // backgroundImage: config['backgroundImg'] ? `url(${config['backgroundImg']})` : `url1(${welcome})`,
303
+ backgroundRepeat: 'no-repeat',
304
+ backgroundPosition: 'center'
305
+ };
306
+ console.log('bgStyle=', bgStyle);
307
+ const favicon = useFavicon();
308
+ favicon.value = config.favicon || utogether;
309
+ storageLocal.setItem(kSYSCONFIG, config);
310
+ }
311
+ };
312
+
313
+ dataThemeChange(overallStyle.value);
314
+
315
+ onBeforeMount(() => {
316
+ getSysConfig();
317
+ // cookies.addPrefix('sitzone-mes');
318
+ });
319
+ </script>
320
+
321
+ <style scoped>
322
+ @import url('../../style/login.css');
323
+ </style>