feat: 小菜记账 v1.0 - 完整功能实现
核心功能: - 记账CRUD(支出/收入/分类/备注/日期) - 统计分析(概览/分类占比/每日趋势) - 预算管理(按月设置/进度条/超支提醒) - 数据导出CSV 安全与认证: - HMAC-SHA256签名token认证 - 用户数据隔离 - 输入验证与错误处理 - CORS配置 前端优化: - 骨架屏加载 - 账单按日期分组 - 预算页面重构(快捷预设+Numpad) - SvgIcon组件(H5+微信双端适配) - 下拉刷新 后端优化: - 共享日期工具函数 - 数据库连接池优化 - 健康检查端点 - 优雅关闭处理 技术栈: - 前端:Uni-app (Vue 3 + Pinia) - 后端:Node.js + Express + MySQL
This commit is contained in:
51
server/src/db/init.ts
Normal file
51
server/src/db/init.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
import mysql from 'mysql2/promise'
|
||||
import pool from './connection'
|
||||
import { readFileSync } from 'fs'
|
||||
import { join } from 'path'
|
||||
|
||||
export async function initDatabase() {
|
||||
const dbName = process.env.DB_NAME || 'xiaocai'
|
||||
|
||||
// 先用不指定数据库的连接,确保数据库存在
|
||||
const bootstrap = await mysql.createConnection({
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
user: process.env.DB_USER || 'xiaocai',
|
||||
password: process.env.DB_PASSWORD || 'xiaocai123',
|
||||
multipleStatements: true,
|
||||
})
|
||||
|
||||
await bootstrap.query(`CREATE DATABASE IF NOT EXISTS \`${dbName}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`)
|
||||
await bootstrap.end()
|
||||
|
||||
// 用独立连接执行建表和填充(需要 multipleStatements)
|
||||
const initConn = await mysql.createConnection({
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
user: process.env.DB_USER || 'xiaocai',
|
||||
password: process.env.DB_PASSWORD || 'xiaocai123',
|
||||
database: dbName,
|
||||
multipleStatements: true,
|
||||
})
|
||||
try {
|
||||
const schemaPath = join(__dirname, 'schema.sql')
|
||||
const seedPath = join(__dirname, 'seed.sql')
|
||||
|
||||
const schema = readFileSync(schemaPath, 'utf-8')
|
||||
const cleanSchema = schema
|
||||
.replace(/CREATE DATABASE.*?;/gi, '')
|
||||
.replace(/USE\s+\w+;/gi, '')
|
||||
await initConn.query(cleanSchema)
|
||||
|
||||
const seed = readFileSync(seedPath, 'utf-8')
|
||||
await initConn.query(seed)
|
||||
|
||||
console.log('[DB] Database initialized')
|
||||
} catch (err: any) {
|
||||
if (err.code === 'ER_DUP_ENTRY' || err.errno === 1062) {
|
||||
console.log('[DB] Already initialized, skipping seed')
|
||||
} else {
|
||||
console.error('[DB] Init failed:', err.message)
|
||||
}
|
||||
} finally {
|
||||
await initConn.end()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user