From 4920620d2cfa237bf6533b0227a398b539de3c36 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Thu, 9 Apr 2026 15:37:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=AA=8C=E8=AF=81=E6=8A=A5?= =?UTF-8?q?=E5=90=8D=E4=BF=A1=E6=81=AF=E5=AF=B9=E8=AF=9D=E6=A1=86=E8=BD=A6?= =?UTF-8?q?=E7=89=8C=E5=8F=B7=E8=BE=93=E5=85=A5=E5=B8=83=E5=B1=80=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E6=A0=87=E7=AD=BE=E5=92=8C=E8=BE=93=E5=85=A5=E6=A1=86?= =?UTF-8?q?=E5=9C=A8=E5=90=8C=E4=B8=80=E8=A1=8C=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .version | 1 + Dockerfile | 10 +- PRIZE-FEATURE.md | 0 backend/.env.example | 17 +- backend/init-admin.js | 26 +- backend/middleware/upload.js | 39 +- backend/migrations/0000-init-schema.js | 84 + backend/migrations/0001-add-danmaku-fields.js | 24 + .../migrations/0002-add-sponsor-sortorder.js | 18 + backend/migrations/0003-add-checkin-fields.js | 23 + backend/migrations/0004-add-prize-table.js | 31 + backend/migrations/README.md | 190 ++ backend/migrations/index.js | 141 ++ backend/models/Activity.js | 9 + backend/models/Prize.js | 35 + backend/models/Sponsor.js | 7 +- backend/models/db.js | 23 +- backend/models/index.js | 9 +- backend/package-lock.json | 724 ++++---- backend/package.json | 6 +- backend/routes/activity.js | 17 +- backend/routes/admin.js | 96 +- backend/server.js | 29 +- build.bat | 44 +- build.sh | 44 +- clean-db.bat | 19 + docker-compose.yml | 66 +- docker-entrypoint.sh | 18 + frontend/map-test.html | 201 --- frontend/public/avatars/wang.png | Bin 0 -> 223686 bytes frontend/src/api/index.js | 36 +- frontend/src/router/index.js | 7 +- frontend/src/views/ActivityDetail.vue | 1442 --------------- .../src/views/ActivityDetail/DanmakuDemo.vue | 292 +++ .../views/ActivityDetail/SponsorDanmaku.vue | 266 +++ frontend/src/views/ActivityDetail/index.vue | 638 +++++++ frontend/src/views/ActivityDetail/styles.css | 936 ++++++++++ .../views/ActivityDetail/useActivityDetail.js | 256 +++ frontend/src/views/ActivityDetail_fixed.vue | 1577 ----------------- frontend/src/views/LandingPage.vue | 62 +- frontend/src/views/Register.vue | 2 +- frontend/src/views/admin/ActivityManage.vue | 390 +++- .../src/views/admin/prize-manage-styles.css | 179 ++ frontend/src/views/admin/usePrizeManage.js | 153 ++ frontend/src/views/timeline-data.js | 417 +++++ migrate.bat | 33 + migrate.sh | 30 + 签到功能说明.md | 53 - 48 files changed, 4804 insertions(+), 3916 deletions(-) create mode 100644 .version create mode 100644 PRIZE-FEATURE.md create mode 100644 backend/migrations/0000-init-schema.js create mode 100644 backend/migrations/0001-add-danmaku-fields.js create mode 100644 backend/migrations/0002-add-sponsor-sortorder.js create mode 100644 backend/migrations/0003-add-checkin-fields.js create mode 100644 backend/migrations/0004-add-prize-table.js create mode 100644 backend/migrations/README.md create mode 100644 backend/migrations/index.js create mode 100644 backend/models/Prize.js create mode 100644 clean-db.bat delete mode 100644 frontend/map-test.html create mode 100644 frontend/public/avatars/wang.png delete mode 100644 frontend/src/views/ActivityDetail.vue create mode 100644 frontend/src/views/ActivityDetail/DanmakuDemo.vue create mode 100644 frontend/src/views/ActivityDetail/SponsorDanmaku.vue create mode 100644 frontend/src/views/ActivityDetail/index.vue create mode 100644 frontend/src/views/ActivityDetail/styles.css create mode 100644 frontend/src/views/ActivityDetail/useActivityDetail.js delete mode 100644 frontend/src/views/ActivityDetail_fixed.vue create mode 100644 frontend/src/views/admin/prize-manage-styles.css create mode 100644 frontend/src/views/admin/usePrizeManage.js create mode 100644 frontend/src/views/timeline-data.js create mode 100644 migrate.bat create mode 100644 migrate.sh delete mode 100644 签到功能说明.md diff --git a/.version b/.version new file mode 100644 index 0000000..7813681 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +5 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 8049fbe..ae1a5e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,14 +20,14 @@ FROM node:18-alpine WORKDIR /app -# 安装 dumb-init 和 envsubst -RUN apk add --no-cache dumb-init gettext +# 安装 dumb-init、envsubst 和 SQLite 编译依赖 +RUN apk add --no-cache dumb-init gettext python3 make g++ sqlite-dev # 复制后端依赖文件 COPY backend/package*.json ./ # 安装后端依赖(仅生产依赖) -RUN npm ci --only=production +RUN npm install --only=production # 复制后端源码 COPY backend/ ./ @@ -35,8 +35,8 @@ COPY backend/ ./ # 从前端构建阶段复制构建产物 COPY --from=frontend-builder /app/frontend/dist ./public -# 创建上传目录 -RUN mkdir -p uploads +# 创建上传和数据目录 +RUN mkdir -p uploads data # 复制启动脚本 COPY docker-entrypoint.sh /usr/local/bin/ diff --git a/PRIZE-FEATURE.md b/PRIZE-FEATURE.md new file mode 100644 index 0000000..e69de29 diff --git a/backend/.env.example b/backend/.env.example index 8ff80e7..9796360 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,17 +1,6 @@ PORT=3000 -DB_HOST=localhost -DB_USER=root -DB_PASSWORD=your-db-password -DB_NAME=quanyoumi JWT_SECRET=your-secret-key-change-in-production -# MinIO 配置 -MINIO_ENDPOINT=localhost # 后端连接 MinIO 的地址 -MINIO_PORT=9000 -MINIO_USE_SSL=false -MINIO_ACCESS_KEY=jFywUsaCb4zNr2LV7hTP -MINIO_SECRET_KEY=minioadmin -MINIO_BUCKET=quanyoumi -# MINIO_PUBLIC_URL(可选):前端访问文件的公开地址,不填则自动用 MINIO_ENDPOINT 拼接 -# 生产环境如果用了反向代理(如 Nginx),填写外网地址,例如:https://cdn.yourdomain.com -# MINIO_PUBLIC_URL=http://localhost:9000 +# 高德地图配置 +AMAP_KEY=your-amap-key +AMAP_SECURITY_CODE=your-amap-security-code diff --git a/backend/init-admin.js b/backend/init-admin.js index f474dfa..9b60001 100644 --- a/backend/init-admin.js +++ b/backend/init-admin.js @@ -5,8 +5,21 @@ const { Admin, sequelize } = require('./models'); async function initAdmin() { try { + // 使用 force: false 避免 alter 表时的问题 + // 如果表不存在则创建,存在则跳过 await sequelize.sync({ force: false }); + // 检查是否已存在管理员账号 + const existingAdmin = await Admin.findOne({ where: { username: 'admin' } }); + + if (existingAdmin) { + console.log('✓ 管理员账号已存在'); + console.log(' 用户名: admin'); + console.log(' 提示: 如需重置密码,请删除数据库文件后重新初始化'); + process.exit(0); + return; + } + const hashedPassword = bcrypt.hashSync('admin123', 10); await Admin.create({ username: 'admin', @@ -14,12 +27,17 @@ async function initAdmin() { name: '管理员' }); - console.log('管理员账号创建成功'); - console.log('用户名: admin'); - console.log('密码: admin123'); + console.log('✓ 管理员账号创建成功'); + console.log(' 用户名: admin'); + console.log(' 密码: admin123'); process.exit(0); } catch (error) { - console.error('创建失败:', error.message); + console.error('✗ 初始化失败:', error.message); + if (error.name === 'SequelizeUniqueConstraintError') { + console.error(' 原因: 管理员账号已存在'); + } else { + console.error(' 详细错误:', error); + } process.exit(1); } } diff --git a/backend/middleware/upload.js b/backend/middleware/upload.js index b852c14..d51b460 100644 --- a/backend/middleware/upload.js +++ b/backend/middleware/upload.js @@ -1,11 +1,27 @@ const multer = require('multer'); const path = require('path'); -const { v4: uuidv4 } = require('uuid'); -const { uploadBuffer } = require('../utils/minio'); +const fs = require('fs'); + +// 确保上传目录存在 +const uploadDir = path.join(__dirname, '../uploads'); +if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); +} + +// 配置本地存储 +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, uploadDir); + }, + filename: (req, file, cb) => { + const uniqueName = `${Date.now()}-${Math.random().toString(36).substring(7)}${path.extname(file.originalname)}`; + cb(null, uniqueName); + } +}); -// 使用内存存储,文件不落盘,不限制大小 const upload = multer({ - storage: multer.memoryStorage(), + storage, + limits: { fileSize: 50 * 1024 * 1024 }, // 50MB fileFilter: (req, file, cb) => { const extname = /jpeg|jpg|png|gif|mp4|mov|avi/.test( path.extname(file.originalname).toLowerCase() @@ -16,15 +32,14 @@ const upload = multer({ } }); -// 将 req.files 或 req.file 上传到 MinIO,返回 url 数组或单个 url -const uploadFilesToMinio = async (files) => { +// 返回文件访问URL +const getFileUrls = (files) => { const list = Array.isArray(files) ? files : [files]; - return Promise.all(list.map(async (file) => { - const ext = path.extname(file.originalname).toLowerCase(); - const filename = `${Date.now()}-${uuidv4()}${ext}`; - const url = await uploadBuffer(file.buffer, filename, file.mimetype); - return { ...file, filename, url }; + return list.map(file => ({ + url: `/uploads/${file.filename}`, + filename: file.filename, + mimetype: file.mimetype })); }; -module.exports = { upload, uploadFilesToMinio }; +module.exports = { upload, getFileUrls }; diff --git a/backend/migrations/0000-init-schema.js b/backend/migrations/0000-init-schema.js new file mode 100644 index 0000000..d5d1faa --- /dev/null +++ b/backend/migrations/0000-init-schema.js @@ -0,0 +1,84 @@ +/** + * 迁移: 初始化数据库结构(确保所有表和字段存在) + * 版本: 0000 + * 日期: 2025-01-09 + */ + +module.exports = { + async up(manager) { + console.log(' - 检查并创建所有必需的表和字段...'); + + // Activities 表的额外字段 + const activityFields = [ + { name: 'registrationEnabled', sql: 'ALTER TABLE Activities ADD COLUMN registrationEnabled INTEGER DEFAULT 1;' }, + { name: 'coverImage', sql: 'ALTER TABLE Activities ADD COLUMN coverImage TEXT;' }, + { name: 'price', sql: 'ALTER TABLE Activities ADD COLUMN price DECIMAL(10, 2) DEFAULT 0;' }, + { name: 'budget', sql: 'ALTER TABLE Activities ADD COLUMN budget DECIMAL(10, 2) DEFAULT 0;' }, + { name: 'locationLat', sql: 'ALTER TABLE Activities ADD COLUMN locationLat DECIMAL(10, 7);' }, + { name: 'locationLng', sql: 'ALTER TABLE Activities ADD COLUMN locationLng DECIMAL(10, 7);' } + ]; + + for (const field of activityFields) { + await manager.executeSql(field.sql); + } + + // Registrations 表的额外字段 + const registrationFields = [ + { name: 'peopleCount', sql: 'ALTER TABLE Registrations ADD COLUMN peopleCount INTEGER DEFAULT 1;' }, + { name: 'note', sql: 'ALTER TABLE Registrations ADD COLUMN note TEXT;' } + ]; + + for (const field of registrationFields) { + await manager.executeSql(field.sql); + } + + // Expenses 表的额外字段 + const expenseFields = [ + { name: 'category', sql: 'ALTER TABLE Expenses ADD COLUMN category TEXT;' }, + { name: 'receipt', sql: 'ALTER TABLE Expenses ADD COLUMN receipt TEXT;' }, + { name: 'note', sql: 'ALTER TABLE Expenses ADD COLUMN note TEXT;' }, + { name: 'media', sql: 'ALTER TABLE Expenses ADD COLUMN media TEXT;' } + ]; + + for (const field of expenseFields) { + await manager.executeSql(field.sql); + } + + // Photos 表的额外字段 + const photoFields = [ + { name: 'description', sql: 'ALTER TABLE Photos ADD COLUMN description TEXT;' }, + { name: 'uploadedBy', sql: 'ALTER TABLE Photos ADD COLUMN uploadedBy TEXT;' }, + { name: 'status', sql: 'ALTER TABLE Photos ADD COLUMN status TEXT DEFAULT "approved";' } + ]; + + for (const field of photoFields) { + await manager.executeSql(field.sql); + } + + // Sponsors 表的额外字段 + const sponsorFields = [ + { name: 'logo', sql: 'ALTER TABLE Sponsors ADD COLUMN logo TEXT;' }, + { name: 'type', sql: 'ALTER TABLE Sponsors ADD COLUMN type TEXT DEFAULT "sponsor";' }, + { name: 'link', sql: 'ALTER TABLE Sponsors ADD COLUMN link TEXT;' } + ]; + + for (const field of sponsorFields) { + await manager.executeSql(field.sql); + } + + // Admins 表的额外字段 + const adminFields = [ + { name: 'name', sql: 'ALTER TABLE Admins ADD COLUMN name TEXT;' } + ]; + + for (const field of adminFields) { + await manager.executeSql(field.sql); + } + + console.log(' - 初始化完成'); + }, + + async down(manager) { + console.log(' - 回滚不支持'); + } +}; diff --git a/backend/migrations/0001-add-danmaku-fields.js b/backend/migrations/0001-add-danmaku-fields.js new file mode 100644 index 0000000..3785689 --- /dev/null +++ b/backend/migrations/0001-add-danmaku-fields.js @@ -0,0 +1,24 @@ +/** + * 迁移: 添加弹幕功能字段 + * 版本: 0001 + * 日期: 2025-01-09 + */ + +module.exports = { + async up(manager) { + console.log(' - 添加 danmakuEnabled 字段...'); + await manager.executeSql(` + ALTER TABLE Activities ADD COLUMN danmakuEnabled INTEGER DEFAULT 0; + `); + + console.log(' - 添加 danmakuContent 字段...'); + await manager.executeSql(` + ALTER TABLE Activities ADD COLUMN danmakuContent TEXT; + `); + }, + + async down(manager) { + // SQLite 不支持 DROP COLUMN,需要重建表 + console.log(' - 回滚不支持,请手动处理'); + } +}; diff --git a/backend/migrations/0002-add-sponsor-sortorder.js b/backend/migrations/0002-add-sponsor-sortorder.js new file mode 100644 index 0000000..f9d36a9 --- /dev/null +++ b/backend/migrations/0002-add-sponsor-sortorder.js @@ -0,0 +1,18 @@ +/** + * 迁移: 添加赞助商排序字段 + * 版本: 0002 + * 日期: 2025-01-09 + */ + +module.exports = { + async up(manager) { + console.log(' - 添加 Sponsors.sortOrder 字段...'); + await manager.executeSql(` + ALTER TABLE Sponsors ADD COLUMN sortOrder INTEGER DEFAULT 0; + `); + }, + + async down(manager) { + console.log(' - 回滚不支持'); + } +}; diff --git a/backend/migrations/0003-add-checkin-fields.js b/backend/migrations/0003-add-checkin-fields.js new file mode 100644 index 0000000..16b408d --- /dev/null +++ b/backend/migrations/0003-add-checkin-fields.js @@ -0,0 +1,23 @@ +/** + * 迁移: 添加签到功能字段 + * 版本: 0003 + * 日期: 2025-01-09 + */ + +module.exports = { + async up(manager) { + console.log(' - 添加 Registrations.checkInStatus 字段...'); + await manager.executeSql(` + ALTER TABLE Registrations ADD COLUMN checkInStatus INTEGER DEFAULT 0; + `); + + console.log(' - 添加 Registrations.checkInTime 字段...'); + await manager.executeSql(` + ALTER TABLE Registrations ADD COLUMN checkInTime DATETIME; + `); + }, + + async down(manager) { + console.log(' - 回滚不支持'); + } +}; diff --git a/backend/migrations/0004-add-prize-table.js b/backend/migrations/0004-add-prize-table.js new file mode 100644 index 0000000..cfa4853 --- /dev/null +++ b/backend/migrations/0004-add-prize-table.js @@ -0,0 +1,31 @@ +/** + * 迁移: 添加奖品表 + * 版本: 0004 + * 日期: 2025-01-10 + */ + +module.exports = { + async up(manager) { + console.log(' - 创建 Prizes 表...'); + + await manager.executeSql(` + CREATE TABLE IF NOT EXISTS Prizes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + activityId INTEGER NOT NULL, + name TEXT NOT NULL, + level TEXT NOT NULL CHECK(level IN ('一等奖', '二等奖', '三等奖', '参与奖', '伴手礼')), + description TEXT, + image TEXT, + quantity INTEGER DEFAULT 1, + sortOrder INTEGER DEFAULT 0, + createdAt DATETIME DEFAULT CURRENT_TIMESTAMP, + updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP + ); + `); + }, + + async down(manager) { + console.log(' - 删除 Prizes 表...'); + await manager.executeSql('DROP TABLE IF EXISTS Prizes;'); + } +}; diff --git a/backend/migrations/README.md b/backend/migrations/README.md new file mode 100644 index 0000000..dd56b23 --- /dev/null +++ b/backend/migrations/README.md @@ -0,0 +1,190 @@ +# 数据库迁移系统 + +## 概述 + +本项目使用版本化的数据库迁移系统,支持增量更新和自动同步。 + +## 特性 + +- ✅ 版本管理:每个迁移有唯一版本号 +- ✅ 增量执行:只执行未执行的迁移 +- ✅ 自动运行:服务器启动时自动执行迁移 +- ✅ 幂等性:重复执行不会出错 +- ✅ 迁移记录:记录所有已执行的迁移 + +## 迁移文件命名规范 + +``` +XXXX-description.js +``` + +- `XXXX`: 4位数字版本号(如 0001, 0002) +- `description`: 迁移描述(使用短横线分隔) + +示例: +- `0001-add-danmaku-fields.js` +- `0002-add-user-avatar.js` + +## 创建新迁移 + +### 1. 创建迁移文件 + +在 `backend/migrations/` 目录下创建新文件: + +```javascript +/** + * 迁移: 添加用户头像字段 + * 版本: 0002 + * 日期: 2025-01-09 + */ + +module.exports = { + async up(manager) { + console.log(' - 添加 avatar 字段...'); + await manager.executeSql(` + ALTER TABLE Users ADD COLUMN avatar TEXT; + `); + }, + + async down(manager) { + // 回滚逻辑(可选) + console.log(' - 回滚不支持'); + } +}; +``` + +### 2. 迁移方法 + +#### `up(manager)` - 升级 +执行数据库变更的方法。 + +可用的 manager 方法: +- `executeSql(sql)`: 执行SQL语句 +- `db`: 直接访问数据库连接 + +#### `down(manager)` - 回滚(可选) +回滚数据库变更的方法。 + +注意:SQLite 不支持 DROP COLUMN,回滚可能需要重建表。 + +## 执行迁移 + +### 自动执行(推荐) + +服务器启动时会自动执行所有未执行的迁移: + +```bash +# 开发环境 +cd backend +npm start + +# 生产环境(Docker) +docker-compose up -d +# 或 +docker-compose restart +``` + +### 手动执行 + +#### 在容器内执行: + +```bash +# Windows +migrate.bat + +# Linux/Mac +chmod +x migrate.sh +./migrate.sh +``` + +#### 直接在容器中执行: + +```bash +docker exec quanyoumi-app node /app/backend/migrations/index.js +``` + +## 迁移状态 + +迁移执行记录保存在 `migrations` 表中: + +```sql +SELECT * FROM migrations; +``` + +输出示例: +``` +id | version | name | executed_at +---+---------+-----------------------+--------------------- +1 | 1 | add-danmaku-fields | 2025-01-09 10:30:00 +2 | 2 | add-user-avatar | 2025-01-09 11:00:00 +``` + +## 常见问题 + +### Q: 迁移失败怎么办? + +A: 检查错误日志,修复问题后重新启动服务器。已执行的迁移不会重复执行。 + +### Q: 如何回滚迁移? + +A: 目前不支持自动回滚。如需回滚,请手动修改数据库或创建新的迁移来撤销更改。 + +### Q: 可以修改已执行的迁移吗? + +A: 不建议。已执行的迁移不应修改。如需更改,请创建新的迁移。 + +### Q: 迁移在什么时候执行? + +A: 服务器启动时自动执行。也可以手动运行 `migrate.bat` 或 `migrate.sh`。 + +## 最佳实践 + +1. **版本号递增**:新迁移的版本号应大于所有现有迁移 +2. **描述清晰**:文件名和注释应清楚说明迁移目的 +3. **测试迁移**:在开发环境测试后再部署到生产环境 +4. **幂等性**:迁移应该可以安全地重复执行 +5. **小步迭代**:每个迁移只做一件事,便于追踪和回滚 + +## 示例 + +### 添加新字段 + +```javascript +module.exports = { + async up(manager) { + await manager.executeSql(` + ALTER TABLE Activities ADD COLUMN featured INTEGER DEFAULT 0; + `); + } +}; +``` + +### 创建新表 + +```javascript +module.exports = { + async up(manager) { + await manager.executeSql(` + CREATE TABLE IF NOT EXISTS Comments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + activityId INTEGER NOT NULL, + userId INTEGER NOT NULL, + content TEXT NOT NULL, + createdAt DATETIME DEFAULT CURRENT_TIMESTAMP + ); + `); + } +}; +``` + +### 修改数据 + +```javascript +module.exports = { + async up(manager) { + await manager.executeSql(` + UPDATE Activities SET status = 'completed' WHERE endTime < datetime('now'); + `); + } +}; +``` diff --git a/backend/migrations/index.js b/backend/migrations/index.js new file mode 100644 index 0000000..0dbc3d9 --- /dev/null +++ b/backend/migrations/index.js @@ -0,0 +1,141 @@ +const sqlite3 = require('sqlite3').verbose(); +const path = require('path'); +const fs = require('fs'); + +const dbPath = path.join(__dirname, '..', 'data', 'database.sqlite'); +const migrationsDir = __dirname; + +class MigrationManager { + constructor() { + this.db = new sqlite3.Database(dbPath); + } + + // 初始化迁移表 + async initMigrationTable() { + return new Promise((resolve, reject) => { + this.db.run(` + CREATE TABLE IF NOT EXISTS migrations ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + version INTEGER NOT NULL UNIQUE, + name TEXT NOT NULL, + executed_at DATETIME DEFAULT CURRENT_TIMESTAMP + ) + `, (err) => { + if (err) reject(err); + else resolve(); + }); + }); + } + + // 获取已执行的迁移版本 + async getExecutedMigrations() { + return new Promise((resolve, reject) => { + this.db.all('SELECT version FROM migrations ORDER BY version', (err, rows) => { + if (err) reject(err); + else resolve(rows.map(r => r.version)); + }); + }); + } + + // 记录迁移执行 + async recordMigration(version, name) { + return new Promise((resolve, reject) => { + this.db.run( + 'INSERT INTO migrations (version, name) VALUES (?, ?)', + [version, name], + (err) => { + if (err) reject(err); + else resolve(); + } + ); + }); + } + + // 执行SQL语句 + async executeSql(sql) { + return new Promise((resolve, reject) => { + this.db.run(sql, (err) => { + if (err) { + // 忽略字段已存在的错误 + if (err.message.includes('duplicate column name')) { + resolve(); + } else { + reject(err); + } + } else { + resolve(); + } + }); + }); + } + + // 加载所有迁移文件 + loadMigrations() { + const files = fs.readdirSync(migrationsDir) + .filter(f => f.match(/^\d{4}-.*\.js$/) && f !== 'index.js') + .sort(); + + return files.map(file => { + const version = parseInt(file.split('-')[0]); + const name = file.replace(/^\d{4}-/, '').replace('.js', ''); + const migration = require(path.join(migrationsDir, file)); + return { version, name, file, migration }; + }); + } + + // 执行迁移 + async runMigrations() { + try { + console.log('🔄 开始数据库迁移...\n'); + + // 初始化迁移表 + await this.initMigrationTable(); + + // 获取已执行的迁移 + const executed = await this.getExecutedMigrations(); + console.log(`📊 已执行迁移: ${executed.length} 个`); + + // 加载所有迁移文件 + const migrations = this.loadMigrations(); + console.log(`📁 发现迁移文件: ${migrations.length} 个\n`); + + // 执行未执行的迁移 + let count = 0; + for (const { version, name, file, migration } of migrations) { + if (!executed.includes(version)) { + console.log(`⏳ 执行迁移 [${version}] ${name}...`); + + try { + await migration.up(this); + await this.recordMigration(version, name); + console.log(`✅ 迁移 [${version}] ${name} 完成\n`); + count++; + } catch (error) { + console.error(`❌ 迁移 [${version}] ${name} 失败:`, error.message); + throw error; + } + } else { + console.log(`⏭️ 跳过已执行的迁移 [${version}] ${name}`); + } + } + + console.log(`\n✨ 迁移完成!共执行 ${count} 个新迁移`); + + } catch (error) { + console.error('\n❌ 迁移失败:', error); + throw error; + } finally { + this.db.close(); + } + } +} + +// 如果直接运行此文件 +if (require.main === module) { + const manager = new MigrationManager(); + manager.runMigrations() + .then(() => process.exit(0)) + .catch(() => process.exit(1)); +} + +module.exports = MigrationManager; diff --git a/backend/models/Activity.js b/backend/models/Activity.js index c388c3d..877c962 100644 --- a/backend/models/Activity.js +++ b/backend/models/Activity.js @@ -38,6 +38,15 @@ const Activity = sequelize.define('Activity', { type: DataTypes.DECIMAL(10, 2), defaultValue: 0, comment: '活动预算' + }, + danmakuEnabled: { + type: DataTypes.BOOLEAN, + defaultValue: false, + comment: '弹幕开关' + }, + danmakuContent: { + type: DataTypes.TEXT, + comment: '弹幕内容JSON' } }); diff --git a/backend/models/Prize.js b/backend/models/Prize.js new file mode 100644 index 0000000..2a5d122 --- /dev/null +++ b/backend/models/Prize.js @@ -0,0 +1,35 @@ +const { DataTypes } = require('sequelize'); +const sequelize = require('./db'); + +const Prize = sequelize.define('Prize', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + activityId: { + type: DataTypes.INTEGER, + allowNull: false + }, + name: { + type: DataTypes.STRING, + allowNull: false + }, + level: { + type: DataTypes.ENUM('一等奖', '二等奖', '三等奖', '参与奖', '伴手礼'), + allowNull: false + }, + description: DataTypes.TEXT, + image: DataTypes.STRING, + quantity: { + type: DataTypes.INTEGER, + defaultValue: 1 + }, + sortOrder: { + type: DataTypes.INTEGER, + defaultValue: 0, + comment: '排序值,数字越小越靠前' + } +}); + +module.exports = Prize; diff --git a/backend/models/Sponsor.js b/backend/models/Sponsor.js index ab4bbf0..7d78e41 100644 --- a/backend/models/Sponsor.js +++ b/backend/models/Sponsor.js @@ -20,7 +20,12 @@ const Sponsor = sequelize.define('Sponsor', { type: DataTypes.ENUM('title', 'sponsor'), defaultValue: 'sponsor' }, - link: DataTypes.STRING + link: DataTypes.STRING, + sortOrder: { + type: DataTypes.INTEGER, + defaultValue: 0, + comment: '排序值,数字越小越靠前' + } }); module.exports = Sponsor; diff --git a/backend/models/db.js b/backend/models/db.js index 0fc3cc8..88b187e 100644 --- a/backend/models/db.js +++ b/backend/models/db.js @@ -1,14 +1,17 @@ const { Sequelize } = require('sequelize'); +const path = require('path'); +const fs = require('fs'); -const sequelize = new Sequelize( - process.env.DB_NAME || 'quanyoumi', - process.env.DB_USER || 'root', - process.env.DB_PASSWORD || '', - { - host: process.env.DB_HOST || 'localhost', - dialect: 'mysql', - logging: false - } -); +// 确保data目录存在 +const dataDir = path.join(__dirname, '../data'); +if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }); +} + +const sequelize = new Sequelize({ + dialect: 'sqlite', + storage: path.join(dataDir, 'database.sqlite'), + logging: false +}); module.exports = sequelize; diff --git a/backend/models/index.js b/backend/models/index.js index cffc31b..fb667fd 100644 --- a/backend/models/index.js +++ b/backend/models/index.js @@ -4,11 +4,15 @@ const Registration = require('./Registration'); const Expense = require('./Expense'); const Photo = require('./Photo'); const Sponsor = require('./Sponsor'); +const Prize = require('./Prize'); const Admin = require('./Admin'); // 同步数据库 -sequelize.sync({ alter: true }).then(() => { - console.log('数据库同步完成'); +// 使用 force: false 避免 SQLite alter 表时的约束冲突问题 +sequelize.sync({ force: false }).then(() => { + console.log('✓ 数据库同步完成'); +}).catch(err => { + console.error('✗ 数据库同步失败:', err.message); }); module.exports = { @@ -18,5 +22,6 @@ module.exports = { Expense, Photo, Sponsor, + Prize, Admin }; diff --git a/backend/package-lock.json b/backend/package-lock.json index f9035e2..823a4b7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,15 +9,14 @@ "version": "1.0.0", "dependencies": { "bcryptjs": "^2.4.3", + "better-sqlite3": "^11.10.0", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", - "minio": "^8.0.7", "multer": "^1.4.5-lts.1", - "mysql2": "^3.6.0", "sequelize": "^6.33.0", - "uuid": "^9.0.1" + "sql.js": "^1.14.1" }, "devDependencies": { "nodemon": "^3.0.1" @@ -92,21 +91,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", @@ -117,12 +101,43 @@ "node": "18 || 20 || >=22" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmmirror.com/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", "license": "MIT" }, + "node_modules/better-sqlite3": { + "version": "11.10.0", + "resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-11.10.0.tgz", + "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -136,16 +151,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/block-stream2": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/block-stream2/-/block-stream2-2.1.0.tgz", - "integrity": "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==", + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "node_modules/block-stream2/node_modules/readable-stream": { + "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", @@ -209,19 +235,28 @@ "node": ">=8" } }, - "node_modules/browser-or-node": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/browser-or-node/-/browser-or-node-2.1.1.tgz", - "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", - "license": "MIT" - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "engines": { - "node": ">=8.0.0" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/buffer-equal-constant-time": { @@ -393,22 +428,28 @@ "ms": "2.0.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, "engines": { - "node": ">=0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=4.0.0" } }, "node_modules/depd": { @@ -430,6 +471,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", @@ -486,6 +536,15 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", @@ -531,11 +590,14 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } }, "node_modules/express": { "version": "4.22.1", @@ -583,40 +645,11 @@ "url": "https://opencollective.com/express" } }, - "node_modules/fast-xml-builder": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.1.3" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.5.10", - "resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.5.10.tgz", - "integrity": "sha512-go2J2xODMc32hT+4Xr/bBGXMaIoiCwrwp2mMtAvKyvEFW6S/v5Gn2pBmE4nvbwNjGhpcAiOwEv7R6/GZ6XRa9w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.2.1", - "strnum": "^2.2.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" }, "node_modules/fill-range": { "version": "7.1.1", @@ -631,15 +664,6 @@ "node": ">=8" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/finalhandler": { "version": "1.3.2", "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", @@ -676,6 +700,12 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", @@ -700,15 +730,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.2" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -746,6 +767,12 @@ "node": ">= 0.4" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -837,6 +864,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -859,6 +906,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -914,12 +967,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT" - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", @@ -1023,27 +1070,6 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/lru.min": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/lru.min/-/lru.min-1.1.4.tgz", - "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", - "license": "MIT", - "engines": { - "bun": ">=1.0.0", - "deno": ">=1.30.0", - "node": ">=8.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wellwelwel" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1113,6 +1139,18 @@ "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", @@ -1138,39 +1176,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minio": { - "version": "8.0.7", - "resolved": "https://registry.npmmirror.com/minio/-/minio-8.0.7.tgz", - "integrity": "sha512-E737MgufW8CeQAsTAtnEMrxZ9scMSf29kkhZoXzDTKj/Jszzo2SfeZUH9wbDQH2Rsq6TCtl/yQL0+XdVKZansQ==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.4", - "block-stream2": "^2.1.0", - "browser-or-node": "^2.1.1", - "buffer-crc32": "^1.0.0", - "eventemitter3": "^5.0.1", - "fast-xml-parser": "^5.3.4", - "ipaddr.js": "^2.0.1", - "lodash": "^4.17.21", - "mime-types": "^2.1.35", - "query-string": "^7.1.3", - "stream-json": "^1.8.0", - "through2": "^4.0.2", - "xml2js": "^0.5.0 || ^0.6.2" - }, - "engines": { - "node": "^16 || ^18 || >=20" - } - }, - "node_modules/minio/node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", @@ -1183,6 +1188,12 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz", @@ -1229,55 +1240,11 @@ "node": ">= 6.0.0" } }, - "node_modules/mysql2": { - "version": "3.20.0", - "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-3.20.0.tgz", - "integrity": "sha512-eCLUs7BNbgA6nf/MZXsaBO1SfGs0LtLVrJD3WeWq+jPLDWkSufTD+aGMwykfUVPdZnblaUK1a8G/P63cl9FkKg==", - "license": "MIT", - "dependencies": { - "aws-ssl-profiles": "^1.1.2", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.7.2", - "long": "^5.3.2", - "lru.min": "^1.1.4", - "named-placeholders": "^1.1.6", - "sql-escaper": "^1.3.3" - }, - "engines": { - "node": ">= 8.0" - }, - "peerDependencies": { - "@types/node": ">= 8" - } - }, - "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.6", - "resolved": "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.6.tgz", - "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", - "license": "MIT", - "dependencies": { - "lru.min": "^1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", @@ -1288,6 +1255,18 @@ "node": ">= 0.6" } }, + "node_modules/node-abi": { + "version": "3.89.0", + "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/nodemon": { "version": "3.1.14", "resolved": "https://registry.npmmirror.com/nodemon/-/nodemon-3.1.14.tgz", @@ -1385,6 +1364,15 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", @@ -1394,21 +1382,6 @@ "node": ">= 0.8" } }, - "node_modules/path-expression-matcher": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/path-expression-matcher/-/path-expression-matcher-1.3.0.tgz", - "integrity": "sha512-tkolHg8cWjEFA8+TqYGk0w6aNEZVcb7pVxW8KXZpU+ebaBr3s1ogbLssjK1cL74TtEuKl/qy6cb90RnwTFt3kw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/path-to-regexp": { "version": "0.1.13", "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz", @@ -1434,6 +1407,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1460,6 +1460,16 @@ "dev": true, "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/qs": { "version": "6.14.2", "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.2.tgz", @@ -1475,24 +1485,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmmirror.com/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", @@ -1517,6 +1509,21 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", @@ -1583,15 +1590,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", @@ -1728,15 +1726,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/sequelize/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/serve-static": { "version": "1.16.3", "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.3.tgz", @@ -1778,13 +1767,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -1830,6 +1819,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -1843,29 +1877,11 @@ "node": ">=10" } }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/sql-escaper": { - "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/sql-escaper/-/sql-escaper-1.3.3.tgz", - "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==", - "license": "MIT", - "engines": { - "bun": ">=1.0.0", - "deno": ">=2.0.0", - "node": ">=12.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" - } + "node_modules/sql.js": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/sql.js/-/sql.js-1.14.1.tgz", + "integrity": "sha512-gcj8zBWU5cFsi9WUP+4bFNXAyF1iRpA3LLyS/DP5xlrNzGmPIizUeBggKa8DbDwdqaKwUcTEnChtd2grWo/x/A==", + "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", @@ -1876,21 +1892,6 @@ "node": ">= 0.8" } }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmmirror.com/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.9.1", - "resolved": "https://registry.npmmirror.com/stream-json/-/stream-json-1.9.1.tgz", - "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz", @@ -1899,15 +1900,6 @@ "node": ">=10.0.0" } }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1923,17 +1915,14 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/strnum": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/strnum/-/strnum-2.2.3.tgz", - "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/supports-color": { "version": "5.5.0", @@ -1948,16 +1937,41 @@ "node": ">=4" } }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "dependencies": { - "readable-stream": "3" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, - "node_modules/through2/node_modules/readable-stream": { + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", @@ -2009,6 +2023,18 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", @@ -2066,13 +2092,9 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -2105,27 +2127,11 @@ "@types/node": "*" } }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/xtend": { "version": "4.0.2", diff --git a/backend/package.json b/backend/package.json index c4dc3e0..ca4000e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -9,15 +9,15 @@ }, "dependencies": { "bcryptjs": "^2.4.3", + "better-sqlite3": "^11.10.0", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", - "minio": "^8.0.7", "multer": "^1.4.5-lts.1", - "mysql2": "^3.6.0", "sequelize": "^6.33.0", - "uuid": "^9.0.1" + "sql.js": "^1.14.1", + "sqlite3": "^5.1.7" }, "devDependencies": { "nodemon": "^3.0.1" diff --git a/backend/routes/activity.js b/backend/routes/activity.js index 3881fc3..a249cab 100644 --- a/backend/routes/activity.js +++ b/backend/routes/activity.js @@ -1,7 +1,7 @@ const express = require('express'); const router = express.Router(); -const { Activity, Photo, Sponsor, Expense, Registration } = require('../models'); -const { upload, uploadFilesToMinio } = require('../middleware/upload'); +const { Activity, Photo, Sponsor, Expense, Registration, Prize } = require('../models'); +const { upload, getFileUrls } = require('../middleware/upload'); // 获取活动列表 router.get('/activities', async (req, res) => { @@ -23,10 +23,17 @@ router.get('/activities/:id', async (req, res) => { const photos = await Photo.findAll({ where: { activityId: req.params.id, status: 'approved' } }); - const sponsors = await Sponsor.findAll({ where: { activityId: req.params.id } }); + const sponsors = await Sponsor.findAll({ + where: { activityId: req.params.id }, + order: [['sortOrder', 'ASC'], ['id', 'ASC']] + }); const expenses = await Expense.findAll({ where: { activityId: req.params.id } }); + const prizes = await Prize.findAll({ + where: { activityId: req.params.id }, + order: [['sortOrder', 'ASC'], ['id', 'ASC']] + }); - res.json({ activity, photos, sponsors, expenses }); + res.json({ activity, photos, sponsors, expenses, prizes }); } catch (error) { res.status(500).json({ error: error.message }); } @@ -46,7 +53,7 @@ router.get('/activities/:id/expenses', async (req, res) => { router.post('/activities/:id/photos', upload.array('photos', 10), async (req, res) => { try { const { uploadedBy } = req.body; - const uploaded = await uploadFilesToMinio(req.files); + const uploaded = getFileUrls(req.files); const photos = uploaded.map(file => ({ activityId: req.params.id, url: file.url, diff --git a/backend/routes/admin.js b/backend/routes/admin.js index fbdce2d..9640501 100644 --- a/backend/routes/admin.js +++ b/backend/routes/admin.js @@ -3,9 +3,10 @@ const router = express.Router(); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const auth = require('../middleware/auth'); -const { upload, uploadFilesToMinio } = require('../middleware/upload'); -const { deleteFile } = require('../utils/minio'); -const { Admin, Activity, Registration, Expense, Photo, Sponsor } = require('../models'); +const { upload, getFileUrls } = require('../middleware/upload'); +const { Admin, Activity, Registration, Expense, Photo, Sponsor, Prize } = require('../models'); +const fs = require('fs'); +const path = require('path'); // 管理员登录 router.post('/login', async (req, res) => { @@ -100,7 +101,7 @@ router.post('/expenses', auth, upload.array('media', 5), async (req, res) => { let media = []; if (req.files && req.files.length > 0) { - const uploaded = await uploadFilesToMinio(req.files); + const uploaded = getFileUrls(req.files); media = uploaded.map(file => ({ url: file.url, type: file.mimetype.startsWith('video/') ? 'video' : 'image' @@ -152,7 +153,7 @@ router.put('/expenses/:id', auth, upload.array('media', 5), async (req, res) => // 处理新上传的媒体 if (req.files && req.files.length > 0) { - const uploaded = await uploadFilesToMinio(req.files); + const uploaded = getFileUrls(req.files); const newMedia = uploaded.map(file => ({ url: file.url, type: file.mimetype.startsWith('video/') ? 'video' : 'image' @@ -184,7 +185,7 @@ router.delete('/expenses/:id', auth, async (req, res) => { router.post('/photos', auth, upload.array('photos', 10), async (req, res) => { try { const { activityId } = req.body; - const uploaded = await uploadFilesToMinio(req.files); + const uploaded = getFileUrls(req.files); const photos = uploaded.map(file => ({ activityId, url: file.url, @@ -231,11 +232,12 @@ router.delete('/photos/:id', auth, async (req, res) => { return res.status(404).json({ error: '照片不存在' }); } - // 从URL提取文件名 + // 删除本地文件 const filename = photo.url.split('/').pop(); - - // 从MinIO删除文件 - await deleteFile(filename); + const filePath = path.join(__dirname, '../uploads', filename); + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + } // 从数据库删除记录 await photo.destroy(); @@ -249,13 +251,20 @@ router.delete('/photos/:id', auth, async (req, res) => { // 添加赞助商 router.post('/sponsors', auth, upload.single('logo'), async (req, res) => { try { - const { activityId, name, type, link } = req.body; + const { activityId, name, type, link, sortOrder } = req.body; let logo = null; if (req.file) { - const [uploaded] = await uploadFilesToMinio(req.file); + const [uploaded] = getFileUrls(req.file); logo = uploaded.url; } - const sponsor = await Sponsor.create({ activityId, name, logo, type, link }); + const sponsor = await Sponsor.create({ + activityId, + name, + logo, + type, + link, + sortOrder: sortOrder || 0 + }); res.json(sponsor); } catch (error) { res.status(500).json({ error: error.message }); @@ -265,11 +274,15 @@ router.post('/sponsors', auth, upload.single('logo'), async (req, res) => { // 更新赞助商 router.put('/sponsors/:id', auth, upload.single('logo'), async (req, res) => { try { - const { name, type, link } = req.body; + const { name, type, link, sortOrder } = req.body; const updateData = { name, type, link }; + if (sortOrder !== undefined) { + updateData.sortOrder = sortOrder; + } + if (req.file) { - const [uploaded] = await uploadFilesToMinio(req.file); + const [uploaded] = getFileUrls(req.file); updateData.logo = uploaded.url; } @@ -291,4 +304,57 @@ router.delete('/sponsors/:id', auth, async (req, res) => { } }); +// 添加奖品 +router.post('/prizes', auth, upload.single('image'), async (req, res) => { + try { + const { activityId, name, level, description, quantity, sortOrder } = req.body; + let image = null; + if (req.file) { + const [uploaded] = getFileUrls([req.file]); + image = uploaded.url; + } + const prize = await Prize.create({ + activityId, + name, + level, + description, + image, + quantity: quantity || 1, + sortOrder: sortOrder || 0 + }); + res.json(prize); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// 更新奖品 +router.put('/prizes/:id', auth, upload.single('image'), async (req, res) => { + try { + const { name, level, description, quantity, sortOrder } = req.body; + const updateData = { name, level, description, quantity, sortOrder }; + + if (req.file) { + const [uploaded] = getFileUrls([req.file]); + updateData.image = uploaded.url; + } + + await Prize.update(updateData, { where: { id: req.params.id } }); + const prize = await Prize.findByPk(req.params.id); + res.json(prize); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// 删除奖品 +router.delete('/prizes/:id', auth, async (req, res) => { + try { + await Prize.destroy({ where: { id: req.params.id } }); + res.json({ message: '删除成功' }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + module.exports = router; diff --git a/backend/server.js b/backend/server.js index 8812c16..deb2c3e 100644 --- a/backend/server.js +++ b/backend/server.js @@ -9,6 +9,9 @@ const app = express(); app.use(cors()); app.use(express.json()); +// 静态文件服务 - 提供上传的文件 +app.use('/uploads', express.static(path.join(__dirname, 'uploads'))); + // API 路由 app.use('/api', require('./routes/activity')); app.use('/api', require('./routes/registration')); @@ -26,11 +29,25 @@ if (process.env.NODE_ENV === 'production') { } const PORT = process.env.PORT || 3000; -app.listen(PORT, () => { - console.log(`服务器运行在 http://localhost:${PORT}`); - if (process.env.NODE_ENV === 'production') { - console.log('运行模式: 生产环境(前后端一体)'); - } else { - console.log('运行模式: 开发环境(仅后端API)'); + +// 启动服务器前运行数据库迁移 +const MigrationManager = require('./migrations/index'); +const runMigrations = async () => { + try { + const manager = new MigrationManager(); + await manager.runMigrations(); + } catch (error) { + console.error('数据库迁移失败,但服务器将继续启动'); } +}; + +runMigrations().then(() => { + app.listen(PORT, () => { + console.log(`服务器运行在 http://localhost:${PORT}`); + if (process.env.NODE_ENV === 'production') { + console.log('运行模式: 生产环境(前后端一体)'); + } else { + console.log('运行模式: 开发环境(仅后端API)'); + } + }); }); diff --git a/build.bat b/build.bat index baf8326..fb7f8bb 100644 --- a/build.bat +++ b/build.bat @@ -1,10 +1,26 @@ @echo off REM 泉友米车友会 - Docker 构建脚本 (Windows) -REM 版本: 0.0.1 + +REM ========================================== +REM 版本号配置(修改这里即可) +REM ========================================== +set VERSION_FILE=.version +set MAJOR=0 +set MINOR=0 + +REM 读取或初始化补丁版本号 +if exist %VERSION_FILE% ( + set /p PATCH=<%VERSION_FILE% +) else ( + set PATCH=1 +) + +REM 组合完整版本号 +set VERSION=%MAJOR%.%MINOR%.%PATCH% echo ========================================== echo 泉友米车友会 Docker 镜像构建 -echo 版本: 0.0.1 +echo 版本: %VERSION% echo ========================================== REM 检查 Docker 是否安装 @@ -17,7 +33,7 @@ if errorlevel 1 ( echo. echo 开始构建 Docker 镜像... -docker build -t quanyoumi-app:0.0.1 -t quanyoumi-app:latest . +docker build -t quanyoumi-app:%VERSION% -t quanyoumi-app:latest . if errorlevel 1 ( echo. @@ -26,23 +42,30 @@ if errorlevel 1 ( exit /b 1 ) +REM 构建成功后自动递增版本号 +set /a NEXT_PATCH=%PATCH%+1 +echo %NEXT_PATCH%>%VERSION_FILE% + echo. echo ========================================== -echo 构建完成! +echo 构建完成!版本号已更新 echo ========================================== echo. +echo 当前版本: %VERSION% +echo 下次版本: %MAJOR%.%MINOR%.%NEXT_PATCH% +echo. echo 镜像信息: docker images | findstr quanyoumi-app echo. REM 标记镜像到阿里云仓库 echo 正在标记镜像到阿里云仓库... -docker tag quanyoumi-app:0.0.1 registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 +docker tag quanyoumi-app:%VERSION% registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:%VERSION% docker tag quanyoumi-app:latest registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:latest echo. echo 正在推送镜像到阿里云仓库... -docker push registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 +docker push registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:%VERSION% docker push registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:latest if errorlevel 1 ( @@ -58,12 +81,17 @@ echo ========================================== echo 推送完成! echo ========================================== echo. +echo 当前版本: %VERSION% +echo 下次版本: %MAJOR%.%MINOR%.%NEXT_PATCH% +echo. echo 镜像地址: -echo registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 +echo registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:%VERSION% echo registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:latest echo. echo 在 NAS 上使用: -echo docker pull registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 +echo docker pull registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:%VERSION% echo docker-compose up -d echo. +echo 提示: 如需修改主版本号或次版本号,请编辑 build.bat 文件顶部的 MAJOR 和 MINOR 变量 +echo. pause diff --git a/build.sh b/build.sh index 4f4ef91..6a4d37f 100644 --- a/build.sh +++ b/build.sh @@ -1,13 +1,29 @@ #!/bin/bash # 泉友米车友会 - Docker 构建脚本 -# 版本: 0.0.1 set -e +# ========================================== +# 版本号配置(修改这里即可) +# ========================================== +VERSION_FILE=".version" +MAJOR=0 +MINOR=0 + +# 读取或初始化补丁版本号 +if [ -f "$VERSION_FILE" ]; then + PATCH=$(cat "$VERSION_FILE") +else + PATCH=1 +fi + +# 组合完整版本号 +VERSION="$MAJOR.$MINOR.$PATCH" + echo "==========================================" echo "泉友米车友会 Docker 镜像构建" -echo "版本: 0.0.1" +echo "版本: $VERSION" echo "==========================================" # 检查 Docker 是否安装 @@ -19,25 +35,32 @@ fi # 构建镜像 echo "" echo "开始构建 Docker 镜像..." -docker build -t quanyoumi-app:0.0.1 -t quanyoumi-app:latest . +docker build -t quanyoumi-app:$VERSION -t quanyoumi-app:latest . + +# 构建成功后自动递增版本号 +NEXT_PATCH=$((PATCH + 1)) +echo $NEXT_PATCH > "$VERSION_FILE" echo "" echo "==========================================" -echo "构建完成!" +echo "构建完成!版本号已更新" echo "==========================================" echo "" +echo "当前版本: $VERSION" +echo "下次版本: $MAJOR.$MINOR.$NEXT_PATCH" +echo "" echo "镜像信息:" docker images | grep quanyoumi-app echo "" # 标记镜像到阿里云仓库 echo "正在标记镜像到阿里云仓库..." -docker tag quanyoumi-app:0.0.1 registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 +docker tag quanyoumi-app:$VERSION registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:$VERSION docker tag quanyoumi-app:latest registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:latest echo "" echo "正在推送镜像到阿里云仓库..." -docker push registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 +docker push registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:$VERSION docker push registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:latest echo "" @@ -45,11 +68,16 @@ echo "==========================================" echo "推送完成!" echo "==========================================" echo "" +echo "当前版本: $VERSION" +echo "下次版本: $MAJOR.$MINOR.$NEXT_PATCH" +echo "" echo "镜像地址:" -echo " registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1" +echo " registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:$VERSION" echo " registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:latest" echo "" echo "在 NAS 上使用:" -echo " docker pull registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1" +echo " docker pull registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:$VERSION" echo " docker-compose up -d" echo "" +echo "提示: 如需修改主版本号或次版本号,请编辑 build.sh 文件顶部的 MAJOR 和 MINOR 变量" +echo "" diff --git a/clean-db.bat b/clean-db.bat new file mode 100644 index 0000000..947e950 --- /dev/null +++ b/clean-db.bat @@ -0,0 +1,19 @@ +@echo off +echo ========================================== +echo 清理数据库文件 +echo ========================================== + +echo 停止容器... +docker-compose down + +echo 删除数据库文件... +if exist backend\data\database.sqlite ( + del /f backend\data\database.sqlite + echo 数据库文件已删除 +) else ( + echo 数据库文件不存在 +) + +echo. +echo 清理完成!现在可以运行 start.bat 重新启动 +pause diff --git a/docker-compose.yml b/docker-compose.yml index 6797397..f2bb2f2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.8' services: # 应用服务(前端+后端) app: - image: registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.1 + image: registry.cn-hangzhou.aliyuncs.com/yvan329/quanyoumi-app:0.0.2 container_name: quanyoumi-app restart: unless-stopped ports: @@ -11,28 +11,14 @@ services: environment: - NODE_ENV=production - PORT=3000 - # 数据库配置 - - DB_HOST=db - - DB_PORT=3306 - - DB_USER=root - - DB_PASSWORD=quanyoumi2024 - - DB_NAME=quanyoumi # JWT 密钥(请修改为随机字符串) - JWT_SECRET=quanyoumi_jwt_secret_change_this_in_production_2024 # 高德地图配置(必填) - AMAP_KEY=fd5b77136ba34fe6b4f0f86dca7782d9 - AMAP_SECURITY_CODE=7f61638e5635d944a534ff747dc615ac - # MinIO 配置 - - MINIO_ENDPOINT=minio - - MINIO_PORT=9000 - - MINIO_ACCESS_KEY=minioadmin - - MINIO_SECRET_KEY=minioadmin123 - - MINIO_BUCKET=quanyoumi volumes: + - app-data:/app/data - app-uploads:/app/uploads - depends_on: - - db - - minio networks: - quanyoumi-network healthcheck: @@ -42,54 +28,8 @@ services: retries: 3 start_period: 10s - # MySQL 数据库 - db: - image: mysql:8.0 - container_name: quanyoumi-db - restart: unless-stopped - environment: - - MYSQL_ROOT_PASSWORD=quanyoumi2024 - - MYSQL_DATABASE=quanyoumi - - MYSQL_CHARACTER_SET_SERVER=utf8mb4 - - MYSQL_COLLATION_SERVER=utf8mb4_unicode_ci - volumes: - - mysql-data:/var/lib/mysql - - ./database.sql:/docker-entrypoint-initdb.d/init.sql - networks: - - quanyoumi-network - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pquanyoumi2024"] - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s - - # MinIO 对象存储 - minio: - image: minio/minio:latest - container_name: quanyoumi-minio - restart: unless-stopped - command: server /data --console-address ":9001" - environment: - - MINIO_ROOT_USER=minioadmin - - MINIO_ROOT_PASSWORD=minioadmin123 - volumes: - - minio-data:/data - ports: - - "9001:9001" - networks: - - quanyoumi-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 30s - timeout: 20s - retries: 3 - start_period: 10s - volumes: - mysql-data: - driver: local - minio-data: + app-data: driver: local app-uploads: driver: local diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 4511471..2686e46 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -5,6 +5,24 @@ echo "==========================================" echo "泉友米车友会 - 启动中..." echo "==========================================" +# 检查数据库文件 +DB_FILE="/app/data/database.sqlite" +if [ -f "$DB_FILE" ]; then + echo "✓ 发现已存在的数据库文件" + # 检查是否有备份表残留(这会导致sync失败) + if sqlite3 "$DB_FILE" "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_backup%';" 2>/dev/null | grep -q "_backup"; then + echo "⚠ 检测到备份表残留,清理中..." + sqlite3 "$DB_FILE" "SELECT 'DROP TABLE IF EXISTS ' || name || ';' FROM sqlite_master WHERE type='table' AND name LIKE '%_backup%';" | sqlite3 "$DB_FILE" 2>/dev/null || true + echo "✓ 备份表已清理" + fi +else + echo "✓ 首次启动,将创建新数据库" +fi + +# 初始化数据库 +echo "初始化数据库..." +node init-admin.js + # 替换前端 index.html 中的环境变量占位符 if [ -f "/app/public/index.html" ]; then echo "配置高德地图 Key..." diff --git a/frontend/map-test.html b/frontend/map-test.html deleted file mode 100644 index b6e73ed..0000000 --- a/frontend/map-test.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - 高德地图搜索测试 - - - -

高德地图搜索功能测试

- - - -
- -
- -
- - - - diff --git a/frontend/public/avatars/wang.png b/frontend/public/avatars/wang.png new file mode 100644 index 0000000000000000000000000000000000000000..5f0ae7dfa2138a2c212bfd8d15ef065775f10e5d GIT binary patch literal 223686 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�_MU(Q4i7w_f_$Go_pd}>{AKWl{Hx*u_Q*R9{9EWlQ|)!F>67zhY2)RNJ5 z0BGCp^vr7j@?r8uNJsb?j7>6!lUzr_db?4Vi@l3#QZTQ0btOCl)xL~n#iLkvgJLPJBKJ!v zdO~7Rsozk(sDsEt3#Jfx&&VdslFla@tL$C@TT4FJ==0iTQsR$On5;cfp7Rf^-ouPNF}I1&i);+KbL zc7^76FvfBDPY{uXw9Dgu_a8Oyzt87Y{@EA3fz-5Z`LB)T=l{1w!vD90z`xQqZ;_2i z?pc|ie~E&t|Mgim{j$*BT@f*!vAeEJJ9q$_0yYJUldYguMPY{U7 zLorUctPEEh|D}!pj>}=h5GRwpE&{rwdRdzymGeVM%ZOe5k51#}J0-9Na^3c<$bfzV zZ`2ceQ;l_vIE?Uz!!w!R=8xc{e1Zj`4Blj7jlKDFz`F48_BzoqU+(4Ggv4~;iUgxo z*)#jbOUI@Ty#Rbttybm@P0p?!GkkJW*T1FaJxI@S;`y3##DhFJ3pmh4Tem+27qmIp z%k-t{w+h~q%n!fs7tY<&)ml#2=Aic!=uYh!o;I!D1os?vm0~k_dG;Dd;4Er9k}4X& z)TS#>Bjbb8#ujVj!y9@O+f~_~vk7vDL^!rA`4fuCbN-OC+c{LyH-gu#5tuo42tT?B zX)}G>V{UZIBs#&{{T!wg-e0;BVQ9Ue>KU6NEL+3VC~xYMFARlHP_NV@l-1e%^OrP~ zVtX_0>z=K+u-9-$>6*>{Y5~`NBru(5t^5gku+F=*^{jER_cf$AT5B5yXS8Uu{rNkp~y?Atc|W8x#QU-)^MYuaYzO z;OQ2jn>%Z32;#FwHP2%=IUNIDygtIN_U_w@n5gd#QC)ja5h;ew%?Tb1r~a3mSD7*W zEfUhpIJ;N)JT(p8K`}~Dx@&;calh2k1NOeV7D7JY+YtF(9YrWv$nOTHuhGYbJDCSG z3T+@f{-ZE11cWHN!hEw=i0o#CC(H21&3az>NHeYv1*SN}>d@7&#jDBN;X0Zxom4kf z@ZS~nS9CPFi|q3QpvPRdmvM(1{Se%PWPxQH;fXhpooCa?1ZWFw#pjU!GJcvkNUa^7 z7?%3gb?j$SPSQ`2*V`Jj-h1O~&gzFoWl-;WR_&cIcjO3$2!`6;D$0|Urls0G}y&M0{~Qshux_;;nTB~?smX(DdkvIVAvJp_v|ji&OYDXGAGPcPf?c$!Eu2yC zxrThZ{`lFdv_-l2@t9xO%geLj!bM9w@^@@p>hR^7_C1H{Wjsv?itjC3)(eTOuy7Qpc&zc+UhAcb?|$ zh^j6(mgJrCGq!a$TZCx6;#fK3AZqPrVr6k#wm4}I|q>(P%k7OLXD zz4W|T*W(nh-L;-X+O^m^J;j}H8g**O!Lmp!B;NSDmO4#3QYj@|U!+!<5jZ6}@=(oF zZu~plTh_Sm=Pbwwrpn+=x6Nv97+a{hY!LP_Vk{VLywN+r+Fs&*6D=&^rA^Khgi4Dv za(BM32+s?S(0QEb8tYkjpjg6pO`&y)Wkbql1~=^21cY-VbBh(HXqEz`oIv}<)t?T* z@E6#rJXPDNmp4kspzUn2{mp&KHFA8w8dW`_Bc7ZE+Hg@DXMq!{Q9qJM8zhLumP;w?SItO4pLkPh z`>A8E<7Y)1n3e#G$;h|0w~TN5!?46`gS;e9M>lPjCzPE9*^rYfuyRN1hRV6SdQD1v z54fNbI$*R}-PkbM_b2G}zNRbswB(TN?cR{aPaJ3^Sh%W-plBpnKzZP2*iFlHcO$4e z69?^6R3)iL*uXJl;Gk5qs^iC}7m{_e#a)w=6tSrY4pFGO`Y z-Q5d5$hYL|h2US`)W6IlprzgG?(oem*cpMNK2N8GhXx3)a&M4&`%mdnZ-dQdPDNd@ z;47&MmK@yz891b(bPyCG5G~p*3oW;2N>VbKQ;+d~zIME_A@B~Is{lpf5cwril@9c& zj9zQ!!KQ{FdD0(D;rH44ko$J+WbcGY!IcQ{;Mh*vb3Tb*L|?JzxFq=}g@?xE_}Zj- z+0inx8yX2~%s%Eh-UiGgn!iPww_#>=Rr1eu5YvbdI4WeJKWJD5FNsLh>TZ>e4mm!G zEewTK*ALj>VukdC@i3*aEj*1JWB&rpsd3i0NGeb1i}8`04)(F^B1Ie`&A3s12K)5o zXLsDHGy9|tXcY?^_;Ex0^d)}KATh&rB$+EYWsfpmHsUXfX35;Tbxil%$L8>B8sGZ^ zpG6FvIKg(-CWoA2q=SUG2+)K}H~$2&j^-Cw+Js3ClKqbC0S8;v>4d?YB%oMY)aS8? zc)X>jJ^VZ87$YZ&D7-63!$bjYts>Q^M!H(*c}dTTloNhhBgsJJND`9EA8jvN!s_Sm z4XxeBs6`aD%u`o&;IXA6m*aZ+gI18DRz(Rbvd)76w7pfhSQk)?+A_PdOiZNMNrb30 zWIy6at=AF!6BL^01I4Lq&o|(CU9Tp8aI;Y0ORm=Y%8vRFx=MrYkl(xG6CWx5;gET$ z9g=2n6-)%jB!6q3k^SYiZENqic_}D8w{oZ6b?7Bnz>f85N0}7~WLw-P(l3Uo4+RQF zYS!P=ZJm-=nPo(3USx52RKE5qxc|UR^1EiR4l+oUmmZ+Oxz!cy6mEdnobrtq%Pu$7WM61hkp;G zst5iLavMkPRkSYu1oQ$8z{e9ymzr*sp}6gEzcXM=R+ENAtfsX!*|v1=K@E>C4OUqUR0l#16(u31ikU99+n zZR&*PnNqnTP8F%Ro)tt==(g~mpbQs-8Ed`KdD<+M`MDE`Ctm3Aeiz=r0K!z(YeJEy zpzPA+n)rdV#z_=%R?VjmoBb)F_{ohE7#bWSWvTFa0s%} znsQAVvg?qH;qP<Vjo_M_qtV)@tH+}7x2Guh+w-|^eqGySr-AA*mvq1; zXm78_*Qz5SUvdI>EB1X^{B&u`G1f7ejT>!kH`6X8@A1W}oVLW?C2ZTvv zx&kK&TlAanju^hL5$?Ojf8^3@^&Pwsoh*&Lb!kttE^6P%o}O>;$=r4AZQ=#Zkime} zZXnoQe%h4YKHUq0G$wviJarSQBSy7w8i}auKysr6uv0SzzXHM48y(Lx@c{`ZJ4T>C zPiURh74yZ9k*SzhjmE%(?olR+3Sb#k?|ag7L@Sk?xEk4`!yEQ|qdLtI0pSg7`|ZJm z?T(G|lyfzwAEy1Rk!_X~|b>i0kLic21P6(Ib@G6Z)!H2D^b zt62>A*s){D1g93hmg793_dUYgPuokCoMfEGzJbYLY6FkWL#LEACW~MLPo8k{&@Zst zmp{yksNEs?l)&qUMv((E^=r*kq|cwAGguE{HQRweYj^Ys%XjtliN=jNvjLnTlBqv= z5UCwVam|f87}3Yg3KaL1LE@cFuSXthT{bEpKUK&E_(8I^Jqlo?6tm=mpEZmJzu*1i zN&54-H6XtXTmDKj=3A~`ZMStBDV$sB`jT(F*hjMVM)cR-MZXqjVOzR9S#Nhg59V+>M8CjG z-4Hp90bj}6bygnHU#KrF!iLK>*J$cae+*YmeW9X%A@oC^)%atg1svOrE(0>2nvZYH zYkL>(`cytOJO5MaRir+NBMMJ|F@pXC32U6XALg>ro!O-eTOE_Sd&RfQBFxFz;J}Ro zen+WLX(<1uXHA>&$%XX&vP%h<44bds`Ke~44JD!KNYd&v&6#vxQn+dB!%st|k0s;S z?mEdG0$+#0{M=`p&lO6}66W14hSW5g1a}stAEgcB9k<_D3Z(!`w2wy=79*zPn zpab%Ur+g3rvw~ZS3na5Kgxf#C@V6Y0Lw&1ZvzmTWrVl4ILx@6@9oDSk4{(aou zrohqm8H#ikIQz7Ww4@WibdsMcmBz&1xlr`2yjgNRaFTT->8za5s#-xNAjn$3)H9Eo z*m&jY<4kg%f+eua#2*ZQ+e!<`&M0G8bI}GQX>1GKvU~95+CVfgS>sE{i6q!FQ9PJ` z^8PonLl1A%@)E2TxJ=b;lg{L7Am8R(Sja_ZGOTH8&s;7lp-7_S_Xw7{WA=Fb)=`xf zT(KxV*%)Iro7#M@8%Ka)IsGE?Immfs{5}%XpM3Gsz?yMvdnz1}O?rud)oU(eXrDjY z7Gi8QfY=_4t665Mg>w_i*wB_nW7K(|cy`#q!ZnaepYM{YBLQYy&aK?)x@41#5$I;w zb}{3Ot(Ij|??V`$QI31ZfWH_Q9;CVTh%4+QUHbRS?2*tc5v2Uoe zY|OtRVt5X15s072C|r$1D&69k)VH=*98R25p}eS9Wa*sgILO1|@=Bhm8g`hELh^0$ z4`zGfen{M*YU0)&cDipt`TNk&3Kg3Ti@@7lo%10H?`qnq;55i(f%0_BEJ!bS2fVwl ziARFYP;VcRjUfsM0tG5XxEaagJ*i#f#BjtWEd1tgiiL~)*)@RMx2X|td~(Bu4ovYY71~)++kacNawupi|Yshvq z`7iIltnK79OLquEdbV@o3tu7?wna>XHBgvzW4>U9j_KzvT`-+4jAW2<920Xk)a69^ zyRWXOEcxOw*F!YMRh_7~E2wSj#h?n|0#XS~pNuhn4+~y2&NMDs+>Lo+3O8H~H&&+S zO0py@XU1^8VW6*p1tm2kEvb6lyQilDjH2huD1O{p7xr08rd}bc=Aya9b|9EZWeR2*3 zPe|HbY$f-4Q+rC_ya9sGy4vC0xRNeuXv^XH0bB%XUiC`?mc3S;;&yTD`9W>Q5Bv(W%CW^ zJt#jSb+yxh*!jN92vaFs>BgDcN1!0uHdBS%6j-(~ym>|P!)yRh=%NLZ-knVhQ1&+1 zP~QCBIK{qmJu!81LvS&XLFRv%t^ccF`-^-1>VmUQjaq{HhoREuy(PwEIB+#=k}+wB zdTD*@x_?9ZU<5K*GXtKPwtQycRFE0p1t5f^QQ$jL-KelJZ#_`^3>7k-rq|LJ+y`1x zMOYBgoUG$kZT+?hckmfqGC$TtlT-siG`w;=P1DxG*Gxle2hYplqJZ`y5t!;0$~~bVrVsp*ipZ*V}L2oT5zVzSUY7(h>zW1@0O(Xsk&h1Ry!kpZEz=? zl1z4wifrPBJ*NV7CQ~T)ErNDk{3*laao@xpb^lR~{2zWY3;4tC6Z#2qy1#!hJH)mo zLHYYw=9OD(^hbcb9 z>wI)zl)nWQpR!3UFf2*&zzgY?f2BSJ1njoM9ke`kd#3+rdk zEJ<wNf$KWVKK)qtCO;9ocz?|#acWc7OY1k|yS*)fvx%a-pLnXY zQIEv2sW00YjVr%*Ym-}gFngb}ACH_$L-S)FA8Wd1LI{I?a%FdQe^X^=q)nDiF#S3Q3y>8e{(=06;?jkktA5<|sA z3+)&>8U%~iJU^g&=HiFQL;N~J0uWBenz>#_JELzG7Dnr-RhXR$RUiF{zU}^y2@ zL`*8$-pcBHxue6sbliV268&dm(LYk|DW8Omw+dTfhaU4219zUDGzF+}-=d!1Jjquh zNlB{vn;&epYVyqEY)+}Q@@pEFVU>F=#T;AsayDFT`O!&|blhBnd?nmOtmQ;QfW5Z)Qnl;swH>sFcYF6apf}WL=&j|)HOGwm2SCnTib~(eu$EQ4 zu)7lv;!MrSoju0$_cexygqtVLy^ecg$UDgPXaCHH{5#g*Z^!~u(m!C&i<%7k>R2Mb01@rtCTIHMME1 zSoA+Y(6&J5Ufkb;F@a_y8rb54*8y+{OSJ3m(6N0I9Vu@2B*-pdldTePn9212qZs@D z0{Q%3wDUi;^grS;c@$z2t$R5_exOov94Vc4O!1H;TL!4c>z63n z04P)tZ`53c3r_y({xFd}Kr)RR7DB^8*p~5bl;l$p{dPw;HvGfOEdSt>+$E;`p@sKx zGRtuY0IV9Kt@zRO-x{o8I;yF^QS;-78?jDYqvs0zqQ3frcS$!F2QvXj{*Y`(nH5rA z)2aD9tDnWUar5ci_;#JUU`>*_)85_3@g^bT;t!7q4~R>YbfxGHV}&EG03)F}Q(`K4 zRrJ%+c9!(z3Ps(RXaw}=E0|(?QOP_u9oXGqSw~+}_-0D5)db~)9sw6ulk51iYHeSO zK{C{frv=5eG|ywYz4^jiDC^HHN7iiz(Y|UmwmpNi>HA(}@Ov1&*MBG)EsMS^ORE}f zY8(bu!?FCt0OXxNK|FwXt+VPp?V2a5ODrpWOucdv7GjVZk$zL$WoK}SxV#R;JX?sg;5;ymaE1JbwKLPH#*~f7= zGkV;eTGt7k`yD-BqK$%WXB48@c7O74kE;_?me7^S9ZkXM@R@NBP_X%+9#oi3!;!BA zvNaZnIp)CsMo{RvBi=Mbg;u;Rt}>#OL!PMo**k12yLEdl@ba^X%R>Th)_Lsv^k*ZXF7&%EtqJKIOBUQmLH#~V{_g$=->*zt{D-KEulPr48ZL9G`@B<=t-m0%dT53gPo_kbsM& zpw`ZT>q6d|tb(%xp14WR<^w-YQTf?EoRGfA!yuk1{|@}lOiBX+sm&3}vA4sLqD`%m z$6`u%aSh>dUw}TsE$q+u#mwD(#3T|E4CKS80V|uz)~CVEX>%vJe+D&8)VJfOd0QrK?xqYJtoq)BOvk z!q_g7*_dIAP9@gYSvZ{b>DjgCrV>nmdCS8~{*HFd;8+SVJa`v_?k}iZacZcv*9q{i zsPhvGR@@Jc%Q&wA_zJ4-8f>1}9(P|O&FG|ySHP02WFz*OC&lkDdwh)X`J`@bRW^DBQBuyjN6rJ$SzT|93-3Y-d%!(~&U8-?a zif?aj?KOG@7MDG%W#31#U!Sh`l_Ed73fEWzuWuH+9{;%4!gVITxW{bT6o@*E0I-D!T z{Td$6Uqlcx9@ktHj*QzU@qLIqM#m#_-L7|?zAh41eX^aZ)5miWXNn2j6qExb0SOGMh~1%a>U zH^>qIhe`)tCABZ8wLOTbrkQW3>SPxOo-wnwV^YNr3yM2LnpMhidEUWJj$u zq+_87mzz%%1KsR^48SRSFF~yimWybp<_|PP2IQruZr7*?-wEFQRF&%cr3`)8+Zzcm zce~*$gP)}kTXi9ET`YK#PZh3$0bpy^LrHoy8i;vSEat8<6fwYYIU5$*Q~eUSw260gC;Ji;Y^0B#W{ z_w|H1jnrC+JA8R(fbq^Bl^GT3Rw7I{?Ri!ds@QwU&zRU!J`ua#uZE$#TY+O8ld;`a#ozbROI%N1ck`<#Vd8Yg*O6itM5Rh&>%s}ki$OPr2JgxJGy>V zKW#zBQPn?%Ob+_%2zJw{$F83+i) zySQ_s#=^vy;>KDnK%}7i;FIM?X4QBxr9QyZ2BOZn%6x#FE)iY+S#{!b!HE8jW;3*g zTLcVTFbdXtXL8oAK5KXA&*smWjUbi=EhwSX;DdGj=@$Y*Y>-kfZg!6-hb`ik@ZX8) z0wp~=@i)HOK@N!msqj;Fi)|1oKH(QK&zCQ*{~FE$EG1=td5???Z80GTTi_O|JN4${ zw1XI77tK#D;qp;VuSi98DYMziblkjpW(^+H7z@$)-D2-f)$Z*B8{pbj;P z2XT_Q5d7{;rnpnyTS|U_XQLrQU9edktTbs6bXnr!yQ%Ywc&iLF9XQ8{M#`GRi=&rL z^JwjP?zm$l!f2*^ivaxOvl_?QXrvwVK#NgjfBik4kd!-;4sH6}a(!8LFsiN3|a3U4-MR8q^BRRIarW#^q>AdS8P44)Sy=hsRMjtod+!!ObI>IxB4dv`p zYYW%DU(KxvNVe|upsbgfR$O*|%kwnAUG2e%0`YJGwT(C^JlvH4usrMu5}^)WZuG5v zUGYgOqnI5@l6zRa_AVq4jy1Y*SK3XF%OExx6D5g8dn=`zZ@LRW4>k?Pj{r@Hbo_<9 zsc3;YN;j88x?Ov>?9J!-S@+x*Dv=>|D!583m0S@Y7;UsNdCrpxJ8*S!`!BQah~rHY z!;9+)85nLbFxH3i3V>vWi0vGyZ8IA8bY&6reMQb>VMSb_<4Y6K5hJ}Pd%#m(A%}yB zjGCP7S4)RuRUe#}JeB$6z-PkRN{5)HSk08Tp|^(0w%XdpjBw6pin(DXM)UgE4m|g# zJ!!AwfdKln72%DYxK8=*;Q@})SqmnE0ISb1LTMYYqby^tgFf|5S*eX(%#f#0Ajz?Y=_ zw!$;Q=9I7DskUp0i@k4(9KJU_sc}AhSw<8ZhW4E`W9o->+ZV>YTl&wuvty=fY5kZaMzWErTB%JBt5N^cd*`An6^3prxlC*FFYb#%jR*ateY=C& z)b15DffNhxODZy8=S9IAqp7mdhU1h0j+5oxuYFm6ltAD9N7esNdsfr*ANFYf%m*Kh zywBxL;Y){nJF4T&yRUgw(7Zv)?RslGp6`#6`9x^YcJY-uh?|_}o;XX159a}wMHHH( zPNy{I{;D-wb&qNp_-^{*mmdsr65XI zQGpOl2y>}@Ysqa^GOZ_Q=IWkqj#Hu{q(ZT6O8bJEBTlY-QsVp7-5Sqw1EtXKL-Fkp z5gBkWS37lxy?5G1=%IDzQ>i1P6T0Q0#X@LWY(wAZ7sg6fM(Qs((c$Ujx<+dL!NL6J z^8vVxEAMefiDpiV9#M-wm2^+@#~k?l<8a`GAU>QYjd^SRoeD^z06@uci&~tXkC2n z^yJv~CJS{a3=!5VuFN5n)xWUe4?yqH4w)jWN9$U1?`QnHac*PX=hg)ldbe?`m(?u@ z$RUMJ-LJK~(#l%(vO#;$+gCc6%=@a!Z;RCjEMnXVGU`W~r2%_M-$lGNdD;Mb%3435 z9$fH5pWsGs(`1OzMyi%WeF@So4`mP4sD)42?F5IxjEc{ghIY7BS^c7pu>%CZeYh2P z_PlP|uyU{mwQ<#Aw0CRdH>gm9mu7i<bzHj)S?KvFRu%+CB) znKpmXmcwhX9Xt0BWi;L<4!KX=mYACMHRyZPNc^>zGIJy;QAvr%L@0$(rul?vgr2qY zE53nH{~S2w__a7IZ|6bcK*<1ew6imN{VVL+%td~$hXrj%=JJ(Iz6a%>8olw$rJLXs z;%r~JkQLp&GX)S}_sc3T0YuKb02%h&|9a%%#$iz#LQDTbAT)*LVI-2~Z_sBB(3a+| z5kGf~(l|*Zq6CeWfgD2W1CC+au0!@K+dytQ{WEgUpR6dU3l@ZdFujE6bJ&Od0KD;! z^Tq$;R<^x@uyb&dZOnON&KOyj^Wj_vX6t~FN!DOB9M+Q0kpbRY67u8Uz2gV^wxt$) z;;OXiupdQ#KNl_w?MZP(- z+=ydfdEH4wwDZ}ho#DwUr>>Sp`{>RSlKP%_i<_|}1-o1BO zM-<>+dkD0hdu2;2i-}~_g$=-}aCpHH+18WqfNS!tpH}XeTzOQcvhGj=K%ha=7-t~< z=;D56ERD(Wgv0?cE#l_x004^qQF(E7;3LhQXu*z!v{C#m9z0N0w zC?jAigRb8F@w2?%hmav=1aH$6<9h<9npNoiG+7x(33}cZ|G-k??D<2maEx>Hpc=2M zbPiY5&3@^;+`QPVLYJh)dbm8hCMW{t$V6;Q+=izcTNrcewI*03K&Fl?Lp33Ew)eBq zr=4JgnM{=jtS#?C$EBs^0T1kW*pv571kq)s^f^w5X-GS8Zx)~I1S;kWWtZAj*+!~P z8}kKvI;%N?T5WJ*KET7+D7m0Noa>t!yoAl0Nc#=y^mXVE-FUsKFT;(Sp4>@YRhN@V z_S&ybmWVaJ69f$L=MS8>#bXqJ!hZuW$*(AP<_|Ea%9{%DZTA3rJ8##YX!H4AhDGqu z=H-WYp#=A{73HHH!Ez0vjH+-(RC)D_NOy^IDw1Aa@TOB`u>=T7m=X37i}&NV$RTsf zNPbc0>e-mYa*J$YUxzCA);*DWw#TQb884Yg%v^;K3JEn&Q$Mc0Hr0-aATkAS2efah zU{l&2Qz6cqA6ZC2TxmmWc_)0Vw>-DkoGqV>P#v9JMjY`B6y5fSQRw60q}9&X9X!=r zF6ogirt5*=YlKr#6*Hz)vwPL>lD_I|UdCGZ>xyc=O3K1mY6carBdO$4HG4rLd<5FBL&At+M7z-X zsnN*@8c0ev)+QJk_mLkEPeoKSk9AO3Hq+^r%+#JpbK91!59$GIUO0Z8ijjSvD=Syo z$X2J1Th>kYe~5+Pu5RY4oOwh(efK&9&JU7;2fe6rDa z&PH^BxlE}dyYWK16-J5cO#iEkC!Jo+nHrOtvodRm2v_UEMd{CIWs*=Rr*1@{rcmh50qw5_hz;sJ&4h(8k7r8CA1avx@ST zs8fX`33)+FAJouPu-Q#^ZFjiGY`6fTodxSCeRQ2;h%^T}Y|6CNl3K;!crp4>O<}#q zDL1=kAxNunAL{?028)6^j;J&P z2Z_?vz{OUPqFd=yc`DUj*>p*%0-m_ozsX$<4#4Bwrmb`@kPm2z@e0BSz{)Rnax4cW zgssX`b&7)}3t0!9QuNx#gVKH6&NnGO%tV{`R{4W1ODht~tRA(q^8$w-?oo)H876;$Bis(y{^a9~#wp*_-Den;6Ndpo{v>@tf#YK+ zTV7Xp#OCnmo!F$wuvjK#krwPuMcG%j?AN#UiCkR4z+i1vzOZOh+Rl@p%Bd~8Q5&x_`vNz<K#OYI3Fle@Gqo~H~x=G!&(X!>(zaGx^ZS|)bx}_slIJ%2wD4fToQ=vXf|iYFxn^hzuLR6lg>5m-y3QN%*_@6 zbTVYb706a$NZUnoB8N#KF%CU8|DC&t~KK6!9)uu)=-U2JN4 z9Ih*LoF;kyhNjT*2i%HwRB?C$FQ4@RdRD&hkA&E(tkJo$-m|%wTFQdyB}Jq2T2>vm z&KG*Gmk5u)FYU_BTB2sD4*8sXm2vin=AAEdLZHhU51P2e2XH{7u!^bNGkAye1_P+M zh}%S^yj%PD$#UgKAu2M7Y&d~5ku|{56~N@Hh;(yN@EPO`sZq>8Uu4B-f?2(%Z&lCQ z=)1H@rN&QNA!+`FGa|lkbW^0cQuNzMY2yMA2!*ZY*yu-8*Fqoy&i=d^eo;>n69gm& zd<9LhT|d$U-_8!o|2(YsO>!3A6O*8kVGBswQd38~doBich;%e*ux63+Y{afmR*7Tz zhGwRWr@wifO;VcwTavqD?_Fs3LN(W$$NiB5MnOy70=jvE!YkIoH2=&3w_{@-x3N;m zT5Z~gTG`$qf*;T%@+*0}c3rDC_@6ogioxN5ge7=ig_!QlwZy4>i#Knc)fp{EzL?q) zZC>n~L?z*fcg^+HP{~A6qcuZVKB9#)o z;8()^P5jd9W!BAXXJ+|{1HCFW&*YX%>-3)dc+jSHSRX8&BEi3{z4?4?zJ}l3x!{Jq z%CtR*)g)m(&Ya>8AvQWo94odSx+R0U%d2C7cF=^d0vE>^R}+3N;$ENaOSv^Fw}N17 ze055(koo9sBv&*sR=Py(h1UL+oK&@AMoMNKQ=W#sVVtGuzVM~EE1N!7|6*aG3zqsh z*Rss*5wL9AGOxYm6;u$$9eQUwYFBX^b?M-C+b{C&p6{8J74?X3`|ZpWKHb(^Z@Dbe zaS-i&MswoxW0UJL0pV6}Ru`O9utciL5sW!fi@1pzX-4 zK-9MhgOGRC2CsUveQoDKUUf$Mc68uFWMWm(xwafc?zOam5vyRFzI+k36sQ$12zznn zZj6@?%BgIQH$L5Ar>~9U2NrVLNqnap7sWREBrKz?ORD$+@*u_g51fKZFFGFRr> zJ6f})ek9^yy#cyb-{XDdN{DCJE>o7+>xcX6&fLrC$i(I)!Q1r3m@vE4O(gerNe;1i zz`F?2)?vEN8 z4~{2zyACA2bX?sBWAbeuShtBxU%&7O$g`^LgGM0RXr^yR)*a<+0+r~p7O`R=H% zR(k7L9aikMN(Ub4x&D+;z$Zx+4GTuGb{QOdR31>&`qf_0*qq@r%9--R8|jjpDYr!O zQltF`j5UM~A35EH zeZld;TTO}lX?!1_csk*$(Po%Fd+9gm6YS7TsBzU#G7t5nY;tF+C&ut;txEoaj(`rb z6j(sH_~LKsuV(^O2OsnNbq=mH9N=j<{ztR@-wvRbNPJrap!;J3YmdP+_Hkkri7ksS z{XZcPi?*D-obzEi_p8!BvEt7PnOJ`*0D5}R|J%bX-Zg#w1df@`K3+kom^CM}UQjte zb8@r9YX%u*%mRw0Tbe%a{v)2D7RiGU@IJl}7Pa%h|L^CQ|9ju;_MZ&9p~LqtZN*Nr zUKrlNO~9hoh5P@+T^Hp0Wsmy;(28tnXR^cE=HIrU@%aJS<8(w50F0Ra>F|Kw(wO{q8GRKyfX+7o7eu;V<`~tfC#zV& zVm44ZQ&~|Jt#8o26tQ_;`n)thzqji)0HZv^A)75{*J@of_OAU^SnE`s`opmz<#QIm z{=NtPaDdBF_N6rXy`ob4&|pF4kD8zw?BHNU#qiepkm0cMu;nar3X5Aa>$-Pc6&D_M zigG~yp{02zw4zD;;ZB^LtKi4Hc`zoD`zp(crL$c_GLAm^eXwFC&2f`6vt*W3PkAkN zzXozZ^cDB|OaaSq`{RtwYtGqz^_w%NcHb0IJ)VUC=@iIcmqkd;;(vR6j*@?|{tNN`Yb8Z-YnL@$_x#VU|gLAp*`#0{>A=s$dIeIfuDza?T`_(7 zqjlz*WX$<79bN0os=%Bm*sRuBgS)bC8fB4d5)qfH2mQLg4Ozf+58g4Bj@_;mI zB!iDpA0{8`Jg;Gg-UFEMTl?(T{VLa&3&*=Yd~!$lzFou%?!}mMgeoJJ6VJ@}w_+~{ zsV`57n17obLze*!vPz3pnl>T$=_bBKA_Q+aa7j{cTxkabn4c!LON!SsiJC&b3ww@U zN2P^T^A$)z10gJhhnzFsxN|)IP3-_X);b7Z#bf5<>G7r1i%+xzz?w0$XrQN;u)b$g zxv^h`Cm1C-4*^oWG4%)d{)B;d|22G4i%=*7=^y~OipD!i!6v32j0z7H7!y#~P9;{9 zgHWmos*(MEtEzT+N{awT2joi?B-7lFKBPQ|e|{#BaiulZwTq)FHeF^b*o zQ})^zN;)fm1v78+c^kgvfx9*SdAAqYgiIK`n$UN%q}HOQ@7aU~c0;#r;pm07hF9&~ zA=4Yg*tIRPcy6Y3u}9A5m6&+;JU5V6Wj!w2Mi02~hA55~nZ|X?R+ra2eI%eahln*L zsi^-3Vd{xL2Zx!QIE_BO9Qks8)Cf{x^;&SmEH}P}E;;MVhk?mA5w&@9ba-c!s$!V4 z0?-f%PDPO1`%m?u<59>?EU8JNyY>y@#*sK540_6^pUDpF4)()}XVoPj+;^lVS_XQh z8N{L;&dD+QPz9)^K;~%&K|O>?Ta4)OZH}|5)59q=J?@!8AJx6C6v-BZy1uIF2ay6i z-KH4aXuHV1Nes#3;D8&L6oIKHVWtFoB>L3LUeK3-KHW-SNWY_GYnKBkERvIU)7bAz zF5W~2>hT;^>fvO>X{7(Eb62+EDYfCT!$}n`z!@^@qt+LjSywTbo?mJjg)Kk zwIRhS;3zKw0flnXv5~TPL30RG(*Hx*BfW* zLgf6U59Btcc%&(GaCAkxLI?7f=7fz{Qvl~)ge9o5MQH|$Cyci8d9T>v?_mHM2aUl4 z+%%-KR!6LhJ~@?K_lE}{j;A{N5*bSf8QzjIHG3(j_ZXTCSyoz!b?J>}=^1w==%|uo z(7Q-9W?*VF>@<+d*SuSz znvVfs3zR30gLl@z8w-eSzyK&peM>Cxlde(Wq#xjoIW}?C6LBKdHGgu)#fNjIwnqE( zJye4NK4U4^pG1W24U~CRe97zhTKZu0^9+Y3SDz633DM0|{$L8iAxn_{-djr z?dg%0-We9ds!iPVqZxitiN0IZ_nwC=($0?vL$50kHEf<)OFe(P*{2{u-Ruqm(NIu< zLt*ba}r}v#(D* zj5FeDH|gNRF{E~(973>iGj{Kg^PPuU+<5n+hKe_$*RS>LznCq9@xd5FNYC!wn|H06 z$L>sWPU6MwA|Ar*#64f%4|c9PyShrn`4~?F>r(k|(4Ii^mYbieP!k6&o@PCGd!5%I zb}tIF*aQFWfj^isJoiNV*h{F6K1p3%M}HO>Yf(7L_pUX2UleGIlp(zWW^Ul&5kPWd zy;u2TqqTiJ@;-feykU`%5o4&(LYcqIj&7dS!KyMV≫⃒4Qw^zj^hsqs@rjYp~U99 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 KSR30Tg#QPy2$E|6 literal 0 HcmV?d00001 diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 93cb2b8..524609d 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -1,7 +1,7 @@ import axios from 'axios'; const api = axios.create({ - baseURL: '/api', + baseURL: 'https://mi.xyvan.cn/api', timeout: 10000 }); @@ -13,6 +13,29 @@ api.interceptors.request.use(config => { return config; }); +// 响应拦截器:确保所有错误都能被正确捕获 +api.interceptors.response.use( + response => response, + error => { + // 统一错误处理 + console.error('API请求错误:', error); + return Promise.reject(error); + } +); + +// 获取完整的图片URL +export const getImageUrl = (path) => { + if (!path) return ''; + if (path.startsWith('http://') || path.startsWith('https://')) { + return path; + } + // 开发环境使用代理,生产环境使用完整域名 + if (import.meta.env.DEV) { + return `http://localhost:3000${path}`; + } + return `https://mi.xyvan.cn${path}`; +}; + export default { // 活动相关 getActivities: (params) => api.get('/activities', { params }), @@ -65,5 +88,14 @@ export default { headers: { 'Content-Type': 'multipart/form-data' }, timeout: 60000 }), - deleteSponsor: (id) => api.delete(`/admin/sponsors/${id}`) + deleteSponsor: (id) => api.delete(`/admin/sponsors/${id}`), + addPrize: (data) => api.post('/admin/prizes', data, { + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 60000 + }), + updatePrize: (id, data) => api.put(`/admin/prizes/${id}`, data, { + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 60000 + }), + deletePrize: (id) => api.delete(`/admin/prizes/${id}`) }; diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 4925153..bff66b4 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -14,7 +14,12 @@ const routes = [ { path: '/activity/:id', name: 'ActivityDetail', - component: () => import('../views/ActivityDetail.vue') + component: () => import('../views/ActivityDetail/index.vue') + }, + { + path: '/danmaku-demo', + name: 'DanmakuDemo', + component: () => import('../views/ActivityDetail/DanmakuDemo.vue') }, { path: '/register/:id', diff --git a/frontend/src/views/ActivityDetail.vue b/frontend/src/views/ActivityDetail.vue deleted file mode 100644 index 0a4e7d9..0000000 --- a/frontend/src/views/ActivityDetail.vue +++ /dev/null @@ -1,1442 +0,0 @@ - - - - - diff --git a/frontend/src/views/ActivityDetail/DanmakuDemo.vue b/frontend/src/views/ActivityDetail/DanmakuDemo.vue new file mode 100644 index 0000000..e02e160 --- /dev/null +++ b/frontend/src/views/ActivityDetail/DanmakuDemo.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/frontend/src/views/ActivityDetail/SponsorDanmaku.vue b/frontend/src/views/ActivityDetail/SponsorDanmaku.vue new file mode 100644 index 0000000..20ddea5 --- /dev/null +++ b/frontend/src/views/ActivityDetail/SponsorDanmaku.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/frontend/src/views/ActivityDetail/index.vue b/frontend/src/views/ActivityDetail/index.vue new file mode 100644 index 0000000..7607414 --- /dev/null +++ b/frontend/src/views/ActivityDetail/index.vue @@ -0,0 +1,638 @@ + + + + + diff --git a/frontend/src/views/ActivityDetail/styles.css b/frontend/src/views/ActivityDetail/styles.css new file mode 100644 index 0000000..4787bed --- /dev/null +++ b/frontend/src/views/ActivityDetail/styles.css @@ -0,0 +1,936 @@ +.detail { + min-height: 100vh; + background: #f8f9fa; + padding-bottom: 140px; +} + +.detail-header { + position: relative; + height: 280px; + background-size: cover; + background-position: center; + background-color: #e8e8e8; +} + +.header-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(180deg, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.6) 100%); +} + +.header-back { + position: absolute; + top: 16px; + left: 16px; + z-index: 2; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255,255,255,0.3); + border-radius: 50%; + color: #fff; + font-size: 20px; + backdrop-filter: blur(10px); +} + +.header-content { + position: absolute; + bottom: 24px; + left: 16px; + right: 16px; + z-index: 1; +} + +.activity-title { + font-size: 24px; + font-weight: bold; + color: #fff; + margin: 0; + text-shadow: 0 2px 8px rgba(0,0,0,0.3); +} + +.content { + padding: 16px; + margin-top: -20px; + position: relative; + z-index: 1; +} + +.info-card { + background: #fff; + border-radius: 16px; + padding: 16px; + box-shadow: 0 2px 12px rgba(0,0,0,0.08); + margin-bottom: 16px; +} + +.info-item { + display: flex; + align-items: center; + padding: 12px 0; + border-bottom: 1px solid #f0f0f0; +} + +.info-item:last-child { + border-bottom: none; +} + +.info-arrow { + font-size: 16px; + color: #999; + margin-left: 8px; +} + +.info-icon { + font-size: 24px; + color: #FF6700; + margin-right: 12px; +} + +.info-text { + flex: 1; +} + +.info-label { + font-size: 12px; + color: #999; + margin-bottom: 4px; +} + +.info-value { + font-size: 14px; + color: #333; + font-weight: 500; +} + +.price-value { + color: #FF6700; + font-weight: 600; + font-size: 16px; +} + +.section { + background: #fff; + border-radius: 16px; + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 12px rgba(0,0,0,0.08); +} + +.section-title { + font-size: 16px; + font-weight: bold; + margin: 0 0 16px; + color: #333; +} + +.section-title .count { + color: #FF6700; + font-size: 14px; +} + +.description { + font-size: 14px; + line-height: 1.8; + color: #666; + white-space: pre-line; +} + +/* Timeline样式 */ +.timeline { + position: relative; + padding-left: 32px; +} + +.timeline::before { + content: ''; + position: absolute; + left: 8px; + top: 8px; + bottom: 8px; + width: 2px; + background: linear-gradient(180deg, #FF6700 0%, #FF8533 100%); +} + +.timeline-item { + position: relative; + padding-bottom: 24px; +} + +.timeline-item-last { + padding-bottom: 0; +} + +.timeline-dot { + position: absolute; + left: -28px; + top: 4px; + width: 12px; + height: 12px; + border-radius: 50%; + background: #fff; + border: 3px solid #FF6700; + box-shadow: 0 0 0 3px rgba(255, 103, 0, 0.1); + z-index: 1; +} + +.timeline-content { + background: #fff; + border-radius: 12px; + padding: 12px 16px; + border: 1px solid #f0f0f0; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); + transition: all 0.3s; + cursor: pointer; +} + +.timeline-content:active { + transform: scale(0.98); +} + +.timeline-content.expanded { + box-shadow: 0 4px 12px rgba(255, 103, 0, 0.15); + border-color: #FF6700; +} + +.timeline-time { + font-size: 13px; + color: #FF6700; + font-weight: 600; + margin-bottom: 6px; + display: flex; + align-items: center; +} + +.timeline-time::before { + content: '🕐'; + margin-right: 6px; +} + +.time-text { + margin-right: auto; +} + +.expand-icon { + font-size: 16px; + color: #999; + transition: transform 0.3s; + margin-left: 8px; +} + +.timeline-title { + font-size: 15px; + color: #333; + font-weight: 600; + margin-bottom: 8px; +} + +.timeline-brief { + font-size: 13px; + color: #666; + line-height: 1.6; + margin-bottom: 0; +} + +.timeline-detail { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease-out; +} + +.timeline-detail.expanded { + max-height: 3000px; + transition: max-height 0.5s ease-in; +} + +.detail-content { + margin-top: 12px; +} + +.flow-steps { + margin-bottom: 12px; +} + +.step-item { + padding: 8px 12px; + margin-bottom: 8px; + background: #fff; + border-radius: 6px; + border-left: 3px solid #FF6700; + font-size: 13px; + color: #666; + line-height: 1.6; +} + +.step-item:last-child { + margin-bottom: 0; +} + +.tip-box { + padding: 10px 12px; + background: #fff7e6; + border-radius: 6px; + font-size: 13px; + color: #ff9800; + line-height: 1.6; +} + +.game-rule { + margin-top: 12px; + padding: 12px; + background: #f8f9fa; + border-radius: 8px; + border-left: 3px solid #FF6700; +} + +.rule-title { + font-size: 14px; + font-weight: 600; + color: #333; + margin-bottom: 8px; +} + +.rule-content { + font-size: 13px; + color: #666; + line-height: 1.8; +} + +.score-badge { + display: inline-block; + padding: 2px 8px; + background: linear-gradient(135deg, #FF6700 0%, #FF8533 100%); + color: #fff; + border-radius: 12px; + font-size: 12px; + font-weight: 600; + margin: 0 2px; +} + +/* 游戏卡片样式 */ +.game-list { + display: flex; + flex-direction: column; + gap: 8px; +} + +.game-card { + padding: 12px; + background: #fff; + border-radius: 8px; + border: 1px solid #e8e8e8; + cursor: pointer; + transition: all 0.2s; +} + +.game-card:active { + transform: scale(0.98); +} + +.game-card.expanded { + border-color: #FF6700; + background: #fff7e6; +} + +.game-card.highlight-game { + background: linear-gradient(135deg, #fff7e6 0%, #fff 100%); + border-color: #FF6700; +} + +.game-header { + display: flex; + align-items: center; + justify-content: space-between; +} + +.game-title { + font-size: 14px; + font-weight: 600; + color: #333; +} + +.game-detail { + max-height: 0; + overflow: hidden; + transition: max-height 0.3s ease-out; + margin-top: 0; +} + +.game-detail.expanded { + max-height: 500px; + transition: max-height 0.5s ease-in; + margin-top: 12px; +} + +.game-desc { + font-size: 13px; + color: #666; + line-height: 1.8; + padding: 10px; + background: #fff; + border-radius: 6px; +} + +/* 其他组件样式 */ +.sponsor-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; + max-width: 600px; + margin: 0 auto; +} + +.sponsor-card { + text-align: center; + padding: 12px; + background: #fff; + border-radius: 12px; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); + transition: transform 0.2s; +} + +.sponsor-card:active { + transform: scale(0.98); +} + +.sponsor-logo { + width: 60px; + height: 60px; + margin: 0 auto 10px; + background-size: cover; + background-position: center; + background-color: #f5f5f5; + border-radius: 10px; +} + +.sponsor-name { + font-size: 13px; + color: #333; + font-weight: 600; + line-height: 1.4; + width: 100%; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + word-break: break-word; +} + +.photo-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; +} + +.photo-item { + aspect-ratio: 1; + border-radius: 8px; + overflow: hidden; +} + +.photo-img { + width: 100%; + height: 100%; + background-size: cover; + background-position: center; + background-color: #f5f5f5; +} + +.media-section { + margin-bottom: 20px; +} + +.media-label { + font-size: 14px; + font-weight: 500; + color: #666; + margin-bottom: 12px; +} + +.video-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.video-item { + border-radius: 12px; + overflow: hidden; + background: #000; +} + +.video-player { + width: 100%; + max-height: 300px; + display: block; +} + +.member-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.member-item { + display: flex; + align-items: center; + gap: 12px; +} + +.member-avatar { + width: 40px; + height: 40px; + border-radius: 50%; + background: linear-gradient(135deg, #FF6700 0%, #FF8533 100%); + color: #fff; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + font-weight: bold; +} + +.member-info { + flex: 1; +} + +.member-name { + font-size: 14px; + color: #333; + font-weight: 500; + margin-bottom: 4px; +} + +.member-car { + font-size: 12px; + color: #999; +} + +.expense-list { + display: flex; + flex-direction: column; + gap: 16px; +} + +.expense-item { + display: flex; + flex-direction: column; + padding: 16px; + background: #fff; + border-radius: 12px; + border: 1px solid #f0f0f0; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); +} + +.expense-info { + flex: 1; +} + +.expense-name { + font-size: 15px; + color: #333; + font-weight: 600; + margin-bottom: 6px; +} + +.expense-category { + display: inline-block; + font-size: 11px; + color: #FF6700; + background: #fff7e6; + padding: 2px 8px; + border-radius: 4px; + margin-bottom: 8px; +} + +.expense-media { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 8px; + margin-top: 12px; +} + +.expense-media-item { + width: 100%; + aspect-ratio: 1; + border-radius: 8px; + overflow: hidden; + background: #f5f5f5; + cursor: pointer; + transition: transform 0.2s; +} + +.expense-media-item:active { + transform: scale(0.95); +} + +.expense-video { + position: relative; + width: 100%; + height: 100%; + cursor: pointer; +} + +.expense-video video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.expense-video .play-icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 28px; + color: #fff; + filter: drop-shadow(0 2px 4px rgba(0,0,0,0.5)); +} + +.expense-amount { + font-size: 15px; + color: #FF6700; + font-weight: bold; + text-align: right; + margin-top: 12px; + padding-top: 12px; + border-top: 1px dashed #f0f0f0; +} + +.upload-section { + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid #f0f0f0; +} + +.upload-tip { + font-size: 12px; + color: #999; + margin-top: 8px; +} + +/* 底部按钮和弹窗样式 */ +.footer-action { + position: fixed; + bottom: 0; + left: 0; + right: 0; + padding: 12px 16px; + background: #fff; + box-shadow: 0 -2px 12px rgba(0,0,0,0.08); + z-index: 10; + display: flex; + flex-direction: column; + gap: 8px; +} + +.action-button { + height: 48px; + background: linear-gradient(135deg, #FF6700 0%, #FF8533 100%); + border: none; + font-weight: 600; +} + +.action-button .van-icon { + margin-right: 4px; +} + +.login-button { + margin-top: 0; + background: linear-gradient(135deg, #FF6700 0%, #FF8533 100%) !important; + color: #fff !important; +} + +.share-btn { + position: fixed; + top: 16px; + right: 16px; + z-index: 20; + display: flex; + align-items: center; + gap: 4px; + padding: 8px 16px; + background: rgba(255,255,255,0.95); + border-radius: 20px; + color: #FF6700; + font-size: 14px; + font-weight: 500; + box-shadow: 0 2px 8px rgba(0,0,0,0.15); + backdrop-filter: blur(10px); + cursor: pointer; +} + +.map-container { + height: 100%; + display: flex; + flex-direction: column; +} + +.map-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px; + border-bottom: 1px solid #f0f0f0; +} + +.map-header h3 { + margin: 0; + font-size: 16px; +} + +.map-header .van-icon { + font-size: 20px; + color: #999; +} + +.login-form { + padding: 16px; +} + +/* 车牌号字段样式优化 - 标签和输入框同行显示 */ +.login-form .van-field { + display: flex; + align-items: center; + flex-wrap: nowrap; +} + +.login-form .van-field__label { + width: 60px; + flex-shrink: 0; + margin-right: 8px; +} + +.login-form .van-field__control { + flex: 1; + display: flex; + align-items: center; +} + +.login-form .van-field__control--custom { + padding: 0; +} + +.permission-tip { + display: flex; + align-items: center; + gap: 8px; + padding: 12px; + background: #fff7e6; + border-radius: 8px; + color: #ff9800; + font-size: 14px; +} + +.permission-tip .van-icon { + font-size: 18px; +} + +.video-player-popup { + padding: 20px; + background: #000; + border-radius: 16px; +} + +.popup-video { + width: 100%; + max-height: 60vh; + border-radius: 12px; +} + +/* 车牌输入样式 */ +.license-plate-input { + display: flex; + align-items: center; + flex-wrap: nowrap; + gap: 3px; + padding: 5px 8px; + background: linear-gradient(135deg, #FF6700 0%, #FF8533 100%); + border-radius: 6px; + box-shadow: 0 2px 8px rgba(255, 103, 0, 0.3); + width: fit-content; +} + +.plate-prefix { + color: #fff; + font-weight: 700; + font-size: 15px; + text-shadow: 0 1px 2px rgba(0,0,0,0.2); +} + +.plate-letter { + width: 20px; + height: 26px; + border: 2px solid rgba(255,255,255,0.9); + border-radius: 3px; + background: #fff; + text-align: center; + font-size: 15px; + font-weight: 700; + color: #333; + outline: none; + text-transform: uppercase; + padding: 0; +} + +.plate-dot { + color: #fff; + font-size: 16px; + font-weight: 700; + margin: 0 1px; +} + +.plate-digits { + width: 95px; + height: 26px; + border: 2px solid rgba(255,255,255,0.9); + border-radius: 3px; + background: #fff; + text-align: center; + font-size: 15px; + font-weight: 700; + color: #333; + outline: none; + letter-spacing: 1px; + text-transform: uppercase; + padding: 0; +} + +.plate-letter::placeholder, +.plate-digits::placeholder { + color: #ddd; + font-weight: 400; +} + +/* 奖品礼品样式 */ +.prize-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.prize-card { + display: flex; + gap: 12px; + padding: 12px; + background: linear-gradient(135deg, #fff 0%, #fffbf5 100%); + border-radius: 12px; + border: 1px solid #ffe8cc; + box-shadow: 0 2px 8px rgba(255, 103, 0, 0.08); + transition: transform 0.2s; +} + +.prize-card:active { + transform: scale(0.98); +} + +.prize-image { + width: 70px; + height: 70px; + flex-shrink: 0; + border-radius: 8px; + background-size: cover; + background-position: center; + background-color: #f5f5f5; + display: flex; + align-items: center; + justify-content: center; + border: 2px solid #ffe8cc; +} + +.prize-content { + flex: 1; + display: flex; + flex-direction: column; + gap: 6px; + min-width: 0; +} + +.prize-header { + display: flex; + flex-direction: column; + gap: 4px; +} + +.prize-level { + display: inline-block; + padding: 3px 10px; + border-radius: 12px; + font-size: 11px; + font-weight: 600; + white-space: nowrap; + width: fit-content; +} + +.level-一等奖 { + background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); + color: #fff; + box-shadow: 0 2px 6px rgba(255, 215, 0, 0.4); +} + +.level-二等奖 { + background: linear-gradient(135deg, #C0C0C0 0%, #A8A8A8 100%); + color: #fff; + box-shadow: 0 2px 6px rgba(192, 192, 192, 0.4); +} + +.level-三等奖 { + background: linear-gradient(135deg, #CD7F32 0%, #B8733E 100%); + color: #fff; + box-shadow: 0 2px 6px rgba(205, 127, 50, 0.4); +} + +.level-参与奖 { + background: linear-gradient(135deg, #FF6700 0%, #FF8533 100%); + color: #fff; + box-shadow: 0 2px 6px rgba(255, 103, 0, 0.3); +} + +.level-伴手礼 { + background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + color: #fff; + box-shadow: 0 2px 6px rgba(240, 147, 251, 0.3); +} + +.prize-name { + font-size: 14px; + font-weight: 600; + color: #333; + line-height: 1.4; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + word-break: break-word; +} + +.prize-desc { + font-size: 12px; + color: #666; + line-height: 1.5; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + word-break: break-word; +} + +.prize-footer { + display: flex; + align-items: center; + justify-content: flex-start; + margin-top: auto; + padding-top: 6px; + border-top: 1px dashed #ffe8cc; +} + +.prize-quantity { + font-size: 12px; + color: #FF6700; + font-weight: 500; +} diff --git a/frontend/src/views/ActivityDetail/useActivityDetail.js b/frontend/src/views/ActivityDetail/useActivityDetail.js new file mode 100644 index 0000000..77a6632 --- /dev/null +++ b/frontend/src/views/ActivityDetail/useActivityDetail.js @@ -0,0 +1,256 @@ +import { ref, computed, onMounted } from 'vue'; +import { useRoute } from 'vue-router'; +import { showImagePreview, showToast } from 'vant'; +import api from '../../api'; + +export function useActivityDetail() { + const route = useRoute(); + const activity = ref({}); + const photos = ref([]); + const videos = ref([]); + const sponsors = ref([]); + const prizes = ref([]); + const registrations = ref([]); + const expenses = ref([]); + const userMedia = ref([]); + const showMapPopup = ref(false); + const showLoginDialog = ref(false); + const showExpenseVideoPopup = ref(false); + const currentExpenseVideo = ref(''); + const loginForm = ref({ phone: '', carNumber: '' }); + const expandedTimelineIndex = ref(null); + const expandedGameId = ref(null); + const carLetter = ref(''); + const carDigits = ref(''); + const userRegistration = ref(null); + let map = null; + + const handleLetterInput = (e) => { + const value = e.target.value.toUpperCase().replace(/[^A-Z]/g, ''); + carLetter.value = value; + loginForm.value.carNumber = value + carDigits.value; + + if (value.length === 1) { + e.target.nextElementSibling?.nextElementSibling?.focus(); + } + }; + + const handleDigitsInput = (e) => { + const value = e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, ''); + carDigits.value = value; + loginForm.value.carNumber = carLetter.value + value; + }; + + const toggleTimeline = (index) => { + expandedTimelineIndex.value = expandedTimelineIndex.value === index ? null : index; + expandedGameId.value = null; + }; + + const toggleGame = (gameId) => { + expandedGameId.value = expandedGameId.value === gameId ? null : gameId; + }; + + const totalExpense = computed(() => { + return expenses.value.reduce((sum, e) => sum + parseFloat(e.amount), 0).toFixed(2); + }); + + const isApproved = computed(() => { + return userRegistration.value && userRegistration.value.status === 'approved'; + }); + + const hasRegistered = computed(() => { + return userRegistration.value !== null; + }); + + const loadData = async () => { + const { data } = await api.getActivity(route.params.id); + activity.value = data.activity; + + const allMedia = data.photos || []; + photos.value = allMedia.filter(m => m.type === 'image'); + videos.value = allMedia.filter(m => m.type === 'video'); + + sponsors.value = data.sponsors; + prizes.value = data.prizes || []; + expenses.value = data.expenses || []; + + const { data: regs } = await api.getActivityRegistrations(route.params.id); + registrations.value = regs; + + const savedReg = localStorage.getItem(`user_reg_${route.params.id}`); + if (savedReg) { + userRegistration.value = JSON.parse(savedReg); + } + }; + + const formatDate = (date) => { + return new Date(date).toLocaleString('zh-CN'); + }; + + const previewImage = (url) => { + showImagePreview([url]); + }; + + const playExpenseVideo = (url) => { + currentExpenseVideo.value = url; + showExpenseVideoPopup.value = true; + }; + + const showMap = () => { + if (!activity.value.locationLat || !activity.value.locationLng) { + showToast('暂无地图信息'); + return; + } + showMapPopup.value = true; + setTimeout(() => { + initMap(); + }, 300); + }; + + const initMap = async () => { + try { + const AMap = await window.loadAMap(); + + if (map) { + map.destroy(); + } + + const center = [activity.value.locationLng, activity.value.locationLat]; + map = new AMap.Map('amap-container', { zoom: 15, center }); + new AMap.Marker({ position: center, map, title: activity.value.location }); + } catch (e) { + console.error('地图加载失败:', e); + showToast('地图加载失败: ' + e.message); + } + }; + + const uploadUserMedia = async (files) => { + if (!isApproved.value) { + showToast('请先登录并等待审核通过'); + return; + } + + const loadingToast = showToast({ + type: 'loading', + message: '上传中...', + forbidClick: true, + duration: 0 + }); + + try { + const formData = new FormData(); + formData.append('uploadedBy', userRegistration.value.name); + + if (Array.isArray(files)) { + files.forEach(file => formData.append('photos', file.file)); + } else { + formData.append('photos', files.file); + } + + await api.uploadUserPhotos(route.params.id, formData); + showToast('上传成功,等待审核'); + userMedia.value = []; + } catch (error) { + showToast('上传失败'); + } finally { + loadingToast.clear(); + } + }; + + const handleLogin = () => { + showLoginDialog.value = true; + }; + + const submitLogin = async () => { + if (!loginForm.value.phone || !loginForm.value.carNumber) { + showToast('请输入手机号和车牌号'); + return; + } + + try { + const carNumberWithPrefix = `闽${loginForm.value.carNumber}`; + + const { data } = await api.verifyUser(route.params.id, { + phone: loginForm.value.phone, + carNumber: carNumberWithPrefix + }); + + userRegistration.value = data.registration; + localStorage.setItem(`user_reg_${route.params.id}`, JSON.stringify(data.registration)); + + showLoginDialog.value = false; + + if (data.registration.status === 'approved') { + showToast('登录成功'); + } else if (data.registration.status === 'pending') { + showToast('您的报名正在审核中'); + } else { + showToast('您的报名未通过审核'); + } + } catch (error) { + showToast(error.response?.data?.error || '验证失败'); + } + }; + + const handleShare = () => { + const shareUrl = `${window.location.origin}/share/${route.params.id}`; + + if (navigator.share) { + navigator.share({ + title: activity.value.title, + text: `${activity.value.title} - 泉友米车友会`, + url: shareUrl + }).catch(() => { + copyShareLink(shareUrl); + }); + } else { + copyShareLink(shareUrl); + } + }; + + const copyShareLink = (url) => { + navigator.clipboard.writeText(url).then(() => { + showToast('分享链接已复制'); + }).catch(() => { + showToast('复制失败,请手动复制:' + url); + }); + }; + + onMounted(loadData); + + return { + activity, + photos, + videos, + sponsors, + prizes, + registrations, + expenses, + userMedia, + showMapPopup, + showLoginDialog, + showExpenseVideoPopup, + currentExpenseVideo, + loginForm, + carLetter, + carDigits, + userRegistration, + expandedTimelineIndex, + expandedGameId, + totalExpense, + isApproved, + hasRegistered, + formatDate, + previewImage, + playExpenseVideo, + showMap, + uploadUserMedia, + handleLogin, + handleLetterInput, + handleDigitsInput, + submitLogin, + handleShare, + toggleTimeline, + toggleGame + }; +} diff --git a/frontend/src/views/ActivityDetail_fixed.vue b/frontend/src/views/ActivityDetail_fixed.vue deleted file mode 100644 index 33ea90c..0000000 --- a/frontend/src/views/ActivityDetail_fixed.vue +++ /dev/null @@ -1,1577 +0,0 @@ - - - - - - - -
- -
-
- - - -
- - -
-
- - - - - - diff --git a/frontend/src/views/LandingPage.vue b/frontend/src/views/LandingPage.vue index e6f8baa..5a22574 100644 --- a/frontend/src/views/LandingPage.vue +++ b/frontend/src/views/LandingPage.vue @@ -713,27 +713,25 @@ onUnmounted(() => { } .sponsors-grid { - display: flex; - justify-content: center; - align-items: stretch; - gap: 16px; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20px; margin-top: 32px; - flex-wrap: wrap; + max-width: 800px; + margin-left: auto; + margin-right: auto; } .sponsor-card { background: #fff; border-radius: 12px; - padding: 12px; + padding: 16px; display: flex; flex-direction: column; align-items: center; text-align: center; box-shadow: 0 2px 12px rgba(0,0,0,0.06); transition: transform 0.3s, box-shadow 0.3s; - flex: 0 1 140px; - max-width: 150px; - min-width: 120px; } .sponsor-card:hover { @@ -742,12 +740,12 @@ onUnmounted(() => { } .sponsor-logo { - width: 45px; - height: 45px; + width: 60px; + height: 60px; display: flex; align-items: center; justify-content: center; - margin-bottom: 8px; + margin-bottom: 12px; } .sponsor-logo svg { @@ -768,20 +766,30 @@ onUnmounted(() => { } .sponsor-name { - font-size: 11px; + font-size: 13px; font-weight: 600; color: #333; - margin: 0 0 4px; - line-height: 1.3; - word-break: break-all; + margin: 0 0 6px; + line-height: 1.4; + width: 100%; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + word-break: break-word; } .sponsor-desc { - font-size: 10px; + font-size: 11px; color: #999; margin: 0; line-height: 1.4; - word-break: break-all; + width: 100%; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + word-break: break-word; } /* CTA区域 */ @@ -930,28 +938,26 @@ onUnmounted(() => { } .sponsors-grid { - gap: 12px; + grid-template-columns: 1fr; + gap: 16px; } .sponsor-card { - flex: 0 1 calc(20% - 10px); - min-width: 100px; - max-width: 130px; - padding: 10px; + padding: 16px; } .sponsor-logo { - width: 40px; - height: 40px; - margin-bottom: 6px; + width: 50px; + height: 50px; + margin-bottom: 10px; } .sponsor-name { - font-size: 10px; + font-size: 12px; } .sponsor-desc { - font-size: 9px; + font-size: 10px; } } diff --git a/frontend/src/views/Register.vue b/frontend/src/views/Register.vue index f9603b0..e6f4a33 100644 --- a/frontend/src/views/Register.vue +++ b/frontend/src/views/Register.vue @@ -347,7 +347,7 @@ const onSubmit = async () => { } .plate-digits { - width: 110px; + width: 95px; height: 28px; border: 2px solid rgba(255,255,255,0.9); border-radius: 3px; diff --git a/frontend/src/views/admin/ActivityManage.vue b/frontend/src/views/admin/ActivityManage.vue index 1639d12..8e44e45 100644 --- a/frontend/src/views/admin/ActivityManage.vue +++ b/frontend/src/views/admin/ActivityManage.vue @@ -64,6 +64,16 @@ /> + + + @@ -139,7 +149,7 @@