refactor: 品牌改名为汇账 Ledgerly,包名与工程标识统一为 ledgerly

- Java 包名由 cn.rosercode.finance 改为 cn.rosercode.ledgerly,主类 FinanceApplication 更名为 LedgerlyApplication
- Gradle 项目名、spring.application.name 与日志文件名统一为 ledgerly
- 前端界面文案、页面标题、登录注册标题、README 与 Knife4j 标题更新为汇账 / Ledgerly
- 前端本地存储键前缀由 finance. 改为 ledgerly.,并新增旧键自动迁移避免老用户偏好丢失
- 运行目录系统属性与环境变量改为 ledgerly.home / LEDGERLY_HOME
- 部署编排、启动脚本、容器名、SQLite 默认路径与构建产物名同步改为 ledgerly
This commit is contained in:
2026-09-23 17:33:59 +08:00
parent e0fa1abec5
commit 24074aeea2
322 changed files with 1270 additions and 1254 deletions
@@ -28,7 +28,7 @@ const hasPassword = ref(false)
// 表单数据
const form = ref({
type: 'SQLITE' as DatabaseType,
sqlitePath: 'data/finance.db',
sqlitePath: 'data/ledgerly.db',
host: 'localhost',
port: 3306,
database: '',
@@ -45,7 +45,7 @@ async function loadStatus() {
if (data?.configured) {
form.value.type = data.type
if (data.type === 'SQLITE') {
form.value.sqlitePath = data.sqlitePath || 'data/finance.db'
form.value.sqlitePath = data.sqlitePath || 'data/ledgerly.db'
} else {
form.value.host = data.host || 'localhost'
form.value.port = data.port || 3306
@@ -14,7 +14,7 @@ import { STORAGE_KEYS } from '../utils/storageKeys'
import { usePageSizeOptions } from '../composables/usePageSizeOptions'
import { useTablePageSize } from '../composables/useTablePageSize'
/** 关系类型偏好存储键(界面偏好统一以 finance. 前缀命名) */
/** 关系类型偏好存储键(界面偏好统一以 ledgerly. 前缀命名) */
const RELATION_TYPE_KEY = STORAGE_KEYS.transactionRelationType
const props = defineProps<{
+4 -4
View File
@@ -49,7 +49,7 @@ export default {
// 登录页
login: {
title: { zh: '收支管理系统 - 登录', en: 'Finance Manager - Sign In', ja: '収支管理システム - ログイン' },
title: { zh: '汇账 - 登录', en: 'Ledgerly - Sign In', ja: 'Ledgerly - ログイン' },
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
usernamePlaceholder: { zh: '请输入用户名', en: 'Enter your username', ja: 'ユーザー名を入力してください' },
@@ -64,7 +64,7 @@ export default {
// 注册页
register: {
title: { zh: '收支管理系统 - 注册', en: 'Finance Manager - Sign Up', ja: '収支管理システム - 新規登録' },
title: { zh: '汇账 - 注册', en: 'Ledgerly - Sign Up', ja: 'Ledgerly - 新規登録' },
username: { zh: '用户名', en: 'Username', ja: 'ユーザー名' },
nickname: { zh: '昵称', en: 'Nickname', ja: 'ニックネーム' },
password: { zh: '密码', en: 'Password', ja: 'パスワード' },
@@ -85,7 +85,7 @@ export default {
// 主布局
layout: {
appTitle: { zh: '收支管理', en: 'Finance Manager', ja: '収支管理' },
appTitle: { zh: '汇账', en: 'Ledgerly', ja: 'Ledgerly' },
appSubtitle: { zh: '个人财务管理', en: 'Personal Finance', ja: '個人財務管理' },
dashboard: { zh: '统计面板', en: 'Dashboard', ja: 'ダッシュボード' },
transactions: { zh: '收支记录', en: 'Transactions', ja: '収支記録' },
@@ -113,7 +113,7 @@ export default {
configFile: { zh: '配置文件', en: 'Config file', ja: '設定ファイル' },
type: { zh: '数据库类型', en: 'Database type', ja: 'データベースの種類' },
sqlitePath: { zh: '数据库文件', en: 'Database file', ja: 'データベースファイル' },
sqlitePathPlaceholder: { zh: '例如 data/finance.db', en: 'e.g. data/finance.db', ja: '例:data/finance.db' },
sqlitePathPlaceholder: { zh: '例如 data/ledgerly.db', en: 'e.g. data/ledgerly.db', ja: '例:data/ledgerly.db' },
sqliteHint: { zh: 'SQLite 为本地单文件数据库,路径相对于服务运行目录;建议使用 data 目录并做好持久化挂载。', en: 'SQLite is a single local file; the path is relative to the server working directory. Use a data directory with persistent storage.', ja: 'SQLite はローカルの単一ファイルです。パスはサーバーの作業ディレクトリからの相対パスです。data ディレクトリと永続化ストレージの利用を推奨します。' },
sqlitePathRequired: { zh: '请填写 SQLite 数据库文件路径', en: 'Please enter the SQLite database file path', ja: 'SQLite データベースファイルのパスを入力してください' },
mysqlRequired: { zh: '请填写主机地址、数据库名与用户名', en: 'Please fill in host, database and username', ja: 'ホスト、データベース名、ユーザー名を入力してください' },
+1 -1
View File
@@ -4,7 +4,7 @@ import { ref } from 'vue'
import { getUserInfo } from '../api/user'
import { readString, removeKey, writeString } from '../utils/storage'
/** 登录令牌存储键(认证凭据,不属于界面偏好,不纳入 finance. 前缀) */
/** 登录令牌存储键(认证凭据,不属于界面偏好,不纳入 ledgerly. 前缀) */
const TOKEN_KEY = 'token'
export const useUserStore = defineStore('user', () => {
+34 -18
View File
@@ -1,48 +1,64 @@
// 本地存储键常量:界面/用户偏好统一以 finance. 前缀命名,作为唯一来源供路由与各页面复用
// 本地存储键常量:界面/用户偏好统一以 ledgerly. 前缀命名,作为唯一来源供路由与各页面复用
import { migrateKey } from './storage'
/** 当前使用的本地存储键 */
export const STORAGE_KEYS = {
// 语言偏好
locale: 'finance.locale',
locale: 'ledgerly.locale',
// 邮箱账单页标签页
emailBillTab: 'finance.emailBill.tab',
emailBillTab: 'ledgerly.emailBill.tab',
// 系统日志页标签页
logsTab: 'finance.logs.tab',
logsTab: 'ledgerly.logs.tab',
// 账单导入的账单类型
billImportBillType: 'finance.billImport.billType',
billImportBillType: 'ledgerly.billImport.billType',
// 统计面板偏好
dashboardPrefs: 'finance.dashboard.prefs',
dashboardPrefs: 'ledgerly.dashboard.prefs',
// 统计面板 AI 查询历史
dashboardAiSearchHistory: 'finance.dashboard.aiSearchHistory',
dashboardAiSearchHistory: 'ledgerly.dashboard.aiSearchHistory',
// 统计面板 AI 查询浮窗位置尺寸
dashboardAiQueryWindow: 'finance.dashboard.aiQueryWindow',
dashboardAiQueryWindow: 'ledgerly.dashboard.aiQueryWindow',
// 收支记录 AI 建议范围
transactionAiScope: 'finance.transaction.aiScope',
transactionAiScope: 'ledgerly.transaction.aiScope',
// 收支记录 AI 记账方式
transactionAiRecordTab: 'finance.transaction.aiRecordTab',
transactionAiRecordTab: 'ledgerly.transaction.aiRecordTab',
// 收支记录备注关键词历史
transactionRemarkHistory: 'finance.transaction.remarkHistory',
transactionRemarkHistory: 'ledgerly.transaction.remarkHistory',
// 收支记录筛选偏好(收支记录页与统计面板共用)
transactionFilterPrefs: 'finance.transaction.filterPrefs',
transactionFilterPrefs: 'ledgerly.transaction.filterPrefs',
// 各表格每页大小偏好(聚合 JSON,按表格键区分,本机记忆)
paginationTablePageSizes: 'finance.pagination.tablePageSizes',
paginationTablePageSizes: 'ledgerly.pagination.tablePageSizes',
// 账单关系类型
transactionRelationType: 'finance.transaction.relationType',
transactionRelationType: 'ledgerly.transaction.relationType',
// 收支记录 AI 查询历史
transactionAiQueryHistory: 'finance.transaction.aiQueryHistory',
transactionAiQueryHistory: 'ledgerly.transaction.aiQueryHistory',
// 收支记录 AI 查询浮窗位置尺寸
transactionAiQueryWindow: 'finance.transaction.aiQueryWindow',
transactionAiQueryWindow: 'ledgerly.transaction.aiQueryWindow',
// 内容区滚动位置(sessionStorage,按路由拼接后缀)
scrollPrefix: 'finance.scroll.',
scrollPrefix: 'ledgerly.scroll.',
} as const
/** 历史遗留的存储键(未带 finance. 前缀),首次读取时迁移到新键 */
/** 历史遗留的存储键(未带前缀),首次读取时迁移到新键 */
export const LEGACY_STORAGE_KEYS = {
locale: 'locale',
emailBillTab: 'emailBill.tab',
logsTab: 'logs.tab',
} as const
/** 当前存储键前缀 */
const CURRENT_PREFIX = 'ledgerly.'
/** 上一代存储键前缀(品牌改名前的 finance.) */
const LEGACY_PREFIX = 'finance.'
/** 模块加载时迁移上一代 finance.* 偏好键到 ledgerly.*,保证老用户偏好不丢失 */
function migrateLegacyPrefixedKeys(): void {
Object.values(STORAGE_KEYS).forEach((key) => {
if (!key.startsWith(CURRENT_PREFIX)) return
migrateKey(LEGACY_PREFIX + key.slice(CURRENT_PREFIX.length), key)
})
}
migrateLegacyPrefixedKeys()
/** 生成指定路由的滚动位置存储键 */
export function scrollKey(path: string): string {
return `${STORAGE_KEYS.scrollPrefix}${path}`