This commit is contained in:
lizhifeng 2026-01-10 23:29:41 +08:00
commit 2eaaddf944
20 changed files with 6224 additions and 0 deletions

108
.gitignore vendored Normal file
View 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
View 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
View 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
View 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
View 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();
}

1753
main.js Normal file

File diff suppressed because it is too large Load diff

10
manifest.json Normal file
View 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

File diff suppressed because it is too large Load diff

31
package.json Normal file
View 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

File diff suppressed because it is too large Load diff

22
tsconfig.json Normal file
View 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
View 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
View file

@ -0,0 +1,3 @@
{
"1.0.0": "1.2.8"
}

108
使用示例.md Normal file
View 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
View 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
View file

0
新功能说明.md Normal file
View file

84
测试说明.md Normal file
View 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
View 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
View 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": "你的名称",`