修改未完成

This commit is contained in:
rain
2026-07-13 17:31:05 +08:00
parent 965fff1621
commit 355f47976a
95 changed files with 1112 additions and 721 deletions
@@ -1,52 +1,54 @@
<!-- 页面编号A-01用途启动登录引导视觉基准已由用户验收地基迁移不得改变可见效果 -->
<template>
<view class="auth-page entry-page">
<image class="paper-background" src="/static/assets/backgrounds/auth-rice-paper-v1.jpg" mode="aspectFill" />
<image class="scenery-background" src="/static/assets/backgrounds/auth-ink-scenery-v1.png" mode="aspectFill" />
<!-- 不透明纸纹底图承担页面底色透明山水只作为上层装饰 -->
<image class="paper-background" src="/static/assets/foundation/opaque/auth-page-paper.jpg" mode="aspectFill" />
<image class="scenery-background" src="/static/assets/foundation/transparent/auth-ink-scenery.png" mode="aspectFill" />
<view class="auth-content">
<view class="auth-header">
<image class="header-background" src="/static/assets/backgrounds/auth-ancestral-header-v1.png" mode="aspectFill" />
<image class="header-seal" src="/static/assets/icons/brand/jiapu-seal-logo-header.png" mode="aspectFit" />
<image class="header-background" src="/static/assets/foundation/opaque/auth-header.png" mode="aspectFill" />
<image class="header-seal" src="/static/assets/foundation/transparent/brand-seal.png" mode="aspectFit" />
</view>
<view class="brand-intro">
<view class="title-decoration">
<image class="title-cloud title-cloud-left" src="/static/assets/icons/auth/auth-title-cloud-v1.png" mode="aspectFit" />
<image class="title-cloud title-cloud-left" src="/static/assets/foundation/transparent/auth-title-cloud.png" mode="aspectFit" />
<text class="brand-title">家谱</text>
<image class="title-cloud title-cloud-right" src="/static/assets/icons/auth/auth-title-cloud-v1.png" mode="aspectFit" />
<image class="title-cloud title-cloud-right" src="/static/assets/foundation/transparent/auth-title-cloud.png" mode="aspectFit" />
</view>
<view class="brand-divider brand-divider--top">
<view class="brand-divider__line" />
<image class="brand-divider__ornament" src="/static/assets/icons/auth/auth-divider-knot-v1.png" mode="aspectFit" />
<image class="brand-divider__ornament" src="/static/assets/foundation/transparent/auth-divider-knot.png" mode="aspectFit" />
<view class="brand-divider__line" />
</view>
<text class="brand-subtitle">为家族留存可传承的记忆</text>
<view class="brand-divider brand-divider--bottom">
<view class="brand-divider__line" />
<image class="brand-divider__ornament" src="/static/assets/icons/auth/auth-divider-knot-v1.png" mode="aspectFit" />
<image class="brand-divider__ornament" src="/static/assets/foundation/transparent/auth-divider-knot.png" mode="aspectFit" />
<view class="brand-divider__line" />
</view>
</view>
<view class="entry-actions">
<view class="entry-button entry-button--primary" hover-class="entry-button--pressed" @click="openLogin">
<image class="button-corner-asset button-corner-asset--top-left" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--top-right" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-left" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-right" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--top-left" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--top-right" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-left" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-right" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<view class="entry-button__content">
<image class="entry-button__icon" src="/static/assets/icons/auth/login-outline-v1.png" mode="aspectFit" />
<image class="entry-button__icon" src="/static/assets/foundation/transparent/auth-login-outline.png" mode="aspectFit" />
<text>登录</text>
</view>
</view>
<view class="entry-button entry-button--secondary" hover-class="entry-button--pressed" @click="prepareWechatLogin">
<image class="button-corner-asset button-corner-asset--top-left" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--top-right" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-left" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-right" src="/static/assets/icons/auth/auth-button-corner-v1.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--top-left" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--top-right" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-left" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<image class="button-corner-asset button-corner-asset--bottom-right" src="/static/assets/foundation/transparent/auth-button-corner.png" mode="aspectFit" />
<view class="entry-button__content">
<image class="entry-button__icon entry-button__icon--wechat" src="/static/assets/icons/auth/wechat-licensed-v1.png" mode="aspectFit" />
<image class="entry-button__icon entry-button__icon--wechat" src="/static/assets/foundation/transparent/auth-wechat.png" mode="aspectFit" />
<text>微信登录</text>
</view>
</view>
@@ -88,7 +90,7 @@ const requireAgreement = () => {
const openLogin = () => {
if (!requireAgreement()) return
uni.navigateTo({ url: '/pages/auth/login?agreed=1' })
uni.navigateTo({ url: '/pages/auth/a02-login?agreed=1' })
}
const prepareWechatLogin = () => {
@@ -1,12 +1,14 @@
<!-- 页面编号A-02用途账号登录当前仅保留已确认的本地登录界面 -->
<template>
<view class="auth-page login-page">
<image class="paper-background" src="/static/assets/backgrounds/auth-rice-paper-v1.jpg" mode="aspectFill" />
<image class="scenery-background" src="/static/assets/backgrounds/auth-ink-scenery-v1.png" mode="aspectFill" />
<!-- A01 共用的登录页底图层先不透明纸纹后透明山水 -->
<image class="paper-background" src="/static/assets/foundation/opaque/auth-page-paper.jpg" mode="aspectFill" />
<image class="scenery-background" src="/static/assets/foundation/transparent/auth-ink-scenery.png" mode="aspectFill" />
<view class="auth-content">
<view class="auth-header">
<image class="header-background" src="/static/assets/backgrounds/auth-ancestral-header-v1.png" mode="aspectFill" />
<image class="header-seal" src="/static/assets/icons/brand/jiapu-seal-logo-header.png" mode="aspectFit" />
<image class="header-background" src="/static/assets/foundation/opaque/auth-header.png" mode="aspectFill" />
<image class="header-seal" src="/static/assets/foundation/transparent/brand-seal.png" mode="aspectFit" />
</view>
<view class="login-panel">
@@ -1,3 +1,4 @@
<!-- 页面编号F-01用途家族动态首页 -->
<template>
<view class="page-shell family-page">
<view class="family-top"><view><text class="top-kicker">家族共建</text><text class="page-name">家族记事</text></view><text class="publish" @click="publishFeed">发布动态</text></view>
@@ -30,10 +31,10 @@ onMounted(async () => {
if (!genealogyId.value) { loadError.value = '请先从“我的家谱”选择一个家谱。'; return }
try { feeds.value = await appApi.getFeeds(genealogyId.value) } catch (error) { loadError.value = error.message || '家族动态加载失败。' }
})
const openSection = (type) => uni.navigateTo({ url: `/pages/content/list?type=${type}&genealogyId=${genealogyId.value}` })
const openSection = (type) => uni.navigateTo({ url: `/pages/skeleton/content-list-skeleton?type=${type}&genealogyId=${genealogyId.value}` })
const publishFeed = () => {
if (!genealogyId.value) { uni.showToast({ title: '请先选择家谱', icon: 'none' }); return }
uni.navigateTo({ url: `/pages/content/editor?type=feed&genealogyId=${genealogyId.value}` })
uni.navigateTo({ url: `/pages/family/f02-publish-feed?type=feed&genealogyId=${genealogyId.value}` })
}
</script>
@@ -1,3 +1,4 @@
<!-- 页面编号F-02用途发布家族动态 -->
<template>
<view class="page-shell editor-page">
<PageHeader title="发布家族动态" />
@@ -1,13 +1,14 @@
<!-- 页面编号G-01用途我的家谱列表视觉基准已由用户验收地基迁移不得改变可见效果 -->
<template>
<view class="page-shell genealogy-index">
<image
class="page-paper-texture"
src="/static/assets/backgrounds/paper-rice-texture-v2.jpg"
src="/static/assets/foundation/opaque/page-paper.jpg"
mode="scaleToFill"
/>
<image
class="page-footer-landscape"
src="/static/assets/backgrounds/footer-mountain-bamboo.png"
src="/static/assets/foundation/transparent/footer-mountain-bamboo.png"
mode="scaleToFill"
/>
<PageHeader
@@ -28,14 +29,14 @@
<view class="current-slip" @click="openGenealogy(currentGenealogy)">
<image
class="current-frame"
src="/static/assets/backgrounds/genealogy-current-slip-frame.png"
src="/static/assets/modules/genealogy/transparent/current-slip-frame.png"
mode="scaleToFill"
/>
<view class="current-summary">
<view class="current-seal">
<image
class="current-seal-frame"
src="/static/assets/icons/genealogy/seal-current-frame-v1.png"
src="/static/assets/modules/genealogy/transparent/current-seal-frame.png"
mode="scaleToFill"
/>
<text class="current-seal-title">家谱</text>
@@ -47,7 +48,7 @@
<view class="current-meta-item">
<image
class="current-meta-icon"
src="/static/assets/icons/common/location-v1.png"
src="/static/assets/foundation/transparent/meta-location.png"
mode="aspectFit"
/>
<text class="current-meta-item-text">{{
@@ -57,7 +58,7 @@
<view class="current-meta-item">
<image
class="current-meta-icon"
src="/static/assets/icons/common/member-meta-v1.png"
src="/static/assets/foundation/transparent/meta-member.png"
mode="aspectFit"
/>
<text class="current-meta-item-text"
@@ -67,7 +68,7 @@
<view class="current-meta-item">
<image
class="current-meta-icon"
src="/static/assets/icons/common/admin-v1.png"
src="/static/assets/foundation/transparent/meta-admin.png"
mode="aspectFit"
/>
<text class="current-meta-item-text">管理员</text>
@@ -89,7 +90,7 @@
<image
class="section-divider"
src="/static/assets/backgrounds/genealogy-section-divider-v2.png"
src="/static/assets/modules/genealogy/transparent/section-divider.png"
mode="scaleToFill"
/>
@@ -120,18 +121,18 @@
<view class="create-action" @click="createGenealogy">
<image
class="create-cloud"
src="/static/assets/icons/action/create-cloud-v2.png"
src="/static/assets/modules/genealogy/transparent/create-cloud.png"
mode="aspectFit"
/>
<image
class="create-icon"
src="/static/assets/icons/action/add-v2.png"
src="/static/assets/modules/genealogy/transparent/add.png"
mode="aspectFit"
/>
<text>新建家谱</text>
<image
class="create-cloud create-cloud--right"
src="/static/assets/icons/action/create-cloud-v2.png"
src="/static/assets/modules/genealogy/transparent/create-cloud.png"
mode="aspectFit"
/>
</view>
@@ -145,7 +146,7 @@
<view class="empty-primary" @click="createGenealogy">
<image
class="create-icon"
src="/static/assets/icons/action/add-v2.png"
src="/static/assets/modules/genealogy/transparent/add.png"
mode="aspectFit"
/>
<text>新建家谱</text>
@@ -185,39 +186,39 @@ const shortcuts = [
{
key: "tree",
label: "世系图",
icon: "/static/assets/icons/genealogy/tree-v2.png",
icon: "/static/assets/modules/genealogy/transparent/shortcut-tree.png",
},
{
key: "members",
label: "成员",
icon: "/static/assets/icons/genealogy/members-v2.png",
icon: "/static/assets/modules/genealogy/transparent/shortcut-members.png",
},
{
key: "poem",
label: "字辈诗",
icon: "/static/assets/icons/genealogy/generation-poem-v2.png",
icon: "/static/assets/modules/genealogy/transparent/shortcut-generation-poem.png",
},
{
key: "applications",
label: "申请审核",
icon: "/static/assets/icons/genealogy/application-v2.png",
icon: "/static/assets/modules/genealogy/transparent/shortcut-application.png",
},
];
const openGenealogy = (genealogy) =>
uni.navigateTo({ url: `/pages/genealogy/detail?id=${genealogy.id}` });
uni.navigateTo({ url: `/pages/genealogy/g05-genealogy-overview?id=${genealogy.id}` });
const createGenealogy = () =>
uni.navigateTo({ url: "/pages/genealogy/create" });
const applyToJoin = () => uni.navigateTo({ url: "/pages/genealogy/search" });
uni.navigateTo({ url: "/pages/genealogy/g03-create-genealogy" });
const applyToJoin = () => uni.navigateTo({ url: "/pages/genealogy/g06-search-genealogies" });
const toNotifications = () =>
uni.navigateTo({ url: "/pages/notification/index" });
uni.navigateTo({ url: "/pages/notification/n01-message-center" });
const openShortcut = (key) => {
const paths = {
tree: "/pages/tree/index",
members: `/pages/genealogy/detail?id=${currentGenealogy.value.id}`,
poem: "/pages/content/list?type=poem",
applications: "/pages/genealogy/applications",
tree: "/pages/tree/t01-tree-overview",
members: `/pages/genealogy/g05-genealogy-overview?id=${currentGenealogy.value.id}`,
poem: "/pages/skeleton/content-list-skeleton?type=poem",
applications: "/pages/genealogy/g10-application-review",
};
uni.navigateTo({ url: paths[key] });
};
@@ -1,3 +1,4 @@
<!-- 页面编号G-03用途创建家谱表单 -->
<template>
<view class="page-shell create-page">
<PageHeader title="创建家谱" />
@@ -49,7 +50,7 @@ const submit = async () => {
}
const created = await appApi.createGenealogy({ ...form })
genealogyContext.setCurrentGenealogyId(created.id)
uni.redirectTo({ url: `/pages/lineage/first-person?genealogyId=${created.id}` })
uni.redirectTo({ url: `/pages/genealogy/g04-first-ancestor?genealogyId=${created.id}` })
}
</script>
@@ -1,3 +1,4 @@
<!-- 页面编号G-04用途创建家谱后的始祖录入 -->
<template>
<view class="page-shell first-person-page">
<PageHeader title="录入首代人物" />
@@ -35,7 +36,7 @@ const submit = async () => {
isSubmitting.value = true
try {
const person = await appApi.createPerson(genealogyId.value, { ...form, personName: form.personName.trim() })
uni.redirectTo({ url: `/pages/tree/index?genealogyId=${genealogyId.value}&selectedId=${person.id}` })
uni.redirectTo({ url: `/pages/tree/t01-tree-overview?genealogyId=${genealogyId.value}&selectedId=${person.id}` })
} catch (error) {
uni.showToast({ title: error.message || '保存失败,请稍后重试', icon: 'none' })
} finally {
@@ -1,3 +1,4 @@
<!-- 页面编号G-05用途家谱总览 -->
<template>
<view class="page-shell detail-page">
<PageHeader title="家谱总览" action="管理" @action="showSoon" />
@@ -52,10 +53,10 @@ const loadGenealogy = async (id) => {
}
onLoad((query) => loadGenealogy(query.id))
const toTree = () => uni.navigateTo({ url: `/pages/tree/index?genealogyId=${genealogyId.value}` })
const toFirstPerson = () => uni.navigateTo({ url: `/pages/lineage/first-person?genealogyId=${genealogyId.value}` })
const toFamily = () => uni.reLaunch({ url: '/pages/family/index' })
const toApplications = () => uni.navigateTo({ url: `/pages/genealogy/applications?genealogyId=${genealogyId.value}` })
const toTree = () => uni.navigateTo({ url: `/pages/tree/t01-tree-overview?genealogyId=${genealogyId.value}` })
const toFirstPerson = () => uni.navigateTo({ url: `/pages/genealogy/g04-first-ancestor?genealogyId=${genealogyId.value}` })
const toFamily = () => uni.reLaunch({ url: '/pages/family/f01-family-feed' })
const toApplications = () => uni.navigateTo({ url: `/pages/genealogy/g10-application-review?genealogyId=${genealogyId.value}` })
const showSoon = () => uni.showToast({ title: '该模块将在后续阶段接入', icon: 'none' })
</script>
@@ -1,3 +1,4 @@
<!-- 页面编号G-06用途公开家谱搜索 -->
<template>
<view class="page-shell search-page">
<PageHeader title="查找家谱" />
@@ -1,3 +1,4 @@
<!-- 页面编号G-10用途管理员入谱申请审核 -->
<template>
<view class="page-shell applications-page">
<PageHeader title="入谱审核" action="审核说明" @action="showHelp" />
@@ -1,3 +1,4 @@
<!-- 页面编号N-01用途消息中心 -->
<template>
<view class="page-shell notification-page">
<PageHeader title="消息通知" action="全部已读" @action="readAll" />
@@ -1,3 +1,4 @@
<!-- 页面编号M-01用途我的首页 -->
<template>
<view class="page-shell profile-page">
<view class="profile-hero"><view class="profile-seal">{{ profile.name ? profile.name.slice(0, 1) : '谱' }}</view><view class="profile-copy"><text class="profile-name">{{ profile.name || '家谱用户' }}</text><text class="profile-meta">{{ profile.phone || '资料加载中' }} · {{ profile.role || '家谱成员' }}</text></view><text class="profile-edit" @click="showSoon">资料</text></view>
@@ -24,7 +25,7 @@ const serviceItems = ['帮助中心', '意见反馈', 'VIP 服务']
onMounted(async () => {
try { profile.value = await appApi.getProfile() } catch (error) { loadError.value = error.message || '个人资料加载失败。' }
})
const toNotifications = () => uni.navigateTo({ url: '/pages/notification/index' })
const toNotifications = () => uni.navigateTo({ url: '/pages/notification/n01-message-center' })
const showSoon = () => uni.showToast({ title: '该服务将按计划逐步开放', icon: 'none' })
</script>
@@ -1,3 +1,4 @@
<!-- 页面编号S-01用途多类型内容列表功能骨架不计为任何已完成设计页面 -->
<template>
<view class="page-shell content-page">
<PageHeader :title="config.title" />
@@ -1,3 +1,4 @@
<!-- 页面编号T-01用途世系树总览 -->
<template>
<view class="tree-page">
<PageHeader title="世系树" action="树形视图" />
@@ -38,7 +39,7 @@ const loadTree = async (query) => {
onLoad(loadTree)
const nodeStyle = (member) => ({ left: `${member.x}%`, top: `${member.y}%` })
const toMember = () => uni.navigateTo({ url: `/pages/member/detail?genealogyId=${genealogyId.value}&personId=${selected.value.id}` })
const toMember = () => uni.navigateTo({ url: `/pages/tree/t03-member-profile?genealogyId=${genealogyId.value}&personId=${selected.value.id}` })
const showSoon = () => uni.showToast({ title: '亲属关系编辑将在下一阶段接入', icon: 'none' })
</script>
@@ -1,3 +1,4 @@
<!-- 页面编号T-03用途成员档案详情 -->
<template>
<view class="page-shell member-page">
<PageHeader title="成员档案" action="编辑" @action="showSoon" />