From 3640111b8b7689cf4c52e2dc6d31af11487ee5cf Mon Sep 17 00:00:00 2001 From: yml Date: Sat, 6 Jun 2026 13:26:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=96=87=E4=BB=B6=EF=BC=8C=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=20--reset-db=20=E6=95=B0=E6=8D=AE=E4=B8=8D=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 000002_add_withdrawal_tables.sql 和 000003_add_encrypted_realname_fields.sql 合并到 000001_init.sql - 在 user_realname 表创建时就包含 encrypted_name 和 encrypted_id_no 字段 - 在初始化脚本中直接创建提现相关表和权限 - 更新 dev.sh 和 deploy-prod.sh 的旧迁移清理逻辑 - 现在 --reset-db 可以一次性创建完整的数据库结构,避免字段缺失问题 Co-Authored-By: Claude Opus 4.8 --- backend/migrations/000001_init.sql | 90 +++++++++++++++ .../000002_add_withdrawal_tables.sql | 107 ------------------ .../000003_add_encrypted_realname_fields.sql | 7 -- scripts/deploy-prod.sh | 6 +- scripts/dev.sh | 6 +- 5 files changed, 96 insertions(+), 120 deletions(-) delete mode 100644 backend/migrations/000002_add_withdrawal_tables.sql delete mode 100644 backend/migrations/000003_add_encrypted_realname_fields.sql diff --git a/backend/migrations/000001_init.sql b/backend/migrations/000001_init.sql index b4eb044..53fdd2c 100644 --- a/backend/migrations/000001_init.sql +++ b/backend/migrations/000001_init.sql @@ -36,7 +36,9 @@ CREATE TABLE IF NOT EXISTS user_realname ( provider_order_no VARCHAR(128) NOT NULL DEFAULT '' COMMENT '服务商订单号', status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT '认证状态: pending待处理, success成功, failed失败', masked_name VARCHAR(64) NOT NULL DEFAULT '' COMMENT '脱敏姓名', + encrypted_name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '加密的完整姓名', masked_id_no VARCHAR(64) NOT NULL DEFAULT '' COMMENT '脱敏身份证号', + encrypted_id_no VARCHAR(255) NOT NULL DEFAULT '' COMMENT '加密的完整身份证号', verified_at DATETIME NULL COMMENT '认证通过时间', fail_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '失败原因', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -694,6 +696,94 @@ INSERT INTO announcements (title, content, category, priority, is_pinned, is_imp 非工作时间留言,客服上线后会第一时间回复。', 'faq', 60, 0, 0, 'published', NOW()); +-- ------------------------------------------- +-- 用户收款账号表(提现功能) +-- ------------------------------------------- + +CREATE TABLE IF NOT EXISTS user_payment_accounts ( + id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', + account_type VARCHAR(32) NOT NULL COMMENT '账号类型: alipay支付宝, wechat微信, bank银行卡', + account_name VARCHAR(128) NOT NULL COMMENT '账户名(真实姓名)', + account_no VARCHAR(255) NOT NULL COMMENT '账号(加密存储)', + + -- 银行卡专用字段 + bank_name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '银行名称', + bank_branch VARCHAR(255) NOT NULL DEFAULT '' COMMENT '开户行支行', + + -- 凭证 + certificate_urls JSON NULL COMMENT '认证凭证(收款码截图等)', + + is_default TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否默认账号', + status VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '状态: active正常, disabled禁用', + + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + KEY idx_user_payment_accounts_user_id (user_id), + KEY idx_user_payment_accounts_user_default (user_id, is_default) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户收款账号表'; + +-- ------------------------------------------- +-- 提现申请表 +-- ------------------------------------------- + +CREATE TABLE IF NOT EXISTS withdrawal_requests ( + id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + withdraw_no VARCHAR(64) NOT NULL COMMENT '提现单号', + user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', + amount DECIMAL(12,2) NOT NULL COMMENT '提现金额', + fee DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '手续费', + actual_amount DECIMAL(12,2) NOT NULL COMMENT '实际到账金额', + + -- 收款账号信息(快照) + payment_account_id BIGINT UNSIGNED NULL COMMENT '收款账号ID', + account_type VARCHAR(32) NOT NULL COMMENT '账号类型', + account_name VARCHAR(128) NOT NULL COMMENT '账户名', + account_no VARCHAR(128) NOT NULL COMMENT '账号(脱敏显示)', + bank_name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '银行名称', + bank_branch VARCHAR(255) NOT NULL DEFAULT '' COMMENT '开户行支行', + + status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT '状态: pending待审核, processing处理中, completed已完成, rejected已拒绝, cancelled已取消', + + -- 审核信息 + reviewed_by BIGINT UNSIGNED NULL COMMENT '审核人ID(财务管理员)', + reviewed_at DATETIME NULL COMMENT '审核时间', + review_remark VARCHAR(255) NOT NULL DEFAULT '' COMMENT '审核备注', + + -- 打款信息 + paid_by BIGINT UNSIGNED NULL COMMENT '打款人ID(财务管理员)', + paid_at DATETIME NULL COMMENT '打款时间', + payment_proof_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '打款凭证URL', + payment_remark VARCHAR(255) NOT NULL DEFAULT '' COMMENT '打款备注', + + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + UNIQUE KEY uk_withdrawal_requests_withdraw_no (withdraw_no), + KEY idx_withdrawal_requests_user_id (user_id), + KEY idx_withdrawal_requests_status (status), + KEY idx_withdrawal_requests_created (created_at DESC) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='提现申请表'; + +-- ------------------------------------------- +-- 提现相关权限 +-- ------------------------------------------- + +-- 添加提现相关权限 +INSERT IGNORE INTO permissions (code, name, resource, action) VALUES +('withdrawal:list', '查看提现列表', 'withdrawal', 'list'), +('withdrawal:review', '审核提现', 'withdrawal', 'review'), +('withdrawal:pay', '确认打款', 'withdrawal', 'pay'), +('withdrawal:detail', '查看提现详情', 'withdrawal', 'detail'), +('withdrawal:approve', '提现审核', 'withdrawal', 'approve'), +('wallet:admin_ledger', '查看资金流水', 'wallet', 'admin_ledger'); + +-- 关联提现权限到财务角色 +INSERT IGNORE INTO role_permissions (role_id, permission_id) +SELECT r.id, p.id FROM roles r, permissions p +WHERE r.code = 'finance' AND p.code IN ('withdrawal:list', 'withdrawal:review', 'withdrawal:pay', 'withdrawal:detail', 'withdrawal:approve', 'wallet:admin_ledger'); + -- ============================================ -- 数据库初始化完成 -- ============================================ diff --git a/backend/migrations/000002_add_withdrawal_tables.sql b/backend/migrations/000002_add_withdrawal_tables.sql deleted file mode 100644 index 5c82b32..0000000 --- a/backend/migrations/000002_add_withdrawal_tables.sql +++ /dev/null @@ -1,107 +0,0 @@ --- ============================================ --- 提现功能数据库迁移脚本 --- 创建时间: 2026-06-06 --- ============================================ - -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ------------------------------------------- --- 用户收款账号表 --- ------------------------------------------- - -CREATE TABLE IF NOT EXISTS user_payment_accounts ( - id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, - user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', - account_type VARCHAR(32) NOT NULL COMMENT '账号类型: alipay支付宝, wechat微信, bank银行卡', - account_name VARCHAR(128) NOT NULL COMMENT '账户名(真实姓名)', - account_no VARCHAR(255) NOT NULL COMMENT '账号(加密存储)', - - -- 银行卡专用字段 - bank_name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '银行名称', - bank_branch VARCHAR(255) NOT NULL DEFAULT '' COMMENT '开户行支行', - - -- 凭证 - certificate_urls JSON NULL COMMENT '认证凭证(收款码截图等)', - - is_default TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否默认账号', - status VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '状态: active正常, disabled禁用', - - created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - - KEY idx_user_payment_accounts_user_id (user_id), - KEY idx_user_payment_accounts_user_default (user_id, is_default) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户收款账号表'; - --- ------------------------------------------- --- 提现申请表 --- ------------------------------------------- - -CREATE TABLE IF NOT EXISTS withdrawal_requests ( - id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, - withdraw_no VARCHAR(64) NOT NULL COMMENT '提现单号', - user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', - amount DECIMAL(12,2) NOT NULL COMMENT '提现金额', - fee DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '手续费', - actual_amount DECIMAL(12,2) NOT NULL COMMENT '实际到账金额', - - -- 收款账号信息(快照) - payment_account_id BIGINT UNSIGNED NULL COMMENT '收款账号ID', - account_type VARCHAR(32) NOT NULL COMMENT '账号类型', - account_name VARCHAR(128) NOT NULL COMMENT '账户名', - account_no VARCHAR(128) NOT NULL COMMENT '账号(脱敏显示)', - bank_name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '银行名称', - bank_branch VARCHAR(255) NOT NULL DEFAULT '' COMMENT '开户行支行', - - status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT '状态: pending待审核, processing处理中, completed已完成, rejected已拒绝, cancelled已取消', - - -- 审核信息 - reviewed_by BIGINT UNSIGNED NULL COMMENT '审核人ID(财务管理员)', - reviewed_at DATETIME NULL COMMENT '审核时间', - review_remark VARCHAR(255) NOT NULL DEFAULT '' COMMENT '审核备注', - - -- 打款信息 - paid_by BIGINT UNSIGNED NULL COMMENT '打款人ID(财务管理员)', - paid_at DATETIME NULL COMMENT '打款时间', - payment_proof_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '打款凭证URL', - payment_remark VARCHAR(255) NOT NULL DEFAULT '' COMMENT '打款备注', - - created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - - UNIQUE KEY uk_withdrawal_requests_withdraw_no (withdraw_no), - KEY idx_withdrawal_requests_user_id (user_id), - KEY idx_withdrawal_requests_status (status), - KEY idx_withdrawal_requests_created (created_at DESC) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='提现申请表'; - --- ------------------------------------------- --- 权限数据 --- ------------------------------------------- - --- 添加提现相关权限(如果不存在) -INSERT IGNORE INTO permissions (code, name, resource, action) VALUES -('withdrawal:list', '查看提现列表', 'withdrawal', 'list'), -('withdrawal:review', '审核提现', 'withdrawal', 'review'), -('withdrawal:pay', '确认打款', 'withdrawal', 'pay'), -('withdrawal:detail', '查看提现详情', 'withdrawal', 'detail'), -('withdrawal:approve', '提现审核', 'withdrawal', 'approve'); - --- 钱包管理员流水权限(如果不存在) -INSERT IGNORE INTO permissions (code, name, resource, action) VALUES -('wallet:admin_ledger', '查看资金流水', 'wallet', 'admin_ledger'); - --- 创建财务角色(如果不存在) -INSERT IGNORE INTO roles (code, name, description) VALUES -('finance', '财务管理员', '负责提现审核、打款确认、资金流水查询'); - --- 关联权限到财务角色(如果不存在) -INSERT IGNORE INTO role_permissions (role_id, permission_id) -SELECT - (SELECT id FROM roles WHERE code = 'finance'), - id -FROM permissions -WHERE code IN ('withdrawal:list', 'withdrawal:review', 'withdrawal:pay', 'withdrawal:detail', 'withdrawal:approve', 'wallet:admin_ledger'); - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/backend/migrations/000003_add_encrypted_realname_fields.sql b/backend/migrations/000003_add_encrypted_realname_fields.sql deleted file mode 100644 index e8cff63..0000000 --- a/backend/migrations/000003_add_encrypted_realname_fields.sql +++ /dev/null @@ -1,7 +0,0 @@ --- 添加加密字段到实名认证表 -ALTER TABLE user_realname -ADD COLUMN encrypted_name VARCHAR(255) NOT NULL DEFAULT '' COMMENT '加密的完整姓名' AFTER masked_name, -ADD COLUMN encrypted_id_no VARCHAR(255) NOT NULL DEFAULT '' COMMENT '加密的完整身份证号' AFTER masked_id_no; - --- 为已有记录添加索引(加密字段不需要索引) --- 但保留原有的 user_id 唯一索引 diff --git a/scripts/deploy-prod.sh b/scripts/deploy-prod.sh index bd152d0..5b3b45f 100755 --- a/scripts/deploy-prod.sh +++ b/scripts/deploy-prod.sh @@ -219,12 +219,12 @@ SQL clean_legacy_migrations() { local has_legacy - has_legacy="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset');")" + has_legacy="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset', '000002_add_withdrawal_tables', '000003_add_encrypted_realname_fields');")" if [[ "${has_legacy}" != "0" ]]; then - log_warn "检测到旧的迁移记录(000002-000008),正在清理..." + log_warn "检测到旧的迁移记录,正在清理..." mysql_exec "$(require_env MYSQL_DATABASE)" -e \ - "DELETE FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset');" + "DELETE FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset', '000002_add_withdrawal_tables', '000003_add_encrypted_realname_fields');" log_success "已清理旧迁移记录" fi } diff --git a/scripts/dev.sh b/scripts/dev.sh index 39976d8..30ceaba 100755 --- a/scripts/dev.sh +++ b/scripts/dev.sh @@ -250,12 +250,12 @@ SQL clean_legacy_migrations() { local has_legacy - has_legacy="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset');")" + has_legacy="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset', '000002_add_withdrawal_tables', '000003_add_encrypted_realname_fields');")" if [[ "${has_legacy}" != "0" ]]; then - log_warn "检测到旧的迁移记录(000002-000008),正在清理..." + log_warn "检测到旧的迁移记录,正在清理..." mysql_hfb --default-character-set=utf8mb4 -e \ - "DELETE FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset');" "${MYSQL_DATABASE}" + "DELETE FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset', '000002_add_withdrawal_tables', '000003_add_encrypted_realname_fields');" "${MYSQL_DATABASE}" log_success "已清理旧迁移记录" fi }