Merge branch 'main' into feature/distribution-system

合入 main 的推广追踪(adtracking)模块,并解决与分销业务的 8 处冲突。

冲突解决原则:两边的字段、菜单与路由全部保留,不删任何一方。

后端:
- model/order.go:保留分销字段注释块,追加 SourceTrackCode
- model/user.go:追加 RegisterTrackCode;TokenVersion 默认值保持 1
  (与本库 users.token_version 列默认值一致)
- auth/repository.go:两处建号结构体同时写入 RegisterTrackCode 与 TokenVersion
- order/dto.go:OrderDTO 同时暴露 distribution_site_id 与 source_track_code;
  CreateRequest 同时接受 distribution_site_code 与 track_code
- order/presenter.go:同时映射 DistributionSiteID 与 SourceTrackCode

前端:
- orders/api/orders.ts:createOrder 同时携带 distribution_site_code 与 track_code
- layouts/AdminLayout.vue:分销管理菜单组与推广追踪菜单组并列保留
- router/adminRoutes.ts:分销 4 条路由与 tracking-links 路由并列保留

迁移:feature 侧 000064-000067 已在前一提交顺延为 000065-000068,
为 main 的 000064_ad_tracking 让号,合并后编号 000063→000068 连续无重复。
This commit is contained in:
yml2213
2026-09-10 13:06:18 +08:00
28 changed files with 2461 additions and 55 deletions
+73
View File
@@ -0,0 +1,73 @@
-- +goose Up
CREATE TABLE ad_tracking_links (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(128) NOT NULL COMMENT '推广名称',
code VARCHAR(64) NOT NULL COMMENT '自定义短码后缀',
channel_type VARCHAR(64) NOT NULL DEFAULT 'other' COMMENT '渠道场景类型: cybercafe/campus/offline_promo/partner/online_ad/other',
target_url VARCHAR(512) NOT NULL DEFAULT 'https://hao858.com/' COMMENT '目标跳转落地页',
status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态: active启用/disabled停用',
cost_cent BIGINT NOT NULL DEFAULT 0 COMMENT '投放预算或成本(分)',
notes VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注说明',
created_by BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建管理员ID',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_ad_tracking_links_code (code),
KEY idx_ad_tracking_links_status (status),
KEY idx_ad_tracking_links_channel (channel_type),
KEY idx_ad_tracking_links_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='广告与推广追踪链接';
CREATE TABLE ad_tracking_clicks (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
link_id BIGINT UNSIGNED NOT NULL COMMENT '推广链接ID',
code VARCHAR(64) NOT NULL COMMENT '推广短码',
ip VARCHAR(64) NOT NULL DEFAULT '' COMMENT '访问客户端IP',
user_agent VARCHAR(512) NOT NULL DEFAULT '' COMMENT '客户端UA',
device_type VARCHAR(32) NOT NULL DEFAULT 'unknown' COMMENT '设备类型: pc/mobile/tablet/unknown',
os VARCHAR(32) NOT NULL DEFAULT 'unknown' COMMENT '操作系统',
browser VARCHAR(32) NOT NULL DEFAULT 'unknown' COMMENT '浏览器',
referer VARCHAR(512) NOT NULL DEFAULT '' COMMENT '来源Referer',
visitor_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '访客终端唯一ID',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_ad_tracking_clicks_link_created (link_id, created_at),
KEY idx_ad_tracking_clicks_code_created (code, created_at),
KEY idx_ad_tracking_clicks_ip_created (ip, created_at),
KEY idx_ad_tracking_clicks_visitor (visitor_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='推广链接跳转点击流水';
ALTER TABLE users ADD COLUMN register_track_code VARCHAR(64) NULL DEFAULT NULL COMMENT '注册来源推广短码';
ALTER TABLE users ADD KEY idx_users_register_track_code (register_track_code);
ALTER TABLE rental_orders ADD COLUMN source_track_code VARCHAR(64) NULL DEFAULT NULL COMMENT '订单来源推广短码';
ALTER TABLE rental_orders ADD KEY idx_rental_orders_source_track_code (source_track_code);
INSERT INTO permissions (code, name, resource, action) VALUES
('ad_tracking:manage', '管理推广链接与数据追踪', 'ad_tracking', 'manage')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
resource = VALUES(resource),
action = VALUES(action);
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id FROM roles r, permissions p
WHERE r.code IN ('super_admin', 'operator') AND p.code = 'ad_tracking:manage';
-- +goose Down
DELETE rp FROM role_permissions rp
JOIN permissions p ON p.id = rp.permission_id
WHERE p.code = 'ad_tracking:manage';
DELETE FROM permissions WHERE code = 'ad_tracking:manage';
ALTER TABLE rental_orders DROP KEY idx_rental_orders_source_track_code;
ALTER TABLE rental_orders DROP COLUMN source_track_code;
ALTER TABLE users DROP KEY idx_users_register_track_code;
ALTER TABLE users DROP COLUMN register_track_code;
DROP TABLE IF EXISTS ad_tracking_clicks;
DROP TABLE IF EXISTS ad_tracking_links;