From 0db80877658e1b3d4249a2debbc63b8f9ad3b626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E5=AE=87=E5=AE=81?= Date: Wed, 23 Sep 2026 16:50:34 +0700 Subject: [PATCH] =?UTF-8?q?logo=E5=92=8C=E9=85=8D=E7=BD=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/web/application.go | 1 + app/api/web/auth.go | 548 ------ app/api/web/auth_redirect.go | 57 - app/api/web/chapter_detail.go | 5 - app/api/web/chapter_like.go | 196 -- app/api/web/chapter_unlock.go | 106 -- app/api/web/chapter_watch.go | 103 -- app/api/web/collect.go | 84 - app/api/web/comment.go | 228 --- app/api/web/deposit.go | 244 --- app/api/web/dialog.go | 2 - app/api/web/feedback.go | 17 +- app/api/web/history.go | 117 -- app/api/web/index.go | 16 - app/api/web/play.go | 6 - app/api/web/playlet_like.go | 196 -- app/api/web/rank.go | 1 + app/api/web/render.go | 90 +- app/api/web/render_test.go | 6 +- app/api/web/richtext.go | 20 +- app/api/web/session.go | 24 +- app/api/web/setting.go | 119 -- app/api/web/today_update.go | 1 + app/api/web/tracker_page.go | 127 -- app/api/web/tracker_page_test.go | 107 -- app/api/web/user_center.go | 58 - app/appg/appg.go | 19 +- app/conf/app.yaml | 7 +- app/router/gin.go | 45 - app/router/gin_test.go | 1 - app/router/nav_tracking_template_test.go | 6 +- app/service/authser/auth.go | 158 +- app/service/authser/guest_enter.go | 93 +- app/service/authser/session.go | 30 +- app/service/authser/types.go | 74 +- app/service/authser/view.go | 87 - app/service/authser/vip.go | 187 -- app/service/commentser/like.go | 22 - app/service/commentser/send.go | 45 - app/service/configser/tracker.go | 29 - app/service/configser/types.go | 14 +- app/service/configser/view.go | 2 - app/service/playletser/chapter.go | 44 - app/service/playletser/chapter_collect.go | 84 - app/service/playletser/chapter_like.go | 63 - app/service/playletser/chapter_unlock.go | 40 - app/service/playletser/chapter_watch.go | 39 - app/service/playletser/collect.go | 155 -- app/service/playletser/collect_view.go | 89 - app/service/playletser/history.go | 139 -- app/service/playletser/history_view.go | 147 -- app/service/playletser/like.go | 35 - app/service/playletser/tplfuncs.go | 119 +- app/service/rechargeser/list.go | 212 --- app/service/rechargeser/types.go | 117 -- app/service/rechargeser/view.go | 439 ----- app/service/translationser/view.go | 2 - app/static/common/web-sdk-v1.1.8.js | 1 - app/static/css/accountShared.css | 1620 ----------------- app/static/css/coinDialog.css | 137 -- app/static/css/collect.css | 489 ----- app/static/css/deposit.css | 1195 ------------ app/static/css/detail.css | 451 +---- app/static/css/editPassword.css | 382 ---- app/static/css/editProfile.css | 347 ---- app/static/css/header.css | 2 +- app/static/css/history.css | 552 ------ app/static/css/loginDialog.css | 205 --- app/static/css/play.css | 314 +--- app/static/css/registerDialog.css | 191 -- app/static/css/setting.css | 721 -------- app/static/css/userCenter.css | 1146 ------------ app/static/css/vipDialog.css | 241 --- app/static/favicon.ico | Bin 81601 -> 17541 bytes app/static/favicon.png | Bin 232966 -> 29523 bytes app/static/favicon.svg | 75 +- app/static/images/coin.png | Bin 9540 -> 0 bytes .../figma-account/balance-action-accent.svg | 13 - .../images/figma-account/balance-card.svg | 29 - .../figma-account/deposit-balance-card.png | Bin 69741 -> 0 bytes .../images/figma-account/feature-follow.svg | 5 - .../images/figma-account/feature-history.svg | 8 - .../images/figma-account/feature-setting.svg | 5 - .../images/figma-account/feature-wallet.svg | 6 - .../images/figma-account/package-coin.svg | 35 - .../images/figma-account/usage-member.svg | 8 - .../images/figma-account/usage-reward.svg | 6 - .../images/figma-account/usage-unlock.svg | 5 - app/static/images/figma-dialogs/alipay.svg | 3 - .../images/figma-dialogs/coin-unlock.svg | 35 - .../figma-dialogs/download-logo-mobile.svg | 66 +- .../images/figma-dialogs/download-logo-pc.svg | 66 +- .../images/figma-dialogs/password-eye.svg | 3 - app/static/images/figma-dialogs/usdt.svg | 3 - app/static/images/figma-dialogs/wechat.svg | 10 - .../images/figma-home/footer-logo-desktop.png | Bin 19809 -> 6347 bytes app/static/images/figma-home/header-coin.png | Bin 5493 -> 0 bytes .../images/figma-home/header-logo-desktop.png | Bin 11666 -> 0 bytes .../images/figma-home/mobile/drawer-logo.png | Bin 11537 -> 4324 bytes .../figma-home/mobile/footer-logo-mobile.png | Bin 11661 -> 0 bytes .../images/figma-home/mobile/header-logo.png | Bin 6432 -> 0 bytes app/static/images/figma-nav/logo.svg | 65 - app/static/images/isVip.png | Bin 4717 -> 0 bytes app/static/images/jbcz.png | Bin 2941 -> 0 bytes app/static/images/logo-h5.png | Bin 4550 -> 4312 bytes app/static/images/logo.png | Bin 7923 -> 6404 bytes app/static/images/tab_app.svg | 5 + app/static/images/tab_app_a.svg | 5 + app/static/images/tab_wd.svg | 4 - app/static/images/tab_wd_a.svg | 4 - app/static/images/vip.png | Bin 1546 -> 0 bytes app/static/js/common/auth.js | 454 ----- app/static/js/common/cookie.js | 204 --- app/static/js/common/request.js | 40 +- app/static/js/pages/coinDialog.js | 307 ---- app/static/js/pages/deposit.js | 481 ----- app/static/js/pages/detail.js | 728 +------- app/static/js/pages/dialogLoader.js | 76 +- app/static/js/pages/editPassword.js | 139 -- app/static/js/pages/editProfile.js | 68 - app/static/js/pages/feedback.js | 30 - app/static/js/pages/header.js | 130 -- app/static/js/pages/history.js | 85 - app/static/js/pages/loginDialog.js | 236 --- app/static/js/pages/play.js | 298 +-- app/static/js/pages/registerDialog.js | 213 --- app/static/js/pages/setting.js | 34 - app/static/js/pages/userCenter.js | 161 -- app/static/js/pages/vipDialog.js | 52 - app/static/js/tracker.js | 1483 --------------- app/templates/base/analytics.html | 23 + app/templates/base/coinDialog.html | 39 - app/templates/base/contentExtras.html | 2 +- app/templates/base/dialogAd.html | 8 +- app/templates/base/downloadAppDialog.html | 4 +- app/templates/base/footer.html | 44 +- app/templates/base/header.html | 109 +- app/templates/base/homeAdRow.html | 5 - app/templates/base/loginDialog.html | 104 -- app/templates/base/registerDialog.html | 80 - app/templates/base/seoCommon.html | 12 +- app/templates/base/squarePromo.html | 5 - app/templates/base/trackerInit.html | 167 -- app/templates/base/vipDialog.html | 24 - app/templates/page/collect.html | 121 -- app/templates/page/deposit.html | 149 -- app/templates/page/detail.html | 67 +- app/templates/page/editPassword.html | 170 -- app/templates/page/editProfile.html | 118 -- app/templates/page/helpCenter.html | 16 +- app/templates/page/history.html | 106 -- app/templates/page/homeRoad.html | 2 +- app/templates/page/index.html | 6 +- app/templates/page/list.html | 2 +- app/templates/page/nav.html | 6 +- app/templates/page/play.html | 126 +- app/templates/page/rank.html | 2 +- app/templates/page/search.html | 17 - app/templates/page/series.html | 2 +- app/templates/page/setting.html | 199 -- app/templates/page/themeIndex.html | 2 +- app/templates/page/userCenter.html | 318 ---- pub/pubdef/pubdef.go | 5 - 163 files changed, 393 insertions(+), 20366 deletions(-) delete mode 100644 app/api/web/auth.go delete mode 100644 app/api/web/auth_redirect.go delete mode 100644 app/api/web/chapter_like.go delete mode 100644 app/api/web/chapter_unlock.go delete mode 100644 app/api/web/chapter_watch.go delete mode 100644 app/api/web/collect.go delete mode 100644 app/api/web/deposit.go delete mode 100644 app/api/web/history.go delete mode 100644 app/api/web/playlet_like.go delete mode 100644 app/api/web/setting.go delete mode 100644 app/api/web/tracker_page.go delete mode 100644 app/api/web/tracker_page_test.go delete mode 100644 app/api/web/user_center.go delete mode 100644 app/service/authser/view.go delete mode 100644 app/service/authser/vip.go delete mode 100644 app/service/commentser/like.go delete mode 100644 app/service/commentser/send.go delete mode 100644 app/service/configser/tracker.go delete mode 100644 app/service/playletser/chapter_collect.go delete mode 100644 app/service/playletser/chapter_like.go delete mode 100644 app/service/playletser/chapter_unlock.go delete mode 100644 app/service/playletser/chapter_watch.go delete mode 100644 app/service/playletser/collect.go delete mode 100644 app/service/playletser/collect_view.go delete mode 100644 app/service/playletser/history.go delete mode 100644 app/service/playletser/history_view.go delete mode 100644 app/service/playletser/like.go delete mode 100644 app/service/rechargeser/list.go delete mode 100644 app/service/rechargeser/types.go delete mode 100644 app/service/rechargeser/view.go delete mode 100644 app/static/common/web-sdk-v1.1.8.js delete mode 100644 app/static/css/accountShared.css delete mode 100644 app/static/css/coinDialog.css delete mode 100644 app/static/css/collect.css delete mode 100644 app/static/css/deposit.css delete mode 100644 app/static/css/editPassword.css delete mode 100644 app/static/css/editProfile.css delete mode 100644 app/static/css/history.css delete mode 100644 app/static/css/loginDialog.css delete mode 100644 app/static/css/registerDialog.css delete mode 100644 app/static/css/setting.css delete mode 100644 app/static/css/userCenter.css delete mode 100644 app/static/css/vipDialog.css delete mode 100644 app/static/images/coin.png delete mode 100644 app/static/images/figma-account/balance-action-accent.svg delete mode 100644 app/static/images/figma-account/balance-card.svg delete mode 100644 app/static/images/figma-account/deposit-balance-card.png delete mode 100644 app/static/images/figma-account/feature-follow.svg delete mode 100644 app/static/images/figma-account/feature-history.svg delete mode 100644 app/static/images/figma-account/feature-setting.svg delete mode 100644 app/static/images/figma-account/feature-wallet.svg delete mode 100644 app/static/images/figma-account/package-coin.svg delete mode 100644 app/static/images/figma-account/usage-member.svg delete mode 100644 app/static/images/figma-account/usage-reward.svg delete mode 100644 app/static/images/figma-account/usage-unlock.svg delete mode 100644 app/static/images/figma-dialogs/alipay.svg delete mode 100644 app/static/images/figma-dialogs/coin-unlock.svg delete mode 100644 app/static/images/figma-dialogs/password-eye.svg delete mode 100644 app/static/images/figma-dialogs/usdt.svg delete mode 100644 app/static/images/figma-dialogs/wechat.svg delete mode 100644 app/static/images/figma-home/header-coin.png delete mode 100644 app/static/images/figma-home/header-logo-desktop.png delete mode 100644 app/static/images/figma-home/mobile/footer-logo-mobile.png delete mode 100644 app/static/images/figma-home/mobile/header-logo.png delete mode 100644 app/static/images/figma-nav/logo.svg delete mode 100644 app/static/images/isVip.png delete mode 100644 app/static/images/jbcz.png create mode 100644 app/static/images/tab_app.svg create mode 100644 app/static/images/tab_app_a.svg delete mode 100644 app/static/images/tab_wd.svg delete mode 100644 app/static/images/tab_wd_a.svg delete mode 100644 app/static/images/vip.png delete mode 100644 app/static/js/common/auth.js delete mode 100644 app/static/js/common/cookie.js delete mode 100644 app/static/js/pages/coinDialog.js delete mode 100644 app/static/js/pages/deposit.js delete mode 100644 app/static/js/pages/editPassword.js delete mode 100644 app/static/js/pages/editProfile.js delete mode 100644 app/static/js/pages/history.js delete mode 100644 app/static/js/pages/loginDialog.js delete mode 100644 app/static/js/pages/registerDialog.js delete mode 100644 app/static/js/pages/setting.js delete mode 100644 app/static/js/pages/userCenter.js delete mode 100644 app/static/js/pages/vipDialog.js delete mode 100644 app/static/js/tracker.js create mode 100644 app/templates/base/analytics.html delete mode 100644 app/templates/base/coinDialog.html delete mode 100644 app/templates/base/loginDialog.html delete mode 100644 app/templates/base/registerDialog.html delete mode 100644 app/templates/base/trackerInit.html delete mode 100644 app/templates/base/vipDialog.html delete mode 100644 app/templates/page/collect.html delete mode 100644 app/templates/page/deposit.html delete mode 100644 app/templates/page/editPassword.html delete mode 100644 app/templates/page/editProfile.html delete mode 100644 app/templates/page/history.html delete mode 100644 app/templates/page/setting.html delete mode 100644 app/templates/page/userCenter.html diff --git a/app/api/web/application.go b/app/api/web/application.go index dd0d26b..c5203ac 100644 --- a/app/api/web/application.go +++ b/app/api/web/application.go @@ -12,6 +12,7 @@ func Application(c *gin.Context) { vm := applistser.BuildPageVM(raw) data := gin.H{ "title": "福利应用", + "pageName": "应用推荐", "navActive": "application", "categories": vm.Categories, } diff --git a/app/api/web/auth.go b/app/api/web/auth.go deleted file mode 100644 index 62a53ee..0000000 --- a/app/api/web/auth.go +++ /dev/null @@ -1,548 +0,0 @@ -package web - -import ( - "net/http" - "strings" - "videoweb/app/service/authser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -type registerBody struct { - AccountNo string `json:"accountNo"` - Email string `json:"email"` - Password string `json:"password"` - AgentInviteCode string `json:"agentInviteCode"` - DevID string `json:"devID"` - Channel string `json:"channel"` -} - -type loginBody struct { - Account string `json:"account"` - Password string `json:"password"` - DevID string `json:"devID"` - Channel string `json:"channel"` -} - -type resetPasswordBody struct { - AccountNo string `json:"accountNo"` - Email string `json:"email"` - NewPassword string `json:"newPassword"` -} - -type updateProfileBody struct { - Avatar string `json:"avatar"` - Introduction string `json:"introduction"` - NickName string `json:"nickName"` - OldPassword string `json:"oldPassword"` - NewPassword string `json:"newPassword"` - PrivacyMode *bool `json:"privacyMode"` -} - -// Register 代理上游注册,成功后写入登录 cookie。 -func Register(c *gin.Context) { - var body registerBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - - body.AccountNo = strings.TrimSpace(body.AccountNo) - body.Email = strings.TrimSpace(body.Email) - body.AgentInviteCode = strings.TrimSpace(body.AgentInviteCode) - body.DevID = strings.TrimSpace(body.DevID) - body.Channel = strings.TrimSpace(body.Channel) - - if body.AccountNo == "" || body.Password == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "请填写账号和密码", - "data": nil, - }) - return - } - - // 上游 registerReq 仍要求 email;前端已去掉邮箱输入时,用账号生成唯一占位邮箱。 - if body.Email == "" { - body.Email = body.AccountNo + "@qmdj.local" - } - - env, user, err := authser.Register(c, authser.RegisterReq{ - AccountNo: body.AccountNo, - Email: body.Email, - Password: body.Password, - AgentInviteCode: body.AgentInviteCode, - DevID: body.DevID, - Channel: body.Channel, - }) - if err != nil { - log.Error("register upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "register failed", - "tip": "注册失败,请稍后重试", - "data": nil, - }) - return - } - - if env.Code != 200 || user == nil { - tip := strings.TrimSpace(env.Tip) - if tip == "" { - tip = strings.TrimSpace(env.Msg) - } - if tip == "" { - tip = "注册失败" - } - c.JSON(http.StatusOK, gin.H{ - "code": env.Code, - "msg": env.Msg, - "tip": tip, - "data": nil, - }) - return - } - - authser.SetAuthCookies(c, user) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": env.Msg, - "tip": firstNonEmpty(env.Tip, "注册成功"), - "data": user, - }) -} - -// Login 代理上游登录,成功后写入登录 cookie。 -func Login(c *gin.Context) { - var body loginBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - - body.Account = strings.TrimSpace(body.Account) - body.DevID = strings.TrimSpace(body.DevID) - body.Channel = strings.TrimSpace(body.Channel) - if body.Account == "" || body.Password == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "请填写账号和密码", - "data": nil, - }) - return - } - - env, user, err := authser.Login(c, authser.LoginReq{ - Account: body.Account, - Password: body.Password, - DevID: body.DevID, - Channel: body.Channel, - }) - if err != nil { - log.Error("login upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "login failed", - "tip": "登录失败,请稍后重试", - "data": nil, - }) - return - } - - if env.Code != 200 || user == nil { - tip := strings.TrimSpace(env.Tip) - if tip == "" { - tip = strings.TrimSpace(env.Msg) - } - if tip == "" { - tip = "登录失败" - } - c.JSON(http.StatusOK, gin.H{ - "code": env.Code, - "msg": env.Msg, - "tip": tip, - "data": nil, - }) - return - } - - authser.SetAuthCookies(c, user) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": env.Msg, - "tip": firstNonEmpty(env.Tip, "登录成功"), - "data": user, - }) -} - -// ResetPassword 代理上游找回密码接口。 -func ResetPassword(c *gin.Context) { - var body resetPasswordBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"code": 1001, "msg": "参数错误", "tip": "参数错误", "data": nil}) - return - } - body.AccountNo = strings.TrimSpace(body.AccountNo) - body.Email = strings.TrimSpace(body.Email) - if body.AccountNo == "" || body.Email == "" || body.NewPassword == "" { - c.JSON(http.StatusOK, gin.H{"code": 1001, "msg": "参数错误", "tip": "请填写账号、邮箱和新密码", "data": nil}) - return - } - - env, err := authser.ResetPassword(c, authser.ResetPasswordReq{ - AccountNo: body.AccountNo, - Email: body.Email, - NewPassword: body.NewPassword, - }) - if err != nil { - log.Error("reset password upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{"code": 500, "msg": "reset password failed", "tip": "重置密码失败,请稍后重试", "data": nil}) - return - } - tip := firstNonEmpty(env.Tip, env.Msg) - if env.Code == 200 { - tip = firstNonEmpty(tip, "密码重置成功") - } else { - tip = firstNonEmpty(tip, "密码重置失败") - } - c.JSON(http.StatusOK, gin.H{"code": env.Code, "msg": env.Msg, "tip": tip, "data": env.Data}) -} - -// Guest 代理上游游客登录,成功后写入登录 cookie。 -// 对应 POST /api/app/auth/guest;需传 devID,上游要求 X-User-Agent(由 BFF 组装)。 -func Guest(c *gin.Context) { - var body struct { - DevID string `json:"devID"` - DeviceID string `json:"deviceId"` - Mac string `json:"mac"` - Channel string `json:"channel"` - } - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - - body.DevID = strings.TrimSpace(body.DevID) - body.DeviceID = strings.TrimSpace(body.DeviceID) - body.Mac = strings.TrimSpace(body.Mac) - body.Channel = strings.TrimSpace(body.Channel) - if body.DevID == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少设备标识", - "data": nil, - }) - return - } - if body.DeviceID == "" { - body.DeviceID = body.DevID - } - - env, user, err := authser.GuestLogin(c, authser.GuestLoginReq{ - DevID: body.DevID, - DeviceID: body.DeviceID, - Mac: body.Mac, - Channel: body.Channel, - }) - if err != nil { - log.Error("guest login upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "guest login failed", - "tip": "游客登录失败,请稍后重试", - "data": nil, - }) - return - } - - if env.Code != 200 || user == nil { - tip := strings.TrimSpace(env.Tip) - if tip == "" { - tip = strings.TrimSpace(env.Msg) - } - if tip == "" { - tip = "游客登录失败" - } - c.JSON(http.StatusOK, gin.H{ - "code": env.Code, - "msg": env.Msg, - "tip": tip, - "data": nil, - }) - return - } - - authser.SetAuthCookies(c, user) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "游客登录成功"), - "data": user, - }) -} - -// UpdateProfile 代理上游修改资料,成功后刷新 getInfo 并写 cookie。 -func UpdateProfile(c *gin.Context) { - var body updateProfileBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - - body.Avatar = strings.TrimSpace(body.Avatar) - body.Introduction = strings.TrimSpace(body.Introduction) - body.NickName = strings.TrimSpace(body.NickName) - body.OldPassword = strings.TrimSpace(body.OldPassword) - body.NewPassword = strings.TrimSpace(body.NewPassword) - - req := authser.UpdateProfileReq{ - Avatar: body.Avatar, - Introduction: body.Introduction, - NickName: body.NickName, - OldPassword: body.OldPassword, - NewPassword: body.NewPassword, - PrivacyMode: body.PrivacyMode, - } - if req.Avatar == "" && req.Introduction == "" && req.NickName == "" && req.OldPassword == "" && req.NewPassword == "" && req.PrivacyMode == nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "请至少修改一项资料", - "data": nil, - }) - return - } - if (req.OldPassword == "") != (req.NewPassword == "") { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "修改密码需同时填写旧密码和新密码", - "data": nil, - }) - return - } - - env, err := authser.UpdateProfile(c, req) - if err != nil { - log.Error("update profile upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "update profile failed", - "tip": "保存失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = authser.UpdateProfile(c, req) - if err != nil { - log.Error("update profile retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "update profile failed", - "tip": "保存失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "保存失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - // 上游成功后拉最新资料写 cookie - _, user, infoErr := authser.GetInfo(c) - if infoErr != nil || user == nil { - log.Error("update profile getInfo failed", log.E(infoErr)) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": env.Msg, - "tip": firstNonEmpty(env.Tip, "保存成功"), - "data": nil, - }) - return - } - authser.SetAuthCookies(c, user) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": env.Msg, - "tip": firstNonEmpty(env.Tip, "保存成功"), - "data": user, - }) -} - -// UploadImage 代理上游图片上传(头像不加 watermark)。 -func UploadImage(c *gin.Context) { - fileHeader, err := c.FormFile("file") - if err != nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "请选择图片文件", - "data": nil, - }) - return - } - f, err := fileHeader.Open() - if err != nil { - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "open file failed", - "tip": "读取图片失败", - "data": nil, - }) - return - } - defer f.Close() - - resp, err := authser.UploadImage(c, fileHeader.Filename, f) - if err != nil { - log.Error("upload image upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "upload failed", - "tip": "上传失败,请稍后重试", - "data": nil, - }) - return - } - if resp == nil || resp.Code != 200 || resp.Data == nil || strings.TrimSpace(resp.Data.SourceNameFs) == "" { - tip := "上传失败" - msg := "" - code := 500 - if resp != nil { - code = resp.Code - msg = resp.Msg - tip = firstNonEmpty(resp.Tip, resp.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(resp.Msg, "success"), - "tip": firstNonEmpty(resp.Tip, "上传成功"), - "data": gin.H{ - "id": resp.Data.ID, - "sourceNameFs": resp.Data.SourceNameFs, - "url": resp.Data.SourceNameFs, - }, - }) -} - -// GetUserInfo 代理上游 GET /api/app/auth/getInfo。 -func GetUserInfo(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录", - "data": nil, - }) - return - } - - env, user, err := authser.GetInfo(c) - if err != nil { - log.Error("getInfo upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "getInfo failed", - "tip": "获取用户信息失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, user, err = authser.GetInfo(c) - if err != nil { - log.Error("getInfo retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "getInfo failed", - "tip": "获取用户信息失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 || user == nil { - tip := "获取用户信息失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - authser.SetAuthCookies(c, user) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": user, - }) -} - -func firstNonEmpty(values ...string) string { - for _, v := range values { - if strings.TrimSpace(v) != "" { - return v - } - } - return "" -} diff --git a/app/api/web/auth_redirect.go b/app/api/web/auth_redirect.go deleted file mode 100644 index 2f5464a..0000000 --- a/app/api/web/auth_redirect.go +++ /dev/null @@ -1,57 +0,0 @@ -package web - -import ( - "net/http" - "strings" - - "github.com/gin-gonic/gin" -) - -// LoginEntryURL 首页弹窗登录入口;redirectPath 为登录成功后回跳路径(须为站内相对路径)。 -func LoginEntryURL(redirectPath string) string { - redirectPath = strings.TrimSpace(redirectPath) - if i := strings.IndexByte(redirectPath, '?'); i >= 0 { - redirectPath = redirectPath[:i] - } - if !isSafeRedirect(redirectPath) || redirectPath == "/" { - return "/login/" - } - return "/login/return" + ensureRedirectTrailingSlash(redirectPath) -} - -// RegisterEntryURL 首页弹窗注册入口。 -func RegisterEntryURL() string { - return "/register/" -} - -func ensureRedirectTrailingSlash(path string) string { - if i := strings.IndexByte(path, '?'); i >= 0 { - path = path[:i] - } - if path != "/" && !strings.HasSuffix(path, "/") { - path += "/" - } - return path -} - -// RedirectToLogin 未登录访问受保护页时,跳到首页并打开登录弹窗。 -func RedirectToLogin(c *gin.Context) { - path := "" - if c != nil && c.Request != nil && c.Request.URL != nil { - path = c.Request.URL.RequestURI() - } - if path == "" || path == "/login" || strings.HasPrefix(path, "/login/") { - path = "/" - } - c.Redirect(http.StatusFound, LoginEntryURL(path)) -} - -func isSafeRedirect(path string) bool { - if path == "" || !strings.HasPrefix(path, "/") || strings.HasPrefix(path, "//") { - return false - } - if strings.ContainsAny(path, "\r\n") { - return false - } - return true -} diff --git a/app/api/web/chapter_detail.go b/app/api/web/chapter_detail.go index a53068c..2cc091d 100644 --- a/app/api/web/chapter_detail.go +++ b/app/api/web/chapter_detail.go @@ -4,10 +4,8 @@ import ( "net/http" "strconv" "strings" - "videoweb/app/service/authser" "videoweb/app/service/playletser" "videoweb/pub/common/log" - "videoweb/pub/common/useragent" "github.com/gin-gonic/gin" ) @@ -38,9 +36,6 @@ func ChapterDetail(c *gin.Context) { }) return } - if data != nil && useragent.TokenFromRequest(c.Request) != "" { - authser.SetRechargeCookie(c, data.Balance) - } c.JSON(http.StatusOK, gin.H{ "code": 200, "msg": "success", diff --git a/app/api/web/chapter_like.go b/app/api/web/chapter_like.go deleted file mode 100644 index de71915..0000000 --- a/app/api/web/chapter_like.go +++ /dev/null @@ -1,196 +0,0 @@ -package web - -import ( - "net/http" - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -type chapterLikeBody struct { - ChapterID int64 `json:"chapterId"` - IsLike *bool `json:"isLike"` -} - -// ChapterLikeSet 代理上游 POST /api/app/playlet/chapter/like/set。 -func ChapterLikeSet(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再点赞", - "data": nil, - }) - return - } - - var body chapterLikeBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.ChapterID <= 0 || body.IsLike == nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 chapterId 或 isLike", - "data": nil, - }) - return - } - - env, err := playletser.ChapterLikeSet(c, playletser.PlayletChapterLikeSetReq{ - ChapterID: body.ChapterID, - IsLike: *body.IsLike, - }) - if err != nil { - log.Error("chapter like set upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter like failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.ChapterLikeSet(c, playletser.PlayletChapterLikeSetReq{ - ChapterID: body.ChapterID, - IsLike: *body.IsLike, - }) - if err != nil { - log.Error("chapter like set retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter like failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "操作失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": env.Data, - }) -} - -type chapterCollectBody struct { - ChapterID int64 `json:"chapterId"` - IsCollect *bool `json:"isCollect"` -} - -// ChapterCollectSet 代理上游 POST /api/app/playlet/chapter/collect/set。 -func ChapterCollectSet(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再收藏", - "data": nil, - }) - return - } - - var body chapterCollectBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.ChapterID <= 0 || body.IsCollect == nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 chapterId 或 isCollect", - "data": nil, - }) - return - } - - env, err := playletser.ChapterCollectSet(c, playletser.PlayletChapterCollectSetReq{ - ChapterID: body.ChapterID, - IsCollect: *body.IsCollect, - }) - if err != nil { - log.Error("chapter collect set upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter collect failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.ChapterCollectSet(c, playletser.PlayletChapterCollectSetReq{ - ChapterID: body.ChapterID, - IsCollect: *body.IsCollect, - }) - if err != nil { - log.Error("chapter collect set retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter collect failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "操作失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": env.Data, - }) -} diff --git a/app/api/web/chapter_unlock.go b/app/api/web/chapter_unlock.go deleted file mode 100644 index afaae08..0000000 --- a/app/api/web/chapter_unlock.go +++ /dev/null @@ -1,106 +0,0 @@ -package web - -import ( - "net/http" - "videoweb/app/service/authser" - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -type chapterUnlockBody struct { - ChapterID int64 `json:"chapterId"` - PlayletID int64 `json:"playletId"` -} - -// ChapterUnlock 代理上游 POST /api/app/playlet/chapter/unlock。 -func ChapterUnlock(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再解锁", - "data": nil, - }) - return - } - - var body chapterUnlockBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.ChapterID <= 0 || body.PlayletID <= 0 { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 chapterId 或 playletId", - "data": nil, - }) - return - } - - env, err := playletser.ChapterUnlock(c, playletser.PlayletChapterUnlockReq{ - ChapterID: body.ChapterID, - PlayletID: body.PlayletID, - }) - if err != nil { - log.Error("chapter unlock upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter unlock failed", - "tip": "解锁失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.ChapterUnlock(c, playletser.PlayletChapterUnlockReq{ - ChapterID: body.ChapterID, - PlayletID: body.PlayletID, - }) - if err != nil { - log.Error("chapter unlock retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter unlock failed", - "tip": "解锁失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "解锁失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - authser.SetRechargeCookie(c, env.Data.Balance) - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "解锁成功"), - "data": env.Data, - }) -} diff --git a/app/api/web/chapter_watch.go b/app/api/web/chapter_watch.go deleted file mode 100644 index e8b57b7..0000000 --- a/app/api/web/chapter_watch.go +++ /dev/null @@ -1,103 +0,0 @@ -package web - -import ( - "net/http" - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -type chapterWatchReportBody struct { - ChapterID int64 `json:"chapterId"` - PlayletID int64 `json:"playletId"` -} - -// ChapterWatchReport 代理上游 POST /api/app/playlet/chapter/watch/report。 -func ChapterWatchReport(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录", - "data": nil, - }) - return - } - - var body chapterWatchReportBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.ChapterID <= 0 { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 chapterId", - "data": nil, - }) - return - } - - env, err := playletser.ChapterWatchReport(c, playletser.PlayletChapterWatchReportReq{ - ChapterID: body.ChapterID, - PlayletID: body.PlayletID, - }) - if err != nil { - log.Error("chapter watch report upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter watch report failed", - "tip": "上报失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.ChapterWatchReport(c, playletser.PlayletChapterWatchReportReq{ - ChapterID: body.ChapterID, - PlayletID: body.PlayletID, - }) - if err != nil { - log.Error("chapter watch report retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "chapter watch report failed", - "tip": "上报失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "上报失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": env.Data, - }) -} diff --git a/app/api/web/collect.go b/app/api/web/collect.go deleted file mode 100644 index d8387ac..0000000 --- a/app/api/web/collect.go +++ /dev/null @@ -1,84 +0,0 @@ -package web - -import ( - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -// Collect 我的收藏 SSR: -// 短剧 GET /api/app/playlet/collect/list;剧集 GET /api/app/playlet/chapter/collect/list。 -func Collect(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - RedirectToLogin(c) - return - } - - q := playletser.ParseCollectListQuery(routeOrQuery(c, "page", "page"), routeOrQuery(c, "type", "type")) - if redirectCanonical(c, playletser.CollectCanonicalPath(q)) { - return - } - data := gin.H{ - "title": "我的收藏", - "description": "查看你在黄果短剧收藏的短剧与剧集,随时继续追更喜欢的内容。", - "navActive": "userCenter", - "collectType": q.Type, - "pageNum": q.PageNum, - "pageSize": q.PageSize, - "totalCount": int64(0), - "pagination": playletser.BuildCollectPagination(q, 0), - } - setNoIndex(data, false) - - if q.Type == playletser.CollectTypeChapter { - raw, code, err := playletser.FetchChapterCollectList(c, q) - if err != nil { - aborted, retry := AbortSSRIfSessionExpired(c, code) - if aborted { - return - } - if retry { - raw, _, err = playletser.FetchChapterCollectList(c, q) - } - if err != nil { - log.Error("fetch playlet chapter collect list failed", log.E(err)) - raw = &playletser.PlayletChapterCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - } - if raw == nil { - raw = &playletser.PlayletChapterCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - data["chapterList"] = raw.List - data["pageNum"] = raw.PageNum - data["pageSize"] = raw.PageSize - data["totalCount"] = raw.TotalCount - data["pagination"] = playletser.BuildCollectPagination(q, raw.TotalCount) - } else { - raw, code, err := playletser.FetchCollectList(c, q) - if err != nil { - aborted, retry := AbortSSRIfSessionExpired(c, code) - if aborted { - return - } - if retry { - raw, _, err = playletser.FetchCollectList(c, q) - } - if err != nil { - log.Error("fetch playlet collect list failed", log.E(err)) - raw = &playletser.PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - } - if raw == nil { - raw = &playletser.PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - data["list"] = raw.List - data["pageNum"] = raw.PageNum - data["pageSize"] = raw.PageSize - data["totalCount"] = raw.TotalCount - data["pagination"] = playletser.BuildCollectPagination(q, raw.TotalCount) - } - - HTMLOK(c, "collect.html", data) -} diff --git a/app/api/web/comment.go b/app/api/web/comment.go index 6d9c17f..bc89b64 100644 --- a/app/api/web/comment.go +++ b/app/api/web/comment.go @@ -3,11 +3,8 @@ package web import ( "net/http" "strconv" - "strings" - "unicode/utf8" "videoweb/app/service/commentser" "videoweb/pub/common/log" - "videoweb/pub/common/useragent" "github.com/gin-gonic/gin" ) @@ -55,228 +52,3 @@ func CommentList(c *gin.Context) { "data": data, }) } - -type commentSendBody struct { - ObjectID int64 `json:"objectId"` - ObjectType int `json:"objectType"` - Text string `json:"text"` - ParentsID int64 `json:"parentsId"` - ReplyCommentID int64 `json:"replyCommentId"` -} - -// CommentSend 代理上游 POST /api/app/comment/send。 -// parentsId=0 一级评论;parentsId>0 二级评论;replyCommentId 为实际被回复评论。 -func CommentSend(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再发表评论", - "data": nil, - }) - return - } - - var body commentSendBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - - body.Text = strings.TrimSpace(body.Text) - if body.ObjectID <= 0 { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 objectId", - "data": nil, - }) - return - } - if body.ObjectType != commentser.ObjectTypeChapter { - body.ObjectType = commentser.ObjectTypePlaylet - } - if body.Text == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "请输入评论内容", - "data": nil, - }) - return - } - if utf8.RuneCountInString(body.Text) > 200 { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "评论最多 200 字", - "data": nil, - }) - return - } - if body.ParentsID < 0 { - body.ParentsID = 0 - } - if body.ReplyCommentID < 0 { - body.ReplyCommentID = 0 - } - - env, err := commentser.Send(c, commentser.CommentSendReq{ - ObjectID: body.ObjectID, - ObjectType: body.ObjectType, - Text: body.Text, - ParentsID: body.ParentsID, - ReplyCommentID: body.ReplyCommentID, - }) - if err != nil { - log.Error("comment send upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "comment send failed", - "tip": "发表失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = commentser.Send(c, commentser.CommentSendReq{ - ObjectID: body.ObjectID, - ObjectType: body.ObjectType, - Text: body.Text, - ParentsID: body.ParentsID, - ReplyCommentID: body.ReplyCommentID, - }) - if err != nil { - log.Error("comment send retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "comment send failed", - "tip": "发表失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "发表失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "发表成功"), - "data": env.Data, - }) -} - -type commentLikeBody struct { - CommentID int64 `json:"commentId"` - IsLike *bool `json:"isLike"` -} - -// CommentLikeSet 代理上游 POST /api/app/comment/like/set。 -func CommentLikeSet(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再点赞", - "data": nil, - }) - return - } - - var body commentLikeBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.CommentID <= 0 || body.IsLike == nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 commentId 或 isLike", - "data": nil, - }) - return - } - - env, err := commentser.LikeSet(c, commentser.CommentLikeSetReq{ - CommentID: body.CommentID, - IsLike: *body.IsLike, - }) - if err != nil { - log.Error("comment like set upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "comment like failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = commentser.LikeSet(c, commentser.CommentLikeSetReq{ - CommentID: body.CommentID, - IsLike: *body.IsLike, - }) - if err != nil { - log.Error("comment like set retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "comment like failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "操作失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": env.Data, - }) -} diff --git a/app/api/web/deposit.go b/app/api/web/deposit.go deleted file mode 100644 index 0bcb66a..0000000 --- a/app/api/web/deposit.go +++ /dev/null @@ -1,244 +0,0 @@ -package web - -import ( - "net/http" - "strings" - "videoweb/app/service/authser" - "videoweb/app/service/rechargeser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -type buyPayBody struct { - PackageID int64 `json:"packageId"` - PayMode string `json:"payMode"` -} - -// attachWalletFromGetInfo 登录态拉取 getInfo,刷新 cookie,并写入模板金币余额。 -// 返回 true 表示注册账号会话失效,调用方应跳转登录。 -func attachWalletFromGetInfo(c *gin.Context, data gin.H) bool { - if data == nil || useragent.TokenFromRequest(c.Request) == "" { - return false - } - env, user, err := authser.GetInfo(c) - if err != nil { - log.Error("wallet getInfo failed", log.E(err)) - return false - } - if env != nil && authser.IsSessionExpiredCode(env.Code) { - retry, needLogin := authser.OnSessionExpired(c, env.Code) - if needLogin { - return true - } - if retry { - env, user, err = authser.GetInfo(c) - if err != nil { - log.Error("wallet getInfo retry failed", log.E(err)) - return false - } - } - } - if env == nil || env.Code != 200 || user == nil { - return false - } - authser.SetAuthCookies(c, user) - data["userId"] = authser.FormatUserID(user.UserID) - data["recharge"] = user.Recharge - data["rechargeText"] = authser.FormatRecharge(user.Recharge) - data["vipType"] = user.VipType - data["showCardId"] = user.ShowCardID - data["showCardName"] = strings.TrimSpace(user.ShowCardName) - active := authser.IsActiveVipUser(user.VipType, user.CurrentVipExpire) - data["isVip"] = active - if active { - data["vipLabel"] = authser.VipDisplayLabel(user.ShowCardName, user.VipType) - data["vipExpireText"] = authser.FormatVipExpireText(user.CurrentVipExpire) - } else { - delete(data, "vipLabel") - delete(data, "vipExpireText") - } - return false -} - -// Deposit 金币与会员充值页 SSR:套餐列表 + 金币流水明细。 -// Query tab=coin 时默认选中金币充值套餐。 -func Deposit(c *gin.Context) { - // 先补游客会话,保证可拉流水。 - authser.EnsureGuestOnEnter(c) - - preferTab := routeOrQuery(c, "tab", "tab") - if hasQuery(c, "tab") { - target := "/deposit" - if preferTab != "" { - target += "/" + preferTab - } - target += "/" - if redirectCanonical(c, target) { - return - } - } - raw := rechargeser.FetchPackageListOrEmpty(c) - vm := rechargeser.BuildDepositPageVM(raw, preferTab) - if useragent.TokenFromRequest(c.Request) != "" { - list, code, err := rechargeser.FetchCoinTransList(c, 1, 20) - if err != nil { - retry, needLogin := authser.OnSessionExpired(c, code) - if needLogin { - RedirectToLogin(c) - return - } - if retry { - list, _, err = rechargeser.FetchCoinTransList(c, 1, 20) - } - if err != nil { - log.Error("fetch coin trans list failed", log.E(err)) - list = nil - } - } - vm.AttachTxList(list) - } - data := gin.H{ - "title": "金币与会员", - "vipList": vm.VipList, - "coinList": vm.CoinList, - "payMethods": vm.PayMethods, - "txList": vm.TxList, - "preferTab": preferTab, - } - setNoIndex(data, false) - if attachWalletFromGetInfo(c, data) { - RedirectToLogin(c) - return - } - HTMLOK(c, "deposit.html", data) -} - -// CoinBuy 代理上游 POST /api/app/coin/buy。 -func CoinBuy(c *gin.Context) { - handleBuyPay(c, "coin") -} - -// VipPay 代理上游 POST /api/app/vip/pay。 -func VipPay(c *gin.Context) { - handleBuyPay(c, "vip") -} - -func handleBuyPay(c *gin.Context, kind string) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再支付", - "data": nil, - }) - return - } - - var body buyPayBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - - body.PayMode = rechargeser.NormalizePayMode(body.PayMode) - if body.PackageID <= 0 || body.PayMode == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "请选择套餐和支付方式", - "data": nil, - }) - return - } - - req := rechargeser.BuyPayReq{ - PackageID: body.PackageID, - PayMode: body.PayMode, - } - - var ( - env *rechargeser.APIEnvelope[rechargeser.PayOrderResp] - err error - ) - switch kind { - case "coin": - env, err = rechargeser.BuyCoin(c, req) - default: - env, err = rechargeser.VipPay(c, req) - } - if err != nil { - log.Error("buy/pay upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "pay failed", - "tip": "发起支付失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - switch kind { - case "coin": - env, err = rechargeser.BuyCoin(c, req) - default: - env, err = rechargeser.VipPay(c, req) - } - if err != nil { - log.Error("buy/pay retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "pay failed", - "tip": "发起支付失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "发起支付失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - payURL := strings.TrimSpace(env.Data.PayURL) - if payURL == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "empty payUrl", - "tip": "未获取到支付链接,请稍后重试", - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "请完成支付"), - "data": gin.H{ - "isOpenNewBrowser": env.Data.IsOpenNewBrowser, - "payUrl": payURL, - "payUrlMode": env.Data.PayURLMode, - "tradeNo": env.Data.TradeNo, - }, - }) -} diff --git a/app/api/web/dialog.go b/app/api/web/dialog.go index 1c341c9..ce31a55 100644 --- a/app/api/web/dialog.go +++ b/app/api/web/dialog.go @@ -9,8 +9,6 @@ import ( var dialogTemplates = map[string]string{ "download": "downloadAppDialog", - "login": "loginDialog", - "register": "registerDialog", "search": "searchDialog", } diff --git a/app/api/web/feedback.go b/app/api/web/feedback.go index b62dd41..5307e7a 100644 --- a/app/api/web/feedback.go +++ b/app/api/web/feedback.go @@ -4,9 +4,9 @@ import ( "net/http" "strings" "unicode/utf8" + "videoweb/app/service/authser" "videoweb/app/service/feedbackser" "videoweb/pub/common/log" - "videoweb/pub/common/useragent" "github.com/gin-gonic/gin" ) @@ -28,15 +28,7 @@ type contactUsBody struct { // AddFeedback 代理上游 POST /api/app/feedback/add。 func AddFeedback(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再提交反馈", - "data": nil, - }) - return - } + authser.EnsureGuestOnEnter(c) var body feedbackBody if err := c.ShouldBindJSON(&body); err != nil { @@ -158,10 +150,7 @@ func AddFeedback(c *gin.Context) { // AddContactUs 代理上游 POST /api/app/contactus/add。 func AddContactUs(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{"code": 401, "msg": "unauthorized", "tip": "请先登录后再提交", "data": nil}) - return - } + authser.EnsureGuestOnEnter(c) var body contactUsBody if err := c.ShouldBindJSON(&body); err != nil { c.JSON(http.StatusBadRequest, gin.H{"code": 1001, "msg": "参数错误", "tip": "参数错误", "data": nil}) diff --git a/app/api/web/history.go b/app/api/web/history.go deleted file mode 100644 index 9cf7c94..0000000 --- a/app/api/web/history.go +++ /dev/null @@ -1,117 +0,0 @@ -package web - -import ( - "net/http" - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -// History 观看历史 SSR:GET /api/app/playlet/history/list。 -func History(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - RedirectToLogin(c) - return - } - - q := playletser.ParseHistoryListQuery(routeOrQuery(c, "page", "page")) - if redirectCanonical(c, playletser.HistoryCanonicalPath(q)) { - return - } - raw, code, err := playletser.FetchHistoryList(c, q) - if err != nil { - aborted, retry := AbortSSRIfSessionExpired(c, code) - if aborted { - return - } - if retry { - raw, _, err = playletser.FetchHistoryList(c, q) - } - if err != nil { - log.Error("fetch playlet history list failed", log.E(err)) - raw = &playletser.PlayletHistoryListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - } - if raw == nil { - raw = &playletser.PlayletHistoryListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - - data := gin.H{ - "title": "观看历史", - "description": "查看黄果短剧观看历史,快速回到上次看到的剧集继续观看。", - "navActive": "userCenter", - "list": raw.List, - "pageNum": raw.PageNum, - "pageSize": raw.PageSize, - "totalCount": raw.TotalCount, - "pagination": playletser.BuildHistoryPagination(q, raw.TotalCount), - "emptyTitle": "暂无观看历史", - "emptyDesc": "开始播放短剧后,记录会出现在这里", - } - setNoIndex(data, false) - HTMLOK(c, "history.html", data) -} - -// HistoryClear 代理上游 POST /api/app/playlet/history/clear。 -func HistoryClear(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录", - "data": nil, - }) - return - } - - env, err := playletser.HistoryClear(c) - if err != nil { - log.Error("playlet history clear upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "history clear failed", - "tip": "清空失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.HistoryClear(c) - if err != nil { - log.Error("playlet history clear retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "history clear failed", - "tip": "清空失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "清空失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "已清空观看历史"), - "data": env.Data, - }) -} diff --git a/app/api/web/index.go b/app/api/web/index.go index 3c6122c..680c498 100644 --- a/app/api/web/index.go +++ b/app/api/web/index.go @@ -8,17 +8,6 @@ import ( // Index 首页 SSR:拉取 /api/app/playlet/home,直接用接口字段渲染。 func Index(c *gin.Context) { - renderIndex(c, "") -} - -func AuthIndex(mode string) gin.HandlerFunc { - return func(c *gin.Context) { - renderIndex(c, mode) - } -} - -func renderIndex(c *gin.Context, authMode string) { - authRedirect := c.Param("redirect") raw := playletser.FetchHomeOrEmpty(c) data := gin.H{ "title": "黄果短剧", @@ -29,11 +18,6 @@ func renderIndex(c *gin.Context, authMode string) { "homeCategoryData": raw.HomeCategoryData, "homeRecommendThemes": raw.HomeRecommendThemes, "homeBannerData": playletser.ActiveHomeBanners(raw.HomeBannerData), - "authMode": authMode, - "authRedirect": authRedirect, - } - if authMode != "" { - setNoIndex(data, true) } HTMLOK(c, "index.html", data) } diff --git a/app/api/web/play.go b/app/api/web/play.go index 2035b26..cdf94aa 100644 --- a/app/api/web/play.go +++ b/app/api/web/play.go @@ -2,9 +2,7 @@ package web import ( "strings" - "videoweb/app/service/authser" "videoweb/app/service/playletser" - "videoweb/pub/common/useragent" "github.com/gin-gonic/gin" ) @@ -56,10 +54,6 @@ func Play(c *gin.Context) { chapters = playlet.PlayletChapterInfo episodeRanges = playletser.BuildEpisodeRanges(chapters, playlet.TotalEpisode, 30) - if chapter != nil && useragent.TokenFromRequest(c.Request) != "" { - authser.SetRechargeCookie(c, chapter.Balance) - } - seoInfo := playletser.ResolvePlayPageSEO(chapter, playlet) data := gin.H{ diff --git a/app/api/web/playlet_like.go b/app/api/web/playlet_like.go deleted file mode 100644 index 6887ff0..0000000 --- a/app/api/web/playlet_like.go +++ /dev/null @@ -1,196 +0,0 @@ -package web - -import ( - "net/http" - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -type playletLikeBody struct { - ID int64 `json:"id"` - IsLike *bool `json:"isLike"` -} - -// PlayletLikeSet 代理上游 POST /api/app/playlet/like/set。 -func PlayletLikeSet(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再点赞", - "data": nil, - }) - return - } - - var body playletLikeBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.ID <= 0 || body.IsLike == nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 id 或 isLike", - "data": nil, - }) - return - } - - env, err := playletser.LikeSet(c, playletser.PlayletLikeSetReq{ - ID: body.ID, - IsLike: *body.IsLike, - }) - if err != nil { - log.Error("playlet like set upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "playlet like failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.LikeSet(c, playletser.PlayletLikeSetReq{ - ID: body.ID, - IsLike: *body.IsLike, - }) - if err != nil { - log.Error("playlet like set retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "playlet like failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "操作失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": env.Data, - }) -} - -type playletCollectBody struct { - ID int64 `json:"id"` - IsCollect *bool `json:"isCollect"` -} - -// PlayletCollectSet 代理上游 POST /api/app/playlet/collect/set。 -func PlayletCollectSet(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - c.JSON(http.StatusOK, gin.H{ - "code": 401, - "msg": "unauthorized", - "tip": "请先登录后再收藏", - "data": nil, - }) - return - } - - var body playletCollectBody - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "参数错误", - "data": nil, - }) - return - } - if body.ID <= 0 || body.IsCollect == nil { - c.JSON(http.StatusOK, gin.H{ - "code": 1001, - "msg": "参数错误", - "tip": "缺少 id 或 isCollect", - "data": nil, - }) - return - } - - env, err := playletser.CollectSet(c, playletser.PlayletCollectSetReq{ - ID: body.ID, - IsCollect: *body.IsCollect, - }) - if err != nil { - log.Error("playlet collect set upstream failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "playlet collect failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - if env != nil && TryJSONSessionRecover(c, env.Code) { - env, err = playletser.CollectSet(c, playletser.PlayletCollectSetReq{ - ID: body.ID, - IsCollect: *body.IsCollect, - }) - if err != nil { - log.Error("playlet collect set retry failed", log.E(err)) - c.JSON(http.StatusOK, gin.H{ - "code": 500, - "msg": "playlet collect failed", - "tip": "操作失败,请稍后重试", - "data": nil, - }) - return - } - } - if env == nil || env.Code != 200 { - tip := "操作失败" - msg := "" - code := 500 - if env != nil { - code = env.Code - msg = env.Msg - tip = firstNonEmpty(env.Tip, env.Msg, tip) - } - c.JSON(http.StatusOK, gin.H{ - "code": code, - "msg": msg, - "tip": tip, - "data": nil, - }) - return - } - - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": firstNonEmpty(env.Msg, "success"), - "tip": firstNonEmpty(env.Tip, "成功"), - "data": env.Data, - }) -} diff --git a/app/api/web/rank.go b/app/api/web/rank.go index f5046df..0dbb155 100644 --- a/app/api/web/rank.go +++ b/app/api/web/rank.go @@ -64,6 +64,7 @@ func Rank(c *gin.Context) { } data := gin.H{ "title": "排行榜", + "pageName": "排行榜", "description": "黄果短剧排行榜实时更新热播短剧,查看热门榜、飙升榜,不错过高口碑必看剧集。", "navActive": "rank", "seoInfo": raw.SeoInfo, diff --git a/app/api/web/render.go b/app/api/web/render.go index 42d8624..11b087b 100644 --- a/app/api/web/render.go +++ b/app/api/web/render.go @@ -13,7 +13,7 @@ import ( "github.com/gin-gonic/gin" ) -// HTML 渲染页面并注入 footer / 导航 / 公共配置 / 登录态(以 cookie 为准)。 +// HTML 渲染页面并注入 footer / 导航 / 公共配置,并确保存在游客会话。 func HTML(c *gin.Context, code int, name string, data gin.H) { if data == nil { data = gin.H{} @@ -69,7 +69,6 @@ func HTML(c *gin.Context, code int, name string, data gin.H) { if !ok { cfg = configser.FetchAppConfigVMOrEmpty(c) } - cfg = configser.ApplyTrackerFallback(cfg) data["appConfig"] = cfg siteURL := seoser.ResolveSiteURL(c, cfg) data["foreverUrlAddr"] = siteURL @@ -79,7 +78,6 @@ func HTML(c *gin.Context, code int, name string, data gin.H) { canonicalURL = seoser.ContentCanonicalURL(siteURL, canonicalURL, map[string]any(data)) data["canonicalURL"] = canonicalURL data["seoVerify"] = seoser.VerifyFromConfig() - attachTrackerPage(c, code, data) noindex := pageNoIndex(data) if noindex { data["noindex"] = true @@ -88,84 +86,14 @@ func HTML(c *gin.Context, code int, name string, data gin.H) { data["jsonLD"] = seoser.PageJSONLD(siteURL, canonicalURL, c.Request.URL.RequestURI(), map[string]any(data), cfg) } - // 无登录 token 时自动游客登录(POST /api/app/auth/guest),保证默认进入即有会话。 + // 无 token 时静默建立游客会话(POST /api/app/auth/guest),上游内容接口依赖该会话。 authser.EnsureGuestOnEnter(c) - loggedIn, userName, avatar, email := authser.AuthFromCookies(c) - registered := authser.IsRegisteredFromCookies(c) - data["isLoggedIn"] = loggedIn - data["isRegistered"] = registered - if _, ok := data["isVip"]; !ok { - data["isVip"] = loggedIn && authser.IsActiveVipFromCookies(c) - } - isVip, _ := data["isVip"].(bool) - data["isVip"] = isVip - if loggedIn { - if userName != "" { - data["userName"] = userName - } - if avatar != "" { - data["avatar"] = avatar - } - if email != "" { - data["email"] = email - } - if _, ok := data["userId"]; !ok { - if uid := authser.UserIDFromCookies(c); uid > 0 { - data["userId"] = authser.FormatUserID(uid) - } - } - // 允许页面 handler 先注入最新钱包数据(如 getInfo),避免被 cookie 覆盖。 - if _, ok := data["recharge"]; !ok { - recharge := authser.RechargeFromCookies(c) - data["recharge"] = recharge - data["rechargeText"] = authser.FormatRecharge(recharge) - } else if _, ok := data["rechargeText"]; !ok { - data["rechargeText"] = authser.FormatRecharge(toInt64(data["recharge"])) - } - if _, ok := data["vipType"]; !ok { - data["vipType"] = authser.VipTypeFromCookies(c) - } - vipType := toInt(data["vipType"]) - data["vipType"] = vipType - if _, ok := data["showCardName"]; !ok { - data["showCardName"] = authser.ShowCardNameFromCookies(c) - } - showCardName, _ := data["showCardName"].(string) - data["showCardName"] = strings.TrimSpace(showCardName) - if _, ok := data["showCardId"]; !ok { - data["showCardId"] = authser.ShowCardIDFromCookies(c) - } - if isVip { - if _, ok := data["vipLabel"]; !ok { - data["vipLabel"] = authser.VipDisplayLabel(showCardName, vipType) - } - if _, ok := data["vipExpireText"]; !ok { - data["vipExpireText"] = authser.VipExpireTextFromCookies(c) - } - } else { - delete(data, "vipLabel") - delete(data, "vipExpireText") - } - } else { - delete(data, "userName") - delete(data, "avatar") - delete(data, "email") - delete(data, "userId") - delete(data, "recharge") - delete(data, "rechargeText") - delete(data, "vipType") - delete(data, "showCardId") - delete(data, "showCardName") - delete(data, "vipLabel") - delete(data, "vipExpireText") - } - c.HTML(code, name, data) } // buildPageConsoleData 构建浏览器控制台使用的页面返回数据快照。 -// 快照在公共配置和 cookie 登录态注入前生成,避免把会话相关公共字段写入日志。 +// 快照不包含公共配置等大字段。 func buildPageConsoleData(path string, code int, templateName string, data gin.H) gin.H { pageData := make(gin.H, len(data)) for key, value := range data { @@ -191,8 +119,7 @@ func buildPageConsoleData(path string, code int, templateName string, data gin.H func pageConsoleExcludedKey(key string) bool { switch key { - case "pageConsoleData", "appConfig", "footer", "headerNav", "jsonLD", "seoVerify", - "isLoggedIn", "isRegistered", "userName", "avatar", "email", "userId": + case "pageConsoleData", "appConfig", "footer", "headerNav", "jsonLD", "seoVerify": return true default: return false @@ -312,3 +239,12 @@ func toInt64(v any) int64 { func toInt(v any) int { return int(toInt64(v)) } + +func firstNonEmpty(values ...string) string { + for _, v := range values { + if strings.TrimSpace(v) != "" { + return v + } + } + return "" +} diff --git a/app/api/web/render_test.go b/app/api/web/render_test.go index ca8b90f..cfae114 100644 --- a/app/api/web/render_test.go +++ b/app/api/web/render_test.go @@ -7,15 +7,13 @@ import ( "github.com/gin-gonic/gin" ) -func TestBuildPageConsoleDataFiltersCommonSessionFields(t *testing.T) { +func TestBuildPageConsoleDataFiltersCommonFields(t *testing.T) { payload := buildPageConsoleData("/detail/example", http.StatusOK, "detail.html", gin.H{ "title": "示例短剧", "detail": gin.H{"id": 12, "slug": "example"}, "appConfig": "public config", "headerNav": "navigation", "footer": "footer data", - "isLoggedIn": true, - "email": "viewer@example.com", "pageConsoleData": "old payload", }) @@ -32,7 +30,7 @@ func TestBuildPageConsoleDataFiltersCommonSessionFields(t *testing.T) { if payload["headerNav"] != "navigation" || payload["footer"] != "footer data" { t.Fatalf("common navigation/footer data missing: %#v", payload) } - for _, key := range []string{"appConfig", "headerNav", "isLoggedIn", "email", "pageConsoleData"} { + for _, key := range []string{"appConfig", "headerNav", "pageConsoleData"} { if _, ok := pageData[key]; ok { t.Fatalf("excluded key %q remains in console data: %#v", key, pageData) } diff --git a/app/api/web/richtext.go b/app/api/web/richtext.go index e4294bd..5d353b1 100644 --- a/app/api/web/richtext.go +++ b/app/api/web/richtext.go @@ -20,7 +20,7 @@ func Richtext(c *gin.Context) { if redirectCanonical(c, target) { return } - renderRichtext(c, title) + renderRichtext(c, title, "富文本页") } func RichtextPage(title string) gin.HandlerFunc { @@ -34,31 +34,32 @@ func RichtextPage(title string) gin.HandlerFunc { "帮助中心": "helpCenter.html", } if fallbackTemplate := fallbackTemplates[title]; fallbackTemplate != "" { - data := gin.H{"title": title} + data := gin.H{"title": title, "pageName": title} applyRichtextIndexPolicy(data, title) if title == "帮助中心" { data["faqItems"] = []seoser.FAQItem{ - {Question: "无法登录账号怎么办?", Answer: "请确认邮箱与密码是否正确;若忘记密码,可在登录页面使用“找回密码”。"}, - {Question: "观看记录没有同步?", Answer: "请确认已登录同一账号并保持网络连接,记录通常会自动同步。"}, + {Question: "付费剧集怎么观看?", Answer: "网页端可免费观看免费剧集;付费剧集请下载黄果短剧 App 观看完整内容。"}, + {Question: "需要注册账号吗?", Answer: "不需要,网页端无需注册即可直接观看免费剧集。"}, {Question: "视频无法播放或加载缓慢?", Answer: "建议切换网络、刷新页面或更新浏览器;问题持续时可提交反馈。"}, - {Question: "如何管理收藏内容?", Answer: "进入个人中心的“追剧与收藏”页面,可查看或取消收藏。"}, + {Question: "在哪里下载 App?", Answer: "点击页面上的“下载APP”入口,按提示扫码或直接下载安装。"}, } } HTMLOK(c, fallbackTemplate, data) return } } - renderRichtextData(c, title, page) + renderRichtextData(c, title, title, page) } } -func renderRichtext(c *gin.Context, title string) { +func renderRichtext(c *gin.Context, title, pageName string) { title = strings.TrimSpace(title) page := configser.FetchRichTextByTitle(c, title) - renderRichtextData(c, title, page) + renderRichtextData(c, title, pageName, page) } -func renderRichtextData(c *gin.Context, title string, page configser.RichTextPageVM) { +// pageName 为面包屑名称,与上游富文本标题可能不同。 +func renderRichtextData(c *gin.Context, title, pageName string, page configser.RichTextPageVM) { if !page.Found { NotFound(c, "未找到该内容") return @@ -73,6 +74,7 @@ func renderRichtextData(c *gin.Context, title string, page configser.RichTextPag "title": displayTitle, "richtext": page, "richtextKey": title, + "pageName": pageName, } applyRichtextIndexPolicy(data, title) HTMLOK(c, "richtext.html", data) diff --git a/app/api/web/session.go b/app/api/web/session.go index ab243a5..7d7e06c 100644 --- a/app/api/web/session.go +++ b/app/api/web/session.go @@ -6,27 +6,7 @@ import ( "github.com/gin-gonic/gin" ) -// AbortSSRIfSessionExpired 处理 SSR 场景下的会话失效码。 -// aborted=true:已跳转登录,调用方应立刻 return; -// retry=true:游客已重新登录,调用方应重试上游请求。 -func AbortSSRIfSessionExpired(c *gin.Context, code int) (aborted, retry bool) { - if !authser.IsSessionExpiredCode(code) { - return false, false - } - retry, needLogin := authser.OnSessionExpired(c, code) - if needLogin { - RedirectToLogin(c) - return true, false - } - return false, retry -} - -// TryJSONSessionRecover JSON 接口遇到会话失效时:游客重登后返回 true(应重试); -// 注册账号清 cookie 后返回 false,调用方继续把 code=1000 交给前端弹登录。 +// TryJSONSessionRecover 上游返回会话失效时重建游客会话;返回 true 表示调用方应重试一次。 func TryJSONSessionRecover(c *gin.Context, code int) bool { - if !authser.IsSessionExpiredCode(code) { - return false - } - retry, _ := authser.OnSessionExpired(c, code) - return retry + return authser.RecoverContentSession(c, code) } diff --git a/app/api/web/setting.go b/app/api/web/setting.go deleted file mode 100644 index 0391f4d..0000000 --- a/app/api/web/setting.go +++ /dev/null @@ -1,119 +0,0 @@ -package web - -import ( - "net/http" - "videoweb/app/service/authser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -// Setting 账号设置页:SSR 拉取 /api/app/auth/getInfo。 -func Setting(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - RedirectToLogin(c) - return - } - - env, user, err := authser.GetInfo(c) - if err != nil { - log.Error("setting getInfo failed", log.E(err)) - authser.ClearAuthCookies(c) - RedirectToLogin(c) - return - } - if env != nil && authser.IsSessionExpiredCode(env.Code) { - retry, needLogin := authser.OnSessionExpired(c, env.Code) - if needLogin || !retry { - RedirectToLogin(c) - return - } - env, user, err = authser.GetInfo(c) - if err != nil || env == nil || env.Code != 200 || user == nil { - authser.ClearAuthCookies(c) - RedirectToLogin(c) - return - } - } else if env == nil || env.Code != 200 || user == nil { - authser.ClearAuthCookies(c) - RedirectToLogin(c) - return - } - - authser.SetAuthCookies(c, user) - vm := authser.BuildSettingVM(user) - data := gin.H{ - "title": "账号设置", - "setting": vm, - } - setNoIndex(data, false) - HTMLOK(c, "setting.html", data) -} - -// EditProfile 编辑资料页:SSR 拉取 getInfo,头像/昵称等回填。 -func EditProfile(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - RedirectToLogin(c) - return - } - - env, user, err := authser.GetInfo(c) - if err != nil { - log.Error("edit-profile getInfo failed", log.E(err)) - authser.ClearAuthCookies(c) - RedirectToLogin(c) - return - } - if env != nil && authser.IsSessionExpiredCode(env.Code) { - retry, needLogin := authser.OnSessionExpired(c, env.Code) - if needLogin || !retry { - RedirectToLogin(c) - return - } - env, user, err = authser.GetInfo(c) - if err != nil || env == nil || env.Code != 200 || user == nil { - authser.ClearAuthCookies(c) - RedirectToLogin(c) - return - } - } else if env == nil || env.Code != 200 || user == nil { - authser.ClearAuthCookies(c) - RedirectToLogin(c) - return - } - - authser.SetAuthCookies(c, user) - vm := authser.BuildSettingVM(user) - data := gin.H{ - "title": "编辑个人资料", - "profile": vm, - } - setNoIndex(data, false) - HTMLOK(c, "editProfile.html", data) -} - -// EditPassword 修改密码页:需登录。 -func EditPassword(c *gin.Context) { - if useragent.TokenFromRequest(c.Request) == "" { - RedirectToLogin(c) - return - } - data := gin.H{ - "title": "修改登录密码", - } - setNoIndex(data, false) - HTMLOK(c, "editPassword.html", data) -} - -// Logout 清除登录 cookie,并标记跳过紧接着的一次自动游客登录。 -func Logout(c *gin.Context) { - authser.ClearAuthCookies(c) - authser.MarkGuestSkipAuto(c) - c.JSON(http.StatusOK, gin.H{ - "code": 200, - "msg": "success", - "tip": "已退出登录", - "data": nil, - }) -} diff --git a/app/api/web/today_update.go b/app/api/web/today_update.go index fe6c34f..41edfc7 100644 --- a/app/api/web/today_update.go +++ b/app/api/web/today_update.go @@ -19,6 +19,7 @@ func TodayUpdate(c *gin.Context) { } data := gin.H{ "title": "今日更新", + "pageName": "今日更新", "description": "黄果短剧今日更新:第一时间追更最新上线短剧与连载剧集,不错过每日精彩更新。", "navActive": "todayUpdate", "seoInfo": raw.SeoInfo, diff --git a/app/api/web/tracker_page.go b/app/api/web/tracker_page.go deleted file mode 100644 index 58d65a3..0000000 --- a/app/api/web/tracker_page.go +++ /dev/null @@ -1,127 +0,0 @@ -package web - -import ( - "net/http" - "strings" - - "github.com/gin-gonic/gin" -) - -// attachTrackerPage 按响应状态和路径注入 pageKey / pageName(handler 可显式覆盖)。 -// 所有 HTML 页面都必须得到明确页面信息,避免埋点落入 unknown / 未知页面。 -func attachTrackerPage(c *gin.Context, code int, data gin.H) { - if data == nil { - return - } - key, name := trackerPageFromRequest(c.Request.URL.Path, code) - if code >= http.StatusBadRequest { - data["pageKey"] = key - data["pageName"] = name - return - } - existingKey, _ := data["pageKey"].(string) - existingName, _ := data["pageName"].(string) - existingKey = strings.TrimSpace(existingKey) - existingName = strings.TrimSpace(existingName) - - if existingKey == "" || existingKey == "unknown" { - data["pageKey"] = key - } - if existingName == "" || existingName == "未知页面" { - data["pageName"] = name - } -} - -func trackerPageFromRequest(path string, code int) (pageKey, pageName string) { - if code >= http.StatusInternalServerError { - return "server_error", "服务异常页面" - } - if code >= http.StatusBadRequest { - return "not_found", "404页面" - } - return trackerPageFromPath(path) -} - -func trackerPageFromPath(path string) (pageKey, pageName string) { - p := strings.TrimSpace(path) - if p == "" || p == "/" { - return "home", "首页" - } - // 去掉尾部斜杠,便于精确匹配 - p = strings.TrimSuffix(p, "/") - switch { - case trackerPathHasPrefix(p, "/list"): - return "list", "短剧列表" - case trackerPathHasPrefix(p, "/series"): - return "series", "AI成人剧集" - case trackerPathHasPrefix(p, "/tag"), trackerPathHasPrefix(p, "/tag-list"): - return "tag_list", "标签详情" - case trackerPathHasPrefix(p, "/rank"): - return "rank", "排行榜" - case trackerPathHasPrefix(p, "/today-update"): - return "today_update", "今日更新" - case trackerPathHasPrefix(p, "/category"): - return "category_detail", "分类详情" - case trackerTopicIndexPath(p): - return "theme_index", "专题列表" - case trackerPathHasPrefix(p, "/topic"), trackerPathHasPrefix(p, "/more"): - return "topic", "专题详情" - case trackerPathHasPrefix(p, "/download-app"): - return "download_app", "下载APP" - case trackerPathHasPrefix(p, "/application"): - return "application", "应用推荐" - case trackerPathHasPrefix(p, "/home-road"): - return "home_road", "回家的路" - case trackerPathHasPrefix(p, "/detail"): - return "detail", "短剧详情" - case trackerPathHasPrefix(p, "/play"): - return "play", "播放页" - case trackerPathHasPrefix(p, "/login"): - return "login", "登录" - case trackerPathHasPrefix(p, "/register"): - return "register", "注册" - case trackerPathHasPrefix(p, "/user-center"): - return "user_center", "个人中心" - case trackerPathHasPrefix(p, "/deposit"): - return "deposit", "充值中心" - case trackerPathHasPrefix(p, "/collect"): - return "collect", "我的收藏" - case trackerPathHasPrefix(p, "/history"): - return "history", "观看历史" - case trackerPathHasPrefix(p, "/setting"): - return "setting", "设置" - case trackerPathHasPrefix(p, "/edit-profile"): - return "edit_profile", "编辑资料" - case trackerPathHasPrefix(p, "/edit-password"): - return "edit_password", "修改密码" - case trackerPathHasPrefix(p, "/search"): - return "search", "搜索结果页" - case trackerPathHasPrefix(p, "/about-us"): - return "about_us", "关于我们" - case trackerPathHasPrefix(p, "/user-agreement"): - return "user_agreement", "用户协议" - case trackerPathHasPrefix(p, "/privacy-policy"): - return "privacy_policy", "隐私政策" - case trackerPathHasPrefix(p, "/help-center"): - return "help_center", "帮助中心" - case trackerPathHasPrefix(p, "/richtext"): - return "rich_text", "富文本页" - case trackerPathHasPrefix(p, "/feedback"): - return "feedback", "问题反馈" - case trackerPathHasPrefix(p, "/nav"), trackerPathHasPrefix(p, "/dh"): - return "nav", "官方导航" - default: - return "internal_other", "站内其他页面" - } -} - -func trackerPathHasPrefix(path, base string) bool { - return path == base || strings.HasPrefix(path, base+"/") -} - -func trackerTopicIndexPath(path string) bool { - if path == "/topic" || path == "/more" { - return true - } - return strings.HasPrefix(path, "/topic/page/") || strings.HasPrefix(path, "/more/page/") -} diff --git a/app/api/web/tracker_page_test.go b/app/api/web/tracker_page_test.go deleted file mode 100644 index f91d392..0000000 --- a/app/api/web/tracker_page_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package web - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/gin-gonic/gin" -) - -func TestTrackerPageFromPath(t *testing.T) { - tests := []struct { - path string - key string - name string - }{ - {"/", "home", "首页"}, - {"/list/ai-short-play/2/page/3/", "list", "短剧列表"}, - {"/series/hot/page/2/", "series", "AI成人剧集"}, - {"/tag/family/page/2/", "tag_list", "标签详情"}, - {"/tag-list/family/", "tag_list", "标签详情"}, - {"/rank/2/page/3/", "rank", "排行榜"}, - {"/today-update/page/2/", "today_update", "今日更新"}, - {"/category/drama/page/2/", "category_detail", "分类详情"}, - {"/topic/page/2/", "theme_index", "专题列表"}, - {"/topic/sweet-love/page/2/", "topic", "专题详情"}, - {"/more/legacy-topic/", "topic", "专题详情"}, - {"/detail/my-playlet/", "detail", "短剧详情"}, - {"/play/my-playlet/42/", "play", "播放页"}, - {"/login/return/detail/foo/", "login", "登录"}, - {"/register/", "register", "注册"}, - {"/collect/chapter/page/2/", "collect", "我的收藏"}, - {"/search/测试/page/2/", "search", "搜索结果页"}, - {"/about-us/", "about_us", "关于我们"}, - {"/user-agreement/", "user_agreement", "用户协议"}, - {"/privacy-policy/", "privacy_policy", "隐私政策"}, - {"/help-center/", "help_center", "帮助中心"}, - {"/richtext/自定义内容/", "rich_text", "富文本页"}, - {"/dh/", "nav", "官方导航"}, - {"/unregistered-path/", "internal_other", "站内其他页面"}, - } - - for _, tt := range tests { - t.Run(tt.path, func(t *testing.T) { - key, name := trackerPageFromPath(tt.path) - if key != tt.key || name != tt.name { - t.Fatalf("trackerPageFromPath(%q) = (%q, %q), want (%q, %q)", tt.path, key, name, tt.key, tt.name) - } - }) - } -} - -func TestTrackerPageFromRequestUsesResponseStatus(t *testing.T) { - tests := []struct { - status int - key string - name string - }{ - {http.StatusNotFound, "not_found", "404页面"}, - {http.StatusInternalServerError, "server_error", "服务异常页面"}, - } - for _, tt := range tests { - key, name := trackerPageFromRequest("/missing/", tt.status) - if key != tt.key || name != tt.name { - t.Fatalf("trackerPageFromRequest(status=%d) = (%q, %q), want (%q, %q)", tt.status, key, name, tt.key, tt.name) - } - } -} - -func TestAttachTrackerPagePreservesExplicitPage(t *testing.T) { - gin.SetMode(gin.TestMode) - c, _ := gin.CreateTestContext(httptest.NewRecorder()) - c.Request = httptest.NewRequest(http.MethodGet, "/topic/custom/", nil) - data := gin.H{"pageKey": "topic", "pageName": "自定义专题"} - - attachTrackerPage(c, http.StatusOK, data) - - if data["pageKey"] != "topic" || data["pageName"] != "自定义专题" { - t.Fatalf("explicit tracker page was overwritten: %#v", data) - } -} - -func TestAttachTrackerPageReplacesUnknownValues(t *testing.T) { - gin.SetMode(gin.TestMode) - c, _ := gin.CreateTestContext(httptest.NewRecorder()) - c.Request = httptest.NewRequest(http.MethodGet, "/play/demo/1/", nil) - data := gin.H{"pageKey": "unknown", "pageName": "未知页面"} - - attachTrackerPage(c, http.StatusOK, data) - - if data["pageKey"] != "play" || data["pageName"] != "播放页" { - t.Fatalf("unknown tracker page was not replaced: %#v", data) - } -} - -func TestAttachTrackerPageMarksErrorResponse(t *testing.T) { - gin.SetMode(gin.TestMode) - c, _ := gin.CreateTestContext(httptest.NewRecorder()) - c.Request = httptest.NewRequest(http.MethodGet, "/topic/deleted/", nil) - data := gin.H{"pageKey": "topic", "pageName": "已删除专题"} - - attachTrackerPage(c, http.StatusNotFound, data) - - if data["pageKey"] != "not_found" || data["pageName"] != "404页面" { - t.Fatalf("error response retained business page mapping: %#v", data) - } -} diff --git a/app/api/web/user_center.go b/app/api/web/user_center.go deleted file mode 100644 index 033fe6d..0000000 --- a/app/api/web/user_center.go +++ /dev/null @@ -1,58 +0,0 @@ -package web - -import ( - "strconv" - "videoweb/app/service/playletser" - "videoweb/pub/common/log" - "videoweb/pub/common/useragent" - - "github.com/gin-gonic/gin" -) - -// UserCenter 个人中心:登录态刷新 getInfo 金币余额,并拉取收藏数量。 -func UserCenter(c *gin.Context) { - data := gin.H{ - "title": "个人中心", - "navActive": "userCenter", - } - setNoIndex(data, false) - if attachWalletFromGetInfo(c, data) { - RedirectToLogin(c) - return - } - if useragent.TokenFromRequest(c.Request) != "" { - raw, code, err := playletser.FetchCollectList(c, playletser.CollectListQuery{ - PageNum: 1, - PageSize: 1, - }) - if err != nil { - aborted, retry := AbortSSRIfSessionExpired(c, code) - if aborted { - return - } - if retry { - raw, _, err = playletser.FetchCollectList(c, playletser.CollectListQuery{ - PageNum: 1, - PageSize: 1, - }) - } - if err != nil { - log.Error("user-center collect count failed", log.E(err)) - raw = nil - } - } - count := int64(0) - if raw != nil { - count = raw.TotalCount - } - if count < 0 { - count = 0 - } - data["collectCount"] = count - data["collectCountText"] = strconv.FormatInt(count, 10) + "部" - } else { - data["collectCount"] = int64(0) - data["collectCountText"] = "0部" - } - HTMLOK(c, "userCenter.html", data) -} diff --git a/app/appg/appg.go b/app/appg/appg.go index e6de45f..e634012 100644 --- a/app/appg/appg.go +++ b/app/appg/appg.go @@ -10,13 +10,12 @@ var ( ) type GlobalCfgEx struct { - ServerAddr string `yaml:"serverAddr"` - ListenAddr string `yaml:"listenAddr"` - DHListenAddr string `yaml:"dhListenAddr"` - RunMod string `yaml:"runMod"` - TsAuthKey string `yaml:"tsAuthKey"` - SEO SEOConf `yaml:"seo"` - Tracker TrackerConf `yaml:"tracker"` + ServerAddr string `yaml:"serverAddr"` + ListenAddr string `yaml:"listenAddr"` + DHListenAddr string `yaml:"dhListenAddr"` + RunMod string `yaml:"runMod"` + TsAuthKey string `yaml:"tsAuthKey"` + SEO SEOConf `yaml:"seo"` } // SEOConf 站长平台验证与 SEO 相关配置。 @@ -25,9 +24,3 @@ type SEOConf struct { BaiduHTMLFile string `yaml:"baiduHtmlFile"` // 如 baidu_verify_codeva-xxx.html IndexNowKey string `yaml:"indexNowKey"` // Bing IndexNow 密钥,提供 /{key}.txt } - -// TrackerConf 数据上报 SDK 本地兜底(上游 reportSdkConfig 优先)。 -type TrackerConf struct { - AppID string `yaml:"appId"` - EncryptedConfig string `yaml:"encryptedConfig"` -} diff --git a/app/conf/app.yaml b/app/conf/app.yaml index cb3b621..a97e69b 100644 --- a/app/conf/app.yaml +++ b/app/conf/app.yaml @@ -1,11 +1,6 @@ -serverAddr: "http://172.104.181.99:27413" +serverAddr: "https://webhgdjapi.mfcg.me" listenAddr: "25119" dhListenAddr: "26812" runMod: "dev" tsAuthKey: "fT5xSg4hltHpzVy6aV9rVECDJ1J1pN" -# 数据上报 SDK(web-sdk)。encryptedConfig 优先用上游 config/info.reportSdkConfig; -# 若上游暂未下发,可在此填写密文兜底。 -tracker: - appId: "JHA-1043" - encryptedConfig: "" diff --git a/app/router/gin.go b/app/router/gin.go index 42e54f8..bf4055c 100644 --- a/app/router/gin.go +++ b/app/router/gin.go @@ -9,7 +9,6 @@ import ( "strings" "videoweb/app/api/web" "videoweb/app/appg" - "videoweb/app/service/configser" "videoweb/app/service/playletser" "videoweb/app/service/seoser" @@ -62,7 +61,6 @@ func setupEngine(engine *gin.Engine) { tplFuncs := playletser.TemplateFuncs() tplFuncs["InJSONScript"] = inJSONScript tplFuncs["jsonStr"] = jsonStr - tplFuncs["InTrackerAppId"] = inTrackerAppId engine.SetFuncMap(tplFuncs) engine.LoadHTMLFiles(listHTMLTemplates("templates")...) engine.Use(staticCacheHeaders(), crawlerHeaders()) @@ -145,42 +143,19 @@ func jsonStr(s string) template.JS { return template.JS(b) } -func inTrackerAppId() string { - return configser.ResolveTrackerAppID() -} - func registerRoutes(r *gin.Engine) { r.GET("/", web.Index) r.GET("/ui/dialog/:name", web.DialogFragment) - r.POST("/api/auth/register", web.Register) - r.POST("/api/auth/login", web.Login) - r.POST("/api/auth/resetPassword", web.ResetPassword) - r.POST("/api/auth/guest", web.Guest) - r.POST("/api/auth/logout", web.Logout) - r.POST("/api/auth/profile", web.UpdateProfile) - r.GET("/api/auth/getInfo", web.GetUserInfo) - r.POST("/api/upload/image", web.UploadImage) r.POST("/api/feedback/add", web.AddFeedback) r.POST("/api/contactus/add", web.AddContactUs) r.GET("/api/comment/list", web.CommentList) - r.POST("/api/comment/send", web.CommentSend) - r.POST("/api/comment/like/set", web.CommentLikeSet) - r.POST("/api/playlet/like/set", web.PlayletLikeSet) - r.POST("/api/playlet/collect/set", web.PlayletCollectSet) r.POST("/api/playlet/forward/heat", web.PlayletForwardHeat) r.GET("/api/playlet/chapter/detail", web.ChapterDetail) r.GET("/api/playlet/chapter/list", web.ChapterList) r.GET("/api/playlet/operate/list", web.OperateList) r.GET("/api/playlet/hot-like", web.HotLike) r.GET("/api/app/playlet/hot-like", web.HotLike) - r.POST("/api/playlet/chapter/like/set", web.ChapterLikeSet) - r.POST("/api/playlet/chapter/collect/set", web.ChapterCollectSet) - r.POST("/api/playlet/chapter/watch/report", web.ChapterWatchReport) - r.POST("/api/playlet/history/clear", web.HistoryClear) - r.POST("/api/playlet/chapter/unlock", web.ChapterUnlock) - r.POST("/api/coin/buy", web.CoinBuy) - r.POST("/api/vip/pay", web.VipPay) r.GET("/list/", web.List) r.GET("/list/:slug/", web.List) @@ -239,26 +214,6 @@ func registerRoutes(r *gin.Engine) { r.GET("/play/:slug/", web.Play) r.GET("/play/:slug/:chapterId/", web.Play) - r.GET("/login/", web.AuthIndex("login")) - r.GET("/login/return/*redirect", web.AuthIndex("login")) - r.GET("/register/", web.AuthIndex("register")) - - r.GET("/user-center/", web.UserCenter) - - r.GET("/deposit/", web.Deposit) - r.GET("/deposit/:tab/", web.Deposit) - - r.GET("/collect/", web.Collect) - r.GET("/collect/page/:page/", web.Collect) - r.GET("/collect/:type/", web.Collect) - r.GET("/collect/:type/page/:page/", web.Collect) - - r.GET("/history/", web.History) - r.GET("/history/page/:page/", web.History) - - r.GET("/setting/", web.Setting) - r.GET("/edit-profile/", web.EditProfile) - r.GET("/edit-password/", web.EditPassword) r.GET("/search/", web.Search) r.GET("/search/:keyword/", web.Search) r.GET("/search/:keyword/page/:page/", web.Search) diff --git a/app/router/gin_test.go b/app/router/gin_test.go index a40b31c..30f9aa8 100644 --- a/app/router/gin_test.go +++ b/app/router/gin_test.go @@ -46,7 +46,6 @@ func TestContentPagesOnlyRegisterPathParameterRoutes(t *testing.T) { } } for _, route := range []string{ - "POST /api/auth/resetPassword", "POST /api/contactus/add", "GET /api/playlet/chapter/list", "GET /api/playlet/operate/list", diff --git a/app/router/nav_tracking_template_test.go b/app/router/nav_tracking_template_test.go index 50feafd..ab99d7c 100644 --- a/app/router/nav_tracking_template_test.go +++ b/app/router/nav_tracking_template_test.go @@ -48,9 +48,8 @@ func TestMainSiteKeepsMainVerificationAndAnalytics(t *testing.T) { func renderSEOCommonForTrackingTest(t *testing.T, isNavPage bool) string { t.Helper() tpl, err := template.New("tracking-test").Funcs(template.FuncMap{ - "InTrackerAppId": func() string { return "test-app" }, "jsonStr": func(any) template.JS { return template.JS(`""`) }, - }).ParseFiles("../templates/base/seoCommon.html", "../templates/base/trackerInit.html") + }).ParseFiles("../templates/base/seoCommon.html", "../templates/base/analytics.html") if err != nil { t.Fatal(err) } @@ -58,8 +57,7 @@ func renderSEOCommonForTrackingTest(t *testing.T, isNavPage bool) string { "isNavPage": isNavPage, "seoVerify": map[string]any{"Baidu": ""}, "appConfig": map[string]any{ - "ReportSDKConfig": "", - "SeoInfo": map[string]any{"WebSiteName": ""}, + "SeoInfo": map[string]any{"WebSiteName": ""}, }, } var out bytes.Buffer diff --git a/app/service/authser/auth.go b/app/service/authser/auth.go index 519e1f7..6568c6b 100644 --- a/app/service/authser/auth.go +++ b/app/service/authser/auth.go @@ -3,10 +3,8 @@ package authser import ( "encoding/json" "fmt" - "io" "net/http" "net/url" - "strconv" "strings" "time" "videoweb/app/service/upstream" @@ -16,58 +14,11 @@ import ( ) const ( - registerPath = "/api/app/auth/register" - loginPath = "/api/app/auth/login" - resetPath = "/api/app/auth/resetPassword" guestPath = "/api/app/auth/guest" - getInfoPath = "/api/app/auth/getInfo" - profilePath = "/api/app/auth/profile" - uploadPath = "/api/app/upload/image" cookieMaxAge = 7 * 24 * 3600 ) -// Register 调用上游注册接口。 -func Register(c *gin.Context, req RegisterReq) (*APIEnvelope, *LoginResp, error) { - var env APIEnvelope - if _, err := upstream.PostJSON(c, registerPath, req, &env); err != nil { - return nil, nil, err - } - if env.Code != 200 { - return &env, nil, nil - } - user, err := decodeLoginData(env.Data) - if err != nil { - return &env, nil, err - } - return &env, user, nil -} - -// ResetPassword 通过账号和邮箱校验后重置密码。 -func ResetPassword(c *gin.Context, req ResetPasswordReq) (*APIEnvelope, error) { - var env APIEnvelope - if _, err := upstream.PostJSON(c, resetPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} - -// Login 调用上游登录接口。 -func Login(c *gin.Context, req LoginReq) (*APIEnvelope, *LoginResp, error) { - var env APIEnvelope - if _, err := upstream.PostJSON(c, loginPath, req, &env); err != nil { - return nil, nil, err - } - if env.Code != 200 { - return &env, nil, nil - } - user, err := decodeLoginData(env.Data) - if err != nil { - return &env, nil, err - } - return &env, user, nil -} - -// GuestLogin 调用上游游客登录(按设备 ID 创建或找回游客账号)。 +// GuestLogin 调用上游游客登录,站点不提供注册/登录,上游内容接口依赖游客会话。 func GuestLogin(c *gin.Context, req GuestLoginReq) (*APIEnvelope, *LoginResp, error) { var env APIEnvelope if _, err := upstream.PostJSON(c, guestPath, req, &env); err != nil { @@ -83,47 +34,6 @@ func GuestLogin(c *gin.Context, req GuestLoginReq) (*APIEnvelope, *LoginResp, er return &env, user, nil } -// GetInfo 通过 token 拉取最新用户信息。 -func GetInfo(c *gin.Context) (*APIEnvelope, *LoginResp, error) { - var env APIEnvelope - if err := upstream.GetJSON(c, getInfoPath, &env); err != nil { - return nil, nil, err - } - if env.Code != 200 { - return &env, nil, nil - } - user, err := decodeLoginData(env.Data) - if err != nil { - return &env, nil, err - } - return &env, user, nil -} - -// UpdateProfile 修改资料(昵称 / 头像等)。 -func UpdateProfile(c *gin.Context, req UpdateProfileReq) (*APIEnvelope, error) { - var env APIEnvelope - if _, err := upstream.PostJSON(c, profilePath, req, &env); err != nil { - return nil, err - } - return &env, nil -} - -// UploadImage 上传图片;头像场景不加水印。 -func UploadImage(c *gin.Context, fileName string, r io.Reader) (*ImageUploadResp, error) { - var resp ImageUploadResp - _, err := upstream.PostMultipart(c, uploadPath, map[string]string{ - "watermark": "0", - }, &upstream.MultipartFile{ - FieldName: "file", - FileName: fileName, - Reader: r, - }, &resp) - if err != nil { - return nil, err - } - return &resp, nil -} - func decodeLoginData(raw json.RawMessage) (*LoginResp, error) { if len(raw) == 0 || string(raw) == "null" || string(raw) == `""` { return nil, fmt.Errorf("empty login data") @@ -135,7 +45,7 @@ func decodeLoginData(raw json.RawMessage) (*LoginResp, error) { return &user, nil } -// SetAuthCookies 将登录/注册返回写入 cookie。 +// SetAuthCookies 写入游客会话 cookie。 func SetAuthCookies(c *gin.Context, user *LoginResp) { if c == nil || user == nil { return @@ -144,33 +54,13 @@ func SetAuthCookies(c *gin.Context, user *LoginResp) { if strings.TrimSpace(user.Token) != "" { setCookie(c, "token", user.Token, secure) } - setCookie(c, "userId", strconv.FormatInt(user.UserID, 10), secure) - setCookie(c, "accountNo", user.AccountNo, secure) - setCookie(c, "nickName", user.NickName, secure) - setCookie(c, "introduction", user.Introduction, secure) - setCookie(c, "avatar", user.Avatar, secure) - setCookie(c, "email", user.Email, secure) - setCookie(c, "inviteCode", user.InviteCode, secure) - setCookie(c, "recharge", strconv.FormatInt(user.Recharge, 10), secure) - setCookie(c, "vipType", strconv.Itoa(user.VipType), secure) - setCookie(c, "currentVipExpire", user.CurrentVipExpire, secure) - setCookie(c, "showCardId", strconv.FormatInt(user.ShowCardID, 10), secure) - setCookie(c, "showCardName", user.ShowCardName, secure) - setCookie(c, "userType", strconv.Itoa(user.Type), secure) - isReg := "0" - if user.IsRegister || user.Type == 1 { - isReg = "1" - } - setCookie(c, "isRegister", isReg, secure) if sid := useragent.SIDFromRequest(c.Request); sid != "" { setCookie(c, "sid", sid, secure) } } func setCookie(c *gin.Context, name, value string, secure bool) { - // Cookie Value 仅允许 ASCII;中文昵称等需 URL 编码。 - // 使用 PathEscape(空格→%20),与前端 encodeURIComponent 一致; - // 避免 QueryEscape 的空格→+,否则 JS decodeURIComponent 会留下字面量 "+"。 + // Cookie Value 仅允许 ASCII;使用 PathEscape(空格→%20),与前端 encodeURIComponent 一致。 http.SetCookie(c.Writer, &http.Cookie{ Name: name, Value: url.PathEscape(value), @@ -199,7 +89,7 @@ func cookieValue(c *gin.Context, name string) string { return raw } -// ClearAuthCookies 清除登录相关 cookie。 +// ClearAuthCookies 清除会话 cookie,同时清理旧版账号体系遗留的用户信息 cookie。 func ClearAuthCookies(c *gin.Context) { for _, name := range authCookieNames() { http.SetCookie(c.Writer, &http.Cookie{ @@ -218,44 +108,6 @@ func authCookieNames() []string { "token", "_token_", "sid", "_s_token_", "userId", "accountNo", "nickName", "introduction", "avatar", "email", "inviteCode", "recharge", "vipType", "currentVipExpire", "showCardId", "showCardName", - "userType", "isRegister", + "userType", "isRegister", "guest_skip_auto", } } - -// AuthFromCookies 从 cookie 读取登录态,供 SSR 头部 / 个人中心展示。 -func AuthFromCookies(c *gin.Context) (loggedIn bool, userName, avatar, email string) { - token := useragent.TokenFromRequest(c.Request) - if token == "" { - return false, "", "", "" - } - userName = cookieValue(c, "nickName") - if userName == "" { - userName = cookieValue(c, "accountNo") - } - avatar = usableAvatarURL(cookieValue(c, "avatar")) - email = cookieValue(c, "email") - return true, userName, avatar, email -} - -// IsRegisteredFromCookies 是否正式注册账号(非游客)。 -func IsRegisteredFromCookies(c *gin.Context) bool { - if useragent.TokenFromRequest(c.Request) == "" { - return false - } - if cookieValue(c, "isRegister") == "1" { - return true - } - return cookieValue(c, "userType") == "1" -} - -func usableAvatarURL(raw string) string { - raw = strings.TrimSpace(raw) - if raw == "" { - return "" - } - if strings.HasPrefix(raw, "http://") || strings.HasPrefix(raw, "https://") || strings.HasPrefix(raw, "/static/") { - return raw - } - // 无域名的相对路径暂不可用(解密拉取需要完整 URL) - return "" -} diff --git a/app/service/authser/guest_enter.go b/app/service/authser/guest_enter.go index b8abae9..29548a4 100644 --- a/app/service/authser/guest_enter.go +++ b/app/service/authser/guest_enter.go @@ -4,7 +4,6 @@ import ( "crypto/rand" "encoding/hex" "fmt" - "net/http" "net/url" "strconv" "strings" @@ -16,24 +15,17 @@ import ( ) const guestDevIDCookie = "guest_dev_id" -const guestSkipAutoCookie = "guest_skip_auto" -// EnsureGuestOnEnter 页面进入时:无 token(未自己登录)则走游客登录并写 cookie。 -// 对应上游 POST /api/app/auth/guest。成功后会把会话补进当前 Request,便于同一次 SSR 读到登录态。 -// 手动退出后带 guest_skip_auto 时跳过本次;清掉标记后,下次进页再自动游客。 +// EnsureGuestOnEnter 页面进入时:无 token 则走游客登录并写 cookie。 +// 对应上游 POST /api/app/auth/guest。成功后会把会话补进当前 Request,便于同一次 SSR 直接使用。 func EnsureGuestOnEnter(c *gin.Context) *LoginResp { if c == nil || c.Request == nil { return nil } - // 已有任意会话(游客或正式账号)则跳过 + // 已有会话则跳过 if useragent.TokenFromRequest(c.Request) != "" { return nil } - // 手动退出:本次进页不自动游客,并清除标记,供下次进页恢复 - if IsGuestSkipAuto(c) { - ClearGuestSkipAuto(c) - return nil - } devID := ensureGuestDevID(c) env, user, err := GuestLogin(c, GuestLoginReq{ @@ -55,25 +47,10 @@ func EnsureGuestOnEnter(c *gin.Context) *LoginResp { } SetAuthCookies(c, user) - ClearGuestSkipAuto(c) - patchAuthCookiesToRequest(c, user) + patchRequestCookie(c, "token", user.Token) return user } -// RefreshGuestSession 游客会话失效时(如上游 6001 用户不存在)重新游客登录。 -// 正式注册账号不处理,避免把用户踢成游客。 -func RefreshGuestSession(c *gin.Context) *LoginResp { - if c == nil || c.Request == nil { - return nil - } - if IsRegisteredFromCookies(c) { - return nil - } - dropRequestCookie(c, "token") - dropRequestCookie(c, "_token_") - return EnsureGuestOnEnter(c) -} - func dropRequestCookie(c *gin.Context, name string) { if c == nil || c.Request == nil || name == "" { return @@ -88,43 +65,6 @@ func dropRequestCookie(c *gin.Context, name string) { c.Request.Header.Set("Cookie", strings.Join(parts, "; ")) } -// MarkGuestSkipAuto 手动退出后标记:跳过紧接着的一次自动游客登录。 -func MarkGuestSkipAuto(c *gin.Context) { - if c == nil { - return - } - secure := c.Request != nil && c.Request.TLS != nil - http.SetCookie(c.Writer, &http.Cookie{ - Name: guestSkipAutoCookie, - Value: "1", - Path: "/", - MaxAge: 0, // session cookie - HttpOnly: false, - Secure: secure, - SameSite: http.SameSiteLaxMode, - }) -} - -// IsGuestSkipAuto 是否处于「手动退出后跳过自动游客」状态。 -func IsGuestSkipAuto(c *gin.Context) bool { - return cookieValue(c, guestSkipAutoCookie) == "1" -} - -// ClearGuestSkipAuto 清除手动退出跳过标记。 -func ClearGuestSkipAuto(c *gin.Context) { - if c == nil { - return - } - http.SetCookie(c.Writer, &http.Cookie{ - Name: guestSkipAutoCookie, - Value: "", - Path: "/", - MaxAge: -1, - HttpOnly: false, - SameSite: http.SameSiteLaxMode, - }) -} - func ensureGuestDevID(c *gin.Context) string { if id := cookieValue(c, guestDevIDCookie); id != "" { return id @@ -164,31 +104,6 @@ func guestChannel(c *gin.Context) string { return "" } -func patchAuthCookiesToRequest(c *gin.Context, user *LoginResp) { - if c == nil || user == nil { - return - } - patchRequestCookie(c, "token", user.Token) - patchRequestCookie(c, "userId", strconv.FormatInt(user.UserID, 10)) - patchRequestCookie(c, "accountNo", user.AccountNo) - patchRequestCookie(c, "nickName", user.NickName) - patchRequestCookie(c, "introduction", user.Introduction) - patchRequestCookie(c, "avatar", user.Avatar) - patchRequestCookie(c, "email", user.Email) - patchRequestCookie(c, "inviteCode", user.InviteCode) - patchRequestCookie(c, "recharge", strconv.FormatInt(user.Recharge, 10)) - patchRequestCookie(c, "vipType", strconv.Itoa(user.VipType)) - patchRequestCookie(c, "currentVipExpire", user.CurrentVipExpire) - patchRequestCookie(c, "showCardId", strconv.FormatInt(user.ShowCardID, 10)) - patchRequestCookie(c, "showCardName", user.ShowCardName) - patchRequestCookie(c, "userType", strconv.Itoa(user.Type)) - isReg := "0" - if user.IsRegister || user.Type == 1 { - isReg = "1" - } - patchRequestCookie(c, "isRegister", isReg) -} - func patchRequestCookie(c *gin.Context, name, value string) { if c == nil || c.Request == nil || name == "" { return diff --git a/app/service/authser/session.go b/app/service/authser/session.go index 3c33a77..4b5f7bc 100644 --- a/app/service/authser/session.go +++ b/app/service/authser/session.go @@ -2,7 +2,7 @@ package authser import "github.com/gin-gonic/gin" -// TokenExpiredCode 上游约定:token 失效,需重新登录。 +// TokenExpiredCode 上游约定:token 失效。 const TokenExpiredCode = 1000 // IsSessionExpiredCode 是否为会话失效类业务码。 @@ -15,31 +15,7 @@ func IsSessionExpiredCode(code int) bool { } } -// OnSessionExpired 处理上游会话失效。 -// retry=true:游客已重新登录,调用方应重试原请求; -// needLogin=true:注册账号已清 cookie,调用方应跳转登录弹窗/页。 -func OnSessionExpired(c *gin.Context, code int) (retry, needLogin bool) { - if c == nil || !IsSessionExpiredCode(code) { - return false, false - } - if IsRegisteredFromCookies(c) { - ClearAuthCookies(c) - dropRequestCookie(c, "token") - dropRequestCookie(c, "_token_") - return false, true - } - if RefreshGuestSession(c) != nil { - return true, false - } - ClearAuthCookies(c) - dropRequestCookie(c, "token") - dropRequestCookie(c, "_token_") - return false, false -} - -// RecoverContentSession 用于允许游客访问的内容读取接口。 -// 正式账号或游客 token 失效后,清理旧登录态、重新建立游客会话,调用方随后重试一次原请求。 -// 写操作仍应使用 OnSessionExpired,避免把用户操作静默降级为游客操作。 +// RecoverContentSession 会话失效后清理旧 cookie 并重新建立游客会话,调用方随后重试一次原请求。 func RecoverContentSession(c *gin.Context, code int) bool { if c == nil || !IsSessionExpiredCode(code) { return false @@ -48,7 +24,5 @@ func RecoverContentSession(c *gin.Context, code int) bool { for _, name := range authCookieNames() { dropRequestCookie(c, name) } - dropRequestCookie(c, guestSkipAutoCookie) - ClearGuestSkipAuto(c) return EnsureGuestOnEnter(c) != nil } diff --git a/app/service/authser/types.go b/app/service/authser/types.go index b8316df..12cf50a 100644 --- a/app/service/authser/types.go +++ b/app/service/authser/types.go @@ -2,31 +2,6 @@ package authser import "encoding/json" -// RegisterReq 对应 swagger authapi.registerReq -type RegisterReq struct { - AccountNo string `json:"accountNo"` - Email string `json:"email,omitempty"` - Password string `json:"password"` - AgentInviteCode string `json:"agentInviteCode,omitempty"` - DevID string `json:"devID,omitempty"` - Channel string `json:"channel,omitempty"` -} - -// LoginReq 对应 swagger authapi.loginReq -type LoginReq struct { - Account string `json:"account"` - Password string `json:"password"` - DevID string `json:"devID,omitempty"` - Channel string `json:"channel,omitempty"` -} - -// ResetPasswordReq 对应 swagger authapi.resetPasswordReq。 -type ResetPasswordReq struct { - AccountNo string `json:"accountNo"` - Email string `json:"email"` - NewPassword string `json:"newPassword"` -} - // GuestLoginReq 对应 swagger authser.GuestLoginReq // POST /api/app/auth/guest type GuestLoginReq struct { @@ -36,39 +11,10 @@ type GuestLoginReq struct { Channel string `json:"channel,omitempty"` } -// UpdateProfileReq 对应 swagger authapi.updateProfileReq -type UpdateProfileReq struct { - Avatar string `json:"avatar,omitempty"` - Introduction string `json:"introduction,omitempty"` - NickName string `json:"nickName,omitempty"` - OldPassword string `json:"oldPassword,omitempty"` - NewPassword string `json:"newPassword,omitempty"` - PrivacyMode *bool `json:"privacyMode,omitempty"` -} - -// LoginResp 对应 swagger authser.LoginResp -// GET /api/app/auth/getInfo、登录/注册/游客成功 data。 +// LoginResp 游客登录成功 data(只取会话所需字段)。 type LoginResp struct { - Token string `json:"token"` - UserID int64 `json:"userId"` - AccountNo string `json:"accountNo"` - Email string `json:"email"` - NickName string `json:"nickName"` - Introduction string `json:"introduction"` // 简介 - Avatar string `json:"avatar"` // 头像 - InviteCode string `json:"inviteCode"` // 邀请码 - VipType int `json:"vipType"` // 0没卡 1月卡 2年卡 - CurrentVipExpire string `json:"currentVipExpire"` // VIP 过期时间,需结合 vipType 判断是否有效 - ShowCardID int64 `json:"showCardId"` // 最新会员卡 id - ShowCardName string `json:"showCardName"` // 最新会员卡名称,如「1个月会员」 - Status int `json:"status"` // 0正常 1封禁 2禁言 - Type int `json:"type"` // 身份类型:0游客 1普通用户 - IsNewUser bool `json:"isNewUser"` // 本次是否新建游客 - IsRegister bool `json:"isRegister"` // 是否已注册 - LoginType int `json:"loginType"` // 登录方式 - PrivacyMode bool `json:"privacyMode"` // 隐私模式 - Score int64 `json:"score"` // 积分 - Recharge int64 `json:"recharge"` // 金币余额 + Token string `json:"token"` + UserID int64 `json:"userId"` } // APIEnvelope 上游统一响应壳。Data 在失败时可能是 string/null。 @@ -78,17 +24,3 @@ type APIEnvelope struct { Tip string `json:"tip"` Data json.RawMessage `json:"data"` } - -// ImageUploadData 对应 swagger uploadser.ImageUploadData -type ImageUploadData struct { - ID string `json:"id"` - SourceNameFs string `json:"sourceNameFs"` -} - -// ImageUploadResp 对应 swagger uploadser.ImageUploadResp -type ImageUploadResp struct { - Code int `json:"code"` - Msg string `json:"msg"` - Tip string `json:"tip"` - Data *ImageUploadData `json:"data"` -} diff --git a/app/service/authser/view.go b/app/service/authser/view.go deleted file mode 100644 index 66ad8c6..0000000 --- a/app/service/authser/view.go +++ /dev/null @@ -1,87 +0,0 @@ -package authser - -import ( - "fmt" - "strings" -) - -// SettingPageVM 账号设置页展示模型。 -type SettingPageVM struct { - UserID int64 - AccountNo string - NickName string - Introduction string - Email string - EmailMasked string - EmailBound bool - Avatar string // 可用头像 URL;空则模板用默认图 - InviteCode string - PrivacyMode bool - VipType int - VipExpire string - Recharge int64 - Score int64 - DisplayName string -} - -// BuildSettingVM 由 LoginResp 构建设置页 VM。 -func BuildSettingVM(user *LoginResp) SettingPageVM { - if user == nil { - return SettingPageVM{} - } - nick := strings.TrimSpace(user.NickName) - account := strings.TrimSpace(user.AccountNo) - email := strings.TrimSpace(user.Email) - intro := strings.TrimSpace(user.Introduction) - display := nick - if display == "" { - display = account - } - if display == "" { - display = "用户" - } - return SettingPageVM{ - UserID: user.UserID, - AccountNo: account, - NickName: nick, - Introduction: intro, - Email: email, - EmailMasked: MaskEmail(email), - EmailBound: email != "", - Avatar: usableAvatarURL(user.Avatar), - InviteCode: strings.TrimSpace(user.InviteCode), - PrivacyMode: user.PrivacyMode, - VipType: user.VipType, - VipExpire: strings.TrimSpace(user.CurrentVipExpire), - Recharge: user.Recharge, - Score: user.Score, - DisplayName: display, - } -} - -// MaskEmail 邮箱脱敏,如 ab***@mail.com。 -func MaskEmail(email string) string { - email = strings.TrimSpace(email) - if email == "" { - return "" - } - at := strings.LastIndex(email, "@") - if at <= 0 || at == len(email)-1 { - return email - } - local := email[:at] - domain := email[at:] - runes := []rune(local) - if len(runes) <= 2 { - return string(runes[:1]) + "***" + domain - } - return string(runes[:2]) + "***" + domain -} - -// FormatUserID 展示用 ID。 -func FormatUserID(id int64) string { - if id <= 0 { - return "" - } - return fmt.Sprintf("%d", id) -} diff --git a/app/service/authser/vip.go b/app/service/authser/vip.go deleted file mode 100644 index 70a634a..0000000 --- a/app/service/authser/vip.go +++ /dev/null @@ -1,187 +0,0 @@ -package authser - -import ( - "strconv" - "strings" - "time" - - "github.com/gin-gonic/gin" -) - -func parseVipExpireMs(raw string) int64 { - raw = strings.TrimSpace(raw) - if raw == "" { - return 0 - } - if n, err := strconv.ParseInt(raw, 10, 64); err == nil { - if n > 0 && n < 1e12 { - return n * 1000 - } - return n - } - layouts := []string{ - time.RFC3339Nano, - time.RFC3339, - "2006-01-02T15:04:05Z07:00", - "2006-01-02 15:04:05", - } - for _, layout := range layouts { - if t, err := time.Parse(layout, raw); err == nil { - return t.UnixMilli() - } - } - return 0 -} - -// UserIDFromCookies 读取 cookie userId。 -func UserIDFromCookies(c *gin.Context) int64 { - if c == nil { - return 0 - } - n, _ := strconv.ParseInt(strings.TrimSpace(cookieValue(c, "userId")), 10, 64) - if n < 0 { - return 0 - } - return n -} - -// VipTypeFromCookies 读取 cookie vipType。 -func VipTypeFromCookies(c *gin.Context) int { - if c == nil { - return 0 - } - n, _ := strconv.Atoi(strings.TrimSpace(cookieValue(c, "vipType"))) - return n -} - -// VipTypeLabel vipType 文案:0普通 1月卡 2年卡(与 91ly / 编辑资料注释一致)。 -func VipTypeLabel(vipType int) string { - switch vipType { - case 1: - return "月卡会员" - case 2: - return "年卡会员" - default: - return "普通会员" - } -} - -// ShowCardNameFromCookies 读取 cookie showCardName。 -func ShowCardNameFromCookies(c *gin.Context) string { - if c == nil { - return "" - } - return strings.TrimSpace(cookieValue(c, "showCardName")) -} - -// ShowCardIDFromCookies 读取 cookie showCardId。 -func ShowCardIDFromCookies(c *gin.Context) int64 { - if c == nil { - return 0 - } - n, _ := strconv.ParseInt(strings.TrimSpace(cookieValue(c, "showCardId")), 10, 64) - if n < 0 { - return 0 - } - return n -} - -// VipDisplayLabel 优先使用 getInfo.showCardName,否则回退 vipType 文案。 -func VipDisplayLabel(showCardName string, vipType int) string { - if s := strings.TrimSpace(showCardName); s != "" { - return s - } - return VipTypeLabel(vipType) -} - -// VipDisplayLabelFromCookies 从 cookie 组装会员展示名。 -func VipDisplayLabelFromCookies(c *gin.Context) string { - return VipDisplayLabel(ShowCardNameFromCookies(c), VipTypeFromCookies(c)) -} - -// IsActiveVipUser 根据 vipType + currentVipExpire 判断是否有效会员。 -func IsActiveVipUser(vipType int, currentVipExpire string) bool { - if vipType == 0 { - return false - } - expireMs := parseVipExpireMs(currentVipExpire) - if expireMs <= 0 { - return false - } - return expireMs > time.Now().UnixMilli() -} - -// FormatVipExpireText 格式化到期时间展示。 -func FormatVipExpireText(currentVipExpire string) string { - ms := parseVipExpireMs(currentVipExpire) - if ms <= 0 { - return "" - } - return time.UnixMilli(ms).In(time.Local).Format("有效期至 2006/01/02") -} - -// VipExpireTextFromCookies 格式化到期时间展示。 -func VipExpireTextFromCookies(c *gin.Context) string { - if c == nil { - return "" - } - return FormatVipExpireText(cookieValue(c, "currentVipExpire")) -} - -// IsActiveVipFromCookies vipType≠0 且 currentVipExpire 未过期(与 91ly 一致)。 -func IsActiveVipFromCookies(c *gin.Context) bool { - if c == nil { - return false - } - return IsActiveVipUser(VipTypeFromCookies(c), cookieValue(c, "currentVipExpire")) -} - -// RechargeFromCookies 读取 cookie recharge(金币余额)。 -func RechargeFromCookies(c *gin.Context) int64 { - if c == nil { - return 0 - } - n, _ := strconv.ParseInt(strings.TrimSpace(cookieValue(c, "recharge")), 10, 64) - if n < 0 { - return 0 - } - return n -} - -// SetRechargeCookie 更新金币余额 cookie(解锁/充值后同步)。 -func SetRechargeCookie(c *gin.Context, balance int64) { - if c == nil { - return - } - if balance < 0 { - balance = 0 - } - secure := c.Request != nil && c.Request.TLS != nil - setCookie(c, "recharge", strconv.FormatInt(balance, 10), secure) -} - -// FormatRecharge 金币余额千分位展示。 -func FormatRecharge(n int64) string { - if n < 0 { - n = 0 - } - s := strconv.FormatInt(n, 10) - if len(s) <= 3 { - return s - } - var b strings.Builder - rem := len(s) % 3 - if rem > 0 { - b.WriteString(s[:rem]) - if len(s) > rem { - b.WriteByte(',') - } - } - for i := rem; i < len(s); i += 3 { - b.WriteString(s[i : i+3]) - if i+3 < len(s) { - b.WriteByte(',') - } - } - return b.String() -} diff --git a/app/service/commentser/like.go b/app/service/commentser/like.go deleted file mode 100644 index 7f58280..0000000 --- a/app/service/commentser/like.go +++ /dev/null @@ -1,22 +0,0 @@ -package commentser - -import ( - "fmt" - "videoweb/app/service/upstream" - - "github.com/gin-gonic/gin" -) - -const likeSetPath = "/api/app/comment/like/set" - -// LikeSet 设置评论点赞/取消点赞。 -func LikeSet(c *gin.Context, req CommentLikeSetReq) (*APIEnvelope[CommentLikeSetResp], error) { - if req.CommentID <= 0 { - return nil, fmt.Errorf("comment like invalid commentId") - } - var env APIEnvelope[CommentLikeSetResp] - if _, err := upstream.PostJSON(c, likeSetPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/commentser/send.go b/app/service/commentser/send.go deleted file mode 100644 index 7142f06..0000000 --- a/app/service/commentser/send.go +++ /dev/null @@ -1,45 +0,0 @@ -package commentser - -import ( - "fmt" - "strings" - "unicode/utf8" - "videoweb/app/service/upstream" - - "github.com/gin-gonic/gin" -) - -const sendPath = "/api/app/comment/send" - -// Send 发布评论(一级 / 二级)。 -func Send(c *gin.Context, req CommentSendReq) (*APIEnvelope[any], error) { - req.Text = strings.TrimSpace(req.Text) - if req.ObjectID <= 0 { - return nil, fmt.Errorf("comment send invalid objectId") - } - if req.ObjectType != ObjectTypeChapter { - req.ObjectType = ObjectTypePlaylet - } - if req.Text == "" { - return nil, fmt.Errorf("comment send empty text") - } - if utf8.RuneCountInString(req.Text) > 200 { - return nil, fmt.Errorf("comment send text too long") - } - if req.ParentsID < 0 { - req.ParentsID = 0 - } - if req.ReplyCommentID < 0 { - req.ReplyCommentID = 0 - } - // 二级评论:未显式指定 replyCommentId 时默认回复父评论 - if req.ParentsID > 0 && req.ReplyCommentID <= 0 { - req.ReplyCommentID = req.ParentsID - } - - var env APIEnvelope[any] - if _, err := upstream.PostJSON(c, sendPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/configser/tracker.go b/app/service/configser/tracker.go deleted file mode 100644 index 87c7bfb..0000000 --- a/app/service/configser/tracker.go +++ /dev/null @@ -1,29 +0,0 @@ -package configser - -import ( - "strings" - "videoweb/app/appg" - "videoweb/pub/pubdef" -) - -// ResolveTrackerAppID 优先 yaml,否则固定 JHA-1043。 -func ResolveTrackerAppID() string { - if id := strings.TrimSpace(appg.Conf.Tracker.AppID); id != "" { - return id - } - return pubdef.TrackerAppId() -} - -// ResolveReportSDKConfig 上游 reportSdkConfig 优先,本地 yaml 兜底。 -func ResolveReportSDKConfig(fromAPI string) string { - if v := strings.TrimSpace(fromAPI); v != "" { - return v - } - return strings.TrimSpace(appg.Conf.Tracker.EncryptedConfig) -} - -// ApplyTrackerFallback 补齐 AppConfigVM 中的上报密文。 -func ApplyTrackerFallback(vm AppConfigVM) AppConfigVM { - vm.ReportSDKConfig = ResolveReportSDKConfig(vm.ReportSDKConfig) - return vm -} diff --git a/app/service/configser/types.go b/app/service/configser/types.go index 293542d..8796101 100644 --- a/app/service/configser/types.go +++ b/app/service/configser/types.go @@ -52,16 +52,14 @@ type FooterContact struct { // ConfigInfoResp 对应 swagger proto.ConfigInfoResp // GET /api/app/config/info -// reportSdkConfig 与 proto.ConfigInfo 对齐;上游若尚未下发则为空,可由本地 yaml 兜底。 // config 为上游实际下发的完整站点配置(swagger 未完整声明,但含 potaoGroup 等字段)。 type ConfigInfoResp struct { - NewAddressInfo NewAddressInfo `json:"newAddressInfo"` - Config ConfigInfo `json:"config"` - Advitise AdvitiseData `json:"advitise"` - SeoInfo SeoInfo `json:"seoInfo"` - SeoNavInfo SeoNavInfo `json:"seoNavInfo"` - NavPageList []NavPageItem `json:"navPageList"` - ReportSDKConfig string `json:"reportSdkConfig"` + NewAddressInfo NewAddressInfo `json:"newAddressInfo"` + Config ConfigInfo `json:"config"` + Advitise AdvitiseData `json:"advitise"` + SeoInfo SeoInfo `json:"seoInfo"` + SeoNavInfo SeoNavInfo `json:"seoNavInfo"` + NavPageList []NavPageItem `json:"navPageList"` } // ConfigInfo 对应上游 data.config(proto.ConfigInfo 子集,按页面需要取用)。 diff --git a/app/service/configser/view.go b/app/service/configser/view.go index b3fcbb7..7d75eeb 100644 --- a/app/service/configser/view.go +++ b/app/service/configser/view.go @@ -24,7 +24,6 @@ type AppConfigVM struct { SeoInfo SeoInfo `json:"seoInfo,omitempty"` SeoNavInfo SeoNavInfo `json:"seoNavInfo,omitempty"` NavPageList []NavPageItem `json:"navPageList,omitempty"` - ReportSDKConfig string `json:"reportSdkConfig,omitempty"` Advitise AdvitiseData `json:"advitise"` DetailTopList []Advertisement `json:"detailTopList,omitempty"` NineGridList []Advertisement `json:"nineGridList,omitempty"` @@ -54,7 +53,6 @@ func BuildAppConfigVM(info *ConfigInfoResp) AppConfigVM { OfficialAppAddr: sanitizeURL(addr.OfficialAppAddr), PDFAddr: sanitizeURL(addr.PDFAddr), TwitterAddr: sanitizeURL(addr.TwitterAddr), - ReportSDKConfig: strings.TrimSpace(info.ReportSDKConfig), NavPageList: buildNavPageList(info.NavPageList), Advitise: info.Advitise, DetailTopList: buildAdvertisementList(info.Advitise.DetailTopList), diff --git a/app/service/playletser/chapter.go b/app/service/playletser/chapter.go index cf47424..256c5be 100644 --- a/app/service/playletser/chapter.go +++ b/app/service/playletser/chapter.go @@ -139,20 +139,6 @@ func (c *PlayletChapterInfoResp) AllowWatch() bool { return strings.TrimSpace(c.VideoURL) != "" && c.PayType == 0 } -// UnlockCost 金币解锁消耗:优先 costCoins。 -func (c *PlayletChapterInfoResp) UnlockCost() int64 { - if c == nil { - return 0 - } - if c.CostCoins > 0 { - return c.CostCoins - } - if c.SingleCoins > 0 { - return int64(c.SingleCoins) - } - return 0 -} - // AllowWatch 详情选集是否可直达播放(优先 canWatch)。 func (c PlayletChapterData) AllowWatch() bool { if c.CanWatch { @@ -166,33 +152,3 @@ func (c PlayletChapterData) AllowWatch() bool { } return c.PayType == 0 } - -// NeedCoinGate 是否弹出金币解锁。 -func (c PlayletChapterData) NeedCoinGate() bool { - if c.AllowWatch() { - return false - } - if c.NeedUnlock { - return true - } - return c.PayType == 1 -} - -// NeedVipGate 是否弹出 VIP 开通。 -func (c PlayletChapterData) NeedVipGate() bool { - if c.AllowWatch() || c.NeedCoinGate() { - return false - } - if c.NeedVip { - return true - } - return c.PayType == 2 -} - -// UnlockCost 金币解锁消耗:优先 costCoins。 -func (c PlayletChapterData) UnlockCost() int { - if c.CostCoins > 0 { - return int(c.CostCoins) - } - return c.SingleCoins -} diff --git a/app/service/playletser/chapter_collect.go b/app/service/playletser/chapter_collect.go deleted file mode 100644 index 28681ef..0000000 --- a/app/service/playletser/chapter_collect.go +++ /dev/null @@ -1,84 +0,0 @@ -package playletser - -import ( - "fmt" - "net/url" - "strconv" - "videoweb/app/service/authser" - "videoweb/app/service/upstream" - "videoweb/pub/common/log" - - "github.com/gin-gonic/gin" -) - -const chapterCollectListPath = "/api/app/playlet/chapter/collect/list" - -// PlayletChapterCollectData 对应 swagger proto.PlayletChapterCollectData -type PlayletChapterCollectData struct { - ChapterID int64 `json:"chapterId"` - ChapterTitle string `json:"chapterTitle"` - PlayletID int64 `json:"playletId"` - PlayletSlug string `json:"playletSlug"` - PlayletTitle string `json:"playletTitle"` - PlayletCover string `json:"playletCover"` - CurrentEpisode int `json:"currentEpisode"` - TotalEpisode int `json:"totalEpisode"` - UpdateStatus int `json:"updateStatus"` - CountBrowse int64 `json:"countBrowse"` - CountCollect int64 `json:"countCollect"` - CountLike int64 `json:"countLike"` - IsCollect int `json:"isCollect"` - CollectedAt string `json:"collectedAt"` - MediaTime int `json:"mediaTime"` - PayType int `json:"payType"` - SingleCoins int `json:"singleCoins"` - VideoURL string `json:"videoUrl"` -} - -// PlayletChapterCollectListResp 对应 swagger proto.PlayletChapterCollectListResp -type PlayletChapterCollectListResp struct { - List []PlayletChapterCollectData `json:"list"` - PageNum int `json:"pageNum"` - PageSize int `json:"pageSize"` - TotalCount int64 `json:"totalCount"` -} - -// FetchChapterCollectList 拉取当前用户剧集收藏列表。 -// 第二个返回值为上游业务 code(网络错误时为 0)。 -func FetchChapterCollectList(c *gin.Context, q CollectListQuery) (*PlayletChapterCollectListResp, int, error) { - q.Normalize() - params := url.Values{} - params.Set("pageNum", strconv.Itoa(q.PageNum)) - params.Set("pageSize", strconv.Itoa(q.PageSize)) - - var env APIEnvelope[PlayletChapterCollectListResp] - if err := upstream.GetJSON(c, chapterCollectListPath+"?"+params.Encode(), &env); err != nil { - return nil, 0, err - } - if env.Code != 200 { - return nil, env.Code, fmt.Errorf("playlet chapter collect list code=%d msg=%s", env.Code, env.Msg) - } - return &env.Data, env.Code, nil -} - -// FetchChapterCollectListOrEmpty 失败时返回空列表;游客会话失效时尝试重登后重试一次。 -func FetchChapterCollectListOrEmpty(c *gin.Context, q CollectListQuery) *PlayletChapterCollectListResp { - data, code, err := FetchChapterCollectList(c, q) - if err == nil { - if data == nil { - return &PlayletChapterCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - return data - } - if retry, _ := authser.OnSessionExpired(c, code); retry { - data, _, err = FetchChapterCollectList(c, q) - if err == nil { - if data == nil { - return &PlayletChapterCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - return data - } - } - log.Error("fetch playlet chapter collect list failed", log.E(err)) - return &PlayletChapterCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} -} diff --git a/app/service/playletser/chapter_like.go b/app/service/playletser/chapter_like.go deleted file mode 100644 index 3d20ee5..0000000 --- a/app/service/playletser/chapter_like.go +++ /dev/null @@ -1,63 +0,0 @@ -package playletser - -import ( - "fmt" - "videoweb/app/service/upstream" - - "github.com/gin-gonic/gin" -) - -const ( - chapterLikeSetPath = "/api/app/playlet/chapter/like/set" - chapterCollectSetPath = "/api/app/playlet/chapter/collect/set" -) - -// PlayletChapterLikeSetReq 对应 swagger proto.PlayletChapterLikeSetReq -type PlayletChapterLikeSetReq struct { - ChapterID int64 `json:"chapterId"` - IsLike bool `json:"isLike"` -} - -// PlayletChapterLikeSetResp 对应 swagger proto.PlayletChapterLikeSetResp -type PlayletChapterLikeSetResp struct { - ChapterID int64 `json:"chapterId"` - CountLike int64 `json:"countLike"` - IsLike int `json:"isLike"` -} - -// ChapterLikeSet 设置剧集点赞/取消点赞。 -func ChapterLikeSet(c *gin.Context, req PlayletChapterLikeSetReq) (*APIEnvelope[PlayletChapterLikeSetResp], error) { - if req.ChapterID <= 0 { - return nil, fmt.Errorf("chapter like invalid chapterId") - } - var env APIEnvelope[PlayletChapterLikeSetResp] - if _, err := upstream.PostJSON(c, chapterLikeSetPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} - -// PlayletChapterCollectSetReq 对应 swagger proto.PlayletChapterCollectSetReq -type PlayletChapterCollectSetReq struct { - ChapterID int64 `json:"chapterId"` - IsCollect bool `json:"isCollect"` -} - -// PlayletChapterCollectSetResp 对应 swagger proto.PlayletChapterCollectSetResp -type PlayletChapterCollectSetResp struct { - ChapterID int64 `json:"chapterId"` - CountCollect int64 `json:"countCollect"` - IsCollect int `json:"isCollect"` -} - -// ChapterCollectSet 设置剧集收藏/取消收藏。 -func ChapterCollectSet(c *gin.Context, req PlayletChapterCollectSetReq) (*APIEnvelope[PlayletChapterCollectSetResp], error) { - if req.ChapterID <= 0 { - return nil, fmt.Errorf("chapter collect invalid chapterId") - } - var env APIEnvelope[PlayletChapterCollectSetResp] - if _, err := upstream.PostJSON(c, chapterCollectSetPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/playletser/chapter_unlock.go b/app/service/playletser/chapter_unlock.go deleted file mode 100644 index 6f62c67..0000000 --- a/app/service/playletser/chapter_unlock.go +++ /dev/null @@ -1,40 +0,0 @@ -package playletser - -import ( - "fmt" - "videoweb/app/service/upstream" - - "github.com/gin-gonic/gin" -) - -const chapterUnlockPath = "/api/app/playlet/chapter/unlock" - -// PlayletChapterUnlockReq 对应 swagger proto.PlayletChapterUnlockReq -// POST /api/app/playlet/chapter/unlock -type PlayletChapterUnlockReq struct { - ChapterID int64 `json:"chapterId"` - PlayletID int64 `json:"playletId"` -} - -// PlayletChapterUnlockResp 对应 swagger proto.PlayletChapterUnlockResp -type PlayletChapterUnlockResp struct { - Balance int64 `json:"balance"` - CanWatch bool `json:"canWatch"` - ChangeCoin int64 `json:"changeCoin"` - ChapterID int64 `json:"chapterId"` - CostCoins int64 `json:"costCoins"` - PlayletID int64 `json:"playletId"` - Unlocked bool `json:"unlocked"` -} - -// ChapterUnlock 使用金币解锁剧集(幂等)。 -func ChapterUnlock(c *gin.Context, req PlayletChapterUnlockReq) (*APIEnvelope[PlayletChapterUnlockResp], error) { - if req.ChapterID <= 0 || req.PlayletID <= 0 { - return nil, fmt.Errorf("chapter unlock invalid chapterId/playletId") - } - var env APIEnvelope[PlayletChapterUnlockResp] - if _, err := upstream.PostJSON(c, chapterUnlockPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/playletser/chapter_watch.go b/app/service/playletser/chapter_watch.go deleted file mode 100644 index 2fd6c1f..0000000 --- a/app/service/playletser/chapter_watch.go +++ /dev/null @@ -1,39 +0,0 @@ -package playletser - -import ( - "fmt" - "videoweb/app/service/upstream" - - "github.com/gin-gonic/gin" -) - -const chapterWatchReportPath = "/api/app/playlet/chapter/watch/report" - -// PlayletChapterWatchReportReq 对应 swagger proto.PlayletChapterWatchReportReq -type PlayletChapterWatchReportReq struct { - ChapterID int64 `json:"chapterId"` - PlayletID int64 `json:"playletId,omitempty"` -} - -// PlayletChapterWatchReportResp 对应 swagger proto.PlayletChapterWatchReportResp -type PlayletChapterWatchReportResp struct { - ChapterID int64 `json:"chapterId"` - PlayletID int64 `json:"playletId"` - CurrentEpisode int `json:"currentEpisode"` - LastChapterID int64 `json:"lastChapterId"` - LastEpisode int `json:"lastEpisode"` - WatchedCount int `json:"watchedCount"` - UnwatchedCount int `json:"unwatchedCount"` -} - -// ChapterWatchReport 上报短剧剧集观看。 -func ChapterWatchReport(c *gin.Context, req PlayletChapterWatchReportReq) (*APIEnvelope[PlayletChapterWatchReportResp], error) { - if req.ChapterID <= 0 { - return nil, fmt.Errorf("chapter watch report invalid chapterId") - } - var env APIEnvelope[PlayletChapterWatchReportResp] - if _, err := upstream.PostJSON(c, chapterWatchReportPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/playletser/collect.go b/app/service/playletser/collect.go deleted file mode 100644 index 890002e..0000000 --- a/app/service/playletser/collect.go +++ /dev/null @@ -1,155 +0,0 @@ -package playletser - -import ( - "fmt" - "net/url" - "strconv" - "strings" - "videoweb/app/service/authser" - "videoweb/app/service/upstream" - "videoweb/pub/common/log" - - "github.com/gin-gonic/gin" -) - -const ( - collectSetPath = "/api/app/playlet/collect/set" - collectListPath = "/api/app/playlet/collect/list" - defaultCollectPageSize = 40 - - CollectTypePlaylet = "playlet" - CollectTypeChapter = "chapter" -) - -// PlayletCollectSetReq 对应 swagger proto.PlayletCollectSetReq -type PlayletCollectSetReq struct { - ID int64 `json:"id"` - IsCollect bool `json:"isCollect"` -} - -// PlayletCollectSetResp 对应 swagger proto.PlayletCollectSetResp -type PlayletCollectSetResp struct { - ID int64 `json:"id"` - CountCollect int64 `json:"countCollect"` - IsCollect int `json:"isCollect"` -} - -// PlayletCollectData 对应 swagger proto.PlayletCollectData -type PlayletCollectData struct { - ID int64 `json:"id"` - Title string `json:"title"` - Slug string `json:"slug"` - Cover string `json:"cover"` - Desc string `json:"desc"` - TagIDs []int64 `json:"tagIds"` - TagNames []string `json:"tagNames"` - TagSlugs []string `json:"tagSlugs"` - ThemeIDs []int64 `json:"themeIds"` - ThemeNames []string `json:"themeNames"` - ThemeSlugs []string `json:"themeSlugs"` - TotalEpisode int `json:"totalEpisode"` - UpdateStatus int `json:"updateStatus"` - CountBrowse int64 `json:"countBrowse"` - CountCollect int64 `json:"countCollect"` - CountLike int64 `json:"countLike"` - IsFeatured bool `json:"isFeatured"` - IsNew bool `json:"isNew"` - IsRecommend bool `json:"isRecommend"` - IsCollect int `json:"isCollect"` - CollectedAt string `json:"collectedAt"` - WatchedCount int `json:"watchedCount"` - UnwatchedCount int `json:"unwatchedCount"` - LastChapterID int64 `json:"lastChapterId"` - LastEpisode int `json:"lastEpisode"` -} - -// PlayletCollectListResp 对应 swagger proto.PlayletCollectListResp -type PlayletCollectListResp struct { - List []PlayletCollectData `json:"list"` - PageNum int `json:"pageNum"` - PageSize int `json:"pageSize"` - TotalCount int64 `json:"totalCount"` -} - -// CollectListQuery 收藏列表分页参数。 -type CollectListQuery struct { - PageNum int - PageSize int - Type string // playlet | chapter -} - -// NormalizeCollectType 归一化收藏类型。 -func NormalizeCollectType(raw string) string { - switch strings.TrimSpace(strings.ToLower(raw)) { - case CollectTypeChapter, "2", "episode", "ep": - return CollectTypeChapter - default: - return CollectTypePlaylet - } -} - -// Normalize 校正分页默认值。 -func (q *CollectListQuery) Normalize() { - if q.PageNum <= 0 { - q.PageNum = 1 - } - if q.PageSize <= 0 { - q.PageSize = defaultCollectPageSize - } - if q.PageSize > 50 { - q.PageSize = 50 - } - q.Type = NormalizeCollectType(q.Type) -} - -// CollectSet 设置短剧收藏/取消收藏。 -func CollectSet(c *gin.Context, req PlayletCollectSetReq) (*APIEnvelope[PlayletCollectSetResp], error) { - if req.ID <= 0 { - return nil, fmt.Errorf("playlet collect invalid id") - } - var env APIEnvelope[PlayletCollectSetResp] - if _, err := upstream.PostJSON(c, collectSetPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} - -// FetchCollectList 拉取当前用户短剧收藏列表。 -// 第二个返回值为上游业务 code(网络错误时为 0)。 -func FetchCollectList(c *gin.Context, q CollectListQuery) (*PlayletCollectListResp, int, error) { - q.Normalize() - params := url.Values{} - params.Set("pageNum", strconv.Itoa(q.PageNum)) - params.Set("pageSize", strconv.Itoa(q.PageSize)) - - var env APIEnvelope[PlayletCollectListResp] - if err := upstream.GetJSON(c, collectListPath+"?"+params.Encode(), &env); err != nil { - return nil, 0, err - } - if env.Code != 200 { - return nil, env.Code, fmt.Errorf("playlet collect list code=%d msg=%s", env.Code, env.Msg) - } - return &env.Data, env.Code, nil -} - -// FetchCollectListOrEmpty 失败时返回空列表;游客会话失效时尝试重登后重试一次。 -func FetchCollectListOrEmpty(c *gin.Context, q CollectListQuery) *PlayletCollectListResp { - data, code, err := FetchCollectList(c, q) - if err == nil { - if data == nil { - return &PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - return data - } - if retry, _ := authser.OnSessionExpired(c, code); retry { - data, _, err = FetchCollectList(c, q) - if err == nil { - if data == nil { - return &PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - return data - } - } - log.Error("fetch playlet collect list failed", log.E(err)) - return &PlayletCollectListResp{PageNum: q.PageNum, PageSize: q.PageSize} -} diff --git a/app/service/playletser/collect_view.go b/app/service/playletser/collect_view.go deleted file mode 100644 index 1fe9fbd..0000000 --- a/app/service/playletser/collect_view.go +++ /dev/null @@ -1,89 +0,0 @@ -package playletser - -import ( - "fmt" - "net/url" - "strconv" - "strings" -) - -func collectPageURL(pageNum int, collectType string) string { - collectType = NormalizeCollectType(collectType) - path := "/collect" - if collectType != CollectTypePlaylet { - path += "/" + url.PathEscape(collectType) - } - if pageNum > 1 { - path += "/page/" + strconv.Itoa(pageNum) - } - return path + "/" -} - -func CollectCanonicalPath(q CollectListQuery) string { - q.Normalize() - return collectPageURL(q.PageNum, q.Type) -} - -// BuildCollectPagination 收藏列表分页。 -func BuildCollectPagination(q CollectListQuery, totalCount int64) PaginationVM { - q.Normalize() - return BuildPagination(func(p int) string { - return collectPageURL(p, q.Type) - }, q.PageNum, q.PageSize, totalCount) -} - -// ParseCollectListQuery 从 query 解析分页与类型(playlet 短剧 / chapter 剧集)。 -func ParseCollectListQuery(pageStr, typeStr string) CollectListQuery { - q := CollectListQuery{ - PageSize: defaultCollectPageSize, - Type: NormalizeCollectType(typeStr), - } - if n, err := strconv.Atoi(strings.TrimSpace(pageStr)); err == nil { - q.PageNum = n - } - q.Normalize() - return q -} - -// collectProgressText 进度文案:优先最近观看集,其次未看/已看完。 -func collectProgressText(item PlayletCollectData) string { - if item.LastEpisode > 0 { - return fmt.Sprintf("第%d集", item.LastEpisode) - } - if item.TotalEpisode > 0 && item.UnwatchedCount <= 0 { - return "已看完" - } - if item.UnwatchedCount > 0 { - return fmt.Sprintf("%d集未看", item.UnwatchedCount) - } - return "" -} - -// collectTagText 收藏卡片标签:仅展示 TagNames 第一项,无标签时不显示。 -func collectTagText(item PlayletCollectData) string { - return firstName(item.TagNames) -} - -// chapterCollectEpisodeLabel 剧集收藏角标:总集数。 -func chapterCollectEpisodeLabel(item PlayletChapterCollectData) string { - return episodeText(item.TotalEpisode) -} - -// chapterCollectDesc 剧集收藏副标题。 -func chapterCollectDesc(item PlayletChapterCollectData) string { - if t := strings.TrimSpace(item.ChapterTitle); t != "" { - return t - } - if item.CurrentEpisode > 0 { - return fmt.Sprintf("第%d集", item.CurrentEpisode) - } - return "" -} - -// chapterCollectMeta 剧集收藏右侧文案:第 N 集。 -func chapterCollectMeta(item PlayletChapterCollectData) string { - if item.CurrentEpisode > 0 { - return fmt.Sprintf("第%d集", item.CurrentEpisode) - } - return updateStatusText(item.UpdateStatus) -} diff --git a/app/service/playletser/history.go b/app/service/playletser/history.go deleted file mode 100644 index 35e8ff9..0000000 --- a/app/service/playletser/history.go +++ /dev/null @@ -1,139 +0,0 @@ -package playletser - -import ( - "fmt" - "net/url" - "strconv" - "videoweb/app/service/authser" - "videoweb/app/service/upstream" - "videoweb/pub/common/log" - - "github.com/gin-gonic/gin" -) - -const ( - historyListPath = "/api/app/playlet/history/list" - historyClearPath = "/api/app/playlet/history/clear" - defaultHistoryPageSize = 40 -) - -// PlayletHistoryData 对应 swagger proto.PlayletHistoryData -// GET /api/app/playlet/history/list -type PlayletHistoryData struct { - ID int64 `json:"id"` - Status int `json:"status"` - IsFeatured bool `json:"isFeatured"` - IsNew bool `json:"isNew"` - IsRecommend bool `json:"isRecommend"` - ShowOnBanner bool `json:"showOnBanner"` - Banner string `json:"banner"` - OnlineAt string `json:"onlineAt"` - MediaCreatedAt string `json:"mediaCreatedAt"` - MediaUpdatedAt string `json:"mediaUpdatedAt"` - ThemeIDs []int64 `json:"themeIds"` - ThemeNames []string `json:"themeNames"` - ThemeSlugs []string `json:"themeSlugs"` - Title string `json:"title"` - Slug string `json:"slug"` - Desc string `json:"desc"` - Anchor string `json:"anchor"` - Cover string `json:"cover"` - TagIDs []int64 `json:"tagIds"` - TagNames []string `json:"tagNames"` - TagSlugs []string `json:"tagSlugs"` - TotalEpisode int `json:"totalEpisode"` - UpdateStatus int `json:"updateStatus"` - CountBrowse int64 `json:"countBrowse"` - CountCollect int64 `json:"countCollect"` - CountLike int64 `json:"countLike"` - CreatedAt string `json:"createdAt"` - UpdatedAt string `json:"updatedAt"` - WatchedCount int `json:"watchedCount"` - UnwatchedCount int `json:"unwatchedCount"` - LastChapterID int64 `json:"lastChapterId"` - LastEpisode int `json:"lastEpisode"` - IsFinished bool `json:"isFinished"` - HistoryAt string `json:"historyAt"` -} - -// PlayletHistoryListResp 对应 swagger proto.PlayletHistoryListResp -type PlayletHistoryListResp struct { - List []PlayletHistoryData `json:"list"` - PageNum int `json:"pageNum"` - PageSize int `json:"pageSize"` - TotalCount int64 `json:"totalCount"` -} - -// PlayletHistoryClearResp 对应 swagger proto.PlayletHistoryClearResp -type PlayletHistoryClearResp struct { - DeletedCount int `json:"deletedCount"` -} - -// HistoryListQuery 观看历史分页参数。 -type HistoryListQuery struct { - PageNum int - PageSize int -} - -// Normalize 校正分页默认值。 -func (q *HistoryListQuery) Normalize() { - if q.PageNum <= 0 { - q.PageNum = 1 - } - if q.PageSize <= 0 { - q.PageSize = defaultHistoryPageSize - } - if q.PageSize > 100 { - q.PageSize = 100 - } -} - -// FetchHistoryList 分页查询当前用户观看历史。 -// 第二个返回值为上游业务 code(网络错误时为 0)。 -func FetchHistoryList(c *gin.Context, q HistoryListQuery) (*PlayletHistoryListResp, int, error) { - q.Normalize() - params := url.Values{} - params.Set("pageNum", strconv.Itoa(q.PageNum)) - params.Set("pageSize", strconv.Itoa(q.PageSize)) - - var env APIEnvelope[PlayletHistoryListResp] - if err := upstream.GetJSON(c, historyListPath+"?"+params.Encode(), &env); err != nil { - return nil, 0, err - } - if env.Code != 200 { - return nil, env.Code, fmt.Errorf("playlet history list code=%d msg=%s", env.Code, env.Msg) - } - return &env.Data, env.Code, nil -} - -// FetchHistoryListOrEmpty 失败时返回空列表;游客会话失效时尝试重登后重试一次。 -func FetchHistoryListOrEmpty(c *gin.Context, q HistoryListQuery) *PlayletHistoryListResp { - data, code, err := FetchHistoryList(c, q) - if err == nil { - if data == nil { - return &PlayletHistoryListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - return data - } - if retry, _ := authser.OnSessionExpired(c, code); retry { - data, _, err = FetchHistoryList(c, q) - if err == nil { - if data == nil { - return &PlayletHistoryListResp{PageNum: q.PageNum, PageSize: q.PageSize} - } - return data - } - } - log.Error("fetch playlet history list failed", log.E(err)) - return &PlayletHistoryListResp{PageNum: q.PageNum, PageSize: q.PageSize} -} - -// HistoryClear 清空当前用户观看历史。 -// POST /api/app/playlet/history/clear,无请求体。 -func HistoryClear(c *gin.Context) (*APIEnvelope[PlayletHistoryClearResp], error) { - var env APIEnvelope[PlayletHistoryClearResp] - if _, err := upstream.PostJSON(c, historyClearPath, nil, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/playletser/history_view.go b/app/service/playletser/history_view.go deleted file mode 100644 index 6290415..0000000 --- a/app/service/playletser/history_view.go +++ /dev/null @@ -1,147 +0,0 @@ -package playletser - -import ( - "fmt" - "strconv" - "strings" - "time" -) - -func historyPageURL(pageNum int) string { - if pageNum <= 1 { - return "/history/" - } - return "/history/page/" + strconv.Itoa(pageNum) + "/" -} - -func HistoryCanonicalPath(q HistoryListQuery) string { - q.Normalize() - return historyPageURL(q.PageNum) -} - -// BuildHistoryPagination 观看历史分页。 -func BuildHistoryPagination(q HistoryListQuery, totalCount int64) PaginationVM { - q.Normalize() - return BuildPagination(func(p int) string { - return historyPageURL(p) - }, q.PageNum, q.PageSize, totalCount) -} - -// ParseHistoryListQuery 从 query 解析分页。 -func ParseHistoryListQuery(pageStr string) HistoryListQuery { - q := HistoryListQuery{PageSize: defaultHistoryPageSize} - if n, err := strconv.Atoi(strings.TrimSpace(pageStr)); err == nil { - q.PageNum = n - } - q.Normalize() - return q -} - -func historyFinished(item PlayletHistoryData) bool { - if item.IsFinished { - return true - } - return item.TotalEpisode > 0 && item.UnwatchedCount <= 0 && item.WatchedCount > 0 -} - -// historyStatus 卡片筛选状态:finished / unfinished。 -func historyStatus(item PlayletHistoryData) string { - if historyFinished(item) { - return "finished" - } - return "unfinished" -} - -// historyProgressText PC 卡片未看文案,使用接口 unwatchedCount / isFinished。 -func historyProgressText(item PlayletHistoryData) string { - if historyFinished(item) { - return "已看完" - } - if item.UnwatchedCount > 0 { - return fmt.Sprintf("%d集未看", item.UnwatchedCount) - } - if item.LastEpisode > 0 { - return fmt.Sprintf("看到第%d集", item.LastEpisode) - } - return "未看完" -} - -// historyWatchLine H5 进度行。 -func historyWatchLine(item PlayletHistoryData) string { - if historyFinished(item) { - if item.LastEpisode > 0 { - return fmt.Sprintf("第%d集 · 已看完", item.LastEpisode) - } - return "已看完" - } - ep := "未开始" - if item.LastEpisode > 0 { - ep = fmt.Sprintf("第%d集", item.LastEpisode) - } - if item.UnwatchedCount > 0 { - return ep + fmt.Sprintf(" · 还有%d集未看", item.UnwatchedCount) - } - return ep + " · 未看完" -} - -// historyTagText 历史卡片标签:仅展示 TagNames 第一项,无标签时不显示。 -func historyTagText(item PlayletHistoryData) string { - return firstName(item.TagNames) -} - -// historyPlayURL 继续播放:优先最近观看剧集。 -func historyPlayURL(item PlayletHistoryData) string { - return chapterPlayURL(item.Slug, item.ID, item.LastChapterID) -} - -// formatHistoryAt 最近观看时间展示。 -func formatHistoryAt(raw string) string { - raw = strings.TrimSpace(raw) - if raw == "" { - return "" - } - t, ok := parseHistoryTime(raw) - if !ok { - return raw - } - now := time.Now() - startToday := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) - startThat := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) - dayDiff := int(startToday.Sub(startThat).Hours() / 24) - hm := t.Format("15:04") - switch { - case dayDiff <= 0: - return "今天 " + hm - case dayDiff == 1: - return "昨天 " + hm - case dayDiff == 2: - return "前天 " + hm - case dayDiff < 7: - return fmt.Sprintf("%d天前 %s", dayDiff, hm) - case dayDiff < 14: - return "一周前 " + hm - default: - return t.Format("2006-01-02 15:04") - } -} - -func parseHistoryTime(raw string) (time.Time, bool) { - layouts := []string{ - time.RFC3339Nano, - time.RFC3339, - "2006-01-02 15:04:05", - "2006-01-02T15:04:05", - "2006-01-02T15:04:05Z07:00", - "2006-01-02 15:04:05.000", - "2006-01-02 15:04:05.999999999", - } - for _, layout := range layouts { - if t, err := time.ParseInLocation(layout, raw, time.Local); err == nil { - return t, true - } - if t, err := time.Parse(layout, raw); err == nil { - return t.In(time.Local), true - } - } - return time.Time{}, false -} diff --git a/app/service/playletser/like.go b/app/service/playletser/like.go deleted file mode 100644 index bf8e462..0000000 --- a/app/service/playletser/like.go +++ /dev/null @@ -1,35 +0,0 @@ -package playletser - -import ( - "fmt" - "videoweb/app/service/upstream" - - "github.com/gin-gonic/gin" -) - -const likeSetPath = "/api/app/playlet/like/set" - -// PlayletLikeSetReq 对应 swagger proto.PlayletLikeSetReq -type PlayletLikeSetReq struct { - ID int64 `json:"id"` - IsLike bool `json:"isLike"` -} - -// PlayletLikeSetResp 对应 swagger proto.PlayletLikeSetResp -type PlayletLikeSetResp struct { - ID int64 `json:"id"` - CountLike int64 `json:"countLike"` - IsLike int `json:"isLike"` -} - -// LikeSet 设置短剧点赞/取消点赞。 -func LikeSet(c *gin.Context, req PlayletLikeSetReq) (*APIEnvelope[PlayletLikeSetResp], error) { - if req.ID <= 0 { - return nil, fmt.Errorf("playlet like invalid id") - } - var env APIEnvelope[PlayletLikeSetResp] - if _, err := upstream.PostJSON(c, likeSetPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} diff --git a/app/service/playletser/tplfuncs.go b/app/service/playletser/tplfuncs.go index 2d69f52..85eb809 100644 --- a/app/service/playletser/tplfuncs.go +++ b/app/service/playletser/tplfuncs.go @@ -11,62 +11,50 @@ import ( // TemplateFuncs 模板辅助:仅做展示格式化 / URL,不把接口字段映射成另一套名字。 func TemplateFuncs() template.FuncMap { return template.FuncMap{ - "detailURL": detailURL, - "playURL": playURL, - "chapterPlayURL": chapterPlayURL, - "categoryURL": categoryURL, - "categoryDetailURL": categoryDetailURL, - "themeListURL": themeListURLByKey, - "coverURL": coverURL, - "formatHeat": formatHeat, - "formatCollect": formatCollectHeat, - "formatLikeCount": formatLikeCount, - "episodeLabel": episodeText, - "displayTag": displayTag, - "firstTagName": firstTagName, - "themeTagText": themeTagText, - "tagListURL": tagListURL, - "cardTag": cardTag, - "cardTags": cardTags, - "namedTags": namedTags, - "namedThemeTags": namedThemeTags, - "firstName": firstName, - "rankClass": rankClass, - "add": addInt, - "contains": strings.Contains, - "hasPrefix": strings.HasPrefix, - "footerLinkURL": footerLinkURL, - "footerLinkIsExternal": footerLinkIsExternal, - "footerContactURL": footerContactURL, - "footerContactName": footerContactName, - "footerContactValue": footerContactValue, - "navDisplayURL": navDisplayURL, - "urlquery": url.QueryEscape, - "pathescape": url.PathEscape, - "metaLine": metaLine, - "updateStatusText": updateStatusText, - "browseText": browseText, - "usableAnchor": usableAnchor, - "playletYearText": playletYearText, - "playletDateText": playletDateText, - "isPlayletAllFree": isPlayletAllFree, - "collectProgressText": collectProgressText, - "collectTagText": collectTagText, - "chapterCollectEpisodeLabel": chapterCollectEpisodeLabel, - "chapterCollectDesc": chapterCollectDesc, - "chapterCollectMeta": chapterCollectMeta, - "historyProgressText": historyProgressText, - "historyWatchLine": historyWatchLine, - "historyTagText": historyTagText, - "historyPlayURL": historyPlayURL, - "historyStatus": historyStatus, - "formatHistoryAt": formatHistoryAt, - "formatShortDateTime": formatShortDateTime, - "absInt64": absInt64Tpl, - "absURL": absURLTpl, - "canonicalOr": canonicalOr, - "joinStrings": joinStrings, - "dict": dict, + "detailURL": detailURL, + "playURL": playURL, + "chapterPlayURL": chapterPlayURL, + "categoryURL": categoryURL, + "categoryDetailURL": categoryDetailURL, + "themeListURL": themeListURLByKey, + "coverURL": coverURL, + "formatHeat": formatHeat, + "formatCollect": formatCollectHeat, + "formatLikeCount": formatLikeCount, + "episodeLabel": episodeText, + "displayTag": displayTag, + "firstTagName": firstTagName, + "themeTagText": themeTagText, + "tagListURL": tagListURL, + "cardTag": cardTag, + "cardTags": cardTags, + "namedTags": namedTags, + "namedThemeTags": namedThemeTags, + "firstName": firstName, + "rankClass": rankClass, + "add": addInt, + "contains": strings.Contains, + "hasPrefix": strings.HasPrefix, + "footerLinkURL": footerLinkURL, + "footerLinkIsExternal": footerLinkIsExternal, + "footerContactURL": footerContactURL, + "footerContactName": footerContactName, + "footerContactValue": footerContactValue, + "navDisplayURL": navDisplayURL, + "urlquery": url.QueryEscape, + "pathescape": url.PathEscape, + "metaLine": metaLine, + "updateStatusText": updateStatusText, + "browseText": browseText, + "usableAnchor": usableAnchor, + "playletYearText": playletYearText, + "playletDateText": playletDateText, + "isPlayletAllFree": isPlayletAllFree, + "absInt64": absInt64Tpl, + "absURL": absURLTpl, + "canonicalOr": canonicalOr, + "joinStrings": joinStrings, + "dict": dict, } } @@ -315,25 +303,6 @@ func absInt64Tpl(n int64) int64 { return n } -func formatShortDateTime(raw string) string { - raw = strings.TrimSpace(raw) - if raw == "" || strings.HasPrefix(raw, "0001") { - return "" - } - raw = strings.ReplaceAll(raw, "T", " ") - if i := strings.Index(raw, "."); i > 0 { - raw = raw[:i] - } - if i := strings.IndexAny(raw, "Z+"); i > 10 { - raw = strings.TrimSpace(raw[:i]) - } - if len(raw) >= 16 { - raw = raw[:16] - } - raw = strings.ReplaceAll(raw, "-", "/") - return raw -} - func metaLine(item CommonData) string { cat := firstName(item.ThemeNames) if cat == "" { diff --git a/app/service/rechargeser/list.go b/app/service/rechargeser/list.go deleted file mode 100644 index 5010fd2..0000000 --- a/app/service/rechargeser/list.go +++ /dev/null @@ -1,212 +0,0 @@ -package rechargeser - -import ( - "encoding/json" - "fmt" - "strings" - "videoweb/app/service/authser" - "videoweb/app/service/upstream" - "videoweb/pub/common/log" - - "github.com/gin-gonic/gin" -) - -const ( - packageListPath = "/api/app/recharge/package/list" - coinBuyPath = "/api/app/coin/buy" - vipPayPath = "/api/app/vip/pay" - vipOrdersPath = "/api/app/vip/orders" - coinOrdersPath = "/api/app/coin/orders" - coinTransPath = "/api/app/coin/trans/list" -) - -// FetchPackageList 拉取购买套餐列表(会员 + 金币)。 -func FetchPackageList(c *gin.Context) (*RechargePackageListResp, error) { - var env APIEnvelope[RechargePackageListResp] - if err := upstream.GetJSON(c, packageListPath, &env); err != nil { - return nil, err - } - if env.Code != 200 { - return nil, fmt.Errorf("recharge package list code=%d msg=%s", env.Code, env.Msg) - } - return &env.Data, nil -} - -// FetchPackageListOrEmpty 失败时返回空列表,保证 SSR 可渲染。 -func FetchPackageListOrEmpty(c *gin.Context) *RechargePackageListResp { - data, err := FetchPackageList(c) - if err != nil { - log.Error("fetch recharge package list failed", log.E(err)) - return &RechargePackageListResp{} - } - if data == nil { - return &RechargePackageListResp{} - } - return data -} - -// BuyCoin 购买金币套餐:POST /api/app/coin/buy -func BuyCoin(c *gin.Context, req BuyPayReq) (*APIEnvelope[PayOrderResp], error) { - var env APIEnvelope[PayOrderResp] - if _, err := upstream.PostJSON(c, coinBuyPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} - -// VipPay 购买会员套餐:POST /api/app/vip/pay -func VipPay(c *gin.Context, req BuyPayReq) (*APIEnvelope[PayOrderResp], error) { - var env APIEnvelope[PayOrderResp] - if _, err := upstream.PostJSON(c, vipPayPath, req, &env); err != nil { - return nil, err - } - return &env, nil -} - -// NormalizePayMode 规范化支付方式。 -func NormalizePayMode(raw string) string { - v := strings.ToLower(strings.TrimSpace(raw)) - switch v { - case "wx", "weixin": - return "wechat" - case "unionpay": - return "union" - default: - return v - } -} - -// FetchVipOrders 查询 VIP 充值记录。 -func FetchVipOrders(c *gin.Context, page, pageSize int) ([]VipOrder, error) { - return fetchOrders(c, vipOrdersPath, page, pageSize) -} - -// FetchCoinOrders 查询金币购买记录。 -func FetchCoinOrders(c *gin.Context, page, pageSize int) ([]VipOrder, error) { - return fetchOrders(c, coinOrdersPath, page, pageSize) -} - -// FetchRecentOrdersOrEmpty 合并 VIP + 金币订单,失败返回空。 -func FetchRecentOrdersOrEmpty(c *gin.Context, limit int) []VipOrder { - if limit <= 0 { - limit = 20 - } - pageSize := limit - vipOrders, err1 := FetchVipOrders(c, 1, pageSize) - coinOrders, err2 := FetchCoinOrders(c, 1, pageSize) - if err1 != nil { - log.Error("fetch vip orders failed", log.E(err1)) - } - if err2 != nil { - log.Error("fetch coin orders failed", log.E(err2)) - } - out := make([]VipOrder, 0, len(vipOrders)+len(coinOrders)) - out = append(out, vipOrders...) - out = append(out, coinOrders...) - return out -} - -// FetchCoinTransList 查询金币余额明细:GET /api/app/coin/trans/list -// 第二个返回值为上游业务 code(网络/解码失败时为 0)。 -func FetchCoinTransList(c *gin.Context, page, pageSize int) ([]CoinTransListItem, int, error) { - if page <= 0 { - page = 1 - } - if pageSize <= 0 { - pageSize = 10 - } - if pageSize > 100 { - pageSize = 100 - } - full := fmt.Sprintf("%s?page=%d&pageSize=%d", coinTransPath, page, pageSize) - var env APIEnvelopeRaw - if err := upstream.GetJSON(c, full, &env); err != nil { - return nil, 0, err - } - if env.Code != 200 { - return nil, env.Code, fmt.Errorf("%s code=%d msg=%s", coinTransPath, env.Code, env.Msg) - } - return decodeCoinTransList(env.Data), env.Code, nil -} - -// FetchCoinTransListOrEmpty 失败返回空列表;游客会话失效时会尝试重登后重试一次。 -func FetchCoinTransListOrEmpty(c *gin.Context, page, pageSize int) []CoinTransListItem { - list, code, err := FetchCoinTransList(c, page, pageSize) - if err == nil { - return list - } - if retry, _ := authser.OnSessionExpired(c, code); retry { - list, _, err = FetchCoinTransList(c, page, pageSize) - if err == nil { - return list - } - } - log.Error("fetch coin trans list failed", log.E(err)) - return nil -} - -func decodeCoinTransList(raw json.RawMessage) []CoinTransListItem { - if len(raw) == 0 || string(raw) == "null" { - return nil - } - var arr []CoinTransListItem - if err := json.Unmarshal(raw, &arr); err == nil { - return arr - } - var obj struct { - List []CoinTransListItem `json:"list"` - } - if err := json.Unmarshal(raw, &obj); err != nil { - return nil - } - return obj.List -} - -func fetchOrders(c *gin.Context, path string, page, pageSize int) ([]VipOrder, error) { - if page <= 0 { - page = 1 - } - if pageSize <= 0 { - pageSize = 10 - } - full := fmt.Sprintf("%s?page=%d&pageSize=%d", path, page, pageSize) - var env APIEnvelopeRaw - if err := upstream.GetJSON(c, full, &env); err != nil { - return nil, err - } - if env.Code != 200 { - return nil, fmt.Errorf("%s code=%d msg=%s", path, env.Code, env.Msg) - } - return decodeOrderList(env.Data), nil -} - -func decodeOrderList(raw json.RawMessage) []VipOrder { - if len(raw) == 0 || string(raw) == "null" { - return nil - } - var arr []VipOrder - if err := json.Unmarshal(raw, &arr); err == nil { - return arr - } - var obj struct { - List []VipOrder `json:"list"` - Orders []VipOrder `json:"orders"` - Records []VipOrder `json:"records"` - Items []VipOrder `json:"items"` - } - if err := json.Unmarshal(raw, &obj); err != nil { - return nil - } - switch { - case len(obj.List) > 0: - return obj.List - case len(obj.Orders) > 0: - return obj.Orders - case len(obj.Records) > 0: - return obj.Records - case len(obj.Items) > 0: - return obj.Items - default: - return nil - } -} diff --git a/app/service/rechargeser/types.go b/app/service/rechargeser/types.go deleted file mode 100644 index d6ec54d..0000000 --- a/app/service/rechargeser/types.go +++ /dev/null @@ -1,117 +0,0 @@ -package rechargeser - -import "encoding/json" - -// PackageType 对应 rechargepackagemod.PackageType -const ( - PackageTypeVip = 1 // 会员畅享 - PackageTypeCoin = 2 // 金币充值 -) - -// PayMethodInfo 对应 swagger proto.PayMethodInfo -type PayMethodInfo struct { - Type string `json:"type"` // alipay / wechat / union - TypeName string `json:"typeName"` // 支付宝 / 微信 / 银联 -} - -// RechargePackageItem 对应 swagger proto.RechargePackageItem -type RechargePackageItem struct { - ID int64 `json:"id"` - Name string `json:"name"` - SubTitle string `json:"subTitle"` - PackageType int `json:"packageType"` - Price int64 `json:"price"` // 售价,分 - OriginalPrice int64 `json:"originalPrice"` // 原价,分 - BaseCoin int64 `json:"baseCoin"` - GiftCoin int64 `json:"giftCoin"` - TotalCoin int64 `json:"totalCoin"` - DurationDays int `json:"durationDays"` - DurationHours int `json:"durationHours"` - Sort int `json:"sort"` - PayMethods []PayMethodInfo `json:"payMethods"` -} - -// RechargePackageListResp 对应 swagger proto.RechargePackageListResp -// GET /api/app/recharge/package/list -type RechargePackageListResp struct { - VipList []RechargePackageItem `json:"vipList"` - CoinList []RechargePackageItem `json:"coinList"` -} - -// BuyPayReq 对应 coinapi.buyCoinReq / rechargeapi.submitOrderReq -type BuyPayReq struct { - PackageID int64 `json:"packageId"` - PayMode string `json:"payMode"` // alipay / wechat / union ... -} - -// PayOrderResp 对应 coinser.BuyCoinResp / rechargeser.SubmitOrderResp -type PayOrderResp struct { - IsOpenNewBrowser bool `json:"isOpenNewBrowser"` - PayURL string `json:"payUrl"` - PayURLMode string `json:"payUrlMode"` - TradeNo string `json:"tradeNo"` -} - -// VipOrder 对应 swagger vipordermod.VipOrder(会员/金币订单共用结构) -type VipOrder struct { - ID int64 `json:"id"` - UserID int64 `json:"userId"` - OrderType int `json:"orderType"` // 1会员 2金币 - Status int `json:"status"` // 1待支付 2成功 3失败 - Amount int64 `json:"amount"` // 分 - Coin int64 `json:"coin"` - CardID int64 `json:"cardId"` - CardName string `json:"cardName"` - CoinCfgID int64 `json:"coinCfgId"` - PayMode string `json:"payMode"` - TradeNo string `json:"tradeNo"` - CreatedAt string `json:"createdAt"` - FinishedAt string `json:"finishedAt"` -} - -// CoinTransListItem 对应 swagger proto.CoinTransListItemResp -// GET /api/app/coin/trans/list -type CoinTransListItem struct { - ID int64 `json:"id"` - Title string `json:"title"` - Remark string `json:"remark"` - TranType int `json:"tranType"` - TranTypeName string `json:"tranTypeName"` - FlowDir int `json:"flowDir"` // 1收入 -1支出 - FlowDirName string `json:"flowDirName"` - Amount int64 `json:"amount"` - ChangeAmount int64 `json:"changeAmount"` - BalanceBefore int64 `json:"balanceBefore"` - BalanceAfter int64 `json:"balanceAfter"` - OrderNo string `json:"orderNo"` - RelatedID int64 `json:"relatedId"` - CreatedAt string `json:"createdAt"` -} - -const ( - OrderTypeVip = 1 - OrderTypeCoin = 2 - - OrderStatusPending = 1 - OrderStatusSuccess = 2 - OrderStatusFailed = 3 - - FlowDirIn = 1 - FlowDirOut = -1 -) - -// APIEnvelope 上游统一响应壳 -type APIEnvelope[T any] struct { - Code int `json:"code"` - Msg string `json:"msg"` - Tip string `json:"tip"` - Data T `json:"data"` -} - -// APIEnvelopeRaw Data 形态不固定时使用。 -type APIEnvelopeRaw struct { - Code int `json:"code"` - Msg string `json:"msg"` - Tip string `json:"tip"` - Data json.RawMessage `json:"data"` -} diff --git a/app/service/rechargeser/view.go b/app/service/rechargeser/view.go deleted file mode 100644 index 7e23b10..0000000 --- a/app/service/rechargeser/view.go +++ /dev/null @@ -1,439 +0,0 @@ -package rechargeser - -import ( - "encoding/json" - "fmt" - "sort" - "strconv" - "strings" -) - -// PayMethodVM 支付方式展示。 -type PayMethodVM struct { - Type string - TypeName string - Active bool -} - -// PackageCardVM 充值页套餐卡片(字段来自 package/list)。 -type PackageCardVM struct { - ID int64 - Name string - Hint string // 优先 subTitle - PriceText string // 售价(元),不含 ¥ - OriginalPriceText string // 原价(元),仅当原价>售价时有值 - PriceFen int64 - Active bool - PayMethods []PayMethodVM - PayMethodsJSON string // 供 data-pay-methods 使用 -} - -// DepositPageVM 充值页模板数据。 -type DepositPageVM struct { - VipList []PackageCardVM - CoinList []PackageCardVM - PayMethods []PayMethodVM // 当前选中套餐的支付方式(接口 payMethods) - // TxList 交易明细:直接透传 /api/app/coin/trans/list 返回的字段 - //(不再做 Name/TimeText/AmountText 的自定义字段映射)。 - TxList []CoinTransListItem -} - -// TxItemVM 交易明细行(历史遗留:旧逻辑会把 CoinTransListItem 映射到此结构)。 -// 当前“交易明细调试”需求:DepositPageVM 直接透传 CoinTransListItem, -// 但旧函数可能仍被其它页面复用,因此保留结构体定义。 -type TxItemVM struct { - Name string - TimeText string - AmountText string - AmountClass string // deposit-tx-amount--plus / --minus - StatusText string -} - -var defaultPayMethods = []PayMethodInfo{ - {Type: "alipay", TypeName: "支付宝"}, - {Type: "wechat", TypeName: "微信"}, - {Type: "union", TypeName: "银联"}, -} - -// BuildDepositPageVM 按接口 vipList / coinList 组装展示数据(支付方式不造假)。 -// preferTab: "coin" 优先选中金币套餐,其它/空则优先会员。 -func BuildDepositPageVM(raw *RechargePackageListResp, preferTab string) DepositPageVM { - if raw == nil { - return DepositPageVM{} - } - vip := buildCards(raw.VipList, true) - coin := buildCards(raw.CoinList, false) - activatePreferredPackage(vip, coin, preferTab) - - var activePays []PayMethodVM - for _, item := range coin { - if item.Active { - activePays = item.PayMethods - break - } - } - if activePays == nil { - for _, item := range vip { - if item.Active { - activePays = item.PayMethods - break - } - } - } - if len(activePays) > 0 { - activePays[0].Active = true - } - return DepositPageVM{ - VipList: vip, - CoinList: coin, - PayMethods: activePays, - } -} - -// activatePreferredPackage 默认选中:优先有支付方式的套餐,否则选第一项。 -// preferTab=coin 时优先金币,否则优先会员。 -func activatePreferredPackage(vip, coin []PackageCardVM, preferTab string) { - pick := func(list []PackageCardVM) bool { - for i := range list { - if len(list[i].PayMethods) > 0 { - list[i].Active = true - return true - } - } - if len(list) > 0 { - list[0].Active = true - return true - } - return false - } - preferCoin := strings.EqualFold(strings.TrimSpace(preferTab), "coin") - if preferCoin { - if pick(coin) { - return - } - pick(vip) - return - } - if pick(vip) { - return - } - pick(coin) -} - -// AttachTxList 附加交易明细(金币流水)。 -func (vm *DepositPageVM) AttachTxList(list []CoinTransListItem) { - if vm == nil { - return - } - vm.TxList = list -} - -// BuildTxListFromCoinTrans 将金币流水转为展示列表。 -func BuildTxListFromCoinTrans(list []CoinTransListItem, limit int) []TxItemVM { - items := append([]CoinTransListItem(nil), list...) - if limit > 0 && len(items) > limit { - items = items[:limit] - } - out := make([]TxItemVM, 0, len(items)) - for _, item := range items { - name := strings.TrimSpace(item.Title) - if name == "" { - name = strings.TrimSpace(item.TranTypeName) - } - if name == "" { - name = strings.TrimSpace(item.Remark) - } - if name == "" { - name = "金币变动" - } - change := item.ChangeAmount - if change == 0 { - change = item.Amount - if item.FlowDir == FlowDirOut { - change = -change - } - } - amountClass := "deposit-tx-amount--plus" - amountText := "+" + formatCount(absInt64(change)) + " 金币" - if change < 0 || item.FlowDir == FlowDirOut { - amountClass = "deposit-tx-amount--minus" - amountText = "-" + formatCount(absInt64(change)) + " 金币" - } - out = append(out, TxItemVM{ - Name: name, - TimeText: formatTransTime(item.CreatedAt), - AmountText: amountText, - AmountClass: amountClass, - StatusText: strings.TrimSpace(item.FlowDirName), - }) - } - return out -} - -func absInt64(n int64) int64 { - if n < 0 { - return -n - } - return n -} - -func formatTransTime(raw string) string { - raw = strings.TrimSpace(raw) - if raw == "" || strings.HasPrefix(raw, "0001") { - return "" - } - raw = strings.ReplaceAll(raw, "T", " ") - if i := strings.Index(raw, "."); i > 0 { - raw = raw[:i] - } - if i := strings.IndexAny(raw, "Z+"); i > 10 { - raw = strings.TrimSpace(raw[:i]) - } - if len(raw) > 19 { - raw = raw[:19] - } - return raw -} - -// BuildTxList 将订单转为展示列表(按时间倒序)。保留供订单场景复用。 -func BuildTxList(orders []VipOrder, limit int) []TxItemVM { - items := append([]VipOrder(nil), orders...) - sort.SliceStable(items, func(i, j int) bool { - return orderTimeKey(items[i]) > orderTimeKey(items[j]) - }) - if limit > 0 && len(items) > limit { - items = items[:limit] - } - out := make([]TxItemVM, 0, len(items)) - for _, o := range items { - name := strings.TrimSpace(o.CardName) - if name == "" { - if o.OrderType == OrderTypeCoin || o.CoinCfgID > 0 { - name = "金币充值" - } else { - name = "会员充值" - } - } - status := orderStatusText(o.Status) - if status != "" { - name = name + " · " + status - } - amountClass := "deposit-tx-amount--minus" - amountText := "-¥" + FormatYuan(o.Amount) - if o.OrderType == OrderTypeCoin || o.Coin > 0 { - if o.Status == OrderStatusSuccess && o.Coin > 0 { - amountClass = "deposit-tx-amount--plus" - amountText = "+" + formatCount(o.Coin) + " 金币" - } - } - out = append(out, TxItemVM{ - Name: name, - TimeText: formatOrderTime(o), - AmountText: amountText, - AmountClass: amountClass, - StatusText: status, - }) - } - return out -} - -func orderTimeKey(o VipOrder) string { - if t := strings.TrimSpace(o.FinishedAt); t != "" && !strings.HasPrefix(t, "0001") { - return t - } - return strings.TrimSpace(o.CreatedAt) -} - -func formatOrderTime(o VipOrder) string { - raw := orderTimeKey(o) - if raw == "" || strings.HasPrefix(raw, "0001") { - return "" - } - // 常见 RFC3339 / 带 T 的时间,截成可读 - raw = strings.ReplaceAll(raw, "T", " ") - if i := strings.Index(raw, "."); i > 0 { - raw = raw[:i] - } - if i := strings.IndexAny(raw, "Z+"); i > 10 { - raw = strings.TrimSpace(raw[:i]) - } - if len(raw) > 19 { - raw = raw[:19] - } - return raw -} - -func orderStatusText(status int) string { - switch status { - case OrderStatusPending: - return "待支付" - case OrderStatusSuccess: - return "已完成" - case OrderStatusFailed: - return "失败" - default: - return "" - } -} - -func buildCards(list []RechargePackageItem, isVIP bool) []PackageCardVM { - items := append([]RechargePackageItem(nil), list...) - // 仅按接口 sort 排序;sort 相同保持接口原顺序 - sort.SliceStable(items, func(i, j int) bool { - return items[i].Sort < items[j].Sort - }) - out := make([]PackageCardVM, 0, len(items)) - for _, item := range items { - name := strings.TrimSpace(item.Name) - if name == "" { - if isVIP { - name = "会员套餐" - } else { - name = "金币套餐" - } - } - pays := buildPayMethodVMs(item.PayMethods, false) - card := PackageCardVM{ - ID: item.ID, - Name: name, - Hint: packageHint(item, isVIP), - PriceText: FormatYuan(item.Price), - PriceFen: item.Price, - PayMethods: pays, - PayMethodsJSON: marshalPayMethodsJSON(pays), - } - if item.OriginalPrice > item.Price && item.OriginalPrice > 0 { - card.OriginalPriceText = FormatYuan(item.OriginalPrice) - } - out = append(out, card) - } - return out -} - -func buildPayMethodVMs(list []PayMethodInfo, withFallback bool) []PayMethodVM { - src := list - if len(src) == 0 && withFallback { - src = defaultPayMethods - } - out := make([]PayMethodVM, 0, len(src)) - seen := map[string]struct{}{} - for _, item := range src { - typ := strings.ToLower(strings.TrimSpace(item.Type)) - name := strings.TrimSpace(item.TypeName) - if typ == "" && name == "" { - continue - } - if typ == "" { - typ = strings.ToLower(name) - } - if name == "" { - name = defaultPayTypeName(typ) - } - if _, ok := seen[typ]; ok { - continue - } - seen[typ] = struct{}{} - out = append(out, PayMethodVM{Type: typ, TypeName: name}) - } - if len(out) == 0 && withFallback { - return buildPayMethodVMs(defaultPayMethods, false) - } - return out -} - -func defaultPayTypeName(typ string) string { - switch typ { - case "alipay": - return "支付宝" - case "wechat", "wx", "weixin": - return "微信" - case "union", "unionpay": - return "银联" - case "dcep", "ecny": - return "数字人民币" - case "usdt": - return "USDT" - default: - if typ == "" { - return "支付" - } - return typ - } -} - -func marshalPayMethodsJSON(list []PayMethodVM) string { - type row struct { - Type string `json:"type"` - TypeName string `json:"typeName"` - } - rows := make([]row, 0, len(list)) - for _, item := range list { - rows = append(rows, row{Type: item.Type, TypeName: item.TypeName}) - } - b, err := json.Marshal(rows) - if err != nil || len(b) == 0 { - return "[]" - } - return string(b) -} - -func packageHint(item RechargePackageItem, isVIP bool) string { - // 优先接口 subTitle - if s := strings.TrimSpace(item.SubTitle); s != "" { - return s - } - if isVIP { - if item.DurationDays > 0 { - return fmt.Sprintf("%d天会员", item.DurationDays) - } - if item.DurationHours > 0 { - return fmt.Sprintf("%d小时会员", item.DurationHours) - } - return "" - } - base := item.BaseCoin - gift := item.GiftCoin - total := item.TotalCoin - if total <= 0 { - total = base + gift - } - if gift > 0 && base > 0 { - return fmt.Sprintf("基础 %s + 赠送 %s", formatCount(base), formatCount(gift)) - } - if total > 0 { - return formatCount(total) + " 金币" - } - return "" -} - -// FormatYuan 分转元展示(整数不带小数)。 -func FormatYuan(fen int64) string { - if fen < 0 { - fen = 0 - } - if fen%100 == 0 { - return strconv.FormatInt(fen/100, 10) - } - return strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", float64(fen)/100), "0"), ".") -} - -func formatCount(n int64) string { - if n < 0 { - n = 0 - } - s := strconv.FormatInt(n, 10) - if len(s) <= 3 { - return s - } - var b strings.Builder - rem := len(s) % 3 - if rem == 0 { - rem = 3 - } - b.WriteString(s[:rem]) - for i := rem; i < len(s); i += 3 { - b.WriteByte(',') - b.WriteString(s[i : i+3]) - } - return b.String() -} diff --git a/app/service/translationser/view.go b/app/service/translationser/view.go index 098036f..644db5f 100644 --- a/app/service/translationser/view.go +++ b/app/service/translationser/view.go @@ -280,8 +280,6 @@ func navActiveKey(href, name string, download bool) string { return "aiSeries" case "/home-road": return "homeRoad" - case "/user-center": - return "userCenter" case "/download-app": return "downloadApp" default: diff --git a/app/static/common/web-sdk-v1.1.8.js b/app/static/common/web-sdk-v1.1.8.js deleted file mode 100644 index c22f51e..0000000 --- a/app/static/common/web-sdk-v1.1.8.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).WebSDK=t()}(this,function(){"use strict";function e(e){var t,n,r,o,i,a,s,c,u,l,d,p,_,f,h,g,m,y,v,w,k,b,C,S,P=function(e){var t,n,r,o,i=(null==e?"":e)+"",a=[];for(t=0;i.length>t;t++)128>(n=i.charCodeAt(t))?a.push(n):2048>n?a.push(192|n>>6,128|63&n):55296>n||n>56319||t+1>=i.length||56320>(r=i.charCodeAt(t+1))||r>57343?a.push(224|n>>12,128|n>>6&63,128|63&n):(a.push(240|(o=r-56320+(n-55296<<10)+65536)>>18,128|o>>12&63,128|o>>6&63,128|63&o),t++);return a}((null==e?"":e)+""),E=8*P.length;for(P.push(128);P.length%64!=56;)P.push(0);for(t=0;8>t;t++)P.push(E>>>8*t&255);for(n=function(e,t){return e<>>32-t},r=function(e,t){return((e>>>0)+(t>>>0)&4294967295)>>>0},o=function(e,t,n,o){return r(r(e,t),r(n,o))},i=[7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21],a=Array(64),s=0;64>s;s++)a[s]=Math.floor(4294967296*Math.abs(Math.sin(s+1)))>>>0;for(c=1732584193,u=4023233417,l=2562383102,d=271733878,p=0;P.length>p;p+=64){for(_=Array(16),f=0;16>f;f++)_[f]=(P[h=p+4*f]|P[h+1]<<8|P[h+2]<<16|P[h+3]<<24)>>>0;for(g=c,m=u,y=l,v=d,w=0;64>w;w++)16>w?(k=m&y|~m&v,b=w):32>w?(k=v&m|~v&y,b=(5*w+1)%16):48>w?(k=m^y^v,b=(3*w+5)%16):(k=y^(m|~v),b=7*w%16),C=v,v=y,y=m,m=r(m,n(o(g,k,a[w],_[b]),i[w])),g=C;c=r(c,g),u=r(u,m),l=r(l,y),d=r(d,v)}return S=function(e){var t,n="";for(t=0;4>t;t++)n+=(256+(e>>>8*t&255)).toString(16).slice(1);return n},S(c)+S(u)+S(l)+S(d)}function t(){if("undefined"==typeof navigator)return"PC";var e=navigator.userAgent||"";return/iPhone|iPad|iPod/i.test(e)?"iOS":function(e){return/HarmonyOS|OpenHarmony/i.test((null==e?"":e)+"")}(e)||/Android/i.test(e)?"Android":"PC"}function n(e){var t=((null==e?"":e)+"").trim();return t&&/^\d+\.\d+\.\d+$/.test(t)?t:"1.0.0"}function r(e,t){return(e>>>t|e<<32-t)>>>0}function o(e,t,n){return(e&t^~e&n)>>>0}function i(e,t,n){return(e&t^e&n^t&n)>>>0}function a(e){return(r(e,2)^r(e,13)^r(e,22))>>>0}function s(e){return(r(e,6)^r(e,11)^r(e,25))>>>0}function c(e){return(r(e,7)^r(e,18)^e>>>3)>>>0}function u(e){return(r(e,17)^r(e,19)^e>>>10)>>>0}function l(e){for(var t=(e>>>0).toString(16);8>t.length;)t="0"+t;return t}function d(e,t){return((255&e[t])<<24|(255&e[t+1])<<16|(255&e[t+2])<<8|255&e[t+3])>>>0}function p(e){var t,n=function(e){var t,n,r,l,p,_,f,h,g,m,y,v,w,k,b,C,S,P,E,T,x,D=e.slice(),M=0,I=8*D.length>>>0;for(536870912>D.length||(M=Math.floor(D.length/536870912),0==(I=D.length%536870912*8>>>0)&&D.length>0&&M--),D.push(128);D.length%64!=56;)D.push(0);for(D.push(M>>>24&255,M>>>16&255,M>>>8&255,255&M,I>>>24&255,I>>>16&255,I>>>8&255,255&I),t=1779033703,n=3144134277,r=1013904242,l=2773480762,p=1359893119,_=2600822924,f=528734635,h=1541459225,g=0;D.length>g;g+=64){for(m=Array(64),y=0;16>y;y++)m[y]=d(D,g+4*y);for(y=16;64>y;y++)m[y]=u(m[y-2])+m[y-7]+c(m[y-15])+m[y-16]>>>0;for(v=t,w=n,k=r,b=l,C=p,S=_,P=f,E=h,y=0;64>y;y++)T=E+s(C)+o(C,S,P)+Gt[y]+m[y]>>>0,x=a(v)+i(v,w,k)>>>0,E=P,P=S,S=C,C=b+T>>>0,b=k,k=w,w=v,v=T+x>>>0;t=t+v>>>0,n=n+w>>>0,r=r+k>>>0,l=l+b>>>0,p=p+C>>>0,_=_+S>>>0,f=f+P>>>0,h=h+E>>>0}return[t,n,r,l,p,_,f,h]}(e||[]),r="";for(t=0;n.length>t;t++)r+=l(n[t]);return r}function _(e){return p(function(e){var t,n,r,o,i=(null==e?"":e)+"",a=[];for(t=0;i.length>t;t++)128>(n=i.charCodeAt(t))?a.push(n):2048>n?a.push(192|n>>6,128|63&n):55296>n||n>56319||t+1>=i.length||56320>(r=i.charCodeAt(t+1))||r>57343?a.push(224|n>>12,128|n>>6&63,128|63&n):(a.push(240|(o=r-56320+(n-55296<<10)+65536)>>18,128|o>>12&63,128|o>>6&63,128|63&o),t++);return a}((null==e?"":e)+""))}function f(e,t){return null==e||""===e?"":"int"===t?parseInt(e,10)+"":(e+"").replace(/^\s+|\s+$/g,"").toLowerCase()}function h(e){var t,n,r=e||{},o={screen_width:1,screen_height:1,screen_dpi:1,device_pixel_ratio:1,color_depth:1,max_touch_points:1,cpu_cores:1,cookie_enabled:1,local_storage_enabled:1,session_storage_enabled:1,indexeddb_enabled:1,service_worker_enabled:1},i={canvas_fp:1,webgl_fp:1,audio_fp:1,fonts_hash:1,plugins_hash:1,mimes_hash:1},a=[];for(t=0;zt.length>t;t++)a.push((n=zt[t])+"="+f(r[n],o[n]?"int":i[n]?"hash":"string"));return _("fp_v3|fingerprint_platform=web|"+a.join("|"))}function g(e,t){try{return e()}catch(n){return t}}function m(t){return e((null==t?"":t)+"").substr(0,32)}function y(e){return m((e||[]).slice().sort().join("|"))}function v(){return g(function(){var e,t,n,r,o,i,a,s,c="undefined"!=typeof OfflineAudioContext?OfflineAudioContext:"undefined"!=typeof webkitOfflineAudioContext?webkitOfflineAudioContext:null;if(!c)return"";if((t=(e=new c(1,44100,44100)).createOscillator()).type="triangle",t.frequency.value=1e4,n=e.createDynamicsCompressor(),t.connect(n),n.connect(e.destination),t.start(0),(r=e.startRendering())&&"function"==typeof r.then)return"";if(!(o=r)||!o.getChannelData)return"";for(i=o.getChannelData(0),a=0,s=4500;5e3>s&&i.length>s;s++)a+=Math.abs(i[s]);return m(a+"")},"")}function w(e){var t;try{return"undefined"==typeof window?0:(t="session"===e?window.sessionStorage:window.localStorage)?(t.setItem("__sdk_probe__","1"),t.removeItem("__sdk_probe__"),1):0}catch(n){return 0}}function k(){try{return"undefined"!=typeof indexedDB?1:0}catch(e){return 0}}function b(){try{return"undefined"!=typeof navigator&&navigator.serviceWorker?1:0}catch(e){return 0}}function C(e){return/Trident|MSIE/i.test(e=(e||"")+"")?"trident":/Edge\/\d/i.test(e)&&!/Edg\//i.test(e)?"edgehtml":/Edg\//i.test(e)||/Chrome\//i.test(e)&&!/Edg\//i.test(e)?"chromium":/Firefox\//i.test(e)?"gecko":/Safari\//i.test(e)&&!/Chrome\//i.test(e)?"webkit":"unknown"}function S(e,t){return t=(t||"")+"",/HarmonyOS|OpenHarmony/i.test(e=(e||"")+"")?"harmonyos":/iPhone|iPad|iPod/i.test(e)?"ios":/Android/i.test(e)?"android":/Mac OS X|Macintosh/i.test(e)||/^Mac/i.test(t)?"macos":/Windows/i.test(e)||/^Win/i.test(t)?"windows":/Linux/i.test(e)||/Linux/i.test(t)?"linux":"unknown"}function P(e){return/iPad|Tablet/i.test(e=(e||"")+"")?"tablet":/Mobile|iPhone|Android/i.test(e)?"phone":"desktop"}function E(e){var t,n,r;for(e=(e||"")+"",t=[[/EdgiOS\/([\d.]+)/i,"Edge"],[/CriOS\/([\d.]+)/i,"Chrome"],[/FxiOS\/([\d.]+)/i,"Firefox"],[/Edg\/([\d.]+)/i,"Edge"],[/OPR\/([\d.]+)/i,"Opera"],[/Chrome\/([\d.]+)/i,"Chrome"],[/Firefox\/([\d.]+)/i,"Firefox"],[/Version\/([\d.]+).*Safari/i,"Safari"]],n=0;t.length>n;n++)if(r=e.match(t[n][0]))return{browser_name:t[n][1],browser_version:r[1]||"unknown"};return{browser_name:"unknown",browser_version:"unknown"}}function T(){var e=g(function(){var e,t="undefined"!=typeof screen?screen:null;if(t&&t.orientation&&t.orientation.type)return t.orientation.type+"";if("undefined"!=typeof window&&"number"==typeof window.orientation){if(0===(e=window.orientation)||180===e)return"portrait-primary";if(90===e||-90===e)return"landscape-primary"}return t&&null!=t.width&&null!=t.height?t.width>t.height?"landscape-primary":"portrait-primary":"unknown"},"unknown");if(-1!==e.indexOf("landscape"))return"landscape";if(-1!==e.indexOf("portrait"))return"portrait";try{if("undefined"!=typeof screen&&null!=screen.width&&null!=screen.height){if(screen.width>screen.height)return"landscape";if(screen.widthu;u++){l=s[u];try{null!=(d=t[l])&&(c[l]=t.getParameter(d)+"")}catch(v){}}for(p=Object.keys(c).sort(),_=[],f=0;p.length>f;f++)_.push((h=p[f])+"="+c[h]);return g=m(_.join("|")),y=m([n,r,a,g].join("|")),{vendor:n,renderer:r,extensions_hash:a,params_hash:g,webgl_fp:y}},{vendor:"",renderer:"",extensions_hash:"",params_hash:"",webgl_fp:""}),F=N.webgl_fp||"",H=v(),U=g(function(){var e,t,n;if("undefined"==typeof navigator||!navigator.plugins)return"";for(e=[],t=0;ti;i++)e("'"+(a=Wt[i])+"'")!==r&&o.push(a);return o.sort(),{hash:y(o.map(function(e){return e.toLowerCase()})),installed:o,count:o.length}},{hash:"",installed:[],count:-1}),G=g(function(){var e,t,n,r,o,i,a;if("undefined"==typeof document)return{hash:"",supported:[]};for(e=document.createElement("video"),t=document.createElement("audio"),n=[],r=0;Jt.length>r;r++){i="video"===(o=Jt[r]).kind?e:t,a="";try{a=i.canPlayType?(i.canPlayType(o.type)||"")+"":""}catch(s){}a&&"no"!==a&&n.push(o.type+":"+a)}return n.sort(),{hash:y(n.map(function(e){return e.toLowerCase()})),supported:n}},{hash:"",supported:[]}),z=g(function(){var e,t,n="undefined"!=typeof window?window.AudioContext||window.webkitAudioContext:null;if(!n)return-1;if(t=(e=new n).sampleRate||-1,e.close)try{e.close()}catch(r){}return t>0?Math.round(t):-1},-1),W=(L.platform||"")+"",J=0;try{J=L.plugins?L.plugins.length:0}catch(Q){}e=Y.count,t=F?"available":"unavailable",n=!0===L.webdriver?1:0,r=0,o=0;try{B&&B.documentElement&&(r=B.documentElement.clientWidth||q.innerWidth||0,o=B.documentElement.clientHeight||q.innerHeight||0)}catch(Q){}i=0,1===n?i=1:"available"===t||0!==J||0>e||e>2||r>0&&o>0||(i=1),a="";try{"undefined"!=typeof Intl&&Intl.DateTimeFormat&&(a=Intl.DateTimeFormat().resolvedOptions().timeZone||"")}catch(Q){}s=function(){try{return"undefined"==typeof location?"":(location.protocol||"")+"//"+(location.host||"")+(location.pathname||"")}catch(Q){return""}}(),c="",u="",l="";try{"undefined"!=typeof location&&(c=location.hostname||"",u=location.pathname||"",location.search&&(l=m(location.search)))}catch(Q){}p=function(e){var t,n=((e||"")+"").trim();if(!n)return{referer_domain:"",referer_path:""};try{return{referer_domain:(t=new URL(n)).hostname||"",referer_path:t.pathname||""}}catch(Q){return{referer_domain:"",referer_path:""}}}(d=B&&B.referrer?B.referrer+"":""),_=function(e){var t,n,r,o;if(/iPhone|iPad|iPod/i.test(o=((o=(e=e||{}).userAgent)||"")+"")&&!/CriOS\/|FxiOS\/|EdgiOS\/|OPiOS\//i.test(o)&&/Version\/[\d.]+.*Safari/i.test(o))return E(e.userAgent);try{if((t=e.userAgentData&&e.userAgentData.brands)&&t.length)for(n=0;t.length>n;n++)if((r=(t[n].brand||"")+"")&&"Chromium"!==r&&0!==r.indexOf("Not")&&"Not.A/Brand"!==r)return{browser_name:r,browser_version:(t[n].version||"unknown")+""}}catch(Q){}return E(e.userAgent)}(L),f=G.supported?G.supported.length:-1,x=Math.round(96*(h=q.devicePixelRatio||1)),D=-1;try{null!=L.hardwareConcurrency&&L.hardwareConcurrency>0&&(D=L.hardwareConcurrency)}catch(Q){}M=D,I=-1;try{null!=L.deviceMemory&&L.deviceMemory>0&&(I=Math.round(10*L.deviceMemory)/10)}catch(Q){}return A=V&&V.type?V.type+"":"unknown",O=L.maxTouchPoints||0,{platform:"web",os_family:S(K,W),device_type:P(K),browser_kernel:C(K),browser_name:_.browser_name,browser_version:_.browser_version,browser_platform:W,display_mode:g(function(){return"undefined"==typeof window||"function"!=typeof window.matchMedia?"unknown":window.matchMedia("(display-mode: standalone)").matches?"standalone":window.matchMedia("(display-mode: fullscreen)").matches?"fullscreen":window.matchMedia("(display-mode: minimal-ui)").matches?"minimal-ui":"browser"},"unknown"),visibility_state:g(function(){if("undefined"==typeof document)return"unknown";var e=document.visibilityState;return"visible"===e||"hidden"===e?e:"unknown"},"unknown"),screen_width:R.width||0,screen_height:R.height||0,screen_dpi:x,device_pixel_ratio:Math.round(100*h),orientation:T(),viewport_width:r>0?Math.round(r):-1,viewport_height:o>0?Math.round(o):-1,color_depth:R.colorDepth||0,max_touch_points:O,touch_support:O>0?1:0,hardware_concurrency:D,cpu_cores:M,device_memory_gb:I,is_debug:0,language:L.language||"",timezone:a,cookie_enabled:L.cookieEnabled?1:0,local_storage_enabled:w("local"),session_storage_enabled:w("session"),indexeddb_enabled:k(),service_worker_enabled:b(),network_type:"unknown",connection_type:A,effective_type:V&&V.effectiveType?V.effectiveType+"":"unknown",downlink:V&&null!=V.downlink?Math.round(1e3*V.downlink):-1,rtt:V&&null!=V.rtt?V.rtt:-1,canvas_fp:j,webgl_fp:F,webgl_vendor:N.vendor||"",webgl_renderer:N.renderer||"",webgl_extensions_hash:N.extensions_hash||"",webgl_params_hash:N.params_hash||"",audio_fp:H,audio_sample_rate:z>0?z:44100,fonts:Y.installed||[],fonts_hash:Y.hash,plugins:X,plugins_hash:U,mimes:G.supported||[],mimes_hash:G.hash,mime_count:f,plugin_count:J,font_count:e,webgl_status:t,has_webdriver:n,is_headless:i,headless_reason:i?n?"webdriver":"composite":"",current_url:s,current_domain:c,current_path:u,current_query_hash:l,referer:d,referer_domain:p.referer_domain,referer_path:p.referer_path}}function D(e,t){var n,r;return null===e?"__t:null__":"string"==typeof e?"__t:str__:"+e:"number"==typeof e&&isFinite(e)?"__t:num__:"+e:"boolean"==typeof e?"__t:bool__:"+(e?"1":"0"):Array.isArray(e)?-1!==t.indexOf(e)?"__t:circular__":(t.push(e),n="["+e.map(function(e){return D(e,t)}).join(",")+"]",t.splice(t.indexOf(e),1),n):null!==e&&"object"==typeof e?-1!==t.indexOf(e)?"__t:circular__":(t.push(e),r="{"+Object.keys(e).sort().map(function(n){return n+":"+D(e[n],t)}).join(",")+"}",t.splice(t.indexOf(e),1),r):"__t:any__:"+e}function M(e){return D(e,[])}function I(e){var t=e||{},n={app_id:(t.appId||"")+"",uid:null!=t.uid?t.uid:0,channel:(t.channel||"")+"",sid:(t.sid||"")+"",client_ts:Math.floor(Date.now()/1e3),device:(t.deviceType||"PC")+"",device_id:(t.deviceId||"")+"",device_brand:(t.deviceBrand||"")+"",device_model:(t.deviceModel||"")+"",device_fingerprint:(t.deviceFingerprint||"")+"",fp_version:(t.fpVersion||"")+"",user_agent:"undefined"!=typeof navigator&&navigator.userAgent||"",sdk_version:(t.sdkVersion||"")+"",app_version:(t.appVersion||"1.0.0")+""};return null!=t.deviceEnv&&(n.device_env=t.deviceEnv),n}function A(e){var t,n,r,o,i=(null==e?"":e)+"",a=[];for(t=0;i.length>t;t++)128>(n=i.charCodeAt(t))?a.push(n):2048>n?a.push(192|n>>6,128|63&n):55296>n||n>56319||t+1>=i.length||56320>(r=i.charCodeAt(t+1))||r>57343?a.push(224|n>>12,128|n>>6&63,128|63&n):(a.push(240|(o=r-56320+(n-55296<<10)+65536)>>18,128|o>>12&63,128|o>>6&63,128|63&o),t++);return a}function O(e){var t,n=(null==e?"":e)+"",r=[];for(t=0;n.length>t;t+=2)r.push(parseInt(n.substr(t,2),16));return r}function L(e,t){var n,r=Array(e.length+t.length);for(n=0;e.length>n;n++)r[n]=e[n];for(n=0;t.length>n;n++)r[e.length+n]=t[n];return r}function R(e){return null==e?"":e+""}function q(){var e,t,n,r=new Uint8Array(16);if("undefined"!=typeof crypto&&crypto.getRandomValues)crypto.getRandomValues(r);else for(e=0;16>e;e++)r[e]=Math.floor(256*Math.random());for(t="",n=0;r.length>n;n++)t+=("0"+r[n].toString(16)).slice(-2);return t}function B(){try{return!("undefined"==typeof window||!window.sessionStorage||(window.sessionStorage.setItem("__sdk_ss_ping__","1"),window.sessionStorage.removeItem("__sdk_ss_ping__"),0))}catch(e){return!1}}function K(){if(!an){if(an=!0,function(){try{return!("undefined"==typeof window||!window.localStorage||(window.localStorage.setItem("__web_sdk_ping__","1"),window.localStorage.removeItem("__web_sdk_ping__"),0))}catch(e){return!1}}())try{window.localStorage.removeItem(en)}catch(t){}if("undefined"!=typeof document&&"string"==typeof document.cookie)try{var e="path=/;max-age=0;SameSite=Lax";"undefined"!=typeof location&&"https:"===location.protocol&&(e+=";Secure"),document.cookie=encodeURIComponent(tn)+"=;"+e}catch(t){}}}function V(e){K();var t=function(e){return JSON.stringify({sid:e.sid,sessionStartTs:e.sessionStartTs,lastValidBehaviorAt:e.lastValidBehaviorAt})}(e);if(B())try{window.sessionStorage.setItem($t,e.sid),window.sessionStorage.setItem(Zt,t)}catch(n){}on=e}function j(){if(on)return on;K();var e=null;if(B())try{e=window.sessionStorage.getItem(Zt)}catch(t){}return on=e?function(e){try{var n=JSON.parse(e);return n&&n.sid?{sid:n.sid+"",sessionStartTs:"number"==typeof n.sessionStartTs?n.sessionStartTs:Date.now(),lastValidBehaviorAt:"number"==typeof n.lastValidBehaviorAt?n.lastValidBehaviorAt:Date.now()}:null}catch(t){return null}}(e):null,on}function N(e){return{sid:q(),sessionStartTs:e,lastValidBehaviorAt:e}}function F(e){return"number"==typeof e&&isFinite(e)?1e12>e?1e3*e:e:null}function H(e,t,n){var r=F(e.sessionStartTs)||n,o=F(e.lastValidBehaviorAt)||r,i=n;return"idle"===t?i=Math.min(i=Math.max(r,o+nn),n):"forced"===t&&(i=Math.min(r+rn,n)),Math.max(r,i)}function U(e,t,n){var r,o;return n=n||Date.now(),r=F(e.sessionStartTs)||n,o=H(e,t,n),{sid:e.sid,sessionStartTs:r,lastValidBehaviorAt:F(e.lastValidBehaviorAt)||r,sessionEndTs:o,endReason:t}}function X(e){var t,n,r,o,i;return e=e||Date.now(),(t=j())?(r=e-t.sessionStartTs>rn,e-t.lastValidBehaviorAt>nn||r?(o=U(t,r?"forced":"idle",e),V(i=N(e)),{sid:i.sid,isNew:!0,endedSession:o}):{sid:t.sid,isNew:!1}):(V(n=N(e)),{sid:n.sid,isNew:!0})}function Y(){var e=j();return e?e.sid:""}function G(){on=null}function z(){var e,t;if(!function(){try{return!("undefined"==typeof window||!window.localStorage||(window.localStorage.setItem(cn,"1"),window.localStorage.removeItem(cn),0))}catch(e){return!1}}())return Promise.resolve(un||"NULL");try{return(e=window.localStorage.getItem(sn))&&/^[0-9a-f]{32}$/.test(e)?Promise.resolve(e):(t=function(){var e,t,n,r=new Uint8Array(16);if("undefined"!=typeof crypto&&crypto.getRandomValues)crypto.getRandomValues(r);else for(e=0;16>e;e++)r[e]=Math.floor(256*Math.random());for(t="",n=0;r.length>n;n++)t+=("0"+r[n].toString(16)).slice(-2);return t}(),window.localStorage.setItem(sn,t),un=t,Promise.resolve(t))}catch(n){return Promise.resolve("NULL")}}function W(){return ln&&dn?Promise.resolve({snapshot:ln,fingerprint:dn}):pn||(pn=new Promise(function(e){g(function(){var t,n,r,o,i="undefined"!=typeof OfflineAudioContext?OfflineAudioContext:"undefined"!=typeof webkitOfflineAudioContext?webkitOfflineAudioContext:null;i?((n=(t=new i(1,44100,44100)).createOscillator()).type="triangle",n.frequency.value=1e4,r=t.createDynamicsCompressor(),n.connect(r),r.connect(t.destination),n.start(0),(o=t.startRendering())&&"function"==typeof o.then?o.then(function(t){var n,r=t.getChannelData(0),o=0;for(n=4500;5e3>n&&r.length>n;n++)o+=Math.abs(r[n]);e(m(o+""))}).catch(function(){e("")}):e(v())):e("")},e(""))}).then(function(e){var t=x();return e&&(t.audio_fp=e),ln=t,{snapshot:t,fingerprint:dn=h(t)}}).catch(function(){var e=x();return ln=e,{snapshot:e,fingerprint:dn=h(e)}}))}function J(){return dn}function Q(){return Xt}function $(){return _n.digest()}function Z(){try{if("undefined"!=typeof screen&&screen.orientation&&screen.orientation.type){var e=screen.orientation.type+"";if(-1!==e.indexOf("landscape"))return"landscape";if(-1!==e.indexOf("portrait"))return"portrait"}if("undefined"!=typeof screen&&null!=screen.width&&null!=screen.height){if(screen.width>screen.height)return"landscape";if(screen.width0?Math.round(t):-1}catch(n){return-1}}function te(e,t){var n=t.accumulated_ms||0;return null!=t.resume_at_ms&&(n+=Math.max(0,e-t.resume_at_ms)),n}function ne(){return Sn.pageSeqCounter++,Sn.currentPageSeq=Sn.pageSeqCounter,Sn.currentPageSeq}function re(){try{return!("undefined"==typeof window||!window.sessionStorage||(window.sessionStorage.setItem("__sdk_metrics_ping__","1"),window.sessionStorage.removeItem("__sdk_metrics_ping__"),0))}catch(e){return!1}}function oe(e){var t,n=e||Sn;return{eventCountTotal:n.eventCountTotal||0,businessEventCount:n.businessEventCount||0,pageViewCount:n.pageViewCount||0,pageClickCount:n.pageClickCount||0,networkChangeCount:n.networkChangeCount||0,backgroundCount:n.backgroundCount||0,pageKeys:ae({},n.pageKeys||{}),pageStayList:(n.pageStayList||[]).slice(),pageSeqCounter:n.pageSeqCounter||0,currentPageSeq:n.currentPageSeq||0,lastEventName:n.lastEventName||"",scrollTotalCount:n.scrollTotalCount||0,scrollTotalDistance:n.scrollTotalDistance||0,scrollUpCount:n.scrollUpCount||0,scrollDownCount:n.scrollDownCount||0,scrollDirectionChangeCount:n.scrollDirectionChangeCount||0,lastScrollDirection:n.lastScrollDirection||0,firstScrollDelayMs:null!=n.firstScrollDelayMs?n.firstScrollDelayMs:-1,hasScrolled:!!n.hasScrolled,maxScrollDepthPercent:n.maxScrollDepthPercent||0,isReachBottom:n.isReachBottom||0,keydownTotalCount:n.keydownTotalCount||0,inputCount:n.inputCount||0,focusTotalCount:n.focusTotalCount||0,firstInteractionDelayMs:null!=n.firstInteractionDelayMs?n.firstInteractionDelayMs:-1,firstInteractionRecorded:!!n.firstInteractionRecorded,lastOrientation:n.lastOrientation||"unknown",touchTotalCount:n.touchTotalCount||0,swipeTotalCount:n.swipeTotalCount||0,longPressTotalCount:n.longPressTotalCount||0,pinchTotalCount:n.pinchTotalCount||0,currentPage:(t=n.currentPage,t&&"object"==typeof t?{page_key:(t.page_key||"")+"",page_name:(t.page_name||"")+"",enter_time:null!=t.enter_time?t.enter_time:Date.now(),enter_time_ms:null!=t.enter_time_ms?t.enter_time_ms:t.enter_time,page_seq_in_sid:t.page_seq_in_sid||0,has_interaction:!!t.has_interaction,accumulated_ms:t.accumulated_ms||0,resume_at_ms:null!=t.resume_at_ms?t.resume_at_ms:null,hidden_paused:!!t.hidden_paused,stay_duration_ms:t.stay_duration_ms}:null)}}function ie(e,t){return null==e||0>e||t>0&&e>t?-1:e}function ae(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function se(e){return mn+":"+(e||"")}function ce(e){var t,n;if(!e)return null;if(t=null,re())try{t=window.sessionStorage.getItem(se(e))}catch(r){}if(!t&&fe())try{t=window.localStorage.getItem(se(e))}catch(r){}if(!t)return null;try{return(n=JSON.parse(t))&&n.sid===e?n:null}catch(r){return null}}function ue(e,t){if(e){var n=JSON.stringify(t||{});if(re())try{window.sessionStorage.setItem(se(e),n)}catch(r){}if(fe())try{window.localStorage.setItem(se(e),n)}catch(r){}}}function le(e){if(!e)return null;var t=ce(e);return t&&t.metrics?t.metrics:null}function de(){var e,t=Y();t&&(vn?wn||(wn=t):(vn=!0,(e=ce(t))&&e.metrics?(Sn=oe(e.metrics),e.sessionStartedAt&&(Pn=e.sessionStartedAt),wn=t):wn=t))}function pe(e){var t=ce(e);return t&&t.behaviorHash?t.behaviorHash:""}function _e(){var e=Y();e&&(wn&&wn!==e||(wn||(wn=e),function(e){e&&ue(e,{sid:e,savedAt:Date.now(),sessionStartedAt:Pn,behaviorHash:$(),metrics:oe(Sn)})}(e)))}function fe(){try{return!("undefined"==typeof window||!window.localStorage||(window.localStorage.setItem("__sdk_metrics_ping__","1"),window.localStorage.removeItem("__sdk_metrics_ping__"),0))}catch(e){return!1}}function he(){var e,t;if(!fe())return[];try{return(e=window.localStorage.getItem(gn))?(t=JSON.parse(e),Array.isArray(t)?t:[]):[]}catch(n){return[]}}function ge(e){if(fe())try{window.localStorage.setItem(gn,JSON.stringify(e||[]))}catch(t){}}function me(e){ge(he().filter(function(t){return t&&t.sid!==e}))}function ye(e){for(var t,n=e.slice(0,fn);n.length>0;){if(t=JSON.stringify(n),hn>=t.length)return n;n.pop()}return n}function ve(e){var t,n=Sn.currentPage;n&&(n.stay_duration_ms=te(e,n),t={page_key:n.page_key,page_name:n.page_name||"",stay_duration_ms:n.stay_duration_ms,enter_time:Math.floor(n.enter_time/1e3),has_interaction:n.has_interaction?1:0},n.page_seq_in_sid&&(t.page_seq_in_sid=n.page_seq_in_sid),Sn.pageStayList.push(t),Sn.pageStayList=ye(Sn.pageStayList),Sn.currentPage=null)}function we(){Sn.firstInteractionRecorded||(Sn.firstInteractionRecorded=!0,Sn.firstInteractionDelayMs=Math.max(0,Date.now()-Pn))}function ke(){Sn.lastOrientation=Z()}function be(e){e&&Sn.currentPage&&Sn.currentPage.page_key===e&&(Sn.currentPage.has_interaction=!0)}function Ce(e,t,n,r){var o=Date.now();ve(o),Sn.currentPage={page_key:(e||"")+"",page_name:(t||"")+"",enter_time:null!=n?1e3*n:o,enter_time_ms:o,page_seq_in_sid:r||Sn.currentPageSeq||0,has_interaction:!1,accumulated_ms:0,resume_at_ms:o,hidden_paused:!1}}function Se(){ve(Date.now())}function Pe(e){var t,n=e;if(null==n)return null;if("string"==typeof n)try{n=JSON.parse(n)}catch(r){return null}return n&&"object"==typeof n?(t={page_key:(n.page_key||"")+"",page_name:(n.page_name||"")+"",stay_duration_ms:null!=n.stay_duration_ms?n.stay_duration_ms:0,enter_time:null!=n.enter_time?n.enter_time:0,has_interaction:n.has_interaction?1:0},null!=n.page_seq_in_sid&&(t.page_seq_in_sid=n.page_seq_in_sid),t):null}function Ee(e,t,n){var r,o,i,a,s,c,u,l,d,p,_,f=e||{},h=f.sid||Y(),g=h&&h===Y();for(n?r=oe(n):g?(Se(),_e(),r=oe(Sn)):r=function(e){var t,n;return de(),!(t=e||Y())||t!==Y()||wn&&wn!==t?(n=le(t))?oe(n):wn&&wn!==t?{eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null}:oe(Sn):oe(Sn)}(h),o=function(e,t){var n=Date.now(),r=e||{},o=F(r.sessionStartTs)||n,i=null!=r.sessionEndTs?F(r.sessionEndTs):H(r,t||"idle",n);return{startTs:o,endTs:i=Math.max(o,i||n)}}(f,t),s=Math.max(0,(a=o.endTs)-(i=o.startTs)),c=ae({},r.pageKeys||{}),u=function(e,t,n){var r,o,i,a=Math.floor((t||0)/1e3),s=Math.floor((n||Date.now())/1e3),c=Math.max(0,a-5),u=[];for(r=0;(e||[]).length>r;r++)(o=e[r])&&((i=null!=o.enter_time?+o.enter_time:0)>0&&c>i||i>s+5||u.push(o));return u}(u=function(e){var t,n,r=[];for(t=0;(e||[]).length>t;t++)(n=Pe(e[t]))&&r.push(n);return r}(function(e){var t,n,r,o={},i=[];for(t=0;e.length>t;t++)null!=(r=(n=e[t])&&n.page_seq_in_sid)&&o[r]||(null!=r&&(o[r]=!0),i.push(n));return i}((r.pageStayList||[]).slice()).sort(function(e,t){return(e.page_seq_in_sid||0)-(t.page_seq_in_sid||0)})),i,a),l=0;u.length>l;l++)(d=u[l]&&u[l].page_key?u[l].page_key+"":"")&&(c[d]=1);return p=Object.keys(c),_=n?pe(h)||$():g?$():pe(h)||$(),{session_start_ts:Math.floor(i/1e3),session_end_ts:Math.floor(a/1e3),session_duration_ms:s,event_count_total:r.eventCountTotal||0,business_event_count:r.businessEventCount||0,page_count:p.length,page_view_count:r.pageViewCount||0,page_click_count:r.pageClickCount||0,session_end_reason:(t||"idle")+"",last_event_name:r.lastEventName||"",page_stay_list:u,behavior_sequence_hash:_,network_change_count:r.networkChangeCount||0,scroll_total_count:r.scrollTotalCount||0,scroll_total_distance_px:Math.round(r.scrollTotalDistance||0),scroll_up_count:r.scrollUpCount||0,scroll_down_count:r.scrollDownCount||0,scroll_direction_change_count:r.scrollDirectionChangeCount||0,first_scroll_delay_ms:ie(null!=r.firstScrollDelayMs?r.firstScrollDelayMs:-1,s),max_scroll_depth_percent:r.maxScrollDepthPercent||0,is_reach_bottom:r.isReachBottom||0,content_height:ee(),keydown_total_count:r.keydownTotalCount||0,input_count:r.inputCount||0,focus_total_count:r.focusTotalCount||0,first_interaction_delay_ms:ie(null!=r.firstInteractionDelayMs?r.firstInteractionDelayMs:-1,s),orientation:r.lastOrientation||Z(),touch_total_count:r.touchTotalCount||0,swipe_total_count:r.swipeTotalCount||0,long_press_total_count:r.longPressTotalCount||0,pinch_total_count:r.pinchTotalCount||0}}function Te(){Dn=!0,setTimeout(function(){Dn=!1},2e3)}function xe(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function De(t){return e((null==t?"":t)+"").substr(0,32)}function Me(e){return null!=e&&""!==(e+"").trim()}function Ie(){try{return"undefined"==typeof location?"":(location.protocol||"")+"//"+(location.host||"")+(location.pathname||"")}catch(e){return""}}function Ae(e){var t=(null==e?"":e)+"";return(t=(t=(t=t.replace(/\.html?$/i,"")).replace(/[^a-zA-Z0-9_]+/g,"_")).replace(/_+/g,"_").replace(/^_|_$/g,""))||"index"}function Oe(){try{return Ae(("undefined"!=typeof location&&location.pathname?location.pathname:"/").replace(/^\/+|\/+$/g,"").replace(/\//g,"_")||"index")}catch(e){return"index"}}function Le(){try{return document.scrollingElement||document.documentElement||document.body||null}catch(e){return null}}function Re(){try{var e=Le();return e?{scroll_top:Math.max(0,Math.round(e.scrollTop||0)),scroll_left:Math.max(0,Math.round(e.scrollLeft||0))}:{scroll_top:-1,scroll_left:-1}}catch(t){return{scroll_top:-1,scroll_left:-1}}}function qe(e,t){if(null==e||!isFinite(e))return-1;var n=Math.round(+e);return 0>n&&(n=0),null!=t&&t>0&&n>t&&(n=t),n}function Be(){var e,t,n;try{return(e=document.documentElement||document.body)?(n=e.scrollHeight||0,(t=e.scrollWidth||0)>0&&n>0?{page_width:Math.round(t),page_height:Math.round(n)}:{page_width:-1,page_height:-1}):{page_width:-1,page_height:-1}}catch(r){return{page_width:-1,page_height:-1}}}function Ke(){var e,t;try{return"undefined"==typeof window?{viewport_width:-1,viewport_height:-1}:(e=window.innerWidth||0,t=window.innerHeight||0,e>0&&t>0?{viewport_width:Math.round(e),viewport_height:Math.round(t)}:{viewport_width:-1,viewport_height:-1})}catch(n){return{viewport_width:-1,viewport_height:-1}}}function Ve(){var e,t;try{return"undefined"==typeof screen?{screen_width:-1,screen_height:-1}:(e=screen.width||0,t=screen.height||0,e>0&&t>0?{screen_width:Math.round(e),screen_height:Math.round(t)}:{screen_width:-1,screen_height:-1})}catch(n){return{screen_width:-1,screen_height:-1}}}function je(){var e,t,n;try{if("undefined"!=typeof performance&&performance.timing&&(e=performance.timing).loadEventEnd&&e.navigationStart&&e.loadEventEnd>0)return Math.max(0,e.loadEventEnd-e.navigationStart);if("undefined"!=typeof performance&&"function"==typeof performance.getEntriesByType&&(t=performance.getEntriesByType("navigation"))&&t.length>0&&(n=t[0]).loadEventEnd>0&&n.fetchStart>=0)return Math.max(0,Math.round(n.loadEventEnd-n.fetchStart))}catch(r){}return 0}function Ne(e,t){return t>0?Math.min(100,Math.max(0,Math.round(e/t*100))):0}function Fe(e){return e?{clientX:null!=e.clientX?e.clientX:null,clientY:null!=e.clientY?e.clientY:null,pageX:null!=e.pageX?e.pageX:null,pageY:null!=e.pageY?e.pageY:null}:{}}function He(e){var t,n,r,o,i,a,s,c,u=e||{},l=Ke(),d=Be(),p=Re(),_=function(e){return!!e&&(null!=e.clientX||null!=e.clientY||null!=e.pageX||null!=e.pageY)}(u),f=d.page_width>0&&d.page_height>0,h=Ve(),g=f&&p.scroll_top>=0?p.scroll_top:0,m=f&&p.scroll_left>=0?p.scroll_left:0,y=l.viewport_width>0?l.viewport_width:-1,v=l.viewport_height>0?l.viewport_height:-1;return _?(n=null!=u.clientY?+u.clientY:null,r=null!=u.pageX?+u.pageX:null,o=null!=u.pageY?+u.pageY:null,null!=(t=null!=u.clientX?+u.clientX:null)||null!=n?(i=null!=t&&isFinite(t)?t:0,a=null!=n&&isFinite(n)?n:0,s=f?null!=r&&isFinite(r)?r:i+m:-1,c=f?null!=o&&isFinite(o)?o:a+g:-1):(s=f&&null!=r&&isFinite(r)?r:-1,c=f&&null!=o&&isFinite(o)?o:-1,i=null!=r&&isFinite(r)?r-m:0,a=null!=o&&isFinite(o)?o-g:0),i=qe(i,y),a=qe(a,v),f&&(s=qe(s,d.page_width),c=qe(c,d.page_height)),xe({click_viewport_x:i,click_viewport_y:a,click_document_x:f?s:-1,click_document_y:f?c:-1,click_page_x:i,click_page_y:a,click_x_percent:y>0?Ne(i,y):-1,click_y_percent:v>0?Ne(a,v):-1,screen_width:h.screen_width,screen_height:h.screen_height},l,f?d:{page_width:-1,page_height:-1},f?p:{scroll_top:-1,scroll_left:-1})):{click_viewport_x:-1,click_viewport_y:-1,click_document_x:-1,click_document_y:-1,click_page_x:-1,click_page_y:-1,click_x_percent:-1,click_y_percent:-1,screen_width:h.screen_width,screen_height:h.screen_height,viewport_width:l.viewport_width,viewport_height:l.viewport_height,page_width:f?d.page_width:-1,page_height:f?d.page_height:-1,scroll_top:f?p.scroll_top:-1,scroll_left:f?p.scroll_left:-1}}function Ue(e){var t=e||{},n=Ae(t.pageKey||Oe()),r=t.pageName||"undefined"!=typeof document&&document.title||n,o=function(){try{return"undefined"==typeof location?{}:{page_url:Ie(),page_domain:(location.hostname||"")+"",page_path:(location.pathname||"")+"",page_query_hash:location.search?De(location.search):""}}catch(e){return{}}}(),i=Ke();return{user_type:"",page_key:n,page_name:r,referrer_page_key:(t.previousPageKey||"")+"",referrer_page_name:(t.previousPageName||"")+"",current_page_key:n,current_page_name:r,recommend_trace_id:"",page_url:o.page_url,viewport_width:i.viewport_width,viewport_height:i.viewport_height,is_sdk_auto_collected:1}}function Xe(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function Ye(e,t){var n,r;return"app_session_summary"===t?Xe({},e.summaryFields||{},e.payload||{}):(n=function(e){var t=Xe({},e||{});return delete t._metricsRecorded,delete t._pageSeqPrealloc,delete t._clickSnap,t}(e.payload||{}),r={event:1,payload:1,event_id:1,summaryFields:1,_pageSeqInSid:1,_metricsRecorded:1,_sdkAutoClick:1,_pageSeqPrealloc:1},Object.keys(e).forEach(function(t){r[t]||(n[t]=e[t])}),n)}function Ge(t,n,r,o,i){var a,s,c,u,l,d,_,f=t||{},h=((r.event||"")+"").trim(),g=r.lifecycle_event_key||r.payload&&r.payload.lifecycle_event_key||"";return function(e,t){var n,r=(e||"")+"";return"app_page_view"===r||"page_click"===r||("app_lifecycle"===r?"cold_start"==(n=(t||"")+"")||"web_load"===n||"warm_start"===n||"foreground"===n:"sdk_init"!==r&&"network_state_change"!==r&&"app_session_summary"!==r&&"background"!==r)}(h,g)&&(u=Date.now(),(l=j())?(l.lastValidBehaviorAt=u,V(l)):V(N(u))),a="",r.payload&&null!=r.payload.page_key?a=r.payload.page_key+"":null!=r.page_key&&(a=r.page_key+""),function(e,t,n){"app_lifecycle"===e&&t&&Qt[t]?_n.append(t,n):("app_page_view"===e||"page_click"===e||e&&!Cn[e])&&_n.append(e,n)}(h,g,a),s=function(e,t){return I({appId:e.appId,channel:e.channel,uid:e.uid,sid:t,deviceId:(n=e.deviceId,((null==n?"":n)+"").trim()||"NULL"),deviceType:e.deviceType||"PC",deviceBrand:e.deviceBrand||"",deviceModel:e.deviceModel||"",deviceFingerprint:J(),fpVersion:Q(),sdkVersion:e.sdkVersion,appVersion:e.appVersion});var n}(f,n),function(e,t){var n,r;if(de(),(n=(e||"")+"")&&"app_session_summary"!==n){if("app_page_view"===n&&t&&t._metricsRecorded)return Sn.lastEventName=n,void _e();Sn.eventCountTotal++,Sn.lastEventName=n,Cn[n]||Sn.businessEventCount++,r=t&&null!=t.page_key?t.page_key+"":"","app_page_view"===n?(Sn.pageViewCount++,r&&(Sn.pageKeys[r]=1)):"page_click"===n?(Sn.pageClickCount++,be(r)):"network_state_change"===n?Sn.networkChangeCount++:r&&be(r),_e()}}(h,r.payload||{}),c=function(e,t){return function(e,t){var n,r=t||{},o={},i=Object.keys(e||{});for(n=0;i.length>n;n++)o[i[n]]=e[i[n]];return o.event_sig_version=(r.eventSigVersion||Yt)+"",o.event_sig=r.hmacKey?function(e,t){return t?function(e,t){var n,r,o,i,a=A((null==t?"":t)+"");for(a.length>64&&(a=O(p(a)));64>a.length;)a.push(0);for(n=[],r=[],o=0;64>o;o++)n.push(54^a[o]),r.push(92^a[o]);return i=O(p(L(n,A((null==e?"":e)+"")))),p(L(r,i))}(function(e){var t=e||{};return[R(t.event),R(t.event_id),R(t.app_id),R(t.client_ts),R(t.device_fingerprint)].join("|")}(e),t+""):""}(e,r.hmacKey):"",o}(e,{hmacKey:t&&t.hmacKey?t.hmacKey:"",eventSigVersion:Yt})}(function(t,n,r){return function(t,n){var r=function(){var e,t,n,r,o={};for(e=0;arguments.length>e;e++)if(t=arguments[e])for(n=Object.keys(t),r=0;n.length>r;r++)o[n[r]]=t[n[r]];return o}(t,n);return r.event_id||(r.event_id=function(t){var n,r=t||{},o=Object.keys(r).filter(function(e){return"event_id"!==e}).sort();return o.length?(n=o.map(function(t){return e(M(r[t]))}).join(""),e(n)):e("")}(r)),r}(t,{event:r,payload:Ye(n,r)})}(s,r,h),o),"app_page_view"===h&&r.payload&&r.payload.page_key&&(r.payload._metricsRecorded||r._metricsRecorded||Ce(r.payload.page_key,r.payload.page_name,r.payload.page_enter_ts,null!=r._pageSeqInSid?r._pageSeqInSid:r.payload.page_seq_in_sid)),"page_click"===h&&r.payload&&!r._sdkAutoClick&&xn.push({x:null!=(d=null!=r.payload.click_viewport_x?r.payload.click_viewport_x:r.payload.click_page_x)?d:0,y:null!=(_=null!=r.payload.click_viewport_y?r.payload.click_viewport_y:r.payload.click_page_y)?_:0,t:Date.now()}),c._sessionInfo=i||null,c}function ze(t,n,r){var o=Xe({},n||{}),i=((o.event||"")+"").trim();return On[i]&&o.payload&&1!==o.payload.is_sdk_auto_collected&&(o.payload=function(e,t,n){var r,o=e||{},i=1===o.is_sdk_auto_collected,a=((n||"")+"").trim(),s="app_page_view"===a||null!=o.page_key&&(null!=o.current_page_key||null!=o.user_type),c="page_click"===a,u={}||{},l=Ae(o.page_key||Oe());return r=s?Ue(xe(u,{pageKey:l,pageName:o.page_name})):c?xe({page_key:l,page_name:o.page_name||"undefined"!=typeof document&&document.title||l,recommend_trace_id:"",referrer_page_key:u.previousPageKey||""},function(e){var t=e||{},n=Ke(),r=Ve(),o=Be(),i=Re(),a=o.page_width>0&&o.page_height>0,s=a&&i.scroll_top>=0?i.scroll_top:0,c=a&&i.scroll_left>=0?i.scroll_left:0,u=n.viewport_width>0?n.viewport_width:-1,l=n.viewport_height>0?n.viewport_height:-1,d=null!=t.click_page_x?+t.click_page_x:null,p=null!=t.click_page_y?+t.click_page_y:null,_=-1,f=-1,h=-1,g=-1;return null!=d&&isFinite(d)&&null!=p&&isFinite(p)?(_=d,f=p,a&&(h=d+c,g=p+s)):null!=t.click_x_percent&&null!=t.click_y_percent&&u>0&&l>0&&(_=+t.click_x_percent/100*u,f=+t.click_y_percent/100*l,a&&(h=_+c,g=f+s)),-1!==_&&(_=qe(_,u)),-1!==f&&(f=qe(f,l)),a&&-1!==h&&(h=qe(h,o.page_width)),a&&-1!==g&&(g=qe(g,o.page_height)),{click_viewport_x:_,click_viewport_y:f,click_document_x:a?h:-1,click_document_y:a?g:-1,screen_width:r.screen_width,screen_height:r.screen_height,viewport_width:n.viewport_width,viewport_height:n.viewport_height,page_width:a?o.page_width:-1,page_height:a?o.page_height:-1,scroll_top:a?i.scroll_top:-1,scroll_left:a?i.scroll_left:-1}}(o)):{page_key:l,page_name:o.page_name||"undefined"!=typeof document&&document.title||l,recommend_trace_id:"",referrer_page_key:u.previousPageKey||""},i||s?i&&(r.is_sdk_auto_collected=1):delete r.is_sdk_auto_collected,function(e,t){var n,r,o=xe({},e||{}),i=Object.keys(t||{});for(n=0;i.length>n;n++)Me(o[r=i[n]])||(o[r]=t[r]);return o}(o,r)}(o.payload,0,i)),W().then(function(){var n,a=X();if(a.endedSession&&An)try{An(a.endedSession)}catch(s){}return n=a.sid||Y(),On[i]&&o.payload&&function(t,n){var r,o,i,a,s,c=((t.event||"")+"").trim();On[c]&&t.payload&&("app_page_view"===c?1===t.payload.is_sdk_auto_collected?(r=t.payload._pageSeqPrealloc||ne(),o=t.payload._metricsRecorded,null!=t.payload._pageSeqPrealloc&&delete t.payload._pageSeqPrealloc,t.payload=function(e,t,n){var r=e||{},o=Ke(),i=Math.floor(Date.now()/1e3),a=De((t||"")+"|"+(n||0)+"|"+i),s=je(),c=Ae(r.page_key||""),u=(r.page_name||"")+"";return{user_type:(null!=r.user_type?r.user_type:"")+"",page_key:c,page_name:u,referrer_page_key:(null!=r.referrer_page_key?r.referrer_page_key:"")+"",referrer_page_name:(null!=r.referrer_page_name?r.referrer_page_name:"")+"",current_page_key:(null!=r.current_page_key?r.current_page_key:c)+"",current_page_name:(null!=r.current_page_name?r.current_page_name:u)+"",recommend_trace_id:(null!=r.recommend_trace_id?r.recommend_trace_id:"")+"",page_id:a,page_enter_ts:i,page_url:r.page_url||Ie(),page_load_time:null!=s?s:0,viewport_width:o.viewport_width,viewport_height:o.viewport_height}}(t.payload,n,r),t._pageSeqInSid=r,o&&(t._metricsRecorded=1)):(i=function(t,n){var r,o=t||{},i=null!=o.page_enter_ts?o.page_enter_ts:Math.floor(Date.now()/1e3),a=o.page_seq_in_sid||ne();return{page_seq_in_sid:a,page_id:o.page_id||e((null==(r=(n||"")+"|"+a+"|"+i)?"":r)+"").substr(0,32),page_enter_ts:i}}(t.payload,n),t.payload=Xe(t.payload,i)):"page_click"===c&&1===t.payload.is_sdk_auto_collected&&(t.payload=(s=He((a=t.payload||{})._clickSnap||a),{page_key:Ae(a.page_key||""),page_name:(a.page_name||"")+"",recommend_trace_id:(null!=a.recommend_trace_id?a.recommend_trace_id:"")+"",referrer_page_key:(null!=a.referrer_page_key?a.referrer_page_key:"")+"",click_viewport_x:s.click_viewport_x,click_viewport_y:s.click_viewport_y,click_document_x:s.click_document_x,click_document_y:s.click_document_y,click_page_x:s.click_page_x,click_page_y:s.click_page_y,click_x_percent:s.click_x_percent,click_y_percent:s.click_y_percent,screen_width:s.screen_width,screen_height:s.screen_height,viewport_width:s.viewport_width,viewport_height:s.viewport_height,page_width:s.page_width,page_height:s.page_height,scroll_top:s.scroll_top,scroll_left:s.scroll_left}),t._sdkAutoClick=1,delete t.payload.is_sdk_auto_collected,delete t.payload._clickSnap))}(o,n),Ge(t,n,o,r,a)})}function We(){try{return"undefined"==typeof location?"":(location.protocol||"")+"//"+(location.host||"")+(location.pathname||"")}catch(e){return""}}function Je(){var e,t;try{return(e=function(){try{return document.scrollingElement||document.documentElement||document.body||null}catch(e){return null}}())&&(t=Math.max(0,(e.scrollHeight||0)-(e.clientHeight||0)))>0?Math.min(100,Math.max(0,Math.round((e.scrollTop||0)/t*100))):0}catch(n){return 0}}function Qe(){if(Dn)return"navigation";try{if("hidden"===document.visibilityState)return"visibility_hidden"}catch(e){}return"unknown"}function $e(){return function(){if(Sn.currentPage&&Sn.currentPage.page_key)return Sn.currentPage.page_key;var e=Sn.pageStayList||[];return e.length>0&&e[e.length-1].page_key||""}()||Oe()}function Ze(){var e,t="unknown";try{t="visible"===document.visibilityState||"hidden"===document.visibilityState?document.visibilityState:"unknown"}catch(n){}return{page_url:We(),unload_reason:Qe(),scroll_depth_percent_at_unload:Je(),web_visibility_state:t,page_stay_duration_ms:(e=Sn.currentPage,e?te(Date.now(),e):0),last_active_page_key:$e()}}function et(e,t,n,r){var o,i,a=n||{};return a.lifecycle_event_key=t,t===Ln&&(a=nt((o=Ke(),{page_url:We(),page_load_time_ms:je(),viewport_width:o.viewport_width,viewport_height:o.viewport_height}),a)),t===Bn&&(a=nt(a,Ze())),t===qn&&((i=Sn.currentPage)&&!i.hidden_paused&&(i.accumulated_ms=te(Date.now(),i),i.resume_at_ms=null,i.hidden_paused=!0),a.last_active_page_key||(a.last_active_page_key=$e())),t===Rn&&function(){var e=Sn.currentPage;e&&e.hidden_paused&&(e.resume_at_ms=Date.now(),e.hidden_paused=!1)}(),ze(e,{event:"app_lifecycle",payload:a},r)}function tt(e,t,n,r){return function(e,t,n,r){var o=Xe({},n||{});return W().then(function(){return Ge(e,t,o,r,null)})}(e,r||Y(),{event:"app_session_summary",summaryFields:t||{}},n)}function nt(e){var t,n,r,o,i=e||{};for(t=1;arguments.length>t;t++)if(n=arguments[t])for(r=Object.keys(n),o=0;r.length>o;o++)i[r[o]]=n[r[o]];return i}function rt(e){var t,n;return!e||2>e.length?0:Math.sqrt((t=e[0].clientX-e[1].clientX)*t+(n=e[0].clientY-e[1].clientY)*n)}function ot(){Hn&&(clearTimeout(Hn),Hn=null)}function it(e,t,n){var r,o,i,a,s,c;if(n=n||{},!e)return Promise.resolve({sent:!1,ok:!1,status:0,reason:"no_endpoint"});if(!Array.isArray(t)||0===t.length)return Promise.resolve({sent:!0,ok:!0,status:200,reason:"empty_batch"});if(r=JSON.stringify(t),o=!0===n.useBeacon,i=!1!==n.requireHttps,s=isFinite(a=+n.timeoutMs)&&a>0?Math.floor(a):Gn,!function(e,t){if(!t)return!0;var n,r=((e||"")+"").match(/^(https?):\/\/([^/:?#]+)/i);return!!r&&("https"===r[1].toLowerCase()||"http"===r[1].toLowerCase()&&("localhost"===(n=((r[2]||"")+"").toLowerCase())||"127.0.0.1"===n||"::1"===n))}(e,i))return void 0!==console&&console.warn&&console.warn("[sdk][web] 已拒绝非 HTTPS 上报地址(localhost HTTP 除外)"),Promise.resolve({sent:!1,ok:!1,status:0,reason:"insecure_endpoint"});if(o&&"undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon)try{if(c=new Blob([r],{type:"application/json"}),navigator.sendBeacon(e,c))return Promise.resolve({sent:!0,ok:!0,status:200,transport:"beacon",uncertain:!0})}catch(u){}return function(e,t,n){var r,o;return"function"!=typeof fetch?Promise.resolve(null):(r="undefined"!=typeof AbortController?new AbortController:null,o=r&&n>0?setTimeout(function(){r.abort()},n):null,fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,keepalive:!0,signal:r?r.signal:void 0}).then(function(e){return o&&clearTimeout(o),{sent:!0,ok:e.ok,status:+(e.status||0),transport:"fetch"}}).catch(function(e){return o&&clearTimeout(o),e&&"object"==typeof e&&"AbortError"===e.name?{sent:!1,ok:!1,status:0,reason:"timeout",transport:"fetch"}:null}))}(e,r,s).then(function(t){return null!==t?t:function(e,t,n){return new Promise(function(r){try{if("undefined"==typeof XMLHttpRequest)return r({sent:!1,ok:!1,status:0,reason:"no_xhr"});var o=new XMLHttpRequest;o.open("POST",e,!0),o.timeout=n,o.setRequestHeader("Content-Type","application/json"),o.onreadystatechange=function(){4===o.readyState&&r({sent:!0,ok:o.status>=200&&300>o.status,status:o.status,transport:"xhr"})},o.onerror=function(){r({sent:!1,ok:!1,status:0,reason:"xhr_error"})},o.ontimeout=function(){r({sent:!1,ok:!1,status:0,reason:"timeout",transport:"xhr"})},o.send(t)}catch(u){r({sent:!1,ok:!1,status:0,reason:"xhr_exception"})}})}(e,r,s)})}function at(e){e=e||{},this.selectedBatchEndpoint="",this.remoteEndpoints=[],this.remoteProbePromise=null,this.remoteProbeKey="",this.shouldPersistOnFail=!1,this.hasBatchProbeStarted=!1,this.initialized=!1,this.initPromise=null,this.endpointReadyListeners=[],this.timeoutMs=+e.pingTimeoutMs||1500}function st(e){return 255&(e<<1^(128&e?27:0))}function ct(e){return(Et[e>>>24&255]<<24|Et[e>>>16&255]<<16|Et[e>>>8&255]<<8|Et[255&e])>>>0}function ut(e,t){var n,r,o,i,a,s,c,u,l,d,p,_,f=e.slice(0);for(o=[],i=0;16>i;i++)f[i]=255&(f[i]^t[i>>2]>>>24-8*(3&i));for(a=1;14>=a;a++){for(n=[],i=0;16>i;i++)n[i]=Et[f[i]];for(r=[],c=0;4>c;c++)for(u=0;4>u;u++)r[c+4*u]=n[c+4*(u+c&3)];if(14>a){for(o=[],s=0;4>s;s++)d=r[4*s+1],p=r[4*s+2],_=r[4*s+3],o[4*s]=255&(st(l=r[4*s])^st(d)^d^p^_),o[4*s+1]=255&(l^st(d)^st(p)^p^_),o[4*s+2]=255&(l^d^st(p)^st(_)^_),o[4*s+3]=255&(st(l)^l^d^p^st(_));for(f=o,o=[],i=0;16>i;i++)f[i]=255&(f[i]^t[4*a+(i>>2)]>>>24-8*(3&i))}else for(f=r,i=0;16>i;i++)f[i]=255&(f[i]^t[4*a+(i>>2)]>>>24-8*(3&i))}return f}function lt(e,t){var n,r,o,i=[],a=t.slice(0);for(n=0;16>n;n++)i[n]=0;for(n=0;128>n;n++){if(e[n>>3]&128>>(7&n))for(r=0;16>r;r++)i[r]^=a[r];for(o=1&a[15],r=15;r>0;r--)a[r]=255&(a[r]>>>1|a[r-1]<<7);a[0]=a[0]>>>1&255,o&&(a[0]^=225)}return i}function dt(e){var t,n=e.slice(0);for(t=15;t>=12&&(n[t]=n[t]+1&255,!n[t]);t--);return n}function pt(e){this.encryptedConfigText=(e=e||{}).encryptedConfig||e.configCipher||"",this.cachedConfigPromise=null,this._secondGcmKeyBase64="en1BNo0VBrN/zi+mI2LO7E9W40ehCBYwC+frBn8s3rQ="}function _t(e,t){var n=((e&&e.event_id||"")+"").trim();return n?n+"|||"+(t||""):null}function ft(e){var t,n={},r=Object.keys(e);for(t=0;r.length>t;t++)n[r[t]]=e[r[t]];return n}function ht(){this.maxSize=Qn}function gt(e){var t,n,r=e||{},o=r.im_behavior_key,i=At[o];if(!i)throw(t=Error("[sdk][web] 未知 im_behavior_key:"+o)).name="EventValidationError",t.eventMethod="imEvent",t.typeErrorFields=["im_behavior_key(unknown)"],t;return n={},Object.keys(r).forEach(function(e){"im_behavior_name"!==e&&(n[e]=r[e])}),n.im_behavior_name=i,n}function mt(e,t){var n,r,o,i,a,s=Mt[e];if(!s)throw Error("[sdk][web] 未知事件方法:"+e);if(n=t||{},r={},o=[],i=[],Object.keys(s).forEach(function(e){var t,a=s[e],c=1&a,u=a>>1&3,l=!!(8&a),d=n[e];l&&null===d&&(d=""),!c||l||null!=d&&""!==d?c&&l&&void 0===d?o.push(e):(c||null!=d)&&((1===u?"number"==typeof(t=d)&&isFinite(t)&&t===Math.floor(t):2===u?function(e){return"number"==typeof e&&isFinite(e)}(d):function(e){return"string"==typeof e}(d))?r[e]=d:i.push(e+"(expected "+(1===u?"int":2===u?"number":"string")+")")):o.push(e)}),o.length||i.length)throw(a=Error("[sdk][web] 事件字段校验失败:"+e)).name="EventValidationError",a.eventMethod=e,a.missingFields=o.slice(),a.typeErrorFields=i.slice(),a;return r}function yt(){var e,t,n,r,o={};for(e=0;arguments.length>e;e++)if(t=arguments[e])for(n=Object.keys(t),r=0;n.length>r;r++)o[n[r]]=t[n[r]];return o}function vt(e){var t,n,r={};if(!e||!Array.isArray(e))return r;for(t=0;e.length>t;t++)(n=((null==e[t]?"":e[t])+"").trim())&&(Rt[n]?r[n]=1:Lt('[sdk][web] disableAutoEvents 含未知事件 "'+n+'",已忽略'));return r}function wt(e){var t,n=[],r=Object.keys(e||{});for(t=0;r.length>t;t++)n.push(r[t]);return n}function kt(e,t){this.opts=e,this.resolver=t,this.queue=[],this.timer=null,this.flushTail=Promise.resolve(),this.replaying=!1,this.replayTimer=null,this.hasPersistentItems=!0,this.persistentQueue=new ht,this._resolveEndpoint=null,this._getEventCodes=null,this.startReplayTimer()}function bt(e){var t,n;if("undefined"==typeof window)return Lt("[web-sdk] 非浏览器环境(SSR/Node.js),SDK 仅支持浏览器,初始化已跳过。"),this._ssrSkipped=!0,this.options=e,this.configMgr=null,this.resolver=null,void(this.batcher=null);if(!Object.prototype.hasOwnProperty.call(e,"channel"))throw Error('channel 为必传字段(可传空字符串 "")');this._ssrSkipped=!1,(t=yt(e)).channel=null==e.channel?"":e.channel+"",this._disableAutoEvents=vt(t.disableAutoEvents),t.disableAutoEvents=wt(this._disableAutoEvents),this.options=t,this.configMgr=new pt(e),this.resolver=new at({pingTimeoutMs:$n}),this.batcher=new kt(this.options,this.resolver),n=this,this.batcher._resolveEndpoint=function(e){return n.resolver.resolveEndpoint(function(){return n.configMgr.getBatchEndpoints()},e)},this.batcher._getEventCodes=function(){return n.configMgr.getEventCodes()},this.batcher._getSigningConfig=function(){return n.configMgr.getSigningConfig()},this._unsubReady=null,this._refreshTimer=null,this._autoLifecycleTeardown=null,this._webLoadTeardown=null,this._autoNetworkTeardown=null,this._pageTrackerTeardown=null,this._webInteractionTeardown=null,this._sessionPollTimer=null,this._autoEventsStarted=!1,this._init({}),this._startAutoEvents()}function Ct(e){if(!Vt)throw Error("请先调用 init() 初始化(参数须包含 channel)");return Vt}function St(e,t,n){var r,o,i;if(n>=e.length)return Promise.resolve();if(!Vt||Vt!==t){for(o=(r=e.slice(n)).length-1;o>=0;o--)jt.unshift(r[o]);return Promise.resolve()}return t.track((i=e[n]).event,i.endpoint).catch(function(){}).then(function(){return St(e,t,n+1)})}function Pt(e,t){var n;return Vt?(n=Vt,(Nt||Promise.resolve()).then(function(){return n.track(e,t)})):(jt.push({event:e,endpoint:t}),jt.length>500&&jt.shift(),Promise.resolve({sent:!1,ok:!0,status:0,reason:"pre_init_cached"}))}var Et,Tt,xt,Dt,Mt,It,At,Ot,Lt,Rt,qt,Bt,Kt,Vt,jt,Nt,Ft,Ht,Ut,Xt="3.0.0",Yt="sig_v2",Gt=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],zt=["os_family","browser_kernel","browser_platform","screen_width","screen_height","screen_dpi","device_pixel_ratio","color_depth","max_touch_points","cpu_cores","language","timezone","cookie_enabled","local_storage_enabled","session_storage_enabled","indexeddb_enabled","service_worker_enabled","canvas_fp","webgl_fp","audio_fp","fonts_hash","plugins_hash","mimes_hash"],Wt=["Arial","Arial Black","Comic Sans MS","Courier New","Georgia","Impact","Times New Roman","Trebuchet MS","Verdana","Microsoft YaHei","SimHei","SimSun","PingFang SC","Helvetica","Roboto","Monaco","Menlo","Consolas","Palatino Linotype","Tahoma","Lucida Console","Candara","Futura","Geneva"],Jt=[{kind:"video",type:'video/mp4; codecs="avc1.42E01E"'},{kind:"video",type:'video/webm; codecs="vp8, vorbis"'},{kind:"video",type:'video/ogg; codecs="theora"'},{kind:"video",type:"video/mp4"},{kind:"video",type:"video/webm"},{kind:"audio",type:"audio/mpeg"},{kind:"audio",type:'audio/ogg; codecs="vorbis"'},{kind:"audio",type:'audio/wav; codecs="1"'},{kind:"audio",type:"audio/mp4"},{kind:"audio",type:"audio/aac"}],Qt={cold_start:1,web_load:1,warm_start:1,foreground:1,background:1,web_unload:1,terminate:1,unknown:1},$t="__web_sdk_sid__",Zt="__web_sdk_sid_meta__",en="__web_sdk_sid__",tn="__web_sdk_sid_v1",nn=18e5,rn=216e5,on=null,an=!1,sn="__web_sdk_device_id__",cn="__web_sdk_ping__",un=null,ln=null,dn="",pn=null,_n=(Ut="",{append:function(e,t){var n=((e||"")+"").trim();n&&(Ut+=n+"|"+(null!=t?t+"":"")+";")},digest:function(){return _(Ut)},reset:function(){Ut=""}}),fn=50,hn=16384,gn="__web_sdk_pending_session_summaries__",mn="__web_sdk_session_metrics_v1__",yn="__web_sdk_summary_claimed__:",vn=!1,wn="",kn={},bn={},Cn={sdk_init:1,app_lifecycle:1,app_session_summary:1,network_state_change:1},Sn={eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null},Pn=Date.now(),En=0,Tn=0,xn=[],Dn=!1,Mn="",In="",An=null,On={app_page_view:1,page_click:1},Ln="web_load",Rn="foreground",qn="background",Bn="web_unload",Kn=null,Vn=0,jn=0,Nn=0,Fn=0,Hn=null,Un=!1,Xn=null,Yn=!1,Gn=1e4,zn="1.1.8",Wn=5e3,Jn=3e4,Qn=2e3,$n=1500,Zn=!1;if(at.prototype.normalizeBatchEndpoints=function(e){return(Array.isArray(e)?e:[]).map(function(e){return((e||"")+"").trim()}).filter(Boolean).filter(function(e){return/^https:\/\//i.test(e)}).map(function(e){var t=e.match(/^(https?:\/\/[^/?#]+)/i);return(t?t[1]:e.replace(/\/+$/,""))+"/api/eventTracking/batchReport.json"})},at.prototype._withTimeout=function(e,t){return new Promise(function(n,r){var o=setTimeout(function(){r(Error("timeout"))},t);e.then(function(e){clearTimeout(o),n(e)}).catch(function(e){clearTimeout(o),r(e)})})},at.prototype._xhrRace=function(e,t){return e.length?new Promise(function(n){function r(){for(var e=0;s.length>e;e++)try{s[e].abort()}catch(t){}}var o,i=e.length,a=!1,s=[];for(o=0;e.length>o;o++)(function(e){var o,c,u;try{function d(t){u||(u=!0,c&&(clearTimeout(c),c=null),t&&!a?(a=!0,r(),n(e)):t||(i--,a||0!==i||n("")))}o=new XMLHttpRequest,c=null,u=!1,s.push(o),c=setTimeout(function(){d(!1)},t),o.open("POST",e,!0),o.setRequestHeader("Content-Type","application/json"),o.onreadystatechange=function(){4===o.readyState&&d(o.status>0)},o.onerror=function(){d(!1)},o.send("[]")}catch(l){i--,a||0!==i||n("")}})(e[o])}):Promise.resolve("")},at.prototype._pickFastest=function(e,t){function n(){if(r)for(var e=0;o.length>e;e++)try{o[e].abort()}catch(t){}}var r,o,i=this;return"undefined"==typeof fetch?i._xhrRace(e,t):e.length?(r="undefined"!=typeof AbortController,o=[],new Promise(function(a){var s,c=e.length,u=!1;for(s=0;e.length>s;s++)(function(e){var s,l=r?new AbortController:null;l&&o.push(l),s={method:"POST",mode:"cors",headers:{"Content-Type":"application/json"},body:"[]",cache:"no-store"},l&&(s.signal=l.signal),i._withTimeout(fetch(e,s),t).then(function(t){t&&t.status>0?u||(u=!0,n(),a(e)):(c--,u||0!==c||a(""))}).catch(function(){c--,u||0!==c||a("")})})(e[s])})):Promise.resolve("")},at.prototype._notifyReady=function(){var e=this.selectedBatchEndpoint;this.endpointReadyListeners.forEach(function(t){try{t(e)}catch(n){}})},at.prototype._setSelectedEndpoint=function(e){var t=(e||"")+"";t&&t!==this.selectedBatchEndpoint&&(this.selectedBatchEndpoint=t,this._notifyReady())},at.prototype.startRemoteProbe=function(e){var t,n,r=e.join("|");return e.length?this.remoteProbePromise&&this.remoteProbeKey===r?this.remoteProbePromise:(this.remoteProbeKey=r,this.shouldPersistOnFail=!1,t=this,n=this._pickFastest(e,this.timeoutMs).then(function(r){if(t.remoteProbePromise!==n)return t.selectedBatchEndpoint;if(t.remoteProbePromise=null,r)t._setSelectedEndpoint(r);else if(!t.selectedBatchEndpoint&&e.length){t.shouldPersistOnFail=!0;var o=e[Math.floor(Math.random()*e.length)];t._setSelectedEndpoint(o)}return t.selectedBatchEndpoint}).catch(function(){return t.remoteProbePromise===n&&(t.remoteProbePromise=null),t.selectedBatchEndpoint}),this.remoteProbePromise=n,n):Promise.resolve("")},at.prototype.refreshDomainConfig=function(e){var t=this;return e().then(function(e){var n=t.normalizeBatchEndpoints(e);return t.remoteEndpoints=n,n.length?(t.hasBatchProbeStarted=!0,t.startRemoteProbe(n)):t.selectedBatchEndpoint})},at.prototype.init=function(e){return this.initialized?Promise.resolve():(this.initPromise||(this.initialized=!0,this.initPromise=this.refreshDomainConfig(e).catch(function(){})),this.initPromise)},at.prototype.resolveEndpoint=function(e,t){if(t)return Promise.resolve(t);var n=this;return this.init(e).then(function(){return n.selectedBatchEndpoint||""})},at.prototype.onEndpointReady=function(e){if("function"!=typeof e)return function(){};this.endpointReadyListeners.push(e);var t=this;return function(){var n=t.endpointReadyListeners.indexOf(e);0>n||t.endpointReadyListeners.splice(n,1)}},at.prototype.consumeProbeFailurePersistSignal=function(){return!!this.shouldPersistOnFail&&(this.shouldPersistOnFail=!1,!0)},at.prototype.getEndpointState=function(){return this.selectedBatchEndpoint?"ready":this.remoteEndpoints.length>0?"probing":"unavailable"},at.prototype.getSelectedBatchEndpoint=function(){return this.selectedBatchEndpoint},Et=function(){var e,t=[];for(e=0;1272>e;e+=2)t.push(parseInt("637c777bf26b6fc53001672bed2a28a248888da76f3248a3043813899432c6b326fb8d0d37e84760dad3574759e0b764532a380602b1fc71a9e7f97d3b6415c21d02b5612440a4500bf9c043d33e085f45c20e0b65124603dfa8cd7a76b65c11b829e69a4e7f7872c6c7150b6a0f0801d163ae27d4d6cd5d19e77a9b1b48aaf2428594d3752f1d67250bab67676203b9b40df3d7cdf7eebf4b1bd5b6e16416be39a4c4a56e644726087d013b8ea78a6750d8b0339b871ee1b6a9ab66c8032cc1ac2462c695459dc034deae0678ae1779d9e7abce45d167e719b7776c73222f3c7e3cc11ae6da5cd659b79ce60ca82ec97f6059f674c029a68db0853dc22bb6518048ed4f66256d430b74de2f1a95f0589c341befce783e7c6d9dc7dd8e21cb643ee710b3c11329260195e0c0a956f14f970a9e61e594c663f68266a11045baf84a11e051ea5b6a42067253b2d37392c3516e1fc226a5cd4ab8990c475651a4698910219b94e2eb7d2b7129f38c94e3b1246a3298fef32dcae306137c39e1f0e32fe97d11b986c41a55bd5351319f7f078010fa81eb86b8a0556f880000e3630c6a0b136307027bf70e1b5722632937a93b53bf2d240e3949fa5a6e4e6a2a6f4d5b43a39d051df60bc98f25ff3130c31fd85b6e4167b276aed3276b70c3e527f2f2963b60554543e32e1f0c1754766b610c20b0ffe75d3fb88f6fa49605d6a3d6ca3022ffc62f5c8d297b65c778da96c8941ac9c55845e094f1c4a020bff5bb01a0cb04f5a8ac42b1cb41c38d27c1e1358256f3e99e3295a6e3b8c9c0481ed49af7d43f580a8571a0b13162171ebe8666ee5365e9ce6bef0a682080268b3bb67a1076a5776a996c26c2c8c12c7490c356348d10351b5279fa09851ebf".substr(e,2),16));return t}(),Tt=[1,2,4,8,16,32,64,128,27,54],xt="__web_sdk_remote_config_cache__",pt.prototype.setEncryptedConfig=function(e){this.encryptedConfigText!==e&&(this.encryptedConfigText=e,this.cachedConfigPromise=null)},pt.prototype._tryParse=function(e){try{return JSON.parse(e)}catch(t){return e}},pt.prototype._unwrap=function(e,t){var n,r,o;for(t=t||3,n=e,r=0;t>r&&"string"==typeof n&&(o=this._tryParse(n))!==n;r++)n=o;return n},pt.prototype._toStringArray=function(e){var t,n=this._unwrap(e);return Array.isArray(n)?n.map(function(e){return((e||"")+"").trim()}).filter(Boolean):"string"==typeof n&&n.trim()?(t=this._tryParse(n),Array.isArray(t)?t.map(function(e){return((e||"")+"").trim()}).filter(Boolean):[n.trim()]):[]},pt.prototype._getStorage=function(){try{return"undefined"!=typeof window&&window.localStorage?window.localStorage:null}catch(e){return null}},pt.prototype._readPersisted=function(){var e,t,n;try{return(e=this._getStorage())&&(t=e.getItem(xt))?(n=JSON.parse(t),Date.now()-(n.updatedAt||0)>24e5?{}:this._mapPayload(n)):{}}catch(r){return{}}},pt.prototype._mapPayload=function(e){if(!e||"object"!=typeof e)return{};var t=e.data&&"object"==typeof e.data?e.data:e;return{batchUrls:this._toStringArray(null!=t.batchUrls?t.batchUrls:t.domainList),eventCodes:this._toStringArray(null!=t.eventCodes?t.eventCodes:t.eventList),signKey:(t.signKey||t.hmacKey||t.eventSignKey||"")+"",securityKeyVersion:(t.securityKeyVersion||t.signKeyVersion||"")+""}},pt.prototype._persist=function(e){try{var t=this._getStorage();if(!t)return;t.setItem(xt,JSON.stringify({batchUrls:this._toStringArray(e.batchUrls),eventCodes:this._toStringArray(e.eventCodes),signKey:(e.signKey||"")+"",securityKeyVersion:(e.securityKeyVersion||"")+"",updatedAt:Date.now()}))}catch(n){}},pt.prototype._base64ToBytes=function(e){var t,n,r,o,i=((e||"")+"").trim().replace(/-/g,"+").replace(/_/g,"/"),a=i.length%4?4-i.length%4:0;for(t=0;a>t;t++)i+="=";if("undefined"!=typeof atob&&"undefined"!=typeof Uint8Array){for(n=atob(i),r=new Uint8Array(n.length),o=0;n.length>o;o++)r[o]=n.charCodeAt(o);return r}return new Uint8Array(0)},pt.prototype._decryptAes256Gcm=function(e,t){var n,r,o,i,a,s,c;try{if(28>(n=this._base64ToBytes(e)).length)return Promise.reject(Error("密文过短"));if(r=this._base64ToBytes(t),o=n.slice(0,12),i=n.slice(12),"undefined"!=typeof crypto&&crypto.subtle)return crypto.subtle.importKey("raw",r,{name:"AES-GCM"},!1,["decrypt"]).then(function(e){return crypto.subtle.decrypt({name:"AES-GCM",iv:o},e,i)}).then(function(e){return new Uint8Array(e)});if(!(a=function(e,t,n){var r,o,i,a,s,c,u,l,d,p,_,f,h,g,m=[],y=[],v=[],w=[];for(r=0;32>r;r++)m[r]=e[r]||0;for(r=0;12>r;r++)y[r]=t[r]||0;if(0>(i=n.length-16))return null;for(r=0;i>r;r++)v[r]=n[r];for(r=0;16>r;r++)w[r]=n[i+r];for(a=function(e){var t,n,r=[];for(t=0;8>t;t++)r[t]=(e[4*t]<<24|e[4*t+1]<<16|e[4*t+2]<<8|e[4*t+3])>>>0;for(t=8;60>t;t++)n=r[t-1],t%8?t%8==4&&(n=ct(n)):n=(ct((n<<8|n>>>24)>>>0)^Tt[t/8-1]<<24)>>>0,r[t]=(r[t-8]^n)>>>0;return r}(m),s=[],r=0;16>r;r++)s[r]=0;for(c=ut(s,a),u=y.slice(0),r=12;15>r;r++)u[r]=0;for(u[15]=1,l=ut(u,a),d=dt(u),p=[],r=0;i>r;r+=16)for(_=ut(d,a),d=dt(d),o=0;16>o&&i>r+o;o++)p[r+o]=v[r+o]^_[o];for(f=v.slice(0);15&f.length;)f.push(0);for(r=0;8>r;r++)f.push(0);for(h=8*i,f.push(0,0,0,0),f.push(h>>>24&255,h>>>16&255,h>>>8&255,255&h),g=function(e,t){var n,r,o=[];for(n=0;16>n;n++)o[n]=0;for(n=0;t.length>n;n+=16){for(r=0;16>r;r++)o[r]^=t[n+r]||0;o=lt(o,e)}return o}(c,f),r=0;16>r;r++)if((l[r]^g[r])!==w[r])return null;return p}(r,o,i)))return Promise.reject(Error("AES-GCM 认证标签校验失败"));if("undefined"!=typeof Uint8Array)for(s=new Uint8Array(a.length),c=0;a.length>c;c++)s[c]=a[c];else s=a;return Promise.resolve(s)}catch(u){return Promise.reject(u)}},pt.prototype.fetchAndDecryptConfig=function(){var e,t,n;return this.cachedConfigPromise?this.cachedConfigPromise:(e=this,t=this._readPersisted(),this.encryptedConfigText?(n=this._decryptAes256Gcm(this.encryptedConfigText,this._secondGcmKeyBase64).then(function(t){var n,r,o,i;if("undefined"!=typeof TextDecoder)n=(new TextDecoder).decode(t);else{for(r=[],o=0;t.length>o;o++)r[o]=t[o];n=String.fromCharCode.apply(null,r)}return i=e._mapPayload(JSON.parse(n)),e._persist(i),i}).catch(function(e){return void 0!==console&&console.warn&&console.warn("[sdk][config] 解密失败:",e),t}),this.cachedConfigPromise=n,n):(this.cachedConfigPromise=Promise.resolve(t),this.cachedConfigPromise))},pt.prototype.getBatchEndpoints=function(){return this.fetchAndDecryptConfig().then(function(e){return e.batchUrls||[]})},pt.prototype.getEventCodes=function(){return this.fetchAndDecryptConfig().then(function(e){return Array.isArray(e.eventCodes)&&e.eventCodes.length>0?e.eventCodes:[]})},pt.prototype.getSigningConfig=function(){return this.fetchAndDecryptConfig().then(function(e){return{hmacKey:(e.signKey||"")+"",securityKeyVersion:(e.securityKeyVersion||"")+""}})},pt.prototype.prewarm=function(){this.fetchAndDecryptConfig().catch(function(){})},pt.prototype.forceRefresh=function(){this.cachedConfigPromise=null},Dt="events",ht.prototype.isAvailable=function(){return"undefined"!=typeof indexedDB&&"undefined"!=typeof window&&null!=window.indexedDB},ht.prototype.openDb=function(){var e=this;return new Promise(function(t,n){if(!e.isAvailable())return t(null);var r=indexedDB.open("web_sdk_event_queue",3);r.onerror=function(){n(r.error||Error("open indexedDB failed"))},r.onupgradeneeded=function(e){var t,n,o,i,a=r.result,s=e.oldVersion,c=e.target.transaction;if(!a.objectStoreNames.contains(Dt))return(t=a.createObjectStore(Dt,{keyPath:"id",autoIncrement:!0})).createIndex("createdAt","createdAt",{unique:!1}),void t.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!0});2>s&&c&&((n=c.objectStore(Dt)).indexNames.contains("pendingDedupeKey")||n.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!1})),3>s&&c&&((o=c.objectStore(Dt)).indexNames.contains("pendingDedupeKey")&&o.deleteIndex("pendingDedupeKey"),(i=o.getAll()).onsuccess=function(){var e,t,n,r,a,s,c,u=i.result||[],l={};for(e=0;u.length>e;e++)(n=(t=u[e]).pendingDedupeKey||_t(t.record,t.endpointOverride))&&(l[n]||(l[n]=[]),l[n].push(t.id));for(r=Object.keys(l),a=0;r.length>a;a++)if((s=l[r[a]]).length>=2)for(s.sort(function(e,t){return e-t}),c=1;s.length>c;c++)o.delete(s[c]);try{o.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!0})}catch(d){}},i.onerror=function(){try{o.createIndex("pendingDedupeKey","pendingDedupeKey",{unique:!0})}catch(e){}})},r.onsuccess=function(){t(r.result)}})},ht.prototype._txDone=function(e){return new Promise(function(t,n){e.oncomplete=function(){t()},e.onerror=function(){n(e.error||Error("tx failed"))},e.onabort=function(){n(e.error||Error("tx aborted"))}})},ht.prototype._trimOverflow=function(e){var t=this,n=Dt,r=e.transaction(n,"readonly");return new Promise(function(e,t){var o=r.objectStore(n).count();o.onsuccess=function(){e(+(o.result||0))},o.onerror=function(){t(o.error)}}).then(function(e){return t._txDone(r).then(function(){return e})}).then(function(r){var o,i,a,s;if(r>t.maxSize)return o=r-t.maxSize,i=e.transaction(n,"readwrite"),a=i.objectStore(n).index("createdAt"),s=0,new Promise(function(e,t){var r=a.openCursor();r.onerror=function(){t(r.error)},r.onsuccess=function(){var t=r.result;if(!t||s>=o)return e();i.objectStore(n).delete(t.primaryKey),s++,t.continue()}}).then(function(){return t._txDone(i)})})},ht.prototype.enqueueMany=function(e){var t=this;return e&&e.length?this.openDb().then(function(n){var r,o;if(n)return r=Date.now(),o=e.map(function(e,t){var n=e&&"object"==typeof e&&"record"in e?e:{record:e},o=_t(n.record,n.endpointOverride||""),i={createdAt:r+t,record:n.record,endpointOverride:n.endpointOverride||"",retryCount:0,nextRetryAt:0};return o&&(i.pendingDedupeKey=o),i}),new Promise(function(e,t){var r,i=n.transaction(Dt,"readwrite"),a=i.objectStore(Dt);i.oncomplete=function(){e()},i.onerror=function(){t(i.error)},i.onabort=function(){t(i.error)},r=0,function e(){var n,i;o.length>r&&(n=o[r++],(i=a.add(n)).onsuccess=function(){e()},i.onerror=function(n){var r=i.error;if(r&&"ConstraintError"===r.name)return n.preventDefault(),void e();t(r||Error("add failed"))})}()}).then(function(){return t._trimOverflow(n)}).then(function(){n.close()}).catch(function(e){throw n.close(),e})}):Promise.resolve()},ht.prototype.readOldest=function(e){return e=e||20,this.openDb().then(function(t){var n,r;return t?(n=Date.now(),r=[],new Promise(function(o,i){var a=t.transaction(Dt,"readonly").objectStore(Dt).index("createdAt").openCursor();a.onerror=function(){i(a.error)},a.onsuccess=function(){var t,i,s,c,u,l=a.result;if(!l||r.length>=e)return o();(s=isFinite(i=+(t=l.value).nextRetryAt)?Math.floor(i):0)>n||((c=ft(t)).endpointOverride=t.endpointOverride||"",c.retryCount=isFinite(u=+t.retryCount)?Math.floor(u):0,c.nextRetryAt=s,r.push(c)),l.continue()}}).then(function(){return t.close(),r}).catch(function(e){throw t.close(),e})):[]})},ht.prototype.removeByIds=function(e){var t=this;return e&&e.length?this.openDb().then(function(n){var r,o,i;if(n){for(o=(r=n.transaction(Dt,"readwrite")).objectStore(Dt),i=0;e.length>i;i++)o.delete(e[i]);return t._txDone(r).then(function(){n.close()}).catch(function(e){throw n.close(),e})}}):Promise.resolve()},ht.prototype.updateRetryMeta=function(e,t,n){var r=this;return e&&e.length?this.openDb().then(function(o){var i,a,s,c,u,l,d,p,_,f,h,g,m,y,v;if(!o)return{dropped:0,kept:0};for(i=Date.now(),s=isFinite(a=+t)?Math.max(0,Math.floor(a)):0,u=isFinite(c=+n)?Math.max(0,Math.floor(c)):0,l=0,d=0,_=(p=o.transaction(Dt,"readwrite")).objectStore(Dt),f=0;e.length>f;f++)u<(m=(isFinite(g=+(h=e[f]).retryCount)?Math.floor(g):0)+1)?(l++,_.delete(h.id)):(d++,y=h.pendingDedupeKey||_t(h.record,h.endpointOverride||""),v=ft(h),y&&(v.pendingDedupeKey=y),v.retryCount=m,v.nextRetryAt=i+s,_.put(v));return r._txDone(p).then(function(){return o.close(),{dropped:l,kept:d}}).catch(function(e){throw o.close(),e})}):Promise.resolve({dropped:0,kept:0})},ht.prototype.count=function(){var e=this;return this.openDb().then(function(t){if(!t)return 0;var n=t.transaction(Dt,"readonly");return new Promise(function(e,t){var r=n.objectStore(Dt).count();r.onsuccess=function(){e(+(r.result||0))},r.onerror=function(){t(r.error)}}).then(function(r){return e._txDone(n).then(function(){return t.close(),r})}).catch(function(e){throw t.close(),e})})},Mt={navigation:{navigation_key:1,navigation_name:1},appPageView:{user_type:1,page_key:1,page_name:1,referrer_page_key:9,referrer_page_name:9,current_page_key:1,current_page_name:1,page_load_time:3,recommend_trace_id:0},appInstall:{trace_id:1,attribution_flag:2},pageClick:{page_key:1,page_name:1,click_page_x:3,click_page_y:3,click_x_percent:3,click_y_percent:3,screen_width:3,screen_height:3,recommend_trace_id:0},recommendListView:{page_key:1,page_name:1,recommend_content_type:1,recommend_trace_id:0,recommend_id:1,recommend_trace_info:0,client_version:0},recommendListClick:{page_key:1,page_name:1,recommend_content_type:1,recommend_trace_id:0,recommend_id:1,recommend_trace_info:0,client_version:0},advertising:{event_type:1,advertising_key:1,advertising_name:1,advertising_id:1},videoEvent:{media_id:0,video_id:1,video_title:1,video_type_id:1,video_type_name:1,video_content_type:9,recommend_trace_id:0,video_tag_key:9,video_tag_name:9,video_duration:3,play_duration:3,play_progress:3,video_behavior_key:1,video_behavior_name:1},novelEvent:{media_id:0,novel_id:1,novel_title:1,chapter_id:0,chapter_name:0,novel_type_id:1,novel_type_name:1,recommend_trace_id:0,novel_tag_key:9,novel_tag_name:9,read_progress:3,page_no:3,novel_behavior_key:1,novel_behavior_name:1},comicEvent:{media_id:0,comic_id:1,comic_title:1,chapter_id:0,chapter_name:0,comic_type_id:1,comic_type_name:1,recommend_trace_id:0,comic_tag_key:9,comic_tag_name:9,read_progress:3,page_no:3,comic_behavior_key:1,comic_behavior_name:1},keywordSearch:{keyword:1,search_result_count:3,search_content_type:0,search_trace_id:0,search_id:0},keywordClick:{keyword:1,click_item_id:1,click_item_type_key:1,click_item_type_name:1,click_position:3,search_trace_id:0},adImpression:{page_key:1,page_name:1,ad_slot_key:1,ad_slot_name:1,ad_id:1,creative_id:0,ad_type:0},adClick:{page_key:1,page_name:1,ad_slot_key:1,ad_slot_name:1,ad_id:1,creative_id:0,ad_type:0},appPageitemExposure:{item_id:1,item_type:1,item_name:1,parent_item_id:1,page_key:1,page_name:1,referrer_page_key:9,referrer_page_name:9,recommend_trace_id:9,recommend_id:9,recommend_trace_info:9},appPageitemClick:{item_id:1,item_type:1,item_name:1,parent_item_id:1,position:3,page_key:1,page_name:1,recommend_trace_id:9,recommend_id:9,recommend_trace_info:9},adRequest:{request_id:1,ad_slot_key:1},adFill:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,fill_count:3},adNoFill:{request_id:1,ad_slot_key:1,ad_type:1,reason:1},adLoadSuccess:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,load_duration:3},adImpressionSdk:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,material_size:1},adClickSdk:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1},adClose:{trace_id:1,request_id:1,ad_slot_key:1,ad_id:1,ad_type:1,close_type:1},adError:{trace_id:1,request_id:0,ad_slot_key:1,ad_type:1,ad_id:9,error_code:1,error_msg:1,error_stage:1},imEvent:{conversation_id:1,conversation_type:1,current_uid:1,target_uid:1,target_role_key:1,target_role_name:1,message_id:9,message_type:9,im_behavior_key:1,im_behavior_name:1},imConversationView:{current_uid:1,conversation_count:3,total_unread_count:3,normal_conversation_count:3,archived_count:3,pinned_count:3},imConnectionSuccess:{current_uid:9,im_sdk_version:1},imMessageContent:{conversation_id:1,conversation_type:1,current_uid:1,target_uid:1,sender_uid:1,message_id:1,message_type:1,message:9,message_content_length:3,content_hash:9}},At={message_send:"发送消息",message_receive:"收到消息",message_read:"消息已读",message_recall:"消息撤回",conversation_pin:"置顶会话",conversation_unpin:"取消置顶",conversation_archive:"归档会话",conversation_unarchive:"取消归档"},Ot=Object.keys(It={navigation:"navigation",appPageView:"app_page_view",appInstall:"app_install",pageClick:"page_click",recommendListView:"recommend_list_view",recommendListClick:"recommend_list_click",advertising:"advertising",videoEvent:"video_event",novelEvent:"novel_event",comicEvent:"comic_event",keywordSearch:"keyword_search",keywordClick:"keyword_click",adImpression:"ad_impression",adClick:"ad_click",appPageitemExposure:"app_pageitem_exposure",appPageitemClick:"app_pageitem_click",adRequest:"ad_request",adFill:"ad_fill",adNoFill:"ad_no_fill",adLoadSuccess:"ad_load_success",adImpressionSdk:"ad_impression_sdk",adClickSdk:"ad_click_sdk",adClose:"ad_close",adError:"ad_error",imEvent:"im_event",imConversationView:"im_conversation_view",imConnectionSuccess:"im_connection_success",imMessageContent:"im_message_content"}).reduce(function(e,t){var n=It[t];return e[t]="imEvent"===t?function(e){return{event:n,payload:mt(t,gt(e))}}:function(e){return{event:n,payload:mt(t,e||{})}},e},{}),Lt=void 0!==console&&console.warn?function(e){console.warn(e)}:function(){},Rt={sdk_init:1,app_lifecycle:1,network_state_change:1,app_session_summary:1,app_page_view:1,page_click:1},qt=6e4,Bt="__web_sdk_recent_ok_event_ids__",Kt=function(){function e(e){var t,r=Object.keys(n);for(t=0;r.length>t;t++)e-n[r[t]]>qt&&delete n[r[t]]}function t(){try{"undefined"!=typeof window&&window.localStorage&&window.localStorage.setItem(Bt,JSON.stringify(n))}catch(e){}}var n={};if(function(){var e,t,r,o,i;try{if("undefined"!=typeof window&&window.localStorage&&(e=window.localStorage.getItem(Bt)))for(t=JSON.parse(e),r=Date.now(),o=Object.keys(t),i=0;o.length>i;i++)/^[0-9a-f]{32}$/.test(o[i])&&(r-t[o[i]]>qt||(n[o[i]]=t[o[i]]))}catch(a){}}(),"undefined"!=typeof window)try{window.addEventListener("storage",function(e){var t,r,o,i,a;try{if(e.key!==Bt||!e.newValue)return;for(t=JSON.parse(e.newValue),r=Date.now(),o=Object.keys(t),i=0;o.length>i;i++)a=t[o[i]],/^[0-9a-f]{32}$/.test(o[i])&&(r-a>qt||(n[o[i]]=a))}catch(s){}})}catch(r){}return{has:function(t){var r,o;return!!t&&(e(r=Date.now()),void 0!==(o=n[t])&&qt>=r-o)},set:function(r){var o,i,a,s,c,u=Date.now();for(e(u),o=0;r.length>o;o++)r[o]&&(n[r[o]]=u);if((i=Object.keys(n)).length>500){for(a="",s=1/0,c=0;i.length>c;c++)s>n[i[c]]&&(s=n[i[c]],a=i[c]);a&&delete n[a]}t()},reset:function(){n={},t()}}}(),kt.prototype.startReplayTimer=function(){var e=this;this.replayTimer=setInterval(function(){e.replayPersistent()},Wn)},kt.prototype._stopTimer=function(){this.timer&&(clearTimeout(this.timer),this.timer=null)},kt.prototype._settleItem=function(e,t){e.settled||(e.settled=!0,e.timeoutTimer&&(clearTimeout(e.timeoutTimer),e.timeoutTimer=null),e.resolve(t))},kt.prototype._purgeSettled=function(){this.queue.length&&(this.queue=this.queue.filter(function(e){return!e.settled}))},kt.prototype._toPersistentEntries=function(e){return e.map(function(e){return{record:e.record,endpointOverride:e.endpointOverride||"",retryCount:0,nextRetryAt:0}})},kt.prototype._getRetryDelay=function(e){return Math.min(6e4,Math.max(Wn,Math.floor(Wn*Math.pow(2,Math.min(10,Math.max(0,e))))))},kt.prototype.schedule=function(){var e=this;this._purgeSettled(),!this.timer&&this.queue.length&&(this.timer=setTimeout(function(){e.timer=null,e.flush().catch(function(){})},5e3))},kt.prototype.flush=function(){var e=this,t=this.flushTail.then(function(){return e.flushOnce()});return this.flushTail=t.catch(function(){}),t},kt.prototype._processFlushGroup=function(e,t,n){var r,o,i,a,s,c,u,l,d,p,_,f=this,h="__default__"===e?"":e,g=[],m=[];for(r=0;t.length>r;r++)((i=(((o=t[r]).record&&o.record.event_id||"")+"").trim())&&Kt.has(i)?m:g).push(o);for(a=0;m.length>a;a++)f._settleItem(m[a],{sent:!1,ok:!1,status:0,reason:"cross_batch_recent_success_deduped"});if(!g.length)return Promise.resolve();if(!f._resolveEndpoint){for(Lt("[sdk][web] _resolveEndpoint 未注入,事件无法发送"),s=0;g.length>s;s++)f._settleItem(g[s],{sent:!1,ok:!1,status:0,reason:"no_endpoint_resolver"});return Promise.resolve()}for(c={},u=[],l={},d=0;g.length>d;d++)c[_=(((p=g[d]).record&&p.record.event_id||"")+"").trim()||"__empty__:"+d]||(c[_]=!0,u.push(p.record),l[d]=!0);return f.resolver.consumeProbeFailurePersistSignal()?f.persistentQueue.enqueueMany(f._toPersistentEntries(g)).then(function(){f.hasPersistentItems=!0;for(var e=0;g.length>e;e++)f._settleItem(g[e],{sent:!1,ok:!1,status:0,reason:"probe_all_failed"})}).catch(function(){}):f._resolveEndpoint(h).then(function(e){var t,r,o,i,a,s;if(e){for(r=[],o=0;u.length>o;o++)if((i=((u[o]&&u[o].event_id||"")+"").trim())&&Kt.has(i)){for(a=0;g.length>a;a++)if(l[a]&&((g[a].record&&g[a].record.event_id||"")+"").trim()===i){f._settleItem(g[a],{sent:!1,ok:!1,status:0,reason:"cross_batch_recent_success_deduped"}),l[a]=!1;break}}else r.push(u[o]);if(!r.length){for(s=0;g.length>s;s++)l[s]||f._settleItem(g[s],{sent:!1,ok:!1,status:0,reason:"batch_deduped_duplicate"});return Promise.resolve()}return it(e,r,{useBeacon:Zn}).then(function(e){var t,n,o,i,a,s=Promise.resolve();if(e&&e.ok){for(t=[],n=0;r.length>n;n++)(o=((r[n]&&r[n].event_id||"")+"").trim())&&t.push(o);Kt.set(t)}else{for(i=[],a=0;g.length>a;a++)l[a]&&i.push(g[a]);s=f.persistentQueue.enqueueMany(f._toPersistentEntries(i)).then(function(){f.hasPersistentItems=!0}).catch(function(){})}return s.then(function(){for(var t=0;g.length>t;t++)f._settleItem(g[t],l[t]?e:{sent:!1,ok:!1,status:0,reason:"batch_deduped_duplicate"})})})}if("unavailable"===f.resolver.getEndpointState())return f.persistentQueue.enqueueMany(f._toPersistentEntries(g)).then(function(){f.hasPersistentItems=!0;for(var e=0;g.length>e;e++)f._settleItem(g[e],{sent:!1,ok:!1,status:0,reason:"endpoint_unavailable"})}).catch(function(){});for(t=0;g.length>t;t++)n.push(g[t])})},kt.prototype.flushOnce=function(){var e,t,n,r,o,i,a,s,c,u=this;if(this._purgeSettled(),!this.queue.length)return Promise.resolve();for(this._stopTimer(),e=this.queue.splice(0,10),t={},n=0;e.length>n;n++)(r=e[n]).settled||(t[o=r.endpointOverride||"__default__"]||(t[o]=[]),t[o].push(r));for(i=[],a=Object.keys(t),s=Promise.resolve(),c=0;a.length>c;c++)(function(e){s=s.then(function(){return u._processFlushGroup(e,t[e],i)})})(a[c]);return s.then(function(){var e,t,n,r,o,a,s;if(i.length){for(e=Date.now(),t=[],n=[],r=0;i.length>r;r++)(i[r].timeoutAt>e?n:t).push(i[r]);for(o=0;n.length>o;o++)u.queue.push(n[o]);for(a=Promise.resolve(),s=0;t.length>s;s++)(function(e){a=a.then(function(){return u.persistentQueue.enqueueMany(u._toPersistentEntries([e])).catch(function(){}).then(function(){u.hasPersistentItems=!0,u._settleItem(e,{sent:!1,ok:!1,status:0,reason:"track_timeout",transport:"queue"})})})})(t[s]);return a}}).then(function(){u.queue.length&&u.schedule()},function(e){throw u.queue.length&&u.schedule(),e})},kt.prototype._processReplayGroup=function(e,t){var n=this;return n._resolveEndpoint?n._resolveEndpoint("__default__"===e?"":e).then(function(e){var r,o,i,a,s,c,u,l,d;if(e){for(r={},o=[],i=[],a=[],s=0;t.length>s;s++)u=(((c=t[s]).record&&c.record.event_id||"")+"").trim()||"__empty__:"+c.id,(l=((c.record&&c.record.event_id||"")+"").trim())&&Kt.has(l)||r[u]?a.push(c.id):(r[u]=!0,o.push(c.record),i.push(c.id));return d=Promise.resolve(),a.length&&(d=d.then(function(){return n.persistentQueue.removeByIds(a)})),o.length?d.then(function(){return it(e,o,{useBeacon:Zn})}).then(function(e){var r,s,c,u,l,d,p,_,f,h;if(e&&e.ok){for(r=[],s=0;o.length>s;s++)(c=((o[s]&&o[s].event_id||"")+"").trim())&&r.push(c);for(Kt.set(r),u=[],l=0;i.length>l;l++)u.push(i[l]);for(d=0;a.length>d;d++)u.push(a[d]);return n.persistentQueue.removeByIds(u)}for(p=0,_=0;t.length>_;_++)(f=t[_].retryCount||0)>p&&(p=f);return h=n._getRetryDelay(p),n.persistentQueue.updateRetryMeta(t,h,5)}):d}}):(Lt("[sdk][web] _resolveEndpoint 未注入,持久队列重试跳过"),Promise.resolve())},kt.prototype.replayPersistent=function(){var e=this;return!this.hasPersistentItems||this.replaying?Promise.resolve():(this.replaying=!0,this.persistentQueue.readOldest(10).then(function(t){var n,r,o,i,a,s,c;if(!t.length)return e.persistentQueue.count().then(function(t){0===t&&(e.hasPersistentItems=!1)});for(n={},r=0;t.length>r;r++)n[i=(o=t[r]).endpointOverride||"__default__"]||(n[i]=[]),n[i].push(o);for(a=Object.keys(n),s=Promise.resolve(),c=0;a.length>c;c++)(function(t){s=s.then(function(){return e._processReplayGroup(t,n[t])})})(a[c]);return s}).catch(function(){}).then(function(){e.replaying=!1},function(){e.replaying=!1}))},kt.prototype.enqueueAssembled=function(e,t){var n=this;return(n._getEventCodes?n._getEventCodes():Promise.resolve([])).then(function(r){return r&&0===r.length||r&&-1===r.indexOf(e.event)?{sent:!1,ok:!1,status:0,reason:"event_code_not_allowed",event:e.event}:new Promise(function(r){var o={record:e,endpointOverride:t||"",resolve:r,reject:r,settled:!1,timeoutAt:Date.now()+Jn,timeoutTimer:null};o.timeoutTimer=setTimeout(function(){o.settled||n.persistentQueue.enqueueMany(n._toPersistentEntries([o])).catch(function(){}).then(function(){n.hasPersistentItems=!0,n._settleItem(o,{sent:!1,ok:!1,status:0,reason:"track_timeout",transport:"queue"})})},Jn),n.queue.push(o),10>n.queue.length?n.schedule():n.flush().catch(function(){})})})},kt.prototype.track=function(e,r){var o=this;return z().then(function(i){var a={appId:o.opts.appId,channel:o.opts.channel,uid:o.opts.uid||"",deviceId:o.opts.deviceId||i,deviceType:t(),sdkVersion:zn,appVersion:n(o.opts.appVersion)};return(o._getSigningConfig?o._getSigningConfig():Promise.resolve({hmacKey:"",securityKeyVersion:""})).then(function(t){return ze(a,e,t)}).then(function(e){return delete e._sessionInfo,(o._getEventCodes?o._getEventCodes():Promise.resolve([])).then(function(t){return t&&0===t.length?(Lt("[sdk][web] 当前没有事件允许上报,请检查服务端配置(eventCodes 为空)"),{sent:!1,ok:!1,status:0,reason:"event_code_not_allowed",event:e.event}):t&&-1===t.indexOf(e.event)?(Lt('[sdk][web] 事件 "'+e.event+'" 不在服务端允许上报的列表中,已忽略'),{sent:!1,ok:!1,status:0,reason:"event_code_not_allowed",event:e.event}):new Promise(function(t,n){var i={record:e,endpointOverride:r||"",resolve:t,reject:n,settled:!1,timeoutAt:Date.now()+Jn,timeoutTimer:null};i.timeoutTimer=setTimeout(function(){i.settled||o.persistentQueue.enqueueMany(o._toPersistentEntries([i])).catch(function(){}).then(function(){o.hasPersistentItems=!0,o._settleItem(i,{sent:!1,ok:!1,status:0,reason:"track_timeout",transport:"queue"})})},Jn),o.queue.push(i),10>o.queue.length?o.schedule():o.flush().catch(function(){})})})})})},kt.prototype.stop=function(){var e,t;this._stopTimer(),this.replayTimer&&(clearInterval(this.replayTimer),this.replayTimer=null),e={sent:!1,ok:!1,status:0,reason:"stopped"},t=this,this.queue.splice(0).forEach(function(n){t._settleItem(n,e)})},kt.prototype.getConfig=function(){return{batchMaxSize:10,batchIntervalMs:5e3,replayBatchSize:10,replayIntervalMs:Wn}},bt.prototype._sdkOpts=function(){return{appId:this.options.appId,channel:this.options.channel,uid:this.options.uid||"",deviceId:this.options.deviceId||"",deviceType:t(),sdkVersion:zn,appVersion:n(this.options.appVersion)}},bt.prototype._isAutoDisabled=function(e){return!(!this._disableAutoEvents||!this._disableAutoEvents[e])},bt.prototype._handleEndedSession=function(e){var t,n,r,o,i,a,s;return e&&e.sid&&!this._ssrSkipped?this._isAutoDisabled("app_session_summary")?Promise.resolve():function(e){if(!e)return!1;if(kn[e]||bn[e])return!1;if(re())try{if(window.sessionStorage.getItem(yn+(e+"")))return kn[e]=1,!1}catch(t){}return bn[e]=1,!0}(e.sid)?(t=this,r=e.sid,i=(null!=e.sessionEndTs?1e12>e.sessionEndTs?1e3*e.sessionEndTs:e.sessionEndTs:Date.now())||Date.now(),a=le(r),s=!wn||wn===r||!a&&(Sn.eventCountTotal>0||Sn.currentPage||(Sn.pageStayList||[]).length>0),a&&wn&&wn!==r&&(s=!1),a&&s&&(a.eventCountTotal||0)>(Sn.eventCountTotal||0)&&(s=!1),s?(Se(),o=oe(Sn)):o=a?function(e,t){var n,r,o,i=e&&e.currentPage;return i?(n=t||Date.now(),r=i.accumulated_ms||0,null!=i.resume_at_ms&&(r+=Math.max(0,n-i.resume_at_ms)),o={page_key:i.page_key,page_name:i.page_name||"",stay_duration_ms:r,enter_time:Math.floor((i.enter_time||n)/1e3),has_interaction:i.has_interaction?1:0},i.page_seq_in_sid&&(o.page_seq_in_sid=i.page_seq_in_sid),e.pageStayList=ye((e.pageStayList||[]).concat([o])),e.currentPage=null,e):e}(oe(a),i):{eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null},ue(r,{sid:r,savedAt:Date.now(),sessionStartedAt:Pn,behaviorHash:$(),metrics:o}),n=o,z().then(function(r){var o=yt(t._sdkOpts(),{deviceId:r});return t.configMgr.getSigningConfig().then(function(t){var r=Ee(e,e.endReason,n);return tt(o,r,t,e.sid)})}).then(function(e){return e}).then(function(e){return delete e._sessionInfo,t.batcher.enqueueAssembled(e,"")}).then(function(){var t,n;!function(e){if(e&&(delete bn[e],kn[e]=1,re()))try{window.sessionStorage.setItem(yn+(e+""),"1")}catch(t){}}(e.sid),me(e.sid),t={pageKey:Mn||"",pageName:In||""},n=function(e){if(!e||null==e.sessionStartTs)return Date.now();var t=e.sessionStartTs;return 1e12>t?1e3*t:t}(j()),function(e,t){var n,r;e&&function(e){if(e){if(re())try{window.sessionStorage.removeItem(se(e))}catch(t){}if(fe())try{window.localStorage.removeItem(se(e))}catch(t){}}}(e),Sn={eventCountTotal:0,businessEventCount:0,pageViewCount:0,pageClickCount:0,networkChangeCount:0,backgroundCount:0,pageKeys:{},pageStayList:[],pageSeqCounter:0,currentPageSeq:0,lastEventName:"",scrollTotalCount:0,scrollTotalDistance:0,scrollUpCount:0,scrollDownCount:0,scrollDirectionChangeCount:0,lastScrollDirection:0,firstScrollDelayMs:-1,hasScrolled:!1,maxScrollDepthPercent:0,isReachBottom:0,keydownTotalCount:0,inputCount:0,focusTotalCount:0,firstInteractionDelayMs:-1,firstInteractionRecorded:!1,lastOrientation:"unknown",touchTotalCount:0,swipeTotalCount:0,longPressTotalCount:0,pinchTotalCount:0,currentPage:null},Pn=n=t&&"number"==typeof t.sessionStartMs&&isFinite(t.sessionStartMs)?t.sessionStartMs:Date.now(),Sn.lastOrientation=Z(),_n.reset(),vn=!0,wn=Y()||"",(r=t&&t.carryOver)&&r.pageKey?function(e,t,n){var r,o,i,a,s=((e||"")+"").trim();if(!s)return!1;r="number"==typeof n&&isFinite(n)?n:Date.now(),o=Date.now(),i=!1;try{i="undefined"!=typeof document&&"hidden"===document.visibilityState}catch(c){}Sn.pageKeys[s]=1,a=ne(),Sn.currentPage={page_key:s,page_name:(t||"")+"",enter_time:r,enter_time_ms:r,page_seq_in_sid:a,has_interaction:!1,accumulated_ms:0,resume_at_ms:i?null:o,hidden_paused:i},_e()}(r.pageKey,r.pageName,n):_e()}(e.sid,{sessionStartMs:n,carryOver:t.pageKey?{pageKey:t.pageKey,pageName:t.pageName}:null})}).catch(function(){var t;(t=e.sid)&&delete bn[t],function(e){if(e&&e.sid){var t=he().filter(function(t){return t&&t.sid!==e.sid});t.push(e),ge(t)}}({sid:e.sid,sessionStartTs:e.sessionStartTs,sessionEndTs:e.sessionEndTs,endReason:e.endReason,fields:Ee(e,e.endReason,n)})})):Promise.resolve():Promise.resolve()},bt.prototype._replayPendingSummaries=function(e,t,n){var r,o,i=he();if(!i.length)return Promise.resolve();for(r=Promise.resolve(),o=0;i.length>o;o++)(function(o){r=r.then(function(){return n(tt(e,o.fields,t,o.sid)).then(function(){return me(o.sid),null}).catch(function(){})})})(i[o]);return r},bt.prototype._startAutoEvents=function(){if(!this._ssrSkipped&&!this._autoEventsStarted){var e=this;this._autoEventsStarted=!0,An=function(t){e._handleEndedSession(t).catch(function(){})},W().then(function(){return z()}).then(function(t){var n=yt(e._sdkOpts(),{deviceId:t});return e.configMgr.getSigningConfig().then(function(t){return e.configMgr.fetchAndDecryptConfig().then(function(r){function o(e){return!a||-1!==a.indexOf(e)}function i(t){return o(t)&&!e._isAutoDisabled(t)}var a=r.eventCodes&&r.eventCodes.length>0?r.eventCodes:null,s=function(t){return t.then(function(t){return delete t._sessionInfo,e.batcher.enqueueAssembled(t,"")})};return e._replayPendingSummaries(n,t,s).then(function(){function r(t){if(!a&&(a=!0,i("app_session_summary"))){var n=function(e){var t,n,r=Date.now()||Date.now(),o=j();return o?(t=U(o,e||"web_visibility_hidden",r),"web_visibility_hidden"!==e&&"app_exit"!==e||(t.sessionEndTs=r),V(n=N(r)),{endedSession:t,sid:n.sid}):null}(t);n&&n.endedSession&&e._handleEndedSession(n.endedSession).catch(function(){})}}var a,c,u,l,d,p,_,f,h,g,m,y,v,w,k,b,C,S,P,E;i("sdk_init")&&s(function(e,t){var n,r=ln||{},o={},i=Object.keys(r);for(n=0;i.length>n;n++)o[i[n]]=r[i[n]];return ze(e,{event:"sdk_init",payload:o},t)}(n,t)).catch(function(){}),i("app_lifecycle")&&(e._webLoadTeardown=function(e,t,n){function r(){i||(i=!0,a&&(window.removeEventListener("load",a,!1),a=null),e(et(t,Ln,{},n)).catch(function(){}))}function o(){(function(){var e,t,n;try{if("undefined"!=typeof performance&&performance.timing&&(e=performance.timing).loadEventEnd&&e.navigationStart&&e.loadEventEnd>0)return!0;if("undefined"!=typeof performance&&"function"==typeof performance.getEntriesByType&&(t=performance.getEntriesByType("navigation"))&&t.length>0&&(n=t[0]).loadEventEnd>0&&n.fetchStart>=0)return!0}catch(r){}return!1})()&&r()}var i,a;return"undefined"==typeof window?(e(et(t,Ln,{},n)).catch(function(){}),function(){}):(i=!1,a=null,"complete"===document.readyState?(o(),i||r(),function(){}):(a=function(){o(),i||r()},window.addEventListener("load",a,!1),setTimeout(function(){i||r()},1e4),function(){i=!0,a&&(window.removeEventListener("load",a,!1),a=null)}))}(s,n,t)),a=!1,e._autoLifecycleTeardown=(u=function(e,r){return i("app_lifecycle")?s(et(n,e,r||{},t)):Promise.resolve()},"undefined"==typeof window||"undefined"==typeof document?function(){}:(d=!0===(l={onHidden:function(){e.batcher.flush().catch(function(){})},onPageUnload:function(){e.batcher.flush().catch(function(){}),r("app_exit")},onPageHide:function(){e.batcher.flush().catch(function(){}),r("web_visibility_hidden")}}||{}).webMode,p=function(){"visible"===document.visibilityState?d?l.onVisible&&l.onVisible():u(Rn,{}):"hidden"===document.visibilityState&&(d?l.onVisibleHidden&&l.onVisibleHidden():u(qn,{}),l.onHidden&&l.onHidden())},_=function(){u(Bn,Ze()),l.onPageUnload&&l.onPageUnload()},f=function(e){e&&e.persisted||l.onPageHide&&l.onPageHide()},window.addEventListener("visibilitychange",p,!1),window.addEventListener("beforeunload",_,!1),window.addEventListener("pagehide",f,!1),function(){window.removeEventListener("visibilitychange",p,!1),window.removeEventListener("beforeunload",_,!1),window.removeEventListener("pagehide",f,!1)})),e._autoNetworkTeardown="undefined"==typeof navigator?function(){}:(C=navigator.connection||navigator.mozConnection||navigator.webkitConnection)?(S="unknown",P=C.type?C.type+"":"",E="boolean"==typeof navigator.onLine?navigator.onLine:null,C.onchange=function(){var e,r,o,a,c,u,l,d=C.type?C.type+"":"",p="boolean"==typeof navigator.onLine?navigator.onLine:null;(d!==P||p!==E)&&(P=d,E=p,a="boolean"==typeof(r=p)?r?1:0:-1,"none"==(o=(d||"")+"")&&1===a?o="unknown":o&&"none"!==o&&"unknown"!==o&&0===a&&(a=1),l=nt({network_type:S,from_network_type:S,to_network_type:S,is_online:(e={connection_type:o,is_online:a}).is_online,change_count_in_sid:(Sn.networkChangeCount||0)+1},(u={},(c=e.connection_type)?u.connection_type=c+"":C.type&&(u.connection_type=C.type+""),C.effectiveType&&(u.effective_type=C.effectiveType+""),null!=C.downlink&&(u.downlink=Math.round(1e3*C.downlink)),null!=C.rtt&&(u.rtt=C.rtt),u)),i("network_state_change")?s(function(e,t,n){return ze(e,{event:"network_state_change",payload:t||{}},n)}(n,l,t)):Promise.resolve())},function(){C.onchange=null}):function(){},e._webInteractionTeardown="undefined"==typeof window||"undefined"==typeof document?function(){}:(h=function(e){!e||e.repeat||e.isComposing||(we(),de(),Sn.keydownTotalCount++,_e())},g=function(e){var t,n=e&&e.target;(function(t){if(!t||1!==t.nodeType)return!1;var n=((t.tagName||"")+"").toLowerCase();if("input"===n||"textarea"===n)return!0;try{if(t.isContentEditable)return!0}catch(e){}return!1})(n)&&(t=Date.now(),Kn===n&&50>t-Vn||(Kn=n,Vn=t,we(),de(),Sn.inputCount++,_e()))},m=function(e){(function(t){if(!t||1!==t.nodeType)return!1;var n=((t.tagName||"")+"").toLowerCase();if("input"===n||"textarea"===n||"select"===n)return!0;try{if(t.isContentEditable)return!0}catch(e){}return!1})(e&&e.target)&&(we(),de(),Sn.focusTotalCount++,_e())},y=function(){ke()},v=function(e){e&&e.changedTouches&&e.changedTouches.length&&(we(),de(),Sn.touchTotalCount++,_e(),e.touches&&1===e.touches.length?(jn=e.touches[0].clientX,Nn=e.touches[0].clientY,Fn=Date.now(),ot(),Un=!1,Hn=setTimeout(function(){Un=!0,de(),Sn.longPressTotalCount++,_e()},500)):(Fn=0,ot()),e.touches&&2===e.touches.length&&(Xn=rt(e.touches),Yn=!1))},w=function(e){var t,n,r;e&&e.touches&&(1===e.touches.length&&Fn>0&&Math.sqrt((t=e.touches[0].clientX-jn)*t+(n=e.touches[0].clientY-Nn)*n)>8&&ot(),2===e.touches.length&&(r=rt(e.touches),null==Xn||Yn||12>Math.abs(r-Xn)||(de(),Sn.pinchTotalCount++,_e(),Yn=!0),Xn=r))},k=function(e){var t,n;ot(),Fn>0&&e.changedTouches&&e.changedTouches.length&&!Un&&(30>Math.sqrt((t=e.changedTouches[0].clientX-jn)*t+(n=e.changedTouches[0].clientY-Nn)*n)||(de(),Sn.swipeTotalCount++,_e())),Fn=0,Un=!1,e.touches&&e.touches.length>=2||(Xn=null,Yn=!1)},b=function(){ot(),Fn=0,Un=!1,Xn=null,Yn=!1},document.addEventListener("keydown",h,!1),document.addEventListener("input",g,!1),document.addEventListener("focusin",m,!1),window.addEventListener("orientationchange",y,!1),document.addEventListener("touchstart",v,!1),document.addEventListener("touchmove",w,!1),document.addEventListener("touchend",k,!1),document.addEventListener("touchcancel",b,!1),ke(),function(){document.removeEventListener("keydown",h,!1),document.removeEventListener("input",g,!1),document.removeEventListener("focusin",m,!1),window.removeEventListener("orientationchange",y,!1),document.removeEventListener("touchstart",v,!1),document.removeEventListener("touchmove",w,!1),document.removeEventListener("touchend",k,!1),document.removeEventListener("touchcancel",b,!1),ot()}),(o("app_page_view")||o("page_click"))&&(c=i("app_page_view"),e._pageTrackerTeardown=function(e){function t(){if(c.resolvePageKey)try{var e=c.resolvePageKey();if(e)return Ae(e+"")}catch(t){}return Oe()}function n(){var e,n=t(),r=Ue({previousPageKey:l,previousPageName:d,pageKey:n});l=n,d=r.page_name,Mn=n,In=r.page_name||"",u&&(e=ne(),function(e,t,n,r){de(),Sn.eventCountTotal++,Sn.lastEventName="app_page_view",Sn.pageViewCount++;var o=(e||"")+"";o&&(Sn.pageKeys[o]=1),Ce(o,t,n,r),_e()}(n,r.page_name,Math.floor(Date.now()/1e3),e),r._pageSeqPrealloc=e,r._metricsRecorded=1,c.onPageView&&c.onPageView(r))}function r(){var e,t,n,r,o=Date.now();200>o-En||(En=o,(e=Le())&&(n=(t=e.scrollTop||0)-Tn,Tn=t,r=function(){var e,t,n;try{return(e=Le())?(t=Math.max(0,(e.scrollHeight||0)-(e.clientHeight||0)))>0?{depthPercent:Math.min(100,Math.max(0,Math.round((n=e.scrollTop||0)/t*100))),atBottom:n>=t-8}:{depthPercent:0,atBottom:!0}:{depthPercent:0,atBottom:!1}}catch(r){return{depthPercent:0,atBottom:!1}}}(),c.onScroll&&c.onScroll(n,r.depthPercent,r.atBottom)))}function o(e){var n,r,o,i;e&&0>=e.button&&((n=e.target)&&"function"==typeof n.closest&&n.closest("[data-sdk-no-auto-click]")||(r=null!=e.clientX?e.clientX:0,o=null!=e.clientY?e.clientY:0,i=Fe(e),setTimeout(function(){if(!function(e,t){var n,r;for(function(e){for(var t=xn.length-1;t>=0;t--)e-xn[t].t>300&&xn.splice(t,1)}(Date.now()),n=0;xn.length>n;n++)if(10>=Math.abs((r=xn[n]).x-e)&&10>=Math.abs(r.y-t))return!0;return!1}(r,o)){we();var e,n,a,s,u,p=(e={pageKey:l||t(),pageName:d,previousPageKey:l},n=i,s=Ae((a=e||{}).pageKey||Oe()),u=Fe(n),xe({page_key:s,page_name:a.pageName||"undefined"!=typeof document&&document.title||s,recommend_trace_id:"",referrer_page_key:a.previousPageKey||"",is_sdk_auto_collected:1,_clickSnap:u},He(u)));c.onPageClick&&c.onPageClick(p)}},50)))}function i(){Te(),n()}function a(e){e&&e.persisted&&n()}function s(){var e,t,r=Le();Tn=r&&r.scrollTop||0,n(),!p&&window.history&&(p=!0,e=history.pushState,t=history.replaceState,history.pushState=function(){var t=e.apply(history,arguments);return Te(),setTimeout(n,0),t},history.replaceState=function(){var e=t.apply(history,arguments);return Te(),setTimeout(n,0),e},window.addEventListener("popstate",i,!1))}var c,u,l,d,p;return"undefined"==typeof window||"undefined"==typeof document?function(){}:(u=!1!==(c=e||{}).enableAutoPageView,l="",d="",p=!1,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",s,!1):s(),window.addEventListener("pageshow",a,!1),window.addEventListener("scroll",r,!1),document.addEventListener("click",o,!0),function(){document.removeEventListener("click",o,!0),window.removeEventListener("scroll",r,!1),window.removeEventListener("pageshow",a,!1),window.removeEventListener("popstate",i,!1),document.removeEventListener("DOMContentLoaded",s,!1)})}({resolvePageKey:e.options.pageKeyResolver,enableAutoPageView:c,onPageView:function(t){c&&e.batcher.track({event:"app_page_view",payload:t},"").catch(function(){})},onPageClick:function(t){i("page_click")&&e.batcher.track({event:"page_click",payload:t},"").catch(function(){})},onScroll:function(e,t,n){!function(e,t,n){var r,o;de(),8>(r=Math.abs(e))||(Sn.hasScrolled||(Sn.hasScrolled=!0,Sn.firstScrollDelayMs=Math.max(0,Date.now()-Pn)),Sn.scrollTotalCount++,Sn.scrollTotalDistance+=r,o=e>0?1:-1,0!==Sn.lastScrollDirection&&o!==Sn.lastScrollDirection&&Sn.scrollDirectionChangeCount++,Sn.lastScrollDirection=o,0>e?Sn.scrollUpCount++:e>0&&Sn.scrollDownCount++,null!=t&&(Sn.maxScrollDepthPercent=Math.max(Sn.maxScrollDepthPercent,Math.min(100,Math.max(0,Math.round(t))))),n&&(Sn.isReachBottom=1),_e())}(e,t,n)}})),e._sessionPollTimer&&clearInterval(e._sessionPollTimer),e._sessionPollTimer=setInterval(function(){var t=X();t.endedSession&&e._handleEndedSession(t.endedSession).catch(function(){})},6e4)})})})}).catch(function(){})}},bt.prototype._init=function(e){var t,n,r;if(this._ssrSkipped)return this._buildInitReturn();for(t=Object.keys(e||{}),n=0;t.length>n;n++)this.options[t[n]]=e[t[n]];return null==this.options.channel&&(this.options.channel=""),this._disableAutoEvents=vt(this.options.disableAutoEvents),this.options.disableAutoEvents=wt(this._disableAutoEvents),this.configMgr.setEncryptedConfig(this.options.encryptedConfig||this.options.configCipher||""),this.configMgr.prewarm(),r=this,this.resolver.init(function(){return r.configMgr.getBatchEndpoints()}),this._refreshTimer&&clearInterval(this._refreshTimer),this._refreshTimer=setInterval(function(){r.refreshConfig()},12e5),this._unsubReady&&this._unsubReady(),this._unsubReady=this.resolver.onEndpointReady(function(){r.batcher.flush().catch(function(){})}),this._buildInitReturn()},bt.prototype.refreshConfig=function(){var e=this;return this.configMgr.forceRefresh(),this.resolver.refreshDomainConfig(function(){return e.configMgr.getBatchEndpoints()}).catch(function(){})},bt.prototype.track=function(e,t){return this._ssrSkipped?Promise.resolve({sent:!1,ok:!0,status:0,reason:"ssr_skipped"}):this.batcher.track(e,t)},bt.prototype.setContext=function(e){if(this._ssrSkipped)return this.getConfig();var t=e&&"object"==typeof e?e:{};return Object.prototype.hasOwnProperty.call(t,"uid")&&(this.options.uid=null==t.uid?"":t.uid+""),Object.prototype.hasOwnProperty.call(t,"channel")&&(this.options.channel=null==t.channel?"":t.channel+""),this.batcher.opts=yt(this.options),this.getConfig()},bt.prototype.setUid=function(e){return this.setContext({uid:e})},bt.prototype.getSelectedHost=function(){var e,t;return this._ssrSkipped||!this.resolver?"":(e=this.resolver.getSelectedBatchEndpoint())&&(t=/^(https?:\/\/[^/]+)/.exec(e))?t[1]:""},bt.prototype._buildInitReturn=function(){return this._ssrSkipped||!this.batcher?{selectedHost:"",version:zn}:yt(this.batcher.getConfig(),{selectedHost:this.getSelectedHost(),version:zn})},bt.prototype.getConfig=function(){if(this._ssrSkipped||!this.batcher)return yt(this.options,{selectedHost:"",selectedBatchEndpoint:"",version:zn});var e=yt(this.options,this.batcher.getConfig(),{selectedHost:this.getSelectedHost(),selectedBatchEndpoint:this.resolver.getSelectedBatchEndpoint(),version:zn});return delete e.encryptedConfig,delete e.configCipher,e},bt.prototype.flush=function(){return this._ssrSkipped?Promise.resolve():this.batcher.flush()},bt.prototype.refreshDomainConfig=function(){if(this._ssrSkipped)return Promise.resolve({selectedBatchEndpoint:"",selectedHost:"",version:zn});var e=this;return this.resolver.refreshDomainConfig(function(){return e.configMgr.getBatchEndpoints()}).then(function(t){return{selectedBatchEndpoint:t,selectedHost:e.getSelectedHost(),version:zn}})},bt.prototype.stop=function(){this._ssrSkipped||(this._sessionPollTimer&&(clearInterval(this._sessionPollTimer),this._sessionPollTimer=null),this._pageTrackerTeardown&&(this._pageTrackerTeardown(),this._pageTrackerTeardown=null),this._webInteractionTeardown&&(this._webInteractionTeardown(),this._webInteractionTeardown=null),this._webLoadTeardown&&(this._webLoadTeardown(),this._webLoadTeardown=null),this._autoLifecycleTeardown&&(this._autoLifecycleTeardown(),this._autoLifecycleTeardown=null),this._autoNetworkTeardown&&(this._autoNetworkTeardown(),this._autoNetworkTeardown=null),this._unsubReady&&(this._unsubReady(),this._unsubReady=null),this._refreshTimer&&(clearInterval(this._refreshTimer),this._refreshTimer=null),this.batcher.stop())},Vt=null,jt=[],Nt=null,(Ft=Pt).setContext=function(e){return Ct().setContext(e)},Ft.setUid=function(e){return Ct().setUid(e)},Ft.setChannel=function(e){return Ct().setContext({channel:e})},Ft.notifyPageLoad=function(){!function(){if(on=null,B())try{window.sessionStorage.removeItem($t),window.sessionStorage.removeItem(Zt)}catch(e){}}(),X(Date.now())},Ft.debugInvalidateSessionCache=function(){G()},Ft.debugForceEnsureSession=function(){var e,t;return G(),e=X(),t=Ct(),e.endedSession&&t._handleEndedSession(e.endedSession).catch(function(){}),e},Ft.getConfig=function(){return Ct().getConfig()},Ft.flush=function(){return Ct().flush()},Ft.refreshDomainConfig=function(){return Ct().refreshDomainConfig()},Ft.stop=function(){Vt?(Vt.stop(),Vt=null):jt.length=0},Ft.version=zn,Ft.getCommonFields=function(e){var r=Vt?Vt.getConfig():{};return W().then(function(){return z().then(function(o){var i,a,s,c,u=I({appId:r.appId,channel:r.channel,uid:r.uid,deviceId:r.deviceId||o,sid:(c=Y(),c||X().sid),deviceType:t(),deviceBrand:"",deviceModel:"",deviceFingerprint:J(),fpVersion:Q(),sdkVersion:zn,appVersion:n(r.appVersion)});if(!Array.isArray(e)||!e.length)return u;for(i={},a=0;e.length>a;a++)(s=((e[a]||"")+"").trim())&&(i[s]=Object.prototype.hasOwnProperty.call(u,s)?u[s]:"");return i})})},Ft.getCommonField=function(e){var t=((e||"")+"").trim();return t?Ft.getCommonFields([t]).then(function(e){return e[t]}):Promise.resolve("")},Ft.init=function(e){var t,n,r,o;return Vt&&(t=Vt,Vt=null,t.flush().catch(function(){}).then(function(){t.stop()})),n=new bt(e),Vt=n,o=St(jt.splice(0),n,0).then(function(){Nt===r&&(Nt=null)},function(){Nt===r&&(Nt=null)}),Nt=r=o,yt(n._buildInitReturn(),{track:Ft.track,setContext:Ft.setContext,setUid:Ft.setUid,setChannel:Ft.setChannel,notifyPageLoad:Ft.notifyPageLoad,getCommonFields:Ft.getCommonFields,getCommonField:Ft.getCommonField})},Ht=function(){return Lt("[sdk][web] 非法上报:禁止直接调用 WebSDK.track({...}),请使用 WebSDK.track.videoEvent({...}) 等具名方法"),Promise.resolve({sent:!1,ok:!1,status:0,reason:"direct_track_forbidden"})},Object.keys(Ot).forEach(function(e){var t=Ot[e];Ht[e]=function(n,r){try{return Pt(t(n),r)}catch(o){if(o&&"EventValidationError"===o.name)return Promise.resolve({sent:!1,ok:!1,status:0,reason:"event_validation_failed",event:o.eventMethod||e,missingFields:o.missingFields||[],typeErrorFields:o.typeErrorFields||[]});throw o}}}),Ft.track="undefined"!=typeof Proxy?new Proxy(Ht,{get:function(e,t){return"string"!=typeof t||t in e||!/^[a-z]/.test(t)?e[t]:function(){return Lt('[sdk][web] 未知上报事件 "'+t+'",该方法不存在,事件未上报'),Promise.resolve({sent:!1,ok:!1,status:0,reason:"unknown_event_method",method:t})}}}):Ht,"undefined"!=typeof globalThis)try{globalThis.WebSDK=Ft}catch(er){}else"undefined"!=typeof window&&(window.WebSDK=Ft);return Ft}); diff --git a/app/static/css/accountShared.css b/app/static/css/accountShared.css deleted file mode 100644 index 29fd433..0000000 --- a/app/static/css/accountShared.css +++ /dev/null @@ -1,1620 +0,0 @@ -:root { - --account-bg: #0f0f0f; - --account-panel: rgba(255, 255, 255, 0.05); - --account-line: rgba(255, 255, 255, 0.1); - --account-primary: #ec237f; - --account-secondary: rgba(255, 255, 255, 0.55); -} - -.account-mobile-breadcrumb { - display: none; -} - -.account-label-mobile { - display: none; -} - -.deposit-payment-data { - position: absolute; - width: 1px; - height: 1px; - overflow: hidden; - clip: rect(0 0 0 0); - clip-path: inset(50%); -} - -.deposit-main, -.deposit-mobile-buy { - display: none; -} - -@media (min-width: 768px) { - body.site-shell .footer-brand { - flex-direction: row; - align-items: center; - } - - body.site-shell .footer-brand .footer-muted-text { - max-width: min(600px, 31.25vw); - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - - body.is-user-center-page, - body.is-deposit-page, - body.is-collect-page, - body.is-history-page, - body.is-setting-page, - body.is-edit-profile-page, - body.is-edit-password-page { - --account-s: min(1, 100vw / 1920px); - --deposit-s: var(--account-s); - background: var(--account-bg); - } - - /* —— 个人中心 —— */ - .user-center-layout .user-center-page { - width: 100%; - min-height: 0; - padding: calc(36px * var(--account-s)) calc(60px * var(--account-s)); - gap: calc(24px * var(--account-s)); - background: var(--account-bg); - box-sizing: border-box; - } - - .user-center-layout .user-center-pc { - width: 100%; - max-width: calc(1800px * var(--account-s)); - margin: 0 auto; - gap: calc(24px * var(--account-s)); - } - - .user-center-layout .user-center-head { - gap: calc(12px * var(--account-s)); - } - - .user-center-layout .user-center-eyebrow { - color: var(--account-primary); - font-size: calc(12px * var(--account-s)); - line-height: calc(18px * var(--account-s)); - } - - .user-center-layout .user-center-title, - .user-center-layout .user-center-title--logged { - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - .user-center-layout .user-center-desc { - color: var(--account-secondary); - font-size: calc(14px * var(--account-s)); - line-height: calc(20px * var(--account-s)); - } - - .user-center-layout .user-center-profile { - height: calc(148px * var(--account-s)); - min-height: calc(148px * var(--account-s)); - padding: calc(32px * var(--account-s)) calc(28px * var(--account-s)); - gap: calc(12px * var(--account-s)); - background: var(--account-panel); - border-radius: calc(24px * var(--account-s)); - } - - .user-center-layout .user-center-profile-info { - width: calc(230px * var(--account-s)); - gap: calc(12px * var(--account-s)); - } - - .user-center-layout .user-center-coin-card { - width: calc(343px * var(--account-s)); - height: calc(81px * var(--account-s)); - padding: calc(15px * var(--account-s)) calc(16px * var(--account-s)) calc(15px * var(--account-s)) calc(26px * var(--account-s)); - flex-direction: row; - justify-content: space-between; - align-items: center; - gap: calc(8px * var(--account-s)); - border: 0; - border-radius: calc(18px * var(--account-s)); - background: url('/static/images/figma-account/balance-card.svg') center/100% 100% no-repeat; - } - - .user-center-layout .user-center-coin-copy { - display: flex; - flex-direction: column; - gap: calc(4px * var(--account-s)); - } - - .user-center-layout .user-center-coin-label { - color: transparent; - background: linear-gradient(90deg, #ff9365 0%, #ffd8bc 100%); - -webkit-background-clip: text; - background-clip: text; - font-family: "Alimama FangYuanTi VF", "PingFang SC", sans-serif; - font-size: calc(16px * var(--account-s)); - line-height: calc(18px * var(--account-s)); - font-weight: 600; - } - - .user-center-layout .user-center-coin-label small { - color: transparent; - background: linear-gradient(90deg, #ff9365 0%, #ffd8bc 100%); - -webkit-background-clip: text; - background-clip: text; - font-size: calc(10px * var(--account-s)); - font-weight: 400; - } - - .user-center-layout .user-center-coin-value { - color: #fff; - font-family: "Arial Narrow", sans-serif; - font-size: calc(24px * var(--account-s)); - line-height: 1; - font-weight: 800; - } - - .user-center-layout .user-center-coin-action { - position: relative; - width: calc(72px * var(--account-s)); - height: calc(30px * var(--account-s)); - margin-right: calc(5px * var(--account-s)); - border-radius: 0; - background: none; - color: transparent; - font-size: 0; - line-height: 0; - display: block; - flex: 0 0 auto; - object-fit: contain; - object-position: center right; - } - - .user-center-layout .user-center-profile-name { - font-size: calc(18px * var(--account-s)); - line-height: calc(24px * var(--account-s)); - font-weight: 600; - } - - .user-center-layout .user-center-login-banner { - min-height: calc(178px * var(--account-s)); - padding: calc(28px * var(--account-s)) calc(32px * var(--account-s)); - gap: calc(14px * var(--account-s)); - background: var(--account-panel); - } - - .user-center-layout .user-center-login-title { - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - .user-center-layout .user-center-login-btn { - background: var(--account-primary); - color: #fff; - } - - .user-center-layout .user-center-login-arrow { - display: none; - } - - .user-center-layout .user-center-feature { - height: calc(120px * var(--account-s)); - padding: calc(18px * var(--account-s) - 1px) calc(22px * var(--account-s) - 1px); - gap: calc(6px * var(--account-s)); - border-radius: calc(20px * var(--account-s)); - } - - .user-center-layout .user-center-feature-title { - font-size: calc(18px * var(--account-s)); - line-height: calc(24px * var(--account-s)); - font-weight: 600; - } - - .user-center-layout .user-center-feature-desc { - color: var(--account-secondary); - font-size: calc(12px * var(--account-s)); - line-height: calc(18px * var(--account-s)); - } - - .deposit-layout .deposit-page { - width: 100%; - flex: 1 0 auto; - min-height: 0; - padding: calc(36px * var(--account-s)) calc(60px * var(--account-s)); - background: var(--account-bg); - align-items: center; - gap: calc(24px * var(--account-s)); - box-sizing: border-box; - } - - .deposit-layout .deposit-pc { - width: 100%; - max-width: calc(1800px * var(--account-s)); - margin: 0 auto; - display: flex; - flex-direction: column; - align-items: center; - gap: calc(24px * var(--account-s)); - } - - .deposit-layout .deposit-breadcrumb, - .deposit-layout .deposit-head, - .deposit-layout .deposit-hero, - .deposit-layout .deposit-purchase-title, - .deposit-layout .deposit-package-panel, - .deposit-layout .deposit-transactions { - align-self: stretch; - } - - .deposit-layout .deposit-breadcrumb, - .setting-layout .setting-breadcrumb, - .collect-layout .collect-breadcrumb, - .history-layout .history-breadcrumb { - height: auto; - overflow: hidden; - gap: calc(8px * var(--account-s)); - font-size: calc(12px * var(--account-s)); - line-height: calc(18px * var(--account-s)); - } - - .deposit-layout .deposit-breadcrumb-link, - .deposit-layout .deposit-breadcrumb-sep { - color: var(--account-secondary); - font-weight: 400; - } - - .deposit-layout .deposit-breadcrumb-link { - font-weight: 500; - } - - .deposit-layout .deposit-breadcrumb-current { - color: var(--account-primary); - font-weight: 400; - } - - .deposit-layout .deposit-head { - gap: calc(12px * var(--account-s)); - overflow: hidden; - } - - .deposit-layout .deposit-eyebrow { - color: var(--account-primary); - font-size: calc(12px * var(--account-s)); - font-weight: 400; - line-height: calc(18px * var(--account-s)); - } - - .deposit-layout .deposit-title { - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - .deposit-layout .deposit-subtitle, - .deposit-layout .deposit-hero-desc { - color: var(--account-secondary); - font-size: calc(14px * var(--account-s)); - line-height: calc(20px * var(--account-s)); - font-weight: 400; - } - - .deposit-layout .deposit-hero { - width: 100%; - height: auto; - min-height: 0; - padding: calc(36px * var(--account-s)) calc(32px * var(--account-s)); - gap: calc(12px * var(--account-s)); - border: 1px solid var(--account-line); - border-radius: calc(20px * var(--account-s)); - background: var(--account-panel); - overflow: hidden; - box-sizing: border-box; - } - - .deposit-layout .deposit-hero-badge { - color: var(--account-primary); - width: auto; - height: auto; - padding: 0; - background: transparent; - border-radius: 0; - font-size: calc(12px * var(--account-s)); - font-weight: 400; - line-height: calc(18px * var(--account-s)); - } - - .deposit-layout .deposit-hero-title, - .deposit-layout .deposit-section-title { - margin: 0; - color: #fff; - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - .deposit-package-panel { - width: 100%; - padding: calc(36px * var(--account-s)) calc(20px * var(--account-s)); - display: flex; - flex-direction: column; - gap: calc(16px * var(--account-s)); - border: 1px solid var(--account-line); - border-radius: calc(20px * var(--account-s)); - background: var(--account-panel); - overflow: hidden; - box-sizing: border-box; - } - - .deposit-package-heading { - display: inline-flex; - align-items: center; - gap: calc(10px * var(--account-s)); - overflow: hidden; - } - - .deposit-package-heading strong { - color: #fff; - font-size: calc(16px * var(--account-s)); - font-weight: 600; - line-height: calc(22px * var(--account-s)); - } - - .deposit-package-heading span { - color: var(--account-secondary); - font-size: calc(12px * var(--account-s)); - font-weight: 400; - line-height: calc(18px * var(--account-s)); - } - - .deposit-package-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: calc(12px * var(--account-s)); - align-self: stretch; - } - - .deposit-layout .deposit-package { - position: relative; - width: auto; - min-width: 0; - height: calc(128px * var(--account-s)); - min-height: calc(128px * var(--account-s)); - padding: calc(16px * var(--account-s)) calc(18px * var(--account-s)); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: calc(12px * var(--account-s)); - border: 1px solid var(--account-line); - border-radius: calc(20px * var(--account-s)); - background: var(--account-panel); - color: #fff; - text-align: left; - overflow: hidden; - box-sizing: border-box; - } - - .deposit-layout .deposit-package--active { - border: 2px solid var(--account-primary); - } - - .deposit-layout .deposit-package-price { - color: #fff; - font-size: calc(24px * var(--account-s)); - font-weight: 600; - line-height: calc(32px * var(--account-s)); - } - - .deposit-layout .deposit-package-name { - color: #fff; - font-size: calc(18px * var(--account-s)); - line-height: calc(24px * var(--account-s)); - font-weight: 600; - } - - .deposit-layout .deposit-package-hint { - color: var(--account-secondary); - font-size: calc(12px * var(--account-s)); - font-weight: 400; - line-height: calc(18px * var(--account-s)); - } - - .deposit-layout .deposit-package-check { - position: absolute; - top: calc(16px * var(--account-s)); - right: calc(18px * var(--account-s)); - width: calc(24px * var(--account-s)); - height: calc(24px * var(--account-s)); - border-radius: 50%; - background: var(--account-primary); - color: #fff; - font-size: calc(12px * var(--account-s)); - font-weight: 500; - line-height: calc(18px * var(--account-s)); - display: none; - align-items: center; - justify-content: center; - } - - .deposit-layout .deposit-package--active .deposit-package-check { - display: flex; - } - - .deposit-layout .deposit-pc-submit { - width: min(calc(964px * var(--account-s)), 100%); - height: calc(56px * var(--account-s)); - min-height: 48px; - border: 0; - border-radius: calc(28px * var(--account-s)); - background: var(--account-primary); - color: #fff; - font-size: calc(18px * var(--account-s)); - font-weight: 600; - line-height: calc(24px * var(--account-s)); - cursor: pointer; - } - - .deposit-layout .deposit-selected-note { - margin: 0; - color: var(--account-secondary); - font-size: calc(14px * var(--account-s)); - font-weight: 400; - line-height: calc(20px * var(--account-s)); - text-align: center; - } - - .deposit-transactions { - width: 100%; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: calc(16px * var(--account-s)); - overflow: hidden; - } - - .deposit-layout .deposit-tx-list { - align-self: stretch; - padding: calc(24px * var(--account-s)); - gap: calc(18px * var(--account-s)); - border: 0; - border-radius: calc(20px * var(--account-s)); - background: var(--account-panel); - overflow: hidden; - } - - .deposit-layout .deposit-tx-item { - width: 100%; - height: auto; - min-height: 0; - padding: 0; - overflow: hidden; - } - - .deposit-layout .deposit-tx-item + .deposit-tx-item { - padding-top: calc(18px * var(--account-s)); - border-top: 1px solid rgba(255, 255, 255, 0.05); - } - - .deposit-layout .deposit-tx-info { - gap: calc(12px * var(--account-s)); - } - - .deposit-layout .deposit-tx-name { - color: #fff; - font-size: calc(14px * var(--account-s)); - font-weight: 500; - line-height: calc(20px * var(--account-s)); - } - - .deposit-layout .deposit-tx-time { - color: var(--account-secondary); - font-size: calc(12px * var(--account-s)); - font-weight: 400; - line-height: calc(18px * var(--account-s)); - } - - .deposit-layout .deposit-tx-amount { - font-size: calc(16px * var(--account-s)); - font-weight: 600; - line-height: calc(22px * var(--account-s)); - } - - .deposit-layout .deposit-tx-amount--plus { - color: #0abe75; - } - - .deposit-layout .deposit-tx-amount--minus { - color: #ef4444; - } - - .deposit-layout .deposit-main, - .deposit-layout .deposit-mobile-buy { - display: none; - } - - /* —— 账号设置 / 编辑资料 / 改密 —— */ - .setting-layout .setting-breadcrumb, - .collect-layout .collect-breadcrumb, - .history-layout .history-breadcrumb, - .edit-profile-layout .setting-breadcrumb, - .edit-password-layout .edit-password-breadcrumb { - height: auto; - overflow: hidden; - gap: calc(8px * var(--account-s)); - font-size: calc(12px * var(--account-s)); - line-height: calc(18px * var(--account-s)); - } - - .setting-layout .setting-breadcrumb-link, - .setting-layout .setting-breadcrumb-sep, - .collect-layout .collect-breadcrumb-link, - .collect-layout .collect-breadcrumb-sep, - .history-layout .history-breadcrumb-link, - .history-layout .history-breadcrumb-sep, - .edit-profile-layout .setting-breadcrumb-link, - .edit-profile-layout .setting-breadcrumb-sep, - .edit-password-layout .edit-password-breadcrumb-link, - .edit-password-layout .edit-password-breadcrumb-sep { - color: var(--account-secondary); - font-weight: 400; - } - - .setting-layout .setting-breadcrumb-link, - .collect-layout .collect-breadcrumb-link, - .history-layout .history-breadcrumb-link, - .edit-profile-layout .setting-breadcrumb-link, - .edit-password-layout .edit-password-breadcrumb-link { - font-weight: 500; - text-decoration: none; - } - - .setting-layout .setting-breadcrumb-current, - .collect-layout .collect-breadcrumb-current, - .history-layout .history-breadcrumb-current, - .edit-profile-layout .setting-breadcrumb-current, - .edit-password-layout .edit-password-breadcrumb-current { - color: var(--account-primary); - font-weight: 400; - } - - .setting-layout .setting-page { - width: 100%; - min-height: 0; - padding: calc(36px * var(--account-s)) calc(60px * var(--account-s)); - gap: calc(18px * var(--account-s)); - background: var(--account-bg); - box-sizing: border-box; - } - - .setting-layout .setting-pc, - .setting-layout .setting-main { - width: 100%; - max-width: calc(1800px * var(--account-s)); - margin-right: auto; - margin-left: auto; - } - - .setting-layout .setting-pc { - gap: calc(18px * var(--account-s)); - } - - .setting-layout .setting-head { - flex-direction: row; - align-items: center; - gap: calc(12px * var(--account-s)); - } - - .setting-layout .setting-title { - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - .setting-layout .setting-main { - height: auto; - min-height: calc(408px * var(--account-s)); - gap: calc(18px * var(--account-s)); - } - - .setting-layout .setting-panel { - flex: 1 1 0; - width: auto; - min-width: 0; - padding: calc(24px * var(--account-s)); - gap: calc(18px * var(--account-s)); - border-radius: calc(20px * var(--account-s)); - min-height: calc(408px * var(--account-s)); - } - - .setting-layout .setting-aside { - flex: 0 0 calc(326px * var(--account-s)); - width: calc(326px * var(--account-s)); - padding: calc(24px * var(--account-s)); - gap: calc(24px * var(--account-s)); - border-radius: calc(20px * var(--account-s)); - min-height: calc(408px * var(--account-s)); - box-sizing: border-box; - } - - .setting-layout .setting-avatar { - width: calc(84px * var(--account-s)); - height: calc(84px * var(--account-s)); - } - - .setting-layout .setting-save-btn { - width: calc(132px * var(--account-s)); - height: calc(44px * var(--account-s)); - border-radius: 999px; - background: var(--account-primary); - color: #fff; - } - - .setting-layout .setting-logout { - color: var(--account-primary); - border-color: var(--account-primary); - background: rgba(236, 35, 127, 0.05); - } - - .edit-profile-layout .edit-profile-page, - .edit-password-layout .edit-password-page { - width: 100%; - min-height: 0; - padding: calc(36px * var(--account-s)) calc(60px * var(--account-s)); - gap: calc(18px * var(--account-s)); - background: var(--account-bg); - align-items: center; - box-sizing: border-box; - } - - .edit-profile-layout .edit-profile-pc, - .edit-profile-layout .edit-profile-h5, - .edit-password-layout .edit-password-pc, - .edit-password-layout .edit-password-shell { - width: 100%; - max-width: calc(1800px * var(--account-s)); - margin: 0 auto; - } - - .edit-profile-layout .edit-profile-h5-nav, - .edit-password-layout .edit-password-nav { - display: none; - } - - .edit-profile-layout .edit-profile-pc, - .edit-password-layout .edit-password-pc { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: calc(14px * var(--account-s)); - } - - .edit-password-layout .edit-password-pc-title { - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - /* —— 收藏 / 历史 —— */ - .collect-layout .collect-page, - .history-layout .history-page { - width: 100%; - flex: 1 0 auto; - padding: calc(36px * var(--account-s)) calc(60px * var(--account-s)); - gap: calc(24px * var(--account-s)); - background: var(--account-bg); - box-sizing: border-box; - } - - .collect-layout .collect-pc, - .collect-layout .collect-main, - .history-layout .history-pc, - .history-layout .history-main { - width: 100%; - max-width: calc(1800px * var(--account-s)); - margin: 0 auto; - } - - .collect-layout .collect-pc, - .history-layout .history-pc { - gap: calc(24px * var(--account-s)); - } - - .collect-layout .collect-head, - .history-layout .history-head { - gap: calc(12px * var(--account-s)); - } - - .collect-layout .collect-title, - .history-layout .history-title { - font-size: calc(24px * var(--account-s)); - line-height: calc(32px * var(--account-s)); - font-weight: 600; - } - - .collect-layout .collect-tabs, - .history-layout .history-clear-btn { - display: none; - } - - .collect-layout .collect-grid, - .history-layout .history-grid { - width: 100%; - display: grid; - grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: calc(24px * var(--account-s)) calc(16px * var(--account-s)); - } - - .collect-layout .collect-card, - .history-layout .history-card.poster-card { - width: 100%; - height: auto; - min-width: 0; - border-radius: calc(18px * var(--account-s)); - overflow: hidden; - } - - .collect-layout .collect-card-cover, - .history-layout .history-card .poster-cover { - width: 100%; - aspect-ratio: 296 / 399; - height: auto; - border-radius: 0; - } - - .collect-layout .collect-card-body, - .history-layout .history-card .poster-card-body { - min-height: calc(120px * var(--account-s)); - padding: calc(12px * var(--account-s)) calc(10px * var(--account-s)); - background: var(--account-panel); - box-sizing: border-box; - } - - .history-layout .history-info { - display: none; - } -} - -@media (max-width: 767px) { - .account-label-pc { - display: none; - } - - .account-label-mobile { - display: inline; - } - body.site-shell.is-user-center-page, - body.site-shell.is-deposit-page, - body.site-shell.is-collect-page, - body.site-shell.is-history-page, - body.site-shell.is-setting-page, - body.site-shell.is-edit-profile-page, - body.site-shell.is-edit-password-page { - min-width: 0; - padding-top: calc(48px + env(safe-area-inset-top, 0px)); - background: var(--account-bg); - } - - body.is-user-center-page .site-header, - body.is-deposit-page .site-header, - body.is-collect-page .site-header, - body.is-history-page .site-header, - body.is-setting-page .site-header, - body.is-edit-profile-page .site-header, - body.is-edit-password-page .site-header { - display: flex !important; - position: fixed !important; - top: env(safe-area-inset-top, 0px) !important; - height: 48px !important; - min-height: 48px !important; - padding: 0 var(--site-shell-gutter) !important; - overflow: hidden !important; - } - - body.is-user-center-page .footer-box, - body.is-deposit-page .footer-box, - body.is-collect-page .footer-box, - body.is-history-page .footer-box, - body.is-setting-page .footer-box, - body.is-edit-profile-page .footer-box, - body.is-edit-password-page .footer-box, - body.is-user-center-page .home-mobile-footer, - body.is-deposit-page .home-mobile-footer, - body.is-collect-page .home-mobile-footer, - body.is-history-page .home-mobile-footer, - body.is-setting-page .home-mobile-footer, - body.is-edit-profile-page .home-mobile-footer, - body.is-edit-password-page .home-mobile-footer, - body.is-user-center-page .h5-tabbar, - body.is-deposit-page .h5-tabbar, - body.is-collect-page .h5-tabbar, - body.is-history-page .h5-tabbar, - body.is-setting-page .h5-tabbar, - body.is-edit-profile-page .h5-tabbar, - body.is-edit-password-page .h5-tabbar, - body.is-user-center-page .floating-action, - body.is-deposit-page .floating-action, - body.is-collect-page .floating-action, - body.is-history-page .floating-action, - body.is-setting-page .floating-action, - body.is-edit-profile-page .floating-action, - body.is-edit-password-page .floating-action, - body.is-user-center-page .download-fab, - body.is-deposit-page .download-fab, - body.is-collect-page .download-fab, - body.is-history-page .download-fab, - body.is-setting-page .download-fab { - display: none !important; - } - - .user-center-layout .user-center-page { - min-height: calc(100dvh - 48px); - padding: 0; - background: var(--account-bg); - } - - .user-center-layout .user-center-main { - display: flex; - align-items: center; - } - - .user-center-layout .user-center-mobile-profile { - width: calc(100% - 32px); - max-width: 343px; - height: 56px; - margin: 12px auto 0; - padding: 0; - gap: 12px; - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.06); - } - - .user-center-layout .user-center-mobile-body { - width: calc(100% - 32px); - max-width: 343px; - margin: 14px auto 0; - gap: 14px; - overflow: visible; - } - - .user-center-layout .user-center-mobile-menu { - border: 0; - } - - .deposit-layout .deposit-page { - min-height: calc(100dvh - 48px); - padding: 0 0 106px; - background: var(--account-bg); - overflow: visible; - } - - .deposit-layout .deposit-pc, - .deposit-layout .deposit-nav { - display: none; - } - - .deposit-layout .deposit-main { - width: 100%; - max-width: none; - padding: 12px 16px 0; - display: flex; - flex-direction: column; - gap: 18px; - box-sizing: border-box; - } - - .account-mobile-breadcrumb { - display: flex; - align-items: center; - gap: 8px; - color: var(--account-secondary); - font-size: 12px; - line-height: 18px; - } - - .account-mobile-breadcrumb a { - color: inherit; - text-decoration: none; - } - - .account-mobile-breadcrumb strong { - color: var(--account-primary); - font-weight: 400; - } - - body.is-collect-page .collect-page, - body.is-history-page .history-page { - min-height: calc(100dvh - 48px); - padding: 12px 16px 0; - gap: 14px; - background: var(--account-bg); - box-sizing: border-box; - } - - body.is-collect-page .collect-main, - body.is-history-page .history-main { - width: 100%; - max-width: none; - min-height: 0; - padding: 0; - gap: 0; - } - - body.is-history-page .history-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); - column-gap: 7px; - row-gap: 12px; - } - - .deposit-mobile-balance { - width: 100%; - height: 81px; - padding: 15px 26px; - border-radius: 18px; - background: url('/static/images/figma-account/deposit-balance-card.png') center/100% 100% no-repeat; - box-sizing: border-box; - } - - .deposit-mobile-balance-label { - color: #fff; - font-size: 14px; - font-weight: 600; - line-height: 20px; - } - - .deposit-mobile-balance-label small { - font-size: 10px; - font-weight: 400; - } - - .deposit-mobile-balance-value { - color: #fff; - font-family: "Arial Narrow", sans-serif; - font-size: 24px; - font-weight: 800; - line-height: 28px; - } - - .deposit-mobile-packages { - padding: 20px 12px; - display: flex; - flex-direction: column; - gap: 18px; - border: 1px solid rgba(255, 211, 153, 0.08); - border-radius: 24px; - background: rgba(35, 27, 21, 0.12); - box-sizing: border-box; - } - - .deposit-mobile-package-head { - display: flex; - align-items: center; - gap: 12px; - } - - .deposit-mobile-package-head strong { - color: #fff; - font-size: 16px; - font-weight: 500; - line-height: 22px; - } - - .deposit-mobile-package-head span { - color: rgba(255, 255, 255, 0.35); - font-size: 12px; - line-height: 18px; - } - - .deposit-mobile-package-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 18px 10px; - } - - .deposit-layout .deposit-mobile-pkg { - position: relative; - width: 100%; - height: 152px; - padding: 21px 8px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 8px; - border: 1px solid rgba(255, 211, 153, 0.2); - border-radius: 18px; - background: rgba(255, 255, 255, 0.05); - color: #fff; - box-sizing: border-box; - min-width: 0; - max-width: none; - justify-self: stretch; - } - - .deposit-layout .deposit-mobile-pkg--active { - border: 2px solid #febf8b; - background: linear-gradient(180deg, rgba(254, 190, 139, 0.3), rgba(254, 190, 139, 0.1)); - } - - .deposit-mobile-pkg img { - width: 24px; - height: 24px; - } - - .deposit-mobile-pkg-name { - font-size: 14px; - line-height: 20px; - } - - .deposit-mobile-pkg-hint { - max-width: 100%; - color: #999; - font-size: 12px; - line-height: 18px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .deposit-mobile-pkg-price { - font-size: 18px; - font-weight: 600; - line-height: 24px; - } - - .deposit-mobile-pkg-price small { - margin-right: 4px; - font-size: 12px; - font-weight: 400; - } - - .deposit-mobile-pkg-check { - position: absolute; - bottom: -9px; - left: 50%; - width: 20px; - height: 20px; - border-radius: 50%; - transform: translateX(-50%); - background: #febf8b; - color: #2d251e; - display: none; - align-items: center; - justify-content: center; - font-size: 13px; - font-weight: 700; - } - - .deposit-mobile-pkg--active .deposit-mobile-pkg-check { - display: flex; - } - - .deposit-usage { - display: flex; - flex-direction: column; - gap: 12px; - } - - .deposit-usage h2 { - margin: 0 2px; - color: #fff; - font-size: 16px; - font-weight: 500; - line-height: 22px; - } - - .deposit-usage-card { - padding: 20px 12px; - border: 1px solid rgba(255, 211, 153, 0.08); - border-radius: 24px; - background: rgba(35, 27, 21, 0.12); - } - - .deposit-usage-item { - min-height: 42px; - padding: 8px 4px; - display: flex; - align-items: flex-start; - gap: 12px; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - box-sizing: border-box; - } - - .deposit-usage-item:first-child { - padding-top: 0; - } - - .deposit-usage-item:last-child { - padding-bottom: 0; - border-bottom: 0; - } - - .deposit-usage-item img { - width: 24px; - height: 24px; - flex: 0 0 auto; - } - - .deposit-usage-item span { - min-width: 0; - display: flex; - flex-direction: column; - gap: 2px; - } - - .deposit-usage-item strong, - .deposit-usage-item small { - font-size: 12px; - line-height: 18px; - font-weight: 400; - } - - .deposit-usage-item strong { - color: #fff; - font-weight: 500; - } - - .deposit-usage-item small { - color: rgba(255, 255, 255, 0.4); - } - - .deposit-layout .deposit-mobile-buy { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 90; - height: 106px; - padding: 10px 16px 20px; - display: flex; - flex-direction: column; - gap: 8px; - background: var(--account-bg); - box-sizing: border-box; - } - - .deposit-mobile-buy button { - width: 100%; - height: 54px; - border: 0; - border-radius: 999px; - color: #171717; - background: linear-gradient(180deg, #fbc297, #fae1c0); - font-size: 16px; - font-weight: 600; - } - - .deposit-mobile-buy p { - margin: 0; - color: rgba(255, 255, 255, 0.4); - font-size: 12px; - line-height: 18px; - text-align: center; - } - - .deposit-mobile-buy a { - color: inherit; - } - - .collect-layout .collect-page, - .history-layout .history-page { - min-height: calc(100dvh - 48px); - padding: 12px 16px 0; - gap: 14px; - background: var(--account-bg); - box-sizing: border-box; - overflow: visible; - } - - .collect-layout .collect-pc, - .history-layout .history-pc { - width: 100%; - max-width: none; - display: block !important; - padding: 0; - } - - .collect-layout .collect-head, - .history-layout .history-head, - .collect-layout .collect-nav, - .history-layout .history-nav, - .collect-layout .collect-tabs, - .history-layout .history-clear-btn, - .collect-layout .collect-pagination, - .history-layout .history-pagination { - display: none !important; - } - - .collect-layout .collect-breadcrumb, - .history-layout .history-breadcrumb { - display: flex !important; - gap: 8px; - font-size: 12px; - line-height: 18px; - } - - .collect-layout .collect-main, - .history-layout .history-main { - width: 100%; - max-width: none; - padding: 0; - margin: 0; - } - - .collect-layout .collect-grid, - .history-layout .history-grid { - width: 100%; - display: grid !important; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px 7px; - } - - .collect-layout .collect-card, - .history-layout .history-card.poster-card { - width: 100%; - height: auto; - min-width: 0; - background: transparent; - border-radius: 12px; - overflow: visible; - } - - .collect-layout .collect-card-cover, - .history-layout .history-card .poster-cover { - width: 100%; - height: auto; - aspect-ratio: 168 / 224; - border-radius: 12px; - overflow: hidden; - } - - .collect-layout .collect-card-body { - min-height: 80px; - padding: 8px 0; - gap: 4px; - background: transparent; - box-sizing: border-box; - } - - .collect-layout .collect-card-title, - .history-layout .history-name { - font-size: 14px; - font-weight: 500; - line-height: 20px; - } - - .collect-layout .collect-card-desc, - .history-layout .history-intro { - font-size: 12px; - line-height: 18px; - color: var(--account-secondary); - } - - .collect-layout .collect-card-eps, - .history-layout .episode-badge { - right: 6px; - bottom: 6px; - padding: 3px 8px; - border-radius: 6px; - } - - .history-layout .history-card .poster-card-body { - display: none; - } - - .history-layout .history-info { - min-height: 80px; - padding: 8px 0; - display: flex; - flex-direction: column; - gap: 4px; - box-sizing: border-box; - } - - .history-layout .history-intro { - width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - - .history-layout .history-watch, - .history-layout .history-time { - font-size: 12px; - line-height: 18px; - } - - .history-layout .history-time { - display: none; - } - - body.is-collect-page .collect-card { - border-radius: 12px; - } - - body.is-collect-page .collect-card-body { - min-height: 80px; - padding: 8px 0; - gap: 4px; - background: transparent; - } - - body.is-collect-page .collect-card-title { - font-weight: 500; - } - - body.is-history-page .history-card.poster-card { - padding: 0; - display: flex; - flex-direction: column; - align-items: stretch; - gap: 0; - border: 0; - border-radius: 12px; - background: transparent; - } - - body.is-history-page .history-card .poster-cover { - width: 100%; - height: auto; - padding-bottom: 0; - aspect-ratio: 168 / 224; - border-radius: 12px; - } - - body.is-history-page .history-card .episode-badge { - display: flex !important; - } - - body.is-history-page .history-info { - width: 100%; - min-height: 80px; - padding: 8px 0; - flex: 0 0 auto; - box-sizing: border-box; - } - - body.is-history-page .history-name { - font-weight: 500; - } - - body.is-history-page .history-time { - display: none; - } - - .setting-layout .setting-page { - min-height: calc(100dvh - 48px); - padding: 12px 16px 0; - gap: 14px; - background: var(--account-bg); - box-sizing: border-box; - } - - .setting-layout .setting-pc { - width: 100%; - display: block !important; - padding: 0; - } - - .setting-layout .setting-head, - .setting-layout .setting-nav { - display: none; - } - - .setting-layout .setting-breadcrumb { - display: flex !important; - gap: 8px; - font-size: 12px; - line-height: 18px; - height: 18px; - overflow: hidden; - } - - .setting-layout .setting-main { - width: 100%; - max-width: none; - padding: 0; - gap: 14px; - } - - .setting-layout .setting-profile-mobile, - .setting-layout .setting-aside { - width: 100%; - display: flex; - flex-direction: column; - gap: 14px; - } - - .setting-layout .setting-aside { - padding: 0; - border: 0; - background: transparent; - } - - .setting-layout .setting-section-label, - .setting-layout .setting-section-label--aside { - display: block; - color: #fff; - font-size: 16px; - font-weight: 600; - line-height: 22px; - } - - .setting-layout .setting-aside-title { - display: none; - } - - .setting-layout .setting-group { - width: 100%; - border: 0; - border-radius: 16px; - background: var(--account-panel); - } - - .setting-layout .setting-item { - height: 48px; - padding: 0 14px; - } - - .setting-layout .setting-item--avatar { - height: 72px; - } - - .setting-layout .setting-item-avatar { - width: 48px; - height: 48px; - } - - .setting-layout .setting-group--security .setting-item { - height: 48px; - border: 1px solid var(--account-line); - border-radius: 12px; - } - - .setting-layout .setting-logout { - width: 100%; - height: 48px; - margin: 0; - border: 1px solid var(--account-line); - border-radius: 12px; - background: var(--account-panel); - color: rgba(255, 255, 255, 0.9); - font-size: 16px; - font-weight: 600; - } - - .edit-profile-layout .edit-profile-page, - .edit-password-layout .edit-password-page { - min-height: calc(100dvh - 48px); - padding: 12px 16px 0; - gap: 14px; - background: var(--account-bg); - box-sizing: border-box; - } - - .edit-profile-layout .edit-profile-pc, - .edit-password-layout .edit-password-pc { - width: 100%; - max-width: none; - display: block !important; - padding: 0; - } - - .edit-profile-layout .setting-breadcrumb, - .edit-password-layout .edit-password-breadcrumb { - display: flex; - gap: 8px; - color: var(--account-secondary); - font-size: 12px; - line-height: 18px; - height: 18px; - } - - .edit-profile-layout .setting-breadcrumb a, - .edit-password-layout .edit-password-breadcrumb a { - color: inherit; - } - - .edit-profile-layout .edit-profile-h5, - .edit-password-layout .edit-password-shell { - width: 100%; - max-width: none; - min-height: 0; - display: block; - padding: 0; - } - - .edit-profile-layout .edit-profile-h5-nav, - .edit-password-layout .edit-password-nav, - .edit-password-layout .edit-password-pc-head { - display: none; - } - - .edit-profile-layout .edit-profile-h5-body, - .edit-password-layout .edit-password-form { - width: 100%; - padding: 0; - display: flex; - flex-direction: column; - gap: 14px; - box-sizing: border-box; - } - - .edit-profile-layout .edit-profile-avatar-card { - width: 100%; - height: 112px; - padding: 0 16px; - border-radius: 18px; - } - - .edit-profile-layout .edit-profile-avatar-desc { - display: block; - } - - .edit-profile-layout .edit-profile-avatar, - .edit-profile-layout .edit-profile-avatar-wrap { - width: 64px; - height: 64px; - } - - .edit-profile-layout .edit-profile-field { - width: 100%; - height: 76px; - min-height: 76px; - padding: 12px 14px; - gap: 8px; - border-radius: 18px; - } - - .edit-profile-layout .edit-profile-field--bio { - height: 96px; - min-height: 96px; - } - - .edit-profile-layout .edit-profile-field-input { - padding: 0; - border: 0; - background: transparent; - } - - .edit-profile-layout .edit-profile-submit, - .edit-password-layout .edit-password-submit { - width: 100%; - height: 50px; - border-radius: 12px; - background: var(--account-primary); - color: #fff; - font-size: 16px; - font-weight: 600; - } - - .edit-profile-layout .edit-profile-tip, - .edit-password-layout .edit-password-reset { - display: none; - } - - .edit-password-layout .edit-password-intro { - width: 100%; - height: 72px; - min-height: 72px; - padding: 12px 14px; - gap: 8px; - border-radius: 18px; - box-sizing: border-box; - } - - .edit-password-layout .edit-password-field { - width: 100%; - height: 70px; - min-height: 70px; - padding: 12px 14px; - gap: 6px; - border-radius: 18px; - box-sizing: border-box; - } - - .edit-password-layout .edit-password-input-row { - padding: 0; - border: 0; - background: transparent; - } -} diff --git a/app/static/css/coinDialog.css b/app/static/css/coinDialog.css deleted file mode 100644 index 1ceb0eb..0000000 --- a/app/static/css/coinDialog.css +++ /dev/null @@ -1,137 +0,0 @@ -.coin-dialog-mask { - position: fixed; - inset: 0; - z-index: 1100; - display: none; - align-items: center; - justify-content: center; - padding: 24px; - box-sizing: border-box; - background: rgba(0, 0, 0, 0.7); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); -} -.coin-dialog-mask.is-open { display: flex; } -.coin-dialog-stack { - width: 440px; - max-width: 100%; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; -} -.coin-dialog-card { - width: 440px; - max-width: 100%; - padding: 36px; - box-sizing: border-box; - display: flex; - flex-direction: column; - align-items: center; - gap: 18px; - color: #fff; - background: #0d0d0d; - border: 1px solid rgba(255, 255, 255, 0.2); - border-radius: 40px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; -} -.coin-dialog-icon { width: 60px; height: 60px; flex: 0 0 auto; object-fit: contain; } -.coin-dialog-title { color: #fff; font-size: 24px; font-weight: 600; line-height: 32px; text-align: center; } -.coin-dialog-desc { color: rgba(255,255,255,.55); font-size: 16px; font-weight: 400; line-height: 22px; text-align: center; } -.coin-dialog-balance { - width: 100%; - padding: 18px; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: space-between; - background: rgba(255,255,255,.05); - border: 1px solid rgba(255,255,255,.1); - border-radius: 12px; -} -.coin-dialog-balance-col { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; } -.coin-dialog-balance-col--end { align-items: flex-end; gap: 2px; } -.coin-dialog-balance-label { color: rgba(255,255,255,.55); font-size: 12px; font-weight: 400; line-height: 18px; } -.coin-dialog-balance-value, -.coin-dialog-balance-cost { color: #fff; font-size: 16px; font-weight: 600; line-height: 22px; } -.coin-dialog-balance-cost { color: #ec237f; } -.coin-dialog-hint { color: rgba(255,255,255,.55); font-size: 14px; font-weight: 400; line-height: 20px; text-align: center; } -.coin-dialog-actions { width: 100%; display: flex; gap: 18px; } -.coin-dialog-download, -.coin-dialog-cta { - min-width: 0; - min-height: 58px; - padding: 18px 24px; - box-sizing: border-box; - display: flex; - flex: 1 1 0; - align-items: center; - justify-content: center; - color: #fff; - font-family: inherit; - font-size: 16px; - font-weight: 600; - line-height: 22px; - text-decoration: none; - white-space: nowrap; - border: 0; - border-radius: 18px; - cursor: pointer; -} -.coin-dialog-download { background: linear-gradient(135deg, #ff5f6e 0%, #fe2a7f 50%, #8c206e 100%); } -.coin-dialog-cta { - padding-right: 30px; - padding-left: 30px; - color: #8b1a15; - background: linear-gradient(180deg, #fbc297 0%, #fae1c0 100%); -} -.coin-dialog-cta-label-h5 { display: none; } -.coin-dialog-cta-loading { display: none; } -.coin-dialog-cta.is-loading, -.coin-dialog-cta:disabled { opacity: .75; cursor: not-allowed; } -.coin-dialog-cta.is-loading .coin-dialog-cta-label { display: none; } -.coin-dialog-cta.is-loading .coin-dialog-cta-loading { display: inline; } -.coin-dialog-recharge { - width: 100%; - color: #ec237f; - font-size: 16px; - font-weight: 600; - line-height: 22px; - text-align: center; - text-decoration: none; -} -.coin-dialog-close { - width: 36px; - height: 36px; - padding: 0; - flex: 0 0 36px; - border: 0; - background: transparent; - cursor: pointer; -} -.coin-dialog-close img { display: block; width: 36px; height: 36px; } -@media (max-width: 767px) { - .coin-dialog-mask { - padding: 16px; - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); - } - .coin-dialog-stack { width: 300px; } - .coin-dialog-card { width: 300px; padding: 24px 20px; border-radius: 20px; } - .coin-dialog-title { font-size: 18px; line-height: 24px; } - .coin-dialog-desc { font-size: 14px; line-height: 20px; } - .coin-dialog-hint { font-size: 12px; line-height: 18px; } - .coin-dialog-actions { flex-direction: column; gap: 18px; } - .coin-dialog-download, - .coin-dialog-cta { - width: 100%; - min-height: 46px; - padding: 12px 24px; - flex: none; - border-radius: 9px; - } - .coin-dialog-cta { padding-right: 48px; padding-left: 48px; } - .coin-dialog-cta-label-pc { display: none; } - .coin-dialog-cta-label-h5 { display: inline; } - .coin-dialog-recharge { font-size: 14px; font-weight: 400; line-height: 20px; } -} diff --git a/app/static/css/collect.css b/app/static/css/collect.css deleted file mode 100644 index 73f42fc..0000000 --- a/app/static/css/collect.css +++ /dev/null @@ -1,489 +0,0 @@ -.collect-layout { - min-height: 100vh; - display: flex; - flex-direction: column; -} - -.collect-layout .site-header, -.collect-layout .footer-box { - flex-shrink: 0; -} - -.collect-page { - width: 100%; - flex: 1 1 auto; - min-height: 0; - padding: 36px 0; - background: #0A0A0A; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; - box-sizing: border-box; -} - -.collect-pc { - width: min(1800px, calc(100% - 120px)); - max-width: none; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 24px; -} - -.collect-nav { - display: none; -} - -.collect-main { - width: min(1800px, calc(100% - 120px)); - max-width: none; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 24px; -} - -.collect-breadcrumb { - align-self: stretch; - overflow: hidden; - display: inline-flex; - justify-content: flex-start; - align-items: center; - gap: 10px; -} - -.collect-breadcrumb-link { - color: #EC237F; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - text-decoration: none; -} - -.collect-breadcrumb-sep { - color: #666666; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.collect-breadcrumb-current { - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.collect-head { - align-self: stretch; - overflow: hidden; - display: flex; - justify-content: flex-start; - align-items: center; - gap: 12px; -} - -.collect-title { - margin: 0; - color: white; - font-size: 30px; - font-family: PingFang SC; - font-weight: 400; - line-height: 36px; - flex-shrink: 0; -} - -.collect-desc { - margin: 0; - color: #A3A3A3; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.collect-tabs { - overflow: hidden; - justify-content: flex-start; - align-items: center; - gap: 9px; - display: inline-flex; -} - -.collect-tab { - padding: 7px 16px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - display: inline-flex; - justify-content: center; - align-items: center; - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - text-decoration: none; - box-sizing: border-box; -} - -.collect-tab--active { - background: #EC237F; - border: none; - color: #181818; - font-weight: 700; -} - -.collect-grid { - align-self: stretch; - width: 100%; - display: grid; - grid-template-columns: repeat(8, minmax(0, 1fr)); - justify-content: stretch; - align-items: stretch; - gap: 14px 16px; -} - -.collect-card { - width: 100%; - min-width: 0; - background: transparent; - overflow: hidden; - border-radius: 14px; - display: flex; - flex-direction: column; - align-items: stretch; - text-decoration: none; - color: inherit; - box-sizing: border-box; -} - -.collect-card-cover { - width: 100%; - height: auto; - aspect-ratio: 3 / 4; - position: relative; - overflow: hidden; - background: rgba(255, 255, 255, 0.05); -} - -.collect-card-cover-img { - width: 100%; - height: 100%; - object-fit: cover; - display: block; -} - -.collect-card-eps { - position: absolute; - right: 8px; - bottom: 8px; - height: 28px; - padding: 4px 8px; - background: rgba(0, 0, 0, 0.60); - border-radius: 8px; - display: inline-flex; - justify-content: center; - align-items: center; - color: #fff; - font-size: 12px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - box-sizing: border-box; - z-index: 2; -} - -.collect-card-body { - width: 100%; - flex: 1 1 auto; - padding: 8px 10px; - background: rgba(255, 255, 255, 0.05); - display: flex; - flex-direction: column; - align-items: stretch; - gap: 4px; - box-sizing: border-box; -} - -.collect-card-title { - width: 100%; - min-height: 20px; - color: #F5F5F5; - font-size: 14px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - word-break: break-all; -} - -.collect-card-desc { - width: 100%; - min-height: 18px; - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.collect-card-meta { - width: 100%; - margin-top: auto; - display: flex; - justify-content: space-between; - align-items: center; - gap: 8px; - overflow: hidden; -} - -.collect-card-tag { - min-width: 0; - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.collect-card-spacer { - flex: 1 1 0; - min-width: 4px; - height: 9px; -} - -.collect-card-progress { - flex-shrink: 0; - color: #808080; - font-size: 12px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - white-space: nowrap; -} - -.collect-empty { - width: 100%; - grid-column: 1 / -1; - padding: 48px 16px; - text-align: center; - color: #A3A3A3; -} - -.collect-pagination { - align-self: stretch; - width: 100%; - margin-top: 0; -} - -.collect-pagination .pagination { - width: 100%; -} - -@media (max-width: 767px) { - body.is-collect-page { - background: #0A0A0A; - } - - body.is-collect-page .site-header, - body.is-collect-page .footer-box, - body.is-collect-page .floating-action, - body.is-collect-page .download-fab { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - body.is-collect-page .collect-layout { - min-height: 100vh; - background: #0A0A0A; - } - - body.is-collect-page .collect-page { - padding: 0; - background: #0A0A0A; - align-items: stretch; - justify-content: flex-start; - gap: 0; - min-height: 100vh; - } - - body.is-collect-page .collect-pc { - display: none; - } - - body.is-collect-page .collect-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - } - - body.is-collect-page .collect-nav-back { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - body.is-collect-page .collect-nav-back img { - width: 24px; - height: 24px; - display: block; - opacity: 0.65; - filter: brightness(0) invert(1); - } - - body.is-collect-page .collect-nav-title { - margin: 0; - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - } - - body.is-collect-page .collect-nav-spacer { - width: 24px; - height: 24px; - flex-shrink: 0; - } - - body.is-collect-page .collect-main { - width: calc(100% - 32px); - max-width: 343px; - margin: 0 auto; - padding: 12px 0; - align-items: stretch; - gap: 12px; - box-sizing: border-box; - } - - body.is-collect-page .collect-tabs { - width: auto; - height: 42px; - padding: 4px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 12px; - border: 1px solid rgba(255, 255, 255, 0.08); - display: inline-flex; - justify-content: flex-start; - align-items: flex-start; - gap: 4px; - box-sizing: border-box; - align-self: flex-start; - margin: 0 auto; - } - - body.is-collect-page .collect-tab { - width: 109px; - flex: 0 0 109px; - min-width: 109px; - height: 34px; - padding: 0; - background: transparent; - border: none; - overflow: hidden; - border-radius: 9px; - display: flex; - justify-content: center; - align-items: center; - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - box-sizing: border-box; - } - - body.is-collect-page .collect-tab--active { - background: #EC237F; - color: #171717; - font-weight: 700; - } - - body.is-collect-page .collect-grid { - width: 100%; - display: grid; - grid-template-columns: 1fr 1fr; - justify-content: stretch; - gap: 12px 7px; - } - - body.is-collect-page .collect-card { - width: 100%; - border-radius: 10px; - } - - body.is-collect-page .collect-card-body { - background: rgba(255, 255, 255, 0.05); - } - - body.is-collect-page .collect-card-title { - color: rgba(255, 255, 255, 0.95); - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - } - - body.is-collect-page .collect-card-desc { - color: rgba(255, 255, 255, 0.60); - } - - body.is-collect-page .collect-card-tag { - color: rgba(255, 255, 255, 0.45); - } - - body.is-collect-page .collect-card-progress { - color: rgba(255, 255, 255, 0.45); - } - - body.is-collect-page .collect-card-cover { - height: 0; - padding-bottom: calc(224 / 168 * 100%); - } - - body.is-collect-page .collect-card-cover-img { - position: absolute; - inset: 0; - width: 100%; - height: 100%; - } - - body.is-collect-page .collect-pagination { - margin-top: 0; - } -} diff --git a/app/static/css/deposit.css b/app/static/css/deposit.css deleted file mode 100644 index dab1926..0000000 --- a/app/static/css/deposit.css +++ /dev/null @@ -1,1195 +0,0 @@ -.deposit-layout { - min-height: 100vh; - display: flex; - flex-direction: column; - background: #0F0F0F; -} - -.deposit-layout .site-header, -.deposit-layout .footer-box { - flex-shrink: 0; -} - -.deposit-page { - width: 100%; - flex: 1 1 auto; - min-height: 0; - padding: 36px 0; - background: #0F0F0F; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; - box-sizing: border-box; -} - -.deposit-pc { - width: 964px; - max-width: calc(100% - 32px); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 24px; -} - -.deposit-nav, -.deposit-main, -.deposit-footer { - display: none; -} - -.deposit-breadcrumb { - height: 18px; - display: inline-flex; - align-items: center; - gap: 8px; -} - -.deposit-breadcrumb-link { - color: rgba(255, 255, 255, 0.55); - font-size: 12px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; - font-weight: 500; - line-height: 18px; - text-decoration: none; -} - -.deposit-breadcrumb-sep { - color: rgba(255, 255, 255, 0.55); - font-size: 12px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; - font-weight: 400; - line-height: 18px; -} - -.deposit-breadcrumb-current { - color: #EC237F; - font-size: 12px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; - font-weight: 400; - line-height: 18px; -} - -.deposit-head { - align-self: stretch; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 8px; -} - -.deposit-eyebrow { - color: #EC237F; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.deposit-title { - margin: 0; - color: white; - font-size: 42px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 48px; -} - -.deposit-subtitle { - color: #A3A3A3; - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; -} - -.deposit-hero { - align-self: stretch; - padding: 32px; - background: linear-gradient(90deg, #381433 0%, #141429 52%, #121C3B 100%); - border-radius: 30px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 12px; - box-sizing: border-box; -} - -.deposit-hero-badge { - padding: 8px 12px; - background: #EC237F; - border-radius: 99px; - color: #181818; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.deposit-hero-title { - color: white; - font-size: 30px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 36px; -} - -.deposit-hero-desc { - color: #8B5CF6; - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; -} - -.deposit-section { - align-self: stretch; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 16px; -} - -.deposit-section--packages { - gap: 20px; -} - -.deposit-section--submit { - align-items: center; -} - -.deposit-section-head { - width: 100%; - height: 48px; - min-height: 48px; - display: flex; - justify-content: space-between; - align-items: center; - gap: 16px; -} - -.deposit-section-title { - margin: 0; - color: white; - font-size: 28px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 34px; -} - -.deposit-pc-submit { - min-width: 160px; - height: 48px; - padding: 0 28px; - background: #EC237F; - border: none; - border-radius: 99px; - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - cursor: pointer; -} - -.deposit-pc-submit:disabled, -.deposit-pc-submit.is-loading, -.deposit-mobile-submit:disabled, -.deposit-mobile-submit.is-loading { - opacity: 0.7; - cursor: not-allowed; -} - -.deposit-pay-methods { - display: flex; - flex-wrap: wrap; - align-items: flex-start; - gap: 8px; -} - -.deposit-pay-btn { - padding: 13px 14px; - background: rgba(255, 255, 255, 0.05); - border-radius: 99px; - border: 1px solid rgba(255, 255, 255, 0.10); - color: #808080; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - cursor: pointer; -} - -.deposit-pay-btn--active { - background: #EC237F; - border: none; - color: #181818; -} - -.deposit-package-group { - width: 100%; - padding: 20px; - border-radius: 28px; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 16px; - box-sizing: border-box; -} - -.deposit-package-group--vip { - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.20); - scroll-margin-top: 24px; -} - -.deposit-package-group--coin { - background: rgba(245, 158, 11, 0.10); - border: 1px solid rgba(245, 158, 11, 0.10); -} - -.deposit-package-group-head { - width: 100%; - height: 40px; - min-height: 40px; - display: flex; - align-items: center; - gap: 12px; -} - -.deposit-package-group-icon { - width: 36px; - height: 36px; - border-radius: 18px; - display: flex; - justify-content: center; - align-items: center; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - flex-shrink: 0; - overflow: hidden; -} - -.deposit-package-group-icon--vip { - background: #EC237F; - color: #181818; - font-size: 12px; - line-height: 18px; -} - -.deposit-package-group-icon--coin { - background: transparent; - padding: 0; -} - -.deposit-package-group-icon--coin img { - width: 36px; - height: 36px; - display: block; - object-fit: contain; -} - -.deposit-package-group-text { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 2px; -} - -.deposit-package-group-title { - color: white; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; -} - -.deposit-package-group-desc { - color: #8A8A8A; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -.deposit-package-row { - width: 100%; - display: flex; - align-items: stretch; - gap: 12px; - flex-wrap: wrap; -} - -.deposit-package-empty { - width: 100%; - padding: 20px 12px; - color: #A3A3A3; - font-size: 13px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - line-height: 20px; - text-align: center; - box-sizing: border-box; -} - -.deposit-package { - flex: 1 1 0; - min-width: 180px; - height: 128px; - min-height: 128px; - padding: 16px; - position: relative; - background: rgba(255, 255, 255, 0.05); - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - box-sizing: border-box; - text-align: left; - cursor: pointer; -} - -.deposit-package-group--coin .deposit-package { - border-color: rgba(255, 255, 255, 0.05); -} - -.deposit-package--active { - border-color: #EC237F; -} - -.deposit-package-price { - color: white; - font-size: 24px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 30px; -} - -.deposit-package-group--coin .deposit-package-price, -.deposit-package-group--coin .deposit-package-name { - color: #F5F5F5; -} - -.deposit-package-original { - display: none; - color: #A3A3A3; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 16px; - text-decoration: line-through; -} - -.deposit-package-name { - color: white; - font-size: 18px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 24px; -} - -.deposit-package-hint { - color: #A3A3A3; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -.deposit-package-check { - display: none; - width: 24px; - height: 24px; - position: absolute; - right: 12px; - top: 16px; - background: #EC237F; - border-radius: 12px; - color: #fff; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 500; - line-height: 18px; - align-items: center; - justify-content: center; - box-sizing: border-box; - padding: 0; -} - -.deposit-package--active .deposit-package-check { - display: inline-flex; -} - -.deposit-tx-list { - width: 100%; - padding: 8px; - background: rgba(255, 255, 255, 0.05); - border-radius: 30px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - box-sizing: border-box; -} - -.deposit-tx-item { - width: 100%; - height: 64px; - min-height: 64px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - gap: 16px; - box-sizing: border-box; -} - -.deposit-tx-info { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - min-width: 0; -} - -.deposit-tx-name { - color: #F5F5F5; - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; -} - -.deposit-tx-time { - color: #8A8A8A; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -.deposit-tx-amount { - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - flex-shrink: 0; -} - -.deposit-tx-amount--plus { - color: #0ABE75; -} - -.deposit-tx-amount--minus { - color: #EF4444; -} - -@media (max-width: 767px) { - body.is-deposit-page { - background: #0A0A0A; - padding-bottom: 0; - } - - body.is-deposit-page .site-header, - body.is-deposit-page .footer-box, - body.is-deposit-page .floating-action, - body.is-deposit-page .download-fab { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - .deposit-layout { - min-height: 100vh; - background: #0A0A0A; - } - - .deposit-page { - padding: 0; - padding-bottom: calc(108px + env(safe-area-inset-bottom, 0px)); - background: #0A0A0A; - align-items: stretch; - gap: 0; - min-height: 100vh; - } - - .deposit-pc { - display: none; - } - - .deposit-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - overflow: hidden; - } - - .deposit-nav-back { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .deposit-nav-back img { - width: 24px; - height: 24px; - display: block; - opacity: 0.65; - filter: brightness(0) invert(1); - } - - .deposit-nav-title { - margin: 0; - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - overflow: hidden; - } - - .deposit-nav-spacer { - width: 24px; - height: 24px; - flex-shrink: 0; - } - - .deposit-main { - display: flex; - width: calc(100% - 32px); - max-width: 343px; - margin: 0 auto; - padding: 12px 0; - flex-direction: column; - align-items: stretch; - gap: 14px; - box-sizing: border-box; - overflow: hidden; - } - - .deposit-mobile-wallet { - width: 100%; - height: 98px; - min-height: 98px; - padding: 14px 16px; - background: rgba(255, 255, 255, 0.05); - border-radius: 18px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - box-sizing: border-box; - } - - .deposit-mobile-wallet-label { - color: #EC237F; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - } - - .deposit-mobile-wallet-balance { - color: #fff; - font-size: 20px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 26px; - } - - .deposit-mobile-wallet-meta { - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } - - .deposit-mobile-section-title { - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - } - - .deposit-mobile-row { - width: 100%; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; - align-items: stretch; - gap: 8px; - overflow: visible; - } - - .deposit-mobile-pkg { - flex: 0 0 calc((100% - 16px) / 3); - width: calc((100% - 16px) / 3); - max-width: calc((100% - 16px) / 3); - min-width: 0; - border: none; - cursor: pointer; - box-sizing: border-box; - font: inherit; - color: inherit; - -webkit-tap-highlight-color: transparent; - } - - .deposit-mobile-row > .deposit-package-empty { - flex: 1 1 100%; - width: 100%; - max-width: none; - color: rgba(255, 255, 255, 0.50); - } - - .deposit-mobile-pkg--vip { - height: auto; - min-height: 112px; - padding: 12px; - background: rgba(255, 255, 255, 0.05); - border-radius: 14px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: visible; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - gap: 6px; - } - - .deposit-mobile-pkg--vip.deposit-mobile-pkg--active { - background: rgba(250, 220, 68, 0.12); - border: 1.5px solid rgba(250, 220, 68, 0.70); - } - - .deposit-mobile-pkg--vip .deposit-mobile-pkg-name, - .deposit-mobile-pkg--vip .deposit-mobile-pkg-price { - color: rgba(255, 255, 255, 0.90); - } - - .deposit-mobile-pkg--vip.deposit-mobile-pkg--active .deposit-mobile-pkg-name, - .deposit-mobile-pkg--vip.deposit-mobile-pkg--active .deposit-mobile-pkg-price { - color: rgba(255, 255, 255, 0.95); - } - - .deposit-mobile-pkg--vip .deposit-mobile-pkg-hint { - color: rgba(255, 255, 255, 0.50); - text-align: center; - } - - .deposit-mobile-pkg--vip.deposit-mobile-pkg--active .deposit-mobile-pkg-hint { - color: rgba(255, 255, 255, 0.60); - } - - .deposit-mobile-pkg--coin { - height: auto; - min-height: 86px; - padding: 12px; - background: rgba(255, 255, 255, 0.05); - border-radius: 14px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: visible; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 4px; - } - - .deposit-mobile-pkg--coin.deposit-mobile-pkg--active { - background: rgba(250, 220, 68, 0.12); - border: 1.5px solid rgba(250, 220, 68, 0.70); - } - - .deposit-mobile-pkg-name { - color: rgba(255, 255, 255, 0.90); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - } - - .deposit-mobile-pkg-price { - color: rgba(255, 255, 255, 0.90); - font-size: 20px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 26px; - } - - .deposit-mobile-pkg-price--coin { - color: #EC237F; - font-size: 16px; - line-height: 22px; - } - - .deposit-mobile-pkg-original { - display: none; - color: rgba(255, 255, 255, 0.40); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 16px; - text-decoration: line-through; - } - - .deposit-mobile-pkg-hint { - color: rgba(255, 255, 255, 0.50); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - width: 100%; - text-align: left; - overflow: visible; - display: block; - white-space: normal; - word-break: break-word; - } - - .deposit-mobile-pkg--coin .deposit-mobile-pkg-hint { - display: none; - } - - .deposit-mobile-pay-methods { - width: 100%; - min-height: 42px; - display: flex; - justify-content: flex-start; - align-items: flex-start; - gap: 8px; - flex-wrap: wrap; - overflow: hidden; - } - - .deposit-mobile-pay { - min-width: 72px; - height: 42px; - padding: 0 16px; - background: rgba(255, 255, 255, 0.05); - border-radius: 21px; - border: 1px solid rgba(255, 255, 255, 0.08); - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - display: inline-flex; - justify-content: center; - align-items: center; - cursor: pointer; - box-sizing: border-box; - -webkit-tap-highlight-color: transparent; - } - - .deposit-mobile-pay--active { - min-width: 88px; - background: #EC237F; - border: none; - color: #171717; - } - - .deposit-mobile-tx { - width: 100%; - padding: 4px 0; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: column; - box-sizing: border-box; - } - - .deposit-mobile-tx-item { - width: 100%; - min-height: 64px; - padding: 12px 14px; - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - box-sizing: border-box; - } - - .deposit-mobile-tx-item + .deposit-mobile-tx-item { - border-top: 1px solid rgba(255, 255, 255, 0.10); - } - - .deposit-mobile-tx-info { - min-width: 0; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - } - - .deposit-mobile-tx-name { - color: #F5F5F5; - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - max-width: 220px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .deposit-mobile-tx-time { - color: rgba(255, 255, 255, 0.50); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } - - .deposit-mobile-tx-amount { - flex-shrink: 0; - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - } - - .deposit-mobile-tx .deposit-package-empty { - padding: 20px 14px; - text-align: center; - color: rgba(255, 255, 255, 0.50); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } - - .deposit-mobile-tx .deposit-tx-amount--plus, - .deposit-mobile-tx-amount.deposit-tx-amount--plus { - color: #10B981; - } - - .deposit-mobile-tx .deposit-tx-amount--minus, - .deposit-mobile-tx-amount.deposit-tx-amount--minus { - color: #F68071; - } - - .deposit-footer { - position: fixed; - left: 0; - right: 0; - bottom: 0; - z-index: 30; - width: 100%; - padding: 10px 16px calc(20px + env(safe-area-inset-bottom, 0px)); - background: #101010; - border-top: 1px rgba(255, 255, 255, 0.10) solid; - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; - box-sizing: border-box; - overflow: hidden; - } - - .deposit-mobile-submit { - width: 100%; - max-width: 343px; - height: 50px; - background: #EC237F; - border: none; - border-radius: 14px; - color: #171717; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - display: inline-flex; - justify-content: center; - align-items: center; - cursor: pointer; - box-sizing: border-box; - } - - .deposit-mobile-agree { - width: 100%; - max-width: 343px; - text-align: center; - color: rgba(255, 255, 255, 0.40); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } - - .deposit-mobile-agree a { - color: rgba(255, 255, 255, 0.40); - text-decoration: none; - } -} -.deposit-confirm-mask { - position: fixed; - inset: 0; - z-index: 1200; - display: none; - align-items: center; - justify-content: center; - overflow-y: auto; - padding: 24px; - box-sizing: border-box; - background: rgba(0,0,0,.7); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); -} -.deposit-confirm-mask.is-open { display: flex; } -.deposit-confirm-stack { - width: 440px; - max-width: 100%; - margin: auto; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; -} -.deposit-confirm-card { - width: 440px; - max-width: 100%; - padding: 36px; - box-sizing: border-box; - display: flex; - flex-direction: column; - align-items: stretch; - gap: 18px; - color: #fff; - background: #0d0d0d; - border: 1px solid rgba(255,255,255,.2); - border-radius: 40px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; -} -.deposit-confirm-head { - display: flex; - align-items: center; - gap: 12px; -} -.deposit-confirm-head h2, -.deposit-confirm-method-title, -.deposit-confirm-note { margin: 0; } -.deposit-confirm-head h2 { - color: #fff; - font-size: 24px; - font-weight: 600; - line-height: 32px; -} -.deposit-confirm-head span { - color: rgba(255,255,255,.55); - font-size: 14px; - font-weight: 400; - line-height: 20px; -} -.deposit-confirm-order { - width: 100%; - min-height: 78px; - padding: 16px 18px; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; - background: rgba(255,255,255,.05); - border: 1px solid rgba(255,255,255,.05); - border-radius: 20px; -} -.deposit-confirm-order-copy { - min-width: 0; - display: flex; - flex-direction: column; - gap: 6px; -} -.deposit-confirm-order-copy strong { - overflow: hidden; - color: #fff; - font-size: 20px; - font-weight: 400; - line-height: 28px; - text-overflow: ellipsis; - white-space: nowrap; -} -.deposit-confirm-order-copy span { - color: rgba(255,255,255,.55); - font-size: 14px; - font-weight: 400; - line-height: 20px; -} -.deposit-confirm-price { - width: 90px; - height: 44px; - flex: 0 0 90px; - display: flex; - align-items: center; - justify-content: center; - color: #ec237f; - font-size: 20px; - font-weight: 600; - line-height: 28px; - background: rgba(255,74,74,.08); - border-radius: 22px; -} -.deposit-confirm-method-title { - color: #fff; - font-size: 18px; - font-weight: 600; - line-height: 24px; -} -.deposit-confirm-methods { - display: flex; - flex-direction: column; - gap: 12px; -} -.deposit-confirm-method { - width: 100%; - min-height: 70px; - padding: 16px 18px; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: space-between; - color: #fff; - font-family: inherit; - background: rgba(255,255,255,.05); - border: 1px solid rgba(255,255,255,.05); - border-radius: 20px; - cursor: pointer; -} -.deposit-confirm-method.is-active { border-color: #ec237f; } -.deposit-confirm-method-copy { display: flex; align-items: center; gap: 12px; } -.deposit-confirm-method-icon { - width: 36px; - height: 36px; - flex: 0 0 36px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 999px; -} -.deposit-confirm-method-icon--alipay { background: #335ae8; } -.deposit-confirm-method-icon--wechat { background: #15ba11; } -.deposit-confirm-method-icon--usdt { background: #27a17c; } -.deposit-confirm-method-icon--other { background: rgba(255,255,255,.1); } -.deposit-confirm-method-icon img { display: block; width: 28px; height: 28px; object-fit: contain; } -.deposit-confirm-method-icon--wechat img { width: 24px; height: 24px; } -.deposit-confirm-method-name { color: #fff; font-size: 16px; font-weight: 600; line-height: 22px; } -.deposit-confirm-method-check { - width: 20px; - height: 20px; - flex: 0 0 20px; - display: flex; - align-items: center; - justify-content: center; - color: transparent; - font: 700 12px/1 "Noto Sans SC", sans-serif; - background: rgba(255,255,255,.1); - border-radius: 10px; -} -.deposit-confirm-method.is-active .deposit-confirm-method-check { color: #fff; background: #ec237f; } -.deposit-confirm-submit { - width: 100%; - min-height: 50px; - padding: 13px 0; - box-sizing: border-box; - color: #fff; - font: 600 18px/24px "PingFang SC", "Noto Sans SC", sans-serif; - background: #ec237f; - border: 0; - border-radius: 12px; - cursor: pointer; -} -.deposit-confirm-submit:disabled { opacity: .75; cursor: not-allowed; } -.deposit-confirm-note { - color: rgba(255,255,255,.55); - font-size: 12px; - font-weight: 400; - line-height: 18px; - text-align: center; -} -.deposit-confirm-close { - width: 36px; - height: 36px; - padding: 0; - flex: 0 0 36px; - background: transparent; - border: 0; - cursor: pointer; -} -.deposit-confirm-close img { display: block; width: 36px; height: 36px; } -@media (max-width: 767px) { - .deposit-confirm-mask { - padding: 16px; - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); - } - .deposit-confirm-stack { width: 300px; } - .deposit-confirm-card { width: 300px; padding: 24px 20px; border-radius: 20px; } - .deposit-confirm-head h2 { font-size: 16px; line-height: 22px; } - .deposit-confirm-head span { font-size: 12px; line-height: 18px; } - .deposit-confirm-order { - min-height: 70px; - padding: 12px; - } - .deposit-confirm-order-copy strong { font-size: 16px; font-weight: 600; line-height: 22px; } - .deposit-confirm-order-copy span { font-size: 12px; line-height: 18px; } - .deposit-confirm-price { - width: auto; - height: auto; - min-width: 58px; - padding: 4px 12px; - flex: 0 0 auto; - box-sizing: border-box; - font-size: 18px; - line-height: 24px; - } - .deposit-confirm-method-title { font-size: 16px; line-height: 22px; } - .deposit-confirm-method { - min-height: 50px; - padding: 12px; - border-radius: 12px; - } - .deposit-confirm-method-icon { - width: 24px; - height: 24px; - flex-basis: 24px; - } - .deposit-confirm-method-icon img { width: 18.67px; height: 18.67px; } - .deposit-confirm-method-icon--wechat img { width: 16px; height: 16px; } - .deposit-confirm-method-name { font-size: 14px; font-weight: 400; line-height: 20px; } - .deposit-confirm-method-check { - width: 16px; - height: 16px; - flex-basis: 16px; - font-size: 10px; - border-radius: 8px; - } - .deposit-confirm-submit { font-weight: 400; } -} diff --git a/app/static/css/detail.css b/app/static/css/detail.css index 72b4401..aa3c9a5 100644 --- a/app/static/css/detail.css +++ b/app/static/css/detail.css @@ -309,6 +309,21 @@ flex-wrap: wrap; } +.detail-episode-lock { + position: absolute; + top: 0; + right: 0; + padding: 0 4px; + border-radius: 0 7px 0 7px; + background: #ec237f; + color: #fff; + font-size: 9px; + font-family: PingFang SC; + font-weight: 500; + line-height: 14px; + pointer-events: none; +} + .detail-episode { flex: 0 0 calc((100% - 98px) / 8); width: calc((100% - 98px) / 8); @@ -331,29 +346,6 @@ box-sizing: border-box; } -.detail-episode-coin { - width: 16px; - height: 16px; - right: 6px; - left: auto; - top: 6px; - position: absolute; - display: block; - padding: 0; - background: none; - overflow: visible; - border-radius: 0; - box-sizing: border-box; - pointer-events: none; -} - -.detail-episode-coin img { - width: 16px; - height: 16px; - object-fit: contain; - display: block; -} - .detail-comments { align-self: stretch; width: 100%; @@ -416,189 +408,6 @@ color: #F5F5F5; } -.detail-comment-composer { - align-self: stretch; - padding: 12px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 10px; - justify-content: flex-start; - align-items: flex-start; - gap: 12px; - display: flex; - box-sizing: border-box; -} - -.detail-comment-composer-avatar { - width: 36px; - height: 36px; - border-radius: 18px; - object-fit: cover; - flex-shrink: 0; -} - -.detail-comment-composer-main { - flex: 1; - min-width: 0; - overflow: hidden; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 12px; - display: flex; -} - -.detail-comment-composer-input { - width: 100%; - min-height: 56px; - padding: 10px 12px; - background: #000; - overflow: hidden; - border-radius: 8px; - border: none; - resize: none; - box-sizing: border-box; - box-shadow: none; - outline: none; - outline-color: transparent; - -webkit-appearance: none; - appearance: none; - color: #F5F5F5; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.detail-comment-composer-input:focus, -.detail-comment-composer-input:focus-visible { - border: none; - outline: none; - outline-color: transparent; - box-shadow: none; -} - -.detail-comment-composer-input::placeholder { - color: #A3A3A3; -} - -.detail-comment-composer-footer { - width: 100%; - height: 28px; - overflow: hidden; - justify-content: space-between; - align-items: center; - display: flex; -} - -.detail-comment-composer-status { - height: 20px; - overflow: hidden; - justify-content: flex-start; - align-items: center; - gap: 8px; - display: flex; -} - -.detail-comment-composer-logged { - color: #ec237f; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.detail-comment-composer-user { - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.detail-comment-composer-count { - color: #D4D4D4; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.detail-comment-composer-submit { - width: 84px; - height: 28px; - background: #ec237f; - overflow: hidden; - border-radius: 14px; - justify-content: center; - align-items: center; - display: flex; - border: none; - cursor: pointer; - color: #fff; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - padding: 0; - position: relative; - gap: 6px; - box-sizing: border-box; -} - -.detail-comment-composer-submit:disabled, -.detail-comment-composer-submit.is-loading { - opacity: 0.75; - cursor: not-allowed; -} - -.detail-comment-composer-submit.is-loading::before { - content: ""; - width: 12px; - height: 12px; - border: 2px solid rgba(24, 24, 24, 0.35); - border-top-color: #181818; - border-radius: 50%; - animation: detail-comment-spin 0.7s linear infinite; - flex-shrink: 0; -} - -@keyframes detail-comment-spin { - to { - transform: rotate(360deg); - } -} - -.detail-comments-login { - align-self: stretch; - height: 44px; - padding: 0 12px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 7px; - justify-content: flex-start; - align-items: center; - display: flex; - box-sizing: border-box; -} - -.detail-comments-login-link { - color: #ec237f; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - text-decoration: none; -} - -.detail-comments-login-hint { - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - .detail-comment-list { align-self: stretch; width: 100%; @@ -675,50 +484,6 @@ line-height: 18px; } -.detail-comment-like { - display: inline-flex; - align-items: center; - gap: 4px; - background: none; - border: none; - cursor: pointer; - padding: 0; - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.detail-comment-like img { - width: 14px; - height: 14px; -} - -.detail-comment-like--active { - color: #A3A3A3; -} - -.detail-comment-like--active img { - filter: none; -} - -.detail-comment-reply-label { - color: #A3A3A3; - font-size: 12px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 400; - line-height: 18px; - background: none; - border: none; - padding: 0; - cursor: pointer; -} - -.detail-comment-reply-label:hover { - color: #ec237f; -} - .detail-comment-reply-to { color: #A3A3A3; } @@ -778,89 +543,6 @@ opacity: 0.92; } -.detail-comment-reply-hint { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - margin-bottom: 6px; - color: #A3A3A3; - font-size: 12px; - line-height: 18px; -} - -.detail-comment-reply-hint button { - background: none; - border: none; - padding: 0; - color: #ec237f; - cursor: pointer; - font-size: 12px; -} - -.detail-comment-inline-composer { - width: 100%; - margin-top: 8px; - padding: 10px 12px; - background: rgba(255, 255, 255, 0.05); - border-radius: 6px; - box-sizing: border-box; - display: flex; - flex-direction: column; - gap: 8px; -} - -.detail-comment-inline-input { - width: 100%; - min-height: 56px; - padding: 8px 10px; - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 6px; - background: #0A0A0A; - color: #F5F5F5; - font-size: 13px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - line-height: 20px; - resize: none; - box-sizing: border-box; -} - -.detail-comment-inline-input::placeholder { - color: #737373; -} - -.detail-comment-inline-input:focus, -.detail-comment-inline-input:focus-visible { - border-color: rgba(236, 35, 127, 0.55); - outline: none; - outline-color: transparent; - box-shadow: none; -} - -.detail-comment-inline-footer { - display: flex; - justify-content: flex-end; -} - -.detail-comment-inline-send { - height: 32px; - padding: 0 14px; - border: none; - border-radius: 6px; - background: #ec237f; - color: #fff; - font-size: 13px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 500; - cursor: pointer; -} - -.detail-comment-inline-send:disabled, -.detail-comment-inline-send.is-loading { - opacity: 0.6; - cursor: not-allowed; -} - .detail-comments-more { align-self: stretch; height: 43px; @@ -1048,23 +730,6 @@ box-sizing: border-box; } - .detail-h5-top-btn--like { - width: auto; - min-width: 20px; - height: auto; - gap: 4px; - } - - .detail-h5-top-like-count { - color: rgba(255, 255, 255, 0.92); - font-size: 11px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 400; - line-height: 12px; - white-space: nowrap; - text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.55); - } - .detail-h5-top-btn img { width: 18px; height: 18px; @@ -1074,12 +739,6 @@ opacity: 0.92; } - .detail-h5-top-btn--active img, - .detail-h5-top-btn img[src*="h5_liked"] { - filter: none; - opacity: 1; - } - .detail-page.page-shell { position: relative; z-index: 1; @@ -1305,19 +964,6 @@ text-align: center; } - .detail-episode-coin { - width: 16px; - height: 16px; - left: auto; - right: 6px; - top: 6px; - } - - .detail-episode-coin img { - width: 16px; - height: 16px; - } - .detail-related { width: 100%; gap: 12px; @@ -1467,50 +1113,6 @@ gap: 12px; } - .detail-h5-collect, - .detail-h5-like { - width: 132px; - padding: 11px 24px; - background: rgba(255, 255, 255, 0.10); - border: none; - border-radius: 999px; - display: inline-flex; - align-items: center; - justify-content: center; - gap: 12px; - cursor: pointer; - color: white; - font-size: 16px; - font-family: PingFang SC; - font-weight: 400; - line-height: 22px; - flex-shrink: 0; - } - - .detail-h5-collect--active, - .detail-h5-like--active { - color: #ec237f; - } - - .detail-h5-collect--active img, - .detail-h5-like--active img { - filter: none; - } - - .detail-h5-collect img, - .detail-h5-like img { - width: 22px; - height: 22px; - display: block; - object-fit: contain; - filter: none; - } - - .detail-h5-collect--active img, - .detail-h5-like--active img { - filter: none; - } - .detail-h5-play { flex: 1; padding: 11px 24px; @@ -1823,18 +1425,6 @@ text-align: center; } - .detail-episode-coin { - width: calc(16px * var(--detail-s)); - height: calc(16px * var(--detail-s)); - top: calc(6px * var(--detail-s)); - right: calc(6px * var(--detail-s)); - } - - .detail-episode-coin img { - width: 100%; - height: 100%; - } - .content-official-info { padding: calc(24px * var(--detail-s)) calc(30px * var(--detail-s)); border-radius: calc(18px * var(--detail-s)); @@ -1876,15 +1466,6 @@ line-height: calc(18px * var(--detail-s)); } - .detail-comment-composer, - .detail-comment-login { - min-height: calc(44px * var(--detail-s)); - padding: 12px calc(12px * var(--detail-s)); - border-radius: calc(7px * var(--detail-s)); - font-size: calc(12px * var(--detail-s)); - line-height: calc(18px * var(--detail-s)); - } - .detail-related { display: flex; width: calc(296px * var(--detail-s)); @@ -2034,7 +1615,5 @@ line-height: 14px; } - .detail-h5-collect--active, - .detail-h5-like--active { color: #ec237f; } .detail-h5-play { background: #ec237f; color: #fff; } } diff --git a/app/static/css/editPassword.css b/app/static/css/editPassword.css deleted file mode 100644 index b735c60..0000000 --- a/app/static/css/editPassword.css +++ /dev/null @@ -1,382 +0,0 @@ -.edit-password-layout { - min-height: 100vh; - display: flex; - flex-direction: column; - background: #0A0A0A; -} - -.edit-password-layout .site-header, -.edit-password-layout .footer-box { - flex-shrink: 0; -} - -.edit-password-page { - width: 100%; - flex: 1 1 auto; - padding: 36px 0 48px; - background: #0A0A0A; - display: flex; - flex-direction: column; - align-items: center; - gap: 18px; - box-sizing: border-box; -} - -.edit-password-pc { - width: 100%; - max-width: calc(100% - 32px); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 14px; -} - -.edit-password-breadcrumb { - display: inline-flex; - align-items: center; - gap: 10px; -} - -.edit-password-breadcrumb-link { - color: #EC237F; - font-size: 14px; - font-family: PingFang SC, "Noto Sans SC", sans-serif; - font-weight: 400; - line-height: 20px; - text-decoration: none; -} - -.edit-password-breadcrumb-sep { - color: #666666; - font-size: 14px; - font-family: PingFang SC, "Noto Sans SC", sans-serif; - font-weight: 400; - line-height: 20px; -} - -.edit-password-breadcrumb-current { - color: #8A8A8A; - font-size: 14px; - font-family: PingFang SC, "Noto Sans SC", sans-serif; - font-weight: 400; - line-height: 20px; -} - -.edit-password-pc-head { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; -} - -.edit-password-pc-title { - margin: 0; - color: #F5F5F5; - font-size: 30px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 36px; -} - -.edit-password-pc-desc { - color: rgba(255, 255, 255, 0.60); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; -} - -.edit-password-shell { - width: 100%; - max-width: calc(100% - 32px); - display: flex; - flex-direction: column; - align-items: stretch; -} - -.edit-password-nav { - display: none; -} - -.edit-password-form { - width: 100%; - max-width: 480px; - display: flex; - flex-direction: column; - align-items: stretch; - gap: 14px; - overflow: hidden; -} - -.edit-password-intro { - width: 100%; - height: 86px; - min-height: 86px; - padding: 14px 16px; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 6px; - box-sizing: border-box; -} - -.edit-password-intro-title { - color: rgba(255, 255, 255, 0.95); - font-size: 18px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 24px; -} - -.edit-password-intro-desc { - width: 100%; - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -.edit-password-field { - width: 100%; - height: 78px; - min-height: 78px; - padding: 12px 14px; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 8px; - box-sizing: border-box; -} - -.edit-password-field.is-error { - height: auto; - min-height: 78px; - border-color: rgba(255, 107, 107, 0.65); -} - -.edit-password-error { - margin: 0; - color: #FF6B6B; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -.edit-password-error[hidden] { - display: none; -} - -.edit-password-label { - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.edit-password-input-row { - width: 100%; - height: 30px; - min-height: 30px; - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - overflow: hidden; -} - -.edit-password-input { - flex: 1 1 0; - min-width: 0; - height: 30px; - padding: 0; - border: none; - background: transparent; - box-shadow: none; - outline: none; - outline-color: transparent; - -webkit-appearance: none; - appearance: none; - color: rgba(255, 255, 255, 0.95); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; -} - -.edit-password-input:focus, -.edit-password-input:focus-visible { - border: none; - outline: none; - outline-color: transparent; - box-shadow: none; -} - -.edit-password-input::placeholder { - color: rgba(255, 255, 255, 0.40); -} - -.edit-password-toggle { - flex-shrink: 0; - padding: 0; - border: none; - background: transparent; - color: #EC237F; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - cursor: pointer; - -webkit-tap-highlight-color: transparent; -} - -.edit-password-submit { - width: 100%; - height: 50px; - background: #EC237F; - border: none; - border-radius: 14px; - color: #171717; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - display: inline-flex; - justify-content: center; - align-items: center; - cursor: pointer; - box-sizing: border-box; - overflow: hidden; -} - -.edit-password-submit:disabled { - opacity: 0.7; - cursor: not-allowed; -} - -.edit-password-reset { - width: 100%; - min-height: 18px; - padding: 0; - display: inline-flex; - justify-content: center; - align-items: center; - border-radius: 14px; - color: #EC237F; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - text-decoration: none; - overflow: hidden; - box-sizing: border-box; -} - -@media (max-width: 767px) { - body.is-edit-password-page { - background: #0A0A0A; - padding-bottom: 0; - } - - body.is-edit-password-page .site-header, - body.is-edit-password-page .footer-box, - body.is-edit-password-page .floating-action, - body.is-edit-password-page .download-fab { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - .edit-password-page { - padding: 0; - gap: 0; - align-items: stretch; - min-height: 100vh; - } - - .edit-password-pc { - display: none; - } - - .edit-password-shell { - width: 100%; - max-width: 100%; - min-height: 100vh; - align-items: center; - } - - .edit-password-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - overflow: hidden; - } - - .edit-password-back { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .edit-password-back img { - width: 24px; - height: 24px; - display: block; - opacity: 0.65; - filter: brightness(0) invert(1); - } - - .edit-password-nav-title { - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #F5F5F5; - font-size: 18px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 24px; - overflow: hidden; - } - - .edit-password-nav-spacer { - width: 24px; - height: 24px; - flex-shrink: 0; - } - - .edit-password-form { - width: calc(100% - 32px); - max-width: 343px; - margin: 0 auto; - padding: 16px 0; - box-sizing: border-box; - } -} diff --git a/app/static/css/editProfile.css b/app/static/css/editProfile.css deleted file mode 100644 index e0a14a5..0000000 --- a/app/static/css/editProfile.css +++ /dev/null @@ -1,347 +0,0 @@ -.edit-profile-layout { - min-height: 100vh; - display: flex; - flex-direction: column; - background: #0A0A0A; -} - -.edit-profile-layout .site-header, -.edit-profile-layout .footer-box { - flex-shrink: 0; -} - -.edit-profile-page { - width: 100%; - flex: 1 1 auto; - background: #0A0A0A; - display: flex; - flex-direction: column; - align-items: center; - gap: 18px; - box-sizing: border-box; -} - -.edit-profile-pc { - display: none; -} - -.setting-breadcrumb { - display: inline-flex; - align-items: center; - gap: 10px; -} - -.setting-breadcrumb-link { - color: #EC237F; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - text-decoration: none; -} - -.setting-breadcrumb-sep { - color: #666666; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.setting-breadcrumb-current { - color: #8A8A8A; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.edit-profile-h5 { - width: 100%; - max-width: 480px; - min-height: 100%; - display: flex; - flex-direction: column; - align-items: center; - box-sizing: border-box; -} - -.edit-profile-h5-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - overflow: hidden; -} - -.edit-profile-h5-back { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; -} - -.edit-profile-h5-back img { - width: 24px; - height: 24px; - display: block; - opacity: 0.65; - filter: brightness(0) invert(1); -} - -.edit-profile-h5-nav-title { - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #F5F5F5; - font-size: 18px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 24px; - overflow: hidden; -} - -.edit-profile-h5-nav-spacer { - width: 24px; - height: 24px; - flex-shrink: 0; -} - -.edit-profile-h5-body { - width: calc(100% - 32px); - max-width: 343px; - margin: 0 auto; - padding: 16px 0; - display: flex; - flex-direction: column; - align-items: stretch; - gap: 14px; - box-sizing: border-box; - overflow: hidden; -} - -.edit-profile-avatar-card { - width: 100%; - height: 112px; - padding: 0 16px; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - box-sizing: border-box; -} - -.edit-profile-avatar-text { - width: 190px; - max-width: 100%; - min-width: 0; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 6px; - overflow: hidden; -} - -.edit-profile-avatar-title { - color: rgba(255, 255, 255, 0.95); - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; -} - -.edit-profile-avatar-desc { - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -.edit-profile-avatar-wrap { - position: relative; - width: 64px; - height: 64px; - flex-shrink: 0; -} - -.edit-profile-avatar { - width: 64px; - height: 64px; - border-radius: 999px; - object-fit: cover; - display: block; - border: 1px solid rgba(250, 220, 68, 0.35); -} - -.edit-profile-field { - width: 100%; - height: 76px; - min-height: 76px; - padding: 12px 14px; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 8px; - box-sizing: border-box; -} - -.edit-profile-field--bio { - height: 96px; - min-height: 96px; -} - -.edit-profile-field-label { - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.edit-profile-field-input { - width: 100%; - padding: 0; - border: none; - background: transparent; - box-shadow: none; - outline: none; - outline-color: transparent; - -webkit-appearance: none; - appearance: none; - color: rgba(255, 255, 255, 0.95); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; - box-sizing: border-box; -} - -.edit-profile-field-input:focus, -.edit-profile-field-input:focus-visible { - border: none; - outline: none; - outline-color: transparent; - box-shadow: none; -} - -.edit-profile-field-input::placeholder { - color: rgba(255, 255, 255, 0.40); -} - -.edit-profile-field-input--bio { - resize: none; - min-height: 40px; -} - -.edit-profile-submit { - width: 100%; - height: 50px; - background: #EC237F; - border: none; - border-radius: 14px; - color: #171717; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - display: inline-flex; - justify-content: center; - align-items: center; - cursor: pointer; - box-sizing: border-box; - overflow: hidden; -} - -.edit-profile-submit:disabled { - opacity: 0.7; - cursor: not-allowed; -} - -.edit-profile-tip { - margin: 0; - color: rgba(255, 255, 255, 0.40); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; -} - -@media (min-width: 768px) { - .edit-profile-page { - padding: 36px 0 60px; - gap: 18px; - } - - .edit-profile-pc { - width: 100%; - max-width: calc(100% - 32px); - display: flex; - flex-direction: column; - align-items: flex-start; - } - - .edit-profile-h5 { - width: 100%; - max-width: calc(100% - 32px); - } - - .edit-profile-h5-nav { - display: none; - } - - .edit-profile-h5-body { - width: 100%; - max-width: 480px; - margin: 0; - padding-top: 0; - } -} - -@media (max-width: 767px) { - body.is-edit-profile-page { - background: #0A0A0A; - padding-bottom: 0; - } - - body.is-edit-profile-page .site-header, - body.is-edit-profile-page .footer-box, - body.is-edit-profile-page .floating-action { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - .edit-profile-pc { - display: none; - } - - .edit-profile-h5 { - max-width: 100%; - min-height: 100vh; - } -} diff --git a/app/static/css/header.css b/app/static/css/header.css index 21e170d..2baafa3 100644 --- a/app/static/css/header.css +++ b/app/static/css/header.css @@ -615,7 +615,7 @@ } .site-shell .brand-logo { - content: url("/static/images/logo-h5.png"); + content: url("/static/images/logo-h5.png?v=3"); width: 92px; height: 24px; object-fit: contain; diff --git a/app/static/css/history.css b/app/static/css/history.css deleted file mode 100644 index 3f508f1..0000000 --- a/app/static/css/history.css +++ /dev/null @@ -1,552 +0,0 @@ -.history-layout { - min-height: 100vh; - display: flex; - flex-direction: column; -} - -.history-layout .site-header, -.history-layout .footer-box { - flex-shrink: 0; -} - -.history-page { - width: 100%; - flex: 1 1 auto; - min-height: 0; - padding: 36px 0; - background: #0A0A0A; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; - box-sizing: border-box; -} - -.history-pc { - width: min(1800px, calc(100% - 120px)); - max-width: none; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 24px; -} - -.history-nav { - display: none; -} - -.history-main { - width: min(1800px, calc(100% - 120px)); - max-width: none; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 24px; -} - -.history-breadcrumb { - align-self: stretch; - overflow: hidden; - display: inline-flex; - justify-content: flex-start; - align-items: center; - gap: 10px; -} - -.history-breadcrumb-link { - color: #EC237F; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - text-decoration: none; -} - -.history-breadcrumb-sep { - color: #666666; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.history-breadcrumb-current { - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.history-head { - align-self: stretch; - overflow: hidden; - display: flex; - justify-content: flex-start; - align-items: center; - gap: 6px; -} - -.history-head-text { - flex: 1 1 0; - min-width: 0; - overflow: hidden; - display: flex; - justify-content: flex-start; - align-items: center; - gap: 12px; -} - -.history-title { - margin: 0; - color: white; - font-size: 30px; - font-family: PingFang SC; - font-weight: 400; - line-height: 36px; - flex-shrink: 0; -} - -.history-desc { - margin: 0; - color: #A3A3A3; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.history-clear-btn { - width: 96px; - height: 36px; - background: rgba(255, 255, 255, 0.10); - overflow: hidden; - border: none; - border-radius: 18px; - color: #F5F5F5; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - cursor: pointer; - flex-shrink: 0; - display: flex; - justify-content: center; - align-items: center; -} - -.history-clear-btn:hover { - background: rgba(255, 255, 255, 0.14); - color: #fff; -} - -.history-confirm-mask { - position: fixed; - inset: 0; - z-index: 1000; - display: none; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.55); - padding: 24px; - box-sizing: border-box; -} - -.history-confirm-mask.is-open { - display: flex; -} - -.history-confirm-mask[hidden] { - display: none !important; -} - -.history-confirm-card { - width: 420px; - max-width: 100%; - padding: 32px 28px 28px; - position: relative; - background: linear-gradient(90deg, #21142E 0%, #0A0A17 100%); - box-shadow: 0 20px 48px rgba(0, 0, 0, 0.46); - border-radius: 20px; - border: 1px solid rgba(241, 43, 158, 0.44); - display: flex; - flex-direction: column; - align-items: center; - gap: 14px; - box-sizing: border-box; -} - -.history-confirm-close { - width: 28px; - height: 28px; - right: 14px; - top: 14px; - position: absolute; - overflow: hidden; - border: none; - padding: 0; - background: transparent; - cursor: pointer; -} - -.history-confirm-close-ring { - width: 26px; - height: 26px; - left: 1px; - top: 1px; - position: absolute; - background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.18); - border-radius: 50%; - box-sizing: border-box; -} - -.history-confirm-close-x { - width: 8px; - height: 8px; - left: 10px; - top: 10px; - position: absolute; - box-sizing: border-box; -} - -.history-confirm-close-x::before, -.history-confirm-close-x::after { - content: ""; - position: absolute; - left: 50%; - top: 50%; - width: 10px; - height: 1.5px; - background: #C5C0D0; - border-radius: 1px; -} - -.history-confirm-close-x::before { - transform: translate(-50%, -50%) rotate(45deg); -} - -.history-confirm-close-x::after { - transform: translate(-50%, -50%) rotate(-45deg); -} - -.history-confirm-title { - margin-top: 4px; - text-align: center; - color: #fff; - font-size: 20px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 700; - line-height: 28px; -} - -.history-confirm-desc { - text-align: center; - color: #B2ABC4; - font-size: 14px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 400; - line-height: 20px; -} - -.history-confirm-actions { - width: 100%; - margin-top: 8px; - display: flex; - align-items: center; - gap: 12px; -} - -.history-confirm-btn { - flex: 1 1 0; - height: 44px; - border: none; - border-radius: 12px; - font-size: 14px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 500; - line-height: 20px; - cursor: pointer; -} - -.history-confirm-btn--cancel { - background: rgba(255, 255, 255, 0.08); - color: #C5C0D0; -} - -.history-confirm-btn--cancel:hover { - background: rgba(255, 255, 255, 0.12); - color: #fff; -} - -.history-confirm-btn--ok { - background: #EC237F; - color: #181818; -} - -.history-confirm-btn--ok:hover { - background: #ffe56a; -} - -.history-grid { - align-self: stretch; - width: 100%; - display: grid; - grid-template-columns: repeat(8, minmax(0, 1fr)); - justify-content: stretch; - align-items: stretch; - gap: 14px 16px; -} - -.history-card.poster-card { - width: 100%; - min-width: 0; - overflow: hidden; - border-radius: 14px; - text-decoration: none; - color: inherit; -} - -.history-empty { - width: 100%; -} - -.history-card .poster-card-spacer { - flex: 1 1 0; - min-width: 8px; - height: 9px; -} - -.history-progress { - color: #808080 !important; -} - -.history-info { - display: none; -} - -.history-pagination { - align-self: stretch; - width: 100%; - overflow: hidden; - margin-top: 0; -} - -@media (max-width: 767px) { - body.is-history-page { - background: #0A0A0A; - } - - body.is-history-page .site-header, - body.is-history-page .footer-box, - body.is-history-page .floating-action, - body.is-history-page .download-fab { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - body.is-history-page .history-layout { - min-height: 100vh; - background: #0A0A0A; - } - - body.is-history-page .history-page { - padding: 0; - background: #0A0A0A; - align-items: stretch; - justify-content: flex-start; - gap: 0; - min-height: 100vh; - } - - body.is-history-page .history-pc { - display: none; - } - - body.is-history-page .history-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - } - - body.is-history-page .history-nav-back { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - body.is-history-page .history-nav-back img { - width: 24px; - height: 24px; - display: block; - opacity: 0.65; - filter: brightness(0) invert(1); - } - - body.is-history-page .history-nav-title { - margin: 0; - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - } - - body.is-history-page .history-nav-clear { - min-width: 24px; - height: 24px; - padding: 0; - border: none; - background: transparent; - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - cursor: pointer; - flex-shrink: 0; - -webkit-tap-highlight-color: transparent; - } - - body.is-history-page .history-main { - width: calc(100% - 32px); - max-width: 343px; - margin: 0 auto; - padding: 12px 0; - align-items: stretch; - gap: 12px; - box-sizing: border-box; - } - - body.is-history-page .history-grid { - width: 100%; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - gap: 12px; - } - - body.is-history-page .history-card.poster-card { - width: 100%; - max-width: none; - padding: 10px 12px; - background: rgba(255, 255, 255, 0.05); - border-radius: 14px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - gap: 12px; - box-sizing: border-box; - } - - body.is-history-page .history-card .poster-cover { - width: 90px; - height: 120px; - padding-bottom: 0; - border-radius: 10px; - overflow: hidden; - position: relative; - flex-shrink: 0; - } - - body.is-history-page .history-card .poster-cover-img { - position: absolute; - inset: 0; - width: 100%; - height: 100%; - object-fit: cover; - } - - body.is-history-page .history-card .free-badge-large, - body.is-history-page .history-card .hot-badge-large, - body.is-history-page .history-card .community-badge, - body.is-history-page .history-card .poster-corner-badges, - body.is-history-page .history-card .episode-badge, - body.is-history-page .history-card .poster-card-body, - body.is-history-page .history-pagination { - display: none !important; - } - - body.is-history-page .history-info { - flex: 1 1 0; - min-width: 0; - overflow: hidden; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 4px; - } - - body.is-history-page .history-name { - width: 100%; - color: rgba(255, 255, 255, 0.95); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - body.is-history-page .history-intro { - width: 100%; - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - line-clamp: 2; - overflow: hidden; - } - - body.is-history-page .history-watch { - width: 100%; - color: #EC237F; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } - - body.is-history-page .history-watch--done { - color: rgba(255, 255, 255, 0.45); - } - - body.is-history-page .history-time { - color: rgba(255, 255, 255, 0.45); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } -} diff --git a/app/static/css/loginDialog.css b/app/static/css/loginDialog.css deleted file mode 100644 index 1987f97..0000000 --- a/app/static/css/loginDialog.css +++ /dev/null @@ -1,205 +0,0 @@ -.login-dialog-mask { - position: fixed; - inset: 0; - z-index: 1100; - display: none; - align-items: center; - justify-content: center; - overflow-y: auto; - padding: 24px; - box-sizing: border-box; - background: rgba(0, 0, 0, 0.7); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); -} -.login-dialog-mask.is-open { display: flex; } -.login-dialog-stack { - width: 440px; - max-width: 100%; - margin: auto; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; -} -.login-dialog-card { - width: 440px; - max-width: 100%; - padding: 36px; - box-sizing: border-box; - display: flex; - flex-direction: column; - align-items: center; - gap: 18px; - color: #fff; - background: #0d0d0d; - border: 1px solid rgba(255,255,255,.2); - border-radius: 40px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; -} -.login-dialog-head { - width: 100%; - display: flex; - flex-direction: column; - gap: 12px; -} -.login-dialog-title { - color: #fff; - font-size: 24px; - font-weight: 600; - line-height: 32px; - text-align: left; -} -.login-dialog-title-h5 { display: none; } -.login-dialog-desc { - color: rgba(255,255,255,.55); - font-size: 14px; - font-weight: 400; - line-height: 20px; - text-align: left; -} -.login-dialog-form { - width: 100%; - display: flex; - flex-direction: column; - gap: 24px; -} -.login-dialog-field-group { - width: 100%; - display: flex; - flex-direction: column; - gap: 12px; -} -.login-dialog-label { - display: block; - color: rgba(255,255,255,.55); - font-size: 16px; - font-weight: 400; - line-height: 22px; -} -.login-dialog-field { - width: 100%; - min-height: 60px; - padding: 18px; - box-sizing: border-box; - display: flex; - align-items: center; - overflow: hidden; - background: rgba(255,255,255,.05); - border: 1px solid rgba(255,255,255,.05); - border-radius: 6px; -} -.login-dialog-field--password { justify-content: space-between; gap: 10px; } -.login-dialog-sr { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - white-space: nowrap; - border: 0; -} -.login-dialog-input { - width: 100%; - min-width: 0; - padding: 0; - color: #fff; - font: 400 16px/22px "PingFang SC", "Noto Sans SC", sans-serif; - background: transparent; - border: 0; - outline: 0; -} -.login-dialog-input::placeholder { color: rgba(255,255,255,.35); opacity: 1; } -.login-dialog-eye { - width: 20px; - height: 20px; - padding: 0; - flex: 0 0 20px; - display: flex; - align-items: center; - justify-content: center; - background: transparent; - border: 0; - cursor: pointer; -} -.login-dialog-eye img { display: block; width: 20px; height: 20px; } -.login-dialog-error { - margin: 0; - color: #ef4444; - font-size: 12px; - font-weight: 400; - line-height: 18px; -} -.login-dialog-error[hidden] { display: none; } -.login-dialog-submit { - width: 100%; - min-height: 50px; - padding: 13px 0; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: center; - color: #fff; - font: 600 18px/24px "PingFang SC", "Noto Sans SC", sans-serif; - background: #ec237f; - border: 0; - border-radius: 12px; - cursor: pointer; -} -.login-dialog-submit.is-loading, -.login-dialog-submit:disabled { opacity: .75; cursor: not-allowed; } -.login-dialog-register { - width: 100%; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - gap: 10px; -} -.login-dialog-register-prefix, -.login-dialog-register-link { - font-size: 14px; - font-weight: 400; - line-height: 20px; -} -.login-dialog-register-prefix { color: rgba(255,255,255,.55); } -.login-dialog-register-link { color: #ec237f; text-decoration: none; } -.login-dialog-register-link:hover { color: #ff5b9f; } -.login-dialog-register-link--h5 { display: none; } -.login-dialog-close { - width: 36px; - height: 36px; - padding: 0; - flex: 0 0 36px; - border: 0; - background: transparent; - cursor: pointer; -} -.login-dialog-close img { display: block; width: 36px; height: 36px; } -@media (max-width: 767px) { - .login-dialog-mask { - padding: 16px; - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); - } - .login-dialog-stack { width: 300px; } - .login-dialog-card { width: 300px; padding: 24px 20px; border-radius: 20px; } - .login-dialog-title-pc { display: none; } - .login-dialog-title-h5 { display: inline; } - .login-dialog-title { font-size: 16px; line-height: 22px; } - .login-dialog-desc { font-size: 12px; line-height: 18px; } - .login-dialog-head { gap: 6px; } - .login-dialog-form { gap: 12px; } - .login-dialog-field-group { gap: 6px; } - .login-dialog-label { font-size: 14px; line-height: 20px; } - .login-dialog-field { min-height: 54px; padding: 16px 18px; } - .login-dialog-input { font-size: 14px; line-height: 20px; } - .login-dialog-submit { font-weight: 400; } - .login-dialog-register { height: 24px; } - .login-dialog-register-prefix, - .login-dialog-register-link { font-size: 12px; line-height: 18px; } - .login-dialog-register-link--pc { display: none; } - .login-dialog-register-link--h5 { display: inline; } -} diff --git a/app/static/css/play.css b/app/static/css/play.css index ed17ffc..5b3d413 100644 --- a/app/static/css/play.css +++ b/app/static/css/play.css @@ -739,37 +739,70 @@ a.play-info-tag:focus-visible { display: none; } -.play-ep-lock, -.play-ep-coin { +.play-ep-lock { position: absolute; - right: 6px; + right: 4px; left: auto; - top: 6px; - width: 16px; + top: 4px; height: 16px; - padding: 0; - background: none; - border-radius: 0; + padding: 0 4px; + background: linear-gradient(135deg, #FF5F62 0%, #EC237F 100%); + border-radius: 4px; display: block; - overflow: visible; box-sizing: border-box; pointer-events: none; z-index: 1; - object-fit: contain; + color: #fff; + font-size: 10px; + font-weight: 500; + line-height: 16px; + white-space: nowrap; } -.play-ep-coin img { - width: 16px; - height: 16px; - object-fit: contain; - display: block; -} - -.play-ep--active .play-ep-coin, .play-ep--active .play-ep-lock { display: none; } +/* 付费剧集:播放器内引导下载 APP。 */ +.play-player-locked { + position: absolute; + left: 50%; + top: 50%; + z-index: 4; + transform: translate(-50%, -50%); + width: calc(100% - 32px); + max-width: 320px; + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + text-align: center; +} + +.play-player-locked-text { + margin: 0; + color: rgba(255, 255, 255, 0.85); + font-size: 14px; + line-height: 20px; +} + +.play-player-locked-btn { + padding: 10px 24px; + border: none; + border-radius: 999px; + background: #ec237f; + color: #fff; + font-size: 15px; + font-weight: 500; + line-height: 22px; + cursor: pointer; + white-space: nowrap; +} + +.play-player-locked-btn:hover { + opacity: 0.9; +} + @media (max-width: 1200px) { .play-layout, .play-main, @@ -1202,11 +1235,6 @@ a.play-info-tag:focus-visible { transform-origin: center; } - .play-h5-side-item [data-h5-like-icon], - .play-h5-side-item [data-h5-collect-icon] { - transform: scale(0.8); - } - .play-h5-side-item[data-play-comment-open] img { transform: scale(1.09); } @@ -1215,12 +1243,6 @@ a.play-info-tag:focus-visible { transform: scale(1); } - .play-h5-side-item--active img, - .play-h5-side-item img[src*="h5_liked"], - .play-h5-side-item img[src*="h5_collected"] { - filter: none; - } - .play-h5-meta { display: inline-flex; position: absolute; @@ -1609,26 +1631,6 @@ a.play-info-tag:focus-visible { line-height: 18px; } - .play-ep-sheet-collect { - flex-shrink: 0; - padding: 4px 12px; - border: none; - border-radius: 999px; - background: #ec237f; - color: #fff; - font-size: 10px; - font-family: PingFang SC; - font-weight: 400; - line-height: 16px; - cursor: pointer; - text-align: center; - } - - .play-ep-sheet-collect.is-collected { - background: rgba(255, 255, 255, 0.10); - color: #ec237f; - } - .play-ep-sheet-tabs { width: 100%; display: flex; @@ -1724,33 +1726,26 @@ a.play-info-tag:focus-visible { font-weight: 400; } - .play-ep-sheet-coin, .play-ep-sheet-lock { position: absolute; - right: 6px; + right: 4px; left: auto; - top: 6px; - width: 16px; + top: 4px; height: 16px; - padding: 0; - background: none; - border-radius: 0; + padding: 0 4px; + background: linear-gradient(135deg, #FF5F62 0%, #EC237F 100%); + border-radius: 4px; display: block; - overflow: visible; z-index: 2; box-sizing: border-box; pointer-events: none; - object-fit: contain; + color: #fff; + font-size: 10px; + font-weight: 500; + line-height: 16px; + white-space: nowrap; } - .play-ep-sheet-coin img { - width: 16px; - height: 16px; - object-fit: contain; - display: block; - } - - .play-ep-sheet-item--active .play-ep-sheet-coin, .play-ep-sheet-item--active .play-ep-sheet-lock { display: none; } @@ -1861,7 +1856,7 @@ a.play-info-tag:focus-visible { display: flex; flex-direction: column; gap: 12px; - padding: 18px 16px 0; + padding: 18px 16px calc(12px + env(safe-area-inset-bottom, 0px)); min-height: 0; flex: 1; overflow: hidden; @@ -2190,70 +2185,6 @@ a.play-info-tag:focus-visible { font-size: 12px; } - .play-comment-inline-composer { - width: 100%; - margin-top: 8px; - padding: 8px 10px; - background: rgba(255, 255, 255, 0.06); - border-radius: 8px; - box-sizing: border-box; - display: flex; - flex-direction: column; - gap: 6px; - } - - .play-comment-inline-row { - display: flex; - align-items: center; - gap: 8px; - } - - .play-comment-inline-input { - flex: 1; - min-width: 0; - height: 34px; - padding: 0 10px; - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 17px; - background: #0A0A0A; - color: #fff; - font-size: 13px; - font-family: PingFang SC; - box-sizing: border-box; - } - - .play-comment-inline-input::placeholder { - color: rgba(255, 255, 255, 0.35); - } - - .play-comment-inline-input:focus, - .play-comment-inline-input:focus-visible { - border-color: rgba(236, 35, 127, 0.55); - outline: none; - outline-color: transparent; - box-shadow: none; - } - - .play-comment-inline-send { - flex-shrink: 0; - height: 34px; - padding: 0 12px; - border: none; - border-radius: 17px; - background: #ec237f; - color: #fff; - font-size: 13px; - font-family: PingFang SC; - font-weight: 500; - cursor: pointer; - } - - .play-comment-inline-send:disabled, - .play-comment-inline-send.is-loading { - opacity: 0.6; - cursor: not-allowed; - } - .play-comment-replies-all { background: none; border: none; @@ -2267,119 +2198,6 @@ a.play-info-tag:focus-visible { text-align: left; } - .play-comment-composer { - width: 100%; - height: calc(58px + env(safe-area-inset-bottom, 0px)); - padding: 6px 16px calc(6px + env(safe-area-inset-bottom, 0px)); - background: #1A1A1A; - box-sizing: border-box; - flex-shrink: 0; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 10px; - } - - .play-comment-composer-box { - align-self: stretch; - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - min-height: 36px; - padding: 6px 12px; - background: rgba(255, 255, 255, 0.05); - border-radius: 3px; - box-sizing: border-box; - text-decoration: none; - color: inherit; - } - - .play-comment-composer-placeholder, - .play-comment-composer-login { - flex: 1; - min-width: 0; - color: rgba(255, 255, 255, 0.35); - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - text-decoration: none; - word-wrap: break-word; - } - - .play-comment-composer-input { - flex: 1 1 0; - width: auto; - min-width: 0; - min-height: 0; - height: 18px; - max-height: 18px; - margin: 0; - padding: 0; - border: none; - border-radius: 0; - background: transparent; - box-shadow: none; - outline: none; - outline-color: transparent; - resize: none; - overflow: hidden; - -webkit-appearance: none; - appearance: none; - -webkit-tap-highlight-color: transparent; - color: #fff; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - caret-color: #fff; - } - - .play-comment-composer-input:focus, - .play-comment-composer-input:focus-visible, - .play-comment-composer-input:active { - border: none; - outline: none; - outline-color: transparent; - box-shadow: none; - } - - .play-comment-composer-input::placeholder { - color: rgba(255, 255, 255, 0.35); - opacity: 1; - } - - .play-comment-composer-emoji { - width: 24px; - height: 24px; - padding: 0; - margin: 0; - border: none; - background: none; - cursor: pointer; - display: inline-flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - position: relative; - overflow: hidden; - } - - .play-comment-composer-emoji.is-loading { - opacity: 0.5; - pointer-events: none; - } - - .play-comment-composer-emoji img { - width: 24px; - height: 24px; - object-fit: contain; - display: block; - pointer-events: none; - } - body.play-comment-sheet-open { overflow: hidden; } @@ -2859,11 +2677,12 @@ a.play-info-tag:focus-visible { color: #ec237f; } - .play-ep-coin { - width: calc(16px * var(--play-s)); + .play-ep-lock { height: calc(16px * var(--play-s)); top: calc(6px * var(--play-s)); right: calc(6px * var(--play-s)); + font-size: calc(10px * var(--play-s)); + line-height: calc(16px * var(--play-s)); } .play-comments { width: 100%; } @@ -3000,6 +2819,5 @@ a.play-info-tag:focus-visible { .play-h5-bottom { background: #181818; } .play-speed-sheet-option.is-active, - .play-ep-sheet-tab--active, - .play-ep-sheet-collect.is-collected { color: #ec237f; } + .play-ep-sheet-tab--active { color: #ec237f; } } diff --git a/app/static/css/registerDialog.css b/app/static/css/registerDialog.css deleted file mode 100644 index ab86a82..0000000 --- a/app/static/css/registerDialog.css +++ /dev/null @@ -1,191 +0,0 @@ -.register-dialog-mask { - position: fixed; - inset: 0; - z-index: 1100; - display: none; - align-items: center; - justify-content: center; - overflow-y: auto; - padding: 24px; - box-sizing: border-box; - background: rgba(0,0,0,.7); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); -} -.register-dialog-mask.is-open { display: flex; } -.register-dialog-stack { - width: 440px; - max-width: 100%; - margin: auto; - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; -} -.register-dialog-card { - width: 440px; - max-width: 100%; - padding: 36px; - box-sizing: border-box; - display: flex; - flex-direction: column; - align-items: center; - gap: 18px; - color: #fff; - background: #0d0d0d; - border: 1px solid rgba(255,255,255,.2); - border-radius: 40px; - font-family: "PingFang SC", "Noto Sans SC", sans-serif; -} -.register-dialog-head { - width: 100%; - display: flex; - flex-direction: column; - gap: 12px; -} -.register-dialog-title { - color: #fff; - font-size: 24px; - font-weight: 600; - line-height: 32px; - text-align: left; -} -.register-dialog-desc { - color: rgba(255,255,255,.55); - font-size: 14px; - font-weight: 400; - line-height: 20px; - text-align: left; -} -.register-dialog-desc-h5 { display: none; } -.register-dialog-form { - width: 100%; - display: flex; - flex-direction: column; - gap: 24px; -} -.register-dialog-field-group { - width: 100%; - display: flex; - flex-direction: column; - gap: 12px; -} -.register-dialog-label { - display: block; - color: rgba(255,255,255,.55); - font-size: 16px; - font-weight: 400; - line-height: 22px; -} -.register-dialog-field { - width: 100%; - min-height: 60px; - padding: 18px; - box-sizing: border-box; - display: flex; - align-items: center; - overflow: hidden; - background: rgba(255,255,255,.05); - border: 1px solid rgba(255,255,255,.05); - border-radius: 6px; -} -.register-dialog-sr { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - white-space: nowrap; - border: 0; -} -.register-dialog-input { - width: 100%; - min-width: 0; - padding: 0; - color: #fff; - font: 400 16px/22px "PingFang SC", "Noto Sans SC", sans-serif; - background: transparent; - border: 0; - outline: 0; -} -.register-dialog-input::placeholder { color: rgba(255,255,255,.35); opacity: 1; } -.register-dialog-error { - margin: 0; - color: #ef4444; - font-size: 12px; - font-weight: 400; - line-height: 18px; -} -.register-dialog-error[hidden] { display: none; } -.register-dialog-submit { - width: 100%; - min-height: 50px; - padding: 13px 0; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: center; - color: #fff; - font: 600 18px/24px "PingFang SC", "Noto Sans SC", sans-serif; - background: #ec237f; - border: 0; - border-radius: 12px; - cursor: pointer; -} -.register-dialog-submit.is-loading, -.register-dialog-submit:disabled { opacity: .75; cursor: not-allowed; } -.register-dialog-login { - width: 100%; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - gap: 10px; -} -.register-dialog-login-prefix, -.register-dialog-login-link { - font-size: 14px; - font-weight: 400; - line-height: 20px; -} -.register-dialog-login-prefix { display: inline; color: rgba(255,255,255,.55); } -.register-dialog-login-link { color: #ec237f; text-decoration: none; } -.register-dialog-login-link:hover { color: #ff5b9f; } -.register-dialog-login-link--h5 { display: none; } -.register-dialog-close { - width: 36px; - height: 36px; - padding: 0; - flex: 0 0 36px; - border: 0; - background: transparent; - cursor: pointer; -} -.register-dialog-close img { display: block; width: 36px; height: 36px; } -@media (max-width: 767px) { - .register-dialog-mask { - padding: 16px; - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); - } - .register-dialog-stack { width: 300px; } - .register-dialog-card { width: 300px; padding: 24px 20px; border-radius: 20px; } - .register-dialog-title { font-size: 16px; line-height: 22px; } - .register-dialog-desc { font-size: 12px; line-height: 18px; } - .register-dialog-desc-pc { display: none; } - .register-dialog-desc-h5 { display: inline; } - .register-dialog-head { gap: 6px; } - .register-dialog-form { gap: 12px; } - .register-dialog-field-group { gap: 6px; } - .register-dialog-label { font-size: 14px; line-height: 20px; } - .register-dialog-field { min-height: 54px; padding: 16px 18px; } - .register-dialog-input { font-size: 14px; line-height: 20px; } - .register-dialog-submit { font-weight: 400; } - .register-dialog-login { height: 24px; } - .register-dialog-login-prefix, - .register-dialog-login-link { font-size: 12px; line-height: 18px; } - .register-dialog-login-link--pc { display: none; } - .register-dialog-login-link--h5 { display: inline; } -} diff --git a/app/static/css/setting.css b/app/static/css/setting.css deleted file mode 100644 index 6e8306a..0000000 --- a/app/static/css/setting.css +++ /dev/null @@ -1,721 +0,0 @@ -.setting-layout { - min-height: 100vh; - display: flex; - flex-direction: column; - background: #0A0A0A; -} - -.setting-layout .site-header, -.setting-layout .footer-box { - flex-shrink: 0; -} - -.setting-page { - width: 100%; - flex: 1 1 auto; - min-height: 0; - padding: 36px 0; - background: #0A0A0A; - display: flex; - flex-direction: column; - align-items: center; - gap: 18px; - box-sizing: border-box; -} - -.setting-pc { - width: 100%; - max-width: calc(100% - 32px); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 18px; -} - -.setting-nav { - display: none; -} - -.setting-main { - width: 100%; - max-width: calc(100% - 32px); - height: 370px; - display: flex; - justify-content: flex-start; - align-items: flex-start; - gap: 18px; - box-sizing: border-box; -} - -.setting-breadcrumb { - display: inline-flex; - align-items: center; - gap: 10px; - overflow: hidden; -} - -.setting-breadcrumb-link { - color: #EC237F; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - text-decoration: none; -} - -.setting-breadcrumb-sep { - color: #666666; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.setting-breadcrumb-current { - color: #8A8A8A; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.setting-head { - align-self: stretch; - display: flex; - align-items: center; - gap: 12px; - flex-wrap: wrap; - overflow: hidden; -} - -.setting-title { - margin: 0; - color: white; - font-size: 30px; - font-family: PingFang SC; - font-weight: 400; - line-height: 36px; -} - -.setting-desc { - margin: 0; - color: #A3A3A3; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.setting-panel, -.setting-aside { - height: 100%; - min-height: 0; - padding: 24px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 14px; - box-sizing: border-box; -} - -.setting-profile-pc { - width: 560px; - flex-shrink: 0; -} - -.setting-profile-mobile { - display: none; -} - -.setting-aside { - flex: 1 1 0; - align-self: stretch; - min-width: 0; -} - -.setting-panel-title, -.setting-aside-title { - margin: 0; - color: white; - font-size: 20px; - font-family: PingFang SC; - font-weight: 400; - line-height: 26px; -} - -.setting-section-label { - display: none; -} - -.setting-avatar-row { - display: flex; - align-items: center; - gap: 14px; - overflow: hidden; -} - -.setting-avatar { - width: 64px; - height: 64px; - border-radius: 999px; - object-fit: cover; - flex-shrink: 0; -} - -.setting-avatar-text { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 3px; - overflow: hidden; -} - -.setting-avatar-name { - color: white; - font-size: 18px; - font-family: PingFang SC; - font-weight: 400; - line-height: 24px; -} - -.setting-avatar-change { - padding: 0; - border: none; - background: none; - color: #EC237F; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - cursor: pointer; - text-decoration: none; -} - -.setting-field { - align-self: stretch; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 6px; - overflow: visible; -} - -.setting-label { - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.setting-input { - align-self: stretch; - width: 100%; - min-height: 44px; - padding: 12px 14px; - background: rgba(255, 255, 255, 0.05); - border-radius: 12px; - border: 1px solid rgba(255, 255, 255, 0.10); - color: #F5F5F5; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - box-sizing: border-box; - -webkit-appearance: none; - appearance: none; - box-shadow: none; - outline: none; - outline-color: transparent; - opacity: 1; - -webkit-text-fill-color: #F5F5F5; -} - -.setting-input--static { - display: flex; - align-items: center; - min-height: 44px; -} - -.setting-input:focus, -.setting-input:focus-visible { - border-color: rgba(250, 220, 68, 0.55); - outline: none; - outline-color: transparent; - box-shadow: none; -} - -.setting-input:read-only, -.setting-input[readonly] { - opacity: 1; - color: #F5F5F5; - -webkit-text-fill-color: #F5F5F5; - cursor: default; -} - -.setting-input::placeholder { - color: #A3A3A3; - -webkit-text-fill-color: #A3A3A3; - opacity: 1; -} - -.setting-save-btn { - width: 128px; - height: 40px; - background: #EC237F; - border: none; - border-radius: 20px; - color: #181818; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - cursor: pointer; - display: inline-flex; - align-items: center; - justify-content: center; - text-decoration: none; - box-sizing: border-box; -} - -.setting-group { - align-self: stretch; - display: flex; - flex-direction: column; - align-items: stretch; -} - -.setting-group--security { - margin: 0; -} - -.setting-item { - align-self: stretch; - padding: 12px 0; - border: none; - background: transparent; - display: grid; - grid-template-columns: 1fr auto; - grid-template-areas: - "label action" - "hint action"; - align-items: center; - column-gap: 12px; - row-gap: 2px; - box-sizing: border-box; - text-align: left; - text-decoration: none; - color: inherit; - cursor: pointer; - font: inherit; - -webkit-tap-highlight-color: transparent; - overflow: hidden; -} - -.setting-group--notify .setting-item { - display: flex; - padding: 8px 0; - cursor: default; -} - -.setting-item-label { - grid-area: label; - color: white; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.setting-group--notify .setting-item-label { - color: #DBD7E4; -} - -.setting-item-hint { - grid-area: hint; - color: #8A8A8A; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.setting-item-action { - grid-area: action; - padding: 0; - border: none; - background: none; - color: #EC237F; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - flex-shrink: 0; -} - -.setting-item-right, -.setting-item-value, -.setting-item-arrow, -.setting-item-avatar { - display: none; -} - -.setting-switch { - width: 42px; - height: 24px; - margin-left: auto; - position: relative; - background: rgba(255, 255, 255, 0.12); - border: none; - border-radius: 12px; - cursor: pointer; - flex-shrink: 0; - padding: 0; -} - -.setting-switch::after { - content: ""; - width: 18px; - height: 18px; - position: absolute; - left: 3px; - top: 3px; - background: white; - border-radius: 9999px; - transition: left 0.15s ease; -} - -.setting-switch--on { - background: #EC237F; -} - -.setting-switch--on::after { - left: 21px; -} - -.setting-logout { - width: 130px; - height: 40px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 20px; - border: 1px solid #EC237F; - display: inline-flex; - justify-content: center; - align-items: center; - color: #EC237F; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - text-decoration: none; - box-sizing: border-box; - cursor: pointer; -} - -@media (max-width: 1100px) { - .setting-main { - height: auto; - flex-wrap: wrap; - } - - .setting-profile-pc, - .setting-aside { - width: 100%; - height: auto; - } -} - -@media (max-width: 767px) { - body.is-setting-page { - background: #0A0A0A; - padding-bottom: 0; - } - - body.is-setting-page .site-header, - body.is-setting-page .footer-box, - body.is-setting-page .floating-action, - body.is-setting-page .download-fab { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - .setting-layout { - min-height: 100vh; - background: #0A0A0A; - } - - .setting-page { - padding: 0; - background: #0A0A0A; - align-items: stretch; - justify-content: flex-start; - gap: 0; - min-height: 100vh; - height: auto; - overflow: visible; - flex: 1 1 auto; - } - - .setting-pc { - display: none; - } - - .setting-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - overflow: hidden; - } - - .setting-nav-back { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - } - - .setting-nav-back img { - width: 24px; - height: 24px; - display: block; - opacity: 0.55; - filter: brightness(0) invert(1); - } - - .setting-nav-title { - margin: 0; - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - overflow: hidden; - } - - .setting-nav-spacer { - width: 24px; - height: 24px; - flex-shrink: 0; - } - - .setting-main { - width: calc(100% - 32px); - max-width: 343px; - height: auto; - margin: 0 auto; - padding: 14px 0; - flex: 1 1 auto; - flex-direction: column; - align-items: stretch; - gap: 10px; - box-sizing: border-box; - min-height: 0; - overflow: hidden; - } - - .setting-profile-pc { - display: none; - } - - .setting-profile-mobile { - display: flex; - flex-direction: column; - align-items: stretch; - gap: 10px; - flex: none; - width: 100%; - overflow: hidden; - } - - .setting-aside { - flex: none; - width: 100%; - min-height: 0; - height: auto; - padding: 0; - background: transparent; - border: none; - border-radius: 0; - overflow: visible; - gap: 10px; - align-self: stretch; - } - - .setting-aside-title { - display: none; - } - - .setting-section-label { - display: block; - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - } - - .setting-group { - width: 100%; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - } - - .setting-item { - width: 100%; - height: 52px; - padding: 0 14px; - border-bottom: 1px rgba(255, 255, 255, 0.10) solid; - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - box-sizing: border-box; - overflow: hidden; - } - - .setting-group .setting-item:last-child { - border-bottom: none; - } - - .setting-item--avatar { - height: 76px; - } - - .setting-item-hint, - .setting-item-action { - display: none; - } - - .setting-item-label { - color: rgba(255, 255, 255, 0.90); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - flex-shrink: 0; - } - - .setting-item-right { - min-width: 0; - display: flex; - justify-content: flex-start; - align-items: center; - gap: 6px; - overflow: hidden; - } - - .setting-item-value { - display: block; - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - max-width: 180px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .setting-item-avatar { - width: 48px; - height: 48px; - border-radius: 999px; - object-fit: cover; - display: block; - flex-shrink: 0; - border: 1px solid rgba(250, 220, 68, 0.35); - } - - .setting-item-arrow { - width: 18px; - height: 18px; - display: block; - flex-shrink: 0; - opacity: 0.55; - filter: brightness(0) invert(1); - } - - .setting-group--security .setting-item { - height: 52px; - } - - .setting-group--notify .setting-item { - height: 52px; - padding: 0 14px; - cursor: default; - } - - .setting-group--notify .setting-item-label { - color: rgba(255, 255, 255, 0.90); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - } - - .setting-switch { - width: 44px; - height: 24px; - margin-left: 0; - background: rgba(255, 255, 255, 0.12); - } - - .setting-switch::after { - width: 20px; - height: 20px; - left: 2px; - top: 2px; - background: #fff; - } - - .setting-switch--on { - background: #EC237F; - } - - .setting-switch--on::after { - left: 22px; - } - - .setting-logout { - width: 100%; - height: 48px; - margin-top: 0; - background: rgba(255, 255, 255, 0.05); - border-radius: 14px; - border: 1px solid rgba(255, 255, 255, 0.08); - color: rgba(255, 255, 255, 0.90); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 20px; - } -} diff --git a/app/static/css/userCenter.css b/app/static/css/userCenter.css deleted file mode 100644 index 889404f..0000000 --- a/app/static/css/userCenter.css +++ /dev/null @@ -1,1146 +0,0 @@ -.user-center-layout { - min-height: 100vh; - display: flex; - flex-direction: column; -} - - -/* Figma account module — desktop canvas 1920, mobile canvas 375. */ -@media (min-width: 768px) { - .user-center-layout .user-center-page { - min-height: 0; - padding: calc(36px * var(--account-s, min(1, 100vw / 1920px))) calc(60px * var(--account-s, min(1, 100vw / 1920px))); - gap: calc(24px * var(--account-s, min(1, 100vw / 1920px))); - background: #0f0f0f; - box-sizing: border-box; - } - - .user-center-layout .user-center-pc { - width: 100%; - max-width: calc(1800px * var(--account-s, min(1, 100vw / 1920px))); - margin: 0 auto; - gap: calc(24px * var(--account-s, min(1, 100vw / 1920px))); - } - - .user-center-layout .user-center-head { - gap: min(12px, 0.625vw); - } - - .user-center-layout .user-center-eyebrow { - color: #ec237f; - font-size: clamp(11px, 0.625vw, 12px); - line-height: clamp(16px, 0.9375vw, 18px); - } - - .user-center-layout .user-center-title, - .user-center-layout .user-center-title--logged { - font-size: clamp(20px, 1.25vw, 24px); - font-weight: 600; - line-height: clamp(28px, 1.666667vw, 32px); - } - - .user-center-layout .user-center-desc { - font-size: clamp(12px, 0.729167vw, 14px); - line-height: clamp(18px, 1.041667vw, 20px); - color: rgba(255, 255, 255, 0.55); - } - - - .user-center-layout .user-center-profile { - height: min(148px, 7.708333vw); - min-height: min(148px, 7.708333vw); - padding: min(32px, 1.666667vw) min(28px, 1.458333vw); - gap: min(12px, 0.625vw); - background: rgba(255, 255, 255, 0.05); - border-radius: min(24px, 1.25vw); - } - - .user-center-layout .user-center-avatar { - width: min(84px, 4.375vw); - height: min(84px, 4.375vw); - } - - .user-center-layout .user-center-profile-info { - width: min(230px, 11.979167vw); - gap: min(3px, 0.15625vw); - } - - .user-center-layout .user-center-profile-name { - font-size: clamp(16px, 0.9375vw, 18px); - font-weight: 600; - line-height: clamp(22px, 1.25vw, 24px); - } - - .user-center-layout .user-center-profile-email { - font-size: clamp(12px, 0.729167vw, 14px); - line-height: clamp(18px, 1.041667vw, 20px); - } - - .user-center-layout .user-center-profile-id { - color: #fff; - font-size: clamp(12px, 0.729167vw, 14px); - font-weight: 400; - line-height: clamp(18px, 1.041667vw, 20px); - } - - .user-center-layout .user-center-coin-card { - position: relative; - width: min(343px, 17.864583vw); - height: min(81px, 4.21875vw); - padding: min(15px, 0.78125vw) min(16px, 0.833333vw) min(15px, 0.78125vw) min(26px, 1.354167vw); - flex-direction: row; - justify-content: space-between; - align-items: center; - gap: min(8px, 0.416667vw); - background: url('/static/images/figma-account/balance-card.svg') center/100% 100% no-repeat; - border: 0; - border-radius: min(18px, 0.9375vw); - } - - .user-center-coin-copy { - display: flex; - flex-direction: column; - gap: min(4px, 0.208333vw); - } - - .user-center-layout .user-center-coin-label { - color: transparent; - background: linear-gradient(90deg, #ff9365 0%, #ffd8bc 100%); - -webkit-background-clip: text; - background-clip: text; - font-family: "Alimama FangYuanTi VF", "PingFang SC", sans-serif; - font-size: min(16px, 0.833333vw); - font-weight: 600; - line-height: min(18px, 0.9375vw); - } - - .user-center-layout .user-center-coin-label small { - color: transparent; - background: linear-gradient(90deg, #ff9365 0%, #ffd8bc 100%); - -webkit-background-clip: text; - background-clip: text; - font-size: min(10px, 0.520833vw); - font-weight: 400; - } - - .user-center-layout .user-center-coin-value { - font-family: "Arial Narrow", sans-serif; - font-size: min(24px, 1.25vw); - font-weight: 800; - line-height: 1; - } - - .user-center-layout .user-center-coin-action { - position: relative; - width: min(72px, 3.75vw); - height: min(30px, 1.5625vw); - margin-right: min(5px, 0.260417vw); - border-radius: 0; - background: none; - color: transparent; - font-size: 0; - line-height: 0; - display: block; - flex: 0 0 auto; - object-fit: contain; - object-position: center right; - } - - .user-center-layout .user-center-login-banner { - min-height: min(178px, 9.270833vw); - padding: min(28px, 1.458333vw) min(32px, 1.666667vw); - gap: min(14px, 0.729167vw); - background: rgba(255, 255, 255, 0.05); - border-radius: min(24px, 1.25vw); - } - - .user-center-layout .user-center-login-title { - font-size: clamp(20px, 1.25vw, 24px); - font-weight: 600; - line-height: clamp(28px, 1.666667vw, 32px); - } - - .user-center-layout .user-center-login-btn { - background: #ec237f; - color: #fff; - font-weight: 500; - } - - .user-center-layout .user-center-login-arrow { - display: none; - } - - .user-center-layout .user-center-features { - gap: min(16px, 0.833333vw); - } - - .user-center-layout .user-center-feature { - height: min(120px, 6.25vw); - padding: calc(min(18px, 0.9375vw) - 1px) calc(min(22px, 1.145833vw) - 1px); - gap: min(6px, 0.3125vw); - border-radius: min(20px, 1.041667vw); - } - - .user-center-layout .user-center-feature-icon, - .user-center-layout .user-center-feature-icon img { - width: min(30px, 1.5625vw); - height: min(30px, 1.5625vw); - } - - .user-center-layout .user-center-feature-title { - font-size: min(18px, 0.9375vw); - font-weight: 600; - line-height: min(24px, 1.25vw); - } - - .user-center-layout .user-center-feature-desc { - font-size: min(12px, 0.625vw); - line-height: min(18px, 0.9375vw); - } -} - -@media (max-width: 767px) { - body.site-shell.is-user-center-page { - padding-top: calc(48px + env(safe-area-inset-top, 0px)); - background: #0f0f0f; - } - - body.is-user-center-page .site-header { - display: flex !important; - height: 48px !important; - min-height: 48px !important; - padding: 0 var(--site-shell-gutter) !important; - overflow: hidden !important; - } - - body.is-user-center-page .footer-box, - body.is-user-center-page .floating-action, - body.is-user-center-page .download-fab { - display: none !important; - } - - .user-center-layout .user-center-page { - min-height: calc(100dvh - 48px - env(safe-area-inset-top, 0px)); - padding: 0; - background: #0f0f0f; - } - - .user-center-layout .user-center-main { - display: flex; - align-items: center; - } - - .user-center-layout .user-center-mobile-profile { - width: calc(100% - 32px); - max-width: 343px; - height: 56px; - margin: 12px auto 0; - padding: 0; - gap: 12px; - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.06); - } - - .user-center-layout .user-center-mobile-avatar { - width: 56px; - height: 56px; - } - - .user-center-layout .user-center-mobile-body { - width: calc(100% - 32px); - max-width: 343px; - margin: 14px auto 0; - gap: 14px; - overflow: visible; - } - - .user-center-mobile-balance { - position: relative; - width: 100%; - height: 81px; - padding: 15px 16px 15px 26px; - border-radius: 18px; - background: url('/static/images/figma-account/balance-card.svg') center/100% 100% no-repeat; - box-sizing: border-box; - display: flex; - align-items: center; - justify-content: space-between; - color: #fff; - text-decoration: none; - } - - .user-center-mobile-balance-copy { - display: flex; - flex-direction: column; - gap: 4px; - } - - .user-center-mobile-balance-label { - color: transparent; - background: linear-gradient(90deg, #ff9365 0%, #ffd8bc 100%); - -webkit-background-clip: text; - background-clip: text; - font-family: "Alimama FangYuanTi VF", "PingFang SC", sans-serif; - font-size: 16px; - font-weight: 600; - line-height: 18px; - } - - .user-center-mobile-balance-label small { - color: transparent; - background: linear-gradient(90deg, #ff9365 0%, #ffd8bc 100%); - -webkit-background-clip: text; - background-clip: text; - font-size: 10px; - font-weight: 400; - } - - .user-center-mobile-balance-value { - font-family: "Arial Narrow", sans-serif; - font-size: 24px; - font-weight: 800; - line-height: 24px; - } - - .user-center-mobile-balance-action { - position: relative; - width: 72px; - height: 30px; - margin-right: 5px; - border-radius: 15px; - background: #f8d9ac; - color: #171717; - font-size: 12px; - font-weight: 400; - line-height: 18px; - display: flex; - align-items: center; - justify-content: center; - } - - .user-center-mobile-balance-action::after { - content: ""; - position: absolute; - z-index: 1; - top: 50%; - right: -5px; - width: 20px; - height: 23px; - background: url('/static/images/figma-account/balance-action-accent.svg') center/contain no-repeat; - transform: translateY(-50%); - pointer-events: none; - } - - - .user-center-layout .user-center-mobile-menu { - border: 0; - border-radius: 16px; - background: rgba(255, 255, 255, 0.05); - } - - .user-center-layout .user-center-mobile-menu-item { - height: 48px; - padding: 0 14px; - } - - .user-center-layout .user-center-mobile-menu-label, - .user-center-layout .user-center-mobile-menu-hint { - font-weight: 400; - } - - .user-center-layout .user-center-mobile-menu-hint { - color: rgba(255, 255, 255, 0.55); - } -} - - -.user-center-layout .site-header, -.user-center-layout .footer-box { - flex-shrink: 0; -} - -.user-center-page { - width: 100%; - flex: 1 1 auto; - min-height: 0; - padding: 36px 0; - background: #0A0A0A; - overflow: hidden; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - gap: 24px; - box-sizing: border-box; -} - -.user-center-pc { - width: 100%; - max-width: calc(100% - 32px); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 24px; -} - -.user-center-nav { - display: none; -} - -.user-center-main { - display: none; -} - -.user-center-head { - align-self: stretch; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 2px; -} - -.user-center-head-row { - align-self: stretch; - display: flex; - justify-content: space-between; - align-items: center; - gap: 16px; - flex-wrap: wrap; -} - -.user-center-head-title-wrap { - display: flex; - align-items: center; - gap: 12px; - flex-wrap: wrap; - min-width: 0; -} - -.user-center-guest-register-btn { - height: 32px; - padding: 0 14px; - border-radius: 16px; - background: #EC237F; - color: #181818; - font-size: 13px; - font-family: PingFang SC; - font-weight: 500; - line-height: 18px; - text-decoration: none; - display: inline-flex; - align-items: center; - justify-content: center; - white-space: nowrap; - box-sizing: border-box; -} - -.user-center-guest-register-btn:hover { - filter: brightness(0.96); -} - -.user-center-state-switch { - display: none; -} - -.user-center-state-btn { - height: 30px; - padding: 0 12px; - border-radius: 8px; - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; - text-decoration: none; - display: inline-flex; - align-items: center; - justify-content: center; -} - -.user-center-state-btn--active { - background: #EC237F; - color: #181818; -} - -.user-center-eyebrow { - color: #EC237F; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.user-center-title { - margin: 0; - color: white; - font-size: 36px; - font-family: PingFang SC; - font-weight: 400; - line-height: 42px; -} - -.user-center-title--logged { - font-size: 34px; - line-height: 40px; -} - -.user-center-desc { - color: #A3A3A3; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.user-center-profile { - align-self: stretch; - height: 176px; - min-height: 176px; - padding: 24px 28px; - background: linear-gradient(90deg, rgba(241, 43, 158, 0.17) 0%, rgba(62, 102, 255, 0.18) 100%); - overflow: hidden; - border-radius: 24px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - justify-content: flex-start; - align-items: center; - gap: 20px; - box-sizing: border-box; -} - -.user-center-avatar { - width: 84px; - height: 84px; - border-radius: 999px; - object-fit: cover; - flex-shrink: 0; -} - -.user-center-profile-info { - overflow: hidden; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - min-width: 0; -} - -.user-center-profile-name { - color: white; - font-size: 24px; - font-family: PingFang SC; - font-weight: 400; - line-height: 30px; -} - -.user-center-profile-id { - max-width: 100%; - overflow: hidden; - color: #fff; - font-family: PingFang SC, sans-serif; - font-size: 14px; - font-weight: 400; - line-height: 20px; - text-overflow: ellipsis; - white-space: nowrap; -} - -.user-center-profile-email { - color: #8A8A8A; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - max-width: 280px; -} - -.user-center-profile-badge { - padding: 4px 10px; - background: rgba(255, 255, 255, 0.08); - overflow: hidden; - border-radius: 12px; - color: #D4D4D4; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.user-center-profile-spacer { - flex: 1 1 0; - height: 1px; - min-width: 12px; -} - -.user-center-vip-card { - width: 220px; - height: 112px; - padding: 16px 18px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 12px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - box-sizing: border-box; - text-decoration: none; - flex-shrink: 0; -} - -.user-center-vip-card--active { - background: linear-gradient(180deg, #FFD597 0%, #F8D9AC 100%); - border-color: #695700; -} - -.user-center-vip-card--active .user-center-vip-label, -.user-center-vip-card--active .user-center-vip-expire { - color: #9D6200; -} - -.user-center-vip-card--active .user-center-vip-status { - color: #000; -} - -.user-center-vip-label { - color: #F59E0B; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.user-center-vip-status { - color: white; - font-size: 18px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 24px; -} - -.user-center-vip-expire { - color: #9D6200; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.user-center-vip-action { - color: #EC237F; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; -} - -.user-center-coin-card { - width: 180px; - height: 112px; - padding: 16px 18px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 12px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 4px; - box-sizing: border-box; - text-decoration: none; - flex-shrink: 0; -} - -.user-center-coin-label { - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -.user-center-coin-value { - color: white; - font-size: 30px; - font-family: PingFang SC; - font-weight: 400; - line-height: 36px; -} - -.user-center-coin-action { - display: block; - width: 72px; - height: 30px; - flex: 0 0 auto; - object-fit: contain; - object-position: center right; -} - -.user-center-login-banner { - align-self: stretch; - min-height: 190px; - padding: 28px 32px; - background: linear-gradient(90deg, rgba(241, 43, 158, 0.16) 0%, rgba(62, 102, 255, 0.18) 100%); - overflow: hidden; - border-radius: 24px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 16px; - box-sizing: border-box; -} - -.user-center-login-title { - color: white; - font-size: 24px; - font-family: PingFang SC; - font-weight: 400; - line-height: 30px; -} - -.user-center-login-desc { - color: #A3A3A3; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.user-center-login-btn { - width: 126px; - height: 42px; - background: white; - overflow: hidden; - border-radius: 21px; - justify-content: center; - align-items: center; - gap: 8px; - display: inline-flex; - text-decoration: none; - color: #181818; - font-size: 14px; - font-family: PingFang SC; - font-weight: 400; - line-height: 20px; -} - -.user-center-login-arrow { - color: #181818; - font-size: 16px; - font-family: PingFang SC; - font-weight: 400; - line-height: 22px; -} - -.user-center-features { - align-self: stretch; - display: flex; - justify-content: flex-start; - align-items: stretch; - gap: 16px; -} - -.user-center-feature { - flex: 1 1 0; - min-width: 0; - padding: 18px 22px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.10); - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - gap: 6px; - box-sizing: border-box; - text-decoration: none; - color: inherit; -} - -.user-center-feature-icon { - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; -} - -.user-center-feature-icon img { - width: 30px; - height: 30px; - object-fit: contain; -} - -.user-center-feature-title { - color: white; - font-size: 18px; - font-family: PingFang SC; - font-weight: 400; - line-height: 24px; -} - -.user-center-feature-desc { - color: #A3A3A3; - font-size: 12px; - font-family: PingFang SC; - font-weight: 400; - line-height: 18px; -} - -@media (max-width: 1100px) { - .user-center-pc .user-center-profile { - flex-wrap: wrap; - } - - .user-center-pc .user-center-profile-spacer { - display: none; - } - - .user-center-pc .user-center-vip-card, - .user-center-pc .user-center-coin-card { - flex: 1 1 180px; - width: auto; - } -} - -@media (max-width: 767px) { - body.is-user-center-page { - background: #0A0A0A; - } - - body.is-user-center-page .site-header, - body.is-user-center-page .footer-box, - body.is-user-center-page .floating-action, - body.is-user-center-page .download-fab { - display: none !important; - height: 0 !important; - min-height: 0 !important; - overflow: hidden !important; - margin: 0 !important; - padding: 0 !important; - border: none !important; - } - - .user-center-layout { - min-height: 100vh; - background: #0A0A0A; - } - - .user-center-page { - padding: 0; - padding-bottom: calc(64px + env(safe-area-inset-bottom, 0px)); - background: #0A0A0A; - align-items: stretch; - gap: 0; - min-height: 100vh; - overflow: visible; - } - - .user-center-pc { - display: none; - } - - .user-center-nav { - position: sticky; - top: 0; - z-index: 40; - width: 100%; - height: 48px; - padding: 0 16px; - display: flex; - justify-content: center; - align-items: center; - box-sizing: border-box; - flex-shrink: 0; - background: #181818; - overflow: hidden; - } - - .user-center-nav-back, - .user-center-nav-spacer { - display: none; - } - - .user-center-nav-title { - margin: 0; - flex: 1 1 0; - height: 24px; - display: flex; - justify-content: center; - align-items: center; - color: #fff; - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - } - - .user-center-main { - display: flex; - width: 100%; - max-width: 100%; - flex-direction: column; - align-items: center; - box-sizing: border-box; - } - - .user-center-mobile-profile { - width: 100%; - height: 88px; - padding: 0 16px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(255, 255, 255, 0.06); - display: flex; - justify-content: flex-start; - align-items: center; - gap: 12px; - box-sizing: border-box; - flex-shrink: 0; - overflow: hidden; - } - - .user-center-mobile-profile--guest { - gap: 10px; - } - - .user-center-mobile-avatar { - width: 56px; - height: 56px; - border-radius: 999px; - object-fit: cover; - flex-shrink: 0; - display: block; - border: 1px solid rgba(250, 220, 68, 0.35); - } - - .user-center-mobile-profile-info { - width: 199px; - max-width: 100%; - min-width: 0; - flex: 1 1 0; - height: 46px; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 2px; - overflow: hidden; - } - - .user-center-mobile-name { - color: #fff; - font-size: 18px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 24px; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .user-center-mobile-meta { - color: rgba(255, 255, 255, 0.60); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .user-center-mobile-login-btn { - flex-shrink: 0; - height: 30px; - padding: 0 14px; - background: #EC237F; - border-radius: 15px; - color: #171717; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - text-decoration: none; - display: inline-flex; - align-items: center; - justify-content: center; - } - - .user-center-mobile-guest-register-btn { - flex-shrink: 0; - height: 30px; - padding: 0 14px; - background: #EC237F; - border-radius: 15px; - color: #171717; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - text-decoration: none; - display: inline-flex; - align-items: center; - justify-content: center; - white-space: nowrap; - } - - .user-center-mobile-body { - width: calc(100% - 32px); - max-width: 343px; - margin: 14px auto 0; - display: flex; - flex-direction: column; - align-items: stretch; - gap: 14px; - box-sizing: border-box; - overflow: hidden; - } - - .user-center-mobile-vip { - position: relative; - width: 100%; - height: 88px; - min-height: 88px; - padding: 14px 16px; - background: rgba(250, 220, 68, 0.09); - border-radius: 18px; - border: 1px solid rgba(250, 220, 68, 0.24); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 5px; - box-sizing: border-box; - text-decoration: none; - } - - .user-center-mobile-vip--active { - background: linear-gradient(180deg, rgba(255, 213, 151, 0.18) 0%, rgba(248, 217, 172, 0.12) 100%); - border-color: rgba(250, 220, 68, 0.35); - } - - .user-center-mobile-vip--active .user-center-mobile-vip-title { - color: rgba(255, 255, 255, 0.95); - } - - .user-center-mobile-vip-title { - color: rgba(255, 255, 255, 0.95); - font-size: 16px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 22px; - padding-right: 100px; - } - - .user-center-mobile-vip-desc { - color: rgba(255, 255, 255, 0.62); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - padding-right: 100px; - } - - .user-center-mobile-vip--active .user-center-mobile-vip-title, - .user-center-mobile-vip--active .user-center-mobile-vip-desc { - padding-right: 100px; - } - - .user-center-mobile-vip-btn { - position: absolute; - right: 16px; - top: 50%; - transform: translateY(-50%); - width: 92px; - height: 30px; - background: #EC237F; - border-radius: 15px; - color: #171717; - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 700; - line-height: 18px; - display: inline-flex; - align-items: center; - justify-content: center; - box-sizing: border-box; - } - - .user-center-mobile-vip-btn[hidden] { - display: none !important; - } - - .user-center-mobile-menu { - width: 100%; - background: rgba(255, 255, 255, 0.05); - border-radius: 16px; - border: 1px solid rgba(255, 255, 255, 0.08); - overflow: hidden; - display: flex; - flex-direction: column; - align-items: stretch; - } - - .user-center-mobile-menu-item { - width: 100%; - height: 48px; - padding: 0 14px; - border-bottom: 1px rgba(255, 255, 255, 0.10) solid; - display: flex; - justify-content: space-between; - align-items: center; - gap: 12px; - box-sizing: border-box; - text-decoration: none; - overflow: hidden; - } - - .user-center-mobile-menu-item:last-child { - border-bottom: none; - } - - .user-center-mobile-menu-label { - color: rgba(255, 255, 255, 0.90); - font-size: 14px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 20px; - } - - .user-center-mobile-menu-label--accent { - color: rgba(255, 255, 255, 0.90); - font-weight: 700; - } - - .user-center-mobile-menu-right { - display: flex; - align-items: center; - gap: 6px; - flex-shrink: 0; - overflow: hidden; - } - - .user-center-mobile-menu-hint { - color: rgba(255, 255, 255, 0.90); - font-size: 12px; - font-family: "Noto Sans SC", PingFang SC, sans-serif; - font-weight: 400; - line-height: 18px; - } - - .user-center-mobile-menu-arrow { - width: 18px; - height: 18px; - display: block; - opacity: 0.55; - filter: brightness(0) invert(1); - } -} diff --git a/app/static/css/vipDialog.css b/app/static/css/vipDialog.css deleted file mode 100644 index c70d864..0000000 --- a/app/static/css/vipDialog.css +++ /dev/null @@ -1,241 +0,0 @@ -.vip-dialog-mask { - position: fixed; - inset: 0; - z-index: 1000; - display: none; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.55); - padding: 24px; -} - -.vip-dialog-mask.is-open { - display: flex; -} - -.vip-dialog-card { - width: 456px; - max-width: 100%; - padding: 36px; - position: relative; - background: #0A0A0A; - box-shadow: 0px 20px 48px rgba(0, 0, 0, 0.46); - overflow: hidden; - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.10); - flex-direction: column; - justify-content: center; - align-items: center; - gap: 18px; - display: inline-flex; - box-sizing: border-box; -} - -.vip-dialog-close { - width: 28px; - height: 28px; - right: 20px; - top: 20px; - position: absolute; - overflow: hidden; - border: none; - padding: 0; - background: transparent; - cursor: pointer; -} - -.vip-dialog-close-ring { - width: 26px; - height: 26px; - left: 1px; - top: 1px; - position: absolute; - background: #fff; - border: 1px solid #fff; - border-radius: 50%; - box-sizing: border-box; -} - -.vip-dialog-close-x { - width: 8px; - height: 8px; - left: 10px; - top: 10px; - position: absolute; - box-sizing: border-box; -} - -.vip-dialog-close-x::before, -.vip-dialog-close-x::after { - content: ""; - position: absolute; - left: 50%; - top: 50%; - width: 10px; - height: 1.5px; - background: #808080; - border-radius: 1px; -} - -.vip-dialog-close-x::before { - transform: translate(-50%, -50%) rotate(45deg); -} - -.vip-dialog-close-x::after { - transform: translate(-50%, -50%) rotate(-45deg); -} - -.vip-dialog-icon { - width: 52px; - height: 52px; - position: relative; - overflow: hidden; - border-radius: 12px; - flex-shrink: 0; - color: #EC237F; -} - -.vip-dialog-icon-bg { - width: 52px; - height: 52px; - left: 0; - top: 0; - position: absolute; - opacity: 0.10; - background: #EC237F; -} - -.vip-dialog-icon-crown { - width: 24px; - height: 21px; - left: 14px; - top: 16px; - position: absolute; - display: block; -} - -.vip-dialog-title { - text-align: center; - color: white; - font-size: 24px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 700; - line-height: 30px; - word-wrap: break-word; -} - -.vip-dialog-desc { - text-align: center; - color: #8A8A8A; - font-size: 14px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 400; - line-height: 20px; - word-wrap: break-word; -} - -.vip-dialog-benefits { - text-align: center; - color: #F59E0B; - font-size: 12px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 700; - line-height: 18px; - word-wrap: break-word; -} - -.vip-dialog-cta { - align-self: stretch; - width: 100%; - height: 48px; - background: #EC237F; - overflow: hidden; - border-radius: 24px; - justify-content: center; - align-items: center; - display: inline-flex; - color: #181818; - font-size: 16px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 700; - line-height: 22px; - word-wrap: break-word; - text-decoration: none; - box-sizing: border-box; -} - -.vip-dialog-skip { - text-align: center; - color: #8A8A8A; - font-size: 12px; - font-family: "Noto Sans SC", "PingFang SC", sans-serif; - font-weight: 400; - line-height: 18px; - word-wrap: break-word; - border: none; - background: transparent; - padding: 0; - cursor: pointer; -} - -@media (max-width: 767px) { - .vip-dialog-mask { - background: rgba(0, 0, 0, 0.70); - padding: 16px; - } - - .vip-dialog-card { - width: 300px; - max-width: calc(100vw - 32px); - padding: 32px 24px; - background: rgba(23, 23, 23, 0.98); - box-shadow: 0px 16px 32px rgba(0, 0, 0, 0.45); - border-radius: 24px; - border: 1px solid rgba(255, 255, 255, 0.10); - } - - .vip-dialog-close { - right: 12px; - top: 12px; - background: rgba(255, 255, 255, 0.08); - border-radius: 14px; - } - - .vip-dialog-close-ring { - display: none; - } - - .vip-dialog-close-x::before, - .vip-dialog-close-x::after { - background: rgba(255, 255, 255, 0.60); - } - - .vip-dialog-icon { - color: #fff; - border-radius: 0; - } - - .vip-dialog-icon-bg { - opacity: 1; - background: linear-gradient(135deg, #F12B9E 0%, #6D4BFF 100%); - } - - .vip-dialog-desc { - align-self: stretch; - color: rgba(255, 255, 255, 0.60); - } - - .vip-dialog-benefits { - width: 100%; - max-width: 287px; - color: #EC237F; - } - - .vip-dialog-cta { - color: #171717; - } - - .vip-dialog-skip { - color: rgba(255, 255, 255, 0.60); - } -} diff --git a/app/static/favicon.ico b/app/static/favicon.ico index 55998fc04d8808180914e4779fd059867f7e9099..6b1a28583718d690d8d48fb43c1f5ddd283c73e9 100644 GIT binary patch literal 17541 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 literal 81601 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 aqc*{~&NE~#R>_zE`s<3;H9Dh3iufPqBnx@~ literal 232966 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¨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 RTS@=`002ovPDHLkV1ffpPHF%E diff --git a/app/static/favicon.svg b/app/static/favicon.svg index c52a98a..ebf0f22 100644 --- a/app/static/favicon.svg +++ b/app/static/favicon.svg @@ -1,74 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/static/images/coin.png b/app/static/images/coin.png deleted file mode 100644 index c5bdc2f59905648aa461c97e43bcb337862962aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9540 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 i_=Q1!%|P;)sQ(9oNn1j_-Op420000 - - - - - - - - - - - - diff --git a/app/static/images/figma-account/balance-card.svg b/app/static/images/figma-account/balance-card.svg deleted file mode 100644 index 57d21ff..0000000 --- a/app/static/images/figma-account/balance-card.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/static/images/figma-account/deposit-balance-card.png b/app/static/images/figma-account/deposit-balance-card.png deleted file mode 100644 index 04182eed4c4665153429c77944463df638a0cf7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69741 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 W(mQk5k(Xw&xw!r!NZSt|XBMtzU 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 - - - - diff --git a/app/static/images/figma-account/feature-history.svg b/app/static/images/figma-account/feature-history.svg deleted file mode 100644 index b7bf0c2..0000000 --- a/app/static/images/figma-account/feature-history.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/app/static/images/figma-account/feature-setting.svg b/app/static/images/figma-account/feature-setting.svg deleted file mode 100644 index fbb48ac..0000000 --- a/app/static/images/figma-account/feature-setting.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/static/images/figma-account/feature-wallet.svg b/app/static/images/figma-account/feature-wallet.svg deleted file mode 100644 index 09b9c1f..0000000 --- a/app/static/images/figma-account/feature-wallet.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/static/images/figma-account/package-coin.svg b/app/static/images/figma-account/package-coin.svg deleted file mode 100644 index 3cda36c..0000000 --- a/app/static/images/figma-account/package-coin.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/static/images/figma-account/usage-member.svg b/app/static/images/figma-account/usage-member.svg deleted file mode 100644 index c2c9500..0000000 --- a/app/static/images/figma-account/usage-member.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/app/static/images/figma-account/usage-reward.svg b/app/static/images/figma-account/usage-reward.svg deleted file mode 100644 index 12f561c..0000000 --- a/app/static/images/figma-account/usage-reward.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/static/images/figma-account/usage-unlock.svg b/app/static/images/figma-account/usage-unlock.svg deleted file mode 100644 index 2cd1b54..0000000 --- a/app/static/images/figma-account/usage-unlock.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/static/images/figma-dialogs/alipay.svg b/app/static/images/figma-dialogs/alipay.svg deleted file mode 100644 index 9231e14..0000000 --- a/app/static/images/figma-dialogs/alipay.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/static/images/figma-dialogs/coin-unlock.svg b/app/static/images/figma-dialogs/coin-unlock.svg deleted file mode 100644 index 2528267..0000000 --- a/app/static/images/figma-dialogs/coin-unlock.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/static/images/figma-dialogs/download-logo-mobile.svg b/app/static/images/figma-dialogs/download-logo-mobile.svg index bc534c6..01050c0 100644 --- a/app/static/images/figma-dialogs/download-logo-mobile.svg +++ b/app/static/images/figma-dialogs/download-logo-mobile.svg @@ -1,65 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/static/images/figma-dialogs/download-logo-pc.svg b/app/static/images/figma-dialogs/download-logo-pc.svg index 69ace31..b695f62 100644 --- a/app/static/images/figma-dialogs/download-logo-pc.svg +++ b/app/static/images/figma-dialogs/download-logo-pc.svg @@ -1,65 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/static/images/figma-dialogs/password-eye.svg b/app/static/images/figma-dialogs/password-eye.svg deleted file mode 100644 index 2a78751..0000000 --- a/app/static/images/figma-dialogs/password-eye.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/static/images/figma-dialogs/usdt.svg b/app/static/images/figma-dialogs/usdt.svg deleted file mode 100644 index bda3787..0000000 --- a/app/static/images/figma-dialogs/usdt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/static/images/figma-dialogs/wechat.svg b/app/static/images/figma-dialogs/wechat.svg deleted file mode 100644 index 5b31973..0000000 --- a/app/static/images/figma-dialogs/wechat.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/app/static/images/figma-home/footer-logo-desktop.png b/app/static/images/figma-home/footer-logo-desktop.png index a7031f35731812bdbbf286ff93491e2e9b20482c..5ae6f95abe0a54814e11f98b88264c28ed80e4da 100644 GIT binary patch literal 6347 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 U<-YO4KYz0-O6rQG^6&ir4~$MM82|tP literal 19809 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 M07*qoM6N<$f<%h^iU0rr diff --git a/app/static/images/figma-home/header-coin.png b/app/static/images/figma-home/header-coin.png deleted file mode 100644 index ab6494935fd3b1fa5349942250a09d580b688534..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5493 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 diff --git a/app/static/images/figma-home/header-logo-desktop.png b/app/static/images/figma-home/header-logo-desktop.png deleted file mode 100644 index 41b3d11fd9cc289de819eba034d502af0efab896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11666 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 diff --git a/app/static/images/figma-home/mobile/drawer-logo.png b/app/static/images/figma-home/mobile/drawer-logo.png index a64f5c0d2de4aabc74597ab0543045ee09d4e5af..740fa75bb8c6b423ae60b977ab950adaeb21c80e 100644 GIT binary patch literal 4324 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 LOyiB3efWO>c#v96 literal 11537 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/static/images/isVip.png b/app/static/images/isVip.png deleted file mode 100644 index ddbb7ebc30e3e2f1cd8ac4ef1c3568430c278332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4717 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 diff --git a/app/static/images/jbcz.png b/app/static/images/jbcz.png deleted file mode 100644 index 78a30eb84c9801c3dc063792ffcd0085937ea697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 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 E0ePu1umAu6 literal 4550 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 VLW}G(*#G`#40KGi>ok$E{|6NF!H)m{ diff --git a/app/static/images/logo.png b/app/static/images/logo.png index 2a73bfe3e7e135632a8fbd0e7356cf6bf7050579..47e5c3c7ccb1373cd8cc491f81885ebf571668c6 100644 GIT binary patch literal 6404 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 YXEtC6{iO4v}7@L`pzFV1=c0krEJ4_$3xtx|^l< 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 + + + + diff --git a/app/static/images/tab_app_a.svg b/app/static/images/tab_app_a.svg new file mode 100644 index 0000000..e2a1564 --- /dev/null +++ b/app/static/images/tab_app_a.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/static/images/tab_wd.svg b/app/static/images/tab_wd.svg deleted file mode 100644 index 801b441..0000000 --- a/app/static/images/tab_wd.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/app/static/images/tab_wd_a.svg b/app/static/images/tab_wd_a.svg deleted file mode 100644 index f4670d1..0000000 --- a/app/static/images/tab_wd_a.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/app/static/images/vip.png b/app/static/images/vip.png deleted file mode 100644 index c633c632d9e759e46d9f1b82509c4d3c2a9f7653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1546 zcmV+l2KD)gP)PG%bDWfZfqihTqKrmHMv#hh zLqkGtYGAFRjHsQ7o0WfRXI(frIFpQbHa0eJXkmVNXk=klVq#NiWmqvWF=%5^85tQ~ zUR5qG7c(<6IXO5iEG;rJF*P+cJ3KlmDJoV{LqI=1G&D0XFfcAIE?QMaSyV<;PeW2o zLOMD*H#avcD=Qcm7E4G!K0Z7oB_{Lg(?>-?M?^jE=FRBd!(LZMT~|gD|EO*SO)*u-?w9 zlZ<$Yf^&d;ZEb92W@B4oUs!BrS6W$8URqIBRZmb)N=HUTJUKHpGcYYICM6;t{rd0y z`Re)e;r#a9`SIQK>(%Y#((&lg>fp=n=gRZt#OK_=K4Q$;Zpcz{0`3&B?sQxuev?p{}Z- z(7>L#uau*nkFTYPXkk@TP)JTqM-UMdJGNWf0000ubW%=J03ZeaTU!?X{{H^{{{8;_ z_~xQIG5!7d_U`WO>fhho*3;6&y}Y}&p_g}dc4=K)Q%*lDA07(|UBkx}0009iNkl0Vn<21yw2>Yq_tXsz#${OlZ-R#(Z}9`a!Ez6;L`*f>Lfy2l_jb zsx+mg8k+TUbe|Qysz4xQfBVjXLFAUh06)>(TN2Y_zO=kzI2;az2tsDV#1Pt71PIQV zE45lWb~%2jN;P;(ZnxWH7^^c7N_7L?aHUyK3oKP4kxr@#kK{H!uYqESYarBs7q0*W z$$B2|+uf>Jl|DR|`?~SV^C*d;WX(&Z0l~XL!RjzisPCN|9;zPBz1Q&IQ^AucE{}E< z;Rs@!0S1-qX{&GFs;$3sU!izVknet?ZpynGMJUAC0}9&xB3-$o?!MyT!;H+#=6rXy z>3UYi2R@&o&^}NwAuW-rD#lqkORav|+&b?oZo+&7Lv8?qRTC<&S8uO=tbS@TwPZIx zGpSj>_BSlS7(OuQ2>tX{*qu!++1YOQi$^APW`-i~&4>htNC_}VvE}6a^4SaBFY@yX z3LeG$hI^Ak5JV!*o4{bu=kr-Z(r2x0ZEd5Cc@1}7-Oe3xI1C8i1q`MfN~JOow7H_! z{xZjqtZ#Icfr3v~J;=y%qKai@IX65zK^TWvCe5X-uXi@SSz zX8QX}O1vTxfsIZ%G{6C{bqy{SL+`}|Lh)f3#*M~^grxWqx!jd@02Cy4PQeV+1z|Fb z&lVCq!p!?Fd0H8G1YAi;Eq0=i7?Tk&O9Vp^)~_Mb)-O0U&UScwI1?)*a74x!DBOi| z%QkTqVS~p*Qf$IVFo>j#Fn8btX9@PLnZ{8_7J*R8$mJf2V_0tLNbSc_!~hfAU5Nl4 wz-do~Vd2b13run)ZWmH+?%07*qoM6N<$f`sDYZvX%Q diff --git a/app/static/js/common/auth.js b/app/static/js/common/auth.js deleted file mode 100644 index 8b9db72..0000000 --- a/app/static/js/common/auth.js +++ /dev/null @@ -1,454 +0,0 @@ -/** - * 认证相关前端封装:注册 / 登录 / 游客登录走本站 BFF,token 等写入 cookie。 - * 未注册用户自动游客登录(POST /api/auth/guest → 上游 /api/app/auth/guest)。 - */ -(function (global) { - var UUID_KEY = "uuid"; - var DEV_ID_KEY = "guest_dev_id"; - var CHANNEL_KEY = "channel"; - var GUEST_LOGOUT_FLAG_KEY = "guest_logout_manual"; - var guestLoginPromise = null; - var volatileDevID = ""; - /** 上游约定:token 失效需重新登录 */ - var TOKEN_EXPIRED_CODE = 1000; - var tokenRecoveryPromise = null; - - function toast(message, type) { - if (typeof global.showToast === "function") { - global.showToast(message, type || "info"); - return; - } - } - - function getInviteCode() { - try { - var params = new URLSearchParams(global.location.search || ""); - return ( - params.get("inviteCode") || - params.get("invite") || - params.get("code") || - "" - ).trim(); - } catch (e) { - return ""; - } - } - - function hasSessionToken() { - return !!(global.CookieUtil && global.CookieUtil.getToken && global.CookieUtil.getToken()); - } - - // 与 91porn-h5-client generateUid 保持一致:16 位十六进制随机串 + 毫秒时间戳。 - function generateUUID() { - var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - var uuid = []; - for (var i = 0; i < 16; i++) { - uuid[i] = chars.charAt(Math.floor(Math.random() * 16)); - } - return uuid.join("") + Date.now(); - } - - function syncDevID(devID) { - if (!devID) return; - try { - localStorage.setItem(UUID_KEY, devID); - // 保留旧 key,兼容已上线页面和服务端游客 cookie。 - localStorage.setItem(DEV_ID_KEY, devID); - } catch (e) {} - try { - if (global.CookieUtil && typeof global.CookieUtil.set === "function") { - global.CookieUtil.set(DEV_ID_KEY, devID, { days: 365 }); - } - } catch (e2) {} - } - - function getOrCreateDevID() { - var devID = ""; - try { - devID = (localStorage.getItem(UUID_KEY) || "").trim(); - } catch (e) {} - if (devID) { - syncDevID(devID); - return devID; - } - - // 首屏 SSR 可能已生成同规则 UUID 并写入 cookie,优先复用以保持游客身份一致。 - var fromCookie = - global.CookieUtil && typeof global.CookieUtil.get === "function" - ? global.CookieUtil.get(DEV_ID_KEY) - : ""; - if (fromCookie) { - syncDevID(fromCookie); - return fromCookie; - } - - if (!volatileDevID) { - volatileDevID = generateUUID(); - } - syncDevID(volatileDevID); - return volatileDevID; - } - - function getChannel() { - var channel = ""; - try { - channel = (localStorage.getItem(CHANNEL_KEY) || "").trim(); - if (channel) { - if (global.CookieUtil && typeof global.CookieUtil.set === "function") { - global.CookieUtil.set(CHANNEL_KEY, channel, { days: 365 }); - } - return channel; - } - } catch (e) {} - try { - var params = new URLSearchParams(global.location.search || ""); - channel = (params.get("dc") || params.get("ch") || params.get("pc") || "").trim(); - if (channel) { - localStorage.setItem(CHANNEL_KEY, channel); - if (global.CookieUtil && typeof global.CookieUtil.set === "function") { - global.CookieUtil.set(CHANNEL_KEY, channel, { days: 365 }); - } - } - } catch (e2) {} - return channel; - } - - function clearGuestLogoutFlag() { - try { - sessionStorage.removeItem(GUEST_LOGOUT_FLAG_KEY); - } catch (e) {} - try { - if (global.CookieUtil && typeof global.CookieUtil.remove === "function") { - global.CookieUtil.remove("guest_skip_auto"); - } - } catch (e2) {} - } - - function markGuestLogout() { - try { - sessionStorage.setItem(GUEST_LOGOUT_FLAG_KEY, "1"); - } catch (e) {} - try { - if (global.CookieUtil && typeof global.CookieUtil.set === "function") { - // 不设 days → session cookie,配合 SSR 跳过本次自动游客 - global.CookieUtil.set("guest_skip_auto", "1"); - } - } catch (e2) {} - } - - function isGuestLogoutMarked() { - try { - if (sessionStorage.getItem(GUEST_LOGOUT_FLAG_KEY) === "1") return true; - } catch (e) {} - try { - if ( - global.CookieUtil && - typeof global.CookieUtil.get === "function" && - global.CookieUtil.get("guest_skip_auto") === "1" - ) { - return true; - } - } catch (e2) {} - return false; - } - - function syncTrackerUid(user) { - if (!user || !global.tracker || typeof global.tracker.setUid !== "function") return; - var uid = user.userId != null ? user.userId : user.uid != null ? user.uid : user.id; - if (uid == null || String(uid) === "") return; - global.tracker.setUid(String(uid)); - } - - function applyAuthSession(res, failTip) { - if (!res || res.code !== 200 || !res.data) { - var err = new Error((res && (res.tip || res.msg)) || failTip || "请求失败"); - err.code = res && res.code; - err.data = res; - throw err; - } - if (global.CookieUtil && typeof global.CookieUtil.setAuthSession === "function") { - global.CookieUtil.setAuthSession(res.data); - } - clearGuestLogoutFlag(); - syncTrackerUid(res.data); - try { - document.dispatchEvent( - new CustomEvent("auth:login", { detail: { user: res.data } }) - ); - } catch (e) {} - return res; - } - - function register(payload) { - var channel = getChannel(); - var body = { - accountNo: (payload.accountNo || "").trim(), - password: payload.password || "", - devID: getOrCreateDevID(), - channel: channel, - }; - var invite = (payload.agentInviteCode || getInviteCode() || "").trim(); - if (invite) body.agentInviteCode = invite; - - // 游客升级注册:携带当前游客 token,上游按 Authorization 绑定原游客账号。 - var options = {}; - var token = - global.CookieUtil && typeof global.CookieUtil.getToken === "function" - ? global.CookieUtil.getToken() - : ""; - var registered = - global.CookieUtil && typeof global.CookieUtil.isRegistered === "function" - ? global.CookieUtil.isRegistered() - : false; - if (token && !registered) { - options.headers = { Authorization: token }; - } - - return global.HttpRequest.post("/api/auth/register", body, options).then(function (res) { - return applyAuthSession(res, "注册失败"); - }); - } - - function login(payload) { - var body = { - account: (payload.account || "").trim(), - password: payload.password || "", - devID: getOrCreateDevID(), - channel: getChannel(), - }; - return global.HttpRequest.post("/api/auth/login", body).then(function (res) { - return applyAuthSession(res, "登录失败"); - }); - } - - function resetPassword(payload) { - return global.HttpRequest.post("/api/auth/resetPassword", { - accountNo: (payload.accountNo || "").trim(), - email: (payload.email || "").trim(), - newPassword: payload.newPassword || "", - }); - } - - function guestLogin() { - var devId = getOrCreateDevID(); - return global.HttpRequest.post("/api/auth/guest", { - devID: devId, - deviceId: devId, - channel: getChannel(), - mac: "", - }).then(function (res) { - return applyAuthSession(res, "游客登录失败"); - }); - } - - function isAuthEndpoint(url) { - return /\/api\/auth\/(guest|login|register|resetPassword)(\?|$)/.test(String(url || "")); - } - - function isSafeRedirect(path) { - return typeof path === "string" && path.charAt(0) === "/" && path.charAt(1) !== "/"; - } - - /** 注册账号:打开登录弹窗;无弹窗时跳首页登录入口 */ - function promptRegisteredRelogin() { - toast("登录已过期,请重新登录", "warning"); - var redirect = ""; - try { - redirect = (global.location.pathname || "/") + (global.location.search || ""); - } catch (e2) { - redirect = "/"; - } - var url = "/login/"; - if (isSafeRedirect(redirect) && redirect !== "/" && redirect.indexOf("/?auth=") !== 0) { - url = "/login/return" + (global.location.pathname || "/"); - } - if (typeof global.openLoginDialog === "function") { - try { - var opened = global.openLoginDialog(); - // dialogLoader 桩函数返回 Promise:加载失败时再走跳转兜底 - if (opened && typeof opened.then === "function") { - opened.catch(function () { - global.location.href = url; - }); - return; - } - return; - } catch (e) {} - } - global.location.href = url; - } - - /** - * 接口返回 code=1000(token 失效)时的统一处理。 - * - 游客:清会话后走游客登录,成功后可重试原请求 - * - 注册账号:清会话并打开登录弹窗 / 跳转登录页 - * @returns {Promise<{ok:boolean, guest?:boolean, needLogin?:boolean, res?:any}>} - */ - function handleTokenExpired() { - if (tokenRecoveryPromise) { - return tokenRecoveryPromise; - } - - var wasRegistered = - global.CookieUtil && typeof global.CookieUtil.isRegistered === "function" - ? global.CookieUtil.isRegistered() - : false; - - if (global.CookieUtil && typeof global.CookieUtil.clearAuth === "function") { - global.CookieUtil.clearAuth(); - } - try { - document.dispatchEvent( - new CustomEvent("auth:logout", { detail: { reason: "token-expired" } }) - ); - } catch (e) {} - - if (wasRegistered) { - var registeredJob = Promise.resolve().then(function () { - promptRegisteredRelogin(); - return { ok: false, needLogin: true }; - }); - tokenRecoveryPromise = registeredJob; - registeredJob.finally(function () { - setTimeout(function () { - if (tokenRecoveryPromise === registeredJob) { - tokenRecoveryPromise = null; - } - }, 1200); - }); - return registeredJob; - } - - clearGuestLogoutFlag(); - var guestJob = guestLogin() - .then(function (res) { - return { ok: true, guest: true, res: res }; - }) - .catch(function (err) { - toast("会话已失效,请刷新页面重试", "error"); - throw err; - }) - .finally(function () { - if (tokenRecoveryPromise === guestJob) { - tokenRecoveryPromise = null; - } - }); - tokenRecoveryPromise = guestJob; - return guestJob; - } - - /** - * 无 token(未自己登录)时自动游客登录。 - * SSR 也会在首屏补游客;此处作客户端兜底。 - * 手动退出后跳过本次;清掉标记后,下次进页再自动游客。 - * BFF: POST /api/auth/guest → 上游 POST /api/app/auth/guest - */ - function ensureGuestSession() { - if (hasSessionToken()) { - return Promise.resolve({ ok: true, skipped: true }); - } - if (isGuestLogoutMarked()) { - // 本次因手动退出跳过;清标记,下次进页恢复自动游客 - clearGuestLogoutFlag(); - return Promise.resolve({ ok: true, skipped: true, reason: "manual-logout" }); - } - if (!global.HttpRequest) { - return Promise.resolve({ ok: false, skipped: true, reason: "no-http" }); - } - if (!guestLoginPromise) { - guestLoginPromise = guestLogin() - .then(function (res) { - return { ok: true, res: res }; - }) - .catch(function (err) { - return { ok: false, error: err }; - }) - .finally(function () { - guestLoginPromise = null; - }); - } - return guestLoginPromise; - } - - function uploadImage(file) { - var fd = new FormData(); - fd.append("file", file); - return global.HttpRequest.post("/api/upload/image", fd).then(function (res) { - if (!res || res.code !== 200 || !res.data || !res.data.url) { - var err = new Error((res && (res.tip || res.msg)) || "上传失败"); - err.code = res && res.code; - err.data = res; - throw err; - } - return res.data; - }); - } - - function updateProfile(payload) { - var body = {}; - if (payload.nickName != null && String(payload.nickName).trim() !== "") { - body.nickName = String(payload.nickName).trim(); - } - if (payload.introduction != null) { - body.introduction = String(payload.introduction).trim(); - } - if (payload.avatar) body.avatar = payload.avatar; - if (payload.oldPassword) body.oldPassword = payload.oldPassword; - if (payload.newPassword) body.newPassword = payload.newPassword; - if (typeof payload.privacyMode === "boolean") body.privacyMode = payload.privacyMode; - - return global.HttpRequest.post("/api/auth/profile", body).then(function (res) { - if (!res || res.code !== 200) { - var err = new Error((res && (res.tip || res.msg)) || "保存失败"); - err.code = res && res.code; - err.data = res; - throw err; - } - if (res.data && global.CookieUtil && typeof global.CookieUtil.setAuthSession === "function") { - global.CookieUtil.setAuthSession(res.data); - } - if (res.data) syncTrackerUid(res.data); - return res; - }); - } - - function isValidEmail(email) { - return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(email || "").trim()); - } - - /** 登录凭证:账号 4–16 位,或合法邮箱 */ - function isValidLoginAccount(account) { - var v = String(account || "").trim(); - if (!v) return false; - if (v.indexOf("@") >= 0) return isValidEmail(v); - return v.length >= 4 && v.length <= 16; - } - - global.AuthAPI = { - TOKEN_EXPIRED_CODE: TOKEN_EXPIRED_CODE, - register: register, - login: login, - resetPassword: resetPassword, - guestLogin: guestLogin, - ensureGuestSession: ensureGuestSession, - handleTokenExpired: handleTokenExpired, - isAuthEndpoint: isAuthEndpoint, - markGuestLogout: markGuestLogout, - hasSessionToken: hasSessionToken, - uploadImage: uploadImage, - updateProfile: updateProfile, - getInviteCode: getInviteCode, - getOrCreateDevID: getOrCreateDevID, - getChannel: getChannel, - isValidEmail: isValidEmail, - isValidLoginAccount: isValidLoginAccount, - toast: toast, - }; - - // 每次页面初始化都准备好持久设备 UUID,并捕获首次渠道。 - getOrCreateDevID(); - getChannel(); - - // 首屏无 token → 自动游客登录 - ensureGuestSession(); -})(typeof window !== "undefined" ? window : this); diff --git a/app/static/js/common/cookie.js b/app/static/js/common/cookie.js deleted file mode 100644 index 053cd93..0000000 --- a/app/static/js/common/cookie.js +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Cookie 读写(登录 token / sid 等统一落 cookie) - */ -(function (global) { - function encode(value) { - return encodeURIComponent(String(value == null ? "" : value)); - } - - function decode(value) { - try { - // 兼容服务端历史 QueryEscape:空格被编成 "+",decodeURIComponent 不会还原 - return decodeURIComponent(String(value || "").replace(/\+/g, "%20")); - } catch (e) { - return value; - } - } - - function getCookie(name) { - if (!name) return ""; - var key = encodeURIComponent(name) + "="; - var parts = String(document.cookie || "").split(";"); - for (var i = 0; i < parts.length; i++) { - var part = parts[i].replace(/^\s+/, ""); - if (part.indexOf(key) === 0) { - return decode(part.slice(key.length)); - } - } - return ""; - } - - /** - * @param {string} name - * @param {string} value - * @param {{ days?: number, path?: string, sameSite?: string, secure?: boolean }} [options] - */ - function setCookie(name, value, options) { - options = options || {}; - var days = options.days; - var path = options.path || "/"; - var sameSite = options.sameSite || "Lax"; - var parts = [ - encodeURIComponent(name) + "=" + encode(value), - "path=" + path, - "SameSite=" + sameSite, - ]; - if (typeof days === "number") { - var expires = new Date(); - expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000); - parts.push("expires=" + expires.toUTCString()); - } - if (options.secure || (global.location && global.location.protocol === "https:")) { - parts.push("Secure"); - } - document.cookie = parts.join("; "); - } - - function removeCookie(name, path) { - setCookie(name, "", { days: -1, path: path || "/" }); - } - - var AUTH = { - TOKEN: "token", - SID: "sid", - S_TOKEN: "_s_token_", - USER_ID: "userId", - ACCOUNT_NO: "accountNo", - NICK_NAME: "nickName", - INTRODUCTION: "introduction", - AVATAR: "avatar", - EMAIL: "email", - INVITE_CODE: "inviteCode", - RECHARGE: "recharge", - VIP_TYPE: "vipType", - VIP_EXPIRE: "currentVipExpire", - SHOW_CARD_ID: "showCardId", - SHOW_CARD_NAME: "showCardName", - USER_TYPE: "userType", - IS_REGISTER: "isRegister", - }; - - var AUTH_KEYS = [ - AUTH.TOKEN, - AUTH.USER_ID, - AUTH.ACCOUNT_NO, - AUTH.NICK_NAME, - AUTH.INTRODUCTION, - AUTH.AVATAR, - AUTH.EMAIL, - AUTH.INVITE_CODE, - AUTH.RECHARGE, - AUTH.VIP_TYPE, - AUTH.VIP_EXPIRE, - AUTH.SHOW_CARD_ID, - AUTH.SHOW_CARD_NAME, - AUTH.USER_TYPE, - AUTH.IS_REGISTER, - "_token_", - AUTH.SID, - AUTH.S_TOKEN, - ]; - - function getToken() { - return getCookie(AUTH.TOKEN) || getCookie("_token_") || ""; - } - - function setToken(token, days) { - setCookie(AUTH.TOKEN, token || "", { days: typeof days === "number" ? days : 7 }); - } - - function getSid() { - return getCookie(AUTH.SID) || ""; - } - - function setSid(sid, days) { - setCookie(AUTH.SID, sid || "", { days: typeof days === "number" ? days : 7 }); - } - - function setAuthSession(user, days) { - if (!user) return; - var d = typeof days === "number" ? days : 7; - if (user.token) setToken(user.token, d); - if (user.userId != null) setCookie(AUTH.USER_ID, String(user.userId), { days: d }); - if (user.accountNo) setCookie(AUTH.ACCOUNT_NO, user.accountNo, { days: d }); - if (user.nickName) setCookie(AUTH.NICK_NAME, user.nickName, { days: d }); - if (user.introduction != null) setCookie(AUTH.INTRODUCTION, user.introduction || "", { days: d }); - if (user.avatar != null) setCookie(AUTH.AVATAR, user.avatar || "", { days: d }); - if (user.email != null) setCookie(AUTH.EMAIL, user.email || "", { days: d }); - if (user.inviteCode != null) setCookie(AUTH.INVITE_CODE, user.inviteCode || "", { days: d }); - // 仅在响应显式带 recharge 时写入(含 0),避免局部更新把余额抹成 0 - if (Object.prototype.hasOwnProperty.call(user, "recharge")) { - setCookie(AUTH.RECHARGE, String(Number(user.recharge) || 0), { days: d }); - } - if (user.vipType != null) setCookie(AUTH.VIP_TYPE, String(user.vipType), { days: d }); - if (user.currentVipExpire != null) { - setCookie(AUTH.VIP_EXPIRE, user.currentVipExpire || "", { days: d }); - } - if (Object.prototype.hasOwnProperty.call(user, "showCardId")) { - setCookie(AUTH.SHOW_CARD_ID, String(user.showCardId != null ? user.showCardId : ""), { days: d }); - } - if (Object.prototype.hasOwnProperty.call(user, "showCardName")) { - setCookie(AUTH.SHOW_CARD_NAME, user.showCardName || "", { days: d }); - } - if (user.type != null) setCookie(AUTH.USER_TYPE, String(user.type), { days: d }); - if (Object.prototype.hasOwnProperty.call(user, "isRegister") || user.type != null) { - var registered = !!(user.isRegister || Number(user.type) === 1); - setCookie(AUTH.IS_REGISTER, registered ? "1" : "0", { days: d }); - } - } - - function getAuthSession() { - var token = getToken(); - if (!token) return null; - return { - token: token, - userId: getCookie(AUTH.USER_ID), - accountNo: getCookie(AUTH.ACCOUNT_NO), - nickName: getCookie(AUTH.NICK_NAME), - introduction: getCookie(AUTH.INTRODUCTION), - avatar: getCookie(AUTH.AVATAR), - email: getCookie(AUTH.EMAIL), - inviteCode: getCookie(AUTH.INVITE_CODE), - recharge: getCookie(AUTH.RECHARGE), - vipType: getCookie(AUTH.VIP_TYPE), - currentVipExpire: getCookie(AUTH.VIP_EXPIRE), - showCardId: getCookie(AUTH.SHOW_CARD_ID), - showCardName: getCookie(AUTH.SHOW_CARD_NAME), - type: getCookie(AUTH.USER_TYPE), - isRegister: getCookie(AUTH.IS_REGISTER) === "1", - }; - } - - function clearAuth() { - for (var i = 0; i < AUTH_KEYS.length; i++) { - removeCookie(AUTH_KEYS[i]); - } - } - - function isLoggedIn() { - return !!getToken(); - } - - /** 是否正式注册账号(非游客) */ - function isRegistered() { - if (!isLoggedIn()) return false; - if (getCookie(AUTH.IS_REGISTER) === "1") return true; - return Number(getCookie(AUTH.USER_TYPE)) === 1; - } - - global.CookieUtil = { - get: getCookie, - set: setCookie, - remove: removeCookie, - AUTH: AUTH, - getToken: getToken, - setToken: setToken, - getSid: getSid, - setSid: setSid, - setAuthSession: setAuthSession, - getAuthSession: getAuthSession, - clearAuth: clearAuth, - isLoggedIn: isLoggedIn, - isRegistered: isRegistered, - }; -})(typeof window !== "undefined" ? window : this); diff --git a/app/static/js/common/request.js b/app/static/js/common/request.js index 6588cfe..0e30f95 100644 --- a/app/static/js/common/request.js +++ b/app/static/js/common/request.js @@ -1,6 +1,6 @@ /** * 前端请求封装。 - * - 登录态走 cookie(credentials: include) + * - 游客会话走 cookie(credentials: include),会话失效由服务端重建 * - 浏览器无法改写 User-Agent;X-Real-IP 由服务端反代上游时注入 * - 直连上游时若需自定义头,请走本站 Go 代理接口 */ @@ -87,49 +87,11 @@ return data; }); }) - .then(function (data) { - return handleTokenExpiredResponse(url, options, data); - }) .finally(function () { if (timer) clearTimeout(timer); }); } - /** - * 业务码 1000:token 失效。 - * 游客 → 重新游客登录并重试一次;注册账号 → 打开登录弹窗/跳转登录页。 - */ - function handleTokenExpiredResponse(url, options, data) { - options = options || {}; - var expiredCode = - (global.AuthAPI && global.AuthAPI.TOKEN_EXPIRED_CODE) || 1000; - if (!data || Number(data.code) !== Number(expiredCode)) { - return data; - } - if (options._skipTokenRecovery || options._tokenRetried) { - return data; - } - if ( - global.AuthAPI && - typeof global.AuthAPI.isAuthEndpoint === "function" && - global.AuthAPI.isAuthEndpoint(url) - ) { - return data; - } - if (!global.AuthAPI || typeof global.AuthAPI.handleTokenExpired !== "function") { - return data; - } - return global.AuthAPI.handleTokenExpired().then(function (result) { - if (result && result.ok && result.guest) { - return request( - url, - Object.assign({}, options, { _tokenRetried: true }) - ); - } - return data; - }); - } - global.HttpRequest = { request: request, get: function (url, options) { diff --git a/app/static/js/pages/coinDialog.js b/app/static/js/pages/coinDialog.js deleted file mode 100644 index 97f1936..0000000 --- a/app/static/js/pages/coinDialog.js +++ /dev/null @@ -1,307 +0,0 @@ -(function () { - var mask = document.getElementById("coinDialog"); - if (!mask) return; - - var balanceEls = mask.querySelectorAll("[data-coin-balance]"); - var costEls = mask.querySelectorAll("[data-coin-cost]"); - var payBtn = mask.querySelector("[data-coin-dialog-pay]"); - var loading = false; - var paying = false; - - function formatCoins(n) { - var num = Number(n); - if (!Number.isFinite(num) || num < 0) num = 0; - return String(Math.floor(num)); - } - - function setBalance(n) { - var text = formatCoins(n); - balanceEls.forEach(function (el) { - el.textContent = text; - }); - } - - function setCost(n) { - var text = formatCoins(n); - costEls.forEach(function (el) { - el.textContent = text; - }); - } - - function toast(message, type) { - if (typeof window.showToast === "function") { - window.showToast(message, type); - return; - } - window.alert(message); - } - - function openLogin() { - var loginOpen = document.querySelector("[data-login-dialog-open]"); - if (loginOpen) loginOpen.click(); - } - - function goToCoinRecharge() { - window.location.href = "/deposit/coin/"; - } - - function isInsufficientBalance(res) { - if (!res) return false; - if (Number(res.code) === 20004) return true; - var message = String(res.tip || res.msg || ""); - return /(?:金币|余额).{0,6}不足|不足.{0,6}(?:金币|余额)/.test(message); - } - - function resolvePlayletId(trigger) { - if (trigger) { - var fromTrigger = Number(trigger.getAttribute("data-playlet-id") || 0); - if (fromTrigger > 0) return fromTrigger; - } - var fromMask = Number(mask.getAttribute("data-playlet-id") || 0); - if (fromMask > 0) return fromMask; - var playPage = - document.querySelector("[data-play-page]") || - document.querySelector(".play-page"); - if (playPage) { - var fromPage = Number(playPage.getAttribute("data-playlet-id") || 0); - if (fromPage > 0) return fromPage; - } - var player = document.querySelector("[data-play-player]"); - if (player) { - var fromPlayer = Number(player.getAttribute("data-playlet-id") || 0); - if (fromPlayer > 0) return fromPlayer; - } - var likeBtn = document.querySelector("[data-playlet-id]"); - if (likeBtn) { - var fromBtn = Number(likeBtn.getAttribute("data-playlet-id") || 0); - if (fromBtn > 0) return fromBtn; - } - return 0; - } - - function resolvePlayletSlug(trigger) { - if (trigger) { - var fromTrigger = String(trigger.getAttribute("data-playlet-slug") || "").trim(); - if (fromTrigger) return fromTrigger; - } - var fromMask = String(mask.getAttribute("data-playlet-slug") || "").trim(); - if (fromMask) return fromMask; - var playPage = - document.querySelector("[data-play-page]") || - document.querySelector(".play-page"); - if (playPage) { - var fromPage = String(playPage.getAttribute("data-playlet-slug") || "").trim(); - if (fromPage) return fromPage; - } - return ""; - } - - function buildPlayHref(playletId, chapterId) { - if (!playletId || !chapterId) return ""; - var slug = resolvePlayletSlug(null); - var key = slug || String(playletId); - return "/play/" + encodeURIComponent(key) + "/" + chapterId + "/"; - } - - function isOnPlayPage() { - return !!( - document.querySelector("[data-play-page]") || - document.querySelector(".play-page") - ); - } - - function afterUnlockSuccess(playletId, chapterId, data) { - var detail = { - playletId: playletId, - chapterId: chapterId, - balance: data && typeof data.balance === "number" ? data.balance : null, - canWatch: !!(data && data.canWatch), - unlocked: !!(data && data.unlocked), - }; - window.dispatchEvent( - new CustomEvent("play:chapter-unlocked", { detail: detail }) - ); - if ( - isOnPlayPage() && - typeof window.playAfterChapterUnlock === "function" - ) { - window.playAfterChapterUnlock(detail); - return; - } - var href = buildPlayHref(playletId, chapterId); - if (href) { - window.location.href = href; - } - } - - function setPaying(on) { - paying = !!on; - if (!payBtn) return; - payBtn.disabled = paying; - payBtn.classList.toggle("is-loading", paying); - payBtn.setAttribute("aria-busy", paying ? "true" : "false"); - } - - function fetchBalance() { - if (!window.HttpRequest) { - setBalance(0); - return Promise.resolve(0); - } - return window.HttpRequest.get("/api/auth/getInfo") - .then(function (res) { - if (!res || res.code !== 200 || !res.data) { - if (res && res.code === 401) { - openLogin(); - } - throw new Error((res && (res.tip || res.msg)) || "获取余额失败"); - } - var recharge = res.data.recharge; - setBalance(recharge); - if (window.CookieUtil && CookieUtil.setAuthSession) { - CookieUtil.setAuthSession(res.data); - } - return Number(recharge) || 0; - }) - .catch(function (err) { - setBalance(0); - toast((err && err.message) || "获取余额失败", "error"); - return 0; - }); - } - - function unlockAndPlay() { - if (paying) return; - if (!window.HttpRequest) { - toast("网络模块未就绪", "error"); - return; - } - - var chapterId = Number(mask.getAttribute("data-chapter-id") || 0); - var playletId = Number(mask.getAttribute("data-playlet-id") || 0); - var cost = Number(mask.getAttribute("data-single-coins") || 0); - var balance = Number( - (balanceEls[0] && balanceEls[0].textContent) || 0 - ); - - if (!chapterId || !playletId) { - toast("缺少剧集信息,请刷新后重试", "error"); - return; - } - - if (Number.isFinite(balance) && Number.isFinite(cost) && balance < cost) { - goToCoinRecharge(); - return; - } - - setPaying(true); - window.HttpRequest.post("/api/playlet/chapter/unlock", { - chapterId: chapterId, - playletId: playletId, - }) - .then(function (res) { - if (!res || res.code !== 200) { - if (res && res.code === 401) { - closeDialog(); - openLogin(); - return; - } - if (isInsufficientBalance(res)) { - goToCoinRecharge(); - return; - } - throw new Error((res && (res.tip || res.msg)) || "解锁失败"); - } - var data = res.data || {}; - if (typeof data.balance === "number") { - setBalance(data.balance); - if (window.CookieUtil && CookieUtil.setAuthSession) { - CookieUtil.setAuthSession({ recharge: data.balance }); - } - } - toast((res && res.tip) || "解锁成功", "success"); - closeDialog(); - afterUnlockSuccess( - Number(data.playletId) || playletId, - Number(data.chapterId) || chapterId, - data - ); - }) - .catch(function (err) { - toast((err && err.message) || "解锁失败,请稍后重试", "error"); - }) - .finally(function () { - setPaying(false); - }); - } - - function openDialog(event) { - if (event) event.preventDefault(); - var trigger = - event && event.target && event.target.closest - ? event.target.closest("[data-coin-dialog-open]") - : null; - var singleCoins = trigger - ? Number(trigger.getAttribute("data-single-coins") || 0) - : 0; - setCost(singleCoins); - if (trigger) { - mask.setAttribute( - "data-chapter-id", - trigger.getAttribute("data-chapter-id") || "" - ); - mask.setAttribute("data-single-coins", String(singleCoins || 0)); - mask.setAttribute( - "data-playlet-id", - String(resolvePlayletId(trigger) || "") - ); - mask.setAttribute("data-playlet-slug", resolvePlayletSlug(trigger)); - } else if (!mask.getAttribute("data-playlet-id")) { - mask.setAttribute("data-playlet-id", String(resolvePlayletId(null) || "")); - } - - mask.classList.add("is-open"); - document.body.style.overflow = "hidden"; - - if (loading) return; - loading = true; - fetchBalance().finally(function () { - loading = false; - }); - } - - function closeDialog() { - mask.classList.remove("is-open"); - document.body.style.overflow = ""; - } - - document.addEventListener("click", function (event) { - if (event.target.closest("[data-coin-dialog-open]")) { - openDialog(event); - return; - } - - if (event.target.closest("[data-coin-dialog-close]")) { - closeDialog(); - return; - } - - if (event.target.closest("[data-coin-dialog-pay]")) { - event.preventDefault(); - unlockAndPlay(); - return; - } - - if (event.target === mask) { - closeDialog(); - } - }); - - document.addEventListener("keydown", function (event) { - if (event.key === "Escape" && mask.classList.contains("is-open")) { - closeDialog(); - } - }); - - window.openCoinDialog = openDialog; - window.closeCoinDialog = closeDialog; -})(); diff --git a/app/static/js/pages/deposit.js b/app/static/js/pages/deposit.js deleted file mode 100644 index ec735f1..0000000 --- a/app/static/js/pages/deposit.js +++ /dev/null @@ -1,481 +0,0 @@ -/** - * 充值页:套餐 / 支付方式互斥选择,按套餐 payMethods 刷新;提交走 VIP/金币下单。 - * VIP: POST /api/vip/pay 金币: POST /api/coin/buy - * 支付方式严格使用接口返回的 payMethods,不造假默认渠道。 - */ -(function () { - var submitting = false; - var confirmMask = document.querySelector("[data-deposit-confirm]"); - var confirmMethods = document.querySelector("[data-deposit-confirm-methods]"); - var confirmSubmit = document.querySelector("[data-deposit-confirm-submit]"); - var bodyOverflowBeforeConfirm = ""; - - function toast(message, type) { - if (window.AuthAPI && typeof AuthAPI.toast === "function") { - AuthAPI.toast(message, type || "info"); - return; - } - if (typeof showToast === "function") showToast(message, type || "info"); - } - - function bindExclusive(root, selector, activeClass) { - var scope = root || document; - var nodes = scope.querySelectorAll(selector); - if (!nodes.length) return; - nodes.forEach(function (node) { - node.addEventListener("click", function () { - nodes.forEach(function (item) { - item.classList.remove(activeClass); - }); - node.classList.add(activeClass); - syncPayTypeAcross(node.getAttribute("data-pay-type") || ""); - }); - }); - } - - function syncPayTypeAcross(payType) { - if (!payType) return; - document.querySelectorAll("[data-pay-type]").forEach(function (el) { - var match = String(el.getAttribute("data-pay-type") || "") === String(payType); - if (el.classList.contains("deposit-pay-btn")) { - el.classList.toggle("deposit-pay-btn--active", match); - } - if (el.classList.contains("deposit-mobile-pay")) { - el.classList.toggle("deposit-mobile-pay--active", match); - } - if (el.classList.contains("deposit-confirm-method")) { - el.classList.toggle("is-active", match); - } - }); - } - - function parsePayMethods(raw) { - if (!raw) return []; - try { - var list = JSON.parse(raw); - if (!Array.isArray(list)) return []; - return list - .map(function (item) { - return { - type: String((item && item.type) || "").trim(), - typeName: String((item && (item.typeName || item.type)) || "").trim(), - }; - }) - .filter(function (item) { - return item.type || item.typeName; - }); - } catch (e) { - return []; - } - } - - function currentPayType() { - var active = - document.querySelector(".deposit-confirm-method.is-active[data-pay-type]") || - document.querySelector(".deposit-pay-btn--active[data-pay-type]") || - document.querySelector(".deposit-mobile-pay--active[data-pay-type]"); - return active ? String(active.getAttribute("data-pay-type") || "") : ""; - } - - function currentPackage() { - return ( - document.querySelector(".deposit-mobile-pkg--active[data-package-id]") || - document.querySelector(".deposit-package--active[data-package-id]") - ); - } - - function renderPayButtons(container, className, activeClass, methods, preferType) { - if (!container) return; - var list = Array.isArray(methods) ? methods : []; - if (!list.length) { - container.innerHTML = '

'; - return; - } - var prefer = preferType || ""; - var activeType = prefer; - if (!list.some(function (item) { return item.type === prefer; })) { - activeType = list[0] ? list[0].type : ""; - } - container.innerHTML = list - .map(function (item) { - var isActive = item.type === activeType; - return ( - '" - ); - }) - .join(""); - bindExclusive(container, "." + className.split(" ").join("."), activeClass); - } - - function escapeHtml(text) { - return String(text || "") - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """); - } - - function escapeAttr(text) { - return escapeHtml(text).replace(/'/g, "'"); - } - - function payMethodVisual(item) { - var value = String((item && (item.typeName || item.type)) || "").toLowerCase(); - if (/支付宝|alipay/.test(value)) { - return { kind: "alipay", icon: "/static/images/figma-dialogs/alipay.svg" }; - } - if (/微信|wechat|weixin|wxpay/.test(value)) { - return { kind: "wechat", icon: "/static/images/figma-dialogs/wechat.svg" }; - } - if (/usdt|tether/.test(value)) { - return { kind: "usdt", icon: "/static/images/figma-dialogs/usdt.svg" }; - } - return { kind: "other", icon: "" }; - } - - function renderConfirmMethods(methods, preferType) { - if (!confirmMethods) return ""; - var list = Array.isArray(methods) ? methods : []; - var activeType = preferType || (list[0] && list[0].type) || ""; - if (!list.some(function (item) { return item.type === activeType; })) { - activeType = (list[0] && list[0].type) || ""; - } - confirmMethods.innerHTML = list.map(function (item) { - var visual = payMethodVisual(item); - var icon = visual.icon - ? '' - : ''; - return ''; - }).join(""); - confirmMethods.querySelectorAll(".deposit-confirm-method").forEach(function (button) { - button.addEventListener("click", function () { - syncPayTypeAcross(button.getAttribute("data-pay-type") || ""); - }); - }); - syncPayTypeAcross(activeType); - return activeType; - } - - function hasPayMethods(el) { - var target = el || currentPackage(); - if (!target) return false; - return parsePayMethods(target.getAttribute("data-pay-methods")).length > 0; - } - - function syncPayMethods(el) { - var methods = parsePayMethods(el.getAttribute("data-pay-methods")); - var prefer = currentPayType(); - renderPayButtons( - document.querySelector("[data-deposit-pay-pc]"), - "deposit-pay-btn", - "deposit-pay-btn--active", - methods, - prefer - ); - renderPayButtons( - document.querySelector("[data-deposit-pay-mobile]"), - "deposit-mobile-pay", - "deposit-mobile-pay--active", - methods, - prefer - ); - } - - function syncPackageActive(kind, packageId) { - document.querySelectorAll(".deposit-package, .deposit-mobile-pkg").forEach(function (el) { - var match = - String(el.getAttribute("data-package-id") || "") === String(packageId) && - String(el.getAttribute("data-package-kind") || "") === String(kind); - el.classList.toggle("deposit-package--active", match && el.classList.contains("deposit-package")); - el.classList.toggle( - "deposit-mobile-pkg--active", - match && el.classList.contains("deposit-mobile-pkg") - ); - }); - } - - function updateSubmitButtons(price, loading) { - var canPay = hasPayMethods(currentPackage()); - var disabled = !!loading || !canPay; - var pkg = currentPackage(); - var packageName = pkg ? String(pkg.getAttribute("data-package-name") || "").trim() : ""; - var text; - if (loading) { - text = "支付中..."; - } else if (!canPay) { - text = "暂无支付方式"; - } else { - text = "立即支付 ¥" + (price || "0"); - } - document.querySelectorAll("[data-deposit-submit]").forEach(function (btn) { - btn.disabled = disabled; - btn.classList.toggle("is-loading", !!loading); - btn.classList.toggle("is-disabled", !canPay && !loading); - if (btn.classList.contains("deposit-pc-submit")) { - btn.textContent = loading ? "支付中..." : canPay ? "立即支付 ¥" + (price || "0") : "暂无支付方式"; - } else { - btn.textContent = loading ? "支付中..." : canPay ? "支付 ¥" + (price || "0") + " 充值金币" : text; - } - }); - document.querySelectorAll("[data-deposit-selected-note]").forEach(function (node) { - node.textContent = packageName - ? "已选择 " + packageName + " · 点击后选择支付方式" - : "请选择金币套餐"; - }); - } - - function onPackageClick(el) { - var kind = el.getAttribute("data-package-kind") || ""; - var id = el.getAttribute("data-package-id") || ""; - var price = el.getAttribute("data-price") || "0"; - syncPackageActive(kind, id); - syncPayMethods(el); - updateSubmitButtons(price, false); - } - - function openPayUrl(data) { - var url = data && data.payUrl ? String(data.payUrl).trim() : ""; - if (!url) { - toast("未获取到支付链接", "error"); - return; - } - var mode = String((data && data.payUrlMode) || "").toLowerCase(); - var openNew = - !!(data && data.isOpenNewBrowser) || - mode === "new" || - mode === "blank" || - mode === "external"; - if (openNew) { - var win = window.open(url, "_blank"); - if (!win) { - window.location.href = url; - } - return; - } - window.location.href = url; - } - - function ensureLoggedIn() { - if (window.CookieUtil && CookieUtil.isLoggedIn()) return true; - toast("请先登录后再支付", "error"); - var loginURL = "/login/return/deposit/"; - if (typeof window.openLoginDialog === "function") { - var opened = window.openLoginDialog(); - if (opened && typeof opened.then === "function") { - opened.catch(function () { - window.location.href = loginURL; - }); - } - } else { - window.location.href = loginURL; - } - return false; - } - - function closePayConfirm() { - if (!confirmMask) return; - confirmMask.classList.remove("is-open"); - confirmMask.setAttribute("aria-hidden", "true"); - document.body.style.overflow = bodyOverflowBeforeConfirm; - } - - function openPayConfirm() { - if (submitting || !confirmMask) return; - if (!ensureLoggedIn()) return; - var pkg = currentPackage(); - if (!pkg) { - toast("请选择套餐", "error"); - return; - } - var methods = parsePayMethods(pkg.getAttribute("data-pay-methods")); - if (!methods.length) { - toast("当前套餐暂无可用支付方式", "error"); - return; - } - var packageName = String(pkg.getAttribute("data-package-name") || "金币套餐").trim(); - var price = String(pkg.getAttribute("data-price") || "0").trim(); - var nameEl = confirmMask.querySelector("[data-deposit-confirm-name]"); - var priceEl = confirmMask.querySelector("[data-deposit-confirm-price]"); - if (nameEl) nameEl.textContent = packageName; - if (priceEl) priceEl.textContent = price; - renderConfirmMethods(methods, currentPayType()); - bodyOverflowBeforeConfirm = document.body.style.overflow; - document.body.style.overflow = "hidden"; - confirmMask.classList.add("is-open"); - confirmMask.setAttribute("aria-hidden", "false"); - } - - function submitPay() { - if (submitting) return; - if (!window.HttpRequest) { - toast("请求组件未加载", "error"); - return; - } - if (!ensureLoggedIn()) return; - - var pkg = currentPackage(); - if (!pkg) { - toast("请选择套餐", "error"); - return; - } - var packageId = Number(pkg.getAttribute("data-package-id") || 0); - var kind = String(pkg.getAttribute("data-package-kind") || ""); - var price = pkg.getAttribute("data-price") || "0"; - var payMode = currentPayType(); - if (!packageId || (kind !== "vip" && kind !== "coin")) { - toast("套餐无效,请重新选择", "error"); - return; - } - if (!payMode) { - toast("请选择支付方式", "error"); - return; - } - if (!hasPayMethods(pkg)) { - toast("当前套餐暂无可用支付方式", "error"); - return; - } - - var api = kind === "coin" ? "/api/coin/buy" : "/api/vip/pay"; - submitting = true; - updateSubmitButtons(price, true); - if (confirmSubmit) { - confirmSubmit.disabled = true; - confirmSubmit.textContent = "支付中..."; - } - - HttpRequest.post(api, { packageId: packageId, payMode: payMode }) - .then(function (res) { - if (!res || res.code !== 200 || !res.data) { - var err = new Error((res && (res.tip || res.msg)) || "发起支付失败"); - err.code = res && res.code; - throw err; - } - openPayUrl(res.data); - }) - .catch(function (err) { - if (err && err.code === 401) { - toast("请先登录后再支付", "error"); - if (typeof window.openLoginDialog === "function") { - var opened = window.openLoginDialog(); - if (opened && typeof opened.then === "function") { - opened.catch(function () { - window.location.href = "/login/return/deposit/"; - }); - } - } - return; - } - toast((err && err.message) || "发起支付失败", "error"); - }) - .finally(function () { - submitting = false; - updateSubmitButtons(price, false); - if (confirmSubmit) { - confirmSubmit.disabled = false; - confirmSubmit.textContent = "去支付"; - } - }); - } - - bindExclusive(document, ".deposit-pay-btn", "deposit-pay-btn--active"); - bindExclusive(document, ".deposit-mobile-pay", "deposit-mobile-pay--active"); - - document.querySelectorAll(".deposit-package[data-package-id]").forEach(function (node) { - node.addEventListener("click", function () { - onPackageClick(node); - }); - }); - - document.querySelectorAll(".deposit-mobile-pkg[data-package-id]").forEach(function (node) { - node.addEventListener("click", function () { - onPackageClick(node); - }); - }); - - document.querySelectorAll("[data-deposit-submit]").forEach(function (btn) { - btn.addEventListener("click", openPayConfirm); - }); - - if (confirmSubmit) confirmSubmit.addEventListener("click", submitPay); - document.querySelectorAll("[data-deposit-confirm-close]").forEach(function (button) { - button.addEventListener("click", closePayConfirm); - }); - if (confirmMask) { - confirmMask.addEventListener("click", function (event) { - if (event.target === confirmMask) closePayConfirm(); - }); - } - document.addEventListener("keydown", function (event) { - if (event.key === "Escape" && confirmMask && confirmMask.classList.contains("is-open")) { - closePayConfirm(); - } - }); - - - var active = - document.querySelector(".deposit-mobile-pkg--active[data-price]") || - document.querySelector(".deposit-package--active[data-price]"); - if (active) { - syncPayMethods(active); - updateSubmitButtons(active.getAttribute("data-price") || "0", false); - } else { - updateSubmitButtons("0", false); - } - - // /deposit/coin 时滚动到金币充值区域(套餐默认选中由 SSR 完成) - (function scrollPreferCoin() { - if (!/\/deposit\/coin\/?$/i.test(window.location.pathname || "")) return; - var isMobile = window.matchMedia("(max-width: 767px)").matches; - var target = isMobile - ? document.getElementById("depositCoinMobileTitle") - : document.getElementById("depositCoinGroup"); - if (!target) return; - setTimeout(function () { - target.scrollIntoView({ behavior: "smooth", block: "start" }); - }, 80); - })(); - - function formatRecharge(value) { - var n = Number(value); - if (!isFinite(n) || n < 0) n = 0; - return String(Math.floor(n)).replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } - - function syncDepositRecharge(value) { - var text = formatRecharge(value); - document.querySelectorAll("[data-deposit-recharge]").forEach(function (el) { - el.textContent = text; - }); - } - - function refreshDepositWallet() { - if (!window.CookieUtil || !CookieUtil.isLoggedIn() || !window.HttpRequest) { - return; - } - var session = CookieUtil.getAuthSession(); - if (session && session.recharge != null && session.recharge !== "") { - syncDepositRecharge(session.recharge); - } - HttpRequest.get("/api/auth/getInfo") - .then(function (res) { - if (!res || res.code !== 200 || !res.data) return; - if (CookieUtil.setAuthSession) CookieUtil.setAuthSession(res.data); - syncDepositRecharge(res.data.recharge); - }) - .catch(function () {}); - } - - refreshDepositWallet(); -})(); diff --git a/app/static/js/pages/detail.js b/app/static/js/pages/detail.js index fd03eab..9965ab2 100644 --- a/app/static/js/pages/detail.js +++ b/app/static/js/pages/detail.js @@ -120,239 +120,18 @@ })(); (function () { - // detail.js 同步执行早于 defer 的 request.js,需等 HttpRequest 就绪后再绑定 - function toast(message, type) { - if (typeof window.showToast === "function") { - window.showToast(message, type); - return; - } - window.alert(message); - } + // 付费剧集:不再站内解锁,统一引导下载 APP + var lockedEpisodes = document.querySelectorAll("[data-episode-locked]"); + if (!lockedEpisodes.length) return; - function bindLikeActions() { - var likeBtns = document.querySelectorAll("[data-detail-like]"); - if (!likeBtns.length) return; - if (!window.HttpRequest || typeof window.HttpRequest.post !== "function") { - if (!bindLikeActions._retried) { - bindLikeActions._retried = true; - window.addEventListener("load", bindLikeActions, { once: true }); + lockedEpisodes.forEach(function (el) { + el.addEventListener("click", function (e) { + e.preventDefault(); + if (typeof window.openDownloadApp === "function") { + window.openDownloadApp(); } - return; - } - if (bindLikeActions._bound) return; - bindLikeActions._bound = true; - - function applyLikeUI(isLike, countLike) { - var liked = Number(isLike) === 1; - likeBtns.forEach(function (btn) { - btn.classList.toggle("detail-action--active", liked); - btn.classList.toggle("detail-h5-top-btn--active", liked); - btn.classList.toggle("detail-h5-like--active", liked); - btn.classList.toggle("play-h5-side-item--active", liked); - btn.setAttribute("data-liked", liked ? "1" : "2"); - btn.setAttribute("aria-pressed", liked ? "true" : "false"); - if (countLike != null) { - btn.setAttribute("data-count-like", String(countLike)); - } - var label = btn.querySelector("[data-detail-like-label]"); - if (label) { - if (btn.getAttribute("data-like-label-mode") === "state") { - label.textContent = liked ? "已点赞" : "点赞"; - } else { - var n = countLike != null ? countLike : btn.getAttribute("data-count-like"); - label.textContent = String(n == null || n === "" ? 0 : n); - } - } - var h5Icon = btn.querySelector("[data-h5-like-icon]"); - if (h5Icon) { - h5Icon.src = liked - ? "/static/images/h5_liked.svg" - : "/static/images/like.svg"; - } - }); - } - - likeBtns.forEach(function (btn) { - btn.addEventListener("click", function () { - if (btn.getAttribute("data-liking") === "1") return; - var playletId = Number(btn.getAttribute("data-playlet-id") || 0); - if (!playletId) return; - - var likedNow = Number(btn.getAttribute("data-liked") || 2) === 1; - var countNow = Number(btn.getAttribute("data-count-like") || 0); - if (Number.isNaN(countNow)) countNow = 0; - var nextLike = !likedNow; - var nextCount = Math.max(0, countNow + (nextLike ? 1 : -1)); - - likeBtns.forEach(function (item) { - item.setAttribute("data-liking", "1"); - item.disabled = true; - }); - applyLikeUI(nextLike ? 1 : 2, nextCount); - - window.HttpRequest.post("/api/playlet/like/set", { - id: playletId, - isLike: nextLike, - }) - .then(function (res) { - if (!res || res.code !== 200) { - if (res && res.code === 401) { - var loginOpen = document.querySelector( - "[data-login-dialog-open]" - ); - if (loginOpen) loginOpen.click(); - } - throw new Error((res && (res.tip || res.msg)) || "操作失败"); - } - var data = res.data || {}; - applyLikeUI( - data.isLike != null ? data.isLike : nextLike ? 1 : 2, - data.countLike != null ? data.countLike : nextCount - ); - }) - .catch(function (err) { - applyLikeUI(likedNow ? 1 : 2, countNow); - toast((err && err.message) || "操作失败,请稍后重试", "error"); - }) - .finally(function () { - likeBtns.forEach(function (item) { - item.removeAttribute("data-liking"); - item.disabled = false; - }); - }); - }); }); - } - - if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", bindLikeActions, { once: true }); - } else { - bindLikeActions(); - } -})(); - -(function () { - function toast(message, type) { - if (typeof window.showToast === "function") { - window.showToast(message, type); - return; - } - window.alert(message); - } - - function bindCollectActions() { - var collectBtns = document.querySelectorAll("[data-detail-collect]"); - if (!collectBtns.length) return; - if (!window.HttpRequest || typeof window.HttpRequest.post !== "function") { - if (!bindCollectActions._retried) { - bindCollectActions._retried = true; - window.addEventListener("load", bindCollectActions, { once: true }); - } - return; - } - if (bindCollectActions._bound) return; - bindCollectActions._bound = true; - - function applyCollectUI(isCollect, countCollect) { - var collected = Number(isCollect) === 1; - collectBtns.forEach(function (btn) { - btn.classList.toggle("detail-action--active", collected); - btn.classList.toggle("detail-h5-collect--active", collected); - btn.classList.toggle("detail-h5-top-btn--active", collected); - btn.classList.toggle("play-h5-side-item--active", collected); - btn.classList.toggle("is-collected", collected); - btn.setAttribute("data-collected", collected ? "1" : "2"); - btn.setAttribute("aria-pressed", collected ? "true" : "false"); - if (countCollect != null) { - btn.setAttribute("data-count-collect", String(countCollect)); - } - var label = btn.querySelector("[data-detail-collect-label]"); - if (label) { - if (btn.classList.contains("detail-h5-collect")) { - var n = countCollect != null - ? countCollect - : btn.getAttribute("data-count-collect"); - label.textContent = String(n == null || n === "" ? 0 : n); - } else { - label.textContent = collected ? "已收藏" : "收藏"; - } - } - var h5Icon = btn.querySelector("[data-h5-collect-icon]"); - if (h5Icon) { - if (btn.classList.contains("detail-h5-top-btn")) { - h5Icon.src = collected - ? "/static/images/h5_collected.svg?v=2" - : "/static/images/collect.svg"; - } else if (btn.classList.contains("play-h5-side-item")) { - h5Icon.src = collected - ? "/static/images/h5_collected.svg?v=2" - : "/static/images/collect.svg"; - } else { - h5Icon.src = collected - ? "/static/images/h5_detail_collected.svg" - : "/static/images/h5_detail_collect.svg"; - } - } - }); - } - - collectBtns.forEach(function (btn) { - btn.addEventListener("click", function () { - if (btn.getAttribute("data-collecting") === "1") return; - var playletId = Number(btn.getAttribute("data-playlet-id") || 0); - if (!playletId) return; - - var collectedNow = Number(btn.getAttribute("data-collected") || 2) === 1; - var countNow = Number(btn.getAttribute("data-count-collect") || 0); - if (Number.isNaN(countNow)) countNow = 0; - var nextCollect = !collectedNow; - var nextCount = Math.max(0, countNow + (nextCollect ? 1 : -1)); - - collectBtns.forEach(function (item) { - item.setAttribute("data-collecting", "1"); - item.disabled = true; - }); - applyCollectUI(nextCollect ? 1 : 2, nextCount); - - window.HttpRequest.post("/api/playlet/collect/set", { - id: playletId, - isCollect: nextCollect, - }) - .then(function (res) { - if (!res || res.code !== 200) { - if (res && res.code === 401) { - var loginOpen = document.querySelector( - "[data-login-dialog-open]" - ); - if (loginOpen) loginOpen.click(); - } - throw new Error((res && (res.tip || res.msg)) || "操作失败"); - } - var data = res.data || {}; - applyCollectUI( - data.isCollect != null ? data.isCollect : nextCollect ? 1 : 2, - data.countCollect != null ? data.countCollect : nextCount - ); - }) - .catch(function (err) { - applyCollectUI(collectedNow ? 1 : 2, countNow); - toast((err && err.message) || "操作失败,请稍后重试", "error"); - }) - .finally(function () { - collectBtns.forEach(function (item) { - item.removeAttribute("data-collecting"); - item.disabled = false; - }); - }); - }); - }); - } - - if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", bindCollectActions, { once: true }); - } else { - bindCollectActions(); - } + }); })(); (function () { @@ -593,15 +372,6 @@ return formatCommentTime(raw); } - function formatCompactCount(n) { - n = Number(n); - if (!n || n < 0 || Number.isNaN(n)) return "0"; - if (n < 10000) return String(n); - var v = n / 10000; - if (v >= 10) return Math.floor(v) + "w"; - return (Math.round(v * 10) / 10) + "w"; - } - function avatarURL(url) { url = String(url || "").trim(); return url || DEFAULT_AVATAR; @@ -614,10 +384,7 @@ } function renderDetailComment(item, playPcMode) { - var liked = Number(item.isLike) === 1; var avatar = avatarURL(item.userAvatar); - var commentId = item.id; - var parentsId = Number(item.parentsId || 0) || Number(commentId); var avatarHtml = item.userAvatar ? '' : '匿名用户头像'; - var likeIcon = liked - ? "/static/images/like_solid.svg" - : "/static/images/like_hollow.svg"; var textHtml = escapeHtml(item.text || ""); if (item.replyUserName) { textHtml = @@ -691,11 +455,7 @@ } return ( '
' + avatarHtml + '
' + @@ -709,27 +469,6 @@ '' + escapeHtml(formatCommentTime(item.createdAt)) + "" + - '" + - '' + "
" + repliesHtml + "
" @@ -737,10 +476,8 @@ } function renderPlayComment(item) { - var liked = Number(item.isLike) === 1; var avatar = avatarURL(item.userAvatar); var commentId = item.id; - var parentsId = Number(item.parentsId || 0) || Number(commentId); var children = Array.isArray(item.children) ? item.children : []; var replyCount = Number(item.commentCount || children.length || 0); var avatarHtml = item.userAvatar @@ -752,9 +489,6 @@ escapeHtml((item.userName || "匿名用户") + "的头像") + '" />' : '匿名用户头像'; - var likeIcon = liked - ? "/static/images/h5_liked.svg" - : "/static/images/like_hollow.svg"; var textHtml = escapeHtml(item.text || ""); if (item.replyUserName) { textHtml = @@ -807,10 +541,6 @@ return ( '
' + avatarHtml + '
' + @@ -825,30 +555,7 @@ '' + escapeHtml(formatRelativeTime(item.createdAt)) + "" + - '' + "
" + - '" + "
" + repliesHtml + "" @@ -887,18 +594,12 @@ var scope = sheetRoot || section; var listEl = section.querySelector("[data-comment-list]"); var moreBtn = section.querySelector("[data-comment-more]"); - var composerInput = - scope.querySelector(".play-comment-composer-input") || - scope.querySelector(".detail-comment-composer-input"); - var composerCount = scope.querySelector(".detail-comment-composer-count"); var titleEl = section.querySelector("[data-comment-title]"); - var sendBtn = scope.querySelector("[data-comment-send]"); var sortBtns = scope.querySelectorAll("[data-comment-sort]"); var sheetTitle = sheetRoot ? sheetRoot.querySelector("[data-play-comment-title]") : document.querySelector("[data-play-comment-title]"); var sideCount = document.querySelector("[data-play-comment-count]"); - var iconSend = !!(sendBtn && sendBtn.classList.contains("play-comment-composer-emoji")); if (section.getAttribute("data-comment-inited") === "1") return; section.setAttribute("data-comment-inited", "1"); @@ -910,169 +611,11 @@ var page = 0; var total = 0; var loading = false; - var sending = false; - var replyTarget = null; // { parentsId, replyCommentId, replyName } - var inlineSending = false; function getObjectId() { return Number(section.getAttribute("data-comment-object-id") || 0); } - function clearReplyTarget() { - replyTarget = null; - if (!scope) return; - var boxes = scope.querySelectorAll("[data-comment-inline-composer]"); - Array.prototype.forEach.call(boxes, function (el) { - el.remove(); - }); - } - - function setReplyTarget(parentsId, replyCommentId, replyName, anchorEl) { - parentsId = Number(parentsId || 0); - replyCommentId = Number(replyCommentId || 0); - if (!parentsId || !replyCommentId || !anchorEl) return; - - var root = - anchorEl.closest(commentItemSelector()) || - anchorEl.closest("[data-comment-id]"); - if (!root || !scope.contains(root)) return; - - // 再次点击同一条:关闭内联输入框 - var existingOnRoot = root.querySelector("[data-comment-inline-composer]"); - if ( - existingOnRoot && - replyTarget && - replyTarget.replyCommentId === replyCommentId - ) { - clearReplyTarget(); - return; - } - - clearReplyTarget(); - replyTarget = { - parentsId: parentsId, - replyCommentId: replyCommentId, - replyName: replyName || "用户", - }; - - var meta = - root.querySelector(".detail-comment-meta") || - root.querySelector(".play-comment-meta"); - var body = - root.querySelector(".detail-comment-body") || - root.querySelector(".play-comment-body") || - root; - var box = document.createElement("div"); - box.className = sheetMode - ? "play-comment-inline-composer" - : "detail-comment-inline-composer"; - box.setAttribute("data-comment-inline-composer", ""); - var placeholder = "回复 @" + replyTarget.replyName + "…"; - if (sheetMode) { - box.innerHTML = - '
' + - "回复 @" + - escapeHtml(replyTarget.replyName) + - "" + - '' + - "
" + - '
' + - '' + - '' + - "
"; - } else { - box.innerHTML = - '
' + - "回复 @" + - escapeHtml(replyTarget.replyName) + - "" + - '' + - "
" + - '' + - '"; - } - - if (meta && meta.parentNode === body) { - if (meta.nextSibling) { - body.insertBefore(box, meta.nextSibling); - } else { - body.appendChild(box); - } - } else { - body.appendChild(box); - } - - var inlineInput = box.querySelector("[data-comment-inline-input]"); - if (inlineInput) { - inlineInput.focus(); - } - } - - function sendInlineReply(box) { - if (!box || inlineSending || !replyTarget) return; - var objectId = getObjectId(); - if (!objectId) return; - var input = box.querySelector("[data-comment-inline-input]"); - var btn = box.querySelector("[data-comment-inline-send]"); - if (!input) return; - var text = String(input.value || "").trim(); - if (!text) { - toast("请输入评论内容", "error"); - return; - } - if (Array.from(text).length > 200) { - toast("评论最多 200 字", "error"); - return; - } - inlineSending = true; - if (btn) { - btn.disabled = true; - btn.classList.add("is-loading"); - } - input.disabled = true; - var payload = { - objectId: objectId, - objectType: objectType, - text: text, - parentsId: replyTarget.parentsId, - replyCommentId: - replyTarget.replyCommentId > 0 - ? replyTarget.replyCommentId - : replyTarget.parentsId, - }; - window.HttpRequest.post("/api/comment/send", payload) - .then(function (res) { - if (!res || res.code !== 200) { - if (res && res.code === 401) { - var loginOpen = document.querySelector( - "[data-login-dialog-open]" - ); - if (loginOpen) loginOpen.click(); - } - throw new Error((res && (res.tip || res.msg)) || "发表失败"); - } - clearReplyTarget(); - toast("发布成功,评论审核后才会展示", "success"); - }) - .catch(function (err) { - toast((err && err.message) || "发表失败,请稍后重试", "error"); - }) - .finally(function () { - inlineSending = false; - if (btn) { - btn.disabled = false; - btn.classList.remove("is-loading"); - } - if (input) input.disabled = false; - }); - } - function commentItemSelector() { return sheetMode ? ".play-comment-item" : ".detail-comment"; } @@ -1089,32 +632,6 @@ } } - function applyLikeUI(btn, isLike, countLike) { - var liked = Number(isLike) === 1; - btn.classList.toggle("detail-comment-like--active", liked); - btn.classList.toggle("play-comment-like--active", liked); - btn.setAttribute("data-liked", liked ? "1" : "2"); - var img = btn.querySelector("img"); - if (img) { - if (sheetMode) { - img.src = liked - ? "/static/images/h5_liked.svg" - : "/static/images/like_hollow.svg"; - } else { - img.src = liked - ? "/static/images/like_solid.svg" - : "/static/images/like_hollow.svg"; - } - } - var countEl = btn.querySelector("[data-like-count]"); - if (countEl && countLike != null) { - btn.setAttribute("data-like-raw", String(countLike)); - countEl.textContent = sheetMode - ? formatCompactCount(countLike) - : String(countLike); - } - } - function syncSortActive() { sortBtns.forEach(function (item) { var active = Number(item.getAttribute("data-comment-sort")) === sortOrder; @@ -1140,7 +657,6 @@ var emptyClass = sheetMode ? "section-empty play-comment-empty" : "section-empty"; - clearReplyTarget(); listEl.innerHTML = '
200) { - toast("评论最多 200 字", "error"); - return; - } - sending = true; - sendBtn.disabled = true; - sendBtn.classList.add("is-loading"); - if (!iconSend) sendBtn.textContent = "发表中"; - composerInput.disabled = true; - var payload = { - objectId: objectId, - objectType: objectType, - text: text, - parentsId: 0, - replyCommentId: 0, - }; - window.HttpRequest.post("/api/comment/send", payload) - .then(function (res) { - if (!res || res.code !== 200) { - if (res && res.code === 401) { - var loginOpen = document.querySelector( - "[data-login-dialog-open]" - ); - if (loginOpen) loginOpen.click(); - } - throw new Error((res && (res.tip || res.msg)) || "发表失败"); - } - composerInput.value = ""; - if (composerCount) composerCount.textContent = "0 / 200"; - toast("发布成功,评论审核后才会展示", "success"); - // 与 PC 一致:发表后不强制刷新列表(审核后才可见) - }) - .catch(function (err) { - toast((err && err.message) || "发表失败,请稍后重试", "error"); - }) - .finally(function () { - sending = false; - sendBtn.disabled = false; - sendBtn.classList.remove("is-loading"); - if (!iconSend) sendBtn.textContent = sendBtnDefaultText; - composerInput.disabled = false; - }); - }); - - if (sheetMode) { - composerInput.addEventListener("keydown", function (e) { - if (e.key === "Enter") { - e.preventDefault(); - sendBtn.click(); - } - }); - } - } - if (scope) { scope.addEventListener("click", function (e) { - var cancel = - e.target && e.target.closest - ? e.target.closest("[data-comment-reply-cancel]") - : null; - if (cancel) { - e.preventDefault(); - clearReplyTarget(); - return; - } - var inlineSend = - e.target && e.target.closest - ? e.target.closest("[data-comment-inline-send]") - : null; - if (inlineSend && scope.contains(inlineSend)) { - e.preventDefault(); - var box = inlineSend.closest("[data-comment-inline-composer]"); - sendInlineReply(box); - return; - } var repliesToggle = e.target && e.target.closest ? e.target.closest("[data-comment-replies-toggle]") : null; - if (repliesToggle && scope.contains(repliesToggle)) { - e.preventDefault(); - var repliesBox = repliesToggle.closest(".detail-comment-replies"); - if (!repliesBox) return; - var expanded = repliesToggle.getAttribute("aria-expanded") === "true"; - expanded = !expanded; - repliesToggle.setAttribute("aria-expanded", expanded ? "true" : "false"); - repliesToggle.textContent = replyToggleLabel( - expanded, - repliesToggle.getAttribute("data-reply-count") - ); - var hiddenItems = repliesBox.querySelectorAll("[data-reply-collapsed-item]"); - Array.prototype.forEach.call(hiddenItems, function (el) { - el.hidden = !expanded; - }); - return; - } - var replyBtn = - e.target && e.target.closest - ? e.target.closest("[data-comment-reply]") - : null; - if (!replyBtn || !scope.contains(replyBtn)) return; + if (!repliesToggle || !scope.contains(repliesToggle)) return; e.preventDefault(); - var replyCommentId = Number(replyBtn.getAttribute("data-comment-reply") || 0); - var parentsId = Number(replyBtn.getAttribute("data-parents-id") || 0); - var replyName = replyBtn.getAttribute("data-reply-name") || "用户"; - if (!parentsId) { - var root = - replyBtn.closest("[data-parents-id]") || - replyBtn.closest("[data-comment-id]"); - if (root) { - parentsId = Number( - root.getAttribute("data-parents-id") || - root.getAttribute("data-comment-id") || - 0 - ); - } - } - if (!replyCommentId) return; - if (!parentsId) parentsId = replyCommentId; - setReplyTarget(parentsId, replyCommentId, replyName, replyBtn); - }); - - scope.addEventListener("keydown", function (e) { - if (e.key !== "Enter") return; - var input = - e.target && e.target.closest - ? e.target.closest("[data-comment-inline-input]") - : null; - if (!input || !scope.contains(input)) return; - if (input.tagName === "TEXTAREA" && !e.ctrlKey && !e.metaKey) return; - e.preventDefault(); - var box = input.closest("[data-comment-inline-composer]"); - sendInlineReply(box); + var repliesBox = repliesToggle.closest(".detail-comment-replies"); + if (!repliesBox) return; + var expanded = repliesToggle.getAttribute("aria-expanded") === "true"; + expanded = !expanded; + repliesToggle.setAttribute("aria-expanded", expanded ? "true" : "false"); + repliesToggle.textContent = replyToggleLabel( + expanded, + repliesToggle.getAttribute("data-reply-count") + ); + var hiddenItems = repliesBox.querySelectorAll("[data-reply-collapsed-item]"); + Array.prototype.forEach.call(hiddenItems, function (el) { + el.hidden = !expanded; + }); }); } @@ -1403,70 +787,6 @@ }); } - if (listEl) { - listEl.addEventListener("click", function (e) { - var btn = - e.target && e.target.closest - ? e.target.closest("[data-comment-like]") - : null; - if (!btn || !listEl.contains(btn)) return; - var commentId = Number(btn.getAttribute("data-comment-like") || 0); - if (!commentId) return; - if (btn.getAttribute("data-liking") === "1") return; - - var likedNow = Number(btn.getAttribute("data-liked") || 2) === 1; - var nextLike = !likedNow; - var rawAttr = btn.getAttribute("data-like-raw"); - var countEl = btn.querySelector("[data-like-count]"); - var prevCount = Number( - rawAttr != null - ? rawAttr - : countEl && countEl.textContent - ? countEl.textContent - : 0 - ); - if (Number.isNaN(prevCount)) prevCount = 0; - - btn.setAttribute("data-liking", "1"); - btn.disabled = true; - applyLikeUI( - btn, - nextLike ? 1 : 2, - Math.max(0, prevCount + (nextLike ? 1 : -1)) - ); - - window.HttpRequest.post("/api/comment/like/set", { - commentId: commentId, - isLike: nextLike, - }) - .then(function (res) { - if (!res || res.code !== 200) { - if (res && res.code === 401) { - var loginOpen = document.querySelector( - "[data-login-dialog-open]" - ); - if (loginOpen) loginOpen.click(); - } - throw new Error((res && (res.tip || res.msg)) || "操作失败"); - } - var data = res.data || {}; - applyLikeUI( - btn, - data.isLike != null ? data.isLike : nextLike ? 1 : 2, - data.countLike != null ? data.countLike : null - ); - }) - .catch(function (err) { - applyLikeUI(btn, likedNow ? 1 : 2, prevCount); - toast((err && err.message) || "操作失败,请稍后重试", "error"); - }) - .finally(function () { - btn.removeAttribute("data-liking"); - btn.disabled = false; - }); - }); - } - if (!listEl || !getObjectId()) { if (listEl) showEmpty("暂无评论"); return; diff --git a/app/static/js/pages/dialogLoader.js b/app/static/js/pages/dialogLoader.js index 8cbd0df..1c4c64d 100644 --- a/app/static/js/pages/dialogLoader.js +++ b/app/static/js/pages/dialogLoader.js @@ -7,20 +7,6 @@ js: "/static/js/pages/downloadAppDialog.js?v=4", open: "openDownloadAppDialog", }, - login: { - endpoint: "/ui/dialog/login", - elementId: "loginDialog", - css: "/static/css/loginDialog.css?v=2", - js: "/static/js/pages/loginDialog.js?v=3", - open: "openLoginDialog", - }, - register: { - endpoint: "/ui/dialog/register", - elementId: "registerDialog", - css: "/static/css/registerDialog.css?v=2", - js: "/static/js/pages/registerDialog.js?v=2", - open: "openRegisterDialog", - }, }; var pending = Object.create(null); var stubOpeners = Object.create(null); @@ -141,26 +127,6 @@ return pending[name]; } - function loginFallbackURL() { - var redirect = ""; - try { - redirect = global.location.pathname || "/"; - } catch (e) { - redirect = "/"; - } - var url = "/login/"; - if ( - typeof redirect === "string" && - redirect.charAt(0) === "/" && - redirect.charAt(1) !== "/" && - redirect !== "/" && - redirect.indexOf("/?auth=") !== 0 - ) { - url = "/login/return" + redirect; - } - return url; - } - function openDialog(name, value) { return ensureDialog(name) .then(function () { @@ -171,15 +137,6 @@ return opener(value); }) .catch(function (error) { - if (name === "login") { - try { - var params = new URLSearchParams(global.location.search || ""); - // 已在登录入口仍失败时避免死循环跳转 - if (params.get("auth") !== "login") { - global.location.href = loginFallbackURL(); - } - } catch (e) {} - } throw error; }); } @@ -196,12 +153,6 @@ function triggerName(target) { if (!target || !target.closest) return ""; if (target.closest("[data-download-app-open]")) return "download"; - if (target.closest("[data-register-dialog-open], a[href=\"#register\"], a[href=\"/register/\"]")) { - return "register"; - } - if (target.closest("[data-login-dialog-open], a[href=\"#login\"], a[href=\"/login/\"]")) { - return "login"; - } return ""; } @@ -222,22 +173,23 @@ openDialog(name).catch(function () {}); }, true); - function openFromLocation() { - var params = new URLSearchParams(global.location.search || ""); - var auth = params.get("auth"); - if (auth === "login" || auth === "register") { - openDialog(auth).catch(function () {}); - return; - } - if (global.location.hash === "#login") openDialog("login").catch(function () {}); - if (global.location.hash === "#register") openDialog("register").catch(function () {}); + function appDownloadURL() { + var el = document.querySelector("[data-app-download-url]"); + var url = el ? (el.getAttribute("data-app-download-url") || "").trim() : ""; + return url || "/download-app/"; } - if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", openFromLocation, { once: true }); - } else { - openFromLocation(); + // 付费内容统一入口:移动端直接跳下载地址,PC 弹下载二维码。 + function openDownloadApp() { + if (isMobileViewport()) { + global.location.href = appDownloadURL(); + return Promise.resolve(); + } + return openDialog("download").catch(function () { + global.location.href = appDownloadURL(); + }); } global.ensureDialog = ensureDialog; + global.openDownloadApp = openDownloadApp; })(window); diff --git a/app/static/js/pages/editPassword.js b/app/static/js/pages/editPassword.js deleted file mode 100644 index dd3f29d..0000000 --- a/app/static/js/pages/editPassword.js +++ /dev/null @@ -1,139 +0,0 @@ -/** - * 修改密码:POST /api/auth/profile { oldPassword, newPassword } - */ -(function () { - var form = document.querySelector("[data-edit-password-form]"); - if (!form) return; - - var currentInput = form.querySelector("[data-edit-password-current]"); - var newInput = form.querySelector("[data-edit-password-new]"); - var confirmInput = form.querySelector("[data-edit-password-confirm]"); - var submitBtn = form.querySelector("[data-edit-password-submit]"); - - document.querySelectorAll("[data-password-toggle]").forEach(function (btn) { - btn.addEventListener("click", function () { - var id = btn.getAttribute("data-password-toggle"); - var input = id ? document.getElementById(id) : null; - if (!input) return; - var show = input.type === "password"; - input.type = show ? "text" : "password"; - btn.textContent = show ? "隐藏" : "显示"; - }); - }); - - function getField(name) { - return form.querySelector('[data-edit-password-field="' + name + '"]'); - } - - function setFieldError(name, message) { - var field = getField(name); - if (!field) return; - var error = field.querySelector("[data-edit-password-error]"); - field.classList.toggle("is-error", !!message); - if (error) { - if (message) { - error.hidden = false; - error.textContent = message; - } else { - error.hidden = true; - } - } - } - - function clearErrors() { - setFieldError("current", ""); - setFieldError("new", ""); - setFieldError("confirm", ""); - } - - function isValidLength(value) { - return value.length >= 4 && value.length <= 16; - } - - function toast(message, type) { - if (window.AuthAPI) AuthAPI.toast(message, type); - else if (typeof showToast === "function") showToast(message, type); - } - - function validate() { - clearErrors(); - var current = (currentInput && currentInput.value) || ""; - var next = (newInput && newInput.value) || ""; - var confirm = (confirmInput && confirmInput.value) || ""; - var ok = true; - - if (!current) { - setFieldError("current", "请输入当前密码"); - ok = false; - } else if (!isValidLength(current)) { - setFieldError("current", "当前密码需为 4–16 个字符"); - ok = false; - } - - if (!next) { - setFieldError("new", "请输入新密码"); - ok = false; - } else if (!isValidLength(next)) { - setFieldError("new", "新密码需为 4–16 个字符"); - ok = false; - } else if (next === current) { - setFieldError("new", "新密码不能与当前密码相同"); - ok = false; - } - - if (!confirm) { - setFieldError("confirm", "请再次输入新密码"); - ok = false; - } else if (confirm !== next) { - setFieldError("confirm", "两次输入的新密码不一致"); - ok = false; - } - - if (!ok) return null; - return { oldPassword: current, newPassword: next }; - } - - [currentInput, newInput, confirmInput].forEach(function (input) { - if (!input) return; - input.addEventListener("input", function () { - var field = input.closest("[data-edit-password-field]"); - if (!field) return; - var name = field.getAttribute("data-edit-password-field"); - setFieldError(name, ""); - }); - }); - - form.addEventListener("submit", function (event) { - event.preventDefault(); - var payload = validate(); - if (!payload) return; - if (!window.AuthAPI || !window.HttpRequest) { - return; - } - - if (submitBtn) submitBtn.disabled = true; - - AuthAPI.updateProfile(payload) - .then(function () { - toast("密码修改成功", "success"); - setTimeout(function () { - window.location.href = "/setting/"; - }, 400); - }) - .catch(function (err) { - var tip = (err && err.message) || "修改失败,请稍后重试"; - if (/旧|当前|原密码|old/i.test(tip)) { - setFieldError("current", tip); - return; - } - if (/新密码|new/i.test(tip)) { - setFieldError("new", tip); - return; - } - toast(tip, "error"); - }) - .finally(function () { - if (submitBtn) submitBtn.disabled = false; - }); - }); -})(); diff --git a/app/static/js/pages/editProfile.js b/app/static/js/pages/editProfile.js deleted file mode 100644 index f17b2cd..0000000 --- a/app/static/js/pages/editProfile.js +++ /dev/null @@ -1,68 +0,0 @@ -(function () { - var form = document.querySelector("[data-edit-profile-form]"); - var nickInput = document.querySelector("[data-edit-profile-nickname]"); - var bioInput = document.querySelector("[data-edit-profile-bio]"); - var submitBtn = document.querySelector("[data-edit-profile-submit]"); - if (!form) return; - - var originalNick = nickInput ? String(nickInput.value || "").trim() : ""; - var originalBio = bioInput ? String(bioInput.value || "").trim() : ""; - - function toast(message, type) { - if (window.AuthAPI) AuthAPI.toast(message, type); - else if (typeof showToast === "function") showToast(message, type); - } - - form.addEventListener("submit", function (event) { - event.preventDefault(); - if (!window.AuthAPI || !window.HttpRequest) { - return; - } - - var nick = nickInput ? String(nickInput.value || "").trim() : ""; - var bio = bioInput ? String(bioInput.value || "").trim() : ""; - if (!nick) { - toast("请输入昵称", "error"); - return; - } - if (nick.length > 20) { - toast("昵称最多 20 个字符", "error"); - return; - } - if (bio.length > 120) { - toast("个人简介最多 120 个字符", "error"); - return; - } - - var nickChanged = nick !== originalNick; - var bioChanged = bio !== originalBio; - if (!nickChanged && !bioChanged) { - toast("暂无修改", "info"); - return; - } - - var payload = {}; - if (nickChanged) payload.nickName = nick; - if (bioChanged) payload.introduction = bio; - if (!payload.nickName && !payload.introduction) { - toast(bioChanged ? "请填写个人简介或修改昵称" : "暂无修改", "error"); - return; - } - - if (submitBtn) submitBtn.disabled = true; - - AuthAPI.updateProfile(payload) - .then(function () { - toast("保存成功", "success"); - setTimeout(function () { - window.location.href = "/setting/"; - }, 400); - }) - .catch(function (err) { - toast((err && err.message) || "保存失败", "error"); - }) - .finally(function () { - if (submitBtn) submitBtn.disabled = false; - }); - }); -})(); diff --git a/app/static/js/pages/feedback.js b/app/static/js/pages/feedback.js index 73d0b0a..291683d 100644 --- a/app/static/js/pages/feedback.js +++ b/app/static/js/pages/feedback.js @@ -495,23 +495,6 @@ }); } - function requireLogin() { - if (window.CookieUtil && CookieUtil.isLoggedIn()) return true; - toast("请先登录后再提交反馈", "error"); - var loginURL = "/login/return/feedback/"; - if (typeof window.openLoginDialog === "function") { - var opened = window.openLoginDialog(); - if (opened && typeof opened.then === "function") { - opened.catch(function () { - window.location.href = loginURL; - }); - } - } else { - window.location.href = loginURL; - } - return false; - } - function uploadAllImages() { if (!selectedFiles.length) return Promise.resolve([]); if (!window.AuthAPI || typeof AuthAPI.uploadImage !== "function") { @@ -548,7 +531,6 @@ return; } if (submitBtn && submitBtn.classList.contains("is-loading")) return; - if (!requireLogin()) return; var activeTypeChip = document.querySelector("[data-feedback-type-option].is-active"); var type = parseInt( @@ -647,18 +629,6 @@ clearFiles(); }) .catch(function (err) { - if (err && err.code === 401) { - toast("请先登录后再提交反馈", "error"); - if (typeof window.openLoginDialog === "function") { - var opened = window.openLoginDialog(); - if (opened && typeof opened.then === "function") { - opened.catch(function () { - window.location.href = "/login/return/feedback/"; - }); - } - } - return; - } toast((err && err.message) || "提交失败", "error"); }) .finally(function () { diff --git a/app/static/js/pages/header.js b/app/static/js/pages/header.js index 3cd8770..33e0037 100644 --- a/app/static/js/pages/header.js +++ b/app/static/js/pages/header.js @@ -93,142 +93,12 @@ }); } - var DEFAULT_AVATAR = "/static/images/avatar.png"; - var PLACEHOLDER = "/static/images/placeholder.png?v=2"; - - function usableAvatar(url) { - var u = String(url || "").trim(); - if (!u) return ""; - if (/^https?:\/\//i.test(u) || u.indexOf("/static/") === 0) return u; - return ""; - } - - function setAvatarImg(img, url) { - if (!img) return; - var src = usableAvatar(url); - img.removeAttribute("data-decrypted"); - if (src && typeof shouldDecryptImage === "function" && shouldDecryptImage(src)) { - img.classList.add("lazy"); - img.src = PLACEHOLDER; - img.setAttribute("data-src", src); - } else { - img.classList.remove("lazy"); - img.removeAttribute("data-src"); - img.src = src || DEFAULT_AVATAR; - } - } - function refreshDecrypt(root) { if (typeof window.initLazyImages === "function") { window.initLazyImages(root || document); } } - /** 用 cookie 登录态同步 header-account */ - function parseExpireTime(value) { - if (value == null || value === "") return NaN; - if (typeof value === "number") { - return value < 1e12 ? value * 1000 : value; - } - var text = String(value).trim(); - if (!text) return NaN; - if (/^\d+$/.test(text)) { - var num = Number(text); - return num < 1e12 ? num * 1000 : num; - } - return Date.parse(text); - } - - // vipType≠0 且 currentVipExpire 未过期(与 91ly 一致) - function isVipActive(user) { - if (!user) return false; - var type = Number(user.vipType); - if (!type || type === 0) return false; - var expireMs = parseExpireTime(user.currentVipExpire); - if (!isFinite(expireMs) || expireMs <= 0) return false; - return expireMs > Date.now(); - } - - function syncHeaderVip(session) { - var active = isVipActive(session); - document.querySelectorAll("[data-header-vip], [data-header-vip-sep]").forEach(function (el) { - el.hidden = !active; - }); - } - - function syncHeaderAccount() { - var account = document.querySelector("[data-header-account]"); - if (!account || !window.CookieUtil) return; - - // 有 token 即展示个人信息(含游客) - var loggedIn = CookieUtil.isLoggedIn(); - var session = loggedIn ? CookieUtil.getAuthSession() : null; - var nameEl = account.querySelector("[data-header-username]"); - - if (loggedIn && session) { - var displayName = - session.nickName || session.accountNo || session.email || "用户"; - var avatar = usableAvatar(session.avatar); - - account.href = "/user-center/"; - account.removeAttribute("data-login-dialog-open"); - - var guest = account.querySelector("[data-header-guest-avatar]"); - if (guest) guest.remove(); - - var photo = account.querySelector("[data-header-avatar]"); - if (!photo) { - photo = document.createElement("img"); - photo.className = "account-avatar-photo"; - photo.setAttribute("data-header-avatar", ""); - photo.alt = displayName + "的头像"; - account.insertBefore(photo, nameEl || account.firstChild); - } - setAvatarImg(photo, avatar); - - if (nameEl) { - nameEl.textContent = displayName; - nameEl.classList.add("account-label--logged"); - } - - refreshDecrypt(account.parentElement || document); - syncHeaderVip(session); - return; - } - - account.href = "#login"; - account.setAttribute("data-login-dialog-open", ""); - - var loggedPhoto = account.querySelector("[data-header-avatar]"); - if (loggedPhoto) loggedPhoto.remove(); - if (!account.querySelector("[data-header-guest-avatar]")) { - var wrap = document.createElement("div"); - wrap.className = "account-avatar"; - wrap.setAttribute("data-header-guest-avatar", ""); - wrap.innerHTML = - '' + - '' + - ''; - account.insertBefore(wrap, nameEl || account.firstChild); - } - if (nameEl) { - nameEl.textContent = "未登录"; - nameEl.classList.remove("account-label--logged"); - } - - syncHeaderVip(null); - } - - syncHeaderAccount(); - window.syncHeaderAccount = syncHeaderAccount; - document.addEventListener("auth:login", function () { - syncHeaderAccount(); - }); - document.addEventListener("auth:logout", function () { - syncHeaderAccount(); - }); document.addEventListener( "click", diff --git a/app/static/js/pages/history.js b/app/static/js/pages/history.js deleted file mode 100644 index 68915d3..0000000 --- a/app/static/js/pages/history.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * 观看历史页:清空记录 - */ -(function () { - var clearBtns = document.querySelectorAll("[data-history-clear]"); - var confirmMask = document.querySelector("[data-history-confirm]"); - var confirmCancelBtns = document.querySelectorAll( - "[data-history-confirm-cancel]" - ); - var confirmOkBtn = document.querySelector("[data-history-confirm-ok]"); - var clearing = false; - - function toast(message, type) { - if (window.AuthAPI && typeof window.AuthAPI.toast === "function") { - window.AuthAPI.toast(message, type); - } - } - - function openClearConfirm() { - if (!confirmMask) return; - confirmMask.hidden = false; - confirmMask.removeAttribute("hidden"); - confirmMask.classList.add("is-open"); - document.body.style.overflow = "hidden"; - } - - function closeClearConfirm() { - if (!confirmMask) return; - confirmMask.classList.remove("is-open"); - confirmMask.hidden = true; - confirmMask.setAttribute("hidden", ""); - document.body.style.overflow = ""; - } - - function clearHistory() { - if (clearing) return; - if (!window.HttpRequest) { - toast("清空失败,请稍后重试", "error"); - return; - } - clearing = true; - window.HttpRequest.post("/api/playlet/history/clear") - .then(function (res) { - if (!res || res.code !== 200) { - throw new Error((res && (res.tip || res.msg)) || "清空失败"); - } - window.location.reload(); - }) - .catch(function (err) { - clearing = false; - toast((err && err.message) || "清空失败,请稍后重试", "error"); - }); - } - - clearBtns.forEach(function (btn) { - btn.addEventListener("click", function () { - openClearConfirm(); - }); - }); - - confirmCancelBtns.forEach(function (btn) { - btn.addEventListener("click", function () { - closeClearConfirm(); - }); - }); - - if (confirmMask) { - confirmMask.addEventListener("click", function (e) { - if (e.target === confirmMask) closeClearConfirm(); - }); - } - - if (confirmOkBtn) { - confirmOkBtn.addEventListener("click", function () { - closeClearConfirm(); - clearHistory(); - }); - } - - document.addEventListener("keydown", function (e) { - if (e.key !== "Escape") return; - if (!confirmMask || !confirmMask.classList.contains("is-open")) return; - closeClearConfirm(); - }); -})(); diff --git a/app/static/js/pages/loginDialog.js b/app/static/js/pages/loginDialog.js deleted file mode 100644 index d6feec8..0000000 --- a/app/static/js/pages/loginDialog.js +++ /dev/null @@ -1,236 +0,0 @@ -(function () { - var mask = document.getElementById("loginDialog"); - if (!mask) return; - - var form = mask.querySelector("[data-login-dialog-form]"); - var accountInput = mask.querySelector("[data-login-account]"); - var passwordInput = mask.querySelector("[data-login-password]"); - var submitBtn = mask.querySelector("[data-login-submit]"); - var defaultSubmitText = (submitBtn && submitBtn.textContent) || "登录"; - - function setSubmitting(loading) { - if (!submitBtn) return; - submitBtn.disabled = !!loading; - submitBtn.classList.toggle("is-loading", !!loading); - submitBtn.setAttribute("aria-busy", loading ? "true" : "false"); - submitBtn.textContent = loading ? "登录中..." : defaultSubmitText; - } - - function getField(name) { - return mask.querySelector('[data-login-field="' + name + '"]'); - } - - function setFieldError(name, message) { - var field = getField(name); - if (!field) return; - var control = field.querySelector("[data-login-control]"); - var error = field.querySelector("[data-login-error]"); - if (control) control.classList.add("is-error"); - if (error) { - error.textContent = message; - error.hidden = false; - } - } - - function clearFieldError(name) { - var field = getField(name); - if (!field) return; - var control = field.querySelector("[data-login-control]"); - var error = field.querySelector("[data-login-error]"); - if (control) control.classList.remove("is-error"); - if (error) error.hidden = true; - } - - function clearAllErrors() { - clearFieldError("account"); - clearFieldError("password"); - } - - function isValidLength(value) { - return value.length >= 4 && value.length <= 16; - } - - function validateForm() { - var account = (accountInput && accountInput.value.trim()) || ""; - var password = (passwordInput && passwordInput.value) || ""; - var valid = true; - - clearAllErrors(); - - if (!account) { - setFieldError("account", "账号格式不正确,请输入有效账号"); - valid = false; - } else if (!window.AuthAPI || !AuthAPI.isValidLoginAccount(account)) { - setFieldError("account", "账号格式不正确,请输入有效账号"); - valid = false; - } - - if (!password) { - setFieldError("password", "密码错误,请检查后重新输入"); - valid = false; - } else if (!isValidLength(password)) { - setFieldError("password", "密码错误,请检查后重新输入"); - valid = false; - } - - if (!valid) return null; - return { account: account, password: password }; - } - - function mapServerError(err) { - var tip = (err && err.message) || "登录失败,请稍后重试"; - if (/密码|password/i.test(tip)) { - setFieldError("password", tip); - return; - } - if (/账号|账户|用户|邮箱|account|email|不存在|错误/i.test(tip)) { - setFieldError("account", tip); - return; - } - if (window.AuthAPI) AuthAPI.toast(tip, "error"); - else if (typeof showToast === "function") showToast(tip, "error"); - } - - function openDialog(event) { - if (event) event.preventDefault(); - if (typeof window.closeRegisterDialog === "function") { - window.closeRegisterDialog(); - } - clearAllErrors(); - mask.classList.add("is-open"); - document.body.style.overflow = "hidden"; - return true; - } - - function closeDialog() { - mask.classList.remove("is-open"); - clearAllErrors(); - if (!document.getElementById("registerDialog") || !document.getElementById("registerDialog").classList.contains("is-open")) { - document.body.style.overflow = ""; - } - } - - function setLoginErrors(errors) { - clearAllErrors(); - if (!errors) return; - if (errors.account) setFieldError("account", errors.account); - if (errors.password) setFieldError("password", errors.password); - } - - if (form) { - form.addEventListener("submit", function (event) { - event.preventDefault(); - if (submitBtn && submitBtn.classList.contains("is-loading")) return; - var payload = validateForm(); - if (!payload) return; - if (!window.AuthAPI || !window.HttpRequest) { - return; - } - - setSubmitting(true); - - AuthAPI.login(payload) - .then(function () { - AuthAPI.toast("登录成功", "success"); - closeDialog(); - setTimeout(function () { - goAfterAuth(); - }, 400); - }) - .catch(function (err) { - setSubmitting(false); - mapServerError(err); - }); - }); - } - - function isSafeRedirect(path) { - return typeof path === "string" && path.charAt(0) === "/" && path.charAt(1) !== "/"; - } - - function goAfterAuth() { - var bodyRedirect = document.body && document.body.getAttribute("data-auth-redirect"); - if (isSafeRedirect(bodyRedirect)) { - window.location.href = bodyRedirect; - return; - } - var params = new URLSearchParams(window.location.search); - var redirect = params.get("redirect"); - if (isSafeRedirect(redirect)) { - window.location.href = redirect; - return; - } - window.location.reload(); - } - - function consumeAuthQuery(kind) { - var params = new URLSearchParams(window.location.search); - if (params.get("auth") !== kind) return false; - params.delete("auth"); - var qs = params.toString(); - var next = window.location.pathname + (qs ? "?" + qs : "") + window.location.hash; - window.history.replaceState(null, "", next); - return true; - } - - if (accountInput) { - accountInput.addEventListener("input", function () { - clearFieldError("account"); - }); - } - - if (passwordInput) { - passwordInput.addEventListener("input", function () { - clearFieldError("password"); - }); - } - - document.addEventListener("click", function (event) { - var openEl = event.target.closest("[data-login-dialog-open]"); - if (openEl) { - openDialog(event); - return; - } - - var loginLink = event.target.closest('a[href="/login/"], a[href="#login"]'); - if (loginLink) { - openDialog(event); - return; - } - - if (event.target.closest("[data-login-dialog-close]")) { - closeDialog(); - return; - } - - if (event.target.closest("[data-login-dialog-eye]")) { - var btn = event.target.closest("[data-login-dialog-eye]"); - var input = document.getElementById("loginDialogPassword"); - var img = btn.querySelector("img"); - if (!input || !img) return; - var show = input.type === "password"; - input.type = show ? "text" : "password"; - img.src = show ? "/static/images/eye_open.svg" : "/static/images/eye_close.svg"; - btn.setAttribute("aria-label", show ? "隐藏密码" : "显示密码"); - return; - } - - if (event.target === mask) { - closeDialog(); - } - }); - - document.addEventListener("keydown", function (event) { - if (event.key === "Escape" && mask.classList.contains("is-open")) { - closeDialog(); - } - }); - - window.openLoginDialog = openDialog; - window.closeLoginDialog = closeDialog; - window.setLoginDialogErrors = setLoginErrors; - - if ((document.body && document.body.getAttribute("data-auth-mode") === "login") || consumeAuthQuery("login")) { - openDialog(); - } -})(); diff --git a/app/static/js/pages/play.js b/app/static/js/pages/play.js index 5072b38..0ab87e3 100644 --- a/app/static/js/pages/play.js +++ b/app/static/js/pages/play.js @@ -437,46 +437,6 @@ applyPlaySpeed(dp, currentPlaySpeed()); } - // 复用同一 meta 对象:bindVideoEvents 只绑一次,切集时就地更新字段即可生效。 - var playTrackerMeta = { - media_id: "", - video_id: "", - video_title: "", - video_type_id: "playlet", - video_type_name: "短剧", - video_content_type: "playlet", - recommend_trace_id: "", - video_tag_key: "", - video_tag_name: "", - }; - var playViewTracked = false; - - function syncPlayTrackerMeta() { - var root = document.querySelector("[data-play-page]"); - var ds = (root && root.dataset) || {}; - var player = document.querySelector("[data-play-player]"); - var pds = (player && player.dataset) || {}; - var episode = ds.playEpisode || ""; - playTrackerMeta.media_id = ds.playletId || ""; - playTrackerMeta.video_id = ds.playletId || ""; - playTrackerMeta.video_title = ds.playTitle || ""; - playTrackerMeta.video_type_id = "playlet"; - playTrackerMeta.video_type_name = ds.playTag || "短剧"; - playTrackerMeta.video_content_type = "playlet"; - playTrackerMeta.recommend_trace_id = ""; - playTrackerMeta.video_tag_key = pds.chapterId || ""; - playTrackerMeta.video_tag_name = episode ? "第" + episode + "集" : ""; - return playTrackerMeta; - } - - function bindPlayTracker(dp) { - if (!dp || !window.tracker || typeof window.tracker.bindVideoEvents !== "function") { - return; - } - syncPlayTrackerMeta(); - window.tracker.bindVideoEvents(dp, playTrackerMeta); - } - function nextEpisodeElement() { var active = document.querySelector(".play-ep-grid .play-ep--active"); if (!active) return null; @@ -607,7 +567,6 @@ var player = container.closest(".play-player"); bindPlayerPoster(playDp, player); bindH265Fallback(playDp, source); - bindPlayTracker(playDp); setupDesktopPlayerControls(playDp); return playDp; } catch (e) { @@ -681,7 +640,7 @@ if (id > 0 && next.getAttribute("data-play-switch") != null) { return id; } - // 付费/VIP 锁定集:返回 id 以便弹窗 + // 付费锁定集:返回 id 以便引导下载 APP if (id > 0) return id; } next = next.nextElementSibling; @@ -721,14 +680,17 @@ if (dp && typeof dp.on === "function") { dp.on("timeupdate", updateNextCountdown); dp.on("ended", function () { - markCurrentEpisodeWatched(); var chapterId = findNextChapterId(); setNextCountdownVisible(false, 3); - if (chapterId) switchToChapter(chapterId, { autoplay: true }); + if (!chapterId) return; + if (isLockedEpisode(chapterId)) { + openDownloadApp(); + return; + } + switchToChapter(chapterId, { autoplay: true }); }); dp.on("play", function () { applyPlaySpeed(dp, currentPlaySpeed()); - markCurrentEpisodeWatched(); updateNextCountdown(); }); dp.on("seeked", updateNextCountdown); @@ -770,26 +732,6 @@ (playPage && playPage.getAttribute("data-play-episode")) || 0 ); var switchingChapter = false; - var lastWatchReportKey = ""; - - function reportChapterWatch() { - if (!currentChapterId || !window.HttpRequest) return; - if (window.CookieUtil && !window.CookieUtil.isLoggedIn()) return; - var key = String(playletId || 0) + ":" + currentChapterId; - if (key === lastWatchReportKey) return; - lastWatchReportKey = key; - var body = { chapterId: currentChapterId }; - if (playletId) body.playletId = playletId; - window.HttpRequest.post("/api/playlet/chapter/watch/report", body).catch( - function () { - /* 静默失败:未登录/网络错误不打断播放 */ - } - ); - } - - function markCurrentEpisodeWatched() { - reportChapterWatch(); - } function padEpisode(n) { var num = Number(n) || 0; @@ -802,92 +744,42 @@ return "/play/" + encodeURIComponent(key) + "/" + chapterId + "/"; } - function resolvePayGate(chapter, el) { - if (chapter) { - if (chapter.canWatch || chapter.isUnlocked) return 0; - if (chapter.needUnlock) return 1; - if (chapter.needVip) return 2; - var payType = Number(chapter.payType || 0); - if (payType === 1 || payType === 2) return payType; - return 0; - } - if (el) { - if (el.getAttribute("data-can-watch") === "1") return 0; - if (el.getAttribute("data-need-unlock") === "1") return 1; - if (el.getAttribute("data-need-vip") === "1") return 2; - if (el.getAttribute("data-coin-dialog-open") != null) return 1; - if (el.getAttribute("data-vip-dialog-open") != null) return 2; - return Number(el.getAttribute("data-pay-type") || 0); - } - return 0; + function isChapterLocked(chapter) { + if (!chapter) return false; + if (chapter.canWatch || chapter.isUnlocked) return false; + if (chapter.needUnlock || chapter.needVip) return true; + // 与服务端 PlayletChapterData.AllowWatch 保持一致:仅免费集可直接播放。 + return Number(chapter.payType || 0) !== 0; } - function resolveUnlockCost(chapter, el) { - if (chapter) { - if (Number(chapter.costCoins) > 0) return Number(chapter.costCoins); - if (Number(chapter.singleCoins) > 0) return Number(chapter.singleCoins); - } - if (el) return Number(el.getAttribute("data-single-coins") || 0); - return 0; + function isLockedEpisode(chapterId) { + chapterId = Number(chapterId) || 0; + if (!chapterId) return false; + return !!document.querySelector( + '[data-play-locked][data-chapter-id="' + chapterId + '"]' + ); } - function openPayForChapter(el, chapter) { - var payGate = resolvePayGate(chapter, el); - if (payGate === 1) { - if (typeof window.openCoinDialog === "function") { - var coinTrigger = document.createElement("button"); - coinTrigger.setAttribute("data-coin-dialog-open", ""); - coinTrigger.setAttribute( - "data-chapter-id", - String((chapter && chapter.id) || (el && el.getAttribute("data-chapter-id")) || "") - ); - coinTrigger.setAttribute( - "data-playlet-id", - String( - (chapter && chapter.playletId) || - playletId || - (el && el.getAttribute("data-playlet-id")) || - "" - ) - ); - coinTrigger.setAttribute( - "data-single-coins", - String(resolveUnlockCost(chapter, el)) - ); - coinTrigger.style.display = "none"; - document.body.appendChild(coinTrigger); - coinTrigger.click(); - coinTrigger.remove(); - } - return true; + // 付费剧集统一引导下载 APP(移动端跳转下载地址,PC 弹出下载二维码)。 + function openDownloadApp() { + if (typeof window.openDownloadApp === "function") { + return window.openDownloadApp(); } - if (payGate === 2) { - var vipBtn = document.querySelector("[data-vip-dialog-open]"); - if (vipBtn) vipBtn.click(); - else if (typeof window.openVipDialog === "function") { - window.openVipDialog(); - } - return true; - } - return false; + return Promise.resolve(); } function updateEpisodeActive(chapterId) { document.querySelectorAll(".play-ep").forEach(function (el) { var isActive = Number(el.getAttribute("data-chapter-id") || 0) === chapterId; el.classList.toggle("play-ep--active", isActive); - var coin = el.querySelector(".play-ep-coin"); var lock = el.querySelector(".play-ep-lock"); - if (coin) coin.style.display = isActive ? "none" : ""; if (lock) lock.style.display = isActive ? "none" : ""; }); document.querySelectorAll(".play-ep-sheet-item").forEach(function (el) { var isActive = Number(el.getAttribute("data-chapter-id") || 0) === chapterId; el.classList.toggle("play-ep-sheet-item--active", isActive); - var coin = el.querySelector(".play-ep-sheet-coin"); var lock = el.querySelector(".play-ep-sheet-lock"); - if (coin) coin.hidden = isActive; if (lock) lock.hidden = isActive; }); syncDesktopNextControl(); @@ -897,7 +789,6 @@ var ep = Number(chapter.currentEpisode) || 0; currentEpisode = ep; currentChapterId = Number(chapter.id) || currentChapterId; - lastWatchReportKey = ""; if (playPage) { playPage.setAttribute("data-play-episode", String(ep)); } @@ -922,10 +813,6 @@ player.setAttribute("data-chapter-id", String(chapter.id || "")); player.setAttribute("data-playlet-id", String(playletId || chapter.playletId || "")); player.setAttribute("data-pay-type", String(chapter.payType || 0)); - player.setAttribute( - "data-single-coins", - String(resolveUnlockCost(chapter, null)) - ); player.setAttribute( "data-can-watch", chapter.canWatch || chapter.isUnlocked ? "1" : "0" @@ -935,10 +822,6 @@ chapter.needUnlock ? "1" : "0" ); player.setAttribute("data-need-vip", chapter.needVip ? "1" : "0"); - player.setAttribute( - "data-is-unlocked", - chapter.isUnlocked ? "1" : "0" - ); } var commentCount = document.querySelector("[data-play-comment-count]"); @@ -976,6 +859,8 @@ container.setAttribute("data-url", videoUrl || ""); if (playCover) container.setAttribute("data-cover", playCover); player.insertBefore(container, player.firstChild); + var lockedCta = player.querySelector("[data-play-locked-cta]"); + if (lockedCta) lockedCta.remove(); var playBtn = player.querySelector("[data-play-poster-play]"); if (!playBtn) { playBtn = document.createElement("button"); @@ -1016,24 +901,18 @@ throw new Error((res && (res.tip || res.msg)) || "加载失败"); } var chapter = res.data; - var payGate = resolvePayGate(chapter, null); - if (payGate !== 0 && !options.skipPayCheck) { - openPayForChapter(null, chapter); + if (isChapterLocked(chapter)) { + openDownloadApp(); return; } var videoUrl = resolvePlayUrl(chapter.videoUrl || ""); if (!videoUrl) { - if (payGate !== 0) { - openPayForChapter(null, chapter); - return; - } throw new Error("暂无播放地址"); } currentChapterId = Number(chapter.id) || chapterId; updateEpisodeActive(currentChapterId); updateChapterMeta(chapter); - markCurrentEpisodeWatched(); if (!options.skipHistory) { var href = buildPlayHref(currentChapterId); @@ -1049,8 +928,6 @@ if (playDp && typeof playDp.switchVideo === "function") { switchPlayerVideo(playDp, videoOption); - syncPlayTrackerMeta(); - bindPlayTracker(playDp); } else { ensurePlayerContainer(chapter.videoUrl || ""); playDp = initDPlayer(); @@ -1078,69 +955,6 @@ }); } - function markEpisodeUnlocked(chapterId) { - chapterId = Number(chapterId) || 0; - if (!chapterId) return; - var href = buildPlayHref(chapterId); - document - .querySelectorAll( - '.play-ep[data-chapter-id="' + - chapterId + - '"], .play-ep-sheet-item[data-chapter-id="' + - chapterId + - '"]' - ) - .forEach(function (el) { - el.removeAttribute("data-coin-dialog-open"); - el.removeAttribute("data-vip-dialog-open"); - el.removeAttribute("data-single-coins"); - el.setAttribute("data-play-switch", ""); - el.setAttribute("href", href || "javascript:;"); - var coin = el.querySelector( - ".play-ep-coin, .play-ep-sheet-coin" - ); - if (coin) coin.remove(); - var lock = el.querySelector( - ".play-ep-lock, .play-ep-sheet-lock" - ); - if (lock) lock.remove(); - }); - - var player = document.querySelector("[data-play-player]"); - if ( - player && - Number(player.getAttribute("data-chapter-id") || 0) === chapterId - ) { - player.setAttribute("data-pay-type", "0"); - player.setAttribute("data-can-watch", "1"); - player.setAttribute("data-need-unlock", "0"); - player.setAttribute("data-need-vip", "0"); - player.setAttribute("data-is-unlocked", "1"); - player.removeAttribute("data-single-coins"); - } - } - - function playAfterChapterUnlock(detail) { - detail = detail || {}; - var chapterId = Number(detail.chapterId) || 0; - if (!chapterId) return; - if (detail.playletId) { - playletId = Number(detail.playletId) || playletId; - if (playPage) { - playPage.setAttribute("data-playlet-id", String(playletId)); - } - } - markEpisodeUnlocked(chapterId); - switchToChapter(chapterId, { - force: true, - skipPayCheck: true, - autoplay: true, - replace: true, - }); - } - - window.playAfterChapterUnlock = playAfterChapterUnlock; - function bindEpisodeSwitch() { document.addEventListener("click", function (e) { var el = @@ -1154,12 +968,27 @@ switchToChapter(chapterId, { autoplay: true }); }); + document.addEventListener("click", function (e) { + var el = + e.target && e.target.closest + ? e.target.closest("[data-play-locked], [data-play-download-app]") + : null; + if (!el) return; + e.preventDefault(); + openDownloadApp(); + }); + window.addEventListener("popstate", function (e) { var match = String(window.location.pathname || "").match(/\/play\/[^/]+\/(\d+)\/?$/); var chapterId = (e.state && e.state.chapterId) || Number((match && match[1]) || 0); if (!chapterId) return; + if (isLockedEpisode(chapterId)) { + // 回退到付费集:交给服务端渲染下载 APP 引导,避免自动跳转。 + window.location.reload(); + return; + } switchToChapter(chapterId, { autoplay: true, skipHistory: true, @@ -1176,14 +1005,6 @@ } } - function maybeOpenPayDialog() { - var player = document.querySelector("[data-play-player]"); - if (!player) return; - var hasVideo = !!player.querySelector(".dplayer-video[data-url]"); - if (hasVideo) return; - openPayForChapter(player, null); - } - function bindSidebarRanges() { var ranges = document.querySelectorAll("[data-play-ep-ranges] .play-ep-range"); var episodes = document.querySelectorAll("[data-play-ep-grid] .play-ep"); @@ -1349,44 +1170,11 @@ window.alert(message); } - function trackPlayView() { - if (playViewTracked || !window.tracker || typeof window.tracker.videoEvent !== "function") return; - var meta = syncPlayTrackerMeta(); - if (!meta.video_id) return; - playViewTracked = true; - window.tracker.videoEvent({ - media_id: meta.media_id, - video_id: meta.video_id, - video_title: meta.video_title, - video_type_id: meta.video_type_id, - video_type_name: meta.video_type_name, - video_content_type: meta.video_content_type, - recommend_trace_id: meta.recommend_trace_id, - video_tag_key: meta.video_tag_key, - video_tag_name: meta.video_tag_name, - video_behavior_key: "video_view", - video_behavior_name: "视频展示", - }); - } - - function bindTrackingWhenReady(dp) { - function activateTracking() { - bindPlayTracker(dp || playDp); - trackPlayView(); - } - activateTracking(); - if (!window.__trackerReady) { - window.addEventListener("tracker:ready", activateTracking, { once: true }); - } - } - function boot() { var dp = initDPlayer(); bindH5PlayerUI(dp); bindSidebarRanges(); bindEpisodeSwitch(); - maybeOpenPayDialog(); - bindTrackingWhenReady(dp); if (typeof window.initLazyImages === "function") { window.initLazyImages(document.querySelector(".play-page") || document); } diff --git a/app/static/js/pages/registerDialog.js b/app/static/js/pages/registerDialog.js deleted file mode 100644 index 8e0f2ed..0000000 --- a/app/static/js/pages/registerDialog.js +++ /dev/null @@ -1,213 +0,0 @@ -(function () { - var mask = document.getElementById("registerDialog"); - if (!mask) return; - - var form = mask.querySelector("[data-register-dialog-form]"); - var accountInput = mask.querySelector("[data-register-account]"); - var passwordInput = mask.querySelector("[data-register-password]"); - var confirmInput = mask.querySelector("[data-register-password-confirm]"); - var submitBtn = mask.querySelector("[data-register-submit]"); - var defaultSubmitText = (submitBtn && submitBtn.textContent) || "立即注册"; - - function setSubmitting(loading) { - if (!submitBtn) return; - submitBtn.disabled = !!loading; - submitBtn.classList.toggle("is-loading", !!loading); - submitBtn.setAttribute("aria-busy", loading ? "true" : "false"); - submitBtn.textContent = loading ? "注册中..." : defaultSubmitText; - } - - function getField(name) { - return mask.querySelector('[data-register-field="' + name + '"]'); - } - - function setFieldError(name, message) { - var field = getField(name); - if (!field) return; - var control = field.querySelector("[data-register-control]"); - var error = field.querySelector("[data-register-error]"); - if (control) control.classList.add("is-error"); - if (error) { - error.textContent = message; - error.hidden = false; - } - } - - function clearFieldError(name) { - var field = getField(name); - if (!field) return; - var control = field.querySelector("[data-register-control]"); - var error = field.querySelector("[data-register-error]"); - if (control) control.classList.remove("is-error"); - if (error) error.hidden = true; - } - - function clearAllErrors() { - clearFieldError("account"); - clearFieldError("password"); - clearFieldError("password_confirm"); - } - - function isValidLength(value) { - return value.length >= 4 && value.length <= 16; - } - - function validateForm() { - var account = (accountInput && accountInput.value.trim()) || ""; - var password = (passwordInput && passwordInput.value) || ""; - var confirm = (confirmInput && confirmInput.value) || ""; - var valid = true; - - clearAllErrors(); - - if (!account) { - setFieldError("account", "请输入账号"); - valid = false; - } else if (!isValidLength(account)) { - setFieldError("account", "账号需为 4–16 个字符"); - valid = false; - } - - if (!password) { - setFieldError("password", "请输入密码"); - valid = false; - } else if (!isValidLength(password)) { - setFieldError("password", "密码需为 4–16 个字符"); - valid = false; - } - - if (!confirm) { - setFieldError("password_confirm", "请再次输入密码"); - valid = false; - } else if (confirm !== password) { - setFieldError("password_confirm", "两次输入的密码不一致"); - valid = false; - } - - if (!valid) return null; - return { accountNo: account, password: password }; - } - - function mapServerError(err) { - var tip = (err && err.message) || "注册失败,请稍后重试"; - var code = err && err.code; - if (code === 5005 || /已存在|重复|占用/.test(tip)) { - setFieldError("account", tip); - return; - } - if (/密码|password/i.test(tip)) { - setFieldError("password", tip); - return; - } - if (window.AuthAPI) AuthAPI.toast(tip, "error"); - else if (typeof showToast === "function") showToast(tip, "error"); - } - - function openDialog(event) { - if (event) event.preventDefault(); - if (typeof window.closeLoginDialog === "function") { - window.closeLoginDialog(); - } - clearAllErrors(); - mask.classList.add("is-open"); - document.body.style.overflow = "hidden"; - return true; - } - - function closeDialog() { - mask.classList.remove("is-open"); - clearAllErrors(); - if (!document.getElementById("loginDialog") || !document.getElementById("loginDialog").classList.contains("is-open")) { - document.body.style.overflow = ""; - } - } - - if (form) { - form.addEventListener("submit", function (event) { - event.preventDefault(); - if (submitBtn && submitBtn.classList.contains("is-loading")) return; - var payload = validateForm(); - if (!payload) return; - if (!window.AuthAPI || !window.HttpRequest) { - return; - } - - setSubmitting(true); - - AuthAPI.register(payload) - .then(function () { - AuthAPI.toast("注册成功", "success"); - closeDialog(); - setTimeout(function () { - window.location.reload(); - }, 400); - }) - .catch(function (err) { - setSubmitting(false); - mapServerError(err); - }); - }); - } - - function consumeAuthQuery(kind) { - var params = new URLSearchParams(window.location.search); - if (params.get("auth") !== kind) return false; - params.delete("auth"); - var qs = params.toString(); - var next = window.location.pathname + (qs ? "?" + qs : "") + window.location.hash; - window.history.replaceState(null, "", next); - return true; - } - - if (accountInput) { - accountInput.addEventListener("input", function () { - clearFieldError("account"); - }); - } - if (passwordInput) { - passwordInput.addEventListener("input", function () { - clearFieldError("password"); - }); - } - if (confirmInput) { - confirmInput.addEventListener("input", function () { - clearFieldError("password_confirm"); - }); - } - - document.addEventListener("click", function (event) { - var openEl = event.target.closest("[data-register-dialog-open]"); - if (openEl) { - openDialog(event); - return; - } - - var registerLink = event.target.closest('a[href="/register/"], a[href="#register"]'); - if (registerLink) { - openDialog(event); - return; - } - - if (event.target.closest("[data-register-dialog-close]")) { - closeDialog(); - return; - } - - if (event.target === mask) { - closeDialog(); - } - }); - - document.addEventListener("keydown", function (event) { - if (event.key === "Escape" && mask.classList.contains("is-open")) { - closeDialog(); - } - }); - - window.openRegisterDialog = openDialog; - window.closeRegisterDialog = closeDialog; - - if ((document.body && document.body.getAttribute("data-auth-mode") === "register") || consumeAuthQuery("register")) { - openDialog(); - } -})(); diff --git a/app/static/js/pages/setting.js b/app/static/js/pages/setting.js deleted file mode 100644 index 4226ad6..0000000 --- a/app/static/js/pages/setting.js +++ /dev/null @@ -1,34 +0,0 @@ -(function () { - document.querySelectorAll(".setting-switch").forEach(function (btn) { - btn.addEventListener("click", function () { - var on = btn.classList.toggle("setting-switch--on"); - btn.setAttribute("aria-pressed", on ? "true" : "false"); - }); - }); - - var logoutBtn = document.querySelector("[data-auth-logout]"); - if (logoutBtn) { - logoutBtn.addEventListener("click", function () { - function done() { - if (window.AuthAPI && typeof AuthAPI.markGuestLogout === "function") { - AuthAPI.markGuestLogout(); - } - if (window.CookieUtil && typeof CookieUtil.clearAuth === "function") { - CookieUtil.clearAuth(); - } - try { - document.dispatchEvent(new CustomEvent("auth:logout")); - } catch (e) {} - window.location.href = "/"; - } - - if (window.HttpRequest) { - HttpRequest.post("/api/auth/logout", {}) - .catch(function () {}) - .then(done); - } else { - done(); - } - }); - } -})(); diff --git a/app/static/js/pages/userCenter.js b/app/static/js/pages/userCenter.js deleted file mode 100644 index 486af3a..0000000 --- a/app/static/js/pages/userCenter.js +++ /dev/null @@ -1,161 +0,0 @@ -(function () { - function parseExpireTime(value) { - if (value == null || value === "") return NaN; - if (typeof value === "number") { - return value < 1e12 ? value * 1000 : value; - } - var text = String(value).trim(); - if (!text) return NaN; - if (/^\d+$/.test(text)) { - var num = Number(text); - return num < 1e12 ? num * 1000 : num; - } - return Date.parse(text); - } - - function isVipActive(user) { - if (!user) return false; - var type = Number(user.vipType); - if (!type || type === 0) return false; - var expireMs = parseExpireTime(user.currentVipExpire); - if (!isFinite(expireMs) || expireMs <= 0) return false; - return expireMs > Date.now(); - } - - function vipTypeLabel(vipType) { - var type = Number(vipType); - if (type === 1) return "月卡会员"; - if (type === 2) return "年卡会员"; - return "普通会员"; - } - - function vipDisplayLabel(user) { - var name = user && String(user.showCardName || "").trim(); - if (name) return name; - return vipTypeLabel(user && user.vipType); - } - - function vipExpireText(raw) { - var ms = parseExpireTime(raw); - if (!isFinite(ms) || ms <= 0) return ""; - var d = new Date(ms); - var y = d.getFullYear(); - var m = String(d.getMonth() + 1).padStart(2, "0"); - var day = String(d.getDate()).padStart(2, "0"); - return "有效期至 " + y + "/" + m + "/" + day; - } - - function formatRecharge(value) { - var n = Number(value); - if (!isFinite(n) || n < 0) n = 0; - return String(Math.floor(n)).replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } - - function syncUserCenterRecharge(value) { - var text = formatRecharge( - value != null - ? value - : CookieUtil.getAuthSession() && CookieUtil.getAuthSession().recharge, - ); - var pc = document.querySelector("[data-user-center-recharge]"); - if (pc) pc.textContent = text; - var hint = document.querySelector("[data-user-center-recharge-hint]"); - if (hint) hint.textContent = text + "金币"; - } - - function syncUserCenterID(value) { - var id = String(value == null ? "" : value).trim(); - if (!id) return; - document.querySelectorAll("[data-user-center-id]").forEach(function (el) { - el.textContent = el.getAttribute("data-id-layout") === "pc" - ? "ID:" + id - : "ID " + id; - }); - } - - function refreshUserCenterWallet() { - if (!window.CookieUtil || !CookieUtil.isLoggedIn()) return; - syncUserCenterRecharge(); - if (!window.HttpRequest) return; - HttpRequest.get("/api/auth/getInfo") - .then(function (res) { - if (!res || res.code !== 200 || !res.data) return; - if (CookieUtil.setAuthSession) CookieUtil.setAuthSession(res.data); - syncUserCenterID(res.data.userId); - syncUserCenterRecharge(res.data.recharge); - syncUserCenterVip(); - }) - .catch(function () {}); - } - - function syncUserCenterVip() { - if (!window.CookieUtil || !CookieUtil.isLoggedIn()) return; - var session = CookieUtil.getAuthSession(); - var active = isVipActive(session); - var label = active ? vipDisplayLabel(session) : ""; - var expire = active - ? vipExpireText(session && session.currentVipExpire) - : ""; - - var pc = document.querySelector("[data-user-center-vip]"); - if (pc) { - pc.classList.toggle("user-center-vip-card--active", active); - var status = pc.querySelector("[data-vip-status]"); - var expireEl = pc.querySelector("[data-vip-expire]"); - var action = pc.querySelector("[data-vip-action]"); - if (status) { - status.textContent = active ? "尊享 VIP 会员" : "尚未开通会员"; - } - if (expireEl) { - if (active && expire) { - expireEl.hidden = false; - expireEl.style.display = ""; - expireEl.textContent = expire; - } else { - expireEl.hidden = true; - expireEl.style.display = "none"; - expireEl.textContent = ""; - } - } - if (action) { - if (active) { - action.hidden = true; - action.style.display = "none"; - } else { - action.hidden = false; - action.style.display = ""; - action.textContent = "立即开通 →"; - } - } - } - - var mobile = document.querySelector("[data-user-center-mobile-vip]"); - if (mobile) { - mobile.classList.toggle("user-center-mobile-vip--active", active); - var title = mobile.querySelector("[data-mobile-vip-title]"); - var desc = mobile.querySelector("[data-mobile-vip-desc]"); - var btn = mobile.querySelector("[data-mobile-vip-btn]"); - if (title) title.textContent = active ? label : "开通黄果短剧会员"; - if (desc) { - desc.textContent = active - ? expire || "全场免费看 · 热门短剧抢先看" - : "全场免费看 · 热门短剧抢先看"; - } - if (btn) { - btn.hidden = false; - btn.style.display = ""; - if (active) { - btn.textContent = "续费会员"; - } else { - btn.textContent = "立即开通"; - } - } - } - } - - syncUserCenterVip(); - refreshUserCenterWallet(); - window.syncUserCenterVip = syncUserCenterVip; - window.syncUserCenterID = syncUserCenterID; - window.syncUserCenterRecharge = syncUserCenterRecharge; -})(); diff --git a/app/static/js/pages/vipDialog.js b/app/static/js/pages/vipDialog.js deleted file mode 100644 index 0a1dc92..0000000 --- a/app/static/js/pages/vipDialog.js +++ /dev/null @@ -1,52 +0,0 @@ -(function () { - var mask = document.getElementById("vipDialog"); - if (!mask) return; - - function openDialog(event) { - if (event) event.preventDefault(); - mask.classList.add("is-open"); - document.body.style.overflow = "hidden"; - } - - function closeDialog() { - mask.classList.remove("is-open"); - document.body.style.overflow = ""; - } - - function isVipLockedEpisode(target) { - var episode = target.closest( - ".detail-episode, .play-ep, .play-ep-sheet-item, .detail-h5-ep-item" - ); - if (!episode) return false; - // 金币解锁走 coinDialog,不在此打开 VIP 弹窗 - if (episode.hasAttribute("data-coin-dialog-open")) return false; - return !!episode.querySelector( - ".detail-episode-lock[src*='vip'], .detail-episode-vip, .play-ep-lock[src*='vip'], .play-ep-sheet-lock[src*='vip'], .detail-h5-ep-lock[src*='vip']" - ); - } - - document.addEventListener("click", function (event) { - if (event.target.closest("[data-vip-dialog-open]") || isVipLockedEpisode(event.target)) { - openDialog(event); - return; - } - - if (event.target.closest("[data-vip-dialog-close]")) { - closeDialog(); - return; - } - - if (event.target === mask) { - closeDialog(); - } - }); - - document.addEventListener("keydown", function (event) { - if (event.key === "Escape" && mask.classList.contains("is-open")) { - closeDialog(); - } - }); - - window.openVipDialog = openDialog; - window.closeVipDialog = closeDialog; -})(); diff --git a/app/static/js/tracker.js b/app/static/js/tracker.js deleted file mode 100644 index 60b96e8..0000000 --- a/app/static/js/tracker.js +++ /dev/null @@ -1,1483 +0,0 @@ -/** - * 数据上报 SDK 接入封装 (91porn / JHA-1029) - * 文档: http://34.146.148.117:8033/web/getting-started.html - * 参考: ttrgw-server / mdcom_web 项目 tracker.js - * - * 使用方式: 在 中先引入 web-sdk-vX.X.X.js,再引入本文件 tracker.js, - * 然后通过 trackerInit 注入配置。模板做法见 base/trackerInit.html。 - */ -(function (global) { - "use strict"; - - // 是否已经初始化(避免页面切换/重复 init) - var __inited = false; - // 当前页面信息 - var __pageInfo = { page_key: "", page_name: "" }; - // 来源页面信息 - var __referrerPageInfo = { page_key: "", page_name: "" }; - // 广告已上报展示去重 Set (key = slot+ids) - var __adShownSet = {}; - // 页面加载开始时间 - var __pageStart = (global.performance && global.performance.now) - ? global.performance.now() - : Date.now(); - - // ------- 工具方法 ------- - function isReady() { - return typeof global.WebSDK !== "undefined" && global.WebSDK && global.WebSDK.track; - } - function safeCall(fn) { - if (!isReady()) { - // 等待 SDK 加载完成后再执行 - var timer = setInterval(function () { - if (isReady()) { - clearInterval(timer); - try { fn(); } catch (e) { logError(e); } - } - }, 50); - return; - } - try { fn(); } catch (e) { logError(e); } - } - // sid 是必填公共字段。确认一次存在后置位,后续事件直接同步上报。 - var __sidKnownPresent = false; - // 发送事件前确保 sid 存在:能取到则上报;为空则尝试补齐(notifyPageLoad); - // 仍无法生成则丢弃该事件(满足"无法生成 sid 时丢弃或补齐"的要求)。 - function sendTrack(send) { - safeCall(function () { - if (__sidKnownPresent || !global.WebSDK.getCommonField) { send(); return; } - global.WebSDK.getCommonField("sid").then(function (sid) { - if (sid) { __sidKnownPresent = true; send(); return; } - // 补齐:强制重建会话生成 sid - try { global.WebSDK.notifyPageLoad && global.WebSDK.notifyPageLoad(); } catch (e) {} - global.WebSDK.getCommonField("sid").then(function (sid2) { - if (sid2) { __sidKnownPresent = true; send(); } - else { logError(new Error("sid 无法生成,事件已丢弃")); } // 丢弃 - }).catch(function () { __sidKnownPresent = true; send(); }); - }).catch(function () { __sidKnownPresent = true; send(); }); - }); - } - function logError() {} - // 必填非空字符串字段的安全默认值 - function nonEmpty(v, fallback) { - var s = (v == null) ? "" : String(v); - return s.length ? s : fallback; - } - // 把数值限制在 [min, max] 区间(用于点击百分比 0-100) - function clamp(v, min, max) { - var n = parseInt(v, 10); - if (isNaN(n)) n = 0; - if (n < min) n = min; - if (n > max) n = max; - return n; - } - // Web SDK 文档约定:无标签时 tag_key=default,tag_name=默认标签 - var TAG_KEY_DEFAULT = "default"; - var TAG_NAME_DEFAULT = "默认标签"; - function tagKeyOrDefault(v) { - return nonEmpty(v, TAG_KEY_DEFAULT); - } - function tagNameOrDefault(v) { - return nonEmpty(v, TAG_NAME_DEFAULT); - } - - var __deviceInfo = null; - function parseDeviceInfoFromUA(ua) { - ua = ua || (typeof navigator !== "undefined" ? navigator.userAgent : "") || ""; - var brand = ""; - var model = ""; - var systemName = ""; - var systemVersion = ""; - - if (/iPhone|iPad|iPod/i.test(ua)) { - systemName = "iOS"; - brand = "Apple"; - var ios = ua.match(/OS (\d+[_\d]*) like Mac OS X/i); - systemVersion = ios ? ios[1].replace(/_/g, ".") : ""; - if (/iPad/i.test(ua)) model = "iPad"; - else if (/iPod/i.test(ua)) model = "iPod"; - else model = "iPhone"; - } else if (/Android/i.test(ua)) { - systemName = "Android"; - var and = ua.match(/Android ([\d.]+)/i); - systemVersion = and ? and[1] : ""; - var andModel = ua.match(/Android\s+[\d.]+;\s*([^;)]+?)(?:\s+Build\/|\))/i); - if (andModel) model = andModel[1].trim(); - if (/HUAWEI|HW-|HONOR/i.test(ua)) brand = "HUAWEI"; - else if (/Xiaomi|Redmi|MI\s/i.test(ua)) brand = "Xiaomi"; - else if (/OPPO/i.test(ua)) brand = "OPPO"; - else if (/vivo/i.test(ua)) brand = "vivo"; - else if (/Samsung|SM-/i.test(ua)) brand = "Samsung"; - else if (/OnePlus/i.test(ua)) brand = "OnePlus"; - } else if (/Windows/i.test(ua)) { - systemName = "Windows"; - brand = "PC"; - model = "PC"; - var win = ua.match(/Windows NT ([\d.]+)/i); - systemVersion = win ? win[1] : ""; - } else if (/Mac OS X|Macintosh/i.test(ua)) { - systemName = "macOS"; - brand = "Apple"; - model = "Mac"; - var mac = ua.match(/Mac OS X ([\d_]+)/i); - systemVersion = mac ? mac[1].replace(/_/g, ".") : ""; - } else if (/Linux/i.test(ua)) { - systemName = "Linux"; - brand = "PC"; - model = "PC"; - } else { - brand = "PC"; - model = "PC"; - systemName = "Other"; - } - - return { - deviceBrand: brand, - deviceModel: model, - systemName: systemName, - systemVersion: systemVersion, - }; - } - function getDeviceInfo() { - if (__deviceInfo) return __deviceInfo; - __deviceInfo = parseDeviceInfoFromUA(); - return __deviceInfo; - } - function applyDeviceContextToSdk(info) { - if (!info || !global.WebSDK || !global.WebSDK.setContext) return; - global.WebSDK.setContext({ - deviceBrand: info.deviceBrand || "", - deviceModel: info.deviceModel || "", - systemName: info.systemName || "", - systemVersion: info.systemVersion || "", - }); - } - function enrichDeviceInfoAsync() { - if (typeof navigator === "undefined" || !navigator.userAgentData || - !navigator.userAgentData.getHighEntropyValues) return; - navigator.userAgentData.getHighEntropyValues(["platform", "platformVersion", "model", "brands"]) - .then(function (hints) { - hints = hints || {}; - var info = getDeviceInfo(); - if (hints.platform) { - var p = String(hints.platform).toLowerCase(); - if (p.indexOf("win") >= 0) info.systemName = "Windows"; - else if (p.indexOf("mac") >= 0) info.systemName = "macOS"; - else if (p.indexOf("android") >= 0) info.systemName = "Android"; - else if (p === "ios") info.systemName = "iOS"; - else info.systemName = hints.platform; - } - if (hints.platformVersion) info.systemVersion = String(hints.platformVersion); - if (hints.model) info.deviceModel = String(hints.model); - if (hints.brands && hints.brands.length) { - for (var i = hints.brands.length - 1; i >= 0; i--) { - var b = hints.brands[i]; - if (b && b.brand && b.brand !== "Not)A;Brand" && b.brand !== "Chromium") { - info.deviceBrand = b.brand; - break; - } - } - } - __deviceInfo = info; - applyDeviceContextToSdk(info); - }) - .catch(function () {}); - } - - - var REFERRER_SPECIAL_NAMES = { - direct: "直接访问", - external: "外部站点", - unknown: "未知来源", - }; - - function normalizeReferrer(info) { - info = info || {}; - var pk = nonEmpty(info.page_key, ""); - var pn = nonEmpty(info.page_name, ""); - if (!pk) { - return { page_key: "direct", page_name: "直接访问" }; - } - if (REFERRER_SPECIAL_NAMES[pk]) { - return { - page_key: pk, - page_name: pn || REFERRER_SPECIAL_NAMES[pk], - }; - } - return { page_key: pk, page_name: pn || pk }; - } - - function getReferrerFromURLHint() { - try { - var search = (global.location && global.location.search) || ""; - if (!search) return null; - var p = new URLSearchParams(search); - var src = p.get("utm_source") || p.get("from") || p.get("source") || ""; - src = String(src).trim(); - if (src) { - return { page_key: "external", page_name: src.slice(0, 128) }; - } - } catch (e) {} - return null; - } - /** - * 获取来源页面信息. 来源优先级: - * 1) sessionStorage 里上一次 trackPageView 时存的 {page_key, page_name} - * (同一 tab 内站内跳转最准, 能保留 page_name 中文等) - * 2) document.referrer 解析: - * - 与当前页同源: 用 URL pattern 反推 page_key / page_name - * - 不同源: page_key="external", page_name=referrer 的 host - * 3) 无 referrer 且 sessionStorage 空: page_key="direct", page_name="直接访问" - * (典型场景: 用户从书签 / 地址栏 / 二维码 / app 内嵌外跳直接进站) - * - * 经此调整后 referrer_page_key / referrer_page_name 不再出现空字符串, - * 数据分析侧可按 "direct" / "external" / 具体业务 key 区分来路。 - */ - function getReferrerPageInfo() { - // 1) sessionStorage (站内跳转, 最准) - try { - var raw = sessionStorage.getItem("__tracker_last_page"); - if (raw) { - var obj = JSON.parse(raw); - if (obj && obj.page_key) { - return normalizeReferrer({ - page_key: String(obj.page_key), - page_name: String(obj.page_name || ""), - }); - } - } - } catch (e) {} - - // 2) document.referrer(含外链点击进入) - var ref = ""; - try { ref = document.referrer || ""; } catch (e) {} - if (ref) { - try { - var u = new URL(ref, location.href); - if (u.host === location.host) { - // 同源, 按 URL pattern 推断 page_key / page_name - var hit = inferPageFromPath(u.pathname); - if (hit && hit.page_key) { - return normalizeReferrer(hit); - } - return normalizeReferrer({ - page_key: "internal_other", - page_name: "站内其他页面", - }); - } - return normalizeReferrer({ - page_key: "external", - page_name: u.host || "外部站点", - }); - } catch (e) {} - } - - // 3) URL 投放参数(referrer 为空但属外站导流) - var hint = getReferrerFromURLHint(); - if (hint) return normalizeReferrer(hint); - - // 4) 无来源:书签 / 地址栏 / 二维码 / 外链 noreferrer 等 - return normalizeReferrer({ page_key: "direct", page_name: "直接访问" }); - } - - /** - * 根据 URL pathname 反推 page_key / page_name. - * 顺序需要与各页面模板里 window.__SDK_PAGE__ / trackerInit pageKey 保持一致, - * 后续模板新增页面时记得在这里同步登记。 - */ - function inferPageFromPath(p) { - p = String(p || ""); - if (p === "" || p === "/") { - return { page_key: "home", page_name: "首页" }; - } - // 与 app/api/web/tracker_page.go、各页 trackerInit pageKey 保持一致 - // 专题列表与专题详情共用 /topic 前缀,必须先匹配列表分页。 - if (/^\/(?:topic|more)(?:\/page\/\d+)?\/?$/.test(p)) { - return { page_key: "theme_index", page_name: "专题列表" }; - } - var RULES = [ - [/^\/list(\/|$)/, "list", "短剧列表"], - [/^\/series(\/|$)/, "series", "AI成人剧集"], - [/^\/(?:tag|tag-list)(\/|$)/, "tag_list", "标签详情"], - [/^\/rank(\/|$)/, "rank", "排行榜"], - [/^\/today-update(\/|$)/, "today_update", "今日更新"], - [/^\/category(\/|$)/, "category_detail", "分类详情"], - [/^\/(?:topic|more)(\/|$)/, "topic", "专题详情"], - [/^\/download-app(\/|$)/, "download_app", "下载APP"], - [/^\/application(\/|$)/, "application", "应用推荐"], - [/^\/home-road(\/|$)/, "home_road", "回家的路"], - [/^\/detail(\/|$)/, "detail", "短剧详情"], - [/^\/play(\/|$)/, "play", "播放页"], - [/^\/login(\/|$)/, "login", "登录"], - [/^\/register(\/|$)/, "register", "注册"], - [/^\/user-center(\/|$)/, "user_center", "个人中心"], - [/^\/deposit(\/|$)/, "deposit", "充值中心"], - [/^\/collect(\/|$)/, "collect", "我的收藏"], - [/^\/history(\/|$)/, "history", "观看历史"], - [/^\/setting(\/|$)/, "setting", "设置"], - [/^\/edit-profile(\/|$)/, "edit_profile", "编辑资料"], - [/^\/edit-password(\/|$)/, "edit_password", "修改密码"], - [/^\/search(\/|$)/, "search", "搜索结果页"], - [/^\/about-us(\/|$)/, "about_us", "关于我们"], - [/^\/user-agreement(\/|$)/, "user_agreement", "用户协议"], - [/^\/privacy-policy(\/|$)/, "privacy_policy", "隐私政策"], - [/^\/help-center(\/|$)/, "help_center", "帮助中心"], - [/^\/richtext(\/|$)/, "rich_text", "富文本页"], - [/^\/feedback(\/|$)/, "feedback", "问题反馈"], - [/^\/(?:nav|dh)(\/|$)/, "nav", "官方导航"] - ]; - for (var i = 0; i < RULES.length; i++) { - if (RULES[i][0].test(p)) { - return { page_key: RULES[i][1], page_name: RULES[i][2] }; - } - } - return null; - } - function savePageInfo(info) { - try { - var pk = nonEmpty(info.page_key, ""); - if (!pk) return; - sessionStorage.setItem( - "__tracker_last_page", - JSON.stringify({ page_key: pk, page_name: nonEmpty(info.page_name, "") }) - ); - } catch (e) {} - } - - function normalizeReferrer(info) { - info = info || {}; - var pk = nonEmpty(info.page_key, ""); - var pn = nonEmpty(info.page_name, ""); - if (!pk) { - return { page_key: "direct", page_name: "直接访问" }; - } - if (REFERRER_SPECIAL_NAMES[pk]) { - return { - page_key: pk, - page_name: pn || REFERRER_SPECIAL_NAMES[pk], - }; - } - return { page_key: pk, page_name: pn || pk }; - } - - // 修正无效 navigation_key(如 "0"、cat_、subcat_) - function normalizeNavigationKey(navKey, navName, href) { - var k = String(navKey || "").trim(); - var invalid = !k || k === "0" || k === "cat_" || k === "subcat_" || - /^cat_0$/.test(k) || /^subcat_0$/.test(k); - if (!invalid) return k; - if (href) { - try { - var u = new URL(href, location.href); - var pathKey = u.pathname.replace(/^\/+|\/+$/g, "").replace(/[^\w]+/g, "_"); - if (pathKey) return "nav_path_" + pathKey; - } catch (e) {} - } - var slug = String(navName || "").trim().replace(/\s+/g, "_").replace(/[^\w一-龥]+/g, "_"); - if (slug) return "nav_name_" + slug.slice(0, 48); - return "nav_other"; - } - - // ------- 公共字段补齐:device_brand / device_model / system_name / system_version ------- - // 背景:web-sdk 仅上报 device(Android/iOS/PC) 与 user_agent, - // device_brand / device_model 被 SDK 硬编码为空,且不含 system_name / system_version, - // 也无公开 API 注入顶层公共字段。这里基于 user_agent 解析并在上报前补齐这四个字段。 - function guessAndroidBrand(model, ua) { - var s = (model || "") + " " + (ua || ""); - var map = [ - [/Build\/HONOR|\bHONOR\b/i, "Honor"], - [/Build\/HUAWEI|HUAWEI|HW-|HMA-|ELS-|ANA-|\bJAD-|\bNOH-/i, "Huawei"], - // 华为/荣耀机型代号:XXX-AL00 / -AN00 / -TL00 / -AN90 等 - [/\b[A-Z]{2,4}-(AL|AN|TL|EM|DL)\d{2}\b/, "Huawei"], - [/SM-|samsung|Galaxy/i, "Samsung"], - [/Pixel/i, "Google"], - [/Redmi|POCO|XiaoMi|\bMi\b|Mi\s?\d/i, "Xiaomi"], - // 小米/红米数字机型代号:2xxxxxxx / 2xxxxAA 等(以 2 开头的全大写数字混合码) - [/\b2[0-9]{3,4}[A-Z][A-Z0-9]{1,}\b/, "Xiaomi"], - [/OPPO|\bCPH\d{3,4}|\bPB\w{2}|\bP[A-Z]{2}\d{2}\b/, "OPPO"], - [/vivo|\bV\d{4}[A-Z]?\b/i, "vivo"], - [/OnePlus|ONEPLUS|\bGM19|\bHD19|\bKB20|\bLE21/i, "OnePlus"], - [/realme|\bRMX\d{3,4}/i, "realme"], - [/Meizu/i, "Meizu"], - [/Lenovo/i, "Lenovo"], - [/\bZTE\b/i, "ZTE"], - [/Nokia/i, "Nokia"], - [/Sony|\bSO-|\bXQ-/i, "Sony"], - [/Motorola|\bmoto\b/i, "Motorola"], - [/asus/i, "ASUS"] - ]; - for (var i = 0; i < map.length; i++) { - if (map[i][0].test(s)) return map[i][1]; - } - return ""; - } - - // 爬虫/机器人识别:这类 UA 无真实设备/系统,统一标记 system_name="Bot", - // 避免设备字段为空(满足"无法解析需补充特殊情况说明")。 - function parseBotInfo(ua) { - var known = [ - [/bingbot/i, "Bing", "bingbot"], - [/googlebot/i, "Google", "Googlebot"], - [/baiduspider/i, "Baidu", "Baiduspider"], - [/yandex(bot|\.com\/bots)/i, "Yandex", "YandexBot"], - [/duckduckbot/i, "DuckDuckGo", "DuckDuckBot"], - [/bytespider/i, "ByteDance", "Bytespider"], - [/petalbot/i, "Huawei", "PetalBot"], - [/applebot/i, "Apple", "Applebot"], - [/sogou.{0,6}spider/i, "Sogou", "Sogou Spider"], - [/360spider/i, "360", "360Spider"], - [/semrushbot/i, "Semrush", "SemrushBot"], - [/ahrefsbot/i, "Ahrefs", "AhrefsBot"], - [/facebookexternalhit/i, "Facebook", "facebookexternalhit"] - ]; - var ver = (ua.match(/(?:bot|spider)[\/ ]v?([\d.]+)/i) || [])[1] || ""; - for (var i = 0; i < known.length; i++) { - if (known[i][0].test(ua)) { - return { device_brand: known[i][1], device_model: known[i][2], system_name: "Bot", system_version: ver }; - } - } - // 通用:"bot/x.y" 或 "spider/x.y"(正常浏览器不含该模式,避免误判) - var gm = ua.match(/([A-Za-z][A-Za-z]*bot)\/([\d.]+)/) || ua.match(/([A-Za-z][A-Za-z]*spider)\/?([\d.]*)/i); - if (gm) return { device_brand: "", device_model: gm[1], system_name: "Bot", system_version: gm[2] || "" }; - return null; - } - - // 低熵 Client Hints(同步可得),用于 UA 为空时兜底 - function getClientHintsInfo() { - var out = { system_name: "", mobile: null, brands: "" }; - try { - var uad = (typeof navigator !== "undefined") && navigator.userAgentData; - if (uad) { - if (uad.platform) out.system_name = String(uad.platform); // Windows/macOS/Android/iOS/Linux/Chrome OS... - if (typeof uad.mobile === "boolean") out.mobile = uad.mobile; - if (Array.isArray(uad.brands)) { - out.brands = uad.brands.map(function (b) { return b.brand + "/" + b.version; }).join(" "); - } - } - } catch (e) {} - return out; - } - - // user_agent 兜底:navigator.userAgent 为空时,用 Client Hints / navigator 信息拼一个非空值, - // 保证 PC/Web 场景 user_agent 至少有值(要求:无法取到时也不能为空)。 - function buildUAFallback() { - try { - var nav = (typeof navigator !== "undefined") ? navigator : null; - if (nav && nav.userAgent) return nav.userAgent; - var ch = getClientHintsInfo(); - var parts = []; - if (ch.system_name) parts.push(ch.system_name); - if (ch.brands) parts.push(ch.brands); - if (nav && nav.platform) parts.push(nav.platform); - if (nav && nav.appVersion) parts.push(nav.appVersion); - if (nav && nav.language) parts.push(nav.language); - var s = parts.filter(Boolean).join("; ").replace(/\s+/g, " ").trim(); - return s || "unknown"; - } catch (e) { return "unknown"; } - } - - // 提取安卓/鸿蒙机型:设备代号(如 ADY-AL10) 优先;其次 "; Build/";再次 "; )"。 - // 过滤掉操作系统/SDK/语言等非机型 token,避免把 "OpenHarmony 6.1"、"HMSCore x.y" 当成机型。 - function extractAndroidModel(ua) { - // 1) 设备代号:3 段式(XXX-AL00 / ADY-AL10 等) - var code = ua.match(/;\s*([A-Z][A-Z0-9]{1,5}-[A-Z0-9]{2,})/); - if (code) return code[1].trim(); - // 2) "; Build/" 或 "; )" - var mm = ua.match(/;\s*([^;()]+?)\s+Build\//) || - ua.match(/;\s*([^;()]+?)\)\s*(?:AppleWebKit|Gecko|$)/); - var model = mm ? mm[1].trim() : ""; - model = model.replace(/\bwv\b/i, "").replace(/^U\s+/i, "") - .replace(/\bzh[-_][A-Za-z-]+\b/gi, "").replace(/\s+/g, " ").trim(); - // 丢弃系统/SDK/无效 token - if (/^(rv:|Mobile$|Tablet$)/i.test(model) || - /OpenHarmony|HarmonyOS|HMSCore|^Android\b|^Linux\b/i.test(model) || - !/[A-Za-z0-9]/.test(model)) model = ""; - return model; - } - - function parseUAClientInfo(ua) { - ua = ua || ((typeof navigator !== "undefined" && navigator.userAgent) || ""); - var out = { device_brand: "", device_model: "", system_name: "", system_version: "" }; - try { - // 0) 爬虫/机器人优先识别 - var bot = parseBotInfo(ua); - if (bot) return bot; - var m; - if (/iPhone|iPad|iPod/.test(ua)) { - out.device_brand = "Apple"; - out.device_model = /iPad/.test(ua) ? "iPad" : (/iPod/.test(ua) ? "iPod" : "iPhone"); - out.system_name = "iOS"; - m = ua.match(/OS (\d+[_.]\d+(?:[_.]\d+)?)/); - if (m) out.system_version = m[1].replace(/_/g, "."); - } else if (/OpenHarmony|HarmonyOS|ArkWeb/i.test(ua)) { - // 鸿蒙(含 "Android x; HarmonyOS" 兼容标识) - out.system_name = "HarmonyOS"; - m = ua.match(/(?:OpenHarmony|HarmonyOS)\s+([\d.]+)/i) || ua.match(/Android\s+([\d.]+)/); - if (m) out.system_version = m[1]; - out.device_model = extractAndroidModel(ua) || (/Tablet/i.test(ua) ? "Tablet" : "Phone"); - out.device_brand = guessAndroidBrand(out.device_model, ua); - } else if (/Android/.test(ua)) { - out.system_name = "Android"; - m = ua.match(/Android\s+([\d.]+)/); - if (m) out.system_version = m[1]; - var model = extractAndroidModel(ua); - // 部分浏览器(Firefox 等)不带机型,回退为 Mobile/Tablet,避免空值 - if (!model) model = /Tablet/i.test(ua) ? "Tablet" : "Mobile"; - out.device_model = model; - out.device_brand = guessAndroidBrand(model, ua); - } else if (/Windows NT/.test(ua)) { - out.system_name = "Windows"; - m = ua.match(/Windows NT ([\d.]+)/); - var winMap = { "10.0": "10", "6.3": "8.1", "6.2": "8", "6.1": "7" }; - if (m) out.system_version = winMap[m[1]] || m[1]; - out.device_model = "PC"; - } else if (/Windows/i.test(ua)) { - // 非标准 Windows UA(如 "X11; Windows" 的 HeyTap/Oppo 浏览器) - out.system_name = "Windows"; - out.device_model = "PC"; - } else if (/CrOS/.test(ua)) { - // ChromeOS - out.system_name = "Chrome OS"; - out.device_model = "PC"; - m = ua.match(/CrOS\s+\S+\s+([\d.]+)/); - if (m) out.system_version = m[1]; - } else if (/Macintosh|Mac OS X/.test(ua)) { - // iPadOS 13+ 的 Safari 桌面模式会伪装成 Macintosh,需用触点数纠正为 iPad - var isTouchIPad = false; - try { - isTouchIPad = (typeof navigator !== "undefined") && - navigator.maxTouchPoints && navigator.maxTouchPoints > 1 && - /Macintosh/.test(ua); - } catch (e) {} - if (isTouchIPad) { - out.system_name = "iOS"; - out.device_brand = "Apple"; - out.device_model = "iPad"; - m = ua.match(/Version\/(\d+[_.]\d+(?:[_.]\d+)?)/); - if (m) out.system_version = m[1].replace(/_/g, "."); - } else { - out.system_name = "macOS"; - out.device_brand = "Apple"; - out.device_model = "Mac"; - m = ua.match(/Mac OS X (\d+[_.]\d+(?:[_.]\d+)?)/); - if (m) out.system_version = m[1].replace(/_/g, "."); - } - } else if (/Linux/.test(ua)) { - out.system_name = "Linux"; - out.device_model = "PC"; - } - // UA 为空或未解析出时,用 Client Hints(navigator.userAgentData) 兜底系统名/机型 - if (!out.system_name || !out.device_model) { - var ch = getClientHintsInfo(); - if (!out.system_name && ch.system_name) out.system_name = ch.system_name; - if (!out.device_model) { - if (ch.mobile === false) out.device_model = "PC"; - else if (ch.mobile === true) out.device_model = "Mobile"; - } - if (!out.device_brand && ch.system_name === "macOS") out.device_brand = "Apple"; - } - // 最终兜底:保证 system_name / system_version 不为空(需求:不能为空) - if (!out.system_name) { - // 依据设备类型给出系统名,最差为 Unknown - var dev = guessDeviceTypeFromUA(ua); - out.system_name = dev === "Android" ? "Android" - : dev === "iOS" ? "iOS" - : (dev === "PC" ? "PC" : "Unknown"); - } - if (!out.system_version) out.system_version = "0.0.0"; - if (!out.device_model) out.device_model = "Unknown"; - } catch (e) {} - return out; - } - - // 设备类型(Android/iOS/PC)推断,与 web-sdk 内部口径一致,UA 兜底 - function guessDeviceTypeFromUA(ua) { - ua = ua || ((typeof navigator !== "undefined" && navigator.userAgent) || ""); - if (/Android/i.test(ua)) return "Android"; - if (/iPhone|iPad|iPod/i.test(ua)) return "iOS"; - try { - // iPadOS 桌面模式 - if (/Macintosh/.test(ua) && typeof navigator !== "undefined" && - navigator.maxTouchPoints > 1) return "iOS"; - } catch (e) {} - return "PC"; - } - - // 设备指纹兜底:当 SDK 未能生成 device_fingerprint 时,基于稳定特征生成一个非空指纹。 - function buildFingerprintFallback() { - try { - var nav = (typeof navigator !== "undefined") ? navigator : {}; - var scr = (typeof screen !== "undefined") ? screen : {}; - var parts = [ - nav.userAgent || "", nav.platform || "", nav.language || "", - (scr.width || "") + "x" + (scr.height || ""), - scr.colorDepth || "", - (new Date()).getTimezoneOffset(), - nav.hardwareConcurrency || "", nav.deviceMemory || "" - ].join("||"); - // 简易 FNV-1a 32 位哈希 - var h = 2166136261 >>> 0; - for (var i = 0; i < parts.length; i++) { - h ^= parts.charCodeAt(i); - h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0; - } - var hex = h.toString(16); - while (hex.length < 8) hex = "0" + hex; - return "fp_fb_" + hex; - } catch (e) { - return "fp_fb_unknown"; - } - } - - // 安装上报请求拦截,在 SDK 发送批量上报前为每条记录补齐公共字段: - // device_brand / device_model / system_name / system_version(基于 UA / Client Hints) - // user_agent(为空时用兜底值,保证非空) - // 仅对上报端点(eventTracking/batchReport)生效;全程 try/catch,任何异常都回退原始请求,不影响上报。 - function installCommonFieldPatch() { - if (global.__trackerCFPatch) return; - global.__trackerCFPatch = true; - var info = parseUAClientInfo(); - var uaFallback = buildUAFallback(); // 始终非空(最差为 "unknown") - var deviceFallback = guessDeviceTypeFromUA(); // Android / iOS / PC - var fpFallback = buildFingerprintFallback(); // device_fingerprint 兜底(非空) - var SDK_VERSION_FALLBACK = "1.1.8"; // 与所引入的 web-sdk 版本一致 - var FP_VERSION_FALLBACK = "1.0.0"; - var APP_VERSION_FALLBACK = "1.0.0"; - // 始终安装:即便设备字段解析为空,也要保证公共字段非空 - - function isReportUrl(u) { - try { return /eventTracking\/batchReport/i.test(String(u || "")); } catch (e) { return false; } - } - function augmentBody(body) { - try { - if (typeof body !== "string" || !body) return null; - var arr = JSON.parse(body); - if (!Array.isArray(arr) || !arr.length) return null; - var changed = false; - for (var i = 0; i < arr.length; i++) { - var r = arr[i]; - if (!r || typeof r !== "object") continue; - if (!r.device_brand && info.device_brand) { r.device_brand = info.device_brand; changed = true; } - if (!r.device_model && info.device_model) { r.device_model = info.device_model; changed = true; } - if (!r.system_name && info.system_name) { r.system_name = info.system_name; changed = true; } - if (!r.system_version && info.system_version) { r.system_version = info.system_version; changed = true; } - // 以下字段强制保证非空(需求:不能为空) - if (!r.device) { r.device = deviceFallback; changed = true; } - if (!r.system_name) { r.system_name = "Unknown"; changed = true; } - if (!r.system_version) { r.system_version = "0.0.0"; changed = true; } - if (!r.device_fingerprint) { r.device_fingerprint = fpFallback; changed = true; } - if (!r.fp_version) { r.fp_version = FP_VERSION_FALLBACK; changed = true; } - if (!r.sdk_version) { r.sdk_version = SDK_VERSION_FALLBACK; changed = true; } - if (!r.app_version) { r.app_version = APP_VERSION_FALLBACK; changed = true; } - // user_agent 为空(含 undefined/null/空串)时补齐,保证非空 - if (!r.user_agent && uaFallback) { r.user_agent = uaFallback; changed = true; } - } - return changed ? JSON.stringify(arr) : null; - } catch (e) { return null; } - } - - // fetch(SDK 默认走 fetch) - if (typeof global.fetch === "function") { - var origFetch = global.fetch; - global.fetch = function (input, init) { - try { - var url = (typeof input === "string") ? input : (input && input.url); - if (isReportUrl(url) && init && typeof init.body === "string") { - var nb = augmentBody(init.body); - if (nb != null) init.body = nb; - } - } catch (e) {} - return origFetch.apply(this, arguments); - }; - } - // XHR 兜底 - if (typeof XMLHttpRequest !== "undefined") { - var op = XMLHttpRequest.prototype.open; - var os = XMLHttpRequest.prototype.send; - XMLHttpRequest.prototype.open = function (method, url) { - try { this.__trackerReportUrl = isReportUrl(url); } catch (e) {} - return op.apply(this, arguments); - }; - XMLHttpRequest.prototype.send = function (body) { - try { - if (this.__trackerReportUrl && typeof body === "string") { - var nb = augmentBody(body); - if (nb != null) return os.call(this, nb); - } - } catch (e) {} - return os.apply(this, arguments); - }; - } - // sendBeacon(默认关闭,仅兜底字符串入参) - try { - if (typeof navigator !== "undefined" && typeof navigator.sendBeacon === "function") { - var ob = navigator.sendBeacon.bind(navigator); - navigator.sendBeacon = function (url, data) { - try { - if (isReportUrl(url) && typeof data === "string") { - var nb = augmentBody(data); - if (nb != null) data = nb; - } - } catch (e) {} - return ob(url, data); - }; - } - } catch (e) {} - } - - // ------- 初始化 ------- - function trackerInit(opts) { - opts = opts || {}; - // 0) 安装公共字段补齐(须在 SDK 发出任何上报前完成) - installCommonFieldPatch(); - // 设置当前页面信息(即便 SDK 尚未加载也先保存,后续点击事件能用到) - var inferredPage = inferPageFromPath((global.location && global.location.pathname) || "") || { - page_key: "internal_other", - page_name: "站内其他页面", - }; - var configuredPageKey = nonEmpty(opts.pageKey, ""); - var configuredPageName = nonEmpty(opts.pageName, ""); - __pageInfo.page_key = (!configuredPageKey || configuredPageKey === "unknown") - ? inferredPage.page_key - : configuredPageKey; - __pageInfo.page_name = (!configuredPageName || configuredPageName === "未知页面") - ? inferredPage.page_name - : configuredPageName; - __referrerPageInfo = getReferrerPageInfo(); - - // 1) 先注册全局点击监听(document 一定存在,不依赖 DOM 完成) - bindClickListeners(); - - safeCall(function () { - if (!__inited) { - global.WebSDK.init({ - appId: opts.appId, - uid: opts.uid || "", - channel: opts.channel || "", - encryptedConfig: opts.encryptedConfig || "", - appVersion: opts.appVersion || "1.0.1", - // 项目会手动上报带业务页面字段的 PV/点击,关闭 SDK 自动事件避免重复上报。 - disableAutoEvents: ["app_page_view", "page_click"], - }); - // 补齐 sid:会话开始即强制生成并持久化 sid(必填公共字段), - // 避免首个事件因 sid 尚未生成而上报空 sid。 - try { global.WebSDK.notifyPageLoad && global.WebSDK.notifyPageLoad(); } catch (e) {} - // 预热并缓存 sid 状态,确认存在后后续事件无需再异步校验 - try { - if (global.WebSDK.getCommonField) { - global.WebSDK.getCommonField("sid").then(function (sid) { - if (sid) __sidKnownPresent = true; - }).catch(function () {}); - } - } catch (e) {} - __inited = true; - } - // 2) 页面展示:等 DOM 解析完再上报,避免 SDK 还在做域名 ping 时事件丢失 - whenDomReady(function () { - trackPageView(); - // 保存当前页面信息以便下一次跳转作为 referrer - savePageInfo(__pageInfo); - if (!global.__trackerReady) { - global.__trackerReady = true; - try { - global.dispatchEvent(new CustomEvent("tracker:ready", { detail: currentPageInfo() })); - } catch (e) { - try { - var readyEvent = document.createEvent("Event"); - readyEvent.initEvent("tracker:ready", false, false); - global.dispatchEvent(readyEvent); - } catch (ignored) {} - } - } - }); - // 3) 广告展示观察必须等到 DOM 解析完 - whenDomReady(function () { - bindAdImpressionObserver(); - bindAdMutationObserver(); - if (document.readyState === "complete") { - rescanAds(); - } else { - global.addEventListener("load", rescanAds); - } - }); - }); - } - - // 等 DOMContentLoaded - function whenDomReady(cb) { - if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", function () { cb(); }, { once: true }); - } else { - cb(); - } - } - - // ------- 公共上报方法 ------- - - // 1. 导航路径行为 - function trackNavigation(navKey, navName, href) { - var k = normalizeNavigationKey(navKey, navName, href); - var n = nonEmpty(navName, k); - if (!k || k === "0") return; - sendTrack(function () { - global.WebSDK.track.navigation({ - navigation_key: k, - navigation_name: n, - }); - }); - } - - // 2. 应用页面展示 - function trackPageView(extra) { - extra = extra || {}; - var loadTime = 0; - try { - var nav = (global.performance && typeof global.performance.getEntriesByType === "function") - ? (global.performance.getEntriesByType("navigation")[0] || null) - : null; - if (nav && nav.loadEventEnd > 0 && nav.startTime != null) { - loadTime = Math.max(0, Math.round(nav.loadEventEnd - nav.startTime)); - } else { - var now = (global.performance && global.performance.now) - ? global.performance.now() - : Date.now(); - loadTime = Math.max(0, Math.round(now - __pageStart)); - } - } catch (e) {} - var pi = currentPageInfo(); - var pageKey = pi.page_key; - var pageName = pi.page_name; - var ref = normalizeReferrer(getReferrerPageInfo()); - sendTrack(function () { - global.WebSDK.track.appPageView({ - user_type: nonEmpty(extra.user_type, "guest"), - page_key: pageKey, - page_name: pageName, - referrer_page_key: ref.page_key, - referrer_page_name: ref.page_name, - current_page_key: pageKey, - current_page_name: pageName, - page_load_time: parseInt(extra.page_load_time != null ? extra.page_load_time : loadTime, 10) || 0, - recommend_trace_id: extra.recommend_trace_id || "", - }); - }); - } - - // 3. 应用点击事件 - // 注意(需求): click_x_percent / click_y_percent = 点击位置横/纵坐标百分比(0-100)。 - // SDK 1.1.8 起 click_page_x/click_page_y 使用视口坐标(与 clientX/clientY 一致), - // 百分比也按视口尺寸计算;screen.width/height 仅作为独立的屏幕分辨率字段上报。 - function trackPageClick(e) { - if (!isReady()) return; - try { - var sw = (global.screen && global.screen.width) || 0; // 屏幕分辨率(单独字段上报) - var sh = (global.screen && global.screen.height) || 0; - var docEl = document.documentElement || {}; - var viewportW = global.innerWidth || docEl.clientWidth || 0; - var viewportH = global.innerHeight || docEl.clientHeight || 0; - // 点击的视口坐标(不含页面滚动距离) - var x = e.clientX != null ? e.clientX : 0; - var y = e.clientY != null ? e.clientY : 0; - // 横/纵坐标百分比(0-100) - var xPct = viewportW > 0 ? clamp((x / viewportW) * 100, 0, 100) : 0; - var yPct = viewportH > 0 ? clamp((y / viewportH) * 100, 0, 100) : 0; - var pi = currentPageInfo(); - sendTrack(function () { - global.WebSDK.track.pageClick({ - page_key: pi.page_key, - page_name: pi.page_name, - click_page_x: parseInt(x, 10) || 0, - click_page_y: parseInt(y, 10) || 0, - click_x_percent: xPct, - click_y_percent: yPct, - screen_width: parseInt(sw, 10) || 0, - screen_height: parseInt(sh, 10) || 0, - recommend_trace_id: "", - }); - }); - } catch (err) { - logError(err); - } - } - - // 4. 视频事件(播放、暂停) - function trackVideoEvent(params) { - params = params || {}; - var video_id = nonEmpty(params.video_id, ""); - if (!video_id) return; - sendTrack(function () { - global.WebSDK.track.videoEvent({ - media_id: String(params.media_id || video_id), - video_id: video_id, - video_title: nonEmpty(params.video_title, "未命名视频"), - video_type_id: nonEmpty(params.video_type_id, "0"), - video_type_name: nonEmpty(params.video_type_name, "未分类"), - video_content_type: String(params.video_content_type || "video"), - recommend_trace_id: String(params.recommend_trace_id || ""), - video_tag_key: tagKeyOrDefault(params.video_tag_key), - video_tag_name: tagNameOrDefault(params.video_tag_name), - video_duration: parseInt(params.video_duration || 0, 10) || 0, - play_duration: parseInt(params.play_duration || 0, 10) || 0, - play_progress: clamp(params.play_progress || 0, 0, 100), - video_behavior_key: nonEmpty(params.video_behavior_key, "video_view"), - video_behavior_name: nonEmpty(params.video_behavior_name, "视频行为"), - }); - }); - } - - // 阅读进度百分比限制在 0-100 - function clampProgress(n) { - var v = parseInt(n || 0, 10); - if (!isFinite(v) || v < 0) return 0; - if (v > 100) return 100; - return v; - } - - // 4.1 小说事件 novel_event(按埋点文档对齐) - // 上报来源:客户端;必填 novel_id/novel_title/novel_type_id/novel_type_name/ - // novel_behavior_key/novel_behavior_name;必填可空 novel_tag_key/novel_tag_name; - // 整数 read_progress(0-100)/page_no(从 1 开始;列表页 0)。 - // chapter_id / chapter_name 没有章节传 "";recommend_trace_id 未对接推荐引擎传 ""。 - // novel_behavior_key 取值:view(展示) / page_next(下一页) / page_prev(上一页) / complete(读完)。 - function trackNovelEvent(params) { - params = params || {}; - var novel_id = nonEmpty(params.novel_id, ""); - if (!novel_id) return; - sendTrack(function () { - global.WebSDK.track.novelEvent({ - media_id: String(params.media_id || novel_id), - novel_id: novel_id, - novel_title: nonEmpty(params.novel_title, "未命名小说"), - chapter_id: String(params.chapter_id || ""), - chapter_name: String(params.chapter_name || ""), - novel_type_id: nonEmpty(params.novel_type_id, "default"), - novel_type_name: nonEmpty(params.novel_type_name, "默认分类"), - recommend_trace_id: String(params.recommend_trace_id || ""), - novel_tag_key: tagKeyOrDefault(params.novel_tag_key), - novel_tag_name: tagNameOrDefault(params.novel_tag_name), - read_progress: clampProgress(params.read_progress), - page_no: parseInt(params.page_no || 0, 10) || 0, - novel_behavior_key: nonEmpty(params.novel_behavior_key, "view"), - novel_behavior_name: nonEmpty(params.novel_behavior_name, "展示"), - }); - }); - } - - // 4.2 漫画事件 comic_event(按埋点文档对齐,字段口径同 novel_event) - // comic_behavior_key 取值:view(展示) / page_next(下一页) / page_prev(上一页) / complete(读完)。 - function trackComicEvent(params) { - params = params || {}; - var comic_id = nonEmpty(params.comic_id, ""); - if (!comic_id) return; - sendTrack(function () { - global.WebSDK.track.comicEvent({ - media_id: String(params.media_id || comic_id), - comic_id: comic_id, - comic_title: nonEmpty(params.comic_title, "未命名漫画"), - chapter_id: String(params.chapter_id || ""), - chapter_name: String(params.chapter_name || ""), - comic_type_id: nonEmpty(params.comic_type_id, "default"), - comic_type_name: nonEmpty(params.comic_type_name, "默认分类"), - recommend_trace_id: String(params.recommend_trace_id || ""), - comic_tag_key: tagKeyOrDefault(params.comic_tag_key), - comic_tag_name: tagNameOrDefault(params.comic_tag_name), - read_progress: clampProgress(params.read_progress), - page_no: parseInt(params.page_no || 0, 10) || 0, - comic_behavior_key: nonEmpty(params.comic_behavior_key, "view"), - comic_behavior_name: nonEmpty(params.comic_behavior_name, "展示"), - }); - }); - } - - // 5. 关键词搜索事件 - function trackKeywordSearch(params) { - params = params || {}; - var keyword = nonEmpty(params.keyword, ""); - if (!keyword) return; - sendTrack(function () { - global.WebSDK.track.keywordSearch({ - keyword: keyword, - search_result_count: parseInt(params.search_result_count || 0, 10) || 0, - search_content_type: String(params.search_content_type || ""), - search_trace_id: String(params.search_trace_id || ""), - search_id: String(params.search_id || ""), - }); - }); - } - - // 6. 关键词搜索结果点击事件 - function trackKeywordClick(params) { - params = params || {}; - var keyword = nonEmpty(params.keyword, ""); - var itemId = nonEmpty(params.click_item_id, ""); - if (!keyword || !itemId) return; - sendTrack(function () { - global.WebSDK.track.keywordClick({ - keyword: keyword, - click_item_id: itemId, - click_item_type_key: nonEmpty(params.click_item_type_key, "video"), - click_item_type_name: nonEmpty(params.click_item_type_name, "视频"), - click_position: parseInt(params.click_position || 0, 10) || 0, - search_trace_id: String(params.search_trace_id || ""), - }); - }); - } - - // 9. 广告页面点击事件 (event_type: click/close/show) - function trackAdvertising(params) { - params = params || {}; - var id = nonEmpty(params.advertising_id, ""); - if (!id) return; - sendTrack(function () { - global.WebSDK.track.advertising({ - event_type: nonEmpty(params.event_type, "click"), - advertising_key: nonEmpty(params.advertising_key, id), - advertising_name: nonEmpty(params.advertising_name, "广告_" + id), - advertising_id: id, - }); - }); - } - - // 7. 广告展示日志 - function trackAdImpression(params) { - params = params || {}; - var ad_id = nonEmpty(params.ad_id, ""); - var pi = currentPageInfo(); - var ad_slot_key = nonEmpty(params.ad_slot_key, pi.page_key + "_ad"); - var ad_slot_name = nonEmpty(params.ad_slot_name, pi.page_name + "广告位"); - if (!ad_id) return; - var dedupKey = [ad_slot_key, ad_id, params.creative_id || ""].join("|"); - if (__adShownSet[dedupKey]) return; - __adShownSet[dedupKey] = true; - var payload = { - page_key: nonEmpty(params.page_key, pi.page_key), - page_name: nonEmpty(params.page_name, pi.page_name), - ad_slot_key: ad_slot_key, - ad_slot_name: ad_slot_name, - ad_id: ad_id, - creative_id: String(params.creative_id || ad_id), - ad_type: nonEmpty(params.ad_type, "banner"), - }; - // 强制保证关键字段非空(需求:page_key/page_name/ad_type/creative_id 不能为空) - if (!payload.page_key) payload.page_key = "internal_other"; - if (!payload.page_name) payload.page_name = "站内其他页面"; - if (!payload.ad_type) payload.ad_type = "banner"; - if (!payload.creative_id) payload.creative_id = ad_id; - sendTrack(function () { - global.WebSDK.track.adImpression(payload); - }); - } - - // 点击前补发展示,保证 ad_impression.client_ts <= ad_click.client_ts - function ensureAdImpressionBeforeClick(ad) { - if (!ad || !ad.ad_id) return; - var ad_slot_key = nonEmpty(ad.ad_slot_key, currentPageInfo().page_key + "_ad"); - var dedupKey = [ad_slot_key, ad.ad_id, ad.creative_id || ""].join("|"); - if (!__adShownSet[dedupKey]) { - trackAdImpression(ad); - } - } - - // 8. 广告点击日志 - // 注意(需求): page_key、page_name、ad_type、creative_id 不能为空,缺省取当前页面值 / banner / ad_id - function trackAdClick(params) { - params = params || {}; - var ad_id = nonEmpty(params.ad_id, ""); - if (!ad_id) return; - ensureAdImpressionBeforeClick(params); - var pi = currentPageInfo(); - var payload = { - page_key: nonEmpty(params.page_key, pi.page_key), - page_name: nonEmpty(params.page_name, pi.page_name), - ad_slot_key: nonEmpty(params.ad_slot_key, pi.page_key + "_ad"), - ad_slot_name: nonEmpty(params.ad_slot_name, pi.page_name + "广告位"), - ad_id: ad_id, - creative_id: String(params.creative_id || ad_id), - ad_type: nonEmpty(params.ad_type, "banner"), - }; - // 强制保证关键字段非空(需求 1:page_key/page_name/ad_type/creative_id 不能为空) - if (!payload.page_key) payload.page_key = "internal_other"; - if (!payload.page_name) payload.page_name = "站内其他页面"; - if (!payload.ad_type) payload.ad_type = "banner"; - if (!payload.creative_id) payload.creative_id = ad_id; - sendTrack(function () { - global.WebSDK.track.adClick(payload); - }); - } - - // ------- 自动收集逻辑 ------- - - // 通过 data-* 属性的 DOM 收集广告展示(IntersectionObserver) - function bindAdImpressionObserver() { - if (!global.IntersectionObserver) return; - if (global.__trackerAdObserver) return; - global.__trackerAdObserver = new IntersectionObserver(function (entries) { - entries.forEach(function (entry) { - if (entry.isIntersecting) { - var el = entry.target; - var ad = parseAdDataset(el); - if (ad && ad.ad_id) { - trackAdImpression(ad); - global.__trackerAdObserver.unobserve(el); - } - } - }); - }, { threshold: 0.1 }); - rescanAds(); - fireVisibleAdsSync(); - } - - // 同步上报首屏可见广告 - function fireVisibleAdsSync() { - var vw = global.innerWidth || (document.documentElement && document.documentElement.clientWidth) || 0; - var vh = global.innerHeight || (document.documentElement && document.documentElement.clientHeight) || 0; - var nodes = document.querySelectorAll("[data-ad-id]"); - for (var i = 0; i < nodes.length; i++) { - var el = nodes[i]; - if (el.__trackerSyncFired) continue; - if (!isElementInViewport(el, vw, vh)) continue; - var ad = parseAdDataset(el); - if (!ad || !ad.ad_id) continue; - trackAdImpression(ad); - el.__trackerSyncFired = true; - try { global.__trackerAdObserver && global.__trackerAdObserver.unobserve(el); } catch (e) {} - } - } - - function isElementInViewport(el, vw, vh) { - try { - var r = el.getBoundingClientRect(); - if (r.width <= 0 || r.height <= 0) return false; - var horizOk = r.right > 0 && r.left < vw; - var vertOk = r.bottom > 0 && r.top < vh; - return horizOk && vertOk; - } catch (e) { return false; } - } - - // 重新扫描所有 [data-ad-id] 元素并注册到 observer - function rescanAds() { - if (!global.__trackerAdObserver) return; - var nodes = document.querySelectorAll("[data-ad-id]"); - for (var i = 0; i < nodes.length; i++) { - var el = nodes[i]; - if (el.__trackerObserved) continue; - el.__trackerObserved = true; - try { global.__trackerAdObserver.observe(el); } catch (e) {} - } - } - - // 监听 DOM 动态插入广告元素(懒加载、弹窗显示、swiper clone 等) - function bindAdMutationObserver() { - if (typeof MutationObserver === "undefined") return; - if (global.__trackerMutationObserver) return; - global.__trackerMutationObserver = new MutationObserver(function (mutations) { - var needRescan = false; - for (var i = 0; i < mutations.length; i++) { - var m = mutations[i]; - if (m.addedNodes && m.addedNodes.length) { needRescan = true; break; } - if (m.type === "attributes" && m.attributeName === "data-ad-id") { needRescan = true; break; } - } - if (needRescan) rescanAds(); - }); - try { - global.__trackerMutationObserver.observe(document.body || document.documentElement, { - childList: true, - subtree: true, - attributes: true, - attributeFilter: ["data-ad-id"], - }); - } catch (e) {} - } - - // 当前页面信息:优先 trackerInit 设置的值;为空则按 URL 推断;最后归为站内其他页面。 - // 保证 page_key / page_name 取到真实当前页面值,不会为空。 - function currentPageInfo() { - var pk = nonEmpty(__pageInfo.page_key, ""); - var pn = nonEmpty(__pageInfo.page_name, ""); - if (pk) return { page_key: pk, page_name: nonEmpty(pn, pk) }; - var hit = inferPageFromPath((global.location && global.location.pathname) || ""); - if (hit && hit.page_key) { - return { page_key: hit.page_key, page_name: nonEmpty(hit.page_name, hit.page_key) }; - } - return { page_key: "internal_other", page_name: "站内其他页面" }; - } - - function parseAdDataset(el) { - if (!el || !el.dataset) return null; - var pi = currentPageInfo(); - // 槽位兜底:优先 data-ad-slot-key;缺失时用 data-ad-location 推导(旧版脚本只写了 location), - // 保证不再出现 unknown_slot。 - var slotKey = el.dataset.adSlotKey || ""; - var slotName = el.dataset.adSlotName || ""; - if (!slotKey && el.dataset.adLocation != null && el.dataset.adLocation !== "") { - slotKey = "location_" + String(el.dataset.adLocation).replace(/[^\w]+/g, "_"); - slotName = slotName || ("广告位置" + el.dataset.adLocation); - } - if (!slotKey) { - slotKey = pi.page_key + "_ad"; - slotName = slotName || (pi.page_name + "广告位"); - } - return { - ad_id: el.dataset.adId || "", - creative_id: el.dataset.creativeId || el.dataset.adId || "", - ad_slot_key: slotKey, - ad_slot_name: slotName, - ad_type: el.dataset.adType || "banner", - page_key: pi.page_key, - page_name: pi.page_name, - }; - } - - // href 是否为可跳转链接(排除空、#、javascript: 等不跳转的情况) - function hrefIsNavigable(href) { - if (!href) return false; - href = String(href).trim(); - if (!href || href === "#") return false; - if (/^javascript:/i.test(href)) return false; - return true; - } - - // 判断本次广告点击是否会真正“跳转”。 - // 需求:ad_click 只有广告跳转才上报;滑动/拖拽、关闭等不上报。 - // 命中条件(任一): - // 1) 广告元素自身或祖先是带有效 href 的 (同窗或新开都算跳转) - // 2) clickDD 跳转模式:元素链上带有效的 data-link - function isNavigatingAdClick(el) { - try { - var a = el.closest ? el.closest("a[href]") : null; - if (a && hrefIsNavigable(a.getAttribute("href"))) return true; - } catch (e) {} - var node = el; - while (node && node !== document) { - if (node.dataset && hrefIsNavigable(node.dataset.link)) return true; - node = node.parentNode; - } - return false; - } - - // 关闭广告弹窗(event_type=close)。从 [data-ad-close] 元素读取广告信息。 - function parseAdvDataset(el, eventType) { - if (!el || !el.dataset) return null; - var id = el.dataset.adId || el.dataset.advertisingId || ""; - if (!id) return null; - return { - event_type: eventType, - advertising_id: id, - advertising_key: el.dataset.advertisingKey || el.dataset.adSlotKey || id, - advertising_name: el.dataset.advertisingName || el.dataset.adSlotName || ("广告_" + id), - }; - } - - // 搜索结果点击:从 [data-search-item] 读取信息 - function trackSearchResultClick(linkEl) { - if (!linkEl || !linkEl.getAttribute) return; - var itemId = linkEl.getAttribute("data-search-item") || linkEl.getAttribute("data-id") || ""; - if (!itemId) return; - var keyword = linkEl.getAttribute("data-search-keyword") || currentSearchKeyword() || ""; - if (!keyword) return; - trackKeywordClick({ - keyword: keyword, - click_item_id: itemId, - click_item_type_key: linkEl.getAttribute("data-search-item-type-key") || "video", - click_item_type_name: linkEl.getAttribute("data-search-item-type-name") || "视频", - click_position: parseInt(linkEl.getAttribute("data-search-position") || 0, 10) || 0, - search_trace_id: linkEl.getAttribute("data-search-trace-id") || "", - }); - } - - // 从 URL 推断当前搜索词(/search/关键词/ 或查询参数)。 - function currentSearchKeyword() { - try { - var q = new URLSearchParams(location.search || ""); - var queryKeyword = q.get("q") || q.get("title") || q.get("keyword") || q.get("key") || ""; - if (queryKeyword) return queryKeyword; - var match = String(location.pathname || "").match(/^\/search\/([^/]+)(?:\/|$)/); - return match ? decodeURIComponent(match[1]) : ""; - } catch (e) { return ""; } - } - - // 全局点击收集 - 必须能在 执行阶段就挂载(document 一定存在) - function bindClickListeners() { - if (global.__trackerClickBound) return; - global.__trackerClickBound = true; - - // 拖拽/滑动检测:按下后位移超过阈值即视为"滑动/拖拽",本次产生的 click 不算广告点击。 - // 同时覆盖触摸(touch)、鼠标(mouse)与指针(pointer),因为 Swiper 等轮播在桌面端是 - // 鼠标拖拽、移动端是触摸/指针拖拽;仅监听 touch 会漏掉桌面端拖拽(如浮动广告滑动)。 - var DRAG_THRESHOLD = 6; - var __dragStart = null; - function __onDragStart(x, y) { - __dragStart = { x: x, y: y }; - global.__suppressAdClick = false; // 新手势开始,清除上一次标记 - } - function __onDragMove(x, y) { - if (!__dragStart) return; // 仅在按下拖动时判断(pointermove/mousemove 悬停也会触发) - if (Math.abs(x - __dragStart.x) > DRAG_THRESHOLD || - Math.abs(y - __dragStart.y) > DRAG_THRESHOLD) { - global.__suppressAdClick = true; - } - } - function __onDragEnd() { __dragStart = null; } - - // 触摸(移动端) - document.addEventListener("touchstart", function (e) { - if (e.touches && e.touches[0]) __onDragStart(e.touches[0].clientX, e.touches[0].clientY); - }, { passive: true, capture: true }); - document.addEventListener("touchmove", function (e) { - if (e.touches && e.touches[0]) __onDragMove(e.touches[0].clientX, e.touches[0].clientY); - }, { passive: true, capture: true }); - document.addEventListener("touchend", __onDragEnd, { passive: true, capture: true }); - document.addEventListener("touchcancel", __onDragEnd, { passive: true, capture: true }); - - // 指针(鼠标/触控笔/触摸,覆盖桌面端 Swiper 拖拽);不支持则用鼠标事件兜底 - if (typeof global.PointerEvent !== "undefined") { - document.addEventListener("pointerdown", function (e) { __onDragStart(e.clientX, e.clientY); }, { passive: true, capture: true }); - document.addEventListener("pointermove", function (e) { __onDragMove(e.clientX, e.clientY); }, { passive: true, capture: true }); - document.addEventListener("pointerup", __onDragEnd, { passive: true, capture: true }); - document.addEventListener("pointercancel", __onDragEnd, { passive: true, capture: true }); - } else { - document.addEventListener("mousedown", function (e) { __onDragStart(e.clientX, e.clientY); }, { passive: true, capture: true }); - document.addEventListener("mousemove", function (e) { __onDragMove(e.clientX, e.clientY); }, { passive: true, capture: true }); - document.addEventListener("mouseup", __onDragEnd, { passive: true, capture: true }); - } - - document.addEventListener("click", function (e) { - trackPageClick(e); - - // 搜索结果点击 - var searchLink = e.target && e.target.closest - ? e.target.closest("[data-search-item]") - : null; - if (searchLink) { - trackSearchResultClick(searchLink); - } - - // 广告关闭弹窗 → advertising(event_type=close) - var closeEl = e.target && e.target.closest - ? e.target.closest("[data-ad-close]") - : null; - if (closeEl) { - var advClose = parseAdvDataset(closeEl, "close"); - if (advClose) trackAdvertising(advClose); - } - - // 关闭/禁止上报区域不算广告点击 - var isCloseClick = false; - try { - isCloseClick = !!(e.target && e.target.closest && e.target.closest( - '[data-ad-close], [data-no-ad-click], .closeBtn, .nineClose' - )); - } catch (_) { isCloseClick = false; } - var suppressAd = !!global.__suppressAdClick || isCloseClick; - if (global.__suppressAdClick) { - global.__suppressAdClick = false; - } - - // 自动捕获广告点击 (data-ad-id) 和导航点击 (data-nav-key) - var target = e.target; - var adReported = false; - while (target && target !== document) { - if (target.dataset) { - // ad_click 仅在“广告跳转”时上报;滑动/拖拽(suppressAd)、关闭、无跳转的点击均不上报 - if (target.dataset.adId && !suppressAd && !adReported && isNavigatingAdClick(target)) { - var ad = parseAdDataset(target); - trackAdClick(ad); - adReported = true; - } - if (target.dataset.navKey) { - var href = (target.getAttribute && target.getAttribute("href")) || ""; - trackNavigation( - target.dataset.navKey, - target.dataset.navName || target.textContent || "", - href - ); - } - } - target = target.parentNode; - } - }, true); - } - - // ------- 视频自动绑定 ------- - // 适用于原生 - -{{end}} diff --git a/app/templates/base/contentExtras.html b/app/templates/base/contentExtras.html index 6934fc5..c1fa744 100644 --- a/app/templates/base/contentExtras.html +++ b/app/templates/base/contentExtras.html @@ -38,7 +38,7 @@ {{if .appConfig.DetailBannerList}}
{{range $ad := .appConfig.DetailBannerList}} - + {{$ad.Title}} {{end}} diff --git a/app/templates/base/dialogAd.html b/app/templates/base/dialogAd.html index a588279..b12d47e 100644 --- a/app/templates/base/dialogAd.html +++ b/app/templates/base/dialogAd.html @@ -13,18 +13,14 @@ data-dialog-ad-item data-dialog-ad-index="{{$index}}" data-dialog-ad-id="{{$dialog.ID}}" - data-ad-id="{{$dialog.ID}}" data-creative-id="{{$dialog.ID}}" - data-ad-slot-key="dialog_ad" - data-ad-slot-name="弹窗广告" - data-ad-type="popup" role="dialog" aria-modal="true" aria-label="{{if $dialog.Title}}{{$dialog.Title}}{{else}}广告{{end}}" hidden > {{if $dialog.Link}} - + {{$dialog.Title}} {{else}} @@ -32,7 +28,7 @@ {{$dialog.Title}}
{{end}} -
diff --git a/app/templates/base/downloadAppDialog.html b/app/templates/base/downloadAppDialog.html index 48e305b..812bddd 100644 --- a/app/templates/base/downloadAppDialog.html +++ b/app/templates/base/downloadAppDialog.html @@ -8,8 +8,8 @@
-{{end}} diff --git a/app/templates/base/registerDialog.html b/app/templates/base/registerDialog.html deleted file mode 100644 index 47d4dbf..0000000 --- a/app/templates/base/registerDialog.html +++ /dev/null @@ -1,80 +0,0 @@ -{{define "registerDialog"}} -
-
- - -
-
-{{end}} diff --git a/app/templates/base/seoCommon.html b/app/templates/base/seoCommon.html index 930c77b..2e702e4 100644 --- a/app/templates/base/seoCommon.html +++ b/app/templates/base/seoCommon.html @@ -37,23 +37,21 @@ {{if .paginationNextURL}}{{end}} - - - - + + + + {{/* 首屏壳层:合并 base+header+footer+eightPop,减少弱网 RTT(改源文件后跑 scripts/build-shell-css.sh) */}} -{{template "trackerInit" .}} +{{template "analytics" .}} -{{/* PC 保留原 defer;H5 不在此拉取,由下方脚本空闲时注入 */}} - - - - - - - - -{{end}} diff --git a/app/templates/base/vipDialog.html b/app/templates/base/vipDialog.html deleted file mode 100644 index 6f1c241..0000000 --- a/app/templates/base/vipDialog.html +++ /dev/null @@ -1,24 +0,0 @@ -{{define "vipDialog"}} - -
- -
- -{{end}} diff --git a/app/templates/page/collect.html b/app/templates/page/collect.html deleted file mode 100644 index fd7bd78..0000000 --- a/app/templates/page/collect.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - {{template "seoCommon" .}} - {{if .seoInfo.Title}}{{.seoInfo.Title}}{{else if .title}}{{.title}} - 黄果短剧{{else}}我的收藏 - 黄果短剧{{end}} - - - - - - - - - - - - - -{{template "header" .}} -
-
- -
-

我的收藏

-

继续关注喜欢的内容

-
-
- -
- - 返回 - -
我的收藏
- -
- - -
-{{template "footer" .}} - - diff --git a/app/templates/page/deposit.html b/app/templates/page/deposit.html deleted file mode 100644 index 17f989a..0000000 --- a/app/templates/page/deposit.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - {{template "seoCommon" .}} - {{if .title}}{{.title}} - 黄果短剧{{else}}金币充值 - 黄果短剧{{end}} - - - - - - - {{template "header" .}} -
-
- - -
-
WALLET
-

金币充值

-
当前余额 {{if .rechargeText}}{{.rechargeText}}{{else}}0{{end}} 金币
-
- -
-
钱包充值
-

选支付 · 立即到账

-
支持多种支付方式,支付成功后即时到账。
-
- -

购买套餐

-
-
金币充值按集解锁,自由使用
-
- {{range .coinList}} - - {{else}}
暂无金币套餐
{{end}} -
-
- - -

请选择金币套餐

- -
-

交易明细

-
- {{range .txList}} -
-
-
{{if .Title}}{{.Title}}{{else if .TranTypeName}}{{.TranTypeName}}{{else if .Remark}}{{.Remark}}{{else}}金币变动{{end}}
- {{if .CreatedAt}}
{{formatShortDateTime .CreatedAt}}
{{end}} -
-
- {{if eq .ChangeAmount 0}}{{if eq .FlowDir 1}}+{{else}}-{{end}}{{absInt64 .Amount}}{{else}}{{if eq .FlowDir 1}}+{{else}}-{{end}}{{absInt64 .ChangeAmount}}{{end}} -
-
- {{else}}
暂无交易记录
{{end}} -
-
-
- -
- - -
-
金币余额 (金币)
-
{{if .rechargeText}}{{.rechargeText}}{{else}}000.00{{end}}
-
- -
-
请选择充值金额首次充值赠送10%
-
- {{range .coinList}} - - {{else}}
暂无金币套餐
{{end}} -
-
- -
-

金币怎么用?

-
-
解锁单集内容按剧集实际定价消耗金币
-
奖励金币优先使用解锁时系统自动优先扣除任务/签到获得的奖励金币
-
金币畅看范围内不消耗金币会员权益仍优先于金币,避免重复付费
-
-
-
- -
- -

如遇充值问题请咨询 在线客服

-
- - -
- - {{template "footer" .}} - - - diff --git a/app/templates/page/detail.html b/app/templates/page/detail.html index c118c76..c208821 100644 --- a/app/templates/page/detail.html +++ b/app/templates/page/detail.html @@ -20,7 +20,7 @@ {{end}} - + @@ -37,10 +37,6 @@ 返回
- @@ -95,20 +91,6 @@
立即播放
- - - -
- {{if $.isLoggedIn}} -
- {{if $.avatar}} - 我的头像 - {{else}} - 默认用户头像 - {{end}} -
- - -
-
- {{else}} - - {{end}}
评论加载中…
@@ -226,10 +173,6 @@
- 开始播放
{{end}} @@ -240,8 +183,6 @@ {{end}} {{template "footer" .}} -{{template "vipDialog" .}} -{{template "coinDialog" .}} - + diff --git a/app/templates/page/editPassword.html b/app/templates/page/editPassword.html deleted file mode 100644 index 74f45f8..0000000 --- a/app/templates/page/editPassword.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - {{template "seoCommon" .}} - 修改登录密码 - 黄果短剧 - - - - - - - - - - {{template "header" .}} -
-
- -
-

修改登录密码

-
- 建议使用 8–20 位字母、数字和符号组合 -
-
-
- -
-
- - 返回 - -
修改登录密码
- -
- -
-
-
设置新的登录密码
-
- 建议使用 8–20 位字母、数字和符号组合 -
-
- -
- -
- - -
- -
- -
- -
- - -
- -
- -
- -
- - -
- -
- - -
-
-
- {{template "footer" .}} - - - diff --git a/app/templates/page/editProfile.html b/app/templates/page/editProfile.html deleted file mode 100644 index 62134d9..0000000 --- a/app/templates/page/editProfile.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - {{template "seoCommon" .}} - 编辑个人资料 - 黄果短剧 - - - - - - - - - - {{template "header" .}} -
-

编辑个人资料

-
- -
- -
-
- - 返回 - -
编辑个人资料
- -
- -
-
- - 个人头像 - - - -
- - - - - - -
-
-
- {{template "footer" .}} - - - diff --git a/app/templates/page/helpCenter.html b/app/templates/page/helpCenter.html index e57a116..a0f862c 100644 --- a/app/templates/page/helpCenter.html +++ b/app/templates/page/helpCenter.html @@ -7,14 +7,14 @@ 帮助中心 - 黄果短剧 {{if .jsonLD}} - - diff --git a/app/templates/page/homeRoad.html b/app/templates/page/homeRoad.html index 12fa979..f98dfb3 100644 --- a/app/templates/page/homeRoad.html +++ b/app/templates/page/homeRoad.html @@ -23,7 +23,7 @@
官方权威发布 · 永久有效入口
- +

黄果短剧 · 官方最新地址发布页

实时同步最新可用线路与备用入口,帮助你在不同网络环境下快速返回。

diff --git a/app/templates/page/index.html b/app/templates/page/index.html index 3e21036..c6dd8be 100644 --- a/app/templates/page/index.html +++ b/app/templates/page/index.html @@ -10,10 +10,10 @@ - + - + {{if .jsonLD}} {{end}} @@ -27,7 +27,7 @@ {{if $heroSrc}}{{end}} {{end}}{{end}} - + {{template "header" .}}

{{if .seoInfo.Title}}{{.seoInfo.Title}}{{else if .appConfig.SeoInfo.Title}}{{.appConfig.SeoInfo.Title}}{{else if .title}}{{.title}}{{else}}黄果短剧 - 热门短剧在线看{{end}}

diff --git a/app/templates/page/list.html b/app/templates/page/list.html index 38cdf9a..d34c70c 100644 --- a/app/templates/page/list.html +++ b/app/templates/page/list.html @@ -64,7 +64,7 @@ {{if .appConfig.BottomBanner}}
{{range $ad := .appConfig.BottomBanner}} - + {{$ad.Title}} {{end}} diff --git a/app/templates/page/nav.html b/app/templates/page/nav.html index 090718e..abf5119 100644 --- a/app/templates/page/nav.html +++ b/app/templates/page/nav.html @@ -10,10 +10,10 @@ - + - + {{if .jsonLD}} {{end}} @@ -26,7 +26,7 @@

{{if .appConfig.SeoNavInfo.DhSiteName}}{{.appConfig.SeoNavInfo.DhSiteName}}{{else if .appConfig.SeoNavInfo.DhTitle}}{{.appConfig.SeoNavInfo.DhTitle}}{{else if .title}}{{.title}}{{else}}黄果短剧 · 官方导航{{end}}

-
- {{if $.isLoggedIn}} -
- - -
- {{else}} - - {{end}} -
{{end}} {{else}} @@ -489,9 +393,7 @@ {{end}} {{template "footer" .}} -{{template "vipDialog" .}} -{{template "coinDialog" .}} - - + + diff --git a/app/templates/page/rank.html b/app/templates/page/rank.html index 20989a1..d475b69 100644 --- a/app/templates/page/rank.html +++ b/app/templates/page/rank.html @@ -69,7 +69,7 @@ {{if .appConfig.BottomBanner}}
{{range $ad := .appConfig.BottomBanner}} - + {{$ad.Title}} {{end}} diff --git a/app/templates/page/search.html b/app/templates/page/search.html index 49910bf..bd70436 100644 --- a/app/templates/page/search.html +++ b/app/templates/page/search.html @@ -151,22 +151,5 @@ {{template "footer" .}} - diff --git a/app/templates/page/series.html b/app/templates/page/series.html index 6f1c3eb..ad87a9b 100644 --- a/app/templates/page/series.html +++ b/app/templates/page/series.html @@ -60,7 +60,7 @@ {{if .appConfig.BottomBanner}}
{{range $ad := .appConfig.BottomBanner}} - + {{$ad.Title}} {{end}} diff --git a/app/templates/page/setting.html b/app/templates/page/setting.html deleted file mode 100644 index 9d16615..0000000 --- a/app/templates/page/setting.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - {{template "seoCommon" .}} - 账号设置 - 黄果短剧 - - - - - - - - - - {{template "header" .}} -
-
- -
-

账号设置

-

管理个人资料与登录状态

-
-
- -
- - 返回 - -
账号设置
- -
- -
-
-

个人资料

-
- {{if .setting.Avatar}} - {{if .setting.DisplayName}}{{.setting.DisplayName}}{{else}}用户{{end}}的头像 - {{else}} - {{if .setting.DisplayName}}{{.setting.DisplayName}}{{else}}用户{{end}}的默认头像 - {{end}} -
-
{{.setting.DisplayName}}
-
-
-
- - -
-
- 个人简介 -
- {{if - .setting.Introduction}}{{.setting.Introduction}}{{else}}未设置简介{{end}} -
-
- 保存修改 -
- -
- - -
- - -
-
- {{template "footer" .}} - - - diff --git a/app/templates/page/themeIndex.html b/app/templates/page/themeIndex.html index 172beb7..30a7c03 100644 --- a/app/templates/page/themeIndex.html +++ b/app/templates/page/themeIndex.html @@ -52,7 +52,7 @@ {{if .appConfig.BottomBanner}}
{{range $ad := .appConfig.BottomBanner}} - + {{$ad.Title}} {{end}} diff --git a/app/templates/page/userCenter.html b/app/templates/page/userCenter.html deleted file mode 100644 index c00af1e..0000000 --- a/app/templates/page/userCenter.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - {{template "seoCommon" .}} - 个人中心 - 黄果短剧 - - - - - - - - - - {{template "header" .}} -
-
-
-
ACCOUNT
-
-
-

- 个人中心 -

- {{if and .isLoggedIn (not .isRegistered)}} - 游客注册 - {{end}} -
- -
- {{if .isLoggedIn}} -
欢迎回来,继续你的追剧旅程
- {{else}} -
管理观看数据、收藏和金币余额
- {{end}} -
- - {{template "squarePromo" dict "Ads" .appConfig.DetailTopList "SlotKey" "user_center_detail_top" "SlotName" "个人中心方块广告" "Label" "推广应用"}} - - {{if .isLoggedIn}} -
- {{if .avatar}} - {{if .userName}}{{.userName}}{{else}}用户{{end}}的头像 - {{else}} - {{if .userName}}{{.userName}}{{else}}用户{{end}}的默认头像 - {{end}} -
-
- {{if .userName}}{{.userName}}{{else}}用户{{end}} -
-
- ID:{{if .userId}}{{.userId}}{{else}}--{{end}} -
- {{if .email}} -
{{.email}}
- {{end}} -
-
- -
-
金币余额 (金币)
-
- {{if .rechargeText}}{{.rechargeText}}{{else}}000.00{{end}} -
-
- 金币充值 -
-
- {{else}} - - {{end}} - - -
- -
- {{if .isLoggedIn}} -
- {{if .avatar}} - {{if .userName}}{{.userName}}{{else}}用户{{end}}的头像 - {{else}} - {{if .userName}}{{.userName}}{{else}}用户{{end}}的默认头像 - {{end}} -
-
- {{if .userName}}{{.userName}}{{else}}用户{{end}} -
-
- {{if .userId}}ID {{.userId}}{{else}}ID --{{end}} -
-
- {{if not .isRegistered}} - 游客注册 - {{end}} -
- - - {{else}} -
- 未登录用户头像 -
-
未登录
-
登录后同步收藏与观看历史
-
- -
- -
- -
-
金币余额 (金币)
-
000.00
-
- 金币充值 -
- - {{template "squarePromo" dict "Ads" .appConfig.DetailTopList "SlotKey" "user_center_detail_top" "SlotName" "个人中心方块广告" "Label" "推广应用"}} - - -
- {{end}} -
-
- {{template "footer" .}} - - - diff --git a/pub/pubdef/pubdef.go b/pub/pubdef/pubdef.go index b113e1b..f0f3fd9 100644 --- a/pub/pubdef/pubdef.go +++ b/pub/pubdef/pubdef.go @@ -11,11 +11,6 @@ const ( AppId = 1038 ) -// TrackerAppId 数据上报 Web SDK 的业务 appId。 -func TrackerAppId() string { - return "JHA-1043" -} - const PageSize int64 = 40 type SeoValue struct {

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 y|Tah6>@%k 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