合并数据库迁移文件,解决 --reset-db 数据不一致问题
- 将 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 <noreply@anthropic.com>
This commit is contained in:
@@ -36,7 +36,9 @@ CREATE TABLE IF NOT EXISTS user_realname (
|
|||||||
provider_order_no VARCHAR(128) NOT NULL DEFAULT '' COMMENT '服务商订单号',
|
provider_order_no VARCHAR(128) NOT NULL DEFAULT '' COMMENT '服务商订单号',
|
||||||
status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT '认证状态: pending待处理, success成功, failed失败',
|
status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT '认证状态: pending待处理, success成功, failed失败',
|
||||||
masked_name VARCHAR(64) NOT NULL DEFAULT '' COMMENT '脱敏姓名',
|
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 '脱敏身份证号',
|
masked_id_no VARCHAR(64) NOT NULL DEFAULT '' COMMENT '脱敏身份证号',
|
||||||
|
encrypted_id_no VARCHAR(255) NOT NULL DEFAULT '' COMMENT '加密的完整身份证号',
|
||||||
verified_at DATETIME NULL COMMENT '认证通过时间',
|
verified_at DATETIME NULL COMMENT '认证通过时间',
|
||||||
fail_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '失败原因',
|
fail_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '失败原因',
|
||||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
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());
|
非工作时间留言,客服上线后会第一时间回复。', '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');
|
||||||
|
|
||||||
-- ============================================
|
-- ============================================
|
||||||
-- 数据库初始化完成
|
-- 数据库初始化完成
|
||||||
-- ============================================
|
-- ============================================
|
||||||
|
|||||||
@@ -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;
|
|
||||||
@@ -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 唯一索引
|
|
||||||
@@ -219,12 +219,12 @@ SQL
|
|||||||
|
|
||||||
clean_legacy_migrations() {
|
clean_legacy_migrations() {
|
||||||
local has_legacy
|
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
|
if [[ "${has_legacy}" != "0" ]]; then
|
||||||
log_warn "检测到旧的迁移记录(000002-000008),正在清理..."
|
log_warn "检测到旧的迁移记录,正在清理..."
|
||||||
mysql_exec "$(require_env MYSQL_DATABASE)" -e \
|
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 "已清理旧迁移记录"
|
log_success "已清理旧迁移记录"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -250,12 +250,12 @@ SQL
|
|||||||
|
|
||||||
clean_legacy_migrations() {
|
clean_legacy_migrations() {
|
||||||
local has_legacy
|
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
|
if [[ "${has_legacy}" != "0" ]]; then
|
||||||
log_warn "检测到旧的迁移记录(000002-000008),正在清理..."
|
log_warn "检测到旧的迁移记录,正在清理..."
|
||||||
mysql_hfb --default-character-set=utf8mb4 -e \
|
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 "已清理旧迁移记录"
|
log_success "已清理旧迁移记录"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user