Browse Source

商品列表-上

daxia 1 year ago
parent
commit
ad50b4517b
35 changed files with 141 additions and 2 deletions
  1. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/.gitignore
  2. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/README.md
  3. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/package.json
  4. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/public/favicon.ico
  5. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/public/index.html
  6. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/public/logo192.png
  7. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/public/logo512.png
  8. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/public/manifest.json
  9. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/public/robots.txt
  10. 11 1
      20_React.js_VIP22/day-9/code/react-project-demo/src/Layout/index.jsx
  11. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/Layout/index.scss
  12. 7 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/api/goods.js
  13. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/api/user.js
  14. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/components/LoadingElement.jsx
  15. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/components/RequireAuth.jsx
  16. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/index.css
  17. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/index.js
  18. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/About.jsx
  19. 23 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/GoodsList/goods.scss
  20. 23 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/GoodsList/goodsSlice.js
  21. 23 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/GoodsList/index.jsx
  22. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Home.jsx
  23. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Home.module.scss
  24. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Login/index.jsx
  25. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Login/index.scss
  26. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Login/login.bg.gif
  27. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/reportWebVitals.js
  28. 9 1
      20_React.js_VIP22/day-9/code/react-project-demo/src/router/index.js
  29. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/setupProxy.js
  30. 2 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/store/index.js
  31. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/store/slice/loading.js
  32. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/store/slice/user.js
  33. 43 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/utils/http.js
  34. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/src/utils/withSuspense.jsx
  35. 0 0
      20_React.js_VIP22/day-9/code/react-project-demo/yarn.lock

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/.gitignore → 20_React.js_VIP22/day-9/code/react-project-demo/.gitignore


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/README.md → 20_React.js_VIP22/day-9/code/react-project-demo/README.md


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/package.json → 20_React.js_VIP22/day-9/code/react-project-demo/package.json


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/public/favicon.ico → 20_React.js_VIP22/day-9/code/react-project-demo/public/favicon.ico


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/public/index.html → 20_React.js_VIP22/day-9/code/react-project-demo/public/index.html


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/public/logo192.png → 20_React.js_VIP22/day-9/code/react-project-demo/public/logo192.png


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/public/logo512.png → 20_React.js_VIP22/day-9/code/react-project-demo/public/logo512.png


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/public/manifest.json → 20_React.js_VIP22/day-9/code/react-project-demo/public/manifest.json


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/public/robots.txt → 20_React.js_VIP22/day-9/code/react-project-demo/public/robots.txt


+ 11 - 1
20_React.js_VIP22/day-8下/code/react-project-demo/src/Layout/index.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/Layout/index.jsx

@@ -1,7 +1,11 @@
 import { Layout, Menu } from 'antd';
 import { useEffect, useState } from 'react';
 import { Outlet, Link, useLocation } from 'react-router-dom';
-import { HomeOutlined, EllipsisOutlined } from '@ant-design/icons';
+import {
+  HomeOutlined,
+  EllipsisOutlined,
+  ProfileOutlined,
+} from '@ant-design/icons';
 
 import './index.scss';
 
@@ -43,6 +47,12 @@ function LayoutAdmin() {
       label: <Link to="/about">关于</Link>,
       url: '/about',
     },
+    {
+      key: '03',
+      icon: <ProfileOutlined />,
+      label: <Link to="/goods/list">商品列表</Link>,
+      url: '/goods/list',
+    },
   ]);
 
   let { pathname } = useLocation();

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/Layout/index.scss → 20_React.js_VIP22/day-9/code/react-project-demo/src/Layout/index.scss


+ 7 - 0
20_React.js_VIP22/day-9/code/react-project-demo/src/api/goods.js

@@ -0,0 +1,7 @@
+//! 商品接口API
+import http from '../utils/http';
+
+export function getAllGoods() {
+  console.log(http);
+  return http.get('/goods/list');
+}

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/api/user.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/api/user.js


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/components/LoadingElement.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/components/LoadingElement.jsx


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/components/RequireAuth.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/components/RequireAuth.jsx


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/index.css → 20_React.js_VIP22/day-9/code/react-project-demo/src/index.css


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/index.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/index.js


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/pages/About.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/pages/About.jsx


+ 23 - 0
20_React.js_VIP22/day-9/code/react-project-demo/src/pages/GoodsList/goods.scss

@@ -0,0 +1,23 @@
+.goods-list {
+  width: 500px;
+  margin: 0 auto;
+  padding: 20px;
+  border-radius: 12px;
+  min-height: 300px;
+  background-color: #fff;
+
+  .search-bar {
+    display: flex;
+    flex-direction: column;
+    height: 48px;
+    align-items: center;
+    justify-content: space-around;
+
+    text-align: left;
+
+    .ant-input, .ant-checkbox-wrapper {
+      width: 400px;
+    
+    }
+  }
+}

+ 23 - 0
20_React.js_VIP22/day-9/code/react-project-demo/src/pages/GoodsList/goodsSlice.js

@@ -0,0 +1,23 @@
+import { createSlice } from '@reduxjs/toolkit';
+import { getAllGoods } from '../../api/goods';
+
+export const goodsSlice = createSlice({
+  name: 'goods',
+  initialState: {
+    list: [],
+  },
+  reducers: {
+    setList(state, { payload }) {
+      state.list = payload;
+    },
+  },
+});
+
+export default goodsSlice.reducer;
+
+export const { setList } = goodsSlice.actions;
+
+export const getGoodsList = () => async (dispath) => {
+  // 发起网络请求
+  let { code, data, msg } = await getAllGoods();
+};

+ 23 - 0
20_React.js_VIP22/day-9/code/react-project-demo/src/pages/GoodsList/index.jsx

@@ -0,0 +1,23 @@
+import { Input, Checkbox } from 'antd';
+import './goods.scss';
+import store from '../../store';
+import { getGoodsList } from './goodsSlice';
+
+function GoodsList() {
+  return (
+    <div className="goods-list">
+      <div className="search-bar">
+        <Input placeholder="通过商品名检索..." />
+        <Checkbox>仅显示有库存的商品</Checkbox>
+      </div>
+      <table></table>
+    </div>
+  );
+}
+
+export default GoodsList;
+
+export const goodsLoader = () => {
+  store.dispatch(getGoodsList());
+  return null;
+};

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/pages/Home.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Home.jsx


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/pages/Home.module.scss → 20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Home.module.scss


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/pages/Login/index.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Login/index.jsx


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/pages/Login/index.scss → 20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Login/index.scss


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/pages/Login/login.bg.gif → 20_React.js_VIP22/day-9/code/react-project-demo/src/pages/Login/login.bg.gif


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/reportWebVitals.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/reportWebVitals.js


+ 9 - 1
20_React.js_VIP22/day-8下/code/react-project-demo/src/router/index.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/router/index.js

@@ -7,8 +7,11 @@ import RequireAuth from '../components/RequireAuth';
 import Home from '../pages/Home';
 import withSuspense from '../utils/withSuspense';
 
+import { goodsLoader } from '../pages/GoodsList';
+
 const About = lazy(() => import('../pages/About'));
 const Login = lazy(() => import('../pages/Login'));
+const GoodsList = lazy(() => import('../pages/GoodsList'));
 
 const router = createBrowserRouter([
   {
@@ -28,9 +31,14 @@ const router = createBrowserRouter([
         element: <Home />,
       },
       {
-        path: '/about',
+        path: 'about',
         element: withSuspense(About),
       },
+      {
+        path: 'goods/list',
+        loader: goodsLoader,
+        element: withSuspense(GoodsList),
+      },
     ],
   },
 ]);

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/setupProxy.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/setupProxy.js


+ 2 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/store/index.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/store/index.js

@@ -1,11 +1,13 @@
 import { configureStore } from '@reduxjs/toolkit';
 import loadingReducer from './slice/loading';
 import userReducer from './slice/user';
+import goodsReducr from '../pages/GoodsList/goodsSlice';
 
 const store = configureStore({
   reducer: {
     loader: loadingReducer,
     user: userReducer,
+    goods: goodsReducr,
   },
 });
 

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/store/slice/loading.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/store/slice/loading.js


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/store/slice/user.js → 20_React.js_VIP22/day-9/code/react-project-demo/src/store/slice/user.js


+ 43 - 0
20_React.js_VIP22/day-9/code/react-project-demo/src/utils/http.js

@@ -0,0 +1,43 @@
+import axios from 'axios';
+
+const axiosInstance = axios.create({
+  baseURL: '/api/v1',
+  timeout: 2000,
+});
+
+// 加入拦截器
+// 添加请求拦截器
+axiosInstance.interceptors.request.use(
+  function (config) {
+    // 在发送请求之前做些什么
+    //! 将token信息携带上
+    let token = localStorage.getItem('token');
+    token && (config.headers['Authorization'] = token);
+    return config;
+  },
+  function (error) {
+    // 对请求错误做些什么
+    return Promise.reject(error);
+  }
+);
+
+// 添加响应拦截器
+axiosInstance.interceptors.response.use(
+  function (response) {
+    // 2xx 范围内的状态码都会触发该函数。
+    // 对响应数据做点什么
+    return response.data;
+  },
+  function (error) {
+    // 超出 2xx 范围的状态码都会触发该函数。
+    // 对响应错误做点什么
+    // 401错误处理
+    if (error.response.status == 401) {
+      //! 提示用户 未登录或者 登录超时
+      //! 页面重定向到 登录上
+    }
+    return Promise.reject(error);
+  }
+);
+
+export default axiosInstance;

+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/src/utils/withSuspense.jsx → 20_React.js_VIP22/day-9/code/react-project-demo/src/utils/withSuspense.jsx


+ 0 - 0
20_React.js_VIP22/day-8下/code/react-project-demo/yarn.lock → 20_React.js_VIP22/day-9/code/react-project-demo/yarn.lock