diff --git a/app/api/dingtalk/callback/route.ts b/app/api/dingtalk/callback/route.ts index a2dcecd..b9f53dc 100644 --- a/app/api/dingtalk/callback/route.ts +++ b/app/api/dingtalk/callback/route.ts @@ -6,6 +6,61 @@ import { buildDingtalkAutoLoginPath } from '@/lib/safe-redirect' export const runtime = 'nodejs' export const dynamic = 'force-dynamic' +const SURVEY_OPENING_PAGE_STYLE = ` + html,body{margin:0;min-height:100%;background:#f7fbff;color:#111827;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif} + body{min-height:100vh;min-height:100dvh;overflow:hidden} + .topbar{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;color:#fff;background:linear-gradient(90deg,#1677ff,#4f9cff);box-shadow:0 10px 24px rgba(22,119,255,.18)} + .topbar span:first-child{font-size:28px;line-height:1} + .topbar span:nth-child(2){font-size:15px;font-weight:600} + .topbar span:last-child{font-size:20px;line-height:1} + main{box-sizing:border-box;width:min(390px,100%);margin:0 auto;padding:48px 28px 0} + .brand{text-align:center} + .brand img{width:42px;height:42px;border-radius:10px;object-fit:cover} + .brand h1{margin:12px 0 0;font-size:23px;font-weight:600;line-height:1} + .brand p{margin:8px 0 0;color:#8a94a6;font-size:14px;font-weight:500} + .open-pill{min-height:58px;margin-top:40px;padding:0 20px;display:flex;align-items:center;justify-content:space-between;border-radius:999px;background:#fff;box-shadow:0 12px 30px rgba(15,23,42,.12)} + .open-pill strong{display:flex;align-items:center;gap:12px;font-size:16px;font-weight:600} + .open-pill em{font-style:normal;color:#1677ff;font-size:15px;font-weight:600} + .spinner{width:28px;height:28px;border:4px solid #d7e8ff;border-top-color:#1677ff;border-radius:999px;animation:spin .85s linear infinite} + .message{margin:28px 0 0;text-align:center;color:#8a94a6;font-size:13px;font-weight:500;line-height:1.7} + .ghost-card{margin-top:44px;padding:20px;border-radius:18px;background:rgba(255,255,255,.9);box-shadow:0 18px 42px rgba(15,23,42,.08)} + .ghost-title{font-size:15px;font-weight:600;color:#7b8494} + .ghost-line{height:12px;border-radius:999px;background:#eef3f9} + .ghost-line.one{margin-top:24px} + .ghost-line.two{width:74%;margin-top:12px} + .ghost-list{margin-top:32px;display:grid;gap:20px} + .ghost-row{display:flex;align-items:center;gap:12px} + .ghost-dot{width:16px;height:16px;border-radius:999px;border:1px solid #e3eaf3} + .ghost-row .ghost-line{flex:1;margin:0} + .ghost-row:last-child .ghost-line{flex:.67} + @keyframes spin{to{transform:rotate(360deg)}} + ` + +const SURVEY_OPENING_PAGE_MARKUP = ` +
‹素材库•••
+
+
+ 素材库 +

素材库

+

内部素材协作平台

+
+
+ 正在打开问卷 + 马上进入 +
+

正在打开问卷...

+ +
` + function appendLoginSetCookie(target: NextResponse, source: Response) { const getSetCookie = (source.headers as any).getSetCookie const cookies = typeof getSetCookie === 'function' @@ -42,17 +97,10 @@ function createCookieLandingResponse(redirectPath: string, loginResponse: Respon 正在打开问卷 - + -
-

正在打开问卷

-

正在打开问卷...

-
+${SURVEY_OPENING_PAGE_MARKUP} diff --git a/app/api/dingtalk/h5-login/route.ts b/app/api/dingtalk/h5-login/route.ts index c63f423..0bbc54f 100644 --- a/app/api/dingtalk/h5-login/route.ts +++ b/app/api/dingtalk/h5-login/route.ts @@ -10,6 +10,61 @@ import { normalizeInternalRedirectPath } from '@/lib/safe-redirect' export const runtime = 'nodejs' export const dynamic = 'force-dynamic' +const SURVEY_OPENING_PAGE_STYLE = ` + html,body{margin:0;min-height:100%;background:#f7fbff;color:#111827;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif} + body{min-height:100vh;min-height:100dvh;overflow:hidden} + .topbar{height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;color:#fff;background:linear-gradient(90deg,#1677ff,#4f9cff);box-shadow:0 10px 24px rgba(22,119,255,.18)} + .topbar span:first-child{font-size:28px;line-height:1} + .topbar span:nth-child(2){font-size:15px;font-weight:600} + .topbar span:last-child{font-size:20px;line-height:1} + main{box-sizing:border-box;width:min(390px,100%);margin:0 auto;padding:48px 28px 0} + .brand{text-align:center} + .brand img{width:42px;height:42px;border-radius:10px;object-fit:cover} + .brand h1{margin:12px 0 0;font-size:23px;font-weight:600;line-height:1} + .brand p{margin:8px 0 0;color:#8a94a6;font-size:14px;font-weight:500} + .open-pill{min-height:58px;margin-top:40px;padding:0 20px;display:flex;align-items:center;justify-content:space-between;border-radius:999px;background:#fff;box-shadow:0 12px 30px rgba(15,23,42,.12)} + .open-pill strong{display:flex;align-items:center;gap:12px;font-size:16px;font-weight:600} + .open-pill em{font-style:normal;color:#1677ff;font-size:15px;font-weight:600} + .spinner{width:28px;height:28px;border:4px solid #d7e8ff;border-top-color:#1677ff;border-radius:999px;animation:spin .85s linear infinite} + #message{margin:28px 0 0;text-align:center;color:#8a94a6;font-size:13px;font-weight:500;line-height:1.7} + .ghost-card{margin-top:44px;padding:20px;border-radius:18px;background:rgba(255,255,255,.9);box-shadow:0 18px 42px rgba(15,23,42,.08)} + .ghost-title{font-size:15px;font-weight:600;color:#7b8494} + .ghost-line{height:12px;border-radius:999px;background:#eef3f9} + .ghost-line.one{margin-top:24px} + .ghost-line.two{width:74%;margin-top:12px} + .ghost-list{margin-top:32px;display:grid;gap:20px} + .ghost-row{display:flex;align-items:center;gap:12px} + .ghost-dot{width:16px;height:16px;border-radius:999px;border:1px solid #e3eaf3} + .ghost-row .ghost-line{flex:1;margin:0} + .ghost-row:last-child .ghost-line{flex:.67} + @keyframes spin{to{transform:rotate(360deg)}} + ` + +const SURVEY_OPENING_PAGE_MARKUP = ` +
‹素材库•••
+
+
+ 素材库 +

素材库

+

内部素材协作平台

+
+
+ 正在打开问卷 + 马上进入 +
+

正在打开问卷...

+ +
` + function getLoginSetCookies(source: Response): string[] { const getSetCookie = (source.headers as any).getSetCookie const cookies = typeof getSetCookie === 'function' @@ -78,21 +133,10 @@ function createSessionTicketTransferPage({ 正在打开问卷 - + -
- -

正在打开问卷

-

正在打开问卷...

-
+${SURVEY_OPENING_PAGE_MARKUP}