@fairys/taro-tools-react 0.0.3 → 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/context/auth.data.instance.d.ts +18 -0
- package/esm/context/auth.data.instance.js +23 -1
- package/esm/context/global.setting.data.instance.d.ts +11 -0
- package/esm/context/global.setting.data.instance.js +18 -3
- package/esm/utils/navigate.d.ts +1 -1
- package/esm/utils/navigate.js +9 -2
- package/package.json +1 -1
- package/src/context/auth.data.instance.ts +46 -0
- package/src/context/global.setting.data.instance.ts +29 -3
- package/src/utils/navigate.ts +16 -5
- package/src/utils/request.ts +0 -3
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@ export interface AuthDataInstanceState<T = any> {
|
|
|
6
6
|
token?: string;
|
|
7
7
|
/**权限列表*/
|
|
8
8
|
permissions?: string[];
|
|
9
|
+
/**菜单权限列表*/
|
|
10
|
+
menusPermissions?: string[];
|
|
9
11
|
/**数据默认值不使用*/
|
|
10
12
|
__defaultValue?: string;
|
|
11
13
|
}
|
|
@@ -41,6 +43,22 @@ export declare class AuthDataInstance<T = any> {
|
|
|
41
43
|
* @returns 权限列表
|
|
42
44
|
*/
|
|
43
45
|
get permissions(): string[];
|
|
46
|
+
/**
|
|
47
|
+
* 设置菜单权限列表
|
|
48
|
+
* @param menusPermissions 菜单权限列表
|
|
49
|
+
*/
|
|
50
|
+
set menusPermissions(menusPermissions: string[]);
|
|
51
|
+
/**
|
|
52
|
+
* 获取菜单权限列表
|
|
53
|
+
* @returns 菜单权限列表
|
|
54
|
+
*/
|
|
55
|
+
get menusPermissions(): string[];
|
|
56
|
+
/**
|
|
57
|
+
* 判断是否有指定菜单权限
|
|
58
|
+
* @param menuPermission 菜单权限
|
|
59
|
+
* @returns 是否有指定菜单权限
|
|
60
|
+
*/
|
|
61
|
+
hasMenuPermission(menuPermission: string): boolean;
|
|
44
62
|
/**
|
|
45
63
|
* 判断是否有指定权限
|
|
46
64
|
* @param permission 权限
|
|
@@ -5,7 +5,8 @@ class AuthDataInstance {
|
|
|
5
5
|
store = proxy({
|
|
6
6
|
userInfo: void 0,
|
|
7
7
|
token: void 0,
|
|
8
|
-
permissions: void 0
|
|
8
|
+
permissions: void 0,
|
|
9
|
+
menusPermissions: void 0
|
|
9
10
|
});
|
|
10
11
|
set userInfo(userInfo) {
|
|
11
12
|
this.store.userInfo = userInfo;
|
|
@@ -51,7 +52,28 @@ class AuthDataInstance {
|
|
|
51
52
|
}
|
|
52
53
|
return this.store.permissions || [];
|
|
53
54
|
}
|
|
55
|
+
set menusPermissions(menusPermissions) {
|
|
56
|
+
this.store.menusPermissions = menusPermissions;
|
|
57
|
+
if (menusPermissions) taro.setStorageSync('menusPermissions', JSON.stringify(menusPermissions));
|
|
58
|
+
else taro.removeStorageSync('menusPermissions');
|
|
59
|
+
}
|
|
60
|
+
get menusPermissions() {
|
|
61
|
+
if (!this.store.menusPermissions) {
|
|
62
|
+
const menusPermissions = taro.getStorageSync('menusPermissions');
|
|
63
|
+
if (menusPermissions) try {
|
|
64
|
+
this.store.menusPermissions = JSON.parse(menusPermissions);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.error("\u89E3\u6790\u83DC\u5355\u6743\u9650\u5217\u8868\u5931\u8D25", error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return this.store.menusPermissions || [];
|
|
70
|
+
}
|
|
71
|
+
hasMenuPermission(menuPermission) {
|
|
72
|
+
if (!globalSettingDataInstance.store.isEnableAuth) return true;
|
|
73
|
+
return this.menusPermissions.includes(menuPermission);
|
|
74
|
+
}
|
|
54
75
|
hasPermission(permission) {
|
|
76
|
+
if (!globalSettingDataInstance.store.isEnableAuth) return true;
|
|
55
77
|
return this.permissions.includes(permission);
|
|
56
78
|
}
|
|
57
79
|
}
|
|
@@ -25,15 +25,26 @@ export interface GlobalSettingDataInstanceState {
|
|
|
25
25
|
* @default pages/login/index
|
|
26
26
|
*/
|
|
27
27
|
loginPageRoute?: string;
|
|
28
|
+
/**跳转忽略权限校验的路由*/
|
|
29
|
+
ignoreAuthRoutes?: string[];
|
|
30
|
+
/**路由跳转默认使用authDataInstance中的hasMenuPermission 判断是否有菜单权限*/
|
|
31
|
+
useAuthHasMenuPermission?: boolean;
|
|
32
|
+
/**是否开启权限校验*/
|
|
33
|
+
isEnableAuth?: boolean;
|
|
28
34
|
/**数据默认值不使用*/
|
|
29
35
|
__defaultValue?: string;
|
|
30
36
|
}
|
|
31
37
|
export declare class GlobalSettingDataInstance extends ProxyInstanceObjectBase<GlobalSettingDataInstanceState> {
|
|
38
|
+
defaultStore: GlobalSettingDataInstanceState;
|
|
32
39
|
store: GlobalSettingDataInstanceState;
|
|
33
40
|
/**
|
|
34
41
|
* 扩展全局设置数据状态
|
|
35
42
|
*/
|
|
36
43
|
extendStore: (state: Partial<GlobalSettingDataInstanceState>) => void;
|
|
44
|
+
/**
|
|
45
|
+
* 判断是否跳转忽略权限校验的路由
|
|
46
|
+
*/
|
|
47
|
+
isIgnoreAuthRoutes: (route: string) => boolean;
|
|
37
48
|
}
|
|
38
49
|
/**
|
|
39
50
|
* 全局设置数据实例
|
|
@@ -1,15 +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
|
-
|
|
4
|
+
defaultStore = {
|
|
5
5
|
requestSuccessCode: 200,
|
|
6
6
|
tokenFieldName: 'token',
|
|
7
7
|
headerTokenName: 'token',
|
|
8
8
|
tokenExpiredCode: 401,
|
|
9
|
-
loginPageRoute: 'pages/login/index'
|
|
9
|
+
loginPageRoute: 'pages/login/index',
|
|
10
|
+
ignoreAuthRoutes: [],
|
|
11
|
+
useAuthHasMenuPermission: true,
|
|
12
|
+
isEnableAuth: true
|
|
13
|
+
};
|
|
14
|
+
store = proxy({
|
|
15
|
+
...this.defaultStore
|
|
10
16
|
});
|
|
11
17
|
extendStore = (state)=>{
|
|
12
|
-
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);
|
|
13
28
|
};
|
|
14
29
|
}
|
|
15
30
|
const globalSettingDataInstance = new GlobalSettingDataInstance();
|
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/package.json
CHANGED
|
@@ -10,6 +10,8 @@ export interface AuthDataInstanceState<T = any> {
|
|
|
10
10
|
token?: string;
|
|
11
11
|
/**权限列表*/
|
|
12
12
|
permissions?: string[];
|
|
13
|
+
/**菜单权限列表*/
|
|
14
|
+
menusPermissions?: string[];
|
|
13
15
|
/**数据默认值不使用*/
|
|
14
16
|
__defaultValue?: string;
|
|
15
17
|
}
|
|
@@ -19,6 +21,7 @@ export class AuthDataInstance<T = any> {
|
|
|
19
21
|
userInfo: undefined,
|
|
20
22
|
token: undefined,
|
|
21
23
|
permissions: undefined,
|
|
24
|
+
menusPermissions: undefined,
|
|
22
25
|
});
|
|
23
26
|
|
|
24
27
|
/**
|
|
@@ -107,6 +110,46 @@ export class AuthDataInstance<T = any> {
|
|
|
107
110
|
}
|
|
108
111
|
return this.store.permissions || [];
|
|
109
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
|
+
}
|
|
110
153
|
|
|
111
154
|
/**
|
|
112
155
|
* 判断是否有指定权限
|
|
@@ -114,6 +157,9 @@ export class AuthDataInstance<T = any> {
|
|
|
114
157
|
* @returns 是否有指定权限
|
|
115
158
|
*/
|
|
116
159
|
hasPermission(permission: string): boolean {
|
|
160
|
+
if (!globalSettingDataInstance.store.isEnableAuth) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
117
163
|
return this.permissions.includes(permission);
|
|
118
164
|
}
|
|
119
165
|
}
|
|
@@ -27,23 +27,49 @@ export interface GlobalSettingDataInstanceState {
|
|
|
27
27
|
* @default pages/login/index
|
|
28
28
|
*/
|
|
29
29
|
loginPageRoute?: string;
|
|
30
|
+
/**跳转忽略权限校验的路由*/
|
|
31
|
+
ignoreAuthRoutes?: string[];
|
|
32
|
+
/**路由跳转默认使用authDataInstance中的hasMenuPermission 判断是否有菜单权限*/
|
|
33
|
+
useAuthHasMenuPermission?: boolean;
|
|
34
|
+
/**是否开启权限校验*/
|
|
35
|
+
isEnableAuth?: boolean;
|
|
30
36
|
/**数据默认值不使用*/
|
|
31
37
|
__defaultValue?: string;
|
|
32
38
|
}
|
|
33
39
|
|
|
34
40
|
export class GlobalSettingDataInstance extends ProxyInstanceObjectBase<GlobalSettingDataInstanceState> {
|
|
35
|
-
|
|
41
|
+
defaultStore: GlobalSettingDataInstanceState = {
|
|
36
42
|
requestSuccessCode: 200,
|
|
37
43
|
tokenFieldName: 'token',
|
|
38
44
|
headerTokenName: 'token',
|
|
39
45
|
tokenExpiredCode: 401,
|
|
40
46
|
loginPageRoute: 'pages/login/index',
|
|
41
|
-
|
|
47
|
+
ignoreAuthRoutes: [],
|
|
48
|
+
useAuthHasMenuPermission: true,
|
|
49
|
+
isEnableAuth: true,
|
|
50
|
+
};
|
|
51
|
+
store = proxy<GlobalSettingDataInstanceState>({ ...this.defaultStore });
|
|
42
52
|
/**
|
|
43
53
|
* 扩展全局设置数据状态
|
|
44
54
|
*/
|
|
45
55
|
extendStore = (state: Partial<GlobalSettingDataInstanceState>) => {
|
|
46
|
-
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);
|
|
47
73
|
};
|
|
48
74
|
}
|
|
49
75
|
/**
|
package/src/utils/navigate.ts
CHANGED
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import Taro from '@tarojs/taro';
|
|
2
|
+
import { globalSettingDataInstance } from 'context/global.setting.data.instance';
|
|
3
|
+
import { authDataInstance } from 'context/auth.data.instance';
|
|
2
4
|
|
|
3
5
|
class NavigateInstance {
|
|
4
|
-
/**判断是否已登录(
|
|
6
|
+
/**判断是否已登录(方法需要在项目入口文件中进行挂载,如果不挂载,默认使用 authDataInstance.hasMenuPermission 判断是否有菜单权限)*/
|
|
5
7
|
public isAuth: (url: string) => Promise<boolean> | boolean;
|
|
6
|
-
|
|
7
8
|
private _isAuth = async (url?: string) => {
|
|
8
9
|
let isAuthTo = true;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
// 判断是否跳转忽略权限校验的路由
|
|
11
|
+
const isIgnoreAuthRoutes = globalSettingDataInstance.isIgnoreAuthRoutes(url);
|
|
12
|
+
// 判断是否使用 authDataInstance中的hasMenuPermission 判断是否有菜单权限
|
|
13
|
+
const useAuthHasMenuPermission = globalSettingDataInstance.store.useAuthHasMenuPermission;
|
|
14
|
+
// 判断是否开启权限校验
|
|
15
|
+
const isEnableAuth = globalSettingDataInstance.store.isEnableAuth;
|
|
16
|
+
let isAuthFunction = this.isAuth;
|
|
17
|
+
if (useAuthHasMenuPermission && typeof isAuthFunction !== 'function' && isEnableAuth) {
|
|
18
|
+
isAuthFunction = authDataInstance.hasMenuPermission;
|
|
19
|
+
}
|
|
20
|
+
if (url && typeof isAuthFunction === 'function' && !isIgnoreAuthRoutes && isEnableAuth) {
|
|
21
|
+
isAuthTo = await isAuthFunction(url);
|
|
11
22
|
}
|
|
12
23
|
if (isAuthTo === false) {
|
|
13
24
|
// 无权访问页面
|
|
14
|
-
Taro.showToast({ title:
|
|
25
|
+
Taro.showToast({ title: `${url} 无权访问`, icon: 'none' });
|
|
15
26
|
return false;
|
|
16
27
|
}
|
|
17
28
|
return true;
|
package/src/utils/request.ts
CHANGED
|
@@ -62,7 +62,6 @@ export interface RequestInstanceCreateOptions {
|
|
|
62
62
|
* @default {}
|
|
63
63
|
*/
|
|
64
64
|
commonOptions?: Omit<Taro.request.Option<any, any>, 'url'>;
|
|
65
|
-
|
|
66
65
|
/**
|
|
67
66
|
* 请求IP地址
|
|
68
67
|
* @default ''
|
|
@@ -153,11 +152,9 @@ export class RequestInstance {
|
|
|
153
152
|
if (!host) {
|
|
154
153
|
host = this.proxy?.default?.[process.env.NODE_ENV === 'production' ? 'pro' : 'dev'] || '';
|
|
155
154
|
}
|
|
156
|
-
|
|
157
155
|
if (!host) {
|
|
158
156
|
host = this.getHttpPath(url, module);
|
|
159
157
|
}
|
|
160
|
-
|
|
161
158
|
return {
|
|
162
159
|
host,
|
|
163
160
|
url: _url,
|