feat: 迭代

This commit is contained in:
2026-05-13 17:49:33 +08:00
parent 554bb702a2
commit e471b75f59
180 changed files with 22683 additions and 3691 deletions
+445 -44
View File
@@ -94,6 +94,7 @@ CREATE TABLE `merchants` (
`seller_id` BIGINT UNSIGNED NOT NULL COMMENT '关联商家账户ID',
`shop_name` VARCHAR(100) NOT NULL COMMENT '店铺名称',
`logo` VARCHAR(500) DEFAULT '' COMMENT '店铺Logo',
`cover_image` VARCHAR(500) DEFAULT '' COMMENT '店铺封面图片',
`hotel_images` TEXT DEFAULT NULL COMMENT '酒店照片,多张URL用逗号分隔',
`description` TEXT COMMENT '店铺描述',
`store_license` VARCHAR(255) DEFAULT NULL COMMENT '门店营业执照',
@@ -114,8 +115,8 @@ CREATE TABLE `merchants` (
`legal_person` VARCHAR(50) DEFAULT '' COMMENT '法人姓名',
`status` ENUM('pending','approved','rejected','frozen') NOT NULL DEFAULT 'pending' COMMENT '状态',
`reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '拒绝原因',
`deposit` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '保证金',
`wallet_balance` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '待提现余额',
`deposit` DECIMAL(10,2) DEFAULT 0.00 COMMENT '保证金',
`wallet_balance` DECIMAL(10,2) DEFAULT 0.00 COMMENT '待提现余额',
`bank_name` VARCHAR(100) DEFAULT '' COMMENT '开户银行',
`bank_account` VARCHAR(50) DEFAULT '' COMMENT '银行账号',
`account_name` VARCHAR(50) DEFAULT '' COMMENT '账户名',
@@ -124,8 +125,9 @@ CREATE TABLE `merchants` (
`bank_license` VARCHAR(255) DEFAULT NULL COMMENT '开户营业执照(对公账户)',
`account_id_card_front` VARCHAR(255) DEFAULT NULL COMMENT '开户身份证正面(对私账户)',
`account_id_card_back` VARCHAR(255) DEFAULT NULL COMMENT '开户身份证反面(对私账户)',
`rating` DECIMAL(2,1) UNSIGNED DEFAULT 5.0 COMMENT '评分',
`rating` DECIMAL(2,1) DEFAULT 5.0 COMMENT '评分',
`review_count` INT UNSIGNED DEFAULT 0 COMMENT '评价数',
`sales_count` INT UNSIGNED DEFAULT 0 COMMENT '销量统计',
`auto_confirm` TINYINT(1) DEFAULT 0 COMMENT '是否自动接单',
`auto_confirm_rules` JSON DEFAULT NULL COMMENT '自动接单规则配置',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -135,6 +137,7 @@ CREATE TABLE `merchants` (
KEY `idx_status` (`status`),
KEY `idx_city` (`city`),
KEY `idx_rating` (`rating`),
KEY `idx_sales_count` (`sales_count`),
KEY `idx_contract_type` (`contract_type`),
KEY `idx_account_type` (`account_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商家表';
@@ -154,11 +157,11 @@ CREATE TABLE `rooms` (
`facilities` JSON DEFAULT NULL COMMENT '设施列表(WiFi,停车,早餐等)',
`images` JSON DEFAULT NULL COMMENT '图片URL列表',
`cover_image` VARCHAR(500) DEFAULT '' COMMENT '封面图',
`price` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '基础价格/晚',
`price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '基础价格/晚',
`status` ENUM('on_sale','off_sale') NOT NULL DEFAULT 'on_sale' COMMENT '状态',
`audit_status` ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending' COMMENT '审核状态',
`audit_reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '审核拒绝原因',
`rating` DECIMAL(2,1) UNSIGNED DEFAULT 5.0 COMMENT '评分',
`rating` DECIMAL(2,1) DEFAULT 5.0 COMMENT '评分',
`review_count` INT UNSIGNED DEFAULT 0 COMMENT '评价数',
`description` TEXT COMMENT '房源描述',
`cancel_policy` ENUM('free','flexible','strict') DEFAULT 'flexible' COMMENT '取消政策',
@@ -179,7 +182,7 @@ CREATE TABLE `room_calendar` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`room_id` BIGINT UNSIGNED NOT NULL COMMENT '房型ID',
`date` DATE NOT NULL COMMENT '日期',
`price` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '当日房价',
`price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '当日房价',
`stock` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '可售数量',
`sold` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已售数量',
`status` ENUM('available','unavailable') NOT NULL DEFAULT 'available' COMMENT '房态',
@@ -221,13 +224,13 @@ CREATE TABLE `orders` (
`check_out_date` DATE NOT NULL COMMENT '离店日期',
`nights` TINYINT UNSIGNED NOT NULL COMMENT '入住晚数',
`room_count` TINYINT UNSIGNED DEFAULT 1 COMMENT '房间数',
`room_price` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '房费单价',
`room_amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '房费总额',
`service_fee` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '软件服务费',
`merchant_income` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '商家预计收入',
`coupon_discount` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '优惠券抵扣',
`total_amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '订单总金额',
`pay_amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '实付金额',
`room_price` DECIMAL(10,2) NOT NULL COMMENT '房费单价',
`room_amount` DECIMAL(10,2) NOT NULL COMMENT '房费总额',
`service_fee` DECIMAL(10,2) DEFAULT 0.00 COMMENT '软件服务费',
`merchant_income` DECIMAL(10,2) DEFAULT 0.00 COMMENT '商家预计收入',
`coupon_discount` DECIMAL(10,2) DEFAULT 0.00 COMMENT '优惠券抵扣',
`total_amount` DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
`pay_amount` DECIMAL(10,2) NOT NULL COMMENT '实付金额',
`payment_method` ENUM('wechat','alipay','balance') DEFAULT NULL COMMENT '支付方式',
`payment_no` VARCHAR(64) DEFAULT NULL COMMENT '支付流水号',
`paid_at` DATETIME DEFAULT NULL COMMENT '支付时间',
@@ -243,7 +246,7 @@ CREATE TABLE `orders` (
`checkin_at` DATETIME DEFAULT NULL COMMENT '实际入住时间',
`checkout_at` DATETIME DEFAULT NULL COMMENT '实际离店时间',
`cancelled_at` DATETIME DEFAULT NULL COMMENT '取消时间',
`refund_amount` DECIMAL(10,2) UNSIGNED DEFAULT NULL COMMENT '退款金额',
`refund_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '退款金额',
`refund_at` DATETIME DEFAULT NULL COMMENT '退款时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
@@ -303,8 +306,8 @@ CREATE TABLE `coupons` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL COMMENT '优惠券名称',
`type` ENUM('fixed','percent') NOT NULL COMMENT '类型:固定金额/百分比折扣',
`value` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '优惠金额/折扣比例',
`min_amount` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '最低使用金额',
`value` DECIMAL(10,2) NOT NULL COMMENT '优惠金额/折扣比例',
`min_amount` DECIMAL(10,2) DEFAULT 0.00 COMMENT '最低使用金额',
`total_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '发放总量',
`used_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '已使用数量',
`remain_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '剩余数量',
@@ -399,10 +402,10 @@ CREATE TABLE `settlements` (
`period_start` DATE NOT NULL COMMENT '周期开始日期(周日)',
`period_end` DATE NOT NULL COMMENT '周期结束日期(周六)',
`order_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单数量',
`order_amount` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '订单总金额',
`commission_rate` DECIMAL(5,4) UNSIGNED NOT NULL DEFAULT 0.0000 COMMENT '佣金比例',
`commission_amount` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '佣金金额',
`settlement_amount` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '结算金额(订单金额-佣金)',
`order_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单总金额',
`commission_rate` DECIMAL(5,4) NOT NULL DEFAULT 0.0000 COMMENT '佣金比例',
`commission_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '佣金金额',
`settlement_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '结算金额(订单金额-佣金)',
`status` ENUM('pending','approved','rejected') NOT NULL DEFAULT 'pending' COMMENT '状态',
`reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '拒绝原因',
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '审核人ID',
@@ -423,10 +426,10 @@ CREATE TABLE `withdrawals` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商家ID',
`settlement_ids` JSON DEFAULT NULL COMMENT '关联对账单ID列表',
`amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '提现金额',
`fee` DECIMAL(10,2) UNSIGNED DEFAULT 0.00 COMMENT '手续费',
`commission_amount` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '平台佣金',
`actual_amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '实际到账金额',
`amount` DECIMAL(10,2) NOT NULL COMMENT '提现金额',
`fee` DECIMAL(10,2) DEFAULT 0.00 COMMENT '手续费',
`commission_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '平台佣金',
`actual_amount` DECIMAL(10,2) NOT NULL COMMENT '实际到账金额',
`bank_name` VARCHAR(100) NOT NULL COMMENT '开户银行',
`bank_account` VARCHAR(50) NOT NULL COMMENT '银行账号',
`account_name` VARCHAR(50) NOT NULL COMMENT '账户名',
@@ -517,19 +520,6 @@ CREATE TABLE `operation_logs` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
-- ============================================================
-- 23. 对账单明细表
-- ============================================================
CREATE TABLE `settlement_items` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`settlement_id` BIGINT UNSIGNED NOT NULL COMMENT '对账单ID',
`order_id` BIGINT UNSIGNED NOT NULL COMMENT '订单ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
`order_amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '订单金额',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_settlement_id` (`settlement_id`),
KEY `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='对账单明细表';
-- ============================================================
-- 24. 营销活动总表
@@ -576,10 +566,10 @@ CREATE TABLE `mkt_cashbacks` (
`invitee_id` BIGINT UNSIGNED NOT NULL COMMENT '被邀请人用户ID',
`order_id` BIGINT UNSIGNED NOT NULL COMMENT '关联订单ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
`order_amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '订单金额',
`order_amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额',
`order_index` TINYINT UNSIGNED NOT NULL COMMENT '被邀请人第几单(1/2)',
`rate` DECIMAL(5,4) UNSIGNED NOT NULL COMMENT '返现比例',
`amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '返现金额',
`rate` DECIMAL(5,4) NOT NULL COMMENT '返现比例',
`amount` DECIMAL(10,2) NOT NULL COMMENT '返现金额',
`status` ENUM('pending','settled','cancelled') NOT NULL DEFAULT 'pending' COMMENT '状态',
`settled_at` DATETIME DEFAULT NULL COMMENT '到账时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -601,9 +591,9 @@ CREATE TABLE `mkt_user_invite_stats` (
`invite_code` VARCHAR(32) NOT NULL COMMENT '专属邀请码',
`total_invites` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '累计邀请人数',
`total_orders` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '累计下单人数',
`total_cashback` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '累计返现金额',
`available_balance` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '可提现余额',
`withdrawn_amount` DECIMAL(10,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '已提现金额',
`total_cashback` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计返现金额',
`available_balance` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '可提现余额',
`withdrawn_amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '已提现金额',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
@@ -619,7 +609,7 @@ CREATE TABLE `mkt_invite_withdrawals` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`activity_id` BIGINT UNSIGNED NOT NULL COMMENT '活动ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`amount` DECIMAL(10,2) UNSIGNED NOT NULL COMMENT '提现金额',
`amount` DECIMAL(10,2) NOT NULL COMMENT '提现金额',
`status` ENUM('pending','approved','rejected','paid') NOT NULL DEFAULT 'pending' COMMENT '状态',
`reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '拒绝原因',
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '审核人ID',
@@ -632,3 +622,414 @@ CREATE TABLE `mkt_invite_withdrawals` (
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请提现申请表';
-- ============================================================
-- 补充字段(原 002-004 迁移脚本)
-- ============================================================
-- 注意:cover_image 和 sales_count 已经在 merchants 表定义中包含,无需再次添加
-- 修复 mkt_user_invite_stats 表的 user_id 字段
-- 确保字段定义正确
ALTER TABLE `mkt_user_invite_stats`
MODIFY COLUMN `user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID';
-- ============================================================
-- 财务系统 - 按角色拆分账户、交易流水、提现表
-- 版本: v3.0
-- 说明: 用户、商家、平台的账户和交易流水独立管理
-- ============================================================
-- ============================================================
-- 第一部分:账户表(按角色拆分)
-- ============================================================
-- 1. 用户账户表
CREATE TABLE IF NOT EXISTS `user_accounts` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '账户ID',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '可用余额',
`frozen_balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '冻结余额(提现中)',
`total_income` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计收入(邀请返现)',
`total_expense` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计支出(提现)',
`total_cashback` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计返现收入',
`total_withdraw` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计提现金额',
`version` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`status` ENUM('active','frozen','closed') NOT NULL DEFAULT 'active' COMMENT '账户状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_id` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户账户表';
-- 2. 商家账户表
CREATE TABLE IF NOT EXISTS `merchant_accounts` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '账户ID',
`merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商家ID',
`balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '可用余额',
`frozen_balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '冻结余额(提现中)',
`debt_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '欠款金额(退款扣回)',
`total_income` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计收入(订单结算)',
`total_expense` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计支出(提现+退款扣回)',
`total_settlement` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计结算金额',
`total_withdraw` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计提现金额',
`last_settlement_at` DATETIME DEFAULT NULL COMMENT '最后结算时间',
`pending_settlement` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '待结算金额',
`version` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`status` ENUM('active','frozen','closed') NOT NULL DEFAULT 'active' COMMENT '账户状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_merchant_id` (`merchant_id`),
KEY `idx_status` (`status`),
KEY `idx_last_settlement_at` (`last_settlement_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商家账户表';
-- 3. 平台账户表
CREATE TABLE IF NOT EXISTS `platform_accounts` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '账户ID',
`account_name` VARCHAR(50) NOT NULL COMMENT '账户名称(如:主账户、备用账户)',
`balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '可用余额',
`frozen_balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '冻结余额(提现中)',
`total_income` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计收入(订单收入)',
`total_expense` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计支出(结算+返现+提现)',
`total_order_income` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计订单收入',
`total_service_fee` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计服务费收入',
`total_settlement` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计商家结算支出',
`total_cashback` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计返现支出',
`total_withdraw` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '累计提现金额',
`version` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`status` ENUM('active','frozen','closed') NOT NULL DEFAULT 'active' COMMENT '账户状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_account_name` (`account_name`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台账户表';
-- ============================================================
-- 第二部分:交易流水表(按角色拆分)
-- ============================================================
-- 4. 用户交易流水表
CREATE TABLE IF NOT EXISTS `user_transactions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水ID',
`transaction_no` VARCHAR(32) NOT NULL COMMENT '交易流水号(全局唯一)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`account_id` BIGINT UNSIGNED NOT NULL COMMENT '用户账户ID',
`direction` ENUM('income','expense') NOT NULL COMMENT '方向:income-收入/expense-支出',
`amount` DECIMAL(12,2) NOT NULL COMMENT '金额(正数)',
`balance_before` DECIMAL(12,2) NOT NULL COMMENT '交易前余额',
`balance_after` DECIMAL(12,2) NOT NULL COMMENT '交易后余额',
`transaction_type` VARCHAR(50) NOT NULL COMMENT '交易类型',
`business_type` VARCHAR(50) NOT NULL COMMENT '业务类型:cashback/withdraw/refund',
`business_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '业务ID(订单ID/提现ID等)',
`business_no` VARCHAR(32) DEFAULT NULL COMMENT '业务单号',
`related_account_type` ENUM('platform','merchant') DEFAULT NULL COMMENT '对方账户类型',
`related_account_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '对方账户ID',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_transaction_no` (`transaction_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_transaction_type` (`transaction_type`),
KEY `idx_business` (`business_type`, `business_id`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户交易流水表';
-- 5. 商家交易流水表
CREATE TABLE IF NOT EXISTS `merchant_transactions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水ID',
`transaction_no` VARCHAR(32) NOT NULL COMMENT '交易流水号(全局唯一)',
`merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商家ID',
`account_id` BIGINT UNSIGNED NOT NULL COMMENT '商家账户ID',
`direction` ENUM('income','expense') NOT NULL COMMENT '方向:income-收入/expense-支出',
`amount` DECIMAL(12,2) NOT NULL COMMENT '金额(正数)',
`balance_before` DECIMAL(12,2) NOT NULL COMMENT '交易前余额',
`balance_after` DECIMAL(12,2) NOT NULL COMMENT '交易后余额',
`transaction_type` VARCHAR(50) NOT NULL COMMENT '交易类型',
`business_type` VARCHAR(50) NOT NULL COMMENT '业务类型:settlement/withdraw/refund',
`business_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '业务ID(结算单ID/提现ID等)',
`business_no` VARCHAR(32) DEFAULT NULL COMMENT '业务单号',
`related_account_type` ENUM('platform') DEFAULT NULL COMMENT '对方账户类型',
`related_account_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '对方账户ID',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_transaction_no` (`transaction_no`),
KEY `idx_merchant_id` (`merchant_id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_transaction_type` (`transaction_type`),
KEY `idx_business` (`business_type`, `business_id`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商家交易流水表';
-- 6. 平台交易流水表
CREATE TABLE IF NOT EXISTS `platform_transactions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水ID',
`transaction_no` VARCHAR(32) NOT NULL COMMENT '交易流水号(全局唯一)',
`account_id` BIGINT UNSIGNED NOT NULL COMMENT '平台账户ID',
`direction` ENUM('income','expense') NOT NULL COMMENT '方向:income-收入/expense-支出',
`amount` DECIMAL(12,2) NOT NULL COMMENT '金额(正数)',
`balance_before` DECIMAL(12,2) NOT NULL COMMENT '交易前余额',
`balance_after` DECIMAL(12,2) NOT NULL COMMENT '交易后余额',
`transaction_type` VARCHAR(50) NOT NULL COMMENT '交易类型',
`business_type` VARCHAR(50) NOT NULL COMMENT '业务类型:order/settlement/cashback/withdraw/refund',
`business_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '业务ID',
`business_no` VARCHAR(32) DEFAULT NULL COMMENT '业务单号',
`related_account_type` ENUM('user','merchant') DEFAULT NULL COMMENT '对方账户类型',
`related_account_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '对方账户ID',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_transaction_no` (`transaction_no`),
KEY `idx_account_id` (`account_id`),
KEY `idx_transaction_type` (`transaction_type`),
KEY `idx_business` (`business_type`, `business_id`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台交易流水表';
-- ============================================================
-- 第三部分:提现表(按角色拆分)
-- ============================================================
-- 7. 用户提现表
CREATE TABLE IF NOT EXISTS `user_withdrawals` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '提现ID',
`withdraw_no` VARCHAR(32) NOT NULL COMMENT '提现单号(全局唯一)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`account_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_channel` ENUM('wechat','alipay') NOT NULL COMMENT '提现渠道',
`payment_account` VARCHAR(100) DEFAULT NULL COMMENT '收款账号',
`payment_name` VARCHAR(50) DEFAULT NULL COMMENT '收款人姓名',
`status` ENUM('pending','approved','rejected','paid','failed') NOT NULL DEFAULT 'pending' COMMENT '状态',
`reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '拒绝原因',
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '审核人ID',
`reviewed_at` DATETIME DEFAULT NULL COMMENT '审核时间',
`paid_at` DATETIME DEFAULT NULL COMMENT '打款时间',
`payment_no` VARCHAR(100) DEFAULT NULL COMMENT '第三方支付单号',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_withdraw_no` (`withdraw_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户提现表';
-- 8. 商家提现表
CREATE TABLE IF NOT EXISTS `merchant_withdrawals` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '提现ID',
`withdraw_no` VARCHAR(32) NOT NULL COMMENT '提现单号(全局唯一)',
`merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商家ID',
`account_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_channel` ENUM('bank','wechat','alipay') NOT NULL DEFAULT 'bank' COMMENT '提现渠道',
`bank_name` VARCHAR(100) DEFAULT NULL COMMENT '开户银行',
`bank_account` VARCHAR(50) DEFAULT NULL COMMENT '银行账号',
`account_name` VARCHAR(50) DEFAULT NULL COMMENT '账户名',
`status` ENUM('pending','approved','rejected','paid','failed') NOT NULL DEFAULT 'pending' COMMENT '状态',
`reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '拒绝原因',
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '审核人ID',
`reviewed_at` DATETIME DEFAULT NULL COMMENT '审核时间',
`paid_at` DATETIME DEFAULT NULL COMMENT '打款时间',
`payment_no` VARCHAR(100) DEFAULT NULL COMMENT '第三方支付单号',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_withdraw_no` (`withdraw_no`),
KEY `idx_merchant_id` (`merchant_id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商家提现表';
-- 9. 平台提现表
CREATE TABLE IF NOT EXISTS `platform_withdrawals` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '提现ID',
`withdraw_no` VARCHAR(32) NOT NULL COMMENT '提现单号(全局唯一)',
`account_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_channel` ENUM('bank') NOT NULL DEFAULT 'bank' COMMENT '提现渠道',
`bank_name` VARCHAR(100) NOT NULL COMMENT '开户银行',
`bank_account` VARCHAR(50) NOT NULL COMMENT '银行账号',
`account_name` VARCHAR(50) NOT NULL COMMENT '账户名',
`status` ENUM('pending','approved','rejected','paid','failed') NOT NULL DEFAULT 'pending' COMMENT '状态',
`reject_reason` VARCHAR(500) DEFAULT NULL COMMENT '拒绝原因',
`reviewer_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '审核人ID(超级管理员)',
`reviewed_at` DATETIME DEFAULT NULL COMMENT '审核时间',
`paid_at` DATETIME DEFAULT NULL COMMENT '打款时间',
`payment_no` VARCHAR(100) DEFAULT NULL COMMENT '第三方支付单号',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_withdraw_no` (`withdraw_no`),
KEY `idx_account_id` (`account_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台提现表';
-- ============================================================
-- 第四部分:结算和对账表
-- ============================================================
-- 10. 结算单表 - 商家按周期结算订单收入
CREATE TABLE IF NOT EXISTS `settlements` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '结算单ID',
`settlement_no` VARCHAR(32) NOT NULL COMMENT '结算单号',
`merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商家ID',
`period_start` DATE NOT NULL COMMENT '结算周期开始日期',
`period_end` DATE NOT NULL COMMENT '结算周期结束日期',
`order_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单数量',
`order_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '订单总额',
`service_fee` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '服务费总额',
`settlement_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '结算金额(订单总额-服务费)',
`debt_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '扣除欠款金额',
`actual_amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '实际结算金额(扣除欠款后)',
`status` ENUM('pending','settled','failed') NOT NULL DEFAULT 'pending' COMMENT '状态',
`settled_at` DATETIME DEFAULT NULL COMMENT '结算时间',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_settlement_no` (`settlement_no`),
KEY `idx_merchant_id` (`merchant_id`),
KEY `idx_period` (`period_start`, `period_end`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='结算单表';
-- 11. 结算明细表 - 记录结算单包含的订单明细
CREATE TABLE IF NOT EXISTS `settlement_items` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`settlement_id` BIGINT UNSIGNED NOT NULL COMMENT '结算单ID',
`order_id` BIGINT UNSIGNED NOT NULL COMMENT '订单ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
`order_amount` DECIMAL(12,2) NOT NULL COMMENT '订单金额',
`service_fee` DECIMAL(12,2) NOT NULL COMMENT '服务费',
`settlement_amount` DECIMAL(12,2) NOT NULL COMMENT '结算金额',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_settlement_id` (`settlement_id`),
KEY `idx_order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='结算明细表';
-- 12. 日对账表 - 每日自动对账,确保资金平衡
CREATE TABLE IF NOT EXISTS `daily_reconciliations` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '对账ID',
`reconciliation_date` DATE NOT NULL COMMENT '对账日期',
`platform_balance` DECIMAL(12,2) NOT NULL COMMENT '平台账户余额',
`merchant_balance_sum` DECIMAL(12,2) NOT NULL COMMENT '所有商家账户余额总和',
`user_balance_sum` DECIMAL(12,2) NOT NULL COMMENT '所有用户账户余额总和',
`total_balance` DECIMAL(12,2) NOT NULL COMMENT '总余额(平台+商家+用户)',
`order_income` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '当日订单收入',
`service_fee` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '当日服务费',
`merchant_settlement` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '当日商家结算',
`cashback_expense` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '当日返现支出',
`withdraw_expense` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '当日提现支出',
`refund_expense` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '当日退款支出',
`status` ENUM('balanced','unbalanced') NOT NULL DEFAULT 'balanced' COMMENT '状态',
`error_message` TEXT DEFAULT NULL COMMENT '异常信息',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_date` (`reconciliation_date`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日对账表';
-- ============================================================
-- 常住人信息表
-- ============================================================
CREATE TABLE `guests` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`name` VARCHAR(50) NOT NULL COMMENT '姓名',
`phone` VARCHAR(20) NOT NULL COMMENT '手机号',
`id_card` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
`gender` ENUM('male','female') DEFAULT NULL COMMENT '性别',
`is_default` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否默认',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_is_default` (`is_default`),
CONSTRAINT `fk_guests_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='常住人信息表';
-- ============================================================
-- 第五部分:表结构补充和字段添加
-- ============================================================
-- 1. 订单表添加第三方支付交易号字段(用于微信支付退款)
ALTER TABLE `orders`
ADD COLUMN `transaction_id` VARCHAR(64) NULL COMMENT '第三方支付交易号' AFTER `payment_no`,
ADD INDEX `idx_transaction_id` (`transaction_id`);
-- 2. 用户表添加实名认证字段
ALTER TABLE `users`
ADD COLUMN `is_verified` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否实名认证' AFTER `id_card`,
ADD COLUMN `verified_at` DATETIME DEFAULT NULL COMMENT '实名认证时间' AFTER `is_verified`;
-- ============================================================
-- 第六部分:初始化数据
-- ============================================================
-- 1. 创建平台主账户
INSERT INTO `platform_accounts` (`account_name`, `status`)
VALUES ('主账户', 'active');
-- ============================================================
-- 第七部分:创建触发器
-- ============================================================
-- 注意:触发器使用 DELIMITER 命令,某些数据库工具不支持
-- 如果执行失败,请使用 mysql 命令行工具执行,或在应用层处理账户创建逻辑
-- 1. 用户注册时自动创建账户
-- DROP TRIGGER IF EXISTS `trg_user_create_account`;
-- DELIMITER $$
-- CREATE TRIGGER `trg_user_create_account` AFTER INSERT ON `users`
-- FOR EACH ROW
-- BEGIN
-- IF NEW.status = 'active' THEN
-- INSERT INTO `user_accounts` (`user_id`, `balance`, `frozen_balance`, `total_income`, `total_expense`, `status`)
-- VALUES (NEW.id, 0.00, 0.00, 0.00, 0.00, 'active');
-- END IF;
-- END$$
-- DELIMITER ;
-- 2. 商家审核通过时自动创建账户
-- DROP TRIGGER IF EXISTS `trg_merchant_create_account`;
-- DELIMITER $$
-- CREATE TRIGGER `trg_merchant_create_account` AFTER UPDATE ON `merchants`
-- FOR EACH ROW
-- BEGIN
-- IF NEW.status = 'approved' AND OLD.status != 'approved' THEN
-- INSERT INTO `merchant_accounts` (`merchant_id`, `balance`, `frozen_balance`, `total_income`, `total_expense`, `status`)
-- VALUES (NEW.id, 0.00, 0.00, 0.00, 0.00, 'active');
-- END IF;
-- END$$
-- DELIMITER ;
-- ============================================================
-- 完成
-- ============================================================
SELECT '数据库初始化完成!' as message;
SELECT '已创建平台账户' as info;
@@ -1,11 +0,0 @@
-- ============================================================
-- 迁移: 为商家表添加封面图片字段
-- 版本: 002
-- 日期: 2024-05-11
-- ============================================================
USE `rent_platform`;
-- 为 merchants 表添加 cover_image 字段
ALTER TABLE `merchants`
ADD COLUMN `cover_image` VARCHAR(500) DEFAULT '' COMMENT '店铺封面图片' AFTER `logo`;
@@ -0,0 +1,26 @@
-- 添加微信登录相关字段
-- 执行时间: 2026-05-13
USE rent_platform;
-- 修改 users 表,添加微信相关字段
ALTER TABLE `users`
-- 手机号改为可空,因为微信登录时可能没有手机号
MODIFY COLUMN `phone` VARCHAR(20) NULL COMMENT '手机号',
-- 删除手机号的唯一索引
DROP INDEX `phone`,
-- 添加手机号的普通索引
ADD INDEX `idx_phone` (`phone`),
-- 添加微信 openid 字段
ADD COLUMN `wechat_openid` VARCHAR(100) NULL COMMENT '微信openid' AFTER `password`,
-- 添加微信 unionid 字段
ADD COLUMN `wechat_unionid` VARCHAR(100) NULL COMMENT '微信unionid' AFTER `wechat_openid`,
-- 添加 openid 索引
ADD INDEX `idx_wechat_openid` (`wechat_openid`),
-- 添加 unionid 索引
ADD INDEX `idx_wechat_unionid` (`wechat_unionid`);
-- 说明:
-- 1. phone 字段改为可空,支持微信登录时无手机号的情况
-- 2. 添加 wechat_openid 和 wechat_unionid 字段用于微信登录
-- 3. 为这些字段添加索引以提高查询性能
@@ -1,5 +0,0 @@
-- 为 merchants 表添加 sales_count 字段
ALTER TABLE merchants ADD COLUMN sales_count INT UNSIGNED DEFAULT 0 COMMENT '销量统计';
-- 为 sales_count 字段添加索引,方便按销量排序
CREATE INDEX idx_merchants_sales_count ON merchants(sales_count);
+141
View File
@@ -0,0 +1,141 @@
# 数据库迁移脚本说明
## 📦 迁移脚本
### 完整初始化(推荐)
**文件**: `001_init_schema.sql` (49KB, 886行)
**包含内容**
- ✅ 所有基础表结构(用户、商家、订单、房源等)
- ✅ 营销活动表(邀请返现、优惠券等)
- ✅ 财务系统表(账户、交易流水、提现、结算、对账)
- ✅ 自动创建账户触发器
- ✅ 初始化数据(平台账户、用户账户、商家账户)
**使用场景**
- 全新项目初始化
- 开发环境重建
- 测试环境搭建
**执行方式**
```bash
# 删除旧数据库(谨慎操作!)
mysql -u root -p -e "DROP DATABASE IF EXISTS rent_platform;"
# 执行完整初始化
mysql -u root -p < migrations/001_init_schema.sql
# 验证
mysql -u root -p rent_platform -e "SHOW TABLES;"
mysql -u root -p rent_platform -e "SELECT account_type, COUNT(*) as count FROM accounts GROUP BY account_type;"
```
---
## 📊 数据库表结构
### 完整初始化后的表列表(共 34 张表)
#### 用户与权限(4张)
- `users` - 用户表
- `admins` - 平台管理员表
- `sellers` - 商家账户表
- `user_oauth` - 第三方账号绑定表
#### 商家与房源(6张)
- `merchants` - 商家表
- `rooms` - 房型/房源表
- `room_calendar` - 房量房价日历表
- `room_calendar_logs` - 房态变更日志表
- `favorites` - 收藏表
- `reviews` - 评价表
#### 订单与支付(2张)
- `orders` - 订单表
- `payments` - 支付记录表
#### 营销活动(7张)
- `coupons` - 优惠券模板表
- `user_coupons` - 用户优惠券表
- `mkt_activities` - 营销活动表
- `mkt_invitations` - 邀请关系表
- `mkt_cashbacks` - 返现记录表
- `mkt_user_invite_stats` - 用户邀请统计表
- `mkt_invite_withdrawals` - 邀请提现申请表(已废弃,使用 withdrawals
#### 财务系统(6张)⭐ 核心
- `accounts` - 账户表(用户/商家/平台统一账户)
- `transactions` - 交易流水表(复式记账)
- `withdrawals` - 提现表(统一提现管理)
- `settlements` - 结算单表(商家周结算)
- `settlement_items` - 结算明细表
- `daily_reconciliations` - 日对账表
#### 其他(9张)
- `banners` - 轮播图表
- `notifications` - 通知表
- `system_configs` - 系统配置表
- `operation_logs` - 操作日志表
- `sms_logs` - 短信发送日志表
- `upload_files` - 文件上传记录表
---
## 🚀 快速开始
### 新项目初始化
```bash
# 执行完整初始化脚本(包含所有功能)
mysql -u root -p < migrations/001_init_schema.sql
# 验证
mysql -u root -p rent_platform -e "SHOW TABLES;"
mysql -u root -p rent_platform -e "SELECT account_type, COUNT(*) as count FROM accounts GROUP BY account_type;"
```
---
## ⚠️ 注意事项
### 数据安全
1. **备份数据库**:执行任何迁移前,务必备份数据库
```bash
mysqldump -u root -p rent_platform > backup_$(date +%Y%m%d_%H%M%S).sql
```
2. **测试环境验证**:先在测试环境执行,确认无误后再在生产环境执行
3. **检查依赖**:确保 MySQL 版本 >= 5.7(支持 JSON 类型和触发器)
### 触发器说明
脚本会自动创建以下触发器:
- `trg_user_create_account` - 用户注册时自动创建账户
- `trg_merchant_create_account` - 商家审核通过时自动创建账户
如果触发器已存在,会自动跳过。
---
## 📝 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| v2.0 | 2026-05-12 | 整合所有功能,添加完整财务系统 |
| v1.0 | 2026-05-08 | 初始化数据库结构 |
---
## 📧 问题反馈
如有问题,请联系开发团队或查看:
- [财务系统完整文档](../财务系统完整文档.md)
- [数据库文档索引](../README.md)
---
**最后更新**2026-05-12
**维护团队**:开发团队
-584
View File
@@ -1,584 +0,0 @@
# 模块需求 Skills
本文档定义各业务模块的详细规则和约束。
---
## 1. 用户认证模块
### 登录方式
| 方式 | 场景 | 说明 |
| ------------- | ----------- | -------------------------- |
| 手机号+验证码 | 小程序用户 | 发送6位验证码,5分钟有效 |
| 账号密码 | 商家/管理员 | 密码6-20位,bcrypt加密 |
| 微信授权 | 小程序用户 | 获取openid,自动绑定或注册 |
| 支付宝授权 | 小程序用户 | 获取openid,自动绑定或注册 |
### JWT配置
- Token有效期: 2小时
- RefreshToken有效期: 7天
- 刷新机制: 过期前30分钟可无感刷新
### 角色权限
| 角色 | 认证端点 | 可访问路由 | 权限范围 |
| ------ | --------------- | ---------------------- | ---------------- |
| user | /auth/\* | /rooms, /orders, /user | 仅自己的数据 |
| seller | /seller-auth/\* | /merchant/\* | 仅自己店铺的数据 |
| admin | /auth/\* | /admin/_, /auth/_ | 全平台数据 |
### 账户体系
| 账户类型 | 表名 | 说明 |
| ---------- | ------- | -------------------------- |
| C端用户 | users | 小程序用户,支持第三方登录 |
| 商家账户 | sellers | B端商家,独立账户体系 |
| 平台管理员 | admins | 平台运营管理人员 |
### 商家入驻流程
```
小程序「个人中心」→ 点击「商家入驻」→ 跳转商家注册/登录页
→ 商家账号注册(手机号+密码+联系人+邮箱)
→ 注册成功后跳转商家中心
→ 创建店铺(店铺名称、地址、营业执照等)
→ 提交审核 → 平台审核 → 通过后可营业
```
#### 商家注册校验规则
| 字段 | 规则 | 错误提示 |
| ----------- | ---------------------------- | ---------------- |
| phone | 必填,正则 `/^1[3-9]\d{9}$/` | 手机号格式不正确 |
| code | 必填,6位数字 | 请输入6位验证码 |
| contactName | 必填,2-50字 | 请填写联系人姓名 |
| email | 选填,正则邮箱格式 | 邮箱格式不正确 |
| password | 选填,6-20位 | 密码长度为6-20位 |
#### 商家注册后端校验
- 验证码校验(开发环境万能验证码: 123456)
- 手机号唯一性检查(已注册则返回400: 该手机号已注册)
- 密码选填,填写时 bcrypt 加密存储(salt rounds: 10
- 注册成功自动生成 accessToken + refreshToken
- JWT payload 包含: `{ sub, phone, role: 'seller', merchantId }`
#### 商家登录方式
| 方式 | 参数 | 说明 |
| ---------- | ---------------- | -------------------- |
| 验证码登录 | phone + code | 6位验证码,5分钟有效 |
| 密码登录 | phone + password | 需先设置密码 |
#### 验证码缓存
- 开发环境: 内存Map缓存,5分钟过期
- 生产环境: TODO 替换为 Redis
#### 商家中心页面状态机
| 条件 | 展示内容 |
| ---------------------------------- | ------------------------------ |
| 未登录商家账号 | 引导注册/登录 |
| 已登录但未创建店铺(merchantId为空) | 引导创建店铺 |
| 已登录且merchantId有值 | 店铺管理面板(状态、数据、菜单) |
#### 店铺审核状态展示
| status | 显示 | 可修改 | 功能菜单 | 特殊展示 |
| -------- | ------ | ------ | -------- | ------------------------ |
| pending | 审核中 | 否 | 隐藏 | 提示"审核中,暂不可修改" |
| approved | 营业中 | 是 | 显示 | 数据概览+功能菜单 |
| rejected | 已拒绝 | 是 | 隐藏 | 红色拒绝原因区块 |
| frozen | 已冻结 | 否 | 隐藏 | 提示"联系客服" |
#### 修改店铺重新审核规则
- 审核通过(approved)或拒绝(rejected)状态下修改店铺信息
- 后端自动将 status 重置为 pending,清空 rejectReason
- 商家中心显示"审核中"状态,等待重新审核
---
## 2. 房源模块
### 房源类型
| 类型 | 说明 | 默认设施 |
| --------- | ---- | ------------------------ |
| hotel | 酒店 | WiFi, 独立卫浴, 空调 |
| homestay | 民宿 | WiFi, 厨房, 洗衣机 |
| apartment | 公寓 | WiFi, 厨房, 洗衣机, 冰箱 |
| hostel | 青旅 | WiFi, 公共卫浴 |
### 取消政策
| 政策 | 说明 | 退款比例 |
| -------- | -------- | ---------------------------- |
| free | 免费取消 | 入住前任意时间全额退款 |
| flexible | 灵活取消 | 入住前24小时全额,之后50% |
| strict | 严格取消 | 入住前48小时全额,之后不退款 |
### 房量日历规则
- 默认提前365天可预订
- 价格继承自基础价格,可单独调整
- 房态变更需记录日志(操作人、时间、变更内容)
- 批量修改支持按日期范围、房型批量设置
---
## 3. 订单模块
### 订单状态流转
```
待支付 ──支付成功──> 待确认 ──商家确认──> 待入住 ──入住──> 已入住 ──离店──> 已完成
│ │ │
└──超时/取消──> 已取消 └──商家拒绝──> 已取消 └──用户退款──> 退款中
├──商家通过──> 已退款(恢复房量)
└──商家拒绝──> 已取消
待确认 ──用户退款──> 退款中 ──商家通过──> 已退款(恢复房量)
```
### 用户订单操作
| 操作 | 接口 | 适用状态 | 说明 |
| -------- | ------------------------- | ---------------------------- | ------------------------ |
| 取消订单 | PUT /orders/:id/cancel | pending_pay, pending_confirm | 取消订单,已支付则退款 |
| 申请退款 | PUT /orders/:id/refund | pending_confirm, pending_checkin | 提交退款申请 |
### 商家订单操作
| 操作 | 接口 | 适用状态 | 说明 |
| ---------- | ----------------------------------------- | ----------------- | ----------------------------- |
| 确认订单 | PUT /seller/orders/:id/confirm | pending_confirm | 确认后等待用户入住 |
| 拒绝订单 | PUT /seller/orders/:id/reject | pending_confirm | 拒绝并退款 |
| 办理入住 | PUT /seller/orders/:id/checkin | pending_checkin | 标记已入住 |
| 通过退款 | PUT /seller/orders/:id/approve-refund | refunding | 同意退款,恢复房量日历库存 |
| 拒绝退款 | PUT /seller/orders/:id/reject-refund | refunding | 拒绝退款,订单变为已取消 |
### 自动化规则
- 待支付订单: 30分钟未支付自动取消
- 已入住订单: 离店后24小时自动完成
- 商家自动接单: 可配置金额阈值、房型限制、时间范围
### 价格计算
```
房费总额 = 房价/晚 × 入住晚数 × 房间数
订单总额 = 房费总额
实付金额 = 订单总额 - 优惠券抵扣
软件服务费 = 实付金额 × 服务费比例(默认5%,平台后台可配置)
商家预计收入 = 实付金额 - 软件服务费
```
**说明**
- 软件服务费归平台所有,在订单创建时计算
- 商家预计收入 = 实付金额 - 软件服务费
- 费用明细仅在商家订单详情中展示,用户端不显示
### 佣金计算
```
平台佣金 = 实付金额 × 佣金比例(默认10%)
商家结算 = 实付金额 - 平台佣金
```
---
## 4. 优惠券模块
### 优惠券类型
| 类型 | value含义 | 使用规则 |
| ------- | ----------------- | ------------------ |
| fixed | 固定金额(元) | 满 min_amount 可用 |
| percent | 折扣比例(0.9=9折) | 最高优惠可配置 |
### 适用范围
| scope | 说明 | scope_id |
| -------- | ------------ | -------- |
| platform | 全平台通用 | null |
| merchant | 指定商家可用 | 商家ID |
| room | 指定房源可用 | 房源ID |
### 使用规则
- 每单限用1张
- 不找零、不兑现
- 过期自动失效
- 使用后不可退回
---
## 5. 促销活动模块
### 活动类型
| 类型 | rules字段示例 | 说明 |
| -------------- | ---------------------------------- | ---------- |
| full_reduction | `{"threshold": 500, "reduce": 50}` | 满500减50 |
| discount | `{"discount": 0.85}` | 全场85折 |
| package | `{"items": [...], "price": 888}` | 套餐打包价 |
### 活动优先级
1. 房源级活动 > 商家级活动 > 平台级活动
2. 同级别时,创建时间晚的优先
3. 优惠不可叠加,取最优
---
## 6. 评价模块
### 评价规则
- 订单完成后7天内可评价
- 评价后不可修改
- 支持追评(商家回复后)
- 匿名评价隐藏用户昵称头像
### 评分维度
- 综合评分: 1-5分(必填)
- 评价内容: 最多500字(选填)
- 图片/视频: 最多9张(选填)
### 商家回复
- 每条评价仅可回复一次
- 回复后用户可追评一次
---
## 7. 财务模块
### 结算周期
- 预付订单: 用户支付后T+1结算给商家
- 现付订单: 用户入住后结算
### 提现规则
- 最低提现金额: 100元
- 提现手续费: 无
- 到账时间: T+1工作日
- 需绑定银行卡
### 对账维度
| 对账类型 | 说明 |
| -------- | ---------------- |
| 预付对账 | 预付订单结算明细 |
| 现付对账 | 现付订单收款明细 |
| 应付对账 | 平台应付商家明细 |
---
## 8. 消息通知模块
### 通知类型
| type | 场景 | 模板 |
| --------- | ------------ | --------------------------------- |
| order | 订单状态变更 | "您的订单{{orderNo}}已{{status}}" |
| system | 系统公告 | 直接展示content |
| promotion | 促销活动 | "{{activityName}}即将开始" |
| review | 评价提醒 | "您有一条新评价待回复" |
### 推送渠道
- 小程序: 模板消息(需用户授权)
- 短信: 重要订单状态(需验证手机号)
- 站内信: 全部通知
---
## 9. 搜索与筛选
### 搜索维度
- 目的地: 城市/商圈/地标
- 关键词: 房源名称(支持模糊、拼音首字母)
- 地图选点: 按半径筛选
### 筛选条件
| 条件 | 类型 | 说明 |
| -------- | ---------- | ------------------------------- |
| 价格区间 | [min, max] | 每晚价格 |
| 房型 | 多选 | hotel/homestay/apartment/hostel |
| 设施服务 | 多选 | WiFi/停车/早餐等 |
| 入住日期 | 日期范围 | 检查房量 |
| 评分 | 最小值 | 默认不限 |
### 排序方式
- 智能推荐(默认): 综合评分、销量、距离
- 价格升序/降序
- 评分降序
- 距离升序(需位置权限)
---
## 10. 安全与风控
### 请求限流
| 接口 | 限制 | 时间窗口 |
| ---------- | ---------- | ---------- |
| 发送验证码 | 1次/分钟 | 同一手机号 |
| 登录 | 5次/分钟 | 同一IP |
| 创建订单 | 10次/分钟 | 同一用户 |
| API通用 | 100次/分钟 | 同一用户 |
### 敏感操作
- 修改密码: 需验证旧密码或手机验证码
- 绑定银行卡: 需实名认证
- 提现: 需二次验证
- 账号注销: 需验证手机号 + 7天冷静期
### 数据加密
- 手机号存储: AES-256加密
- 身份证号: AES-256加密
- 支付数据: RSA加密传输
---
## 11. 邀请返现活动模块
### 模块概述
邀请返现是平台级营销活动,独立于其他促销活动管理。平台管理后台有专门的「邀请返现」菜单入口,不与其他活动混在一起。
### 活动概述
平台级营销活动,用户(邀请人)通过分享邀请链接/海报邀请新用户注册并完成订单,邀请人获得返现奖励。被邀请人无额外收益。
### 返现规则
| 订单序号 | 返现比例 | 最低返现 | 最高返现 |
| -------- | --------------- | -------- | -------- |
| 第1单 | 订单金额 × 5% | 0.01元 | 50元 |
| 第2单 | 订单金额 × 0.5% | 0.01元 | 50元 |
- 仅限被邀请人首次下单(第1、2单)触发返现
- 订单状态为「已完成」时才计算返现
- 退款订单不计算返现
### 提现规则
| 规则 | 值 |
| ------------ | -------------------- |
| 最低提现金额 | 10元 |
| 提现方式 | 微信零钱(自动打款) |
| 到账时间 | T+1工作日 |
| 提现手续费 | 0 |
### 数据表结构
#### mkt_activities - 营销活动总表
| 字段 | 类型 | 说明 |
| ---------- | ----------------------- | ------------------ |
| id | BIGINT PK | 主键 |
| name | VARCHAR(100) | 活动名称 |
| type | ENUM('invite_cashback') | 活动类型 |
| enabled | TINYINT(1) | 是否启用 |
| config | JSON | 活动配置(见下方) |
| start_time | DATETIME | 活动开始时间 |
| end_time | DATETIME | 活动结束时间 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
**invite_cashback 类型 config 结构:**
```json
{
"firstOrderRate": 0.05,
"secondOrderRate": 0.005,
"minCashback": 0.01,
"maxCashback": 50,
"withdrawThreshold": 10
}
```
#### mkt_invitations - 邀请关系表
| 字段 | 类型 | 说明 |
| ----------- | ------------ | ------------------------ |
| id | BIGINT PK | 主键 |
| activity_id | BIGINT | 活动ID |
| inviter_id | BIGINT | 邀请人用户ID |
| invitee_id | BIGINT | 被邀请人用户ID |
| invite_code | VARCHAR(32) | 邀请码(邀请人唯一标识) |
| scene | VARCHAR(100) | 小程序scene参数 |
| created_at | DATETIME | 邀请时间 |
**约束**: 一个被邀请人只能被一个人邀请(UNIQUE invitee_id
#### mkt_cashbacks - 返现记录表
| 字段 | 类型 | 说明 |
| ------------ | ------------------------------------- | ---------------------------------------------- |
| id | BIGINT PK | 主键 |
| activity_id | BIGINT | 活动ID |
| inviter_id | BIGINT | 邀请人用户ID |
| invitee_id | BIGINT | 被邀请人用户ID |
| order_id | BIGINT | 关联订单ID |
| order_no | VARCHAR(32) | 订单号 |
| order_amount | DECIMAL(10,2) | 订单金额 |
| order_index | TINYINT | 被邀请人第几单(1/2) |
| rate | DECIMAL(5,4) | 返现比例 |
| amount | DECIMAL(10,2) | 返现金额 |
| status | ENUM('pending','settled','cancelled') | pending=待结算 settled=已到账 cancelled=已取消 |
| settled_at | DATETIME | 到账时间 |
| created_at | DATETIME | 创建时间 |
**约束**: 同一订单同一邀请人只能有一条返现记录(UNIQUE order_id + inviter_id
#### mkt_user_invite_stats - 用户邀请统计表
| 字段 | 类型 | 说明 |
| ----------------- | ------------- | ------------ |
| id | BIGINT PK | 主键 |
| activity_id | BIGINT | 活动ID |
| user_id | BIGINT UNIQUE | 用户ID |
| invite_code | VARCHAR(32) | 专属邀请码 |
| total_invites | INT | 累计邀请人数 |
| total_orders | INT | 累计下单人数 |
| total_cashback | DECIMAL(10,2) | 累计返现金额 |
| available_balance | DECIMAL(10,2) | 可提现余额 |
| withdrawn_amount | DECIMAL(10,2) | 已提现金额 |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
#### mkt_invite_withdrawals - 邀请提现申请表
| 字段 | 类型 | 说明 |
| ------------- | -------------------------------------------- | -------- |
| id | BIGINT PK | 主键 |
| activity_id | BIGINT | 活动ID |
| user_id | BIGINT | 用户ID |
| amount | DECIMAL(10,2) | 提现金额 |
| status | ENUM('pending','approved','rejected','paid') | 状态 |
| reject_reason | VARCHAR(500) | 拒绝原因 |
| reviewer_id | BIGINT | 审核人ID |
| reviewed_at | DATETIME | 审核时间 |
| paid_at | DATETIME | 打款时间 |
| created_at | DATETIME | 申请时间 |
| updated_at | DATETIME | 更新时间 |
### 核心业务流程
```
用户A生成邀请海报/链接 → 用户B扫码进入小程序
→ B注册时记录邀请关系(mkt_invitations)
→ B完成第1单 → 订单完成时触发返现
→ 计算返现金额(payAmount × 5%)
→ 写入mkt_cashbacksstatus=settled
→ 更新mkt_user_invite_stats.available_balance
→ B完成第2单 → 同上(0.5%)
→ A的available_balance累计 ≥ 10元 → A申请提现
→ 写入mkt_invite_withdrawalsstatus=pending
→ 平台审核 → approved
→ 确认打款 → paid
```
### 订单完成触发返现逻辑
```
订单状态变为completed时:
1. 查询该用户是否被邀请(mkt_invitations.invitee_id = userId)
2. 若无邀请关系 → 跳过
3. 查询活动是否启用(mkt_activities.enabled = true)
4. 查询该被邀请人已完成订单数(不含退款)
5. 若订单序号 > 2 → 跳过
6. 检查是否已有返现记录(防重复)
7. 根据订单序号取返现比例(1→5%, 2→0.5%)
8. 计算返现金额 = payAmount × rate,限制在[min, max]
9. 写入mkt_cashbacks,直接设为settled
10. 更新mkt_user_invite_stats(累计字段 + available_balance
```
### 小程序分享机制
**分享方式**:
1. 小程序原生分享(onShareAppMessage)→ 携带邀请人ID
2. 生成海报图片 → 含小程序码(wxacode.getUnlimited
3. 复制链接 → 含邀请码
**小程序码参数**: `scene: i=userId的base62编码`
**注册时绑定逻辑**:
- 从scene或shareTicket解析出inviter_id
- 注册成功后自动创建mkt_invitations记录
- 同时初始化mkt_user_invite_stats(为邀请人生成invite_code
### 邀请码规则
- 格式: 用户ID的base62编码,长度6-8位
- 唯一: 每个用户一个invite_code
- 场景值: `i={inviteCode}`
### API 接口设计
**用户端(需用户Token):**
| 方法 | 路径 | 说明 |
| ---- | --------------------------------- | -------------------------- |
| GET | /user/activity/invite/stats | 获取我的邀请统计 |
| GET | /user/activity/invite/records | 邀请记录列表 |
| GET | /user/activity/invite/cashbacks | 返现记录列表 |
| POST | /user/activity/invite/withdraw | 申请提现 |
| GET | /user/activity/invite/withdrawals | 提现记录列表 |
| POST | /user/activity/invite/bind | 绑定邀请关系(注册后调用) |
**平台管理端(需管理员Token):**
| 方法 | 路径 | 说明 |
| ---- | ---------------------------------------------- | --------------- |
| GET | /admin/activity/invite/stats | 邀请数据总览 |
| GET | /admin/activity/invite/config | 获取活动配置 |
| PUT | /admin/activity/invite/config | 更新活动配置 |
| GET | /admin/activity/invite/records | 邀请记录列表 |
| GET | /admin/activity/invite/cashbacks | 返现记录列表 |
| GET | /admin/activity/invite/withdrawals | 提现审核列表 |
| PUT | /admin/activity/invite/withdrawals/:id/approve | 审核通过 |
| PUT | /admin/activity/invite/withdrawals/:id/reject | 审核拒绝 |
| PUT | /admin/activity/invite/withdrawals/:id/pay | 确认打款 |
**注意**: 平台管理后台不再提供通用的活动列表CRUD,邀请返现活动有独立的配置管理页面。
### 小程序页面路由
| 页面 | 路径 | 说明 |
| -------- | ----------------------- | ---------------------------- |
| 邀请首页 | /pages/invite/index | 邀请统计、海报生成、分享 |
| 邀请记录 | /pages/invite/records | 邀请人数、被邀请人列表 |
| 返现记录 | /pages/invite/cashbacks | 返现明细列表 |
| 提现页面 | /pages/invite/withdraw | 余额展示、提现操作 |
| 提现记录 | /pages/invite/withdrawals | 提现历史列表 |
| 邀请海报 | /pages/invite/poster | 生成分享海报 |
### 平台管理后台页面
| 页面 | 路径 | 说明 |
| ------------ | -------- | ---------------------------------------------- |
| 邀请返现管理 | /invite | 数据概览、提现审核、活动配置三个Tab |
**页面结构**:
- 数据概览Tab: 统计卡片 + 邀请记录列表 + 返现记录列表
- 提现审核Tab: 提现申请列表,支持审核通过/拒绝/确认打款
- 活动配置Tab: 启用/停用开关 + 返现比例/金额限制/提现门槛配置表单
-734
View File
@@ -1,734 +0,0 @@
# 数据库 Skills
## 数据库信息
- **数据库名**: `rent_platform`
- **字符集**: `utf8mb4`
- **排序规则**: `utf8mb4_unicode_ci`
- **时区**: `+08:00`
## 表结构总览
| 表名 | 说明 | 核心字段 |
| ------------------ | -------------- | ---------------------------------------------------- |
| admins | 平台管理员表 | id, username, name, role, status |
| users | 用户表 | id, phone, nickname, status |
| user_oauth | 第三方账号绑定 | user_id, provider, openid |
| sellers | 商家账户表 | id, phone, password, contact_name, status |
| merchants | 商家表 | seller_id, shop_name, status, rating |
| rooms | 房源表 | merchant_id, name, type, price, status, audit_status |
| room_calendar | 房量房价日历 | room_id, date, price, stock, status |
| room_calendar_logs | 房态变更日志 | room_id, operator_id, change_type |
| orders | 订单表 | order_no, user_id, merchant_id, room_id, pay_amount, service_fee, merchant_income, status, payment_method, payment_no, paid_at, confirmed_at, checkin_at, checkout_at, cancelled_at, refund_amount, refund_at, source |
| reviews | 评价表 | order_id, user_id, rating, content |
| favorites | 收藏表 | user_id, room_id |
| coupons | 优惠券模板 | name, type, value, scope |
| user_coupons | 用户优惠券 | user_id, coupon_id, status |
| promotions | 促销活动 | merchant_id, name, type, rules |
| member_levels | 会员等级 | level, name, min_points, discount |
| user_members | 用户会员信息 | user_id, level_id, points, growth_value |
| settlements | 结算对账单 | merchant_id, settlement_no, period_start, period_end, status |
| settlement_items | 对账单明细 | settlement_id, order_id, order_no, order_amount |
| withdrawals | 提现记录 | merchant_id, settlement_ids, amount, status |
| notifications | 消息通知 | user_id, type, title, content |
| advertisements | 广告位 | position, image, link_type |
| platform_configs | 平台配置 | config_key, config_value |
| operation_logs | 操作日志 | user_id, module, action, detail |
| mkt_activities | 营销活动总表 | name, type, enabled, config |
| mkt_invitations | 邀请关系 | activity_id, inviter_id, invitee_id, invite_code |
| mkt_cashbacks | 返现记录 | activity_id, inviter_id, order_id, amount, status |
| mkt_user_invite_stats | 用户邀请统计 | activity_id, user_id, invite_code, available_balance |
| mkt_invite_withdrawals | 邀请提现申请 | activity_id, user_id, amount, status |
## 核心关系
```
users (1) ──── (n) orders
└── (n) ──── (n) coupons (user_coupons)
└── (n) ──── (n) rooms (favorites)
sellers (1) ──── (1) merchants ──── (n) rooms ──── (n) room_calendar
└── (n) orders
orders (1) ──── (1) reviews
orders (1) ──── (1) settlements
```
## 状态枚举
### 管理员状态 (admins.status)
- `active` - 正常
- `frozen` - 冻结
### 管理员角色 (admins.role)
- `super_admin` - 超级管理员
- `admin` - 管理员
- `operator` - 运营人员
### 用户状态 (users.status)
- `active` - 正常
- `frozen` - 冻结
- `deleted` - 已注销
### 商家账户状态 (sellers.status)
- `active` - 正常
- `frozen` - 冻结
- `deleted` - 已注销
### 商家状态 (merchants.status)
- `pending` - 待审核
- `approved` - 已通过
- `rejected` - 已拒绝
- `frozen` - 已冻结
### 订单状态 (orders.status)
- `pending_pay` - 待支付
- `pending_confirm` - 待确认
- `pending_checkin` - 待入住
- `checked_in` - 已入住
- `completed` - 已完成
- `cancelled` - 已取消
- `refunding` - 退款中
- `refunded` - 已退款
### 订单状态流转
```
待支付 ──支付成功──> 待确认 ──商家确认──> 待入住 ──入住──> 已入住 ──自动离店──> 已完成
│ │ │
└──超时/取消──> 已取消 └──商家拒绝──> 已取消 └──用户退款──> 退款中
├──商家通过──> 已退款(恢复房量)
└──商家拒绝──> 已取消
待确认 ──用户退款──> 退款中 ──商家通过──> 已退款(恢复房量)
```
**自动完成机制**
- 定时任务每天凌晨 1 点执行(`OrderSchedule.completeExpiredOrders`
- 自动将"已入住"且"离店日期为前一天"的订单标记为"已完成"
- 记录 `checkout_at` 字段为当前时间
- 用户可在订单完成后进行评价
**商家手动确认离店**
- 商家可在订单详情页点击"确认离店"按钮
- 需满足条件:订单状态为"已入住"且当前日期 >= 离店日期
- 确认后订单立即变为"已完成",无需等待自动任务
- 适用场景:客人提前离店或商家需要立即完成订单
### 订单取消/退款规则
| 操作 | 适用状态 | 说明 |
| ------------ | ---------------------------- | --------------------------------------- |
| 用户取消 | pending_pay | 直接取消,无退款 |
| 用户取消 | pending_confirm | 取消并退款,恢复房量 |
| 用户退款申请 | pending_confirm, pending_checkin | 状态变为 refunding,等待商家审核 |
| 商家通过退款 | refunding | 状态变为 refunded,恢复房量日历库存 |
| 商家拒绝退款 | refunding | 状态变为 cancelled |
### 订单时间字段说明
| 字段 | 类型 | 说明 |
| ------------- | -------- | --------------------------------------- |
| created_at | datetime | 订单创建时间 |
| paid_at | datetime | 支付完成时间(支付成功后记录) |
| confirmed_at | datetime | 商家确认时间(商家确认订单后记录) |
| checkin_at | datetime | 实际入住时间(商家办理入住后记录) |
| checkout_at | datetime | 实际离店时间(自动完成或手动离店时记录)|
| cancelled_at | datetime | 取消时间(订单取消时记录) |
| refund_at | datetime | 退款时间(退款成功时记录) |
### 订单来源 (orders.source)
- `miniapp` - 小程序下单
- `web` - 网页下单
- `third_party` - 第三方平台(如美团、携程)
### 支付方式 (orders.payment_method)
- `wechat` - 微信支付
- `alipay` - 支付宝
- `balance` - 余额支付
### 房源状态 (rooms.status)
- `on_sale` - 在售
- `off_sale` - 已下架
### 房源审核状态 (rooms.audit_status)
- `pending` - 待审核
- `approved` - 已通过
- `rejected` - 已拒绝
### 房源类型 (rooms.type)
- `hotel` - 酒店
- `homestay` - 民宿
- `apartment` - 公寓
- `hostel` - 青旅
### 优惠券类型 (coupons.type)
- `fixed` - 固定金额
- `percent` - 百分比折扣
## 关键索引
```sql
-- 高频查询索引
idx_users_phone (phone)
idx_sellers_phone (phone)
idx_merchants_status (status)
idx_merchants_city (city)
idx_rooms_merchant_id (merchant_id)
idx_rooms_status_price (status, price)
idx_rooms_audit_status (audit_status)
idx_orders_user_id (user_id)
idx_orders_merchant_id (merchant_id)
idx_orders_status (status)
idx_orders_check_in (check_in_date)
idx_room_calendar_room_date (room_id, date)
```
## 查询示例
### 获取在售房源(含商家信息)
```sql
SELECT r.*, m.shop_name, m.city, m.rating as merchant_rating
FROM rooms r
JOIN merchants m ON r.merchant_id = m.id
WHERE r.status = 'on_sale' AND m.status = 'approved'
ORDER BY r.rating DESC
LIMIT 10;
```
### 获取房源日历
```sql
SELECT * FROM room_calendar
WHERE room_id = ? AND date BETWEEN ? AND ?
ORDER BY date;
```
### 批量更新房量房价
```sql
INSERT INTO room_calendar (room_id, date, price, stock, status)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE price = VALUES(price), stock = VALUES(stock), status = VALUES(status);
```
### 获取用户订单
```sql
SELECT o.*, r.name as room_name, m.shop_name
FROM orders o
JOIN rooms r ON o.room_id = r.id
JOIN merchants m ON o.merchant_id = m.id
WHERE o.user_id = ?
ORDER BY o.created_at DESC;
```
### 更新房量(预订成功)
```sql
UPDATE room_calendar
SET sold = sold + 1, stock = stock - 1
WHERE room_id = ? AND date = ? AND stock > 0;
```
## 数据迁移
```bash
# 初始化数据库
mysql -u root -p < database/migrations/001_init_schema.sql
# 导入种子数据
mysql -u root -p rent_platform < database/seeds/001_init_data.sql
```
## 注意事项
1. 用户手机号、身份证号需加密存储(AES-256)
2. 密码使用 bcrypt 哈希存储
3. 金额字段使用 DECIMAL(10,2) 避免精度丢失
4. JSON 字段用于存储数组/对象(如设施列表、活动规则)
5. 所有表都有 created_at 字段,核心表有 updated_at
6. 敏感操作需记录到 operation_logs 表
7. 订单自动完成:定时任务每天凌晨 1 点执行,将离店日期为前一天的"已入住"订单自动标记为"已完成"
## 定时任务
### 订单自动完成任务 (OrderSchedule)
**文件位置**: `apps/server/src/schedule/order.schedule.ts`
**执行时间**: 每天凌晨 1 点(Cron: `0 1 * * *`
**任务逻辑**:
```typescript
// 将前一天离店且状态为"已入住"的订单自动完成
UPDATE orders
SET status = 'completed', checkout_at = NOW()
WHERE status = 'checked_in'
AND DATE(check_out_date) = DATE(NOW() - INTERVAL 1 DAY)
```
**日志输出**: `已自动完成 N 笔过期订单 (YYYY-MM-DD)`
---
## 平台配置表 (platform_configs)
| 配置键 | 默认值 | 说明 |
| ----------------- | ------ | ------------------------ |
| commission_rate | 0.10 | 默认平台佣金比例 |
| service_fee_rate | 0.05 | 软件服务费比例(可配置) |
| min_deposit | 5000 | 最低保证金金额 |
| auto_cancel_minutes | 30 | 未支付订单自动取消时间 |
| auto_complete_hours | 24 | 入住后自动完成订单时间 |
| sms_enabled | true | 是否启用短信通知 |
| max_images_per_room | 20 | 每个房源最大图片数 |
| max_images_per_review | 9 | 每条评价最大图片数 |
**服务费计算**
- 软件服务费 = 实付金额 × service_fee_rate
- 商家预计收入 = 实付金额 - 软件服务费
- 配置可通过平台管理后台「系统设置」页面调整
---
## 商家入驻流程
### 流程概述
```
用户点击商家入驻 → 商家注册/登录页面 → 注册商家账户 → 创建店铺 → 提交审核 → 审核通过 → 开始营业
```
### 账户体系说明
| 账户类型 | 表名 | Token存储 | 路由前缀 |
| ---------- | ------- | ---------------------------- | ---------------------- |
| C端用户 | users | `token` / `userInfo` | /rooms, /orders, /user |
| 商家账户 | sellers | `sellerToken` / `sellerInfo` | /merchant/\* |
| 平台管理员 | admins | 管理后台独立存储 | /admin/\* |
**注意**: 用户和商家是独立的账户体系,一个用户可以同时是商家。
### 商家注册接口
| 接口 | 路径 | 说明 |
| ------------ | ------------------------------- | ------------------------- |
| 发送验证码 | POST /api/seller-auth/send-code | 发送商家验证码(6位数字) |
| 商家注册 | POST /api/seller-auth/register | 手机号+验证码注册 |
| 商家登录 | POST /api/seller-auth/login | 手机号+验证码或密码登录 |
| 刷新令牌 | POST /api/seller-auth/refresh | 使用refreshToken刷新 |
| 获取商家信息 | GET /api/seller-auth/profile | 需Bearer Token |
### 商家注册参数
```typescript
interface SellerRegisterParams {
phone: string; // 手机号(必填,正则:/^1[3-9]\d{9}$/
code: string; // 验证码(必填,6位数字)
contactName: string; // 联系人姓名(必填,2-50字)
email?: string; // 邮箱(选填,需验证格式)
password?: string; // 密码(选填,6-20位,便于密码登录)
}
```
### 商家登录参数
```typescript
interface SellerLoginParams {
phone: string; // 手机号(必填)
code?: string; // 验证码(可选,6位数字)
password?: string; // 密码(可选,6-20位)
}
// 注:验证码和密码至少填写一种
```
### 商家注册响应
```typescript
interface SellerLoginResult {
accessToken: string;
refreshToken: string;
sellerInfo: {
id: number;
phone: string;
contactName: string;
email?: string;
status: "active" | "frozen" | "deleted";
merchantId?: number; // 有值表示已创建店铺
merchantStatus?: string; // 店铺状态
};
}
```
### 商家入驻状态判断
| sellerInfo.merchantId | sellerInfo.merchantStatus | 状态说明 |
| --------------------- | ------------------------- | ---------------------- |
| 无/undefined | - | 未创建店铺,需引导创建 |
| 有值 | pending | 店铺审核中 |
| 有值 | approved | 已通过审核,可营业 |
| 有值 | rejected | 已拒绝,显示原因 |
| 有值 | frozen | 店铺已冻结 |
### 小程序页面路由
| 页面 | 路径 | 说明 |
| ------------- | ---------------------------- | ---------------------------- |
| 个人中心 | /pages/mine/index | 入口:商家中心、商家入驻按钮 |
| 商家注册/登录 | /pages/seller-register/index | 商家账号注册登录 |
| 商家中心 | /pages/seller/home | 商家管理入口 |
| 商家订单列表 | /pages/seller/orders | 商家订单管理 |
| 商家订单详情 | /pages/seller/order-detail | 商家订单详情 |
| 创建店铺 | /pages/shop-create/index | 填写店铺信息提交审核 |
| 修改店铺 | /pages/shop-edit/index | 修改店铺信息重新审核 |
### Store设计
```typescript
// useSellerStore (apps/miniapp/src/store/seller.ts)
const sellerToken = ref(uni.getStorageSync("sellerToken") || "");
const sellerInfo = ref<SellerInfo | null>(
uni.getStorageSync("sellerInfo") || null,
);
// 判断方法
isSellerLoggedIn(); // 是否登录商家账号
hasMerchant(); // 是否已创建店铺
```
---
## 店铺创建功能
### 创建店铺接口
| 接口 | 路径 | 说明 |
| ------------ | ------------------------ | ----------------------------------------------- |
| 申请创建店铺 | POST /api/merchant/apply | 需商家Token,创建后状态为pending |
| 获取我的店铺 | GET /api/merchant/mine | 需商家Token |
| 更新店铺信息 | PUT /api/merchant/update | 需商家Token,审核通过/拒绝后修改会重置为pending |
### 创建店铺参数 (ApplyMerchantDto)
| 字段 | 类型 | 必填 | 校验规则 |
| --------------- | ------ | ---- | ---------------- |
| shopName | string | 是 | 2-100字 |
| phone | string | 是 | 联系电话不能为空 |
| province | string | 否 | 省 |
| city | string | 否 | 市 |
| district | string | 否 | 区 |
| address | string | 否 | 详细地址 |
| businessLicense | string | 是 | 营业执照图片URL |
| licenseNo | string | 否 | 营业执照编号 |
| legalPerson | string | 否 | 法人姓名 |
| description | string | 否 | 店铺描述 |
### 创建店铺流程
```
商家中心 → 点击"创建店铺" → 填写表单 → 提交申请
→ 调用 POST /merchant/apply
→ 更新 sellerInfo.merchantId 和 merchantStatus
→ 跳转商家中心显示审核中状态
```
### 前端 API 模块
**文件**: `apps/miniapp/src/api/merchant.ts`
```typescript
applyMerchant(data); // 申请创建店铺
getMyMerchant(); // 获取我的店铺信息
updateMerchant(data); // 更新店铺信息
getMerchantById(id); // 获取商家详情(公开)
```
---
## 店铺审核状态展示
### 状态枚举与显示
| status | 显示文本 | 颜色 | 说明 |
| -------- | -------- | ---- | ---------------------------------- |
| pending | 审核中 | 橙色 | 等待平台审核,不可修改 |
| approved | 营业中 | 绿色 | 审核通过,可正常营业 |
| rejected | 已拒绝 | 红色 | 审核拒绝,显示原因,可修改重新提交 |
| frozen | 已冻结 | 灰色 | 店铺被冻结,联系客服 |
### 商家中心页面状态展示逻辑
**审核中 (pending)**:
- 显示状态标签"审核中"
- 显示提示"店铺信息审核中,暂不可修改"
- 不显示修改按钮
- 不显示数据概览和功能菜单
**审核通过 (approved)**:
- 显示状态标签"营业中"
- 显示店铺信息卡片(电话、地址等)
- 显示数据概览(订单、房源、收入、评分)
- 显示"修改店铺信息"按钮
- 显示功能菜单(订单管理、房源管理)
**审核拒绝 (rejected)**:
- 显示状态标签"已拒绝"
- 显示拒绝原因区块(红色背景,包含拒绝原因)
- 显示店铺信息卡片
- 显示"修改店铺信息"按钮
- 不显示数据概览和功能菜单
**店铺冻结 (frozen)**:
- 显示状态标签"已冻结"
- 显示提示"店铺已被冻结,请联系平台客服"
- 不显示修改按钮
- 不显示数据概览和功能菜单
### 修改店铺重新审核逻辑
**后端逻辑** (`merchant.service.ts`):
```typescript
async update(id, dto) {
const merchant = await this.findById(id);
// 审核通过或拒绝后修改,重置为pending
if (merchant.status === 'approved' || merchant.status === 'rejected') {
await this.merchantRepo.update(id, { ...dto, status: 'pending', rejectReason: null });
} else {
await this.merchantRepo.update(id, dto);
}
return this.findById(id);
}
```
**修改流程**:
```
点击"修改店铺信息" → 填写表单 → 提交修改
→ 调用 PUT /merchant/update
→ 后端自动将 status 重置为 pending,清空 rejectReason
→ 跳转商家中心显示"审核中"状态
```
### 后续迭代事项
1. **商家管理后台集成**: 商家后台跳转入口
2. **商家实名认证**: 身份证上传、银行卡绑定
3. **图片上传接口**: 营业执照真实上传功能
---
## 三端分离开发规范
### 三端定义
| 端 | 说明 | 前端项目 | API路由前缀 |
|---|---|---|---|
| 用户端 | C端普通用户 | 小程序用户页面 (`pages/*`) | `/xxx` (无前缀) |
| 商家端 | B端商家 | 小程序商家页面 (`pages/seller/*`) + 商家管理后台 (`merchant-admin`) | `/seller/xxx` |
| 平台端 | 平台管理员 | 平台管理后台 (`platform-admin`) | `/admin/xxx` |
### 后端 Controller 文件命名规范
每个模块的控制器按端拆分为独立文件,命名格式:`{module}-{端}.controller.ts`
```
modules/merchant/
├── merchant-public.controller.ts # 用户端 @Controller('merchants')
├── merchant-seller.controller.ts # 商家端 @Controller('seller/merchant')
├── merchant-admin.controller.ts # 管理端 @Controller('admin/merchants')
├── merchant.service.ts # 共享 Service
├── merchant.module.ts # 模块定义
└── dto/
```
**命名对照**
- `*-public.controller.ts` → 用户端(公开接口,无Guard或JwtAuthGuard
- `*-seller.controller.ts` → 商家端(SellerJwtAuthGuard
- `*-user.controller.ts` → 用户端(需登录,JwtAuthGuard
- `*-admin.controller.ts` → 管理端(JwtAuthGuard + RolesGuard + @Roles('admin')
### 小程序 API 文件目录规范
```
apps/miniapp/src/api/
├── user/ # 用户端 API
│ ├── auth.ts # /auth/*, /user/profile
│ ├── merchant.ts # /merchants/* (公开)
│ ├── room.ts # /rooms/* (公开)
│ ├── order.ts # /orders/*
│ ├── review.ts # /reviews/*
│ └── invite.ts # /user/activity/invite/*
└── seller/ # 商家端 API
├── auth.ts # /seller/auth/*
├── merchant.ts # /seller/merchant/*
├── room.ts # /seller/rooms/*
├── room-calendar.ts # /seller/room-calendar/*
└── order.ts # /seller/orders/*
```
### Guard 使用对照
| 端 | Guard | Token | 装饰器 |
|---|---|---|---|
| 用户端(公开) | 无 | 无 | 无 |
| 用户端(需登录) | JwtAuthGuard | Bearer Token | @CurrentUser('sub') |
| 商家端 | SellerJwtAuthGuard | Bearer sellerToken | @CurrentSeller('sub') |
| 管理端 | JwtAuthGuard + RolesGuard | Bearer adminToken | @CurrentUser('sub') + @Roles('admin') |
### 新增模块开发清单
新增业务模块时,按以下步骤操作:
1. 创建 `modules/{module}/` 目录
2. 创建 `dto/{module}.dto.ts`
3. 创建 `{module}.service.ts`
4. 按需创建控制器文件:`{module}-public.controller.ts``{module}-seller.controller.ts``{module}-admin.controller.ts`
5. 创建 `{module}.module.ts`,引用所有控制器和共享 Service
6.`app.module.ts` 中注册新模块
7. 小程序端按端创建 API 文件:`api/user/{module}.ts``api/seller/{module}.ts`
8. 商家管理后台/平台管理后台按需添加 API 文件
---
## 商家订单管理
### 商家订单接口
| 接口 | 路径 | 说明 |
| -------------- | --------------------------------- | ---------------------------- |
| 订单列表 | GET /api/seller/orders | 支持状态筛选、订单号搜索 |
| 订单详情 | GET /api/seller/orders/:id | 获取订单详情 |
| 确认订单 | PUT /api/seller/orders/:id/confirm| pending_confirm → pending_checkin |
| 拒绝订单 | PUT /api/seller/orders/:id/reject | pending_confirm → cancelled |
| 办理入住 | PUT /api/seller/orders/:id/checkin| pending_checkin → checked_in |
| 确认离店 | PUT /api/seller/orders/:id/checkout| checked_in → completed(需已到离店日期) |
| 通过退款 | PUT /api/seller/orders/:id/approve-refund | refunding → refunded,恢复房量 |
| 拒绝退款 | PUT /api/seller/orders/:id/reject-refund | refunding → cancelled |
### 商家订单状态Tab
| Tab名称 | 对应状态 |
| --------- | --------------------------------------------- |
| 全部 | 所有状态 |
| 待确认 | pending_confirm |
| 待入住 | pending_checkin |
| 已入住 | checked_in |
| 已完成 | completed |
| 已取消 | cancelled |
| 已退款 | refunded, refunding |
### 商家订单操作权限
| 状态 | 可操作 |
| ---------------- | -------------------------- |
| pending_confirm | 确认、拒绝 |
| pending_checkin | 办理入住 |
| checked_in | 确认离店(需已到离店日期) |
| refunding | 通过退款、拒绝退款 |
| 其他状态 | 无操作 |
### 订单完成方式
| 方式 | 触发条件 | 说明 |
| ------------ | ---------------------------------- | --------------------------------------- |
| 自动完成 | 每天凌晨1点定时任务 | 将离店日期为前一天的"已入住"订单自动完成 |
| 商家手动确认 | 商家点击"确认离店"按钮 | 需已到离店日期,订单立即完成 |
---
## 文件上传服务
### 上传接口
| 接口 | 路径 | 说明 |
| -------------- | --------------------- | ------------------ |
| 用户上传 | POST /api/upload | 需用户Token |
| 商家上传 | POST /api/seller/upload | 需商家Token |
| 管理员上传 | POST /api/admin/upload | 需管理员Token |
### 存储配置
存储方式通过 `platform_configs` 表配置,支持:
| 配置键 | 说明 |
| ------------------------ | ------------------------ |
| storage_provider | 存储方式:local / tencent_cos / aliyun_oss |
| storage_local_path | 本地存储路径(默认 ./uploads |
| storage_cos_bucket | 腾讯云COS Bucket |
| storage_cos_region | 腾讯云COS Region |
| storage_cos_secret_id | 腾讯云SecretId |
| storage_cos_secret_key | 腾讯云SecretKey |
| storage_oss_bucket | 阿里云OSS Bucket |
| storage_oss_region | 阿里云OSS Region |
| storage_oss_access_key_id | 阿里云AccessKeyId |
| storage_oss_access_key_secret | 阿里云AccessKeySecret |
### 存储配置接口
| 接口 | 路径 | 说明 |
| -------------- | ----------------------------- | ------------------ |
| 获取存储配置 | GET /api/admin/config/storage | 需管理员Token |
| 更新存储配置 | PUT /api/admin/config/storage | 需管理员Token |
### 小程序上传工具
**文件**: `apps/miniapp/src/utils/upload.ts`
```typescript
import { chooseAndUpload, uploadFile } from '@/utils/upload';
// 选择并上传图片
const urls = await chooseAndUpload({ count: 1, useSellerToken: true });
// 直接上传文件
const url = await uploadFile(filePath, { useSellerToken: true });
```
### 后端上传模块
**文件位置**: `apps/server/src/modules/upload/`
- `upload.service.ts` — 核心上传逻辑,策略模式支持本地/腾讯云/阿里云
- `upload.controller.ts` — 上传接口控制器
- `upload.module.ts` — 模块定义
### 静态文件访问
本地上传的文件通过 `/uploads/` 路径访问,例如:
- 上传返回: `{ url: "/uploads/abc123.jpg" }`
- 访问地址: `http://localhost:3000/uploads/abc123.jpg`
### OSS SDK 安装
使用腾讯云COS或阿里云OSS时,需安装对应SDK:
```bash
# 腾讯云COS
pnpm --filter @rent/server add cos-nodejs-sdk-v5
# 阿里云OSS
pnpm --filter @rent/server add ali-oss
```