t-lj-service 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,255 @@
1
+ // import nodes from './../../public/nodes.json';
2
+ import {randomInt, setLocal, decrypt, message} from './hooks';
3
+ import {POST, type ServiceResponse, CreateQuery} from './service';
4
+ let allStatus: boolean = false;
5
+
6
+ const configParams: string = JSON.stringify([{
7
+ key: "FrontConfig",
8
+ value: JSON.stringify({ ConfigIden: "", ConfigType: "APP", ConfigContent: "" }),
9
+ }]);
10
+
11
+ const serviceParams: string = JSON.stringify([{
12
+ key: "FrontConfig",
13
+ value: JSON.stringify({ ConfigIden: "", ConfigType: "biznode".toUpperCase(), ConfigContent: "" }),
14
+ }]);
15
+ const nodeCenterParams: string = JSON.stringify([{
16
+ key: "FrontConfig",
17
+ value: JSON.stringify({ ConfigIden: "", ConfigType: "nodecenter".toUpperCase(), ConfigContent: "" }),
18
+ }]);
19
+
20
+ interface OWN {
21
+ sign?: string;
22
+ serviden?: string;
23
+ checkTokenServiden?: string;
24
+ version?: string;
25
+ host?: string;
26
+ servpath?: string;
27
+ params?: string;
28
+ type?: string;
29
+ secretKey?: string;
30
+ nodes?: any[];
31
+ appConfig?: any;
32
+ token?: any;
33
+ config?: any;
34
+ }
35
+
36
+ const _replace = (path: string = '/permission-denied'): void => {
37
+ window.location.href = `${window.location.origin}${path}`;
38
+ }
39
+
40
+ const _address = async (serviden: string = '', version: string = '', nodes: any[] = []): Promise<any> => {
41
+ let host: string = '', node: any = null;
42
+ nodes.forEach((el: any) => {
43
+ if (el.serviden === serviden && el.version === version) {
44
+ const {url_addrs} = el;
45
+ const idx: number = randomInt(0, url_addrs.length);
46
+ const urls = url_addrs[idx];
47
+ host = urls.ipaddr;
48
+ node = el;
49
+ }
50
+ })
51
+ return {
52
+ host, node,
53
+ };
54
+ }
55
+
56
+ const _loadConfig = async ({
57
+ host = '',
58
+ servpath = '',
59
+ serviden = '',
60
+ params = '',
61
+ }: OWN = {}): Promise<ServiceResponse> => {
62
+ const res: ServiceResponse = await POST(`${host}${servpath}/LoadFConfig`, CreateQuery({
63
+ ServIdentifer: serviden,
64
+ BizType: 'nodes',
65
+ ReqDatas: params,
66
+ }));
67
+ return res;
68
+ }
69
+
70
+
71
+ const _initType = async ({
72
+ host = '',
73
+ servpath = '',
74
+ serviden = '',
75
+ type = '',
76
+ secretKey = '',
77
+ version = '',
78
+ nodes = [],
79
+ checkTokenServiden = '',
80
+ appConfig = {},
81
+ }: OWN = {}): Promise<void> => {
82
+ const { keytoken, ivtoken, loginType } = appConfig;
83
+ if (type === 'SSO') {
84
+ await setLocal('sessionislogin', 'Y');
85
+ await _load();
86
+ } else if (type === 'NON') {
87
+ if(loginType === 'CUS' || loginType === 'SSO') {
88
+ _replace();
89
+ } else {
90
+ await setLocal('sessionislogin', 'N');
91
+ let token: any = await decrypt(secretKey, keytoken, ivtoken);
92
+ token = token !== '' ? JSON.parse(token) : {};
93
+ await setLocal('sessiontoken', token);
94
+ await setLocal('sessioncurrlang', token.Currlang);
95
+ await _load({ host, servpath, serviden, token, checkTokenServiden, version, nodes });
96
+ }
97
+ } else {
98
+ _status();
99
+ _replace();
100
+ }
101
+ }
102
+
103
+ const _load = async ({
104
+ host = '',
105
+ servpath = '',
106
+ serviden = '',
107
+ checkTokenServiden = '',
108
+ nodes = [],
109
+ version = '',
110
+ token = {},
111
+ }: OWN = {}): Promise<void> => {
112
+ await _loadUseServices({
113
+ host,
114
+ servpath,
115
+ serviden,
116
+ params: serviceParams,
117
+ });
118
+ await _loadNodeCenter({
119
+ host,
120
+ servpath,
121
+ serviden,
122
+ params: nodeCenterParams,
123
+ });
124
+ // await _loadI18(token.Currlang);
125
+ // await _loadI18Item();
126
+ await _checkToken({
127
+ token, checkTokenServiden, nodes, version
128
+ });
129
+ }
130
+
131
+ const _loadUseServices = async ({
132
+ host = '',
133
+ servpath = '',
134
+ serviden = '',
135
+ params = '',
136
+ }: OWN = {}): Promise<void> => {
137
+ const {data, code, msg}: ServiceResponse = await _loadConfig({host, servpath, serviden, params});
138
+ if (code === 1) {
139
+ const useservices: any = data.length > 0 ? data[0].ConfigContent.biznode : [];
140
+ await setLocal('sessionuseservices', useservices);
141
+ _status(true);
142
+ } else {
143
+ _status();
144
+ message(msg, 'error');
145
+ _replace();
146
+ }
147
+ }
148
+ const _loadNodeCenter = async ({
149
+ host = '',
150
+ servpath = '',
151
+ serviden = '',
152
+ params = '',
153
+ }: OWN = {}): Promise<void> => {
154
+ const {data, code, msg}: ServiceResponse = await _loadConfig({host, servpath, serviden, params});
155
+ if (code === 1) {
156
+ const nodecenter: any = data.length > 0 ? data[0].ConfigContent : {};
157
+ await setLocal('sessionnodecenter', nodecenter);
158
+ _status(true);
159
+ } else {
160
+ _status();
161
+ message(msg, 'error');
162
+ _replace();
163
+ }
164
+ }
165
+
166
+ // const _loadI18 = async (lang: string): Promise<void> => {
167
+ // try {
168
+ // const i18: any = await import(`./../../public/i18nlang/i18nframe_${lang}.json`);
169
+ // await setLocal('sessioni18nframelang', i18);
170
+ // _status(true);
171
+ // } catch (err: any){
172
+ // message(err.message, 'error');
173
+ // _status();
174
+ // }
175
+ // }
176
+ // const _loadI18Item = async (): Promise<void> => {
177
+ // try {
178
+ // const i18Item: any = await import(`./../../public/i18nlang/i18nframeItem.json`);
179
+ // await setLocal('sessionlangitem', i18Item.langItemsubs);
180
+ // _status(true);
181
+ // } catch (err: any){
182
+ // message(err.message, 'error');
183
+ // _status();
184
+ // }
185
+ // }
186
+ // const _loadSystemMenuItem = async (): Promise<void> => {
187
+ // try {
188
+ // const i18Item: any = await import(`./../../public/i18nlang/i18nframesystem.json`);
189
+ // await setLocal('sessionsystemmenu', i18Item);
190
+ // _status(true);
191
+ // } catch (err: any){
192
+ // message(err.message, 'error');
193
+ // _status();
194
+ // }
195
+ // }
196
+ const _checkToken = async ({
197
+ token = {},
198
+ checkTokenServiden = '',
199
+ version = '',
200
+ nodes = [],
201
+ }: OWN = {}): Promise<void> => {
202
+ const { node, host } = await _address(checkTokenServiden, version, nodes);
203
+ const check: string = JSON.stringify([{
204
+ key: "SSY_DYNAMICTOKEN", value: JSON.stringify({
205
+ ID: token.Tokenud.split('_')[0], Dynamictoken: token.Tokenud.split('_')[1]
206
+ })
207
+ }]);
208
+ const { code, msg }: ServiceResponse = await POST(`${host}${node.servpath}/CheckToken`, CreateQuery({
209
+ ServIdentifer: checkTokenServiden,
210
+ BizType: 'nodes',
211
+ ReqDatas: check,
212
+ }), { 'Token': JSON.stringify(token) });
213
+ if(code === 1){
214
+ await setLocal('sessiontokenok', '1');
215
+ _status(true);
216
+ // await _loadSystemMenuItem();
217
+ } else {
218
+ _status();
219
+ message(msg, 'error');
220
+ _replace();
221
+ }
222
+ }
223
+
224
+ const _status = (status: boolean = false): void => {
225
+ allStatus = status;
226
+ }
227
+
228
+ export const permission = async ({
229
+ sign = '',
230
+ serviden = 'DevCenterManager',
231
+ version = '1.0',
232
+ checkTokenServiden = 'DevCenterSecrity',
233
+ config = {},
234
+ }: OWN = {}): Promise<any> => {
235
+ _status();
236
+ const type: string = sign.substring(0, 3);
237
+ const secretKey: string = sign.substring(3, sign.length);
238
+ const { biznode }: any = config;
239
+ const {host, node} = await _address(serviden, version, biznode);
240
+ await setLocal('sessioncurraddr', host);
241
+ await setLocal('sessionnodes', node);
242
+ const {servpath} = node;
243
+ const {data, code, msg}: ServiceResponse = await _loadConfig({host, servpath, serviden, params: configParams});
244
+ if (code === 1) {
245
+ _status(true);
246
+ const appConfig: any = data.length > 0 ? data[0].ConfigContent : {};
247
+ await setLocal('sessionappconfig', appConfig);
248
+ await _initType({type, secretKey, appConfig, host, servpath, serviden, checkTokenServiden, version, nodes: biznode });
249
+ return allStatus;
250
+ } else {
251
+ _status();
252
+ message(msg, 'error');
253
+ _replace();
254
+ }
255
+ }
@@ -0,0 +1,15 @@
1
+ import { initGlobalState, type MicroAppStateActions } from 'qiankun';
2
+
3
+ const state = {
4
+ token: '',
5
+ };
6
+
7
+ export const actions: MicroAppStateActions = initGlobalState(state);
8
+
9
+ actions.onGlobalStateChange((state, prev) => {
10
+
11
+ console.log(state, prev);
12
+
13
+ })
14
+
15
+
@@ -0,0 +1,14 @@
1
+ const apps: any[] = [
2
+ // {
3
+ // name: 'business',
4
+ // entry: import.meta.env.VITE_APP_ENV === 'production' ? 'http://1.119.199.37:19096' : '//localhost:9096',
5
+ // activeRule: '/business/',
6
+ // },
7
+ // {
8
+ // name: 'smart',
9
+ // entry: import.meta.env.VITE_APP_ENV === 'production' ? 'http://1.119.199.37:19097' : '//localhost:9097',
10
+ // activeRule: '/smart/',
11
+ // },
12
+ ];
13
+
14
+ export default apps ;
@@ -0,0 +1,181 @@
1
+ import { createApp, type Component } from 'vue';
2
+ import {
3
+ registerMicroApps,
4
+ runAfterFirstMounted,
5
+ start,
6
+ } from 'qiankun';
7
+ import {
8
+ qiankunWindow,
9
+ type QiankunProps,
10
+ renderWithQiankun
11
+ } from 'vite-plugin-qiankun/dist/helper';
12
+ // import microApps from './micro-apps'
13
+ import { actions } from './actions'
14
+ const loader = (loading: boolean): void => {
15
+ console.log('loading', loading);
16
+ }
17
+
18
+
19
+ const initApps = (apps: any[] = [], container: string = '#container'): void => {
20
+ const microApps: any[] = apps.map((item: any) => {
21
+ return {
22
+ ...item,
23
+ container,
24
+ loader,
25
+ props: {
26
+ actions,
27
+ routerBase: item.activeRule,
28
+ },
29
+ sandbox: {
30
+ strictStyleIsolation: false,
31
+ experimentalStyleIsolation: false,
32
+ fallback: true
33
+ },
34
+ afterMount: () => {
35
+ console.log('子应用加载完成');
36
+ }
37
+ }
38
+ });
39
+
40
+ registerMicroApps(
41
+ microApps,
42
+ {
43
+ beforeLoad: (app: any) => {
44
+ console.log('[LifeCycle] before load %c%s', app.name);
45
+ return Promise.resolve();
46
+ },
47
+ beforeMount: (app: any) => {
48
+ console.log('[LifeCycle] before mount %c%s', app.name);
49
+ return Promise.resolve();
50
+ },
51
+ afterUnmount: (app: any) => {
52
+ console.log('[LifeCycle] before unmount %c%s', app.name);
53
+ return Promise.resolve();
54
+ }
55
+ }
56
+ )
57
+ }
58
+
59
+ const startApp = (apps: any[] = [], container: string = '#container') => {
60
+ initApps(apps, container);
61
+ start({
62
+ prefetch: 'all',
63
+ singular: true,
64
+ // sandbox: {
65
+ // experimentalStyleIsolation: true,
66
+ // }
67
+ });
68
+ runAfterFirstMounted(() => {
69
+ console.log('[MainApp] first app mounted')
70
+ })
71
+ }
72
+ const autoApp = (url: string = '/business/') => {
73
+ window.history.replaceState({}, '', url)
74
+ }
75
+
76
+
77
+
78
+
79
+ // 子系统
80
+ type GlobalIcons = Record<string, Component>;
81
+ const _setInner = (container: HTMLDivElement) => {
82
+ container.style.width = `${window.innerWidth - 30}px`
83
+ container.style.height = `${window.innerHeight - 85}px`
84
+ container.style.boxSizing = `border-box`
85
+ }
86
+ const _window = (container: HTMLDivElement, type: number = 1) => {
87
+ if(type === 1){
88
+ window.addEventListener('resize', () => _setInner(container));
89
+ } else {
90
+ window.removeEventListener('resize', () => _setInner(container));
91
+ }
92
+ }
93
+ const render = (
94
+ root: ReturnType<typeof createApp>,
95
+ App: Component | null = null,
96
+ use: any[] = [],
97
+ id: string = '#container',
98
+ icons: GlobalIcons | null = null,
99
+ props: QiankunProps = {},
100
+ ) => {
101
+ const { container, actions } = props;
102
+ root = createApp(App);
103
+
104
+ actions?.onGlobalStateChange((state: any, prev: any) => {
105
+ console.log('子应用监听到全局状态变化:', state, prev);
106
+ // 可以在这里处理状态变化逻辑
107
+ });
108
+
109
+ if(icons){
110
+ for (const [key, component] of Object.entries(icons)) {
111
+ root.component(key, component)
112
+ }
113
+ }
114
+
115
+ use.forEach((item: any) => {
116
+ root.use(item.module, item.options || {});
117
+ })
118
+ // registerElementPlusIcons(root);
119
+ // root.use(router);
120
+ // root.use(ElementPlus, {
121
+ // locale: ZhCn,
122
+ // });
123
+ // root.use(i18n);
124
+
125
+ const c: any = container?.querySelector(id) || document.querySelector(id);
126
+ _setInner(c);
127
+ _window(c)
128
+ root.mount(c);
129
+ }
130
+
131
+ const initQianKun = (
132
+ root: ReturnType<typeof createApp>,
133
+ App: Component | null = null,
134
+ use: any[] = [],
135
+ id: string = '#container',
136
+ icons: GlobalIcons | null = null,
137
+ ):void => {
138
+ renderWithQiankun({
139
+ async mount(props: QiankunProps) {
140
+ console.log(props);
141
+ render(root, App, use, id, icons, props);
142
+ },
143
+ bootstrap() {},
144
+ unmount(props: QiankunProps): void | Promise<void> {
145
+ const { container } = props;
146
+ const c: any = container?.querySelector(id) || document.querySelector(id);
147
+ _window(c, 0);
148
+ root.unmount();
149
+ },
150
+ update(props: QiankunProps): void | Promise<void> {
151
+ console.log('子应用接收到更新:', props);
152
+ // 可以在这里重新渲染或者更新组件状态
153
+ return;
154
+ },
155
+ });
156
+ };
157
+ const useApp = ({
158
+ root = null,
159
+ App = null,
160
+ use = [],
161
+ id = '#container',
162
+ icons = null,
163
+ }: {
164
+ root?: ReturnType<typeof createApp> | null,
165
+ App?: Component | null,
166
+ use?: any[],
167
+ id?: string,
168
+ icons?: GlobalIcons | null,
169
+ } = {}) => qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun(root, App, use, id, icons) : render(root, App, use, id ,icons);
170
+
171
+
172
+
173
+
174
+
175
+ export {
176
+ autoApp,
177
+ startApp,
178
+ useApp,
179
+ }
180
+
181
+
@@ -0,0 +1,109 @@
1
+ import Axios, { type AxiosResponse } from 'axios';
2
+ import {
3
+ TIME_OUT,
4
+ BASE_URL,
5
+ CreateQuery,
6
+ DEFAULT_QUERY,
7
+ CreateParams,
8
+ RequestConfig
9
+ } from './config';
10
+ import hooks from './hooks'
11
+ import { Code, HttpCodeMessage } from './code'
12
+
13
+ export interface ServiceResponse<T = any> {
14
+ code: number;
15
+ data: T;
16
+ msg: string;
17
+ [key: string]: any;
18
+ }
19
+
20
+ const service = Axios.create({
21
+ baseURL: BASE_URL,
22
+ timeout: TIME_OUT,
23
+ headers: {
24
+ 'Content-Type': 'application/json;charset=UTF-8',
25
+ 'Token': hooks.getLocal('token') || '',
26
+ 'Authorization': `Bearer ${hooks.getLocal("token")}`
27
+ }
28
+ });
29
+
30
+
31
+ service.interceptors.request.use(
32
+ (config: any) => {
33
+ hooks.loading();
34
+ return RequestConfig(config);
35
+ },
36
+ (error: any) => {
37
+ console.log(error)
38
+ hooks.loading(false);
39
+ let msg: string = error.message
40
+ let code: number = Number(`-${error?.request?.status || 500}`);
41
+ if(error.code === 'ERR_NETWORK'){
42
+ code = 999;
43
+ msg = HttpCodeMessage[code]
44
+ } else if(Code.indexOf(error.request.status) !== -1 && error.code !== 'ERR_NETWORK'){
45
+ msg = HttpCodeMessage[error.request.status]
46
+ }
47
+ hooks.message(msg, 'error');
48
+ return Promise.reject({
49
+ code,
50
+ data: null,
51
+ msg,
52
+ });
53
+ }
54
+
55
+ )
56
+
57
+ service.interceptors.response.use(
58
+ (response: AxiosResponse) => {
59
+ hooks.loading(false);
60
+ const data = response.data;
61
+ if (response.status === 200) {
62
+ data.code = Number(data.Status);
63
+ data.msg = data.RespErrorDatas || data.RespSuccessInfo;
64
+ if(data.code !== 1){
65
+ hooks.message(data.msg, 'error')
66
+ }
67
+ try {
68
+ data.data = data.RespDatas !== '' ? JSON.parse(data.RespDatas) : data.RespDatas;
69
+ } catch (err:any) {
70
+ data.data = data.RespDatas;
71
+ }
72
+ return data;
73
+ } else {
74
+ hooks.message(HttpCodeMessage[response.status], 'error')
75
+ data.code = response.status;
76
+ data.msg = HttpCodeMessage[response.status];
77
+ data.data = null;
78
+ return data;
79
+ }
80
+ },
81
+ (error) => {
82
+ console.log(error)
83
+ hooks.loading(false);
84
+ let msg: string = error.message
85
+ let code: number = Number(`-${error?.request?.status || 500}`);
86
+ if(error.code === 'ERR_NETWORK'){
87
+ code = 999;
88
+ msg = HttpCodeMessage[code]
89
+ } else if(Code.indexOf(error.request.status) !== -1 && error.code !== 'ERR_NETWORK'){
90
+ msg = HttpCodeMessage[error.request.status]
91
+ }
92
+ hooks.message(msg, 'error');
93
+ return {
94
+ code,
95
+ data: null,
96
+ msg,
97
+ }
98
+ }
99
+ )
100
+
101
+ type ApiResponse<T> = T extends ServiceResponse<infer U> ? ServiceResponse<U> : ServiceResponse<T>;
102
+
103
+ export const GET = <T = ServiceResponse>(url: string, params?: any): Promise<ApiResponse<T>> => service.get(url, {params});
104
+ export const POST = <T = ServiceResponse>(url: string, data?: any, headers?: any): Promise<ApiResponse<T>> => service.post(url, data, headers);
105
+ export const DELETE = <T = ServiceResponse>(url: string, params?: any): Promise<ApiResponse<T>> => service.delete(url, {params});
106
+ export const PUT = <T = ServiceResponse>(url: string, data?: any, headers?: any): Promise<ApiResponse<T>> => service.put(url, data, headers);
107
+
108
+ export { CreateQuery, CreateParams, DEFAULT_QUERY };
109
+
package/module/zip.ts ADDED
@@ -0,0 +1,59 @@
1
+ import JSZip from "jszip";
2
+ import FileSaver from "file-saver";
3
+ import axios from 'axios';
4
+ import hooks from "./hooks";
5
+
6
+
7
+ const getFile = (url: string, token: string = localStorage.getItem('sessiontoken') || ''): Promise<ArrayBuffer> => {
8
+ return new Promise((resolve, reject) => {
9
+ axios({
10
+ method: 'get',
11
+ url,
12
+ responseType: 'arraybuffer',
13
+ withCredentials: false,
14
+ headers:{
15
+ 'Content-Type': 'application/json;charset=UTF-8',
16
+ 'Token': token
17
+ }
18
+ }).then(res => {
19
+ resolve(res.data);
20
+ }).catch(error => {
21
+ hooks.message.error(error);
22
+ reject(error.toString());
23
+ })
24
+ })
25
+ };
26
+ export const zip = async (file: any[], zipName: string = '频道数字化') => {
27
+ if( !file && typeof file !== 'object' ) return ;
28
+ try {
29
+ const zipSDK: JSZip = new JSZip();
30
+ const promises: any[] = [];
31
+ const cache: any = {};
32
+
33
+ await file.forEach(item => {
34
+ const promise = getFile(item.filePath).then(dat => {
35
+ // 获取文件名
36
+ let arr = item.fileName ? item.fileName.split('/') : new Date().valueOf();
37
+ const file_name = arr[arr.length-1]
38
+ zipSDK.file(file_name, dat, { binary: true });
39
+ cache[file_name] = dat;
40
+ });
41
+ promises.push(promise)
42
+ });
43
+ Promise.all(promises).then(() => {
44
+ zipSDK.generateAsync({ type: "blob" }).then(content => {
45
+ FileSaver.saveAs(content, zipName + ".zip")
46
+ }).catch(err => {
47
+ hooks.message.error('网络出了点小问题,请稍后再试!');
48
+ console.error("网络出了点小问题,请稍后再试!");
49
+ throw new Error(err)
50
+ })
51
+ });
52
+
53
+ } catch (e: any) {
54
+ throw new Error(e);
55
+ }
56
+ }
57
+
58
+
59
+ export default { zip };
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "t-lj-service",
3
+ "version": "1.0.1",
4
+ "description": "",
5
+ "main": "index.ts",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "author": "the.one",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "@types/crypto-js": "^4.2.2",
13
+ "@types/file-saver": "^2.0.7",
14
+ "@types/jszip": "^3.4.1",
15
+ "axios": "^1.10.0",
16
+ "crypto-js": "^4.2.0",
17
+ "element-plus": "^2.10.4",
18
+ "file-saver": "^2.0.5",
19
+ "jszip": "^3.10.1",
20
+ "qiankun": "^2.10.16",
21
+ "vite": "^7.0.4",
22
+ "vite-plugin-qiankun": "^1.0.15",
23
+ "vue": "^3.5.17",
24
+ "vue-router": "^4.5.1"
25
+ },
26
+ "devDependencies": {
27
+ "@types/crypto-js": "^4.2.2",
28
+ "@types/file-saver": "^2.0.7",
29
+ "@types/jszip": "^3.4.1",
30
+ "axios": "^1.10.0",
31
+ "crypto-js": "^4.2.0",
32
+ "element-plus": "^2.10.4",
33
+ "file-saver": "^2.0.5",
34
+ "jszip": "^3.10.1",
35
+ "qiankun": "^2.10.16",
36
+ "vite": "^7.0.4",
37
+ "vite-plugin-qiankun": "^1.0.15",
38
+ "vue": "^3.5.17",
39
+ "vue-router": "^4.5.1"
40
+ }
41
+ }