React 后臺管理系統

這是一個基于 React + TypeScript + Ant Design 開發的向明天系統前端項目。

git倉庫地址

在這里插入圖片描述

技術棧

  • React 19
  • TypeScript
  • Ant Design 5.x
  • Redux Toolkit
  • React Router
  • Axios
  • Less

環境要求

  • Node.js (推薦使用最新LTS版本)
  • npm 或 yarn

安裝步驟

  1. 克隆項目到本地
git clone [https://gitee.com/to-tomorrow-xmt/react.git]
  1. 進入項目目錄
cd remote-monitoring-system
  1. 安裝依賴
npm install
# 或使用 yarn
yarn install

開發環境運行

npm start
# 或使用 yarn
yarn start

項目將在開發模式下運行,訪問 http://localhost:3000 查看效果。

生產環境構建

npm run build
# 或使用 yarn
yarn build

構建后的文件將生成在 build 目錄中。

項目結構

src/├── api/          # API 接口定義├── assets/       # 靜態資源├── components/   # 公共組件├── pages/        # 頁面組件├── redux/        # Redux 狀態管理├── router/       # 路由配置├── styles/       # 全局樣式├── types/        # TypeScript 類型定義└── utils/        # 工具函數

主要功能

  • 用戶認證與授權
  • 數據可視化
  • 系統設置
  • 封裝接口請求數據

開發規范

  1. 使用 TypeScript 進行開發
  2. 遵循 ESLint 代碼規范
  3. 使用 Prettier 進行代碼格式化
  4. 組件命名采用 PascalCase
  5. 文件命名采用 kebab-case
接口配置文件

src/config 目錄下創建 api.config.ts 文件:

// src/config/api.config.ts
export const API_CONFIG = {baseURL: process.env.REACT_APP_API_URL,timeout: 10000,withCredentials: true,headers: {'Content-Type': 'application/json',},
};

跨域處理

開發環境跨域配置

在項目根目錄下的 craco.config.js 文件中配置開發環境代理:

// craco.config.js
module.exports = {devServer: {proxy: {'/api': {target: '',//真實地址changeOrigin: true,pathRewrite: {'^/api': '',},},},},
};
生產環境跨域處理

生產環境跨域需要在后端服務器進行配置,以下是常見的配置方式:

  1. Nginx 配置示例:
server {listen 80;server_name your-domain.com;location /api {proxy_pass http://backend-server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 跨域配置add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain charset=UTF-8';add_header 'Content-Length' 0;return 204;}}
}
  1. 后端服務器配置示例(以 Node.js Express 為例):
const express = require('express');
const cors = require('cors');
const app = express();app.use(cors({origin: process.env.REACT_APP_BASE_URL,methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],allowedHeaders: ['Content-Type', 'Authorization'],credentials: true
}));

請求配置

項目使用 Axios 進行 HTTP 請求,主要配置如下:

// 基礎配置
const baseURL = 'http://your-api-domain.com/api';
const timeout = 10000; // 請求超時時間// 請求攔截器
axios.interceptors.request.use((config) => {// 添加tokenconst token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;},(error) => {return Promise.reject(error);}
);// 響應攔截器
axios.interceptors.response.use((response) => {return response.data;},(error) => {// 處理錯誤響應if (error.response.status === 401) {// 處理未授權localStorage.removeItem('token');window.location.href = '/login';}return Promise.reject(error);}
);

請求方法示例

// GET 請求
const getData = async (params: any) => {try {const response = await axios.get('/endpoint', { params });return response;} catch (error) {console.error('請求失敗:', error);throw error;}
};// POST 請求
const postData = async (data: any) => {try {const response = await axios.post('/endpoint', data);return response;} catch (error) {console.error('請求失敗:', error);throw error;}
};// PUT 請求
const updateData = async (id: string, data: any) => {try {const response = await axios.put(`/endpoint/${id}`, data);return response;} catch (error) {console.error('請求失敗:', error);throw error;}
};// DELETE 請求
const deleteData = async (id: string) => {try {const response = await axios.delete(`/endpoint/${id}`);return response;} catch (error) {console.error('請求失敗:', error);throw error;}
};

錯誤處理

項目使用統一的錯誤處理機制:

  1. 網絡錯誤:顯示"網絡連接失敗,請檢查網絡設置"
  2. 401 未授權:自動跳轉到登錄頁面
  3. 403 禁止訪問:顯示"沒有權限訪問該資源"
  4. 404 資源不存在:顯示"請求的資源不存在"
  5. 500 服務器錯誤:顯示"服務器內部錯誤,請稍后重試"

請求封裝

建議將 API 請求封裝在 src/api 目錄下,按模塊組織:

src/api/├── auth.ts      # 認證相關接口├── device.ts    # 設備相關接口├── monitor.ts   # 監控相關接口└── index.ts     # 統一導出

權限路由說明

    <!-- 路由格式 -->使用方式,登錄以后后端把這個數據放給角色,根據這個格式,把所有路徑路由配置放在這里,讀取的時候讓后臺判斷,返回那些路徑,與后端溝通好.<!-- 把路由配置放在這里 -->parentId: id;index: index;title:一級路由名稱icon:圖標 我用的是iconfont 的圖標 根據自己情況替換就行了;type: group;children: [ //子級路由index:index;title:二級路由名稱path:path;name:name;component:文件讀取路徑 讀取pages 文件 路徑// 看不明白的就把這里的路徑和pages 下的路徑對比一下就明白了menuType:menuType;meta:   路由原信息] ;"nav": [{"parentId": "1","index": "1","title": "首頁","icon": "icon-shouye","type": "group","children": [{"index": "1-1","title": "首頁","name": "home","path": "/home","component": "shouYe/index","menuType": 0,"meta": {"selectIndex": "1-1","check": true}}]},{"parentId": "2","index": "2","title": "設備管理","icon": "icon-shebei","type": "group","children": [{"index": "2-1","title": "設備列表","name": "shebei","path": "/shebei","component": "shebei/shebei","menuType": 0,"meta": {"selectIndex": "2-1","check": true}}]},{"parentId": "3","index": "3","title": "模塊管理","icon": "icon-mokuai","type": "group","children": [{"index": "3-1","title": "模塊列表","name": "mokuai","path": "/mokuai","component": "mokuai/Mokuai","menuType": 0,"meta": {"selectIndex": "3-1","check": true}}]},{"parentId": "4","index": "4","title": "標靶檢測","icon": "icon-mubiaobachang1","type": "group","children": [{"index": "4-1","title": "報警列表","name": "jingIndex","path": "/jingIndex","component": "biaoba/index","menuType": 0,"meta": {"selectIndex": "4-1","check": true}},{"index": "4-2","title": "標靶檢測","name": "biaoba","path": "/biaoba","component": "biaoba/biaoba","menuType": 0,"meta": {"selectIndex": "4-2","check": true}},{"index": "4-3","title": "標靶報警","name": "baojing","path": "/baojing","component": "biaoba/baojing","menuType": 0,"meta": {"selectIndex": "4-3","check": true}},{"index": "4-4","title": "報警等級","name": "dengji","path": "/dengji","component": "biaoba/dengji","menuType": 0,"meta": {"selectIndex": "4-4","check": true}}]}]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81113.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第九節:文件操作

理論知識 文件的基本概念&#xff1a;文件是存儲數據的基本單位&#xff0c;在 Linux 系統中&#xff0c;一切皆文件。文件可以是文本文件、二進制文件、設備文件等。文件的創建&#xff1a;使用 touch 命令可以創建一個新的空文件。如果文件已經存在&#xff0c;則更新文件的…

2025-03 機器人等級考試四級理論真題 4級

1 2025年蛇年春晚&#xff0c;節目《秧BOT》機器人舞蹈表演節目點燃了全國觀眾的熱情&#xff0c;請問參加節目表演的機器人是由哪家公司研發&#xff1f;&#xff08; &#xff09; A.大疆 B.華為 C.優必選 D.宇樹科技 【參考答…

k8s平臺:手動部署Grafana

以下是一個可用于生產環境的 Kubernetes 部署 Grafana 的 YAML 文件。該配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim&#xff0c;確保 Grafana 的高可用性和數據持久化。 Grafana 生產部署 YAML 文件 ☆實操示例 cat grafana-deployment.yaml --- # …

農產品園區展示系統——仙盟創夢IDE開發

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>農業大數據平臺</title><style>* {margi…

每日Bug:(2)共享內存

對于整個系統而言&#xff0c;主存與CPU的資源都是有限的&#xff0c;隨著打開進程數量的增加&#xff0c;若是將所有進程運行所需的代碼/數據/棧/共享庫都存放在主存中&#xff0c;那么開啟一部分進程就可以將主存占用完。 虛擬內存就是解決以上問題的方法&#xff0c;使用虛…

C語言Makefile編寫與使用指南

Makefile 詳細指南&#xff1a;編寫與使用 Makefile 是 C/C 項目中常用的自動化構建工具&#xff0c;它定義了項目的編譯規則和依賴關系。下面我將詳細介紹 Makefile 的編寫和使用方法。 一、Makefile 基礎 1. 基本結構 一個典型的 Makefile 包含以下部分&#xff1a; mak…

Centos離線安裝Docker(無坑版)

1、下載并上傳docker離線安裝包 官方地址&#xff1a;安裝包下載 2、上傳到離線安裝的服務器解壓 tar -zxvf docker-28.1.1.tgz#拷貝解壓二進制文件到相關目錄 cp docker/* /usr/bin/ 3、創建docker啟動文件 cat << EOF > /usr/lib/systemd/system/docker.servic…

OceanBase數據庫-學習筆記4-租戶

租戶 租戶偏向于資源層面的邏輯概念&#xff0c;是在物理節點上劃分的資源單元&#xff0c;可以指定其資源規格&#xff0c;包括 CPU、內存、日志盤空間、IOPS 等。 租戶類似于傳統數據庫的數據庫實例&#xff0c;租戶通過資源池與資源關聯&#xff0c;從而獨占一定的資源配額…

UNIAPP項目記錄

一、通過 vue-cli 創建 uni-app 項目 創建 vue3 項目 創建以 javascript 開發的工程&#xff08;如命令行創建失敗&#xff0c;請直接訪問 gitee 下載模板&#xff09; npx degit dcloudio/uni-preset-vue#vite my-vue3-project復制代碼 npx degit dcloudio/uni-preset-vue#vit…

華為發布全球首個L3商用智駕ADS4.0

2024年10月2024世界智能網聯汽車大會上&#xff0c;余承東講到&#xff1a;“華為ADS 4.0將于2025年推出高速L3級自動駕駛商用及城區L3級自動駕駛試點&#xff0c;希望加快L3級自動駕駛標準的進程&#xff0c;推動L3級自動駕駛技術的普及。” 世界智能網聯汽車大會演講PPT 所以…

【Python學習路線】零基礎到項目實戰

目錄 &#x1f31f; 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 &#x1f9e0; 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 &#x1f4bb; 二、實戰演示環境配置要求核心代碼實現運行結果驗證 ? 三、性能對比測試方法論量化數據對比…

解決redis序列號和反序列化問題

最近遇到了一個問題,將 List<Map<String, Object>> 類型數據以list形式存入到redis之后,發現取出來時數據格式完全不對,根據報錯信息發現是反序列化問題,遇到類似問題,主要有兩種解決方案1.使用序列號工具 例如&#xff0c;Java中常用的序列化工具有Jackson、Gso…

Android學習總結之設計場景題

設計圖片請求框架的緩存模塊 核心目標是通過分層緩存策略&#xff08;內存緩存 磁盤緩存&#xff09;提升圖片加載效率&#xff0c;同時兼顧內存占用和存儲性能。以下是針對 Android 面試官的回答思路&#xff0c;結合代碼注釋說明關鍵設計點&#xff1a; 一、緩存架構設計&…

Webug3.0通關筆記14 第十四關:存儲型XSS

目錄 第十四關:存儲型XSS 1.打開靶場 2.源碼分析 3.滲透實戰 第十四關:存儲型XSS 本文通過《webug3靶場第十四關 存儲型XSS》來進行存儲型XSS關卡的滲透實戰。 存儲型 XSS&#xff08;Stored Cross - Site Scripting&#xff09;&#xff0c;也被稱為持久型 XSS&#xff…

Java父類、子類實例初始化順序詳解

1、完整的初始化順序&#xff08;含繼承&#xff09; 1、父類的靜態初始化 父類靜態變量默認值 → 父類靜態變量顯式賦值 父類靜態代碼塊&#xff08;按代碼順序執行&#xff09;。 2、子類的靜態初始化 子類靜態變量默認值 → 子類靜態變量顯式賦值 子類靜態代碼塊&…

13.組合模式:思考與解讀

原文地址:組合模式&#xff1a;思考與解讀 更多內容請關注&#xff1a;7.深入思考與解讀設計模式 引言 在軟件開發中&#xff0c;是否曾經遇到過這樣一種情況&#xff1a;你有一個對象&#xff0c;它本身很簡單&#xff0c;但是它包含了其他類似的對象。隨著系統變得越來越復…

OpenCV實戰教程 第一部分:基礎入門

第一部分&#xff1a;基礎入門 1. OpenCV簡介 什么是OpenCV及其應用領域 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;于1999年由Intel公司發起&#xff0c;現在由非營利組織OpenCV.org維護。Ope…

虛幻商城 Quixel 免費資產自動化入庫(2025年版)

文章目錄 一、背景二、問題講解1. Quixel 免費資產是否還能一鍵入庫?2. 是不是使用了一鍵入庫功能 Quixel 的所有資產就能入庫了?3. 一鍵入庫會入庫哪些資產?三、實現效果展示四、實現自動化入庫五、常見問題1. 出現401報錯2. 出現429報錯3. 入庫過于緩慢4. 入庫 0 個資產一…

uni-app - 小程序使用高德地圖完整版

文章目錄 ??功能描述??效果??開發環境??代碼部分??功能描述 頁面自動通過定位獲取用戶位置并展示周邊POI數據,同時支持關鍵詞輸入實時聯想推薦關聯地點信息, 實現精準智能的地點發現與檢索功能。 ??效果 ??開發環境 unibest2.5.4nodev18.20.5pnpm9.14.2wot-des…

牛客:AB4 逆波蘭表達式求值

鏈接&#xff1a;逆波蘭表達式求值_牛客題霸_牛客網 題解&#xff1a; 利用棧&#xff0c;遍歷字符串數組&#xff0c;遇到運算數則入棧&#xff0c;遇到運算符則取出棧頂兩個運算數進行運算&#xff0c;并將運算結果入棧。 class Solution { public:/*** 代碼中的類名、方法…