From 0d5fe7d1cf7fc3958a6dc4a95d1b3db692bb542d Mon Sep 17 00:00:00 2001 From: gqt <3217233537@qq.com> Date: Wed, 10 Jun 2026 11:46:39 +0800 Subject: [PATCH] feat: add agreement-gated login state --- miniprogram/package.json | 3 +- .../scripts/verify-auth-agreements.mjs | 100 +++++++ .../verify-comprehensive-auth-state.mjs | 8 +- miniprogram/src/components/AgreementLinks.vue | 256 +++++++++++++++++ .../src/components/UnauthLoginPanel.vue | 260 ++++++++++++++++++ .../pages/comprehensive/bookings/index.vue | 9 +- .../src/pages/comprehensive/profile/index.vue | 11 +- miniprogram/src/pages/ice/bookings/detail.vue | 12 +- miniprogram/src/pages/ice/bookings/index.vue | 13 +- .../src/pages/ice/profile/card-history.vue | 12 +- miniprogram/src/pages/ice/profile/cards.vue | 12 +- miniprogram/src/pages/ice/profile/detail.vue | 12 +- miniprogram/src/pages/ice/profile/index.vue | 15 +- miniprogram/src/static/brand/logo.png | Bin 0 -> 23348 bytes 14 files changed, 662 insertions(+), 61 deletions(-) create mode 100644 miniprogram/scripts/verify-auth-agreements.mjs create mode 100644 miniprogram/src/components/AgreementLinks.vue create mode 100644 miniprogram/src/components/UnauthLoginPanel.vue create mode 100644 miniprogram/src/static/brand/logo.png diff --git a/miniprogram/package.json b/miniprogram/package.json index 76c631f..744f6d0 100644 --- a/miniprogram/package.json +++ b/miniprogram/package.json @@ -11,7 +11,8 @@ "verify:tabbar": "node scripts/verify-venue-tabbar.mjs", "verify:startup": "node scripts/verify-venue-startup.mjs", "verify:home-switch": "node scripts/verify-home-venue-switch.mjs", - "verify:comprehensive-auth": "node scripts/verify-comprehensive-auth-state.mjs" + "verify:comprehensive-auth": "node scripts/verify-comprehensive-auth-state.mjs", + "verify:auth-agreements": "node scripts/verify-auth-agreements.mjs" }, "dependencies": { "@dcloudio/uni-app": "3.0.0-alpha-5000120260211001", diff --git a/miniprogram/scripts/verify-auth-agreements.mjs b/miniprogram/scripts/verify-auth-agreements.mjs new file mode 100644 index 0000000..23dab4d --- /dev/null +++ b/miniprogram/scripts/verify-auth-agreements.mjs @@ -0,0 +1,100 @@ +import { existsSync, readFileSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '..') +const srcRoot = resolve(root, 'src') +const failures = [] + +const read = (relativePath) => readFileSync(resolve(srcRoot, relativePath), 'utf8') + +const expectFile = (relativePath) => { + const path = resolve(srcRoot, relativePath) + if (!existsSync(path)) { + failures.push(`${relativePath} is missing`) + return '' + } + return readFileSync(path, 'utf8') +} + +const expectIncludes = (content, expected, label) => { + if (!content.includes(expected)) failures.push(`${label} is missing: ${expected}`) +} + +const expectExcludes = (content, unexpected, label) => { + if (content.includes(unexpected)) failures.push(`${label} should not contain: ${unexpected}`) +} + +const agreements = expectFile('components/AgreementLinks.vue') +expectIncludes(agreements, '用户协议', 'AgreementLinks user agreement link') +expectIncludes(agreements, '隐私政策', 'AgreementLinks privacy policy link') +expectIncludes(agreements, 'u-popup', 'AgreementLinks popup') +expectIncludes(agreements, '场馆小程序用户服务协议', 'AgreementLinks user agreement content') +expectIncludes(agreements, '场馆小程序隐私政策', 'AgreementLinks privacy policy content') +expectIncludes(agreements, 'defineExpose', 'AgreementLinks exposed popup methods') + +const unauthPanel = expectFile('components/UnauthLoginPanel.vue') +expectIncludes(unauthPanel, '/static/brand/logo.png', 'UnauthLoginPanel brand logo') +expectIncludes(unauthPanel, '大兴区冰上运动中心', 'UnauthLoginPanel app name') +expectIncludes(unauthPanel, 'brand-section', 'UnauthLoginPanel brand section') +expectIncludes(unauthPanel, 'login-card', 'UnauthLoginPanel login card') +expectIncludes(unauthPanel, 'justify-content: center;', 'UnauthLoginPanel centered layout') +expectIncludes(unauthPanel, 'calc(100vh - 176rpx - env(safe-area-inset-bottom))', 'UnauthLoginPanel available viewport height') +expectIncludes(unauthPanel, 'align-self: center;', 'UnauthLoginPanel centered agreement rows') +expectIncludes(unauthPanel, 'hasAcceptedUserAgreement = ref(false)', 'UnauthLoginPanel user agreement manual state') +expectIncludes(unauthPanel, 'hasAcceptedPrivacyPolicy = ref(false)', 'UnauthLoginPanel privacy policy manual state') +expectIncludes(unauthPanel, 'canLogin', 'UnauthLoginPanel login gate') +expectIncludes(unauthPanel, 'acceptance-user', 'UnauthLoginPanel user agreement checkbox') +expectIncludes(unauthPanel, 'acceptance-privacy', 'UnauthLoginPanel privacy policy checkbox') +expectIncludes(unauthPanel, "emit('login')", 'UnauthLoginPanel login emit') +expectIncludes(unauthPanel, '请先勾选用户协议和隐私政策', 'UnauthLoginPanel unchecked feedback') +expectIncludes(unauthPanel, 'AgreementLinks', 'UnauthLoginPanel shared agreement popup') +expectExcludes(unauthPanel, '预约课程、查看', 'UnauthLoginPanel extra marketing copy') +expectExcludes(unauthPanel, '冰上课程', 'UnauthLoginPanel extra feature chip') +expectExcludes(unauthPanel, '预约行程', 'UnauthLoginPanel extra feature chip') +expectExcludes(unauthPanel, '会员权益', 'UnauthLoginPanel extra feature chip') +expectExcludes(unauthPanel, '登录仅用于', 'UnauthLoginPanel extra safe tip') +expectExcludes(unauthPanel, 'brand-logo-shell', 'UnauthLoginPanel logo shell decoration') +expectExcludes(unauthPanel, 'radial-gradient', 'UnauthLoginPanel background decoration') +expectExcludes(unauthPanel, 'linear-gradient(180deg, #EEF8FF', 'UnauthLoginPanel blue block background') +expectExcludes(unauthPanel, 'background: #FFFFFF;', 'UnauthLoginPanel nested white card background') +expectExcludes(unauthPanel, 'space-between', 'UnauthLoginPanel scattered vertical layout') +expectExcludes(unauthPanel, 'width: 100%;\n max-width: 420rpx;', 'UnauthLoginPanel left-aligned agreement rows') + +const loginPages = [ + ['pages/ice/bookings/index.vue', 'v-else-if="sessionStatus === SESSION_STATUS.GUEST"', '@login="onWechatLogin"'], + ['pages/ice/bookings/detail.vue', 'v-else-if="sessionStatus === SESSION_STATUS.GUEST"', '@login="onWechatLogin"'], + ['pages/ice/profile/index.vue', 'v-else-if="sessionStatus === SESSION_STATUS.GUEST"', '@login="onWechatLogin"'], + ['pages/ice/profile/detail.vue', 'v-else-if="sessionStatus === SESSION_STATUS.GUEST"', '@login="onWechatLogin"'], + ['pages/ice/profile/cards.vue', 'v-else-if="sessionStatus === SESSION_STATUS.GUEST"', '@login="onWechatLogin"'], + ['pages/ice/profile/card-history.vue', 'v-else-if="sessionStatus === SESSION_STATUS.GUEST"', '@login="onWechatLogin"'], + ['pages/comprehensive/bookings/index.vue', 'v-if="!session.isLoggedIn"', '@login="login"'], + ['pages/comprehensive/profile/index.vue', 'v-if="!session.isLoggedIn"', '@login="login"'] +] + +for (const [page, condition, handler] of loginPages) { + const content = read(page) + expectIncludes(content, ' { for (const page of pages) { const content = readFileSync(resolve(srcRoot, page), 'utf8') expectIncludes(content, 'v-if="!session.isLoggedIn"', `${page} unauth condition`) - expectIncludes(content, ' + + + 用户协议 + | + 隐私政策 + + + + + + {{ currentAgreement.popupTitle }} + + + + + + + {{ currentAgreement.title }} + 更新日期:2026年6月9日 + {{ currentAgreement.intro }} + + {{ section.title }} + {{ item }} + + + + + + + + + + + diff --git a/miniprogram/src/components/UnauthLoginPanel.vue b/miniprogram/src/components/UnauthLoginPanel.vue new file mode 100644 index 0000000..cad25dd --- /dev/null +++ b/miniprogram/src/components/UnauthLoginPanel.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/miniprogram/src/pages/comprehensive/bookings/index.vue b/miniprogram/src/pages/comprehensive/bookings/index.vue index ff57b5b..83e2ddc 100644 --- a/miniprogram/src/pages/comprehensive/bookings/index.vue +++ b/miniprogram/src/pages/comprehensive/bookings/index.vue @@ -1,11 +1,8 @@ @@ -223,6 +220,8 @@ import { api, authStorage } from '@/modules/ice/api/member' import { errorMessage, getMemberSession, loginAndStoreToken, SESSION_STATUS } from '@/modules/ice/api/session' import VenueTabBar from '@/components/VenueTabBar.vue' import StatePanel from '@/components/ice/StatePanel.vue' +import AgreementLinks from '@/components/AgreementLinks.vue' +import UnauthLoginPanel from '@/components/UnauthLoginPanel.vue' const isLoggedIn = ref(false) const isBound = ref(false) diff --git a/miniprogram/src/static/brand/logo.png b/miniprogram/src/static/brand/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2e41448817fc60b6c698fcae7cb3d288c013d27e GIT binary patch literal 23348 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 P00000NkvXXu0mjfI?urD literal 0 HcmV?d00001