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
+53
View File
@@ -0,0 +1,53 @@
const TRACK_CODE_KEY = 'hfb_track_code'
const TRACK_CODE_TTL_MS = 30 * 24 * 60 * 60 * 1000 // 30 天有效
const TRACK_CODE_PATTERN = /^[a-zA-Z0-9_-]{2,64}$/
interface StoredTrackCode {
code: string
timestamp: number
}
function sanitizeTrackCode(code: string): string {
const cleanCode = code.trim()
if (!TRACK_CODE_PATTERN.test(cleanCode)) return ''
return cleanCode
}
export function saveTrackCode(code: string): void {
if (!code) return
const cleanCode = sanitizeTrackCode(code)
if (!cleanCode) return
try {
const item: StoredTrackCode = {
code: cleanCode,
timestamp: Date.now(),
}
localStorage.setItem(TRACK_CODE_KEY, JSON.stringify(item))
} catch {
// 忽略 localStorage 存取异常
}
}
export function getTrackCode(): string {
try {
const raw = localStorage.getItem(TRACK_CODE_KEY)
if (!raw) return ''
const item: StoredTrackCode = JSON.parse(raw)
if (!item || !item.code) return ''
if (Date.now() - item.timestamp > TRACK_CODE_TTL_MS) {
localStorage.removeItem(TRACK_CODE_KEY)
return ''
}
return sanitizeTrackCode(item.code)
} catch {
return ''
}
}
export function clearTrackCode(): void {
try {
localStorage.removeItem(TRACK_CODE_KEY)
} catch {
// 忽略
}
}