@fairys/taro-tools-react 0.0.2 → 0.0.4
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/README.md +9 -0
- package/esm/components/Mesage/index.js +4 -4
- package/esm/context/auth.data.instance.d.ts +73 -0
- package/esm/context/auth.data.instance.js +89 -0
- package/esm/context/global.data.instance.d.ts +3 -5364
- package/esm/context/global.data.instance.js +4 -3
- package/esm/context/global.setting.data.instance.d.ts +32 -4
- package/esm/context/global.setting.data.instance.js +21 -2
- package/esm/context/page.data.instance.d.ts +1 -1
- package/esm/context/page.data.instance.js +1 -1
- package/esm/context/page.info.data.instance.d.ts +1 -1
- package/esm/context/page.info.data.instance.js +1 -1
- package/esm/styles/index.css +4 -0
- package/esm/utils/navigate.d.ts +1 -1
- package/esm/utils/navigate.js +9 -2
- package/esm/utils/request.d.ts +4 -20
- package/esm/utils/request.js +4 -7
- package/package.json +1 -1
- package/src/components/Mesage/index.tsx +7 -4
- package/src/context/auth.data.instance.ts +179 -0
- package/src/context/global.data.instance.ts +11 -11
- package/src/context/global.setting.data.instance.ts +58 -4
- package/src/context/page.data.instance.ts +2 -2
- package/src/context/page.info.data.instance.ts +2 -2
- package/src/utils/navigate.ts +16 -5
- package/src/utils/request.ts +11 -28
|
@@ -2,8 +2,8 @@ import { proxy, ref, useSnapshot } from "valtio";
|
|
|
2
2
|
import utils_navigate from "../utils/navigate.js";
|
|
3
3
|
import { createUseId } from "../utils/useId.js";
|
|
4
4
|
import { ProxyInstanceObjectBase } from "../utils/valtio/instance.js";
|
|
5
|
+
import { globalSettingDataInstance } from "./global.setting.data.instance.js";
|
|
5
6
|
class GlobalDataInstance extends ProxyInstanceObjectBase {
|
|
6
|
-
loginPageRoute = 'pages/login/index';
|
|
7
7
|
store = proxy({
|
|
8
8
|
messageData: ref([]),
|
|
9
9
|
toastData: void 0
|
|
@@ -46,8 +46,9 @@ class GlobalDataInstance extends ProxyInstanceObjectBase {
|
|
|
46
46
|
});
|
|
47
47
|
};
|
|
48
48
|
toLoginPage = ()=>{
|
|
49
|
-
const
|
|
50
|
-
const
|
|
49
|
+
const loginPageRoute = globalSettingDataInstance.store.loginPageRoute || '';
|
|
50
|
+
const isLoginPage = utils_navigate.isCurrentPage(loginPageRoute || '');
|
|
51
|
+
const _loginPageRoute = `${loginPageRoute || ''}`.replace(/^\//, '');
|
|
51
52
|
if (isLoginPage) return;
|
|
52
53
|
utils_navigate.navigateTo({
|
|
53
54
|
url: `/${_loginPageRoute}`
|
|
@@ -5,15 +5,46 @@ export interface GlobalSettingDataInstanceState {
|
|
|
5
5
|
* @default 200
|
|
6
6
|
*/
|
|
7
7
|
requestSuccessCode?: number;
|
|
8
|
+
/**
|
|
9
|
+
* token过期返回code,跳转登录页面
|
|
10
|
+
* @default 401
|
|
11
|
+
*/
|
|
12
|
+
tokenExpiredCode?: number;
|
|
13
|
+
/**
|
|
14
|
+
* 本地存储token字段名
|
|
15
|
+
* @default token
|
|
16
|
+
*/
|
|
17
|
+
tokenFieldName?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 请求头token字段名
|
|
20
|
+
* @default token
|
|
21
|
+
*/
|
|
22
|
+
headerTokenName?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 设置登录页面路由(需要在入口文件中进行设置)
|
|
25
|
+
* @default pages/login/index
|
|
26
|
+
*/
|
|
27
|
+
loginPageRoute?: string;
|
|
28
|
+
/**跳转忽略权限校验的路由*/
|
|
29
|
+
ignoreAuthRoutes?: string[];
|
|
30
|
+
/**路由跳转默认使用authDataInstance中的hasMenuPermission 判断是否有菜单权限*/
|
|
31
|
+
useAuthHasMenuPermission?: boolean;
|
|
32
|
+
/**是否开启权限校验*/
|
|
33
|
+
isEnableAuth?: boolean;
|
|
8
34
|
/**数据默认值不使用*/
|
|
9
35
|
__defaultValue?: string;
|
|
10
36
|
}
|
|
11
37
|
export declare class GlobalSettingDataInstance extends ProxyInstanceObjectBase<GlobalSettingDataInstanceState> {
|
|
38
|
+
defaultStore: GlobalSettingDataInstanceState;
|
|
12
39
|
store: GlobalSettingDataInstanceState;
|
|
13
40
|
/**
|
|
14
41
|
* 扩展全局设置数据状态
|
|
15
42
|
*/
|
|
16
43
|
extendStore: (state: Partial<GlobalSettingDataInstanceState>) => void;
|
|
44
|
+
/**
|
|
45
|
+
* 判断是否跳转忽略权限校验的路由
|
|
46
|
+
*/
|
|
47
|
+
isIgnoreAuthRoutes: (route: string) => boolean;
|
|
17
48
|
}
|
|
18
49
|
/**
|
|
19
50
|
* 全局设置数据实例
|
|
@@ -22,7 +53,4 @@ export declare const globalSettingDataInstance: GlobalSettingDataInstance;
|
|
|
22
53
|
/**
|
|
23
54
|
* 全局设置数据状态管理
|
|
24
55
|
*/
|
|
25
|
-
export declare const useGlobalSettingData: () =>
|
|
26
|
-
readonly requestSuccessCode?: number;
|
|
27
|
-
readonly __defaultValue?: string;
|
|
28
|
-
}, GlobalSettingDataInstance, string];
|
|
56
|
+
export declare const useGlobalSettingData: () => [GlobalSettingDataInstanceState, GlobalSettingDataInstance, string | undefined];
|
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
import { proxy, useSnapshot } from "valtio";
|
|
2
2
|
import { ProxyInstanceObjectBase } from "../utils/valtio/instance.js";
|
|
3
3
|
class GlobalSettingDataInstance extends ProxyInstanceObjectBase {
|
|
4
|
+
defaultStore = {
|
|
5
|
+
requestSuccessCode: 200,
|
|
6
|
+
tokenFieldName: 'token',
|
|
7
|
+
headerTokenName: 'token',
|
|
8
|
+
tokenExpiredCode: 401,
|
|
9
|
+
loginPageRoute: 'pages/login/index',
|
|
10
|
+
ignoreAuthRoutes: [],
|
|
11
|
+
useAuthHasMenuPermission: true,
|
|
12
|
+
isEnableAuth: true
|
|
13
|
+
};
|
|
4
14
|
store = proxy({
|
|
5
|
-
|
|
15
|
+
...this.defaultStore
|
|
6
16
|
});
|
|
7
17
|
extendStore = (state)=>{
|
|
8
|
-
this._setValues(
|
|
18
|
+
this._setValues({
|
|
19
|
+
...this.defaultStore,
|
|
20
|
+
...state
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
isIgnoreAuthRoutes = (route)=>{
|
|
24
|
+
const _route = route.replace(/^\//, '');
|
|
25
|
+
const _loginPageRoute = this.store.loginPageRoute.replace(/^\//, '');
|
|
26
|
+
if (_route === _loginPageRoute) return true;
|
|
27
|
+
return (this.store.ignoreAuthRoutes || []).includes(_route) || (this.store.ignoreAuthRoutes || []).includes(route);
|
|
9
28
|
};
|
|
10
29
|
}
|
|
11
30
|
const globalSettingDataInstance = new GlobalSettingDataInstance();
|
|
@@ -68,4 +68,4 @@ export interface PageDataOptions<T extends PageDataInstanceState = PageDataInsta
|
|
|
68
68
|
/**
|
|
69
69
|
* 页面级数据状态管理
|
|
70
70
|
*/
|
|
71
|
-
export declare const usePageData: <T extends PageDataInstanceState = PageDataInstanceState>(options?: PageDataOptions<T>) =>
|
|
71
|
+
export declare const usePageData: <T extends PageDataInstanceState = PageDataInstanceState>(options?: PageDataOptions<T>) => [T, PageDataInstance<T>, string | undefined];
|
|
@@ -63,7 +63,7 @@ class PageDataInstance extends ProxyInstanceObjectBase {
|
|
|
63
63
|
let saveData = {};
|
|
64
64
|
if (this.requestConfig?.onAfter) saveData = this.requestConfig.onAfter(result);
|
|
65
65
|
else {
|
|
66
|
-
const dataList = result?.data?.list || result?.data?.records || [];
|
|
66
|
+
const dataList = result?.data?.list || result?.data?.rows || result?.data?.records || [];
|
|
67
67
|
let newDataList = [];
|
|
68
68
|
if (1 === this.store.page) newDataList = dataList;
|
|
69
69
|
else if (this.is_scroll_page) newDataList = [
|
|
@@ -69,4 +69,4 @@ export interface PageInfoDataOptions<T extends PageInfoDataInstanceState = PageI
|
|
|
69
69
|
/**
|
|
70
70
|
* 页面级数据状态管理
|
|
71
71
|
*/
|
|
72
|
-
export declare const usePageInfoData: <T extends PageInfoDataInstanceState = PageInfoDataInstanceState>(options?: PageInfoDataOptions<T>) =>
|
|
72
|
+
export declare const usePageInfoData: <T extends PageInfoDataInstanceState = PageInfoDataInstanceState>(options?: PageInfoDataOptions<T>) => [T, PageInfoDataInstance<T>, string | undefined];
|
|
@@ -69,7 +69,7 @@ class PageInfoDataInstance extends ProxyInstanceObjectBase {
|
|
|
69
69
|
try {
|
|
70
70
|
if (this.requestSaveInfoConfig?.onSaveInfo) return void console.error("\u672A\u914D\u7F6E requestSaveInfoConfig.onSaveInfo \u8BF7\u6C42\u65B9\u6CD5");
|
|
71
71
|
this.updatedLoading(true);
|
|
72
|
-
const newParams = await this.requestSaveInfoConfig?.onSaveBefore?.(this.store);
|
|
72
|
+
const newParams = await this.requestSaveInfoConfig?.onSaveBefore?.(this.store) || this.store.editFormData || {};
|
|
73
73
|
const result = await this.requestSaveInfoConfig.onSaveInfo?.(newParams);
|
|
74
74
|
this.updatedLoading(false);
|
|
75
75
|
if (result && result.code === globalSettingDataInstance.store.requestSuccessCode) {
|
package/esm/styles/index.css
CHANGED
package/esm/utils/navigate.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Taro from '@tarojs/taro';
|
|
2
2
|
declare class NavigateInstance {
|
|
3
|
-
/**判断是否已登录(
|
|
3
|
+
/**判断是否已登录(方法需要在项目入口文件中进行挂载,如果不挂载,默认使用 authDataInstance.hasMenuPermission 判断是否有菜单权限)*/
|
|
4
4
|
isAuth: (url: string) => Promise<boolean> | boolean;
|
|
5
5
|
private _isAuth;
|
|
6
6
|
/**
|
package/esm/utils/navigate.js
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import taro from "@tarojs/taro";
|
|
2
|
+
import { globalSettingDataInstance } from "../context/global.setting.data.instance.js";
|
|
3
|
+
import { authDataInstance } from "../context/auth.data.instance.js";
|
|
2
4
|
class NavigateInstance {
|
|
3
5
|
isAuth;
|
|
4
6
|
_isAuth = async (url)=>{
|
|
5
7
|
let isAuthTo = true;
|
|
6
|
-
|
|
8
|
+
const isIgnoreAuthRoutes = globalSettingDataInstance.isIgnoreAuthRoutes(url);
|
|
9
|
+
const useAuthHasMenuPermission = globalSettingDataInstance.store.useAuthHasMenuPermission;
|
|
10
|
+
const isEnableAuth = globalSettingDataInstance.store.isEnableAuth;
|
|
11
|
+
let isAuthFunction = this.isAuth;
|
|
12
|
+
if (useAuthHasMenuPermission && 'function' != typeof isAuthFunction && isEnableAuth) isAuthFunction = authDataInstance.hasMenuPermission;
|
|
13
|
+
if (url && 'function' == typeof isAuthFunction && !isIgnoreAuthRoutes && isEnableAuth) isAuthTo = await isAuthFunction(url);
|
|
7
14
|
if (false === isAuthTo) {
|
|
8
15
|
taro.showToast({
|
|
9
|
-
title:
|
|
16
|
+
title: `${url} \u{65E0}\u{6743}\u{8BBF}\u{95EE}`,
|
|
10
17
|
icon: 'none'
|
|
11
18
|
});
|
|
12
19
|
return false;
|
package/esm/utils/request.d.ts
CHANGED
|
@@ -8,16 +8,6 @@ export interface RequestInstanceOptions extends Taro.request.Option<any, any> {
|
|
|
8
8
|
isShowErrorMessage?: boolean;
|
|
9
9
|
}
|
|
10
10
|
export interface RequestInstanceCreateOptions {
|
|
11
|
-
/**
|
|
12
|
-
* 本地存储token字段名
|
|
13
|
-
* @default token
|
|
14
|
-
*/
|
|
15
|
-
tokenFieldName?: string;
|
|
16
|
-
/**
|
|
17
|
-
* 请求头token字段名
|
|
18
|
-
* @default token
|
|
19
|
-
*/
|
|
20
|
-
headerTokenName?: string;
|
|
21
11
|
/**
|
|
22
12
|
* 公共请求配置
|
|
23
13
|
* @default {}
|
|
@@ -33,6 +23,10 @@ export interface RequestInstanceCreateOptions {
|
|
|
33
23
|
* @default {}
|
|
34
24
|
*/
|
|
35
25
|
proxy?: {
|
|
26
|
+
default?: {
|
|
27
|
+
dev?: string;
|
|
28
|
+
pro?: string;
|
|
29
|
+
};
|
|
36
30
|
dev: Record<string, string | {
|
|
37
31
|
target: string;
|
|
38
32
|
pathRewrite: Record<string, string>;
|
|
@@ -48,16 +42,6 @@ export declare class RequestInstance {
|
|
|
48
42
|
IP?: string | ((url: string, module?: string, env?: string) => string);
|
|
49
43
|
/**简单的代理配置*/
|
|
50
44
|
proxy?: RequestInstanceCreateOptions['proxy'];
|
|
51
|
-
/**
|
|
52
|
-
* 本地存储token字段名
|
|
53
|
-
* @default token
|
|
54
|
-
*/
|
|
55
|
-
tokenFieldName: string;
|
|
56
|
-
/**
|
|
57
|
-
* 请求头token字段名
|
|
58
|
-
* @default token
|
|
59
|
-
*/
|
|
60
|
-
headerTokenName: string;
|
|
61
45
|
/**公共请求配置*/
|
|
62
46
|
commonOptions: Omit<Taro.request.Option<any, any>, 'url'>;
|
|
63
47
|
constructor(options?: RequestInstanceCreateOptions);
|
package/esm/utils/request.js
CHANGED
|
@@ -20,7 +20,7 @@ const requestResponseHandle = (result, options)=>{
|
|
|
20
20
|
const statusCode = result.statusCode;
|
|
21
21
|
const code = result?.data?.code;
|
|
22
22
|
if (result?.data) {
|
|
23
|
-
if (401 === statusCode || 401 === code) {
|
|
23
|
+
if (401 === statusCode || 401 === code || code === globalSettingDataInstance.store.tokenExpiredCode) {
|
|
24
24
|
msg = "\u8BF7\u91CD\u65B0\u767B\u5F55";
|
|
25
25
|
globalDataInstance.toLoginPage();
|
|
26
26
|
} else if (![
|
|
@@ -40,8 +40,6 @@ const requestResponseHandle = (result, options)=>{
|
|
|
40
40
|
class RequestInstance {
|
|
41
41
|
IP;
|
|
42
42
|
proxy;
|
|
43
|
-
tokenFieldName = 'token';
|
|
44
|
-
headerTokenName = 'token';
|
|
45
43
|
commonOptions = {};
|
|
46
44
|
constructor(options = {}){
|
|
47
45
|
this.extends(options);
|
|
@@ -53,8 +51,6 @@ class RequestInstance {
|
|
|
53
51
|
extends = (options = {})=>{
|
|
54
52
|
this.IP = options.IP || this.IP;
|
|
55
53
|
this.proxy = options.proxy || this.proxy;
|
|
56
|
-
this.tokenFieldName = options.tokenFieldName || this.tokenFieldName;
|
|
57
|
-
this.headerTokenName = options.headerTokenName || this.headerTokenName;
|
|
58
54
|
this.commonOptions = {
|
|
59
55
|
...this.commonOptions,
|
|
60
56
|
...options.commonOptions
|
|
@@ -90,6 +86,7 @@ class RequestInstance {
|
|
|
90
86
|
}
|
|
91
87
|
}
|
|
92
88
|
}
|
|
89
|
+
if (!host) host = this.proxy?.default?.['production' === process.env.NODE_ENV ? 'pro' : 'dev'] || '';
|
|
93
90
|
if (!host) host = this.getHttpPath(url, module);
|
|
94
91
|
return {
|
|
95
92
|
host,
|
|
@@ -108,11 +105,11 @@ class RequestInstance {
|
|
|
108
105
|
};
|
|
109
106
|
requestBase = (options)=>{
|
|
110
107
|
const { data, header = {}, module, isIgnoreToken, isShowErrorMessage, ...restOptions } = options;
|
|
111
|
-
const token = taro.getStorageSync(
|
|
108
|
+
const token = taro.getStorageSync(globalSettingDataInstance.store.tokenFieldName || 'token');
|
|
112
109
|
const newHeader = {
|
|
113
110
|
...header
|
|
114
111
|
};
|
|
115
|
-
if (token) newHeader[
|
|
112
|
+
if (token) newHeader[globalSettingDataInstance.store.headerTokenName || 'token'] = token;
|
|
116
113
|
else if (true !== isIgnoreToken) {
|
|
117
114
|
if (false !== isShowErrorMessage) globalDataInstance.showMessage({
|
|
118
115
|
content: "\u672A\u767B\u5F55",
|
package/package.json
CHANGED
|
@@ -88,7 +88,7 @@ export const FairysTaroMessageItem = (props: FairysTaroMessageItemProps) => {
|
|
|
88
88
|
|
|
89
89
|
const classIconName = useMemo(
|
|
90
90
|
() =>
|
|
91
|
-
clsx('fairys_taro-ui-message-icon fairystaro__box-border ', iconClassName, {
|
|
91
|
+
clsx('fairys_taro-ui-message-icon fairystaro__box-border fairystaro__text-[0.6rem]', iconClassName, {
|
|
92
92
|
'ant-design--close-circle-outlined': type === 'error' && !isIcon,
|
|
93
93
|
'ant-design--exclamation-circle-outlined': type === 'warning' && !isIcon,
|
|
94
94
|
'ant-design--check-circle-outlined': type === 'success' && !isIcon,
|
|
@@ -107,7 +107,7 @@ export const FairysTaroMessageItem = (props: FairysTaroMessageItemProps) => {
|
|
|
107
107
|
);
|
|
108
108
|
|
|
109
109
|
const titleClassNames = useMemo(
|
|
110
|
-
() => clsx('fairys_taro-ui-message-item-title fairystaro__font-bold', titleClassName),
|
|
110
|
+
() => clsx('fairys_taro-ui-message-item-title fairystaro__font-bold fairystaro__text-[0.6rem]', titleClassName),
|
|
111
111
|
[titleClassName],
|
|
112
112
|
);
|
|
113
113
|
|
|
@@ -157,7 +157,10 @@ export const FairysTaroMessageItem = (props: FairysTaroMessageItemProps) => {
|
|
|
157
157
|
<Fragment />
|
|
158
158
|
)}
|
|
159
159
|
{children ? (
|
|
160
|
-
<View
|
|
160
|
+
<View
|
|
161
|
+
className={clsx('fairys_taro-ui-message-item-body fairystaro__text-[0.6rem]', bodyClassName)}
|
|
162
|
+
style={bodyStyle}
|
|
163
|
+
>
|
|
161
164
|
{children}
|
|
162
165
|
</View>
|
|
163
166
|
) : (
|
|
@@ -192,7 +195,7 @@ export const FairysTaroPortalMessage = (props: FairysTaroMessageProps) => {
|
|
|
192
195
|
const classNames = useMemo(
|
|
193
196
|
() =>
|
|
194
197
|
clsx(
|
|
195
|
-
'fairys_taro-ui-portal-message fairystaro__pointer-events-none fairystaro__position-fixed fairystaro__top-0
|
|
198
|
+
'fairys_taro-ui-portal-message fairystaro__pointer-events-none fairystaro__position-fixed fairystaro__top-0 fairystaro__right-0 fairystaro__bottom-0 fairystaro__left-0',
|
|
196
199
|
messageClassName,
|
|
197
200
|
),
|
|
198
201
|
[messageClassName],
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import Taro from '@tarojs/taro';
|
|
2
|
+
import { proxy, useSnapshot } from 'valtio';
|
|
3
|
+
import { globalSettingDataInstance } from 'context/global.setting.data.instance';
|
|
4
|
+
|
|
5
|
+
/**用户信息,权限判断等*/
|
|
6
|
+
export interface AuthDataInstanceState<T = any> {
|
|
7
|
+
/**用户信息*/
|
|
8
|
+
userInfo?: T;
|
|
9
|
+
/**登录凭证(token)*/
|
|
10
|
+
token?: string;
|
|
11
|
+
/**权限列表*/
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
/**菜单权限列表*/
|
|
14
|
+
menusPermissions?: string[];
|
|
15
|
+
/**数据默认值不使用*/
|
|
16
|
+
__defaultValue?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class AuthDataInstance<T = any> {
|
|
20
|
+
store = proxy<AuthDataInstanceState<T>>({
|
|
21
|
+
userInfo: undefined,
|
|
22
|
+
token: undefined,
|
|
23
|
+
permissions: undefined,
|
|
24
|
+
menusPermissions: undefined,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 设置用户信息
|
|
29
|
+
* @param userInfo 用户信息
|
|
30
|
+
*/
|
|
31
|
+
set userInfo(userInfo: T) {
|
|
32
|
+
this.store.userInfo = userInfo;
|
|
33
|
+
if (userInfo) {
|
|
34
|
+
Taro.setStorageSync('userInfo', JSON.stringify(userInfo));
|
|
35
|
+
} else {
|
|
36
|
+
Taro.removeStorageSync('userInfo');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 获取用户信息
|
|
42
|
+
* @returns 用户信息
|
|
43
|
+
*/
|
|
44
|
+
get userInfo(): T {
|
|
45
|
+
if (!this.store.userInfo) {
|
|
46
|
+
const userInfo = Taro.getStorageSync('userInfo');
|
|
47
|
+
if (userInfo) {
|
|
48
|
+
try {
|
|
49
|
+
this.store.userInfo = JSON.parse(userInfo);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error('解析用户信息失败', error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return (this.store.userInfo || {}) as T;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 设置登录凭证(token)
|
|
60
|
+
* @param token 登录凭证(token)
|
|
61
|
+
*/
|
|
62
|
+
set token(token: string) {
|
|
63
|
+
this.store.token = token;
|
|
64
|
+
if (token) {
|
|
65
|
+
Taro.setStorageSync(globalSettingDataInstance.store.tokenFieldName || 'token', token);
|
|
66
|
+
} else {
|
|
67
|
+
Taro.removeStorageSync(globalSettingDataInstance.store.tokenFieldName || 'token');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取登录凭证(token)
|
|
72
|
+
* @returns 登录凭证(token)
|
|
73
|
+
*/
|
|
74
|
+
get token(): string {
|
|
75
|
+
if (!this.store.token) {
|
|
76
|
+
const token = Taro.getStorageSync(globalSettingDataInstance.store.tokenFieldName || 'token');
|
|
77
|
+
if (token) {
|
|
78
|
+
this.store.token = token;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return this.store.token || '';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 设置权限列表
|
|
86
|
+
* @param permissions 权限列表
|
|
87
|
+
*/
|
|
88
|
+
set permissions(permissions: string[]) {
|
|
89
|
+
this.store.permissions = permissions;
|
|
90
|
+
if (permissions) {
|
|
91
|
+
Taro.setStorageSync('permissions', JSON.stringify(permissions));
|
|
92
|
+
} else {
|
|
93
|
+
Taro.removeStorageSync('permissions');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 获取权限列表
|
|
98
|
+
* @returns 权限列表
|
|
99
|
+
*/
|
|
100
|
+
get permissions(): string[] {
|
|
101
|
+
if (!this.store.permissions) {
|
|
102
|
+
const permissions = Taro.getStorageSync('permissions');
|
|
103
|
+
if (permissions) {
|
|
104
|
+
try {
|
|
105
|
+
this.store.permissions = JSON.parse(permissions);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error('解析权限列表失败', error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return this.store.permissions || [];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 设置菜单权限列表
|
|
115
|
+
* @param menusPermissions 菜单权限列表
|
|
116
|
+
*/
|
|
117
|
+
set menusPermissions(menusPermissions: string[]) {
|
|
118
|
+
this.store.menusPermissions = menusPermissions;
|
|
119
|
+
if (menusPermissions) {
|
|
120
|
+
Taro.setStorageSync('menusPermissions', JSON.stringify(menusPermissions));
|
|
121
|
+
} else {
|
|
122
|
+
Taro.removeStorageSync('menusPermissions');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 获取菜单权限列表
|
|
127
|
+
* @returns 菜单权限列表
|
|
128
|
+
*/
|
|
129
|
+
get menusPermissions(): string[] {
|
|
130
|
+
if (!this.store.menusPermissions) {
|
|
131
|
+
const menusPermissions = Taro.getStorageSync('menusPermissions');
|
|
132
|
+
if (menusPermissions) {
|
|
133
|
+
try {
|
|
134
|
+
this.store.menusPermissions = JSON.parse(menusPermissions);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
console.error('解析菜单权限列表失败', error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return this.store.menusPermissions || [];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 判断是否有指定菜单权限
|
|
144
|
+
* @param menuPermission 菜单权限
|
|
145
|
+
* @returns 是否有指定菜单权限
|
|
146
|
+
*/
|
|
147
|
+
hasMenuPermission(menuPermission: string): boolean {
|
|
148
|
+
if (!globalSettingDataInstance.store.isEnableAuth) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return this.menusPermissions.includes(menuPermission);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* 判断是否有指定权限
|
|
156
|
+
* @param permission 权限
|
|
157
|
+
* @returns 是否有指定权限
|
|
158
|
+
*/
|
|
159
|
+
hasPermission(permission: string): boolean {
|
|
160
|
+
if (!globalSettingDataInstance.store.isEnableAuth) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return this.permissions.includes(permission);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export const authDataInstance = new AuthDataInstance();
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* 全局数据状态管理
|
|
171
|
+
*/
|
|
172
|
+
export function useAuthData<T = any>() {
|
|
173
|
+
const store = useSnapshot(authDataInstance.store);
|
|
174
|
+
return [store, authDataInstance, store.__defaultValue] as [
|
|
175
|
+
AuthDataInstanceState<T>,
|
|
176
|
+
AuthDataInstance<T>,
|
|
177
|
+
string | undefined,
|
|
178
|
+
];
|
|
179
|
+
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { proxy, ref, useSnapshot } from 'valtio';
|
|
2
|
-
import { TaroToastProps } from '@nutui/nutui-react-taro';
|
|
2
|
+
import type { TaroToastProps } from '@nutui/nutui-react-taro';
|
|
3
3
|
import navigate from 'utils/navigate';
|
|
4
4
|
import { createUseId } from 'utils/useId';
|
|
5
5
|
import React from 'react';
|
|
6
|
-
import { FairysTaroMessageItemProps } from 'components/Mesage';
|
|
6
|
+
import type { FairysTaroMessageItemProps } from 'components/Mesage';
|
|
7
7
|
import { ProxyInstanceObjectBase } from 'utils/valtio/instance';
|
|
8
|
+
import { globalSettingDataInstance } from './global.setting.data.instance';
|
|
8
9
|
|
|
9
10
|
export interface MessageDataType extends FairysTaroMessageItemProps {
|
|
10
11
|
/**用于唯一标识提示框(默认自动生成)*/
|
|
@@ -32,12 +33,6 @@ export interface GlobalDataInstanceState {
|
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
export class GlobalDataInstance extends ProxyInstanceObjectBase<GlobalDataInstanceState> {
|
|
35
|
-
/**
|
|
36
|
-
* 设置登录页面路由(需要在入口文件中进行设置)
|
|
37
|
-
* @param loginPageRoute 登录页面路由(默认pages/login/index)
|
|
38
|
-
*/
|
|
39
|
-
public loginPageRoute = 'pages/login/index';
|
|
40
|
-
|
|
41
36
|
store = proxy<GlobalDataInstanceState>({
|
|
42
37
|
messageData: ref([]),
|
|
43
38
|
toastData: undefined,
|
|
@@ -82,8 +77,9 @@ export class GlobalDataInstance extends ProxyInstanceObjectBase<GlobalDataInstan
|
|
|
82
77
|
|
|
83
78
|
/**跳转登录页面*/
|
|
84
79
|
toLoginPage = () => {
|
|
85
|
-
const
|
|
86
|
-
const
|
|
80
|
+
const loginPageRoute = globalSettingDataInstance.store.loginPageRoute || '';
|
|
81
|
+
const isLoginPage = navigate.isCurrentPage(loginPageRoute || '');
|
|
82
|
+
const _loginPageRoute = `${loginPageRoute || ''}`.replace(/^\//, '');
|
|
87
83
|
if (isLoginPage) {
|
|
88
84
|
// 如果是登录页面不进行跳转
|
|
89
85
|
return;
|
|
@@ -102,5 +98,9 @@ export const globalDataInstance = new GlobalDataInstance();
|
|
|
102
98
|
*/
|
|
103
99
|
export const useGlobalData = () => {
|
|
104
100
|
const store = useSnapshot(globalDataInstance.store);
|
|
105
|
-
return [store, globalDataInstance, store.__defaultValue] as
|
|
101
|
+
return [store, globalDataInstance, store.__defaultValue] as [
|
|
102
|
+
GlobalDataInstanceState,
|
|
103
|
+
GlobalDataInstance,
|
|
104
|
+
string | undefined,
|
|
105
|
+
];
|
|
106
106
|
};
|
|
@@ -7,19 +7,69 @@ export interface GlobalSettingDataInstanceState {
|
|
|
7
7
|
* @default 200
|
|
8
8
|
*/
|
|
9
9
|
requestSuccessCode?: number;
|
|
10
|
+
/**
|
|
11
|
+
* token过期返回code,跳转登录页面
|
|
12
|
+
* @default 401
|
|
13
|
+
*/
|
|
14
|
+
tokenExpiredCode?: number;
|
|
15
|
+
/**
|
|
16
|
+
* 本地存储token字段名
|
|
17
|
+
* @default token
|
|
18
|
+
*/
|
|
19
|
+
tokenFieldName?: string;
|
|
20
|
+
/**
|
|
21
|
+
* 请求头token字段名
|
|
22
|
+
* @default token
|
|
23
|
+
*/
|
|
24
|
+
headerTokenName?: string;
|
|
25
|
+
/**
|
|
26
|
+
* 设置登录页面路由(需要在入口文件中进行设置)
|
|
27
|
+
* @default pages/login/index
|
|
28
|
+
*/
|
|
29
|
+
loginPageRoute?: string;
|
|
30
|
+
/**跳转忽略权限校验的路由*/
|
|
31
|
+
ignoreAuthRoutes?: string[];
|
|
32
|
+
/**路由跳转默认使用authDataInstance中的hasMenuPermission 判断是否有菜单权限*/
|
|
33
|
+
useAuthHasMenuPermission?: boolean;
|
|
34
|
+
/**是否开启权限校验*/
|
|
35
|
+
isEnableAuth?: boolean;
|
|
10
36
|
/**数据默认值不使用*/
|
|
11
37
|
__defaultValue?: string;
|
|
12
38
|
}
|
|
13
39
|
|
|
14
40
|
export class GlobalSettingDataInstance extends ProxyInstanceObjectBase<GlobalSettingDataInstanceState> {
|
|
15
|
-
|
|
41
|
+
defaultStore: GlobalSettingDataInstanceState = {
|
|
16
42
|
requestSuccessCode: 200,
|
|
17
|
-
|
|
43
|
+
tokenFieldName: 'token',
|
|
44
|
+
headerTokenName: 'token',
|
|
45
|
+
tokenExpiredCode: 401,
|
|
46
|
+
loginPageRoute: 'pages/login/index',
|
|
47
|
+
ignoreAuthRoutes: [],
|
|
48
|
+
useAuthHasMenuPermission: true,
|
|
49
|
+
isEnableAuth: true,
|
|
50
|
+
};
|
|
51
|
+
store = proxy<GlobalSettingDataInstanceState>({ ...this.defaultStore });
|
|
18
52
|
/**
|
|
19
53
|
* 扩展全局设置数据状态
|
|
20
54
|
*/
|
|
21
55
|
extendStore = (state: Partial<GlobalSettingDataInstanceState>) => {
|
|
22
|
-
this._setValues(
|
|
56
|
+
this._setValues({
|
|
57
|
+
...this.defaultStore,
|
|
58
|
+
...state,
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 判断是否跳转忽略权限校验的路由
|
|
63
|
+
*/
|
|
64
|
+
isIgnoreAuthRoutes = (route: string): boolean => {
|
|
65
|
+
/**处理路由前缀*/
|
|
66
|
+
const _route = route.replace(/^\//, '');
|
|
67
|
+
/**处理登录页面路由前缀*/
|
|
68
|
+
const _loginPageRoute = this.store.loginPageRoute.replace(/^\//, '');
|
|
69
|
+
if (_route === _loginPageRoute) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return (this.store.ignoreAuthRoutes || []).includes(_route) || (this.store.ignoreAuthRoutes || []).includes(route);
|
|
23
73
|
};
|
|
24
74
|
}
|
|
25
75
|
/**
|
|
@@ -32,5 +82,9 @@ export const globalSettingDataInstance = new GlobalSettingDataInstance();
|
|
|
32
82
|
*/
|
|
33
83
|
export const useGlobalSettingData = () => {
|
|
34
84
|
const store = useSnapshot(globalSettingDataInstance.store);
|
|
35
|
-
return [store, globalSettingDataInstance, store.__defaultValue] as
|
|
85
|
+
return [store, globalSettingDataInstance, store.__defaultValue] as [
|
|
86
|
+
GlobalSettingDataInstanceState,
|
|
87
|
+
GlobalSettingDataInstance,
|
|
88
|
+
string | undefined,
|
|
89
|
+
];
|
|
36
90
|
};
|
|
@@ -119,7 +119,7 @@ export class PageDataInstance<
|
|
|
119
119
|
if (this.requestConfig?.onAfter) {
|
|
120
120
|
saveData = this.requestConfig.onAfter(result);
|
|
121
121
|
} else {
|
|
122
|
-
const dataList = result?.data?.list || result?.data?.records || [];
|
|
122
|
+
const dataList = result?.data?.list || result?.data?.rows || result?.data?.records || [];
|
|
123
123
|
/**如果是第一页则直接返回数据,否则进行拼接数据*/
|
|
124
124
|
let newDataList = [];
|
|
125
125
|
if (this.store.page === 1) {
|
|
@@ -211,5 +211,5 @@ export const usePageData = <T extends PageDataInstanceState = PageDataInstanceSt
|
|
|
211
211
|
) => {
|
|
212
212
|
const pageDataInstance = useRef(new PageDataInstance<T>(options)).current;
|
|
213
213
|
const store = useSnapshot(pageDataInstance.store) as T;
|
|
214
|
-
return [store, pageDataInstance, store.__defaultValue] as
|
|
214
|
+
return [store, pageDataInstance, store.__defaultValue] as [T, PageDataInstance<T>, string | undefined];
|
|
215
215
|
};
|