feat: P1 合盘/星座/问答与测测完整设计包及模拟器取证工具

落地 synastry/star/ask API 与 H5 页面,补齐 cece-frontend-re complete-design 证据文档,并加入 Android 模拟器截图抓取脚本。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-03 11:37:53 +08:00
co-authored by Cursor
parent 15a9db374a
commit bd22d9dddd
248 changed files with 26309 additions and 842 deletions
+69
View File
@@ -0,0 +1,69 @@
<template>
<main class="yxg-page">
<div class="yxg-hero">
<BackButton />
</div>
<div class="yxg-sheet sheet-pad">
<p v-if="!payload" class="yxg-err">
分享内容无效或已过期
<router-link class="yxg-link" to="/">回首页</router-link>
</p>
<template v-else>
<p class="yxg-meta lead">朋友分享了{{ payload.type === 'relation' ? '一段关系理解' : '一份个人画像' }}</p>
<ShareCard v-bind="cardProps" />
<div class="actions">
<router-link class="yxg-btn yxg-btn-block" :to="ctaTo">{{ ctaText }}</router-link>
<router-link class="yxg-link-plain ghost" to="/">先逛逛首页</router-link>
</div>
<p class="yxg-disc">本内容为自我探索与生活方式参考不构成医疗建议亦非占卜预测</p>
</template>
</div>
</main>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import BackButton from '../components/BackButton.vue'
import ShareCard from '../components/ShareCard.vue'
import { parseShareQuery } from '../lib/shareLink'
const route = useRoute()
const payload = computed(() => parseShareQuery(route.query as Record<string, unknown>))
const cardProps = computed(() => {
const p = payload.value
if (!p) return {}
if (p.type === 'portrait') {
return {
type: 'portrait' as const,
title: p.title,
line: p.line,
keywords: p.keywords,
ctaLabel: '查看完整成长报告',
}
}
return {
type: 'relation' as const,
title: '我的方式 vs TA 的方式',
rows: [
p.me ? `我:${p.me}` : '',
p.other ? `TA${p.other}` : '',
p.diff || '',
].filter(Boolean),
keywords: p.keywords,
ctaLabel: '了解彼此 → 查看关系理解',
}
})
const ctaTo = computed(() => (payload.value?.type === 'relation' ? '/relation' : '/'))
const ctaText = computed(() =>
payload.value?.type === 'relation' ? '开始关系理解' : '生成我的个人画像',
)
</script>
<style scoped>
.lead{margin:4px 0 16px}
.actions{display:flex;flex-direction:column;gap:10px;margin-top:18px;align-items:center}
.ghost{text-align:center;font-size:13px}
</style>