哈囉,大家好!經過前面二十多天的努力,我們的個人財務管理系統已經完成了主要的功能開發。
在最後的幾天裡,我想和大家一起來優化我們的系統,讓它不僅能夠運行,還能夠更加穩定、安全、易於維護。
今天,我們將從三個面向進行優化:
在開發過程中,我們使用 Docker 來建立一個一致且易於管理的開發環境。然而,將應用程式部署到生產環境時,考量的因素會更多,例如:
在生產環境中,我們需要對 Docker Compose 進行一些調整:
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile.prod
env_file:
- .env.prod
depends_on:
- db
networks:
- app-network
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
env_file:
- .env.prod
networks:
- app-network
nginx:
image: nginx:stable
ports:
- '80:80'
- '443:443'
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- app
networks:
- app-network
networks:
app-network:
volumes:
db_data:
使用 CI/CD 工具(如 Jenkins、GitLab CI、GitHub Actions),自動化部署流程:
在之前的開發中,我們已經實作了基本的身份驗證功能。但在實際的應用中,還需要考慮更細緻的權限控制。
// 檢查使用者是否有權限
if ($user->hasPermission('edit_transaction')) {
// 執行編輯操作
} else {
// 回傳權限不足的錯誤訊息
}
為了方便日後的維護和問題排查,我們需要對關鍵操作進行日誌記錄。
// 在控制器中
use Illuminate\Support\Facades\Log;
public function destroy($id)
{
$transaction = Transaction::findOrFail($id);
$transaction->delete();
// 這裡用Laravel 內建的Loggin方法當表示範例
Log::info('User ' . auth()->id() . ' deleted transaction ' . $id);
return response()->json(null, 204);
}
隨著功能的增加,程式碼可能變得複雜且難以維護。我們需要進行重構,提升程式碼的可讀性和可維護性。
將業務邏輯從控制器中抽離,放入專門的服務類別中。
// app/Services/TransactionService.php
namespace App\Services;
class TransactionService
{
public function createTransaction($data)
{
// 處理業務邏輯
return Transaction::create($data);
}
}
// 在控制器中
use App\Services\TransactionService;
public function store(Request $request, TransactionService $transactionService)
{
$validatedData = $request->validate([...]);
$transaction = $transactionService->createTransaction($validatedData);
return response()->json($transaction, 201);
}
將資料驗證移到表單請求類別中,保持控制器的簡潔。
// app/Http/Requests/StoreTransactionRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreTransactionRequest extends FormRequest
{
public function rules()
{
return [
'amount' => 'required|numeric',
// 其他驗證規則
];
}
}
// 在控制器中
public function store(StoreTransactionRequest $request, TransactionService $transactionService)
{
$transaction = $transactionService->createTransaction($request->validated());
return response()->json($transaction, 201);
}
為了提高前端程式碼的可維護性和重用性,我們需要將重複的部分抽取為可複用的元件。
例如,交易紀錄、新增/編輯銀行帳戶等表單有許多相似的部分,我們可以建立通用的表單元件。
<!-- components/TransactionForm.vue -->
<template>
<form @submit.prevent="handleSubmit">
<!-- 表單欄位 -->
</form>
</template>
<script setup>
defineProps(['transaction'])
const emit = defineEmits(['submit'])
function handleSubmit() {
// 驗證和提交資料
emit('submit', formData)
}
</script>
<!-- pages/transactions/create.vue -->
<template>
<TransactionForm @submit="createTransaction" />
</template>
<script setup>
import TransactionForm from '~/components/TransactionForm.vue'
import { useRouter } from 'vue-router'
const router = useRouter()
function createTransaction(data) {
// 呼叫 API 建立交易
$fetch('/api/transactions', { method: 'POST', body: data })
.then(() => router.push('/transactions'))
}
</script>
每個頁面都需要從後端取得資料,我們可以使用 composables 來統一管理資料的取得。
// composables/useTransactions.js
export function useTransactions() {
const transactions = ref([])
const error = ref(null)
async function fetchTransactions() {
try {
transactions.value = await $fetch('/api/transactions')
} catch (e) {
error.value = e
}
}
return { transactions, error, fetchTransactions }
}
<script setup>
import { useTransactions } from '~/composables/useTransactions'
const { transactions, error, fetchTransactions } = useTransactions()
onMounted(() => {
fetchTransactions()
})
</script>
為了在不同的元件和頁面之間共享狀態,我們可以使用 Pinia。
// stores/transactionStore.js
import { defineStore } from 'pinia'
export const useTransactionStore = defineStore('transaction', {
state: () => ({
transactions: [],
}),
actions: {
async fetchTransactions() {
this.transactions = await $fetch('/api/transactions')
},
},
})
<script setup>
import { useTransactionStore } from '~/stores/transactionStore'
const transactionStore = useTransactionStore()
onMounted(() => {
transactionStore.fetchTransactions()
})
</script>
今天,我們從系統環境、後端重構和前端優化三個面向,探討了如何進一步提升我們的個人財務管理系統。
在獨自開發的過程中,時間和精力往往有限,但我們仍然需要兼顧系統的品質和結構。
希望透過今天的分享,能夠幫助大家在開發中找到效率與品質的平衡點。
接下來的日子裡,我們可以繼續優化我們的系統,加入更多實用的功能,並進一步提升使用者體驗。
讓我們繼續努力,打造出一個更加完善的應用程式!
感謝你的閱讀,如果你有任何問題或建議,歡迎在下方留言討論。我們下次見!