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
+48 -24
View File
@@ -1,42 +1,66 @@
<template>
<main class="page">
<h1>探索</h1>
<p class="sub">性格探索 · 探索测试 · 关系理解 · 个人画像</p>
<p v-if="error" class="err">{{ error }}</p>
<ul class="list">
<li><router-link to="/portrait">性格探索 / 个人画像</router-link></li>
<li><router-link to="/relation">关系理解</router-link></li>
<li v-for="s in scales" :key="s.slug">
<router-link :to="`/scales/${s.slug}`">{{ s.title }}</router-link>
<span class="desc">{{ s.description }}</span>
</li>
</ul>
<main class="yxg-page">
<div class="yxg-hero">
<PageTitle feature="explore" title="探索" sub="六大分类 · 找到适合你的自我理解方式" />
</div>
<div class="yxg-sheet">
<p v-if="loading" class="yxg-hint pad">加载中</p>
<p v-else-if="error" class="yxg-err pad">
{{ error }}
<button type="button" class="yxg-link" @click="load">重试</button>
</p>
<ul v-else class="yxg-list">
<li v-for="c in categories" :key="c.key">
<router-link :to="`/explore/${c.key}`">
<span class="yxg-mark" :class="'icon-' + c.tone" aria-hidden="true">{{ c.icon }}</span>
<span class="yxg-body">
<strong>{{ c.title }}</strong>
<span class="desc">{{ c.description }} · {{ c.items?.length || 0 }} </span>
</span>
<span class="chev" aria-hidden="true"></span>
</router-link>
</li>
</ul>
</div>
</main>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { api } from '../api/client'
import PageTitle from '../components/PageTitle.vue'
const scales = ref<{ slug: string; title: string; description: string }[]>([])
type Cat = {
key: string
title: string
description: string
icon: string
tone: string
items?: unknown[]
}
const categories = ref<Cat[]>([])
const loading = ref(true)
const error = ref('')
onMounted(async () => {
async function load() {
loading.value = true
error.value = ''
try {
const res = await api.listScales()
scales.value = res.items || []
const res = await api.getExploreCatalog()
categories.value = res.categories || []
} catch (e) {
error.value = e instanceof Error ? e.message : '加载失败'
} finally {
loading.value = false
}
})
}
onMounted(load)
</script>
<style scoped>
.page{padding:24px 16px}
h1{font-size:22px}
.sub{color:var(--yxg-sub);font-size:13px;margin:6px 0 16px}
.err{color:var(--yxg-pri);font-size:13px}
.list{background:#fff;border-radius:16px;padding:8px 16px;line-height:1.8;font-size:14px;color:#555}
.list a{color:inherit;text-decoration:none;font-weight:600}
.desc{display:block;font-size:12px;color:#aaa;font-weight:400;margin-bottom:8px}
.pad{padding:8px 16px}
.yxg-list{margin-top:8px}
</style>