+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/common/BaseIcon.vue b/frontend/src/components/common/BaseIcon.vue
new file mode 100644
index 0000000..7dc7a1e
--- /dev/null
+++ b/frontend/src/components/common/BaseIcon.vue
@@ -0,0 +1,146 @@
+
+
+
+ {{ name }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/common/BaseSelect.vue b/frontend/src/components/common/BaseSelect.vue
new file mode 100644
index 0000000..3e2ec67
--- /dev/null
+++ b/frontend/src/components/common/BaseSelect.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ searchQuery ? '未找到匹配项' : '暂无选项' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ error }}
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/common/CategoryIcon.vue b/frontend/src/components/common/CategoryIcon.vue
new file mode 100644
index 0000000..dd4c282
--- /dev/null
+++ b/frontend/src/components/common/CategoryIcon.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/common/DatePicker.vue b/frontend/src/components/common/DatePicker.vue
new file mode 100644
index 0000000..471bd0b
--- /dev/null
+++ b/frontend/src/components/common/DatePicker.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ relativeDate }}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/common/EmptyState.vue b/frontend/src/components/common/EmptyState.vue
new file mode 100644
index 0000000..9a08210
--- /dev/null
+++ b/frontend/src/components/common/EmptyState.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ description }}
+
+
+
+
+
+
+
+ {{ actionText }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/common/LoadingSpinner.vue b/frontend/src/components/common/LoadingSpinner.vue
new file mode 100644
index 0000000..91cc631
--- /dev/null
+++ b/frontend/src/components/common/LoadingSpinner.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ text }}
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/transaction/TransactionCard.vue b/frontend/src/components/transaction/TransactionCard.vue
new file mode 100644
index 0000000..9095453
--- /dev/null
+++ b/frontend/src/components/transaction/TransactionCard.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/transaction/TransactionFilter.vue b/frontend/src/components/transaction/TransactionFilter.vue
new file mode 100644
index 0000000..5d7d253
--- /dev/null
+++ b/frontend/src/components/transaction/TransactionFilter.vue
@@ -0,0 +1,448 @@
+
+
+
+
+
筛选条件
+
+
+
+
+
+
交易类型
+
+
+
+
+
+
+
+
分类
+
+
+
+
+
+
+
+
账户
+
+
+
+
+
+
+
+
金额范围
+
+
+
+
+
+
+
+
+
日期范围
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
同步状态
+
+
+
+
+
+
+
+
记录来源
+
+
+
+
+
+
+
+
+ 应用筛选 ({{ activeFilterCount }})
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/transaction/TransactionForm.vue b/frontend/src/components/transaction/TransactionForm.vue
new file mode 100644
index 0000000..f70a867
--- /dev/null
+++ b/frontend/src/components/transaction/TransactionForm.vue
@@ -0,0 +1,410 @@
+
+
+
+
+
+ {{ isEdit ? '编辑交易' : '添加交易' }}
+
+
+ {{ isEdit ? '修改交易信息' : '记录一笔新的交易' }}
+
+
+
+
+
+
+
+
+
+
+
+
可能的重复交易
+
+ 发现相似的交易记录,请确认是否继续添加。
+
+
+
+ 继续添加
+
+
+ 取消
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/transaction/TransactionList.vue b/frontend/src/components/transaction/TransactionList.vue
new file mode 100644
index 0000000..2686633
--- /dev/null
+++ b/frontend/src/components/transaction/TransactionList.vue
@@ -0,0 +1,274 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/components/transaction/TransactionSearch.vue b/frontend/src/components/transaction/TransactionSearch.vue
new file mode 100644
index 0000000..5edf508
--- /dev/null
+++ b/frontend/src/components/transaction/TransactionSearch.vue
@@ -0,0 +1,308 @@
+
+