@yyp92-cli/template-react-pc 1.3.0 → 1.5.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @yyp92-cli/template-react-pc
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - react 模板 去掉手动存储本地
8
+
9
+ ## 1.4.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 路由修改
14
+
3
15
  ## 1.3.0
4
16
 
5
17
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yyp92-cli/template-react-pc",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -6,6 +6,8 @@ import {Footer} from '../footer'
6
6
  import {routerConfig} from '@/router/router'
7
7
  import type {RouterConfigItemProps} from '@/router/router'
8
8
  import { permissionStore } from '@/store/permission'
9
+ import { tokenStore } from '@/store/token'
10
+ import { menusStore } from '@/store/menus'
9
11
 
10
12
  import styles from './index.module.scss'
11
13
 
@@ -21,6 +23,8 @@ const Content: React.FC<ContentProps> = ({}) => {
21
23
  const {
22
24
  permissions
23
25
  } = permissionStore()
26
+ const {token} = tokenStore()
27
+ const {menus} = menusStore()
24
28
 
25
29
  const [currentRouter, setCurrentRouter] = useState<RouterConfigItemProps | any>()
26
30
 
@@ -28,7 +32,10 @@ const Content: React.FC<ContentProps> = ({}) => {
28
32
  const {pathname} = location ?? {}
29
33
  const newPathname = pathname.slice(1)
30
34
 
31
- if (newPathname !== '') {
35
+ if (!token) {
36
+ navigate('/login')
37
+ }
38
+ else if (newPathname !== '') {
32
39
  const pathnameList = newPathname.split('/')
33
40
  const getCcondition = () => {
34
41
  if (pathnameList.length === 1) {
@@ -67,6 +74,9 @@ const Content: React.FC<ContentProps> = ({}) => {
67
74
  navigate('/403')
68
75
  }
69
76
  }
77
+ else {
78
+ navigate(`/${menus[0]?.key}/${menus[0]?.children?.[0]?.key}`)
79
+ }
70
80
  }, [location])
71
81
 
72
82
 
@@ -3,8 +3,11 @@ import {useNavigate} from 'react-router-dom'
3
3
  import { Avatar, Button, Dropdown, Switch, Tooltip } from 'antd'
4
4
  import type { MenuProps } from 'antd'
5
5
  import { FullscreenExitOutlined, FullscreenOutlined, UserOutlined } from '@ant-design/icons'
6
- import { localCache, getDarkTheme } from '@/utils'
7
- import { LOGIN_TOKEN, USER_INFO, MENUS } from '@/global/constants'
6
+ import { getDarkTheme } from '@/utils'
7
+ import { userInfoStore } from '@/store/login'
8
+ import { tokenStore } from '@/store/token'
9
+ import { menusStore } from '@/store/menus'
10
+ import { permissionStore } from '@/store/permission'
8
11
 
9
12
  import styles from './index.module.scss'
10
13
 
@@ -14,14 +17,19 @@ interface HeaderProps {
14
17
 
15
18
  export const Header: React.FC<HeaderProps> = ({ }) => {
16
19
  const navigate = useNavigate()
20
+ const {clearUserInfo} = userInfoStore()
21
+ const {clearToken} = tokenStore()
22
+ const {clearMenus} = menusStore()
23
+ const {clearPermissions} = permissionStore()
17
24
  const [isFullScreen, setIsFullScreen] = useState<boolean>(false)
18
25
 
19
26
 
20
27
  // ********* 操作 *********
21
28
  const handleLogout = () => {
22
- localCache.removeCache(LOGIN_TOKEN)
23
- localCache.removeCache(USER_INFO)
24
- localCache.removeCache(MENUS)
29
+ clearToken()
30
+ clearUserInfo()
31
+ clearMenus()
32
+ clearPermissions()
25
33
 
26
34
  navigate('/login')
27
35
  }
@@ -4,8 +4,7 @@ import type { MenuProps } from 'antd';
4
4
  import {useNavigate, useLocation} from 'react-router-dom'
5
5
  import {ComponentMap} from '@/router/router'
6
6
  import { menusStore } from '@/store/menus'
7
- import { localCache } from '@/utils'
8
- import { LOGIN_TOKEN } from '@/global/constants'
7
+ import { tokenStore } from '@/store/token'
9
8
 
10
9
  import styles from './index.module.scss'
11
10
 
@@ -21,6 +20,7 @@ export const Side: React.FC<SideProps> = () => {
21
20
  const location = useLocation()
22
21
  const navigate = useNavigate()
23
22
  const {menus} = menusStore()
23
+ const {token} = tokenStore()
24
24
 
25
25
  // 激活的父菜单
26
26
  const [openKeys, setOpenKeys] = React.useState<string[]>([])
@@ -45,32 +45,16 @@ export const Side: React.FC<SideProps> = () => {
45
45
  const {pathname} = location ?? {}
46
46
  const newPathname = pathname.slice(1)
47
47
 
48
- if (newPathname === '') {
49
- const token = localCache.getCache(LOGIN_TOKEN)
48
+
49
+ const pathnameList = newPathname.split('/')
50
50
 
51
- if (token) {
52
- const openKey = menus[0]?.key
53
- const selectedKey = menus[0]?.children?.[0]?.key
54
-
55
- setOpenKeys([openKey])
56
- setSelectedKeys([selectedKey])
57
- navigate(`/${menus[0]?.key}/${menus[0]?.children?.[0]?.key}`)
58
- }
59
- else {
60
- navigate('/login')
61
- }
51
+ if (pathnameList.length === 1) {
52
+ setOpenKeys([])
53
+ setSelectedKeys([pathnameList[0]])
62
54
  }
63
- else {
64
- const pathnameList = newPathname.split('/')
65
-
66
- if (pathnameList.length === 1) {
67
- setOpenKeys([])
68
- setSelectedKeys([pathnameList[0]])
69
- }
70
- else if (pathnameList.length === 2 || pathnameList.length === 3) {
71
- setOpenKeys([pathnameList[0]])
72
- setSelectedKeys([pathnameList[1]])
73
- }
55
+ else if (pathnameList.length === 2 || pathnameList.length === 3) {
56
+ setOpenKeys([pathnameList[0]])
57
+ setSelectedKeys([pathnameList[1]])
74
58
  }
75
59
  }, [])
76
60
 
@@ -6,6 +6,8 @@ import { Footer } from '../footer'
6
6
  import { routerConfig } from '@/router/router'
7
7
  import type { RouterConfigItemProps } from '@/router/router'
8
8
  import { permissionStore } from '@/store/permission'
9
+ import { tokenStore } from '@/store/token'
10
+ import { menusStore } from '@/store/menus'
9
11
 
10
12
  import styles from './index.module.scss'
11
13
 
@@ -17,6 +19,8 @@ interface ContentProps {
17
19
  const Content: React.FC<ContentProps> = ({ }) => {
18
20
  const location = useLocation()
19
21
  const navigate = useNavigate()
22
+ const {token} = tokenStore()
23
+ const {menus} = menusStore()
20
24
  const {
21
25
  permissions
22
26
  } = permissionStore()
@@ -27,7 +31,10 @@ const Content: React.FC<ContentProps> = ({ }) => {
27
31
  const { pathname } = location ?? {}
28
32
  const newPathname = pathname.slice(1)
29
33
 
30
- if (newPathname !== '') {
34
+ if (!token) {
35
+ navigate('/login')
36
+ }
37
+ else if (newPathname !== '') {
31
38
  const pathnameList = newPathname.split('/')
32
39
  const getCcondition = () => {
33
40
  if (pathnameList.length === 1) {
@@ -66,6 +73,9 @@ const Content: React.FC<ContentProps> = ({ }) => {
66
73
  navigate('/403')
67
74
  }
68
75
  }
76
+ else {
77
+ navigate(`/${menus[0]?.key}/${menus[0]?.children?.[0]?.key}`)
78
+ }
69
79
  }, [location])
70
80
 
71
81
  // ********** 渲染 **********
@@ -3,8 +3,11 @@ import {useNavigate} from 'react-router-dom'
3
3
  import { Avatar, Button, Dropdown, Switch, Tooltip } from 'antd'
4
4
  import type { MenuProps } from 'antd'
5
5
  import { FullscreenExitOutlined, FullscreenOutlined, UserOutlined } from '@ant-design/icons'
6
- import { localCache, getDarkTheme } from '@/utils'
7
- import { LOGIN_TOKEN, USER_INFO, MENUS, PERMISSION } from '@/global/constants'
6
+ import { getDarkTheme } from '@/utils'
7
+ import { userInfoStore } from '@/store/login'
8
+ import { tokenStore } from '@/store/token'
9
+ import { menusStore } from '@/store/menus'
10
+ import { permissionStore } from '@/store/permission'
8
11
  import {Side} from '../side'
9
12
 
10
13
  import styles from './index.module.scss'
@@ -15,15 +18,19 @@ interface HeaderProps {
15
18
 
16
19
  export const Header: React.FC<HeaderProps> = ({}) => {
17
20
  const navigate = useNavigate()
21
+ const {clearUserInfo} = userInfoStore()
22
+ const {clearToken} = tokenStore()
23
+ const {clearMenus} = menusStore()
24
+ const {clearPermissions} = permissionStore()
18
25
  const [isFullScreen, setIsFullScreen] = useState<boolean>(false)
19
26
 
20
27
 
21
28
  // ********* 操作 *********
22
29
  const handleLogout = () => {
23
- localCache.removeCache(LOGIN_TOKEN)
24
- localCache.removeCache(USER_INFO)
25
- localCache.removeCache(MENUS)
26
- localCache.removeCache(PERMISSION)
30
+ clearToken()
31
+ clearUserInfo()
32
+ clearMenus()
33
+ clearPermissions()
27
34
 
28
35
  navigate('/login')
29
36
  }
@@ -4,8 +4,6 @@ import type { MenuProps } from 'antd';
4
4
  import {useNavigate, useLocation} from 'react-router-dom'
5
5
  import {ComponentMap} from '@/router/router'
6
6
  import { menusStore } from '@/store/menus'
7
- import { localCache } from '@/utils'
8
- import { LOGIN_TOKEN } from '@/global/constants'
9
7
 
10
8
  import styles from './index.module.scss'
11
9
 
@@ -44,33 +42,15 @@ export const Side: React.FC<SideProps> = ({}) => {
44
42
  useEffect(() => {
45
43
  const {pathname} = location ?? {}
46
44
  const newPathname = pathname.slice(1)
45
+ const pathnameList = newPathname.split('/')
47
46
 
48
- if (newPathname === '') {
49
- const token = localCache.getCache(LOGIN_TOKEN)
50
-
51
- if (token) {
52
- const openKey = menus[0]?.key
53
- const selectedKey = menus[0]?.children?.[0]?.key
54
-
55
- // setOpenKeys([openKey])
56
- setSelectedKeys([selectedKey])
57
- navigate(`/${menus[0]?.key}/${menus[0]?.children?.[0]?.key}`)
58
- }
59
- else {
60
- navigate('/login')
61
- }
47
+ if (pathnameList.length === 1) {
48
+ setOpenKeys([])
49
+ setSelectedKeys([pathnameList[0]])
62
50
  }
63
- else {
64
- const pathnameList = newPathname.split('/')
65
-
66
- if (pathnameList.length === 1) {
67
- setOpenKeys([])
68
- setSelectedKeys([pathnameList[0]])
69
- }
70
- else if (pathnameList.length === 2 || pathnameList.length === 3) {
71
- // setOpenKeys([pathnameList[0]])
72
- setSelectedKeys([pathnameList[1]])
73
- }
51
+ else if (pathnameList.length === 2 || pathnameList.length === 3) {
52
+ // setOpenKeys([pathnameList[0]])
53
+ setSelectedKeys([pathnameList[1]])
74
54
  }
75
55
  }, [])
76
56
 
@@ -41,7 +41,7 @@ const Home: React.FC<HomeProps> = () => {
41
41
  <Button onClick={() => navigate('/login')}>login</Button>
42
42
 
43
43
  <div style={{ marginTop: 20 }}>
44
- <div>姓名:{userInfo.userName}</div>
44
+ <div>姓名:{userInfo?.userName}</div>
45
45
 
46
46
  <Button
47
47
  type="primary"
@@ -1,8 +1,8 @@
1
1
  import React from 'react'
2
2
  import {createBrowserRouter} from 'react-router-dom'
3
3
  import { AppstoreOutlined, MailOutlined, NodeCollapseOutlined, SettingOutlined } from '@ant-design/icons';
4
- // import Layout from '@/components/layout'
5
- import Layout from '@/components/layout-horizontal'
4
+ import Layout from '@/components/layout'
5
+ // import Layout from '@/components/layout-horizontal'
6
6
  import Home from '@/pages/home'
7
7
  import { Page403 } from '@/components/403'
8
8
  import { Page404 } from '@/components/404'
@@ -2,9 +2,11 @@ import axios from 'axios'
2
2
  import { notification, message } from 'antd'
3
3
  import type { AxiosRequestConfig, AxiosError, AxiosResponse } from 'axios'
4
4
  import type { MyInternalAxiosRequestConfig } from './type'
5
- import { localCache } from '@/utils/cache'
6
- import { LOGIN_TOKEN, USER_INFO, PERMISSION, MENUS } from '@/global/constants'
7
5
  import router from '@/router/router'
6
+ import { userInfoStore } from '@/store/login'
7
+ import { tokenStore } from '@/store/token'
8
+ import { menusStore } from '@/store/menus'
9
+ import { permissionStore } from '@/store/permission'
8
10
 
9
11
  // * 存储待取消的请求:key 是请求唯一标识,value 是 AbortController 实例
10
12
  const pendingRequests = new Map()
@@ -67,10 +69,10 @@ const removePendingRequest = (config: AxiosRequestConfig) => {
67
69
  // * Token 过期处理函数
68
70
  function handleTokenExpired() {
69
71
  // 1. 清除本地存储的 Token(避免死循环)
70
- localCache.removeCache(LOGIN_TOKEN)
71
- localCache.removeCache(USER_INFO)
72
- localCache.removeCache(PERMISSION)
73
- localCache.removeCache(MENUS)
72
+ userInfoStore.getState().clearUserInfo()
73
+ tokenStore.getState().clearToken()
74
+ menusStore.getState().clearMenus()
75
+ permissionStore.getState().clearPermissions()
74
76
 
75
77
  // 排除登录页,避免死循环
76
78
  const currentPath = window.location.pathname
@@ -103,7 +105,7 @@ instance.interceptors.request.use(
103
105
  addPendingRequest(config)
104
106
  }
105
107
 
106
- const token = localCache.getCache(LOGIN_TOKEN)
108
+ const token = tokenStore.getState().token
107
109
 
108
110
  if (config.headers && token) {
109
111
  config.headers.Authorization = `Bearer ${token}`
@@ -7,15 +7,16 @@ import { USER_INFO} from '@/global/constants'
7
7
 
8
8
  type UserInfoStoreState = {
9
9
  userInfo: {
10
- userId: string,
11
- userName: string
10
+ userId?: string,
11
+ userName?: string
12
12
  }
13
13
  }
14
14
 
15
15
  type UserInfoStoreActions = {
16
16
  setUserInfo: (
17
17
  userInfo: UserInfoStoreState['userInfo']
18
- ) => void
18
+ ) => void,
19
+ clearUserInfo: () => void
19
20
  }
20
21
 
21
22
  type UserInfoStore = UserInfoStoreState & UserInfoStoreActions
@@ -28,6 +29,7 @@ export const userInfoStore = create<UserInfoStore>()(
28
29
  userId: '111'
29
30
  },
30
31
  setUserInfo: (userInfo) => set({userInfo}),
32
+ clearUserInfo: () => set({userInfo: {}})
31
33
  }),
32
34
  {
33
35
  name: USER_INFO
@@ -11,6 +11,7 @@ type MenusStoreState = {
11
11
 
12
12
  type MenusStoreActions = {
13
13
  setMenus: (menus: string[]) => void,
14
+ clearMenus: () => void
14
15
  }
15
16
 
16
17
  type MenusStore = MenusStoreState & MenusStoreActions
@@ -19,7 +20,8 @@ export const menusStore = create<MenusStore>()(
19
20
  persist(
20
21
  (set) => ({
21
22
  menus: [],
22
- setMenus: (menus) => set({menus})
23
+ setMenus: (menus) => set({menus}),
24
+ clearMenus: () => set({menus: []}),
23
25
  }),
24
26
  {
25
27
  name: MENUS
@@ -11,6 +11,7 @@ type PermissionStoreState = {
11
11
 
12
12
  type PermissionStoreActions = {
13
13
  setPermissions: (permissions: string[]) => void,
14
+ clearPermissions: () => void
14
15
  }
15
16
 
16
17
  type PermissionStore = PermissionStoreState & PermissionStoreActions
@@ -19,7 +20,8 @@ export const permissionStore = create<PermissionStore>()(
19
20
  persist(
20
21
  (set) => ({
21
22
  permissions: [],
22
- setPermissions: (permissions) => set({permissions})
23
+ setPermissions: (permissions) => set({permissions}),
24
+ clearPermissions: () => set({permissions: []}),
23
25
  }),
24
26
  {
25
27
  name: PERMISSION
@@ -10,7 +10,8 @@ type UserInfoStoreState = {
10
10
  }
11
11
 
12
12
  type UserInfoStoreActions = {
13
- setToken: (token: string) => void
13
+ setToken: (token: string) => void,
14
+ clearToken: () => void
14
15
  }
15
16
 
16
17
  type UserInfoStore = UserInfoStoreState & UserInfoStoreActions
@@ -19,7 +20,8 @@ export const tokenStore = create<UserInfoStore>()(
19
20
  persist(
20
21
  (set) => ({
21
22
  token: '',
22
- setToken: (token) => set({token})
23
+ setToken: (token) => set({token}),
24
+ clearToken: () => set({token: ''})
23
25
  }),
24
26
  {
25
27
  name: LOGIN_TOKEN