D20 - 實作銀行帳戶管理:建立銀行帳戶列表與新增/編輯頁面

更新於 發佈於 閱讀時間約 25 分鐘

哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。

現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。

透過這次的實作,我們將學習如何在 Nuxt 中建立頁面、與後端 API 互動,以及實作表單驗證等功能。


讓我們一起讓應用程式更加完整吧!


一、建立銀行帳戶列表頁面

首先,我們要建立銀行帳戶列表頁面,讓使用者可以查看和管理他們的銀行帳戶。

1. 建立頁面檔案

在 pages/ 目錄下建立 bank-accounts.vue 檔案。

touch pages/bank-accounts.vue

2. 編寫頁面結構

在 bank-accounts.vue 中,我們先建立基本的頁面結構。

<template>
<div>
<h2 class="text-2xl font-bold mb-4">銀行帳戶管理</h2>
<div v-if="error" class="text-red-500">
{{ error }}
</div>
<div v-else>
<button @click="goToAddAccount" class="bg-blue-600 text-white px-4 py-2 mb-4">
新增銀行帳戶
</button>
<table class="w-full text-left">
<thead>
<tr>
<th class="border px-4 py-2">帳戶名稱</th>
<th class="border px-4 py-2">銀行名稱</th>
<th class="border px-4 py-2">帳戶餘額</th>
<th class="border px-4 py-2">操作</th>
</tr>
</thead>
<tbody>
<tr v-for="account in bankAccounts" :key="account.id">
<td class="border px-4 py-2">{{ account.account_name }}</td>
<td class="border px-4 py-2">{{ account.bank_name }}</td>
<td class="border px-4 py-2">{{ account.balance }}</td>
<td class="border px-4 py-2">
<button @click="goToEditAccount(account.id)" class="text-blue-600 mr-2">
編輯
</button>
<button @click="deleteAccount(account.id)" class="text-red-600">
刪除
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>

<script>
export default {
middleware: 'auth',
data() {
return {
bankAccounts: [],
error: null,
}
},
async mounted() {
try {
const response = await this.$axios.get('/api/bank-accounts')
if (response.data.status === 'success') {
this.bankAccounts = response.data.data
} else {
this.error = response.data.message || '無法獲取銀行帳戶資料。'
}
} catch (error) {
this.error = '伺服器發生錯誤,請稍後再試。'
console.error('Error fetching bank accounts:', error)
}
},
methods: {
goToAddAccount() {
this.$router.push('/bank-accounts/add')
},
goToEditAccount(id) {
this.$router.push(`/bank-accounts/edit/${id}`)
},
async deleteAccount(id) {
if (confirm('確定要刪除這個銀行帳戶嗎?')) {
try {
await this.$axios.delete(`/api/bank-accounts/${id}`)
this.bankAccounts = this.bankAccounts.filter(account => account.id !== id)
} catch (error) {
alert('刪除失敗,請稍後再試。')
console.error('Error deleting bank account:', error)
}
}
},
},
}
</script>

<style scoped>
/* 頁面專屬的樣式 */
</style>

3. 說明

  • 資料取得:在 mounted 生命週期鉤子中,我們向後端 API 請求銀行帳戶列表,並將資料存入 bankAccounts。
  • 新增帳戶:點擊「新增銀行帳戶」按鈕,會導向新增帳戶的頁面。
  • 編輯帳戶:在帳戶列表中,點擊「編輯」按鈕,會導向編輯該帳戶的頁面。
  • 刪除帳戶:點擊「刪除」按鈕,會先彈出確認對話框,確認後發送刪除請求,並從列表中移除該帳戶。

4. 處理權限保護

  • 我們使用了 middleware: 'auth',確保只有已登入的使用者才能訪問此頁面。

二、建立新增/編輯銀行帳戶頁面

接下來,我們需要建立一個頁面,讓使用者可以新增或編輯銀行帳戶。我們可以使用同一個頁面,根據路由參數來判斷是新增還是編輯。

1. 建立頁面檔案

在 pages/bank-accounts/ 目錄下建立 _form.vue 檔案。

mkdir -p pages/bank-accounts
touch pages/bank-accounts/add.vue
touch pages/bank-accounts/edit.vue
touch pages/bank-accounts/_form.vue

2. 編寫 _form.vue 元件

我們先在 _form.vue 中建立表單元件,供新增和編輯頁面使用。

<template>
<div>
<h2 class="text-2xl font-bold mb-4">{{ isEdit ? '編輯銀行帳戶' : '新增銀行帳戶' }}</h2>
<form @submit.prevent="submitForm">
<div class="mb-4">
<label class="block">帳戶名稱</label>
<input v-model="form.account_name" type="text" class="border p-2 w-full" required />
<p v-if="errors.account_name" class="text-red-500">{{ errors.account_name }}</p>
</div>
<div class="mb-4">
<label class="block">銀行名稱</label>
<input v-model="form.bank_name" type="text" class="border p-2 w-full" />
<p v-if="errors.bank_name" class="text-red-500">{{ errors.bank_name }}</p>
</div>
<div class="mb-4">
<label class="block">帳號</label>
<input v-model="form.account_number" type="text" class="border p-2 w-full" />
<p v-if="errors.account_number" class="text-red-500">{{ errors.account_number }}</p>
</div>
<div class="mb-4">
<label class="block">帳戶餘額</label>
<input v-model="form.balance" type="number" step="0.01" class="border p-2 w-full" required />
<p v-if="errors.balance" class="text-red-500">{{ errors.balance }}</p>
</div>
<div v-if="error" class="text-red-500 mb-4">
{{ error }}
</div>
<button type="submit" class="bg-blue-600 text-white px-4 py-2">
{{ isEdit ? '更新' : '新增' }}
</button>
</form>
</div>
</template>

<script>
export default {
props: {
isEdit: {
type: Boolean,
default: false,
},
accountId: {
type: Number,
default: null,
},
},
data() {
return {
form: {
account_name: '',
bank_name: '',
account_number: '',
balance: 0,
},
errors: {},
error: null,
}
},
async mounted() {
if (this.isEdit && this.accountId) {
try {
const response = await this.$axios.get(`/api/bank-accounts/${this.accountId}`)
if (response.data.status === 'success') {
this.form = response.data.data
} else {
this.error = response.data.message || '無法獲取帳戶資料。'
}
} catch (error) {
this.error = '伺服器發生錯誤,請稍後再試。'
console.error('Error fetching bank account:', error)
}
}
},
methods: {
async submitForm() {
this.errors = {}
this.error = null
try {
if (this.isEdit) {
await this.$axios.put(`/api/bank-accounts/${this.accountId}`, this.form)
} else {
await this.$axios.post('/api/bank-accounts', this.form)
}
this.$router.push('/bank-accounts')
} catch (error) {
if (error.response && error.response.status === 422) {
this.errors = error.response.data.errors
} else {
this.error = '提交失敗,請稍後再試。'
}
console.error('Error submitting bank account form:', error)
}
},
},
}
</script>

<style scoped>
/* 元件專屬的樣式 */
</style>

3. 編寫新增與編輯頁面

新增頁面 add.vue

<template>
<FormComponent />
</template>

<script>
import FormComponent from './_form.vue'

export default {
middleware: 'auth',
components: {
FormComponent,
},
}
</script>

<style scoped>
/* 頁面專屬的樣式 */
</style>

編輯頁面 edit.vue

<template>
<FormComponent :isEdit="true" :accountId="accountId" />
</template>

<script>
import FormComponent from './_form.vue'

export default {
middleware: 'auth',
components: {
FormComponent,
},
computed: {
accountId() {
return parseInt(this.$route.params.id)
},
},
}
</script>

<style scoped>
/* 頁面專屬的樣式 */
</style>

4. 設定路由

由於我們使用了動態路由參數,需要在 pages/bank-accounts/ 目錄下調整檔案結構。

調整檔案結構

  • 將 edit.vue 更名為 _id.vue。
mv pages/bank-accounts/edit.vue pages/bank-accounts/_id.vue

更新 _id.vue

<template>
<FormComponent :isEdit="true" :accountId="accountId" />
</template>

<script>
import FormComponent from './_form.vue'

export default {
middleware: 'auth',
components: {
FormComponent,
},
computed: {
accountId() {
return parseInt(this.$route.params.id)
},
},
}
</script>

<style scoped>
/* 頁面專屬的樣式 */
</style>

5. 說明

  • 共用表單元件:我們將新增和編輯的表單抽取為 _form.vue,以便重用。
  • 動態路由:使用 _id.vue 來處理帶有 id 參數的路由,方便取得要編輯的帳戶資料。
  • 資料驗證與錯誤處理:在提交表單時,處理後端回傳的驗證錯誤,並顯示在對應的欄位下方。

三、更新導航列

為了方便使用者訪問銀行帳戶管理頁面,我們需要在導航列中添加對應的連結。

1. 更新 components/Header.vue

<template>
<header class="bg-blue-600 text-white p-4">
<nav class="container mx-auto flex justify-between">
<h1 class="text-xl font-bold">
<NuxtLink to="/">財務管理系統</NuxtLink>
</h1>
<ul class="flex space-x-4 items-center">
<li><NuxtLink to="/transactions">交易紀錄</NuxtLink></li>
<li><NuxtLink to="/bank-accounts">銀行帳戶</NuxtLink></li>
<li><NuxtLink to="/categories">分類管理</NuxtLink></li>
<li><NuxtLink to="/reports">報表</NuxtLink></li>
<li v-if="$store.getters['auth/isAuthenticated']">
<div class="relative" @click="toggleMenu">
<span>{{ $store.state.auth.user.username }}</span>
<div v-if="showMenu" class="absolute right-0 mt-2 bg-white text-black p-2">
<NuxtLink to="/profile">個人資料</NuxtLink>
<a href="#" @click.prevent="logout">登出</a>
</div>
</div>
</li>
<li v-else>
<NuxtLink to="/login">登入</NuxtLink>
</li>
</ul>
</nav>
</header>
</template>

<script>
export default {
data() {
return {
showMenu: false,
}
},
methods: {
toggleMenu() {
this.showMenu = !this.showMenu
},
logout() {
this.$store.commit('auth/clearToken')
this.$router.push('/login')
},
},
}
</script>

<style scoped>
/* Header 專屬的樣式 */
</style>

2. 說明

  • 導航連結:添加了「銀行帳戶」的連結,方便使用者訪問銀行帳戶管理頁面。
  • 使用者選單:當使用者已登入時,顯示使用者名稱,點擊可展開下拉選單,包含「個人資料」和「登出」等選項。

四、測試與驗證

現在,我們已經完成了銀行帳戶列表頁面和新增/編輯頁面的開發。讓我們進行測試,確保功能正常運作。

1. 測試銀行帳戶列表頁面

  • 登入應用程式,點擊導航列中的「銀行帳戶」連結。
  • 應該看到銀行帳戶列表,如果尚無帳戶,列表為空。
  • 確認「新增銀行帳戶」按鈕可以正常使用。

2. 測試新增銀行帳戶

  • 點擊「新增銀行帳戶」按鈕,進入新增頁面。
  • 填寫表單,例如:
    • 帳戶名稱:薪資帳戶
    • 銀行名稱:台灣銀行
    • 帳號:12345678
    • 帳戶餘額:10000
  • 提交表單,應該返回銀行帳戶列表,並顯示新添加的帳戶。

3. 測試編輯銀行帳戶

  • 在銀行帳戶列表中,點擊某個帳戶的「編輯」按鈕。
  • 應該進入編輯頁面,表單中已填入該帳戶的資料。
  • 修改某些資訊,提交表單,確認列表中的資料已更新。

4. 測試刪除銀行帳戶

  • 在銀行帳戶列表中,點擊某個帳戶的「刪除」按鈕。
  • 應該彈出確認對話框,確認後該帳戶從列表中移除。

5. 測試權限保護

  • 登出應用程式,嘗試直接訪問 /bank-accounts,應該被重導向到登入頁面。

五、實作建議

  • 組件化開發:將可重用的部分抽取為元件,提升程式碼的可維護性和重用性。
  • 動態路由:善用動態路由和路由參數,實現更靈活的頁面。
  • 錯誤處理:處理好各種錯誤情況,提供清晰的錯誤訊息,提升使用者體驗。
  • 與後端協作:確保前後端對 API 的定義、回應格式、驗證規則等達成共識,避免不必要的問題。

小結

今天,我們成功地實作了銀行帳戶列表頁面以及新增/編輯頁面。透過這次的開發,我們學習了:

  • 如何在 Nuxt 中建立頁面和元件。
  • 如何與後端 API 進行互動,處理資料的取得和提交。
  • 如何處理表單驗證和錯誤訊息。
  • 如何使用動態路由和路由參數。
    希望這篇文章能夠對你有所幫助,讓我們一起繼續學習和進步,打造出更加完善的應用程式!感謝你的閱讀,如果你有任何問題或建議,歡迎在下方留言討論。我們下次見!
留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
27會員
87內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/11/04
哈囉,大家好!本文探討了 Nuxt 前端介面設計與規劃,為個人財務管理系統建立頁面清單及功能需求。從首頁、交易紀錄到報表頁面,每個頁面皆包含具體操作和資料顯示功能。透過重新盤點與規劃,提升開發效率、使用者體驗及協作效果,為後續開發奠定基礎。
Thumbnail
2024/11/04
哈囉,大家好!本文探討了 Nuxt 前端介面設計與規劃,為個人財務管理系統建立頁面清單及功能需求。從首頁、交易紀錄到報表頁面,每個頁面皆包含具體操作和資料顯示功能。透過重新盤點與規劃,提升開發效率、使用者體驗及協作效果,為後續開發奠定基礎。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
※ PayPal官方文件教學: 網址:https://developer.paypal.com/home/ 第一步:註冊帳號 第二步:註冊商業帳號 第三步:註冊成功 ※ PayPal REST APIs說明: 登入開發者平台:在Sandbox模式開發 網址:https://de
Thumbnail
※ PayPal官方文件教學: 網址:https://developer.paypal.com/home/ 第一步:註冊帳號 第二步:註冊商業帳號 第三步:註冊成功 ※ PayPal REST APIs說明: 登入開發者平台:在Sandbox模式開發 網址:https://de
Thumbnail
如何打造屬於你的專屬理財系統 不少人都希望擁有健康的財務狀況,但理財不是單靠記帳或存錢就能完成的。真正高效的理財,需要一套專屬的系統來管理和優化你的財務。不論是月薪族、自由工作者,還是學生,只要掌握了這幾個步驟,都能打造屬於自己的理財系統,讓金錢為你服務! 1. 記帳:理財的起點 如果
Thumbnail
如何打造屬於你的專屬理財系統 不少人都希望擁有健康的財務狀況,但理財不是單靠記帳或存錢就能完成的。真正高效的理財,需要一套專屬的系統來管理和優化你的財務。不論是月薪族、自由工作者,還是學生,只要掌握了這幾個步驟,都能打造屬於自己的理財系統,讓金錢為你服務! 1. 記帳:理財的起點 如果
Thumbnail
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
Thumbnail
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
Thumbnail
前篇提要,介面功能主要會被分以下三個區塊介紹: 1. 左側設定區 (Part I) 2. 中間及右側預算設定區(Part II) 3. 帳戶內錢錢進出記錄功能 (Part III) 上一篇已經介紹過左側設定區 (Part I),此篇要介紹中間及右側預算設定區。
Thumbnail
前篇提要,介面功能主要會被分以下三個區塊介紹: 1. 左側設定區 (Part I) 2. 中間及右側預算設定區(Part II) 3. 帳戶內錢錢進出記錄功能 (Part III) 上一篇已經介紹過左側設定區 (Part I),此篇要介紹中間及右側預算設定區。
Thumbnail
你已經註冊YNAB帳號了嗎? 還沒的話,可以先看這篇➡️開始你的YNAB體驗: 34天免費 我會將介面功能一一介紹,主要會分三個區塊,因內容多也會分別在三篇文章中闡述: 1. 左側設定區 (Part I) 2. 中間及右側預算設定區(Part II) 3. 帳戶內錢錢進出記錄功能 (Part I
Thumbnail
你已經註冊YNAB帳號了嗎? 還沒的話,可以先看這篇➡️開始你的YNAB體驗: 34天免費 我會將介面功能一一介紹,主要會分三個區塊,因內容多也會分別在三篇文章中闡述: 1. 左側設定區 (Part I) 2. 中間及右側預算設定區(Part II) 3. 帳戶內錢錢進出記錄功能 (Part I
Thumbnail
本文主要介紹以下的會計知識: 1.編製銀行調節表的材料。 2.編製銀行調節表的步驟。 3.銀行對帳單內容介紹。 4.銀行調節表編製釋例。
Thumbnail
本文主要介紹以下的會計知識: 1.編製銀行調節表的材料。 2.編製銀行調節表的步驟。 3.銀行對帳單內容介紹。 4.銀行調節表編製釋例。
Thumbnail
寫在前面:如果您是透過會計系統產生申報媒體檔案的,可以跳過這一篇,直接進行:A.7網路申報上傳 上一篇有提到,各類所得申報的最基本的資料內容,需要包含: 1.申報單位資料 2.單位內的所得人(公司付錢的對象)資料 3.給付的所得項目(EX:薪資)、金額 點選進入後,我們可以看到資料建置畫面;
Thumbnail
寫在前面:如果您是透過會計系統產生申報媒體檔案的,可以跳過這一篇,直接進行:A.7網路申報上傳 上一篇有提到,各類所得申報的最基本的資料內容,需要包含: 1.申報單位資料 2.單位內的所得人(公司付錢的對象)資料 3.給付的所得項目(EX:薪資)、金額 點選進入後,我們可以看到資料建置畫面;
Thumbnail
開戶囉! 老爸既然是投資理財的高手,那自己小孩的規劃更是不能放過,對於剛出生的新生兒,要辦證卷帳戶需要準備那些東西呢?原本以為很難@@沒想到一問之下這麼簡單! 就是準備這些東西而已: 父母雙證件正本,小孩件健保卡正本(要拍照) 父母雙證件正反影本,小孩健保卡影本 父母印章,小孩印章
Thumbnail
開戶囉! 老爸既然是投資理財的高手,那自己小孩的規劃更是不能放過,對於剛出生的新生兒,要辦證卷帳戶需要準備那些東西呢?原本以為很難@@沒想到一問之下這麼簡單! 就是準備這些東西而已: 父母雙證件正本,小孩件健保卡正本(要拍照) 父母雙證件正反影本,小孩健保卡影本 父母印章,小孩印章
Thumbnail
RICH記帳 | 新手理財 | 每天豐盛 | 功能速覽 主要功能相關簡介
Thumbnail
RICH記帳 | 新手理財 | 每天豐盛 | 功能速覽 主要功能相關簡介
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News