feat: 新增标签体系、微信账单导入与收支记录体验优化

- 标签:新增 t_tag / t_transaction_tag 表与标签 CRUD,支持交易打标签、按标签筛选、批量添加/移除标签、导入账单默认标签,新增标签管理页
- 账单导入:新增微信支付 xlsx 解析器(WechatBillParser),支持支付宝 / 微信按类型导入;解析行保存原始完整数据(raw_data)并可在列表查看
- 收支记录:排序移至顶部并改为服务端排序(交易时间 / 金额,记忆偏好);筛选条件收纳为「更多筛选」弹层;分类筛选显示图标;一键设置支持「计入统计」;导入预览支持关键字 / 类型 / 状态 / 金额筛选
- 数据库:init.sql 新增 raw_data 字段与标签表,新增 init_tags.sql 默认标签种子
- 其他:更新 README 测试账号
This commit is contained in:
2026-09-17 16:47:26 +08:00
parent 1df6e23510
commit 65c0d8c550
33 changed files with 1854 additions and 100 deletions
+22 -2
View File
@@ -17,6 +17,9 @@ export function getTransactionPage(params: {
minAmount?: number
maxAmount?: number
remark?: string
sortField?: string
sortOrder?: string
tagIds?: number[]
}) {
return request.get('/transaction/page', { params })
}
@@ -30,6 +33,7 @@ export function createTransaction(data: {
remark?: string
transactionTime: string
includeInStats?: boolean
tagIds?: number[]
}) {
return request.post('/transaction', data)
}
@@ -43,6 +47,7 @@ export function updateTransaction(id: number, data: {
remark?: string
transactionTime: string
includeInStats?: boolean
tagIds?: number[]
}) {
return request.put(`/transaction/${id}`, data)
}
@@ -62,8 +67,8 @@ export function toggleRemarkHidden(id: number, remarkHidden: boolean) {
return request.put(`/transaction/${id}/remark-hidden`, { remarkHidden })
}
/** 支持的账单类型,当前仅支付宝 */
export type BillType = 'ALIPAY'
/** 支持的账单类型,当前支持支付宝与微信 */
export type BillType = 'ALIPAY' | 'WECHAT'
/** 账单解析结果行 */
export interface ParsedBillRow {
@@ -80,6 +85,7 @@ export interface ParsedBillRow {
importable: boolean
selected: boolean
duplicate: boolean
rawData: string | null
error: string | null
}
@@ -92,6 +98,7 @@ export interface BillImportItem {
counterparty: string
product: string
includeInStats: boolean
rawData: string | null
}
/** 解析账单文件(不落库),返回预览数据 */
@@ -117,10 +124,20 @@ export function batchUpdateCategory(data: {
ids: number[]
expenseCategoryId?: number | null
incomeCategoryId?: number | null
includeInStats?: boolean | null
}) {
return request.put('/transaction/batch-category', data)
}
/** 批量给交易记录添加/移除标签 */
export function batchTags(data: {
ids: number[]
addTagIds?: number[]
removeTagIds?: number[]
}) {
return request.put('/transaction/batch-tags', data)
}
/** 导出交易记录为 Excel 文件,支持按条件筛选 */
export function exportTransaction(params: {
types?: string[]
@@ -133,6 +150,9 @@ export function exportTransaction(params: {
minAmount?: number
maxAmount?: number
remark?: string
sortField?: string
sortOrder?: string
tagIds?: number[]
}) {
const userStore = useUserStore()
return axios.get('/api/transaction/export', {