@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.
@@ -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 isLoginPage = utils_navigate.isCurrentPage(this.loginPageRoute || '');
50
- const _loginPageRoute = `${this.loginPageRoute || ''}`.replace(/^\//, '');
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: () => readonly [{
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
- requestSuccessCode: 200
15
+ ...this.defaultStore
6
16
  });
7
17
  extendStore = (state)=>{
8
- 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);
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>) => readonly [T, PageDataInstance<T>, string];
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>) => readonly [T, PageInfoDataInstance<T>, string];
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) {
@@ -165,6 +165,10 @@
165
165
  padding-top: .15rem;
166
166
  }
167
167
 
168
+ .fairystaro__text-_zkh1_0_dl_6rem_zhk2_ {
169
+ font-size: .6rem;
170
+ }
171
+
168
172
  .fairystaro__text-_zkh1_0_dl_8rem_zhk2_ {
169
173
  font-size: .8rem;
170
174
  }
@@ -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;
@@ -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);
@@ -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(this.tokenFieldName || 'token');
108
+ const token = taro.getStorageSync(globalSettingDataInstance.store.tokenFieldName || 'token');
112
109
  const newHeader = {
113
110
  ...header
114
111
  };
115
- if (token) newHeader[this.headerTokenName || 'token'] = token;
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
@@ -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.2",
6
+ "version": "0.0.4",
7
7
  "main": "lib/index.js",
8
8
  "types": "esm/index.d.ts",
9
9
  "module": "esm/index.js",
@@ -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 className={clsx('fairys_taro-ui-message-item-body', bodyClassName)} style={bodyStyle}>
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 fairystaro__right-0 fairystaro__bottom-0 fairystaro__left-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 isLoginPage = navigate.isCurrentPage(this.loginPageRoute || '');
86
- const _loginPageRoute = `${this.loginPageRoute || ''}`.replace(/^\//, '');
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 const;
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
- store = proxy<GlobalSettingDataInstanceState>({
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(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);
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 const;
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 const;
214
+ return [store, pageDataInstance, store.__defaultValue] as [T, PageDataInstance<T>, string | undefined];
215
215
  };