feat: 用户信息完善 + 一起记功能
- users 表添加 nickname、avatar_url 字段 - 用户信息 API(GET/PUT /me)+ 头像上传(multer) - 头像通过 API 路由获取(公开,不经过 auth) - 登录接口返回用户昵称和头像 - 用户信息 Store + 个人资料编辑页面 - 我的页面和首页显示真实用户信息 - 群组表(groups、group_members)+ transactions 添加 group_id - 群组 API(创建/加入/退出/解散) - 交易和统计 API 支持 group_id 视图切换 - 群组客户端 Store + 身份切换 - 群组管理页面 - App 初始化群组 Store - UPLOAD_DIR 配置化 - Node.js 备份替代 mysqldump - 统一前端 BASE_URL(config.ts) - uploads 加入 .gitignore - 修复 trust proxy 警告
This commit is contained in:
@@ -34,6 +34,55 @@ async function runMigrations(conn: mysql.Connection) {
|
||||
await conn.query('ALTER TABLE budgets ADD UNIQUE KEY uk_user_month (user_id, month)')
|
||||
console.log('[DB] budgets.user_id added')
|
||||
}
|
||||
|
||||
// users 表添加 nickname 和 avatar_url
|
||||
const hasNickname = await columnExists(conn, 'users', 'nickname')
|
||||
if (!hasNickname) {
|
||||
console.log('[DB] Migrating: adding nickname to users')
|
||||
await conn.query("ALTER TABLE users ADD COLUMN nickname VARCHAR(50) DEFAULT '小菜' COMMENT '用户昵称'")
|
||||
}
|
||||
const hasAvatarUrl = await columnExists(conn, 'users', 'avatar_url')
|
||||
if (!hasAvatarUrl) {
|
||||
console.log('[DB] Migrating: adding avatar_url to users')
|
||||
await conn.query("ALTER TABLE users ADD COLUMN avatar_url VARCHAR(500) DEFAULT '' COMMENT '头像URL'")
|
||||
}
|
||||
|
||||
// 群组表 + transactions.group_id
|
||||
const hasGroupId = await columnExists(conn, 'transactions', 'group_id')
|
||||
console.log(`[DB] transactions.group_id exists: ${hasGroupId}`)
|
||||
if (!hasGroupId) {
|
||||
console.log('[DB] Migrating: creating groups tables and adding group_id')
|
||||
|
||||
await conn.query(`
|
||||
CREATE TABLE IF NOT EXISTS \`groups\` (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
invite_code VARCHAR(10) UNIQUE NOT NULL,
|
||||
created_by INT NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
|
||||
`)
|
||||
|
||||
await conn.query(`
|
||||
CREATE TABLE IF NOT EXISTS group_members (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
group_id INT NOT NULL,
|
||||
user_id INT NOT NULL,
|
||||
role ENUM('owner', 'member') DEFAULT 'member',
|
||||
nickname VARCHAR(50) DEFAULT '',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY uk_group_user (group_id, user_id),
|
||||
FOREIGN KEY (group_id) REFERENCES \`groups\`(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
|
||||
`)
|
||||
|
||||
await conn.query("ALTER TABLE transactions ADD COLUMN group_id INT DEFAULT NULL COMMENT '群组标签'")
|
||||
await conn.query("ALTER TABLE transactions ADD INDEX idx_group_date (group_id, date)")
|
||||
console.log('[DB] Groups migration complete')
|
||||
}
|
||||
}
|
||||
|
||||
export async function initDatabase() {
|
||||
|
||||
Reference in New Issue
Block a user