iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
自我挑戰組

Java 程式設計與實作:30 天打造個人記帳系統系列 第 28 篇

月支出統計:看看一個月到底花了多少錢

  • 分享至 

  • xImage
  •  

昨天 Day 27 完成了「消費分析」,現在系統可以找出目前最高與最低的一筆支出。

例如:

最高支出:
2026-10-01|電影|300 元|娛樂
最低支出:
2026-09-30|捷運|30 元|交通

今天要繼續利用 Day 24 加入的 LocalDate,完成一個更實用的功能:

月支出統計。

假設系統裡已經累積好幾個月的資料:

2026-09-30|晚餐|180 元|飲食
2026-10-01|早餐|60 元|飲食
2026-10-01|捷運|30 元|交通
2026-10-02|午餐|150 元|飲食
2026-10-02|電影|300 元|娛樂

我希望可以輸入:

請輸入年份:2026
請輸入月份:10

然後得到:

===== 2026 年 10 月支出統計 =====
消費筆數:4 筆
飲食:210 元
交通:30 元
購物:0 元
娛樂:300 元
本月總支出:540 元

這樣就能知道一整個月到底花了多少錢。

今天要學 getYear() 和 getMonthValue()

每一筆 Expense 現在都有:

LocalDate date;

假設:

LocalDate date =
LocalDate.parse("2026-10-02");

可以使用:

date.getYear();

取得:

2026

也可以使用:

date.getMonthValue();

取得:

10

所以:

2026-10-02
↓
getYear()
↓
2026

以及:

2026-10-02
↓
getMonthValue()
↓
10

這樣我們就可以判斷某筆消費是不是指定月份的資料。

第一步:讓使用者輸入年份與月份

建立新的 Method:

public static void monthlyStatistics()

接著:

System.out.print(
"請輸入年份:"
);
int year =
scanner.nextInt();
System.out.print(
"請輸入月份:"
);
int month =
scanner.nextInt();
scanner.nextLine();

假設輸入:

請輸入年份:2026
請輸入月份:10

現在:

year = 2026
month = 10

第二步:檢查每一筆 Expense

使用之前很熟悉的 for:

for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
}

接著取得日期:

expense.getDate()

假設:

2026-10-02

就可以:

expense.getDate().getYear()

得到:

2026

以及:

expense.getDate().getMonthValue()

得到:

10

第三步:同時比較年份和月份

今天會再次用到:

&&

判斷:

if (
expense.getDate().getYear() == year
&&
expense.getDate().getMonthValue() == month
)

意思就是:

年份一樣嗎?
AND
月份也一樣嗎?
↓
兩個都一樣
↓
這筆就是指定月份的消費

例如查詢:

2026 年 10 月

第一筆:

2026-10-02

判斷:

2026 == 2026 ✓
10 == 10 ✓
→ 符合

但是:

2026-09-30

判斷:

2026 == 2026 ✓
9 == 10 ✗
→ 不符合

所以不會被計算進 10 月。

第四步:計算本月總支出

先建立:

int total = 0;
int count = 0;

找到符合的資料:

total += expense.getAmount();
count++;

例如:

早餐 60
捷運 30
午餐 150
電影 300

計算:

60 + 30 + 150 + 300
= 540

所以:

本月總支出:540 元

第五步:順便統計每個分類

既然都已經找到這個月的資料,我也想知道錢主要花在哪裡。

建立:

int foodTotal = 0;
int transportTotal = 0;
int shoppingTotal = 0;
int entertainmentTotal = 0;

然後使用之前學過的 switch:

switch (expense.getCategory()) {
case "飲食":
foodTotal += expense.getAmount();
break;
case "交通":
transportTotal += expense.getAmount();
break;
case "購物":
shoppingTotal += expense.getAmount();
break;
case "娛樂":
entertainmentTotal += expense.getAmount();
break;
}

假設 10 月有:

早餐 60|飲食
捷運 30|交通
午餐 150|飲食
電影 300|娛樂

最後:

飲食:210 元
交通:30 元
購物:0 元
娛樂:300 元
總支出:540 元

完整 monthlyStatistics()

今天最重要的新 Method:

public static void monthlyStatistics() {
System.out.println();
System.out.println(
"===== 月支出統計 ====="
);
try {
System.out.print(
"請輸入年份:"
);
int year =
scanner.nextInt();
System.out.print(
"請輸入月份:"
);
int month =
scanner.nextInt();
scanner.nextLine();
if (month < 1 || month > 12) {
System.out.println(
"月份必須是 1~12。"
);
return;
}
int total = 0;
int count = 0;
int foodTotal = 0;
int transportTotal = 0;
int shoppingTotal = 0;
int entertainmentTotal = 0;
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
if (
expense.getDate().getYear()
== year
&&
expense.getDate()
.getMonthValue()
== month
) {
count++;
total +=
expense.getAmount();
switch (
expense.getCategory()
) {
case "飲食":
foodTotal +=
expense.getAmount();
break;
case "交通":
transportTotal +=
expense.getAmount();
break;
case "購物":
shoppingTotal +=
expense.getAmount();
break;
case "娛樂":
entertainmentTotal +=
expense.getAmount();
break;
}
}
}
System.out.println();
System.out.println(
"===== "
+ year
+ " 年 "
+ month
+ " 月支出統計 ====="
);
if (count == 0) {
System.out.println(
"這個月份沒有消費紀錄。"
);
return;
}
System.out.println();
System.out.println(
"消費筆數:"
+ count
+ " 筆"
);
System.out.println(
"飲食:"
+ foodTotal
+ " 元"
);
System.out.println(
"交通:"
+ transportTotal
+ " 元"
);
System.out.println(
"購物:"
+ shoppingTotal
+ " 元"
);
System.out.println(
"娛樂:"
+ entertainmentTotal
+ " 元"
);
System.out.println();
System.out.println(
"本月總支出:"
+ total
+ " 元"
);
} catch (InputMismatchException e) {
System.out.println(
"輸入錯誤,年份和月份必須輸入數字!"
);
scanner.nextLine();
}
}

今天多做一個月份檢查

使用者有可能輸入:

請輸入月份:15

但一年根本沒有第 15 月。

所以加入:

if (month < 1 || month > 12)

這裡使用的是:

||

它代表:

OR

所以:

month < 1 || month > 12

意思就是:

月份小於 1
OR
月份大於 12

只要其中一個條件成立,就是錯誤的月份。

之前學過:

&&

今天又用到:

||

可以這樣記:

&& → AND → 而且、兩個都要成立
|| → OR → 或者、其中一個成立即可

修改主選單

昨天:

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 設定預算
  8. 查看預算狀況
  9. 依日期查詢
  10. 關鍵字搜尋
  11. 消費分析
  12. 離開

今天加入:

  1. 月支出統計
  2. 離開

完整選單:

===== 個人記帳系統 =====

  1. 新增消費
  2. 查看紀錄
  3. 查看總支出
  4. 分類支出統計
  5. 刪除消費紀錄
  6. 修改消費紀錄
  7. 設定預算
  8. 查看預算狀況
  9. 依日期查詢
  10. 關鍵字搜尋
  11. 消費分析
  12. 月支出統計
  13. 離開

Switch 加入:

case 12:
monthlyStatistics();
break;
case 13:
running = false;
System.out.println(
"已離開個人記帳系統!"
);
break;

Day 28 完整程式

import java.util.Scanner;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDate;
class Expense {
private LocalDate date;
private String item;
private int amount;
private String category;
Expense(
LocalDate date,
String item,
int amount,
String category
) {
this.date = date;
this.item = item;
this.amount = amount;
this.category = category;
}
public LocalDate getDate() {
return date;
}
public String getItem() {
return item;
}
public int getAmount() {
return amount;
}
public String getCategory() {
return category;
}
public void setItem(String item) {
this.item = item;
}
public void setAmount(int amount) {
if (amount >= 0) {
this.amount = amount;
}
}
public void setCategory(String category) {
this.category = category;
}
}
public class Main {
static Scanner scanner =
new Scanner(System.in);
static ArrayList expenses =
new ArrayList<>();
static int budget = 0;
public static void main(String[] args) {
loadExpenses();
boolean running = true;
while (running) {
showMenu();
try {
System.out.print(
"請選擇功能:"
);
int choice =
scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
addExpense();
break;
case 2:
showExpenses();
break;
case 3:
calculateTotal();
break;
case 4:
categoryStatistics();
break;
case 5:
deleteExpense();
break;
case 6:
editExpense();
break;
case 7:
setBudget();
break;
case 8:
checkBudget();
break;
case 9:
searchByDate();
break;
case 10:
searchByKeyword();
break;
case 11:
analyzeExpenses();
break;
case 12:
monthlyStatistics();
break;
case 13:
running = false;
System.out.println(
"已離開個人記帳系統!"
);
break;
default:
System.out.println(
"沒有這個選項!"
);
}
} catch (InputMismatchException e) {
System.out.println(
"輸入錯誤,請輸入數字!"
);
scanner.nextLine();
}
}
scanner.close();
}
public static void showMenu() {
System.out.println();
System.out.println(
"===== 個人記帳系統 ====="
);
System.out.println("1. 新增消費");
System.out.println("2. 查看紀錄");
System.out.println("3. 查看總支出");
System.out.println("4. 分類支出統計");
System.out.println("5. 刪除消費紀錄");
System.out.println("6. 修改消費紀錄");
System.out.println("7. 設定預算");
System.out.println("8. 查看預算狀況");
System.out.println("9. 依日期查詢");
System.out.println("10. 關鍵字搜尋");
System.out.println("11. 消費分析");
System.out.println("12. 月支出統計");
System.out.println("13. 離開");
}
public static void addExpense() {
System.out.println();
System.out.println(
"===== 新增消費 ====="
);
LocalDate today =
LocalDate.now();
System.out.print(
"請輸入消費項目:"
);
String item =
scanner.nextLine();
System.out.print(
"請輸入消費金額:"
);
int amount =
scanner.nextInt();
String category =
chooseCategory();
Expense expense =
new Expense(
today,
item,
amount,
category
);
expenses.add(expense);
saveExpenses();
System.out.println(
"記帳成功!"
);
System.out.println(
"日期:" + today
);
}
public static String chooseCategory() {
System.out.println();
System.out.println(
"請選擇消費分類:"
);
System.out.println("1. 飲食");
System.out.println("2. 交通");
System.out.println("3. 購物");
System.out.println("4. 娛樂");
System.out.print(
"請輸入選項:"
);
int choice =
scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1:
return "飲食";
case 2:
return "交通";
case 3:
return "購物";
case 4:
return "娛樂";
default:
return "其他";
}
}
public static void showExpenses() {
System.out.println();
System.out.println(
"===== 消費紀錄 ====="
);
if (expenses.size() == 0) {
System.out.println(
"目前沒有消費紀錄。"
);
return;
}
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
System.out.println(
(i + 1)
+ ". "
+ expense.getDate()
+ "|"
+ expense.getItem()
+ "|"
+ expense.getAmount()
+ " 元|"
+ expense.getCategory()
);
}
}
public static void calculateTotal() {
int total = 0;
for (int i = 0;
i < expenses.size();
i++) {
total +=
expenses.get(i)
.getAmount();
}
System.out.println();
System.out.println(
"===== 支出統計 ====="
);
System.out.println(
"目前共有 "
+ expenses.size()
+ " 筆消費"
);
System.out.println(
"總支出:"
+ total
+ " 元"
);
}
public static void categoryStatistics() {
int foodTotal = 0;
int transportTotal = 0;
int shoppingTotal = 0;
int entertainmentTotal = 0;
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
switch (expense.getCategory()) {
case "飲食":
foodTotal += expense.getAmount();
break;
case "交通":
transportTotal += expense.getAmount();
break;
case "購物":
shoppingTotal += expense.getAmount();
break;
case "娛樂":
entertainmentTotal += expense.getAmount();
break;
}
}
System.out.println();
System.out.println(
"===== 分類支出統計 ====="
);
System.out.println(
"飲食:" + foodTotal + " 元"
);
System.out.println(
"交通:" + transportTotal + " 元"
);
System.out.println(
"購物:" + shoppingTotal + " 元"
);
System.out.println(
"娛樂:"
+ entertainmentTotal
+ " 元"
);
}
public static void deleteExpense() {
System.out.println();
System.out.println(
"===== 刪除消費紀錄 ====="
);
if (expenses.size() == 0) {
System.out.println(
"目前沒有可以刪除的紀錄。"
);
return;
}
showExpenses();
System.out.print(
"請輸入要刪除的紀錄編號:"
);
int number =
scanner.nextInt();
scanner.nextLine();
if (
number >= 1
&& number <= expenses.size()
) {
Expense deleted =
expenses.remove(number - 1);
saveExpenses();
System.out.println(
"已刪除:"
+ deleted.getItem()
);
} else {
System.out.println(
"沒有這筆紀錄!"
);
}
}
public static void editExpense() {
System.out.println();
System.out.println(
"===== 修改消費紀錄 ====="
);
if (expenses.size() == 0) {
System.out.println(
"目前沒有可以修改的紀錄。"
);
return;
}
showExpenses();
System.out.print(
"請輸入要修改的紀錄編號:"
);
int number =
scanner.nextInt();
scanner.nextLine();
if (
number >= 1
&& number <= expenses.size()
) {
Expense expense =
expenses.get(number - 1);
System.out.print(
"請輸入新的消費項目:"
);
String item =
scanner.nextLine();
System.out.print(
"請輸入新的消費金額:"
);
int amount =
scanner.nextInt();
String category =
chooseCategory();
expense.setItem(item);
expense.setAmount(amount);
expense.setCategory(category);
saveExpenses();
System.out.println(
"修改成功!"
);
} else {
System.out.println(
"沒有這筆紀錄!"
);
}
}
public static void setBudget() {
System.out.println();
System.out.println(
"===== 設定預算 ====="
);
System.out.print(
"請輸入預算金額:"
);
budget =
scanner.nextInt();
scanner.nextLine();
System.out.println(
"預算設定成功:"
+ budget
+ " 元"
);
}
public static void checkBudget() {
System.out.println();
System.out.println(
"===== 預算狀況 ====="
);
if (budget <= 0) {
System.out.println(
"尚未設定預算。"
);
return;
}
int total = 0;
for (int i = 0;
i < expenses.size();
i++) {
total +=
expenses.get(i)
.getAmount();
}
System.out.println(
"目前預算:"
+ budget
+ " 元"
);
System.out.println(
"目前支出:"
+ total
+ " 元"
);
if (total > budget) {
int over =
total - budget;
System.out.println(
"已超出預算 "
+ over
+ " 元!"
);
} else {
int remaining =
budget - total;
System.out.println(
"剩餘預算:"
+ remaining
+ " 元"
);
}
}
public static void searchByDate() {
System.out.println();
System.out.println(
"===== 依日期查詢 ====="
);
System.out.print(
"請輸入查詢日期(YYYY-MM-DD):"
);
String input =
scanner.nextLine();
try {
LocalDate searchDate =
LocalDate.parse(input);
int total = 0;
int count = 0;
System.out.println();
System.out.println(
"===== "
+ searchDate
+ " 消費紀錄 ====="
);
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
if (
expense.getDate()
.equals(searchDate)
) {
System.out.println(
expense.getItem()
+ "|"
+ expense.getAmount()
+ " 元|"
+ expense.getCategory()
);
total +=
expense.getAmount();
count++;
}
}
if (count == 0) {
System.out.println(
"這一天沒有消費紀錄。"
);
} else {
System.out.println();
System.out.println(
"當日共有 "
+ count
+ " 筆消費"
);
System.out.println(
"當日總支出:"
+ total
+ " 元"
);
}
} catch (Exception e) {
System.out.println(
"日期格式錯誤,請使用 YYYY-MM-DD。"
);
}
}
public static void searchByKeyword() {
System.out.println();
System.out.println(
"===== 關鍵字搜尋 ====="
);
System.out.print(
"請輸入搜尋關鍵字:"
);
String keyword =
scanner.nextLine();
int count = 0;
int total = 0;
System.out.println();
System.out.println(
"===== 搜尋結果 ====="
);
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
if (
expense.getItem()
.contains(keyword)
) {
System.out.println(
expense.getDate()
+ "|"
+ expense.getItem()
+ "|"
+ expense.getAmount()
+ " 元|"
+ expense.getCategory()
);
count++;
total +=
expense.getAmount();
}
}
if (count == 0) {
System.out.println(
"找不到符合的消費紀錄。"
);
} else {
System.out.println();
System.out.println(
"找到 "
+ count
+ " 筆紀錄"
);
System.out.println(
"合計支出:"
+ total
+ " 元"
);
}
}
public static void analyzeExpenses() {
System.out.println();
System.out.println(
"===== 消費分析 ====="
);
if (expenses.size() == 0) {
System.out.println(
"目前沒有消費紀錄。"
);
return;
}
Expense maxExpense =
expenses.get(0);
Expense minExpense =
expenses.get(0);
for (int i = 1;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
if (
expense.getAmount()
> maxExpense.getAmount()
) {
maxExpense = expense;
}
if (
expense.getAmount()
< minExpense.getAmount()
) {
minExpense = expense;
}
}
System.out.println();
System.out.println(
"最高支出:"
);
System.out.println(
maxExpense.getDate()
+ "|"
+ maxExpense.getItem()
+ "|"
+ maxExpense.getAmount()
+ " 元|"
+ maxExpense.getCategory()
);
System.out.println();
System.out.println(
"最低支出:"
);
System.out.println(
minExpense.getDate()
+ "|"
+ minExpense.getItem()
+ "|"
+ minExpense.getAmount()
+ " 元|"
+ minExpense.getCategory()
);
}
public static void monthlyStatistics() {
System.out.println();
System.out.println(
"===== 月支出統計 ====="
);
try {
System.out.print(
"請輸入年份:"
);
int year =
scanner.nextInt();
System.out.print(
"請輸入月份:"
);
int month =
scanner.nextInt();
scanner.nextLine();
if (
month < 1
|| month > 12
) {
System.out.println(
"月份必須是 1~12。"
);
return;
}
int total = 0;
int count = 0;
int foodTotal = 0;
int transportTotal = 0;
int shoppingTotal = 0;
int entertainmentTotal = 0;
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
if (
expense.getDate()
.getYear() == year
&&
expense.getDate()
.getMonthValue() == month
) {
count++;
total +=
expense.getAmount();
switch (
expense.getCategory()
) {
case "飲食":
foodTotal +=
expense.getAmount();
break;
case "交通":
transportTotal +=
expense.getAmount();
break;
case "購物":
shoppingTotal +=
expense.getAmount();
break;
case "娛樂":
entertainmentTotal +=
expense.getAmount();
break;
}
}
}
System.out.println();
System.out.println(
"===== "
+ year
+ " 年 "
+ month
+ " 月支出統計 ====="
);
if (count == 0) {
System.out.println(
"這個月份沒有消費紀錄。"
);
return;
}
System.out.println();
System.out.println(
"消費筆數:"
+ count
+ " 筆"
);
System.out.println(
"飲食:"
+ foodTotal
+ " 元"
);
System.out.println(
"交通:"
+ transportTotal
+ " 元"
);
System.out.println(
"購物:"
+ shoppingTotal
+ " 元"
);
System.out.println(
"娛樂:"
+ entertainmentTotal
+ " 元"
);
System.out.println();
System.out.println(
"本月總支出:"
+ total
+ " 元"
);
} catch (InputMismatchException e) {
System.out.println(
"輸入錯誤,年份和月份必須輸入數字!"
);
scanner.nextLine();
}
}
public static void saveExpenses() {
try {
FileWriter writer =
new FileWriter(
"expenses.txt"
);
for (int i = 0;
i < expenses.size();
i++) {
Expense expense =
expenses.get(i);
writer.write(
expense.getDate()
+ ","
+ expense.getItem()
+ ","
+ expense.getAmount()
+ ","
+ expense.getCategory()
+ "\n"
);
}
writer.close();
} catch (IOException e) {
System.out.println(
"檔案儲存失敗!"
);
}
}
public static void loadExpenses() {
try {
File file =
new File(
"expenses.txt"
);
Scanner fileScanner =
new Scanner(file);
while (
fileScanner.hasNextLine()
) {
String line =
fileScanner.nextLine();
String[] data =
line.split(",");
if (data.length == 4) {
LocalDate date =
LocalDate.parse(
data[0]
);
String item =
data[1];
int amount =
Integer.parseInt(
data[2]
);
String category =
data[3];
Expense expense =
new Expense(
date,
item,
amount,
category
);
expenses.add(
expense
);
}
}
fileScanner.close();
System.out.println(
"記帳資料讀取成功!"
);
} catch (Exception e) {
System.out.println(
"目前沒有已儲存的記帳資料。"
);
}
}
}

實際測試

假設目前資料:

2026-09-30|晚餐|180 元|飲食
2026-10-01|早餐|60 元|飲食
2026-10-01|捷運|30 元|交通
2026-10-02|午餐|150 元|飲食
2026-10-02|電影|300 元|娛樂
2026-10-02|衣服|500 元|購物

選擇:

請選擇功能:12

輸入:

===== 月支出統計 =====
請輸入年份:2026
請輸入月份:10

程式只會抓:

2026-10-01|早餐|60 元|飲食
2026-10-01|捷運|30 元|交通
2026-10-02|午餐|150 元|飲食
2026-10-02|電影|300 元|娛樂
2026-10-02|衣服|500 元|購物

不會把:

2026-09-30|晚餐|180 元|飲食

算進來。

最後:

===== 2026 年 10 月支出統計 =====
消費筆數:5 筆
飲食:210 元
交通:30 元
購物:500 元
娛樂:300 元
本月總支出:1040 元

如果這個月份沒有紀錄

例如輸入:

請輸入年份:2026
請輸入月份:8

如果 8 月沒有資料:

===== 2026 年 8 月支出統計 =====
這個月份沒有消費紀錄。

如果月份輸入錯誤

例如:

請輸入月份:15

程式會顯示:

月份必須是 1~12。

如果輸入:

請輸入月份:十月

則會由 InputMismatchException 處理:

輸入錯誤,年份和月份必須輸入數字!

這樣程式不會因為使用者輸入錯誤直接停止。

今天學到的 LocalDate 又更進一步了

Day 24:

LocalDate.now()

取得今天。

Day 25:

LocalDate.parse()

把文字轉成日期。

Day 28:

getYear()
getMonthValue()

把日期中的年份與月份取出來。

可以整理成:

LocalDate
│
├── now()
│ → 今天日期
│
├── parse()
│ → String 轉成日期
│
├── getYear()
│ → 取得年份
│
└── getMonthValue()
→ 取得月份

原本只是加入一個日期欄位,現在已經可以拿它做日期查詢和月份統計。

Day 28 學習心得

今天完成了月支出統計功能,學會使用 getYear() 和 getMonthValue() 從 LocalDate 中取得年份與月份,再利用 && 同時判斷年份和月份是否符合使用者輸入的條件。

除了計算整個月份的總支出,我也把之前的分類統計功能結合進來,所以現在可以看到一個月份在飲食、交通、購物和娛樂分別花了多少錢。

今天也加入了月份範圍的檢查,避免輸入 0 或 13 以上的不合理月份。做到 Day 28,我覺得目前的程式已經很接近一個完整的個人記帳系統,不只是能保存消費資料,也開始能利用累積的資料做不同方式的查詢和分析。


上一篇
消費分析:找出最高與最低的一筆支出
下一篇
系統測試與錯誤修正:完成記帳系統最後檢查
系列文
Java 程式設計與實作:30 天打造個人記帳系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言