@kevisual/api 0.0.48 → 0.0.50
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.
- package/dist/query-ai.d.ts +40 -7
- package/dist/query-app.d.ts +182 -8
- package/dist/query-config.d.ts +70 -10
- package/dist/query-login.d.ts +7 -3
- package/dist/query-login.js +28 -19
- package/dist/query-mark.d.ts +38 -10
- package/dist/query-proxy.d.ts +17 -13
- package/dist/query-proxy.js +15 -1
- package/dist/query-secret.d.ts +27 -5
- package/dist/query-shop.d.ts +28 -2
- package/dist/store-auth.d.ts +30 -0
- package/dist/store-auth.js +43 -0
- package/dist/store-mark.d.ts +154 -0
- package/dist/store-mark.js +444 -0
- package/dist/utils.d.ts +3 -3
- package/package.json +10 -5
- package/query/query-login/login-cache.ts +4 -0
- package/query/query-login/query-login.ts +26 -19
- package/query/query-proxy/proxy.ts +25 -9
- package/query/query-proxy/router-api-proxy.ts +1 -0
- package/store/store-auth/index.ts +66 -0
- package/store/store-mark/index.ts +132 -0
|
@@ -62,7 +62,7 @@ export type RouterViewWorker = {
|
|
|
62
62
|
} & RouteViewBase;
|
|
63
63
|
|
|
64
64
|
/**
|
|
65
|
-
*
|
|
65
|
+
* 去掉不需要保存的服务器的数据
|
|
66
66
|
* @param item
|
|
67
67
|
* @returns
|
|
68
68
|
*/
|
|
@@ -86,7 +86,7 @@ export const pickRouterViewData = (item: RouterViewItem) => {
|
|
|
86
86
|
return rest
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
|
-
* 注入 js 的url地址,使用importScripts加载
|
|
89
|
+
* 注入 js 的url地址,使用 importScripts 加载
|
|
90
90
|
*/
|
|
91
91
|
export type RouteViewPage = {
|
|
92
92
|
type: 'page',
|
|
@@ -100,6 +100,9 @@ export type RouterViewQuery = {
|
|
|
100
100
|
query: string,
|
|
101
101
|
title: string
|
|
102
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* 后端存储结构
|
|
105
|
+
*/
|
|
103
106
|
export type RouterViewData = {
|
|
104
107
|
data: { items: RouterViewItem[]; }
|
|
105
108
|
views: RouterViewQuery[];
|
|
@@ -121,7 +124,7 @@ export class QueryProxy {
|
|
|
121
124
|
this.initRouterViewQuery();
|
|
122
125
|
this.emitter = new EventEmitter();
|
|
123
126
|
}
|
|
124
|
-
getDefulatToken() {
|
|
127
|
+
private getDefulatToken() {
|
|
125
128
|
try {
|
|
126
129
|
if (typeof window !== 'undefined' && typeof window.localStorage !== 'undefined') {
|
|
127
130
|
return localStorage.getItem('token') || undefined;
|
|
@@ -139,7 +142,7 @@ export class QueryProxy {
|
|
|
139
142
|
});
|
|
140
143
|
}
|
|
141
144
|
|
|
142
|
-
initRouterView(item: RouterViewItem) {
|
|
145
|
+
private initRouterView(item: RouterViewItem) {
|
|
143
146
|
if (item.type === 'api' && item.api?.url) {
|
|
144
147
|
const url = item.api.url;
|
|
145
148
|
if (item?.api?.query) return item;
|
|
@@ -253,6 +256,7 @@ export class QueryProxy {
|
|
|
253
256
|
console.debug(`注册路由: [${r.path}] ${r?.key}`, 'Context');
|
|
254
257
|
let metadata = r.metadata || {};
|
|
255
258
|
metadata.viewItem = item;
|
|
259
|
+
metadata.source = 'query-proxy-context';
|
|
256
260
|
this.router.route({
|
|
257
261
|
path: r.path,
|
|
258
262
|
key: r.key || '',
|
|
@@ -268,7 +272,7 @@ export class QueryProxy {
|
|
|
268
272
|
generateId() {
|
|
269
273
|
return 'route_' + Math.random().toString(36).substring(2, 9);
|
|
270
274
|
}
|
|
271
|
-
async callWorker(msg: any, viewItem: RouterViewWorker['worker']): Promise<Result> {
|
|
275
|
+
private async callWorker(msg: any, viewItem: RouterViewWorker['worker']): Promise<Result> {
|
|
272
276
|
const that = this;
|
|
273
277
|
const requestId = this.generateId();
|
|
274
278
|
const worker = viewItem?.worker;
|
|
@@ -296,7 +300,7 @@ export class QueryProxy {
|
|
|
296
300
|
});
|
|
297
301
|
});
|
|
298
302
|
}
|
|
299
|
-
async initWorker(item?: RouterViewWorker, initRoutes: boolean = true) {
|
|
303
|
+
private async initWorker(item?: RouterViewWorker, initRoutes: boolean = true) {
|
|
300
304
|
const that = this;
|
|
301
305
|
if (!item?.worker?.url) {
|
|
302
306
|
console.warn('Worker URL not provided');
|
|
@@ -347,6 +351,7 @@ export class QueryProxy {
|
|
|
347
351
|
console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API');
|
|
348
352
|
let metadata = r.metadata || {};
|
|
349
353
|
metadata.viewItem = item;
|
|
354
|
+
metadata.source = 'query-proxy-worker';
|
|
350
355
|
this.router.route({
|
|
351
356
|
path: r.path,
|
|
352
357
|
key: r.key || '',
|
|
@@ -364,7 +369,7 @@ export class QueryProxy {
|
|
|
364
369
|
}
|
|
365
370
|
}
|
|
366
371
|
}
|
|
367
|
-
async initPage(item?: RouteViewPage) {
|
|
372
|
+
private async initPage(item?: RouteViewPage) {
|
|
368
373
|
if (!item?.page?.url) {
|
|
369
374
|
console.warn('Page地址未提供');
|
|
370
375
|
return;
|
|
@@ -381,7 +386,7 @@ export class QueryProxy {
|
|
|
381
386
|
return;
|
|
382
387
|
}
|
|
383
388
|
}
|
|
384
|
-
getQueryByViewId(viewId: string): string | undefined {
|
|
389
|
+
private getQueryByViewId(viewId: string): string | undefined {
|
|
385
390
|
const view = this.views.find(v => v.id === viewId);
|
|
386
391
|
if (view) {
|
|
387
392
|
return view.query;
|
|
@@ -465,7 +470,7 @@ export class QueryProxy {
|
|
|
465
470
|
item.response = res;
|
|
466
471
|
return item;
|
|
467
472
|
}
|
|
468
|
-
item.response = { code: 500, message: '无法处理的路由类型' };
|
|
473
|
+
item.response = { code: 500, message: '无法处理的路由类型', data: item };
|
|
469
474
|
return item;
|
|
470
475
|
}
|
|
471
476
|
}
|
|
@@ -477,4 +482,15 @@ export type RouterItem = {
|
|
|
477
482
|
description?: string;
|
|
478
483
|
middleware?: string[];
|
|
479
484
|
metadata?: Record<string, any>;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export const createViewData = (routerViewData: RouterViewItem | RouterViewItem[], data?: RouterViewData): RouterViewData => {
|
|
488
|
+
return {
|
|
489
|
+
views: [],
|
|
490
|
+
viewId: undefined,
|
|
491
|
+
data: {
|
|
492
|
+
items: Array.isArray(routerViewData) ? routerViewData : [routerViewData],
|
|
493
|
+
},
|
|
494
|
+
...data
|
|
495
|
+
}
|
|
480
496
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
import { create } from 'zustand';
|
|
3
|
+
import { toast } from 'sonner';
|
|
4
|
+
import { useContextKey } from '@kevisual/context';
|
|
5
|
+
import { type QueryLoginBrowser } from '@/query/query-login/index.ts'
|
|
6
|
+
const queryLogin = useContextKey<QueryLoginBrowser>('queryLogin');
|
|
7
|
+
|
|
8
|
+
type Me = {
|
|
9
|
+
id?: string;
|
|
10
|
+
username?: string;
|
|
11
|
+
nickname?: string | null;
|
|
12
|
+
needChangePassword?: boolean;
|
|
13
|
+
role?: string;
|
|
14
|
+
description?: string | null;
|
|
15
|
+
type?: 'user' | 'org';
|
|
16
|
+
orgs?: string[];
|
|
17
|
+
avatar?: string;
|
|
18
|
+
};
|
|
19
|
+
export type LayoutStore = {
|
|
20
|
+
open: boolean;
|
|
21
|
+
setOpen: (open: boolean) => void;
|
|
22
|
+
me: Me;
|
|
23
|
+
setMe: (me: Me) => void;
|
|
24
|
+
getMe: () => Promise<void>;
|
|
25
|
+
openUser: boolean;
|
|
26
|
+
setOpenUser: (openUser: boolean) => void;
|
|
27
|
+
switchOrg: (username?: string, type?: 'user' | 'org') => Promise<void>;
|
|
28
|
+
isAdmin: boolean;
|
|
29
|
+
setIsAdmin: (isAdmin: boolean) => void;
|
|
30
|
+
checkHasOrg: () => boolean;
|
|
31
|
+
};
|
|
32
|
+
export const useLayoutStore = create<LayoutStore>((set, get) => ({
|
|
33
|
+
open: false,
|
|
34
|
+
setOpen: (open) => set({ open }),
|
|
35
|
+
me: {},
|
|
36
|
+
setMe: (me) => set({ me }),
|
|
37
|
+
getMe: async () => {
|
|
38
|
+
const res = await queryLogin.getMe();
|
|
39
|
+
if (res.code === 200) {
|
|
40
|
+
set({ me: res.data });
|
|
41
|
+
set({ isAdmin: res.data.orgs?.includes('admin') });
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
openUser: false,
|
|
45
|
+
setOpenUser: (openUser) => set({ openUser }),
|
|
46
|
+
switchOrg: async (username?: string, type?: string) => {
|
|
47
|
+
const res = await queryLogin.switchUser(username || '');
|
|
48
|
+
if (res.code === 200) {
|
|
49
|
+
toast.success('Switch success');
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
window.location.reload();
|
|
52
|
+
}, 1000);
|
|
53
|
+
} else {
|
|
54
|
+
toast.error(res.message || 'Request failed');
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
isAdmin: false,
|
|
58
|
+
setIsAdmin: (isAdmin) => set({ isAdmin }),
|
|
59
|
+
checkHasOrg: () => {
|
|
60
|
+
const user = get().me || {};
|
|
61
|
+
if (!user.orgs) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return user?.orgs?.length > 0;
|
|
65
|
+
},
|
|
66
|
+
}));
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { create } from 'zustand';
|
|
2
|
+
import { type Result } from '@kevisual/query/query';
|
|
3
|
+
import { MarkType, Mark, QueryMark } from '@kevisual/api/query-mark';
|
|
4
|
+
import { uniqBy } from 'es-toolkit';
|
|
5
|
+
import { useContextKey } from '@kevisual/context';
|
|
6
|
+
import { type QueryLoginBrowser } from '@/query/query-login/index.ts'
|
|
7
|
+
const queryClient = useContextKey<QueryLoginBrowser>('queryLogin');
|
|
8
|
+
|
|
9
|
+
type ManagerStore = {
|
|
10
|
+
/** 当前选中的Mark */
|
|
11
|
+
currentMarkId: string;
|
|
12
|
+
setCurrentMarkId: (markId: string) => void;
|
|
13
|
+
markData?: Mark | undefined;
|
|
14
|
+
setMarkData: (mark?: Partial<Mark>) => void;
|
|
15
|
+
/** 获取Mark列表 */
|
|
16
|
+
getList: () => Promise<any>;
|
|
17
|
+
getMarkFromList: (markId: string) => Mark | undefined;
|
|
18
|
+
updateMark: (mark: Mark) => Promise<any>;
|
|
19
|
+
getMark: (markId: string) => Promise<Result<Mark>>;
|
|
20
|
+
deleteMark: (markId: string) => Promise<any>;
|
|
21
|
+
/** Mark列表 */
|
|
22
|
+
list: Mark[];
|
|
23
|
+
setList: (list: Mark[]) => void;
|
|
24
|
+
pagination: {
|
|
25
|
+
current: number;
|
|
26
|
+
pageSize: number;
|
|
27
|
+
total: number;
|
|
28
|
+
};
|
|
29
|
+
setPagination: (pagination: { current: number; pageSize: number; total: number }) => void;
|
|
30
|
+
/** 搜索 */
|
|
31
|
+
search: string;
|
|
32
|
+
setSearch: (search: string) => void;
|
|
33
|
+
/** 初始化 */
|
|
34
|
+
init: (markType: MarkType) => Promise<void>;
|
|
35
|
+
queryMark?: QueryMark;
|
|
36
|
+
markType?: MarkType;
|
|
37
|
+
open: boolean;
|
|
38
|
+
setOpen: (open: boolean) => void;
|
|
39
|
+
};
|
|
40
|
+
export const useMarkStore = create<ManagerStore>((set, get) => {
|
|
41
|
+
return {
|
|
42
|
+
currentMarkId: '',
|
|
43
|
+
setCurrentMarkId: (markId: string) => set(() => ({ currentMarkId: markId })),
|
|
44
|
+
open: false,
|
|
45
|
+
setOpen: (open: boolean) => set(() => ({ open })),
|
|
46
|
+
getList: async () => {
|
|
47
|
+
const queryMark = get().queryMark!;
|
|
48
|
+
const { search, pagination } = get();
|
|
49
|
+
const res = await queryMark.getMarkList({ page: pagination.current, pageSize: pagination.pageSize, search });
|
|
50
|
+
const oldList = get().list;
|
|
51
|
+
if (res.code === 200) {
|
|
52
|
+
const { pagination, list } = res.data || {};
|
|
53
|
+
const newList = [...oldList, ...list!];
|
|
54
|
+
const uniqueList = uniqBy(newList, (item) => item.id);
|
|
55
|
+
set(() => ({ list: uniqueList }));
|
|
56
|
+
set(() => ({ pagination: { current: pagination!.current, pageSize: pagination!.pageSize, total: pagination!.total } }));
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
getMarkFromList: (markId: string) => {
|
|
60
|
+
return get().list.find((item) => item.id === markId);
|
|
61
|
+
},
|
|
62
|
+
updateMark: async (mark: Mark) => {
|
|
63
|
+
const queryMark = get().queryMark!;
|
|
64
|
+
const res = await queryMark.updateMark(mark);
|
|
65
|
+
if (res.code === 200) {
|
|
66
|
+
set((state) => {
|
|
67
|
+
const oldList = state.list;
|
|
68
|
+
const resMark = res.data!;
|
|
69
|
+
const newList = oldList.map((item) => (item.id === mark.id ? mark : item));
|
|
70
|
+
if (!mark.id) {
|
|
71
|
+
newList.unshift(resMark);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
list: newList,
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return res;
|
|
79
|
+
},
|
|
80
|
+
getMark: async (markId: string) => {
|
|
81
|
+
const queryMark = get().queryMark!;
|
|
82
|
+
const res = await queryMark.getMark(markId);
|
|
83
|
+
return res;
|
|
84
|
+
},
|
|
85
|
+
list: [],
|
|
86
|
+
setList: (list: any[]) => set(() => ({ list })),
|
|
87
|
+
init: async (markType: MarkType = 'wallnote') => {
|
|
88
|
+
// await get().getList();
|
|
89
|
+
console.log('init', set, get);
|
|
90
|
+
const queryMark = new QueryMark({
|
|
91
|
+
query: queryClient as any,
|
|
92
|
+
markType,
|
|
93
|
+
});
|
|
94
|
+
const url = new URL(window.location.href);
|
|
95
|
+
const pageSize = url.searchParams.get('pageSize') || '10';
|
|
96
|
+
set({ queryMark, markType, list: [], pagination: { current: 1, pageSize: parseInt(pageSize), total: 0 }, currentMarkId: '', markData: undefined });
|
|
97
|
+
setTimeout(async () => {
|
|
98
|
+
console.log('get', get);
|
|
99
|
+
get().getList();
|
|
100
|
+
}, 1000);
|
|
101
|
+
},
|
|
102
|
+
deleteMark: async (markId: string) => {
|
|
103
|
+
const queryMark = get().queryMark!;
|
|
104
|
+
const res = await queryMark.deleteMark(markId);
|
|
105
|
+
const currentMarkId = get().currentMarkId;
|
|
106
|
+
if (res.code === 200) {
|
|
107
|
+
// get().getList();
|
|
108
|
+
set((state) => ({
|
|
109
|
+
list: state.list.filter((item) => item.id !== markId),
|
|
110
|
+
}));
|
|
111
|
+
if (currentMarkId === markId) {
|
|
112
|
+
set(() => ({ currentMarkId: '', markData: undefined }));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return res;
|
|
116
|
+
},
|
|
117
|
+
queryMark: undefined,
|
|
118
|
+
markType: 'simple',
|
|
119
|
+
markData: undefined,
|
|
120
|
+
setMarkData: (mark?: Partial<Mark>) => set(() => ({ markData: mark as Mark })),
|
|
121
|
+
pagination: {
|
|
122
|
+
current: 1,
|
|
123
|
+
pageSize: 10,
|
|
124
|
+
total: 0,
|
|
125
|
+
},
|
|
126
|
+
setPagination: (pagination: { current: number; pageSize: number; total: number }) => set(() => ({ pagination })),
|
|
127
|
+
/** 搜索 */
|
|
128
|
+
search: '',
|
|
129
|
+
setSearch: (search: string) => set(() => ({ search, list: [], pagination: { current: 1, pageSize: 10, total: 0 } })),
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
|