從零構建vue3項目(二)

Vue3項目增強配置:Axios封裝、鑒權與代碼掃描

1. Axios二次封裝與攔截器配置

安裝Axios

npm install axios

創建Axios實例 src/utils/request.js

import axios from 'axios'
import { useUserStore } from '@/stores/user'
import router from '@/router'// 創建axios實例
const service = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL,timeout: 10000,headers: {'Content-Type': 'application/json;charset=utf-8'}
})// 請求攔截器
service.interceptors.request.use((config) => {const userStore = useUserStore()// 如果token存在,添加到請求頭if (userStore.token) {config.headers.Authorization = `Bearer ${userStore.token}`}// 在這里可以添加全局參數if (config.method === 'get') {config.params = {...config.params,_t: Date.now() // 防止緩存}}return config},(error) => {return Promise.reject(error)}
)// 響應攔截器
service.interceptors.response.use((response) => {const res = response.data// 自定義狀態碼處理if (res.code !== 200) {// token過期if (res.code === 401) {const userStore = useUserStore()userStore.logout()router.push('/login?redirect=' + encodeURIComponent(router.currentRoute.value.fullPath))return Promise.reject(new Error(res.message || '登錄狀態已過期'))}// 其他錯誤return Promise.reject(new Error(res.message || 'Error'))} else {return res}},(error) => {// HTTP狀態碼處理if (error.response) {switch (error.response.status) {case 400:error.message = '請求錯誤'breakcase 401:error.message = '未授權,請重新登錄'const userStore = useUserStore()userStore.logout()router.push('/login')breakcase 403:error.message = '拒絕訪問'breakcase 404:error.message = '請求地址出錯'breakcase 500:error.message = '服務器內部錯誤'breakdefault:error.message = `連接錯誤 ${error.response.status}`}} else if (error.request) {error.message = '服務器未響應'} else {error.message = '網絡錯誤'}// 統一錯誤提示ElMessage.error(error.message)return Promise.reject(error)}
)export default service

使用示例 src/api/user.js

import request from '@/utils/request'export function login(data) {return request({url: '/auth/login',method: 'post',data})
}export function getUserInfo() {return request({url: '/user/info',method: 'get'})
}

2. Token鑒權集成

Pinia用戶狀態管理 src/stores/user.js

import { defineStore } from 'pinia'
import { login, logout, getUserInfo } from '@/api/user'
import { resetRouter } from '@/router'export const useUserStore = defineStore('user', {state: () => ({token: localStorage.getItem('token') || '',name: '',avatar: '',roles: []}),actions: {// 登錄async login(userInfo) {const { username, password } = userInfotry {const res = await login({ username, password })this.token = res.tokenlocalStorage.setItem('token', res.token)return this.getInfo()} catch (error) {return Promise.reject(error)}},// 獲取用戶信息async getInfo() {try {const res = await getUserInfo()const { name, avatar, roles } = resthis.name = namethis.avatar = avatarthis.roles = rolesreturn res} catch (error) {return Promise.reject(error)}},// 登出async logout() {try {await logout()} finally {this.token = ''this.roles = []localStorage.removeItem('token')resetRouter()}}}
})

路由守衛 src/router/permission.js

import router from './index'
import { useUserStore } from '@/stores/user'
import { ElMessage } from 'element-plus'const whiteList = ['/login'] // 不重定向白名單router.beforeEach(async (to, from, next) => {const userStore = useUserStore()// 確定用戶是否已登錄if (userStore.token) {if (to.path === '/login') {next({ path: '/' })} else {// 檢查用戶是否已獲取角色信息if (userStore.roles.length === 0) {try {await userStore.getInfo()// 動態生成可訪問路由const accessRoutes = await generateRoutes(userStore.roles)accessRoutes.forEach(route => {router.addRoute(route)})next({ ...to, replace: true })} catch (error) {// 獲取用戶信息失敗,重定向到登錄頁userStore.logout()ElMessage.error(error || '驗證失敗,請重新登錄')next(`/login?redirect=${to.path}`)}} else {next()}}} else {if (whiteList.includes(to.path)) {next()} else {next(`/login?redirect=${to.path}`)}}
})

3. 代碼掃描工具集成

SonarQube配置 (可選)

.sonarcloud.properties:

sonar.projectKey=my-vue3-app
sonar.organization=your-org
sonar.host.url=https://sonarcloud.io
sonar.login=your-sonar-tokensonar.sources=src
sonar.tests=src
sonar.test.inclusions=**/*.spec.js,**/*.test.js
sonar.javascript.lcov.reportPaths=coverage/lcov.info
sonar.exclusions=**/node_modules/**,**/dist/**,**/coverage/**,**/public/**,**/*.config.js

添加掃描腳本 package.json

{"scripts": {"sonar": "sonar-scanner","test:coverage": "vitest run --coverage","lint:ci": "eslint . --ext .vue,.js,.jsx,.ts,.tsx --format json --output-file eslint-report.json"}
}

GitHub Action集成 .github/workflows/code-analysis.yml

name: Code Analysis
on:push:branches: [ main ]pull_request:branches: [ main ]jobs:analysis:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Node.jsuses: actions/setup-node@v2with:node-version: '16'- name: Install dependenciesrun: npm install- name: Run tests with coveragerun: npm run test:coverage- name: Run linterrun: npm run lint:ci- name: SonarCloud Scanuses: SonarSource/sonarcloud-github-action@v1env:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

4. 安全增強配置

CSP配置 vite.config.js

import { defineConfig } from 'vite'export default defineConfig({// ...其他配置server: {headers: {'Content-Security-Policy': "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"}}
})

Helmet中間件 (Node.js后端)

const helmet = require('helmet')app.use(helmet({contentSecurityPolicy: {directives: {defaultSrc: ["'self'"],scriptSrc: ["'self'", "'unsafe-inline'"],styleSrc: ["'self'", "'unsafe-inline'"],imgSrc: ["'self'", "data:"]}},hsts: {maxAge: 63072000,includeSubDomains: true,preload: true}
}))

5. 完整增強后的項目結構

my-vue3-app/
├── src/
│   ├── api/                  # API接口
│   │   ├── user.js           # 用戶相關API
│   │   └── ...               # 其他模塊API
│   ├── router/
│   │   ├── index.js          # 基礎路由
│   │   ├── permission.js     # 路由守衛
│   │   └── modules/          # 動態路由模塊
│   ├── stores/
│   │   ├── index.js          # Pinia主文件
│   │   ├── user.js           # 用戶狀態
│   │   └── ...               # 其他狀態模塊
│   ├── utils/
│   │   ├── request.js        # Axios封裝
│   │   └── auth.js           # 鑒權工具
├── .sonarcloud.properties    # SonarQube配置
├── .github/workflows/        # CI/CD配置
└── ...                       # 其他原有文件

6. 關鍵點說明

  1. Axios封裝特點

    • 統一錯誤處理機制
    • 自動Token注入
    • 防止GET請求緩存
    • 響應數據統一格式處理
  2. 鑒權系統特點

    • JWT Token存儲與自動更新
    • 動態路由權限控制
    • 路由守衛保護
    • 角色基礎權限系統
  3. 代碼掃描集成

    • 本地SonarQube掃描支持
    • CI/CD流水線集成
    • 測試覆蓋率報告
    • 靜態代碼分析
  4. 安全增強

    • CSP內容安全策略
    • HTTPS嚴格傳輸安全
    • XSS防護頭
    • CSRF令牌支持(后端需配合)

這套配置提供了企業級Vue3應用所需的核心安全、鑒權和代碼質量保障功能,可以根據項目實際需求進行適當調整。

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

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

相關文章

哪家香港站群服務器比較好用?

面對魚龍混雜的服務商市場,哪家的香港站群服務器真正穩定?畢竟搞站群最怕的就是服務器抽風,輕則掉排名,重則客戶跑光光。今天咱就重點聊聊哪家香港站群服務器比較好用? 一般來說,在選擇香港站群服務器提供…

Python的科學計算庫NumPy(二)

5. 索引和切片 5.1 一維數組的索引和切片 import numpy as np# 一維數組索引和切片,跟python中的集合同樣使用 bin_list[1,2,3,4,5,6] bin_arraynp.array(bin_list) print(bin_array[3]) print(bin_array[1:4]) print(bin_array[-2:-1])5.2 多維數組的索引 # 多維…

STM32和C++ 實現配置文件導入、導出功能

一.配置文件導出功能 // 導出流程 // 1. 客戶端 → 設備:導出配置請求,例如:GetFlashData[d6fe30323454]:{ini} ,其中[]里面是設備序列號 // 2. 設備 → 客戶端:配置文件元數據(總大小、塊數量) // 3. 設備 → 客戶端:發送塊1(包含塊序號和大小) // 4. 設備 → 客戶端:…

HTTP 請求基礎知識

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言HTTP 請求方法GETPOSTPUTDELETE其他方法 HTTP 請求結構常用請求頭實際應用示例響應狀態碼 前言 HTTP (Hypertext Transfer Protocol) 是互聯網上應用最廣泛的協…

Django ORM 1. 創建模型(Model)

1. ORM介紹 什么是ORM? ORM,全稱 Object-Relational Mapping(對象關系映射),一種通過對象操作數據庫的技術。 它的核心思想是:我們不直接寫 SQL,而是用 Python 對象(類/實例&…

【C/C++】C++ 編程規范:101條規則準則與最佳實踐

C 編程規范:101條規則準則與最佳實踐 引言 C 是一門強大而復雜的語言,能高效控制硬件,也能寫出優雅抽象。然而,正因其復雜性,項目中若缺乏統一規范,極易陷入混亂、難維護、易出錯的泥潭。 本文總結了 10…

柔性屏激光修屏禁區突破:新啟航如何實現曲面 OLED 面板的無損修復?

一、引言 柔性 OLED 面板憑借其輕薄、可彎曲等特性,在智能終端、可穿戴設備等領域廣泛應用。然而,生產過程中面板易出現缺陷,傳統修復方法難以滿足曲面 OLED 面板的無損修復需求。新啟航半導體有限公司在激光修屏技術上取得突破,…

UI前端與數字孿生結合案例分享:智慧零售的可視化解決方案

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言:智慧零售的可視化變革 在數字化浪潮下,零售行業正從 “人貨場…

Docker 入門教程(四):容器命令

文章目錄 🐳 Docker 入門教程(四):容器命令創建并運行容器:docker run查看容器列表:docker ps停止、啟動、重啟容器刪除容器:docker rm進入容器:exec 和 attach查看容器日志&#xf…

2025.06.27【技術觀察L0】AlphaGenome:DeepMind推出的全新AI基因組解讀平臺

AlphaGenome:DeepMind推出的全新AI基因組解讀平臺詳解 2025年6月,Google DeepMind團隊正式發布了AlphaGenome——一款面向基因組功能解讀和變異效應預測的全新人工智能模型。AlphaGenome的出現,標志著AI在基因組學領域邁出了重要一步&#x…

[ARM-2D 專題]7. OOP實現之繼承,宏implement_ex的實現和解析

implement_ex宏是 Arm-2D 庫中用于面向對象編程(OOP)支持的核心宏定義。 implement_ex 宏的定義和作用 implement_ex 宏在 Library/Include/arm_2d_utils.h 中定義,用于在 C 語言中實現類似繼承的功能: /*!* \note do NOT use t…

默認構造函數

1、構造函數 一、什么是構造函數 c中有一種特殊的成員函數,他的名字和類名相同,沒有返回值,而在創建對象時會自動執行,類中的數據成員的初始化往往通過構造函數來實現。完成類中數據成員的初始化,同時也是類中的成員…

帶標簽的 Docker 鏡像打包為 tar 文件

現在還有人用docker嗎 要將帶標簽的 Docker 鏡像打包為 tar 文件,請使用 docker save 命令。以下是詳細操作指南: 一、單鏡像打包(推薦方式) # 基礎格式 docker save -o [輸出文件名].tar [鏡像名]:[標簽]# 示例:將…

基于GPS-RTK的履帶吊車跑偏檢測技術方案

基于GPS-RTK的履帶吊車跑偏檢測技術方案 1. 引言 1.1 項目背景 履帶吊車作為重型工程機械,其行駛穩定性直接關系到作業安全和設備壽命。跑偏現象會導致履帶異常磨損、轉向系統過載,嚴重時可能引發側翻事故。傳統檢測方法(如激光測距或人工觀…

勾正數據大數據開發面試題整理-20250625

最近面了家公司,想看看自己多年不準備面試,靠著老本能面試成啥樣,算是試試水吧,一面過了,二面有個算法題沒答出來,整體答得狀態也不太好,應該是沒過。 一面 先來說說一面吧,一面是…

基于中國香港會計準則差異,中國企業在香港推廣ERP(SAP、Oracle)系統需要注意的細節

核心在于:ERP通常按單一會計準則設計主數據架構,但跨國企業需要同時滿足兩地報表要求。 用戶常見的場景包括: 1 科目體系能否同時承載CAS的專項儲備和HKFRS的禁止計提? 2 資產模塊如何兼容不同的減值轉回規則? 3 關聯…

【編譯原理】期末復習知識總結

目錄 題型 總結 編譯五大組成部分 編譯與解釋方式區別? 前端,后端,Why? 概念 推導、歸約 短語、簡單短語、句柄 文法 分類 正則文法(3型) NFA、DFA、最小化 自上而下語法分析(推導…

【軟考高級系統架構論文】論微服務架構及其應用

論文真題 論微服務架構及其應用近年來,隨著互聯網行業的迅猛發展,公司或組織業務的不斷擴張,需求的快速變化以及用戶量的不斷增加,傳統的單塊(Monolithic) 軟件架構面臨著越來越多的挑戰,已逐漸無法適應互聯網時代對軟件的要求。在這一背景下,微服務架構模式(Microservi…

【人工智能】RAG分塊

在RAG(檢索增強生成)系統中,文檔分塊(Chunking)是決定系統性能的核心環節,直接影響檢索精度和生成質量。分塊需平衡語義完整性、檢索效率和上下文保留三大目標。 一、分塊的核心標準 1.1 分塊基礎知識? …

能耗管理新革命:物聯網實現能源高效利用

在全球能源危機與 “雙碳” 目標的雙重壓力下,企業與社會對能耗管理的重視程度達到前所未有的高度。然而,傳統能耗管理方式存在數據采集滯后、分析維度單一、節能措施粗放等問題,無法滿足精細化管理需求。物聯網技術憑借其強大的數據感知、傳…