docs: freeze YuXinGu lexicon, journey, and P1 engineering sources

Establish product language contract, user journey with dual growth engines,
ERD/OpenAPI/Go boundaries, and H5 routes (/profile, /portrait, /relation,
/membership) before P1 implementation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-02 16:12:10 +08:00
co-authored by Cursor
parent 2fb1dfee14
commit dd94e57277
40 changed files with 1283 additions and 800 deletions
+1 -1
View File
@@ -20,7 +20,7 @@ const route = useRoute()
const items = [
{ to: '/', icon: '⌂', label: '首页' },
{ to: '/explore', icon: '◎', label: '探索' },
{ to: '/ask', icon: '问', label: '问', ask: true },
{ to: '/ask', icon: '问', label: '问', ask: true },
{ to: '/companion', icon: '♡', label: '陪伴' },
{ to: '/mine', icon: '◍', label: '我的' },
]
+6 -3
View File
@@ -1,8 +1,11 @@
<template>
<main class="page">
<h1></h1>
<p class="sub">愈心 AI · 基于档案的解读占位</p>
<div class="card">后续接入档案上下文问答真人顾问双轨同屏</div>
<h1></h1>
<p class="sub">AI 成长助手 · 结合你的档案回答占位</p>
<div class="card">
预置场景认识自己 · 理解关系 · 职业探索 · 情绪整理 · 生活建议
可切换我的档案 / TA 的档案深度分析为会员权益
</div>
</main>
</template>
+2 -2
View File
@@ -1,8 +1,8 @@
<template>
<main class="page">
<h1>陪伴</h1>
<p class="sub">节气 · 每日心情占位</p>
<div class="card">今日节气内容将由 API `/api/v1/solar-terms/today` 下发</div>
<p class="sub">节气生活 · 心情记录占位</p>
<div class="card">今日节气与生活建议将由 API 下发第二阶段完善心情与成长记录</div>
</main>
</template>
+6 -4
View File
@@ -1,11 +1,12 @@
<template>
<main class="page">
<h1>探索</h1>
<p class="sub">量表 · 数字心理 · 星镜逐步迁入</p>
<p class="sub">性格探索 · 人格测评 · 关系理解 · 个人画像</p>
<ul class="list">
<li>性格测评库对接 /api/v1/scales</li>
<li>数字心理学</li>
<li>星镜</li>
<li><router-link to="/portrait">性格探索 / 个人画像</router-link></li>
<li>人格测评库对接 /api/v1/scales</li>
<li><router-link to="/relation">关系理解</router-link></li>
<li>身心探索第二阶段</li>
</ul>
</main>
</template>
@@ -15,4 +16,5 @@
h1{font-size:22px}
.sub{color:var(--yxg-sub);font-size:13px;margin:6px 0 16px}
.list{background:#fff;border-radius:16px;padding:8px 16px;line-height:2.2;font-size:14px;color:#555}
.list a{color:inherit;text-decoration:none}
</style>
+19 -16
View File
@@ -2,12 +2,12 @@
<main class="home">
<header class="brand">
<div class="word"><span></span></div>
<p class="tag">愈见自己 · 遇见更好</p>
<p class="tag">认识自己 · 理解他人</p>
</header>
<section class="decode-card">
<h2>愈心解码</h2>
<p class="sub">一个生日读懂你的身与心</p>
<section class="portrait-card">
<h2>性格探索</h2>
<p class="sub">填写生日生成你的成长画像</p>
<div class="row">
<input v-model="year" type="number" placeholder="1990" />
<span></span>
@@ -15,15 +15,15 @@
<span></span>
<input v-model="day" type="number" placeholder="1" />
<span></span>
<button type="button" @click="goDecode">生成</button>
<button type="button" @click="goPortrait">开始</button>
</div>
<p v-if="err" class="err">{{ err }}</p>
</section>
<section class="block">
<div class="head"><h3>认识自己</h3><router-link to="/explore">全部</router-link></div>
<div class="head"><h3>快捷入口</h3><router-link to="/explore">全部</router-link></div>
<div class="grid">
<router-link v-for="t in tests" :key="t.to" :to="t.to" class="cell">
<router-link v-for="t in entries" :key="t.to" :to="t.to" class="cell">
<div class="icon" :style="{ background: t.bg, color: t.fg }">{{ t.icon }}</div>
<span>{{ t.label }}</span>
</router-link>
@@ -50,14 +50,17 @@ const day = ref('')
const err = ref('')
const apiStatus = ref('检测中…')
const tests = [
{ to: '/decode', icon: '△', label: '愈心解码', bg: '#FFF3D6', fg: '#C8923A' },
{ to: '/explore', icon: '◆', label: '格测评', bg: '#E3EEFF', fg: '#4A90E2' },
{ to: '/ask', icon: '', label: '愈心问答', bg: '#FFE4E4', fg: '#E54D42' },
const entries = [
{ to: '/portrait', icon: '△', label: '性格探索', bg: '#FFF3D6', fg: '#C8923A' },
{ to: '/explore', icon: '◆', label: '格测评', bg: '#E3EEFF', fg: '#4A90E2' },
{ to: '/relation', icon: '', label: '关系理解', bg: '#FFE8D6', fg: '#E8985A' },
{ to: '/ask', icon: '问', label: 'AI问答', bg: '#FFE4E4', fg: '#E54D42' },
{ to: '/companion', icon: '☯', label: '节气陪伴', bg: '#E0F6E4', fg: '#5CB85C' },
{ to: '/profile', icon: '◍', label: '个人档案', bg: '#F0F4F8', fg: '#5A6A7A' },
{ to: '/membership', icon: '◇', label: '成长会员', bg: '#F5F0FF', fg: '#8B5CF6' },
]
function goDecode() {
function goPortrait() {
const y = Number(year.value)
const m = Number(month.value)
const d = Number(day.value)
@@ -67,7 +70,7 @@ function goDecode() {
return
}
err.value = ''
router.push({ path: '/decode', query: { y: String(y), m: String(m), d: String(d) } })
router.push({ path: '/portrait', query: { y: String(y), m: String(m), d: String(d) } })
}
onMounted(async () => {
@@ -86,11 +89,11 @@ onMounted(async () => {
.word{font-size:28px;font-weight:700;letter-spacing:.18em}
.word span{color:var(--yxg-pri)}
.tag{font-size:12px;color:rgba(0,0,0,.38);margin-top:6px;letter-spacing:.12em}
.decode-card{
.portrait-card{
background:#fff;border-radius:20px;padding:18px 14px;text-align:center;
box-shadow:0 8px 28px rgba(229,77,66,.12);
}
.decode-card h2{font-size:17px;color:var(--yxg-gold);letter-spacing:.1em}
.portrait-card h2{font-size:17px;color:var(--yxg-gold);letter-spacing:.1em}
.sub{font-size:12px;color:#aaa;margin:4px 0 14px}
.row{display:flex;gap:6px;align-items:center;justify-content:center;flex-wrap:wrap}
.row input{
@@ -106,7 +109,7 @@ onMounted(async () => {
.head{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}
.head h3{font-size:16px}
.head a{font-size:12px;color:#bbb}
.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px 8px}
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px 8px}
.cell{display:flex;flex-direction:column;align-items:center;gap:8px;font-size:11px;color:#555}
.icon{
width:52px;height:52px;border-radius:18px;display:flex;align-items:center;justify-content:center;font-size:20px;
+18
View File
@@ -0,0 +1,18 @@
<template>
<main class="page">
<button class="back" type="button" @click="$router.back()"> 返回</button>
<h1>成长会员</h1>
<p class="sub">完整分析 · AI成长助手更多次数 · 专属内容</p>
<div class="card">
/ / 年套餐与模拟支付将接入 /api/v1/orders亦可在成长报告内选择深度版单次完整分析
</div>
</main>
</template>
<style scoped>
.page{padding:16px}
.back{border:none;background:#fff;border-radius:10px;padding:8px 12px;margin-bottom:12px}
h1{font-size:22px}
.sub{color:var(--yxg-sub);margin:8px 0 14px;font-size:13px}
.card{background:#fff;border-radius:16px;padding:18px;font-size:14px;line-height:1.7;color:#555}
</style>
+9 -3
View File
@@ -1,8 +1,13 @@
<template>
<main class="page">
<h1>我的</h1>
<p class="sub">档案 · 会员 · 订单</p>
<div class="card">登录与会员状态将在商业化阶段接入</div>
<p class="sub">个人档案 · 成长报告 · 成长会员</p>
<ul class="list">
<li><router-link to="/profile">个人档案</router-link></li>
<li><router-link to="/portrait">个人画像</router-link></li>
<li><router-link to="/relation">关系理解</router-link></li>
<li><router-link to="/membership">成长会员</router-link></li>
</ul>
</main>
</template>
@@ -10,5 +15,6 @@
.page{padding:24px 16px}
h1{font-size:22px}
.sub{color:var(--yxg-sub);font-size:13px;margin:6px 0 16px}
.card{background:#fff;border-radius:16px;padding:18px;font-size:14px;color:#666;line-height:1.6}
.list{background:#fff;border-radius:16px;padding:8px 16px;line-height:2.2;font-size:14px;color:#555}
.list a{color:inherit;text-decoration:none}
</style>
@@ -1,13 +1,13 @@
<template>
<main class="page">
<button class="back" type="button" @click="$router.back()"> 返回</button>
<h1>愈心解码</h1>
<h1>个人画像</h1>
<p class="sub" v-if="y">生日{{ y }}-{{ m }}-{{ d }}</p>
<div class="card">
简版报告将由 Go API 生成当前为页面骨架完整结论免费 / 原因付费逻辑 PRD
基础画像将由 API 生成免费可见基础结论完整分析为深度版或会员权益 PRD
</div>
<p class="disc">
本内容为文化测评与健康生活方式参考不构成医疗建议
本内容为自我探索与生活方式参考不构成医疗建议亦非占卜预测
</p>
</main>
</template>
+20
View File
@@ -0,0 +1,20 @@
<template>
<main class="page">
<button class="back" type="button" @click="$router.back()"> 返回</button>
<h1>个人档案</h1>
<p class="sub">管理我的信息与重要的人</p>
<div class="card">
支持创建我的档案添加伴侣/家人/朋友并在问答中切换解读对象数据接口/api/v1/profiles
</div>
<router-link class="link" to="/relation">去完善关系理解 </router-link>
</main>
</template>
<style scoped>
.page{padding:16px}
.back{border:none;background:#fff;border-radius:10px;padding:8px 12px;margin-bottom:12px}
h1{font-size:22px}
.sub{color:var(--yxg-sub);margin:8px 0 14px;font-size:13px}
.card{background:#fff;border-radius:16px;padding:18px;font-size:14px;line-height:1.7;color:#555}
.link{display:inline-block;margin-top:16px;font-size:14px;color:var(--yxg-pri)}
</style>
+18
View File
@@ -0,0 +1,18 @@
<template>
<main class="page">
<button class="back" type="button" @click="$router.back()"> 返回</button>
<h1>关系理解</h1>
<p class="sub">添加重要的人了解双方差异与相处建议</p>
<div class="card">
双人分析与深度相处建议将在 P1 接入 API概览免费可见完整建议为深度版或会员权益
</div>
</main>
</template>
<style scoped>
.page{padding:16px}
.back{border:none;background:#fff;border-radius:10px;padding:8px 12px;margin-bottom:12px}
h1{font-size:22px}
.sub{color:var(--yxg-sub);margin:8px 0 14px;font-size:13px}
.card{background:#fff;border-radius:16px;padding:18px;font-size:14px;line-height:1.7;color:#555}
</style>
+5 -1
View File
@@ -8,7 +8,11 @@ const router = createRouter({
{ path: '/ask', name: 'ask', component: () => import('../pages/AskPage.vue'), meta: { tab: true } },
{ path: '/companion', name: 'companion', component: () => import('../pages/CompanionPage.vue'), meta: { tab: true } },
{ path: '/mine', name: 'mine', component: () => import('../pages/MinePage.vue'), meta: { tab: true } },
{ path: '/decode', name: 'decode', component: () => import('../pages/DecodePage.vue'), meta: { tab: false } },
{ path: '/profile', name: 'profile', component: () => import('../pages/ProfilePage.vue'), meta: { tab: false } },
{ path: '/portrait', name: 'portrait', component: () => import('../pages/PortraitPage.vue'), meta: { tab: false } },
{ path: '/relation', name: 'relation', component: () => import('../pages/RelationPage.vue'), meta: { tab: false } },
{ path: '/membership', name: 'membership', component: () => import('../pages/MembershipPage.vue'), meta: { tab: false } },
{ path: '/decode', redirect: (to) => ({ path: '/portrait', query: to.query }) },
],
})