张涛 1年前
父节点
当前提交
9bf5bb0d7b

+ 7
- 7
package-lock.json 查看文件

@@ -12,7 +12,7 @@
12 12
         "@ant-design/pro-components": "^2.3.13",
13 13
         "@wangeditor/editor": "^5.1.23",
14 14
         "@wangeditor/editor-for-react": "^1.0.6",
15
-        "@zjxpcyc/react-tiny-store": "^2.0.1",
15
+        "@zjxpcyc/react-tiny-store": "^3.0.3",
16 16
         "antd": "^4.23.4",
17 17
         "axios": "^1.2.0",
18 18
         "classnames": "^2.3.2",
@@ -1278,9 +1278,9 @@
1278 1278
       }
1279 1279
     },
1280 1280
     "node_modules/@zjxpcyc/react-tiny-store": {
1281
-      "version": "2.0.6",
1282
-      "resolved": "https://registry.npmmirror.com/@zjxpcyc/react-tiny-store/-/react-tiny-store-2.0.6.tgz",
1283
-      "integrity": "sha512-NpF7bHWzpgM4PwG1tSnS38HQFxQaAvFGSxzqKu/t5wV96Vm5sclQr9Lmy2/kjKBNLpoURrR76UCwD9EU+RHejg=="
1281
+      "version": "3.0.3",
1282
+      "resolved": "https://registry.npmmirror.com/@zjxpcyc/react-tiny-store/-/react-tiny-store-3.0.3.tgz",
1283
+      "integrity": "sha512-x/la2wJVUFH7FV+xgtXBOT6Ba2AAsuLq+OkU8UFrrcfz9M4JrqWyt7Dz8TUiO3EoYkMiRz8FD++QggdR2HquJA=="
1284 1284
     },
1285 1285
     "node_modules/add-dom-event-listener": {
1286 1286
       "version": "1.1.0",
@@ -4708,9 +4708,9 @@
4708 4708
       "requires": {}
4709 4709
     },
4710 4710
     "@zjxpcyc/react-tiny-store": {
4711
-      "version": "2.0.6",
4712
-      "resolved": "https://registry.npmmirror.com/@zjxpcyc/react-tiny-store/-/react-tiny-store-2.0.6.tgz",
4713
-      "integrity": "sha512-NpF7bHWzpgM4PwG1tSnS38HQFxQaAvFGSxzqKu/t5wV96Vm5sclQr9Lmy2/kjKBNLpoURrR76UCwD9EU+RHejg=="
4711
+      "version": "3.0.3",
4712
+      "resolved": "https://registry.npmmirror.com/@zjxpcyc/react-tiny-store/-/react-tiny-store-3.0.3.tgz",
4713
+      "integrity": "sha512-x/la2wJVUFH7FV+xgtXBOT6Ba2AAsuLq+OkU8UFrrcfz9M4JrqWyt7Dz8TUiO3EoYkMiRz8FD++QggdR2HquJA=="
4714 4714
     },
4715 4715
     "add-dom-event-listener": {
4716 4716
       "version": "1.1.0",

+ 1
- 1
package.json 查看文件

@@ -13,7 +13,7 @@
13 13
     "@ant-design/pro-components": "^2.3.13",
14 14
     "@wangeditor/editor": "^5.1.23",
15 15
     "@wangeditor/editor-for-react": "^1.0.6",
16
-    "@zjxpcyc/react-tiny-store": "^2.0.1",
16
+    "@zjxpcyc/react-tiny-store": "^3.0.3",
17 17
     "antd": "^4.23.4",
18 18
     "axios": "^1.2.0",
19 19
     "classnames": "^2.3.2",

+ 0
- 1
src/layouts/AuthLayout/Main.jsx 查看文件

@@ -18,7 +18,6 @@ export default (props) => {
18 18
   const location = useLocation();
19 19
   const menus = getMenuItems(authRoutes);
20 20
 
21
-  // console.log('menus', menus)
22 21
 
23 22
   return (
24 23
     <Layout className={theme} style={{ height: "100vh" }}>

+ 31
- 0
src/layouts/AuthLayout/RequireLogin.jsx 查看文件

@@ -0,0 +1,31 @@
1
+import React, { useState, useEffect } from "react";
2
+import { useNavigate } from "react-router-dom";
3
+import { useModel } from "@/store";
4
+
5
+export default (props) => {
6
+  const { user, getCurrentUser } = useModel("user");
7
+  const navigate = useNavigate();
8
+  const [userStatus, setUserStatus] = useState(user && user.userId ? 1 : 0);
9
+
10
+  useEffect(() => {
11
+    if (!user || !user.userId) {
12
+      getCurrentUser()
13
+        .then((res) => {
14
+          setUserStatus(1);
15
+        })
16
+        .catch((err) => {
17
+          console.error(err);
18
+          setUserStatus(-1);
19
+        });
20
+    }
21
+  }, []);
22
+
23
+  useEffect(() => {
24
+    if (userStatus === -1) {
25
+      navigate("/login?isBack=true");
26
+      return;
27
+    }
28
+  }, [userStatus]);
29
+
30
+  return userStatus < 1 ? null : props.children;
31
+};

+ 3
- 3
src/layouts/AuthLayout/components/Header/User.jsx 查看文件

@@ -109,12 +109,12 @@ export default (props) => {
109 109
       passRef.current.show();
110 110
     }
111 111
   };
112
-
112
+console.log(user)
113 113
   return (
114 114
     <Dropdown menu={{ items, onClick }}>
115 115
       <div className="user-info">
116
-        <Avatar size={24} src={user.account || <DefaultAvatar />} />
117
-        <span className="font">{user.userName}</span>
116
+        <Avatar size={24} src={user?.account || <DefaultAvatar />} />
117
+        <span className="font">{user?.userName}</span>
118 118
         <ChangePassword user={user} ref={passRef} />
119 119
       </div>
120 120
     </Dropdown>

+ 33
- 0
src/layouts/AuthLayout/index copy.jsx 查看文件

@@ -0,0 +1,33 @@
1
+import React from "react";
2
+import { Spin } from "antd";
3
+import HtmlTitle from "./components/HtmlTitle";
4
+// import Main from './Main';
5
+import withLogin from "./withLogin";
6
+
7
+const Spinner = () => (
8
+  <div
9
+    style={{
10
+      width: "100%",
11
+      height: "100%",
12
+      display: "grid",
13
+      placeItems: "center",
14
+    }}
15
+  >
16
+    <Spin />
17
+  </div>
18
+);
19
+
20
+export default (props) => {
21
+  const RequireLogin = React.lazy(() => {
22
+    return withLogin(import("./Main"));
23
+  });
24
+
25
+  return (
26
+    <>
27
+      <HtmlTitle />
28
+      <React.Suspense fallback={<Spinner />}>
29
+        <RequireLogin />
30
+      </React.Suspense>
31
+    </>
32
+  );
33
+};

+ 34
- 10
src/layouts/AuthLayout/index.jsx 查看文件

@@ -1,8 +1,18 @@
1 1
 import React from "react";
2
-import { Spin } from "antd";
2
+import { Spin, Layout } from "antd";
3 3
 import HtmlTitle from "./components/HtmlTitle";
4 4
 // import Main from './Main';
5 5
 import withLogin from "./withLogin";
6
+import { useLocation, useNavigate } from "react-router-dom";
7
+import { useModel } from "@/store";
8
+
9
+import SiderBar from "./components/SiderBar";
10
+import Header from "./components/Header";
11
+import Container from "./components/Container";
12
+import { authRoutes } from "@/routes/routes";
13
+import { getMenuItems } from "@/routes/menus";
14
+import RequireLogin from "./RequireLogin";
15
+import "./style.less";
6 16
 
7 17
 const Spinner = () => (
8 18
   <div
@@ -18,16 +28,30 @@ const Spinner = () => (
18 28
 );
19 29
 
20 30
 export default (props) => {
21
-  const RequireLogin = React.lazy(() => {
22
-    return withLogin(import("./Main"));
23
-  });
24
-
31
+  const { theme } = useModel("system");
32
+  const { user, menus } = useModel("user");
33
+  const navigate = useNavigate();
34
+  const location = useLocation();
35
+  // const menus = getMenuItems(authRoutes);
36
+  // const RequireLogin = React.lazy(() => {
37
+  //   return withLogin(import("./Main"));
38
+  // });
39
+  console.log(menus);
40
+  console.log(user);
25 41
   return (
26
-    <>
42
+    <Spin spinning={!user} size="large">
27 43
       <HtmlTitle />
28
-      <React.Suspense fallback={<Spinner />}>
29
-        <RequireLogin />
30
-      </React.Suspense>
31
-    </>
44
+      {/* <React.Suspense fallback={<Spinner />}> */}
45
+      <RequireLogin>
46
+        <Layout className={theme} style={{ height: "100vh" }}>
47
+          <Header theme={theme} user={user} />
48
+          <Layout style={{ height: "calc(100vh - var(--header-height))" }}>
49
+            <SiderBar theme={theme} menus={menus} location={location} />
50
+            <Container location={location} />
51
+          </Layout>
52
+        </Layout>
53
+      </RequireLogin>
54
+      {/* </React.Suspense> */}
55
+    </Spin>
32 56
   );
33 57
 };

+ 2
- 2
src/pages/login/components/qrcode.module.less 查看文件

@@ -30,8 +30,8 @@
30 30
     display: grid;
31 31
     place-items: center;
32 32
   
33
-    .status-tip {
34
-    }
33
+    // .status-tip {
34
+    // }
35 35
   }
36 36
 
37 37
   .tip-box {

+ 1
- 1
src/routes/Router.jsx 查看文件

@@ -5,7 +5,7 @@ import { defaultRoutes } from './routes';
5 5
 
6 6
 export default (props) => {
7 7
   const { routes } = useModel('user');
8
-
8
+// console.log(routes)
9 9
   const router = React.useMemo(() => {
10 10
     if (!routes || routes.length < 1) {
11 11
       return createHashRouter(defaultRoutes);

+ 9
- 12
src/routes/routes.jsx 查看文件

@@ -1,7 +1,7 @@
1 1
 import {
2 2
   UserOutlined,
3 3
   SolutionOutlined,
4
-  FileTextOutlined
4
+  FileTextOutlined,
5 5
 } from "@ant-design/icons";
6 6
 import { Outlet, Navigate } from "react-router-dom";
7 7
 import AuthLayout from "@/layouts/AuthLayout";
@@ -37,7 +37,7 @@ export const authRoutes = [
37 37
     meta: {
38 38
       title: "客户管理",
39 39
       icon: <SolutionOutlined />,
40
-    }
40
+    },
41 41
   },
42 42
   {
43 43
     path: "custom/edit",
@@ -53,7 +53,7 @@ export const authRoutes = [
53 53
     meta: {
54 54
       title: "项目管理",
55 55
       icon: <FileTextOutlined />,
56
-    }
56
+    },
57 57
   },
58 58
   {
59 59
     path: "project/edit",
@@ -61,7 +61,7 @@ export const authRoutes = [
61 61
     meta: {
62 62
       title: "项目维护",
63 63
       hideInMenu: true,
64
-    }
64
+    },
65 65
   },
66 66
   {
67 67
     path: "user",
@@ -69,7 +69,7 @@ export const authRoutes = [
69 69
     meta: {
70 70
       title: "人员管理",
71 71
       icon: <UserOutlined />,
72
-    }
72
+    },
73 73
   },
74 74
   {
75 75
     path: "user/edit",
@@ -77,7 +77,7 @@ export const authRoutes = [
77 77
     meta: {
78 78
       title: "人员维护",
79 79
       hideInMenu: true,
80
-    }
80
+    },
81 81
   },
82 82
 ];
83 83
 
@@ -100,22 +100,19 @@ export const defaultRoutes = [
100 100
     path: "*",
101 101
     element: <Page404 />,
102 102
   },
103
-
104 103
 ];
105 104
 
106
-export function mergeAuthRoutes (r1, r2) {
105
+export function mergeAuthRoutes(r1, r2) {
107 106
   const r = r1.slice();
108 107
   const children = r1[0].children.slice();
109 108
   r[0].children = children.concat(r2);
110
-  // console.log('r', r);
111
-  // console.log('children', children);
112
-  // console.log('r[0].children', r[0].children);
109
+  console.log(r)
113 110
   return r;
114 111
 }
115 112
 
116 113
 // 全部路由
117 114
 export const routes = mergeAuthRoutes(defaultRoutes, authRoutes);
118
-function getPath (parent = "/", current = "") {
115
+function getPath(parent = "/", current = "") {
119 116
   if (current.indexOf("/") === 0 || current.indexOf("http") === 0)
120 117
     return current;
121 118
   return `${parent}/${current}`.replace(/\/\//g, "/");

+ 19
- 14
src/store/models/user.js 查看文件

@@ -1,26 +1,31 @@
1 1
 import { useState, useRef } from "react";
2 2
 import { defaultRoutes, authRoutes, mergeAuthRoutes } from "@/routes/routes";
3 3
 import { getMenuItems } from "@/routes/menus";
4
-// import { getAuthedRoutes } from "@/routes/permissions";
5 4
 import { currentUser } from "@/services/login";
5
+import { getAuthedRoutes } from "@/routes/permissions";
6 6
 
7 7
 export default function useUser() {
8
-  const [user, setUser] = useState({});
8
+  const [user, setUser] = useState(null);
9 9
   const menusRef = useRef();
10 10
   const routesRef = useRef();
11 11
 
12
-  const getCurrentUser = async () => 
13
-  new Promise((resolve, reject) => {
14
-    currentUser()
15
-      .then((res) => {
16
-        setUser(res);
17
-        menusRef.current = getMenuItems(authRoutes);
18
-        routesRef.current = mergeAuthRoutes(defaultRoutes);
19
-        // console.log('menusRef.current', menusRef.current)
20
-        resolve(res);
21
-      })
22
-      .catch(reject);
23
-  });
12
+  const getCurrentUser = () =>
13
+    new Promise((resolve, reject) => {
14
+      currentUser()
15
+        .then((res) => {
16
+          console.log(res);
17
+          // authRoutes 是所有待验证授权的路由
18
+          // authedRoutes 是已经被授权的路由
19
+          const authedRoutes = getAuthedRoutes(authRoutes, []);
20
+
21
+          menusRef.current = getMenuItems(authedRoutes);
22
+          routesRef.current = mergeAuthRoutes(defaultRoutes, authedRoutes);
23
+
24
+          setUser(res);
25
+          resolve();
26
+        })
27
+        .catch(reject);
28
+    });
24 29
 
25 30
   return {
26 31
     user,

+ 672
- 698
yarn.lock
文件差异内容过多而无法显示
查看文件