快速開發實踐

基于后端項目的前端開發實踐記錄

📋 項目概述

項目名稱: 比特奧定制報表系統
技術棧: Vue 3 + Element Plus + Vite (前端) + Spring Boot (后端)
開發模式: 前后端分離
項目結構: 單體倉庫包含前后端代碼

🏗? 項目架構分析

目錄結構設計

bitao-defined_report_ui/
├── src/                    # 前端源碼
│   ├── api/               # API接口層
│   ├── components/        # 組件庫
│   │   ├── dict/         # 字典管理組件
│   │   ├── report/       # 報表管理組件
│   │   └── layout/       # 布局組件
│   ├── router/           # 路由配置
│   └── utils/            # 工具函數
├── backend/               # 后端源碼
│   └── bitao-defined-report/
└── public/               # 靜態資源

技術選型理由

  1. Vue 3: 組合式API,更好的TypeScript支持
  2. Element Plus: 成熟的UI組件庫,快速開發
  3. Vite: 快速的構建工具,熱更新體驗好
  4. Axios: HTTP客戶端,支持攔截器和請求/響應處理

🔄 前后端協作流程

1. API設計先行

后端API規范
// 統一響應格式
public class ApiResponse<T> {private String traceId;     // 追蹤IDprivate boolean result;     // 操作結果private int code;          // 狀態碼private String msg;        // 消息private T data;           // 數據private boolean success;   // 成功標識
}// 分頁參數基類
public class PageObject {private Integer pageNum = 1;private Integer pageSize = 10;private String isAsc = "desc";
}
前端API封裝
// api/reportApi.js
import request from '@/utils/request'/*** 獲取報表列表* @param {Object} params 查詢參數* @returns {Promise} API響應*/
export function getReportList(params) {return request({url: '/defined-report/report/selectByPage',method: 'post',data: params})
}

2. 數據類型對齊

關鍵經驗:類型一致性
場景后端類型前端處理注意事項
布爾狀態Booleannull/true/false避免空字符串
分頁參數IntegerNumber確保數值類型
時間字段LocalDateTimeString統一格式化
枚舉值EnumString/Number保持值一致
實際案例:狀態字段處理
// ? 錯誤做法
const queryParams = {usableStatus: ''  // 空字符串無法轉換為Boolean
}// ? 正確做法
const queryParams = {usableStatus: null  // null表示不篩選,true/false表示具體狀態
}

🎨 組件開發模式

1. 頁面組件結構

標準頁面模板
<template><div class="page-container"><!-- 查詢表單 --><div class="search-form"><el-form :model="queryParams" :inline="true"><!-- 查詢條件 --></el-form></div><!-- 操作工具欄 --><div class="toolbar"><el-button type="primary" @click="handleAdd">新增</el-button></div><!-- 數據表格 --><el-table :data="dataList" v-loading="loading"><!-- 表格列 --></el-table><!-- 分頁組件 --><pagination v-model:page="queryParams.pageNum"v-model:limit="queryParams.pageSize":total="total"@pagination="getList"/></div>
</template><script setup>
import { reactive, ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'// 響應式數據
const loading = ref(false)
const dataList = ref([])
const total = ref(0)// 查詢參數
const queryParams = reactive({pageNum: 1,pageSize: 10,// 其他查詢字段
})// 獲取列表數據
const getList = async () => {loading.value = truetry {const response = await apiMethod(queryParams)if (response.code === 200) {dataList.value = response.data.data || []total.value = response.data.total || 0} else {ElMessage.error(response.message || '獲取數據失敗')}} catch (error) {console.error('獲取數據失敗:', error)ElMessage.error('網絡錯誤,請稍后重試')} finally {loading.value = false}
}// 頁面初始化
onMounted(() => {getList()
})
</script>

2. 組件復用策略

通用組件抽取
// components/pub/Pagination.vue - 分頁組件
// components/layout/AppHeader.vue - 頁面頭部
// components/layout/Sidebar.vue - 側邊欄
業務組件分類
// components/dict/ - 字典管理相關組件
// components/report/ - 報表管理相關組件
//   ├── management/ - 報表列表管理
//   ├── designer/ - 報表設計器
//   └── preview/ - 報表預覽

🔧 開發工具配置

1. Vite配置優化

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'export default defineConfig({plugins: [vue()],resolve: {alias: {'@': path.resolve(__dirname, 'src')}},server: {port: 3000,proxy: {'/defined-report': {target: 'http://localhost:8080',changeOrigin: true}}}
})

2. 請求攔截器配置

// utils/request.js
import axios from 'axios'
import { ElMessage } from 'element-plus'const service = axios.create({baseURL: process.env.VUE_APP_BASE_API,timeout: 5000
})// 請求攔截器
service.interceptors.request.use(config => {// 添加token等通用處理return config},error => {console.log(error)return Promise.reject(error)}
)// 響應攔截器
service.interceptors.response.use(response => {const res = response.data// 統一錯誤處理if (res.code !== 200) {ElMessage.error(res.message || '系統錯誤')return Promise.reject(new Error(res.message || 'Error'))}return res},error => {console.log('err' + error)ElMessage.error(error.message)return Promise.reject(error)}
)export default service

🐛 常見問題與解決方案

1. 分頁查詢問題

問題描述

前端發送分頁請求時,后端返回"系統繁忙"錯誤

根本原因
  1. 參數類型不匹配(字符串 vs 布爾值)
  2. 缺少默認分頁參數
解決方案
// 前端:確保參數類型正確
const queryParams = reactive({pageNum: 1,           // Number類型pageSize: 10,         // Number類型usableStatus: null    // null/Boolean類型
})
// 后端:添加默認構造函數
public ReportFormsPageParam() {super();this.setPageNum(1);this.setPageSize(10);this.setIsAsc("desc");
}

2. 狀態管理最佳實踐

組件內狀態
// 使用 reactive 管理表單數據
const formData = reactive({name: '',status: null
})// 使用 ref 管理簡單狀態
const loading = ref(false)
const visible = ref(false)
跨組件狀態
// 使用 provide/inject
// 父組件
provide('userInfo', userInfo)// 子組件
const userInfo = inject('userInfo')

📊 性能優化實踐

1. 組件懶加載

// router/index.js
const routes = [{path: '/report/list',component: () => import('@/components/report/management/ReportList.vue')}
]

2. 表格虛擬滾動

<!-- 大數據量表格優化 -->
<el-table-v2:columns="columns":data="data":width="700":height="400"fixed
/>

3. 請求防抖

import { debounce } from 'lodash-es'// 搜索防抖
const handleSearch = debounce(() => {getList()
}, 300)

🔍 調試與測試

1. 開發調試

// 開發環境日志
if (process.env.NODE_ENV === 'development') {console.log('API請求參數:', params)console.log('API響應數據:', response)
}

2. API測試

# 使用PowerShell測試API
Invoke-WebRequest -Uri 'http://localhost:3000/defined-report/report/selectByPage' `-Method POST `-ContentType 'application/json' `-Body '{"pageNum": 1, "pageSize": 10}'

📝 開發規范

1. 命名規范

  • 文件命名: PascalCase (ReportList.vue)
  • 組件名: PascalCase (ReportList)
  • 方法名: camelCase (handleQuery)
  • 常量名: UPPER_SNAKE_CASE (API_BASE_URL)

2. 代碼注釋

/*** 獲取報表列表數據* @param {Object} params 查詢參數* @param {Number} params.pageNum 頁碼* @param {Number} params.pageSize 每頁大小* @returns {Promise<Object>} 返回報表列表數據*/
const getReportList = async (params) => {// 實現邏輯
}

3. 錯誤處理

try {const response = await apiCall()// 成功處理
} catch (error) {console.error('操作失敗:', error)ElMessage.error('操作失敗,請稍后重試')// 錯誤恢復邏輯
}

🚀 部署與發布

1. 構建配置

// package.json
{"scripts": {"dev": "vite","build": "vite build","preview": "vite preview"}
}

2. 環境配置

// .env.development
VUE_APP_BASE_API = '/api'
VUE_APP_ENV = 'development'// .env.production
VUE_APP_BASE_API = 'https://api.example.com'
VUE_APP_ENV = 'production'

📈 項目總結

成功經驗

  1. 前后端類型對齊: 避免了大量的類型轉換問題
  2. 組件化開發: 提高了代碼復用性和維護性
  3. 統一錯誤處理: 提升了用戶體驗
  4. API層抽象: 便于接口管理和維護

改進建議

  1. 引入TypeScript: 提供更好的類型安全
  2. 添加單元測試: 保證代碼質量
  3. 性能監控: 添加性能指標收集
  4. 文檔完善: 建立完整的組件文檔

技術債務

  1. 部分組件耦合度較高,需要進一步解耦
  2. 缺少統一的狀態管理方案
  3. 錯誤邊界處理不夠完善
  4. 缺少自動化測試覆蓋

🎯 最佳實踐總結

  1. API優先設計: 前后端并行開發的基礎
  2. 類型一致性: 減少運行時錯誤的關鍵
  3. 組件化思維: 提高開發效率的核心
  4. 錯誤處理: 用戶體驗的重要保障
  5. 性能意識: 從開發階段就要考慮性能優化
  6. 文檔驅動: 良好的文檔是團隊協作的基礎

通過這個項目的實踐,我們建立了一套完整的前端開發流程和規范,為后續項目提供了寶貴的經驗和參考。

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

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

相關文章

NFC 三大模式對比

以前以為nfc只是點對點通訊&#xff0c;沒想到現在nfc的功能很強大NFC 三大模式對比&#xff08;回顧&#xff09;模式作用手機是...Reader 模式讀取卡、標簽內容主動設備&#xff08;讀卡器&#xff09;Card Emulation 模式模擬公交卡/門禁卡/銀行卡被動設備&#xff08;卡&am…

JSON、JSONObject、JSONArray詳細介紹及其應用方式

第一部分&#xff1a;什么是JSON?&#x1f31f;比喻&#xff1a;JSON 是「快遞公司統一的 “通用快遞單”」&#x1f4a1;場景代入你想給朋友寄生日禮物&#xff08;比如一臺 “游戲機”&#xff09;&#xff0c;這臺游戲機有自己的屬性&#xff1a;名稱&#xff1a;"游戲…

Linux系統編程--權限管理

權限管理第二講 權限管理1. Shell命令以及運行原理1.1 知識引入1.2 概念介紹1.3 具體示例2. Linux權限問題2.1 權限概念2.2 用戶分類2.3 切換用戶2.4 用戶提權2.5 文件權限管理2.5.1 文件訪問者的分類&#xff08;角色&#xff09;2.5.2 文件類型和訪問權限&#xff08;事物屬性…

【智能硬件】X86和ARM架構的區別

詳細解釋X86架構和ARM架構之間的區別以及它們各自的特點。X86 架構定義與歷史定義&#xff1a;X86是一種計算機處理器體系結構&#xff0c;最初由英特爾公司開發。它是一系列指令集的集合體。歷史&#xff1a;最早的X86架構是Intel 8086處理器&#xff0c;在1978年發布。后續發…

玳瑁的嵌入式日記D13-0806(C語言)

指針1.指針指針 就是地址(地址就是內存單元的編號)指針變量 (結合語境) eg&#xff1a;定義一個指針指針這一類數據 --- 數據類型 --- 指針類型 (1).指針 是什么 (2).指針類型 int a; //int數據類型 a是int型變量 //a的空間 想來存儲 整型數據 2.指針的定義 基類型 * 指針變量名…

密碼學基礎知識總結

密碼學基礎知識總結 一、Base編碼 1. Base系列特征 編碼類型字符集特征Base160-9, A-F密文長度偶數Base32A-Z, 2-7包含數字2-7Base64a-z,0-9,,/,密文長度是8的倍數Base36A-Z,0-9僅支持整數加密Base910-9,a-z,A-Z,特殊符號高密度編碼Base100Emoji表情表情符號組成 2. 典型題型…

PostgreSQL 中 pg_wal文件過多過大的清理方法及關鍵注意事項的總結

PostgreSQL 中 pg_wal文件過多過大的清理方法及關鍵注意事項的總結 以下是針對 PostgreSQL 中 pg_wal 文件過多過大的清理方法及關鍵注意事項的總結 一、安全清理 WAL 文件的完整流程 1. 確認數據庫和備份完整性 備份驗證&#xff1a;確保最近的物理備份&#xff08;如 pg_base…

Django事務支持

1.事務概念 事務是一組不可分割的操作序列&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行。事務具有四個關鍵屬性&#xff0c;通常稱為 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務是一個不可分割的工作單位&#xff0c;事務…

<form> + <iframe> 方式下載大文件的機制

使用 <form> <iframe> 方式下載大文件的機制之所以穩定&#xff0c;核心在于其?分塊傳輸?和?瀏覽器沙箱隔離?設計。以下是技術原理詳解&#xff1a; 一、底層工作機制 ?分塊傳輸協議? 表單提交后&#xff0c;服務器按 Transfer-Encoding: chunked 分塊返回數…

Python--OCR(2)

一、明確 OCR 任務邊界首先定義 OCR 系統的核心目標&#xff1a;場景&#xff1a;印刷體&#xff08;如文檔、發票&#xff09;/ 手寫體&#xff08;如筆記&#xff09;/ 特定場景&#xff08;如車牌、身份證&#xff09;輸入&#xff1a;圖像格式&#xff08;JPG/PNG&#xff…

基于Django的計算機資源爬蟲及可視化系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、項目目標三、系統架構與技術選型四、系統功能模塊五、應用場景與價值六、項目特色與創新點七、總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試…

SH3001六軸傳感器應用(二)(IIC驅動開發)

一、前言我這邊使用的開發板原本已經做好了該sensor的驅動&#xff0c;但是使用過程中發現&#xff0c;原始驅動sensor是通過事件的方式上報的&#xff0c;加速度和陀螺儀數據并不同步&#xff0c;不滿足使用要求&#xff0c;只有重新寫一個iic的驅動&#xff0c;進行sensor數據…

面試題:基礎的sql命令

基礎的 SQL 命令主要用于對數據庫進行查詢、新增、修改、刪除等操作&#xff0c;可分為以下幾類&#xff1a;一、數據查詢&#xff08;SELECT&#xff09;用于從表中獲取數據&#xff0c;是最常用的命令。 基本語法&#xff1a;SELECT 列名1, 列名2... FROM 表名 WHERE 條件;示…

Leetcode-3488距離最小相等元素查詢

依舊二分&#xff0c;鏈接如下3488. 距離最小相等元素查詢 看題目是個循環數組&#xff0c;記得當時做過一道什么題也是循環數組&#xff0c;就想著直接數組復制一下&#xff0c;然后跟上一道題一樣&#xff0c;用hashmap來存儲value的值以及value對應下標的vector。 和靈神的…

C++中的關聯容器

文章目錄使用關聯容器定義關聯容器關鍵字類型的要求pair類型用作返回類型關聯容器上的操作關聯容器的迭代器關聯容器和算法添加元素刪除元素map的下標操作訪問元素無序容器對關鍵字的要求關聯容器支持高效的關鍵字查找和訪問。兩個主要的關聯容器的類型是map和set。其中map中的…

【Git】git提交代碼報錯Git: husky > pre-commit

git提交代碼報錯原因 這個問題是因為當你在終端輸入git commit -m “XXX”,提交代碼的時候,pre-commit(客戶端)鉤子&#xff0c;它會在Git鍵入提交信息前運行做代碼風格檢查。如果代碼不符合相應規則&#xff0c;則報錯&#xff0c;而它的檢測規則就是根據.git/hooks/pre-commi…

Unity開發者快速認識Unreal 的C++(六)GameMode之PlayerController

繼承關系&#xff1a;Aactor&#xff0c;INavAgentInterface <--- AController<--- PlayerController &#xff0c;PlayerController也是一個Actor,繼承了Actor的一些通用的屬性和工具函數下圖是PlayerController初始化組件的一個子階段從圖中可以得到的信息是&#xf…

Vue 3 服務端渲染(SSR)與客戶端渲染(CSR)的區別及解決方案

1. SSR與CSR的區別1.1. SSR的原理服務端渲染&#xff08;SSR&#xff09;是在服務器端將 Vue 組件渲染為 HTML 字符串&#xff0c;并將其發送給客戶端。這種方式與客戶端渲染&#xff08;CSR&#xff09;不同&#xff0c;后者是在瀏覽器中執行 JavaScript 來生成 HTML。在 SSR …

Matlab快速回顧

一1.數值 顯示 格式format style 設置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作區cls3.搜索路徑設置path(path,E:\ads\)oraddpath4.M文件用戶把要實現的命令寫在一個以.m為擴展的文件中&#xff0c;然后由matlab系統進行解讀&#xff0c;最后運行結果…

開源低代碼+AI引擎:百特搭企業級開發平臺的演進

在數字化轉型進入深水區的今天&#xff0c;企業應用開發面臨前所未有的復雜挑戰&#xff1a;既要快速響應業務需求&#xff0c;又要確保系統靈活可控&#xff1b;既要降低技術門檻&#xff0c;又要保障核心安全。傳統開發模式與單一形態的低代碼工具已難以滿足多層次需求。融合…