mirror of
https://github.com/fengshuzi/coin-memo.git
synced 2026-07-22 06:08:04 +00:00
init
This commit is contained in:
commit
2eaaddf944
20 changed files with 6224 additions and 0 deletions
108
.gitignore
vendored
Normal file
108
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Obsidian workspace
|
||||
.obsidian/
|
||||
139
README.md
Normal file
139
README.md
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
# Obsidian 记账管理插件
|
||||
|
||||
基于 Obsidian 日记文件的智能记账管理插件,能够自动识别和统计您在日记中的记账记录。
|
||||
|
||||
## 功能特点
|
||||
|
||||
- 🔍 **自动识别记账记录**:从日记文件中自动解析记账信息
|
||||
- 📊 **统计分析**:提供收支统计、分类统计和时间范围查询
|
||||
- 🏷️ **分类管理**:支持自定义关键词和分类映射
|
||||
- 📅 **时间筛选**:可按日期范围查看记账记录
|
||||
- 💰 **收支管理**:区分收入和支出,计算结余
|
||||
- 🎨 **美观界面**:类似日历插件的现代化界面设计
|
||||
|
||||
## 记账格式
|
||||
|
||||
在您的日记文件中,使用以下格式记录账目:
|
||||
|
||||
```
|
||||
#关键词 金额 备注说明
|
||||
```
|
||||
|
||||
### 示例:
|
||||
|
||||
```markdown
|
||||
# 2024年1月10日
|
||||
|
||||
早上买早餐
|
||||
#cy 15.5 豆浆油条
|
||||
|
||||
中午吃饭
|
||||
#cy 45 麻辣烫
|
||||
|
||||
打车回家
|
||||
#jt 28 滴滴打车
|
||||
|
||||
收到工资
|
||||
#sr 8500 1月份工资
|
||||
```
|
||||
|
||||
## 配置说明
|
||||
|
||||
插件使用 `config.json` 文件进行配置:
|
||||
|
||||
```json
|
||||
{
|
||||
"categories": {
|
||||
"cy": "餐饮",
|
||||
"jt": "交通",
|
||||
"yl": "娱乐",
|
||||
"gw": "购物",
|
||||
"yl": "医疗",
|
||||
"jy": "教育",
|
||||
"fz": "房租",
|
||||
"qt": "其他",
|
||||
"sr": "收入"
|
||||
},
|
||||
"expenseEmoji": "#",
|
||||
"journalsPath": "journals"
|
||||
}
|
||||
```
|
||||
|
||||
### 配置项说明:
|
||||
|
||||
- **categories**: 关键词与分类的映射关系
|
||||
- `key`: 记账时使用的关键词
|
||||
- `value`: 显示的中文分类名称
|
||||
- `sr`: 特殊关键词,表示收入(其他为支出)
|
||||
- **expenseEmoji**: 记账标识符(默认为 #)
|
||||
- **journalsPath**: 日记文件存放路径(默认为 journals)
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 安装插件
|
||||
|
||||
将插件文件放入 Obsidian 插件目录并启用。
|
||||
|
||||
### 2. 配置分类
|
||||
|
||||
根据个人需求修改 `config.json` 中的分类设置。
|
||||
|
||||
### 3. 记录账目
|
||||
|
||||
在日记文件中按格式记录收支:
|
||||
- 使用 `#` 开头标识记账记录
|
||||
- 紧跟关键词(如 cy、jt 等)
|
||||
- 然后是金额(支持小数)
|
||||
- 最后是备注说明
|
||||
|
||||
### 4. 查看统计
|
||||
|
||||
- 点击侧边栏的计算器图标打开记账管理界面
|
||||
- 使用"选择日期范围"按钮筛选特定时间段
|
||||
- 查看收支统计、分类统计和详细记录
|
||||
|
||||
## 界面功能
|
||||
|
||||
### 统计概览
|
||||
- **总收入**:选定时间范围内的收入总额
|
||||
- **总支出**:选定时间范围内的支出总额
|
||||
- **结余**:收入减去支出的余额
|
||||
|
||||
### 分类统计
|
||||
- 按支出金额排序显示各分类统计
|
||||
- 显示每个分类的总金额和记录数量
|
||||
|
||||
### 记录列表
|
||||
- 按日期分组显示所有记账记录
|
||||
- 支持右键查看原始日记文件
|
||||
- 显示每日收支汇总
|
||||
|
||||
## 快捷操作
|
||||
|
||||
- **Ctrl/Cmd + P** → 搜索"记账管理"快速打开
|
||||
- **右键记录** → 查看原文跳转到对应日记
|
||||
- **刷新数据** → 重新扫描所有日记文件
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 确保日记文件存放在配置的 `journalsPath` 目录下
|
||||
2. 记账格式必须严格按照 `#关键词 金额 备注` 的格式
|
||||
3. 金额支持小数点,但不要包含货币符号
|
||||
4. 关键词必须在配置文件中定义才能被正确识别
|
||||
5. 使用 `sr` 关键词标识收入,其他关键词默认为支出
|
||||
|
||||
## 自定义扩展
|
||||
|
||||
您可以根据需要:
|
||||
- 添加新的分类关键词到 `config.json`
|
||||
- 修改记账标识符(默认为 #)
|
||||
- 调整日记文件路径
|
||||
- 自定义界面样式(修改 `styles.css`)
|
||||
|
||||
## 技术支持
|
||||
|
||||
如有问题或建议,请联系开发者或提交 Issue。
|
||||
|
||||
---
|
||||
|
||||
💡 **提示**:建议养成每日记账的好习惯,这样可以更好地了解自己的消费情况!
|
||||
33
config.json
Normal file
33
config.json
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"appName": "每日记账",
|
||||
"categories": {
|
||||
"cy": "餐饮",
|
||||
"jt": "交通",
|
||||
"yl": "娱乐",
|
||||
"gw": "购物",
|
||||
"yy": "医疗",
|
||||
"jy": "教育",
|
||||
"fz": "房租",
|
||||
"qt": "其他",
|
||||
"sr": "收入"
|
||||
},
|
||||
"budgets": {
|
||||
"monthly": {
|
||||
"total": 5000,
|
||||
"categories": {
|
||||
"cy": 1000,
|
||||
"jt": 500,
|
||||
"yl": 300,
|
||||
"gw": 800,
|
||||
"yy": 200,
|
||||
"jy": 300,
|
||||
"fz": 2000,
|
||||
"qt": 200
|
||||
}
|
||||
},
|
||||
"enableAlerts": true,
|
||||
"alertThreshold": 0.8
|
||||
},
|
||||
"expenseEmoji": "#",
|
||||
"journalsPath": "journals"
|
||||
}
|
||||
87
deploy.sh
Executable file
87
deploy.sh
Executable file
|
|
@ -0,0 +1,87 @@
|
|||
#!/bin/bash
|
||||
|
||||
# 记账插件部署脚本
|
||||
# 将插件部署到所有 Obsidian vaults
|
||||
|
||||
set -e
|
||||
|
||||
PLUGIN_NAME="obsidian-accounting"
|
||||
PLUGIN_ID="obsidian-accounting"
|
||||
|
||||
echo "🚀 开始部署 $PLUGIN_NAME 插件..."
|
||||
|
||||
# 定义基础路径
|
||||
BASE_PATH="$HOME/Library/Mobile Documents/iCloud~md~obsidian/Documents/漂泊者及其影子"
|
||||
NOTE_DEMO_PATH="$HOME/Library/Mobile Documents/iCloud~md~obsidian/Documents/note-demo"
|
||||
|
||||
# 定义目标 vault 目录
|
||||
VAULTS=(
|
||||
"$BASE_PATH/.obsidian-mobile/plugins"
|
||||
"$BASE_PATH/.obsidian-pro/plugins"
|
||||
"$BASE_PATH/.obsidian-ipad/plugins"
|
||||
"$BASE_PATH/.obsidian-2017/plugins"
|
||||
"$BASE_PATH/.obsidian-zhang/plugins"
|
||||
"$NOTE_DEMO_PATH/.obsidian/plugins"
|
||||
)
|
||||
|
||||
# 需要复制的文件(总是覆盖)
|
||||
ALWAYS_COPY_FILES=(
|
||||
"dist/main.js:main.js"
|
||||
"manifest.json"
|
||||
"styles.css"
|
||||
"config.json"
|
||||
)
|
||||
|
||||
SUCCESS_COUNT=0
|
||||
FAILED_COUNT=0
|
||||
|
||||
# 部署到每个 vault
|
||||
for vault in "${VAULTS[@]}"; do
|
||||
if [ -d "$vault" ]; then
|
||||
echo "📦 部署到: $vault"
|
||||
|
||||
# 创建插件目录
|
||||
mkdir -p "$vault/$PLUGIN_ID"
|
||||
|
||||
# 复制所有文件
|
||||
for file in "${ALWAYS_COPY_FILES[@]}"; do
|
||||
if [[ "$file" == *":"* ]]; then
|
||||
# 处理 source:target 格式
|
||||
source_file="${file%:*}"
|
||||
target_file="${file#*:}"
|
||||
if [ -f "$source_file" ]; then
|
||||
cp "$source_file" "$vault/$PLUGIN_ID/$target_file"
|
||||
echo " ✓ 复制 $source_file → $target_file"
|
||||
else
|
||||
echo " ⚠️ 警告: $source_file 不存在"
|
||||
fi
|
||||
else
|
||||
# 处理普通文件
|
||||
if [ -f "$file" ]; then
|
||||
cp "$file" "$vault/$PLUGIN_ID/"
|
||||
echo " ✓ 复制 $file"
|
||||
else
|
||||
echo " ⚠️ 警告: $file 不存在"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
|
||||
echo " ✅ 部署成功"
|
||||
else
|
||||
echo "❌ 目录不存在: $vault"
|
||||
FAILED_COUNT=$((FAILED_COUNT + 1))
|
||||
fi
|
||||
echo ""
|
||||
done
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📊 部署总结"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✅ 成功: $SUCCESS_COUNT 个 vault"
|
||||
echo "❌ 失败: $FAILED_COUNT 个 vault"
|
||||
echo ""
|
||||
echo "💡 提示: 在 Obsidian 中重新加载插件以查看更改"
|
||||
echo " - 打开命令面板 (Cmd/Ctrl + P)"
|
||||
echo " - 搜索 'Reload app without saving'"
|
||||
echo " - 或者禁用再启用插件"
|
||||
48
esbuild.config.mjs
Normal file
48
esbuild.config.mjs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
import esbuild from "esbuild";
|
||||
import process from "process";
|
||||
import builtins from "builtin-modules";
|
||||
|
||||
const banner =
|
||||
`/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source, please visit the github repository of this plugin
|
||||
*/
|
||||
`;
|
||||
|
||||
const prod = (process.argv[2] === 'production');
|
||||
|
||||
const context = await esbuild.context({
|
||||
banner: {
|
||||
js: banner,
|
||||
},
|
||||
entryPoints: ['main.js'],
|
||||
bundle: true,
|
||||
external: [
|
||||
'obsidian',
|
||||
'electron',
|
||||
'@codemirror/autocomplete',
|
||||
'@codemirror/collab',
|
||||
'@codemirror/commands',
|
||||
'@codemirror/language',
|
||||
'@codemirror/lint',
|
||||
'@codemirror/search',
|
||||
'@codemirror/state',
|
||||
'@codemirror/view',
|
||||
'@lezer/common',
|
||||
'@lezer/highlight',
|
||||
'@lezer/lr',
|
||||
...builtins],
|
||||
format: 'cjs',
|
||||
target: 'es2018',
|
||||
logLevel: "info",
|
||||
sourcemap: prod ? false : 'inline',
|
||||
treeShaking: true,
|
||||
outfile: 'dist/main.js',
|
||||
});
|
||||
|
||||
if (prod) {
|
||||
await context.rebuild();
|
||||
process.exit(0);
|
||||
} else {
|
||||
await context.watch();
|
||||
}
|
||||
10
manifest.json
Normal file
10
manifest.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-accounting",
|
||||
"name": "每日记账",
|
||||
"version": "1.0.0",
|
||||
"minAppVersion": "1.2.8",
|
||||
"description": "基于日记文件的每日记账插件,支持自动识别和统计记账记录。",
|
||||
"author": "Your Name",
|
||||
"authorUrl": "https://github.com/yourusername",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
2406
package-lock.json
generated
Normal file
2406
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
31
package.json
Normal file
31
package.json
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"name": "obsidian-accounting",
|
||||
"version": "1.0.0",
|
||||
"description": "基于日记文件的记账管理插件",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"dev": "node esbuild.config.mjs",
|
||||
"build": "node esbuild.config.mjs production",
|
||||
"version": "node version-bump.mjs && git add manifest.json versions.json",
|
||||
"deploy": "bash deploy.sh"
|
||||
},
|
||||
"keywords": [
|
||||
"obsidian",
|
||||
"plugin",
|
||||
"accounting",
|
||||
"finance",
|
||||
"journal"
|
||||
],
|
||||
"author": "Your Name",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/node": "^16.11.6",
|
||||
"@typescript-eslint/eslint-plugin": "5.29.0",
|
||||
"@typescript-eslint/parser": "5.29.0",
|
||||
"builtin-modules": "3.3.0",
|
||||
"esbuild": "0.17.3",
|
||||
"obsidian": "latest",
|
||||
"tslib": "2.4.0",
|
||||
"typescript": "4.7.4"
|
||||
}
|
||||
}
|
||||
1120
styles.css
Normal file
1120
styles.css
Normal file
File diff suppressed because it is too large
Load diff
22
tsconfig.json
Normal file
22
tsconfig.json
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"inlineSourceMap": true,
|
||||
"inlineSources": true,
|
||||
"module": "ESNext",
|
||||
"target": "ES6",
|
||||
"allowJs": true,
|
||||
"noImplicitAny": false,
|
||||
"moduleResolution": "node",
|
||||
"importHelpers": true,
|
||||
"isolatedModules": true,
|
||||
"strictNullChecks": true,
|
||||
"lib": [
|
||||
"DOM",
|
||||
"ES6"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
"**/*.ts"
|
||||
]
|
||||
}
|
||||
14
version-bump.mjs
Normal file
14
version-bump.mjs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
import { readFileSync, writeFileSync } from "fs";
|
||||
|
||||
const targetVersion = process.env.npm_package_version;
|
||||
|
||||
// read minAppVersion from manifest.json and bump version to target version
|
||||
let manifest = JSON.parse(readFileSync("manifest.json", "utf8"));
|
||||
const { minAppVersion } = manifest;
|
||||
manifest.version = targetVersion;
|
||||
writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t"));
|
||||
|
||||
// update versions.json with target version and minAppVersion from manifest.json
|
||||
let versions = JSON.parse(readFileSync("versions.json", "utf8"));
|
||||
versions[targetVersion] = minAppVersion;
|
||||
writeFileSync("versions.json", JSON.stringify(versions, null, "\t"));
|
||||
3
versions.json
Normal file
3
versions.json
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"1.0.0": "1.2.8"
|
||||
}
|
||||
108
使用示例.md
Normal file
108
使用示例.md
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
# 记账插件使用示例
|
||||
|
||||
## 📝 在日记中记账
|
||||
|
||||
在你的 `journals/2024-01-10.md` 文件中:
|
||||
|
||||
```markdown
|
||||
# 2024年1月10日
|
||||
|
||||
## 今日记录
|
||||
|
||||
早上买早餐
|
||||
#cy 15.5 豆浆油条
|
||||
|
||||
中午和同事吃饭
|
||||
#cy 45 麻辣烫
|
||||
|
||||
打车回家
|
||||
#jt 28 滴滴打车
|
||||
|
||||
收到工资
|
||||
#sr 8500 1月份工资
|
||||
|
||||
买技术书
|
||||
#jy 89 《深入理解计算机系统》
|
||||
|
||||
## 其他事项
|
||||
今天天气不错...
|
||||
```
|
||||
|
||||
## 🎯 记账格式说明
|
||||
|
||||
### 基本格式
|
||||
```
|
||||
#关键词 金额 备注说明
|
||||
```
|
||||
|
||||
**重要**:插件只会识别配置文件中定义的完整关键词,不会误识别包含这些字母的其他单词。
|
||||
|
||||
### 正确示例 ✅
|
||||
```markdown
|
||||
#cy 15.5 豆浆油条 ← 正确:完整的关键词
|
||||
#jt 28 打车费用 ← 正确:完整的关键词
|
||||
#sr 8000 工资收入 ← 正确:完整的关键词
|
||||
```
|
||||
|
||||
### 不会被识别的情况 ❌
|
||||
```markdown
|
||||
- TODO 写一个 getCarlistItem 函数 ← 不会识别:cy只是单词的一部分
|
||||
- 讨论 cryptocurrency 投资 ← 不会识别:cy只是单词的一部分
|
||||
- 分析 cybersecurity 问题 ← 不会识别:cy只是单词的一部分
|
||||
```
|
||||
|
||||
### 支持的关键词
|
||||
- `#cy 25.8 午餐` → 餐饮 25.8元
|
||||
- `#jt 6 地铁` → 交通 6元
|
||||
- `#yl 58 电影` → 娱乐 58元
|
||||
- `#gw 199 衣服` → 购物 199元
|
||||
- `#yy 50 感冒药` → 医疗 50元
|
||||
- `#jy 89 书籍` → 教育 89元
|
||||
- `#fz 2000 房租` → 房租 2000元
|
||||
- `#qt 20 其他` → 其他 20元
|
||||
- `#sr 8000 工资` → 收入 8000元 ⭐
|
||||
|
||||
## 📊 查看统计
|
||||
|
||||
1. 点击左侧工具栏的 📊 计算器图标
|
||||
2. 或使用命令面板 (Cmd/Ctrl + P) 搜索"记账管理"
|
||||
3. 在界面中可以看到:
|
||||
- 总收入、总支出、结余
|
||||
- 分类统计
|
||||
- 按日期分组的详细记录
|
||||
- 时间范围筛选
|
||||
|
||||
## 🔧 自定义配置
|
||||
|
||||
编辑 `config.json` 添加新分类:
|
||||
|
||||
```json
|
||||
{
|
||||
"categories": {
|
||||
"cy": "餐饮",
|
||||
"jt": "交通",
|
||||
"yl": "娱乐",
|
||||
"gw": "购物",
|
||||
"yy": "医疗",
|
||||
"jy": "教育",
|
||||
"fz": "房租",
|
||||
"qt": "其他",
|
||||
"sr": "收入",
|
||||
"tz": "投资", // 新增
|
||||
"lw": "礼物" // 新增
|
||||
},
|
||||
"expenseEmoji": "#",
|
||||
"journalsPath": "journals"
|
||||
}
|
||||
```
|
||||
|
||||
## 💡 使用技巧
|
||||
|
||||
1. **养成习惯**:每天记录消费,数据更准确
|
||||
2. **备注详细**:方便后续查看和分析
|
||||
3. **定期查看**:使用时间筛选功能分析消费趋势
|
||||
4. **分类清晰**:根据个人需求调整分类关键词
|
||||
|
||||
## 🎉 开始记账吧!
|
||||
|
||||
现在你可以在日记中轻松记账,插件会自动识别并统计你的收支情况!
|
||||
101
安装说明.md
Normal file
101
安装说明.md
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
# 记账插件安装说明
|
||||
|
||||
## 快速安装
|
||||
|
||||
1. **复制插件文件**
|
||||
- 将整个 `obsidian-accounting` 文件夹复制到你的 Obsidian 库的 `.obsidian/plugins/` 目录下
|
||||
|
||||
2. **启用插件**
|
||||
- 打开 Obsidian 设置 → 第三方插件
|
||||
- 找到"记账管理"插件并启用
|
||||
|
||||
3. **创建日记目录**
|
||||
- 在库根目录创建 `journals` 文件夹(如果还没有的话)
|
||||
|
||||
## 开始使用
|
||||
|
||||
### 第一步:在日记中记账
|
||||
在 `journals/2024-01-10.md` 文件中写入:
|
||||
|
||||
```markdown
|
||||
# 今天的记录
|
||||
|
||||
早餐
|
||||
#cy 15.5 豆浆油条
|
||||
|
||||
打车上班
|
||||
#jt 28 滴滴打车
|
||||
|
||||
收到工资
|
||||
#sr 5000 月薪
|
||||
```
|
||||
|
||||
### 第二步:查看统计
|
||||
- 点击左侧工具栏的计算器图标 📊
|
||||
- 或使用命令面板搜索"记账管理"
|
||||
|
||||
## 记账格式说明
|
||||
|
||||
```
|
||||
#关键词 金额 备注
|
||||
```
|
||||
|
||||
### 默认关键词:
|
||||
- `cy` = 餐饮
|
||||
- `jt` = 交通
|
||||
- `yl` = 娱乐
|
||||
- `gw` = 购物
|
||||
- `jy` = 教育
|
||||
- `fz` = 房租
|
||||
- `qt` = 其他
|
||||
- `sr` = 收入 ⭐
|
||||
|
||||
### 示例:
|
||||
```markdown
|
||||
#cy 25.8 午餐麻辣烫
|
||||
#jt 6 地铁费
|
||||
#sr 8000 工资收入
|
||||
#gw 199 买衣服
|
||||
```
|
||||
|
||||
## 自定义分类
|
||||
|
||||
编辑 `obsidian-accounting/config.json` 文件:
|
||||
|
||||
```json
|
||||
{
|
||||
"categories": {
|
||||
"cy": "餐饮",
|
||||
"jt": "交通",
|
||||
"yl": "娱乐",
|
||||
"gw": "购物",
|
||||
"yy": "医疗",
|
||||
"jy": "教育",
|
||||
"fz": "房租",
|
||||
"qt": "其他",
|
||||
"sr": "收入",
|
||||
"tz": "投资",
|
||||
"lw": "礼物"
|
||||
},
|
||||
"expenseEmoji": "#",
|
||||
"journalsPath": "journals"
|
||||
}
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q: 为什么看不到记账记录?**
|
||||
A: 检查日记文件是否在 `journals` 目录下,格式是否正确
|
||||
|
||||
**Q: 如何修改分类?**
|
||||
A: 编辑 `config.json` 文件,添加或修改 categories 中的键值对
|
||||
|
||||
**Q: 支持其他货币吗?**
|
||||
A: 支持,只需要在金额中输入数字即可,不要包含货币符号
|
||||
|
||||
**Q: 可以批量导入历史数据吗?**
|
||||
A: 可以,按格式在历史日记文件中添加记账记录即可
|
||||
|
||||
---
|
||||
|
||||
🎉 **安装完成!开始享受智能记账体验吧!**
|
||||
0
性能优化说明.md
Normal file
0
性能优化说明.md
Normal file
0
新功能说明.md
Normal file
0
新功能说明.md
Normal file
84
测试说明.md
Normal file
84
测试说明.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# 记账插件测试说明
|
||||
|
||||
## 🔍 关键词识别测试
|
||||
|
||||
### 问题描述
|
||||
之前的版本会错误识别包含关键词字母的其他单词,比如:
|
||||
- `getCarlistItem` 中的 `cy` 被误识别为餐饮
|
||||
- `cryptocurrency` 中的 `cy` 被误识别为餐饮
|
||||
- `psychology` 中的 `gy` 可能被误识别
|
||||
|
||||
### 解决方案
|
||||
修改了正则表达式,现在只匹配配置文件中定义的完整关键词。
|
||||
|
||||
### 测试用例
|
||||
|
||||
#### ✅ 应该被识别的记录
|
||||
```markdown
|
||||
#cy 15.5 豆浆油条
|
||||
#jt 28 打车费用
|
||||
#yl 58 看电影
|
||||
#gw 199 买衣服
|
||||
#yy 50 感冒药
|
||||
#jy 89 技术书籍
|
||||
#fz 3000 房租
|
||||
#qt 20 杂费
|
||||
#sr 8000 工资
|
||||
```
|
||||
|
||||
#### ❌ 不应该被识别的内容
|
||||
```markdown
|
||||
- TODO #idea 12:00 写一个 getCarlistItem 指定字段
|
||||
- 讨论 cryptocurrency 投资策略
|
||||
- 分析 cybersecurity 问题
|
||||
- 研究 psychology 理论
|
||||
- 学习 typography 设计
|
||||
- 了解 geography 知识
|
||||
- 这里有个 cy 单词但不是记账
|
||||
- 开发 getCarlistItem 函数的 cy 参数
|
||||
```
|
||||
|
||||
#### 🧪 混合测试
|
||||
```markdown
|
||||
# 2024年1月11日
|
||||
|
||||
## 工作记录
|
||||
- TODO 写一个 getCarlistItem 函数
|
||||
- 修复 cryptocurrency 相关的 bug
|
||||
- 研究 cybersecurity 最佳实践
|
||||
|
||||
## 记账记录
|
||||
早餐
|
||||
#cy 12 包子豆浆
|
||||
|
||||
打车上班
|
||||
#jt 15 滴滴
|
||||
|
||||
看电影
|
||||
#yl 58 《流浪地球3》
|
||||
|
||||
## 其他内容
|
||||
今天学习了 psychology 相关知识
|
||||
```
|
||||
|
||||
在上面的例子中,只有 `#cy 12 包子豆浆`、`#jt 15 滴滴`、`#yl 58 《流浪地球3》` 应该被识别为记账记录。
|
||||
|
||||
### 验证方法
|
||||
1. 在 journals 目录创建测试文件
|
||||
2. 添加上述测试内容
|
||||
3. 打开记账管理界面
|
||||
4. 检查是否只识别了正确的记账记录
|
||||
5. 确认不会误识别包含关键词字母的其他单词
|
||||
|
||||
### 技术实现
|
||||
```javascript
|
||||
// 修改前(会误识别)
|
||||
const regex = new RegExp(`${expenseEmoji}\\s*(\\w+)\\s+([\\d.]+)\\s*(.*)`, 'g');
|
||||
|
||||
// 修改后(精确匹配)
|
||||
const keywords = Object.keys(categories).sort((a, b) => b.length - a.length);
|
||||
const keywordPattern = keywords.join('|');
|
||||
const regex = new RegExp(`${expenseEmoji}\\s*(${keywordPattern})\\s+([\\d.]+)\\s*(.*)`, 'g');
|
||||
```
|
||||
|
||||
这样确保只有配置文件中定义的完整关键词才会被识别为记账记录。
|
||||
93
缓存策略说明.md
Normal file
93
缓存策略说明.md
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
# 记账插件缓存策略说明
|
||||
|
||||
## 🚀 优化目标
|
||||
|
||||
- **即时响应**:新增记账记录后立即可见
|
||||
- **性能优化**:避免重复扫描大量文件
|
||||
- **智能更新**:只在文件真正变化时刷新
|
||||
|
||||
## 📋 缓存策略
|
||||
|
||||
### 1. 文件监听机制
|
||||
```javascript
|
||||
// 监听日记文件的变化
|
||||
app.vault.on('modify', (file) => {
|
||||
if (file.path.startsWith('journals/') && file.path.endsWith('.md')) {
|
||||
// 立即清除缓存,下次访问时重新加载
|
||||
this.clearCache();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### 2. 短时间缓存
|
||||
- **缓存时间**:30秒(而不是5分钟)
|
||||
- **触发条件**:
|
||||
- 文件修改 → 立即清除缓存
|
||||
- 文件创建 → 立即清除缓存
|
||||
- 文件删除 → 立即清除缓存
|
||||
- 超过30秒 → 自动过期
|
||||
|
||||
### 3. 智能加载
|
||||
```javascript
|
||||
// 使用场景分析
|
||||
if (缓存有效 && 没有文件变化) {
|
||||
return 缓存数据; // 秒级响应
|
||||
} else {
|
||||
重新扫描文件; // 确保数据最新
|
||||
更新缓存;
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 用户体验
|
||||
|
||||
### ✅ 新增记账记录
|
||||
1. 在日记中写入:`#cy 15.5 豆浆油条`
|
||||
2. 保存文件 → 自动触发缓存清除
|
||||
3. 打开记账界面 → 立即显示新记录
|
||||
|
||||
### ✅ 频繁查看统计
|
||||
1. 第一次打开 → 扫描所有文件(可能较慢)
|
||||
2. 30秒内再次打开 → 使用缓存(秒开)
|
||||
3. 修改记账后打开 → 自动刷新数据
|
||||
|
||||
### ✅ 强制刷新
|
||||
- 点击"刷新数据"按钮 → 忽略缓存,强制重新加载
|
||||
|
||||
## 🔧 技术实现
|
||||
|
||||
### 文件扫描优化
|
||||
```javascript
|
||||
// 分批处理,避免阻塞
|
||||
const batchSize = 10;
|
||||
for (let i = 0; i < files.length; i += batchSize) {
|
||||
const batch = files.slice(i, i + batchSize);
|
||||
// 并行处理这一批文件
|
||||
const results = await Promise.all(batch.map(processFile));
|
||||
}
|
||||
```
|
||||
|
||||
### 快速过滤
|
||||
```javascript
|
||||
// 先检查文件是否包含记账标识符
|
||||
const content = await vault.read(file);
|
||||
if (!content.includes('#')) {
|
||||
return []; // 跳过不包含记账记录的文件
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 性能对比
|
||||
|
||||
| 场景 | 优化前 | 优化后 |
|
||||
|------|--------|--------|
|
||||
| 首次加载 | 扫描所有文件 | 扫描所有文件 |
|
||||
| 重复查看 | 每次扫描 | 使用缓存(秒开) |
|
||||
| 新增记录后 | 手动刷新 | 自动检测更新 |
|
||||
| 大量文件 | 线性增长 | 分批+并行处理 |
|
||||
|
||||
## 💡 使用建议
|
||||
|
||||
1. **正常使用**:无需手动刷新,系统会自动检测文件变化
|
||||
2. **数据异常**:点击"刷新数据"按钮强制更新
|
||||
3. **性能考虑**:插件会自动优化,无需担心文件数量
|
||||
|
||||
这样既保证了数据的实时性,又优化了性能表现!
|
||||
64
自定义名称说明.md
Normal file
64
自定义名称说明.md
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# 如何自定义应用名称
|
||||
|
||||
## 📝 操作步骤
|
||||
|
||||
1. **打开记账软件**
|
||||
- 点击左侧边栏的 💰 图标
|
||||
- 或使用命令面板 (Cmd/Ctrl + P) 搜索"打开记账软件"
|
||||
|
||||
2. **进入配置界面**
|
||||
- 点击右上角的"配置分类"按钮
|
||||
|
||||
3. **切换到基础设置**
|
||||
- 在配置窗口顶部,你会看到三个标签页:
|
||||
- **基础设置** ← 点击这个
|
||||
- 分类管理
|
||||
- 预算设置
|
||||
|
||||
4. **修改应用名称**
|
||||
- 在"显示名称"输入框中输入你想要的名称
|
||||
- 例如:我的账本、家庭记账、个人财务等
|
||||
- 下方会实时预览效果
|
||||
|
||||
5. **保存配置**
|
||||
- 点击右下角的"保存"按钮
|
||||
- 插件会自动刷新
|
||||
|
||||
6. **查看效果**
|
||||
- 侧边栏标签页名称会变成你设置的名称
|
||||
- 页面标题也会使用新名称
|
||||
- 配置窗口标题也会更新
|
||||
|
||||
## 🎯 自定义名称会应用到哪些地方?
|
||||
|
||||
1. ✅ 侧边栏标签页名称:`💰 [你的名称]`
|
||||
2. ✅ 页面顶部标题:`💰 [你的名称]`
|
||||
3. ✅ 配置窗口标题:`[你的名称]配置`
|
||||
4. ✅ 功能区图标提示:`[你的名称]`
|
||||
5. ✅ 命令面板命令:`打开[你的名称]`
|
||||
|
||||
## 💡 示例
|
||||
|
||||
如果你设置名称为"我的账本",那么:
|
||||
- 标签页显示:💰 我的账本
|
||||
- 页面标题:💰 我的账本
|
||||
- 配置标题:我的账本配置
|
||||
- 命令:打开我的账本
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
- 名称最长 20 个字符
|
||||
- 如果留空,会使用默认名称"记账软件"
|
||||
- 修改后需要点击"保存"按钮才会生效
|
||||
- 保存后插件会自动刷新数据
|
||||
|
||||
## 🔧 如果看不到"基础设置"标签页
|
||||
|
||||
请确保:
|
||||
1. 已经重新加载插件(命令面板 → "Reload app without saving")
|
||||
2. 配置文件已更新(应该包含 `appName` 字段)
|
||||
3. 使用的是最新版本的插件
|
||||
|
||||
如果还是看不到,可以手动编辑配置文件:
|
||||
- 文件位置:`.obsidian/plugins/obsidian-accounting/config.json`
|
||||
- 在文件开头添加:`"appName": "你的名称",`
|
||||
Loading…
Reference in a new issue