@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 CHANGED
@@ -1 +1,10 @@
1
1
  # 框架 ui 组件库
2
+
3
+ - [X] 全局弹框
4
+ - [X] 页面布局
5
+ - [X] 请求封装
6
+ - [X] 路由封装
7
+ - [X] 权限管理
8
+ - [X] 用户信息
9
+
10
+ 文档地址:[fairys-taro-react](https://autumn-fairy-tales.github.io/fairys-taro-react/)
@@ -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
- store = proxy({
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(state);
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();
@@ -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
  /**
@@ -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
- if (url && 'function' == typeof this.isAuth) isAuthTo = await this.isAuth(url);
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: "\u65E0\u6743\u8BBF\u95EE",
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
@@ -3,7 +3,7 @@
3
3
  "author": "SunLxy <1011771396@qq.com>",
4
4
  "description": "框架组件库",
5
5
  "homepage": "https://github.com/autumn-fairy-tales/fairys-taro-react",
6
- "version": "0.0.3",
6
+ "version": "0.0.4",
7
7
  "main": "lib/index.js",
8
8
  "types": "esm/index.d.ts",
9
9
  "module": "esm/index.js",
@@ -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
- store = proxy<GlobalSettingDataInstanceState>({
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(state);
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
  /**
@@ -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
- if (url && typeof this.isAuth === 'function') {
10
- isAuthTo = await this.isAuth(url);
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: '无权访问', icon: 'none' });
25
+ Taro.showToast({ title: `${url} 无权访问`, icon: 'none' });
15
26
  return false;
16
27
  }
17
28
  return true;
@@ -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,