diff --git a/.gitignore b/.gitignore
index 4c5993c..4328ac1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,53 @@
-/tmp/
-/unpackage/
-/docs/superpowers/specs/design/
-/docs/design/screens/runtime/
-/tmp-g01-icon-audit.png
-/node_modules/
-**/node_modules/
-/design-pipeline/generated/
-/docs/design/assets/a01-vnext/candidates/
-/docs/design/assets/a01-vnext/review/
-/.superpowers/
-/runtime/
-**/__pycache__/
-*.py[cod]
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.log.gz
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
+
+.flattened-pom.xml
+/.maven-home/.msp/incrementMark
+
+robots.txt
+sitemap.xml
diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json
new file mode 100644
index 0000000..8ae452a
--- /dev/null
+++ b/.hbuilderx/launch.json
@@ -0,0 +1,9 @@
+{
+ "version" : "1.0",
+ "configurations" : [
+ {
+ "playground" : "standard",
+ "type" : "uni-app:app-android"
+ }
+ ]
+}
diff --git a/components/ModulePage.vue b/components/ModulePage.vue
index 32e02ea..53a8ce1 100644
--- a/components/ModulePage.vue
+++ b/components/ModulePage.vue
@@ -142,7 +142,7 @@
block
:type="moduleState === 'error' ? 'secondary' : 'primary'"
:label="stateCopy.action"
- @click="moduleState = 'ready'"
+ @click="handleStateAction"
/>
@@ -212,9 +212,11 @@ const normalizedNote = computed(() =>
);
const normalizedSectionCopy = (copy) =>
String(copy || "").replace(/待接入|功能待接入/g, "后续功能阶段开放");
-const stateCopy = computed(
- () =>
- ({
+const stateCopy = computed(() => {
+ const pageState = page.value.states?.[moduleState.value];
+ if (pageState) return pageState;
+ return (
+ {
empty: {
eyebrow: "暂无内容",
title: `还没有${page.value.title}记录`,
@@ -233,8 +235,16 @@ const stateCopy = computed(
copy: "请稍后重新进入,现有资料不会受到影响。",
action: "重新查看",
},
- })[moduleState.value] || {},
-);
+ }[moduleState.value] || {}
+ );
+});
+const handleStateAction = () => {
+ if (stateCopy.value.actionMode === "back") {
+ uni.navigateBack();
+ return;
+ }
+ moduleState.value = "ready";
+};
const completeAction = () => {
moduleState.value = "success";
};
@@ -308,8 +318,14 @@ onUnmounted(() => {
}
.form-row {
position: relative;
- height: 84rpx;
+ display: grid;
+ grid-template-columns: auto minmax(0, 1fr);
+ min-height: 84rpx;
+ align-items: center;
+ gap: 22rpx;
margin-top: 14rpx;
+ padding: 14rpx 26rpx;
+ box-sizing: border-box;
}
.form-row image,
.detail-card image,
@@ -320,27 +336,24 @@ onUnmounted(() => {
inset: 0;
width: 100%;
height: 100%;
+ pointer-events: none;
}
.form-row > text {
- position: absolute;
- top: 28rpx;
- left: 26rpx;
+ position: relative;
z-index: 1;
color: $ink;
font-size: 24rpx;
font-weight: 700;
}
.form-row input {
- position: absolute;
- top: 0;
- right: 22rpx;
- bottom: 0;
- left: 178rpx;
+ position: relative;
z-index: 1;
- height: 84rpx;
+ width: 100%;
+ min-width: 0;
+ height: 56rpx;
color: $ink;
font-size: 23rpx;
- line-height: 84rpx;
+ text-align: right;
}
.form-placeholder {
color: #9e8e79;
@@ -448,13 +461,18 @@ onUnmounted(() => {
}
.settings-row {
position: relative;
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) auto;
min-height: 94rpx;
+ align-items: center;
+ gap: 20rpx;
margin-top: 14rpx;
+ padding: 20rpx 28rpx 18rpx 26rpx;
+ box-sizing: border-box;
}
.settings-row > view {
position: relative;
z-index: 1;
- padding: 20rpx 98rpx 18rpx 26rpx;
}
.settings-row > view text:first-child {
color: $ink;
@@ -467,9 +485,7 @@ onUnmounted(() => {
font-size: 21rpx;
}
.settings-row > text {
- position: absolute;
- top: 34rpx;
- right: 28rpx;
+ position: relative;
z-index: 1;
color: $brand-red;
font-size: 21rpx;
@@ -540,8 +556,8 @@ onUnmounted(() => {
padding-right: 20rpx;
padding-left: 20rpx;
}
- .form-row input {
- left: 162rpx;
+ .form-row {
+ gap: 14rpx;
}
.status-card__body {
padding-right: 44rpx;
diff --git a/components/PageHeader.vue b/components/PageHeader.vue
index ac02058..49e9762 100644
--- a/components/PageHeader.vue
+++ b/components/PageHeader.vue
@@ -1,5 +1,6 @@
+
+
diff --git a/pages/family/f08-album-detail.vue b/pages/family/f08-album-detail.vue
index 00b4946..c3fb013 100644
--- a/pages/family/f08-album-detail.vue
+++ b/pages/family/f08-album-detail.vue
@@ -1,5 +1,342 @@
-
+
+
+
+
+
+
+
+
+ 相册状态
+ 相册已失效
+ 这个相册已无法查看
+
+
+
+
+
+
+ 家族影像 · 2024
+ 2024 春节团圆
+ 一家人围坐团圆,让今朝欢聚与祖居旧影留在同一本相册里。
+ {{ albumState === "empty" ? "0 张照片" : "5 张照片" }}
+
+
+
+
+ 照片墙
+ 相册里还没有照片
+ 添加第一张团圆影像,把值得珍藏的时刻留在这里。
+
+
+
+
+
+
+ {{ photos[0].caption }}
+
+
+
+
+
+ {{ photo.caption }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 照片预览
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/family/f09-media-upload.vue b/pages/family/f09-media-upload.vue
index 648e7a2..8d66db4 100644
--- a/pages/family/f09-media-upload.vue
+++ b/pages/family/f09-media-upload.vue
@@ -1,5 +1,656 @@
-
-
+
+
+
+
+
+
+
+
+
+
+ 当前相册
+ 2024 春节团圆
+ 最多可选择 9 张
+
+
+
+
+ 照片访问权限
+ 需要照片访问权限
+ 授权后才能选择要加入当前相册的照片;当前仅展示 H5 审核状态。
+
+
+
+
+
+
+ 上传结果
+ 4 张照片已上传
+ 照片已加入“2024 春节团圆”,可以返回相册继续查看。
+
+
+
+
+
+
+
+ 选择照片
+ {{ selectedPhotos.length }} / {{ MAX_PHOTOS }}
+
+
+
+
+
+ {{ index + 1 }}
+ 当前
+
+ 删除
+
+ 上传失败
+ {{ photo.progress }}%
+ 已上传
+
+
+
+ {{
+ selectedPhotos.length ? "继续添加" : "选择照片"
+ }}
+ {{
+ selectedPhotos.length ? `还可选择 ${MAX_PHOTOS - selectedPhotos.length} 张` : "最多 9 张"
+ }}
+
+
+
+
+
+
+ 整批说明必填
+
+
+
+ {{
+ validationMessage
+ }}
+
+
+
+
+
+ 第 {{ activePhotoIndex + 1 }} 张 / 共
+ {{ selectedPhotos.length }} 张
+ 正在编辑此照片的说明
+
+
+
+ 当前照片说明选填
+
+
+
+
+
+
+ 正在上传 2/{{ selectedPhotos.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/family/f10-video-list.vue b/pages/family/f10-video-list.vue
index b70ec89..af868d3 100644
--- a/pages/family/f10-video-list.vue
+++ b/pages/family/f10-video-list.vue
@@ -1,5 +1,143 @@
-
-
+
+
+
+
+
+
+
+
+
+ 记录会动的家族记忆
+
+
+
+
+
+ 视频 · 服务说明
+ 视频服务暂未开放
+ 开放后可在这里浏览家族影像与纪念视频
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/profile/m01-profile-home.vue b/pages/profile/m01-profile-home.vue
index 6ae2ee5..bb3fc27 100644
--- a/pages/profile/m01-profile-home.vue
+++ b/pages/profile/m01-profile-home.vue
@@ -194,8 +194,14 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
}
.profile-hero {
position: relative;
+ display: grid;
+ grid-template-columns: 42rpx minmax(0, 1fr);
width: 100%;
min-height: 252rpx;
+ align-items: center;
+ gap: 30rpx;
+ padding: 34rpx 52rpx 32rpx 40rpx;
+ box-sizing: border-box;
overflow: hidden;
}
.profile-hero__frame {
@@ -203,6 +209,7 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
inset: 0;
width: 100%;
height: 100%;
+ pointer-events: none;
}
.profile-hero__hall {
position: absolute;
@@ -211,6 +218,7 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
width: 330rpx;
height: 122rpx;
opacity: 0.12;
+ pointer-events: none;
}
.profile-hero__cloud {
position: absolute;
@@ -219,11 +227,10 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
width: 96rpx;
height: 52rpx;
opacity: 0.32;
+ pointer-events: none;
}
.profile-hero__label {
- position: absolute;
- top: 50%;
- left: 40rpx;
+ position: relative;
z-index: 2;
display: flex;
width: 42rpx;
@@ -240,7 +247,6 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
font-family: STKaiti, KaiTi, serif;
font-size: 21rpx;
line-height: 1.12;
- transform: translateY(-50%);
}
.profile-identity {
position: relative;
@@ -250,7 +256,6 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
box-sizing: border-box;
align-items: center;
gap: 24rpx;
- padding: 34rpx 52rpx 32rpx 112rpx;
}
.profile-identity__seal {
width: 92rpx;
@@ -291,6 +296,7 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
inset: 0;
width: 100%;
height: 100%;
+ pointer-events: none;
}
.profile-scroll-notice__copy {
position: relative;
@@ -395,6 +401,7 @@ const openItem = (item) => uni.navigateTo({ url: item.url });
width: 100%;
height: 220rpx;
min-height: 118px;
+ pointer-events: none;
}
.profile-error__copy {
position: relative;
diff --git a/pages/records/r01-people-list.vue b/pages/records/r01-people-list.vue
index c353561..f4521c4 100644
--- a/pages/records/r01-people-list.vue
+++ b/pages/records/r01-people-list.vue
@@ -201,24 +201,28 @@ onUnmounted(() => {
}
.people-search {
position: relative;
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) 126rpx;
width: 100%;
height: 82rpx;
min-height: 44px;
+ align-items: center;
}
.people-search > image {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
+ pointer-events: none;
}
.people-search input {
- position: absolute;
+ position: relative;
z-index: 1;
- top: 0;
- right: 126rpx;
- bottom: 0;
- left: 31rpx;
+ width: 100%;
+ min-width: 0;
height: 100%;
+ padding-left: 31rpx;
+ box-sizing: border-box;
color: $ink;
font-size: 24rpx;
}
@@ -226,10 +230,8 @@ onUnmounted(() => {
color: #8a7965;
}
.people-search__action {
- position: absolute;
+ position: relative;
z-index: 2;
- top: 0;
- right: 0;
display: flex;
width: 126rpx;
height: 100%;
@@ -245,9 +247,13 @@ onUnmounted(() => {
}
.person-card {
position: relative;
+ display: flex;
width: 100%;
height: clamp(92px, 190rpx, 108px);
+ align-items: center;
margin-top: 12px;
+ padding: 16% 10%;
+ box-sizing: border-box;
}
.person-card:first-child {
margin-top: 0;
@@ -257,12 +263,13 @@ onUnmounted(() => {
inset: 0;
width: 100%;
height: 100%;
+ pointer-events: none;
}
.person-card__copy {
- position: absolute;
+ position: relative;
z-index: 1;
- inset: 16% 10%;
display: flex;
+ width: 100%;
flex-direction: column;
justify-content: center;
}
@@ -300,6 +307,7 @@ onUnmounted(() => {
width: 100%;
height: 220rpx;
min-height: 118px;
+ pointer-events: none;
}
.people-result-empty > view,
.people-state-card > view {
diff --git a/pages/records/r02-person-detail.vue b/pages/records/r02-person-detail.vue
index ff16647..1b527e3 100644
--- a/pages/records/r02-person-detail.vue
+++ b/pages/records/r02-person-detail.vue
@@ -1,5 +1,155 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ person.name }}
+ {{ person.role }} · 第 {{ person.generation }} 世
+ 人物录档案
+
+
+
+
+
+
+
+ {{ item.title }}{{ item.copy }}
+
+
+
+
+
+
+
+ {{ field.label }}
+
+ {{ errors[field.key] }}
+
+
+
+ {{ field.label }}
+
+
+
+
+
+
+
+
+
+
+ 部分资料未公开人物小传与家族印记受隐私设置保护,当前只展示公开身份。
+
+
+
+
+
+
+ {{ personState === 'expired' ? '人物档案已失效' : '人物档案暂不可用' }}
+ {{ personState === 'expired' ? '这份人物资料已无法查看,请返回人物录选择其他档案。' : '请稍后重新查看,已有资料不会受到影响。' }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/tree/t01-tree-overview.vue b/pages/tree/t01-tree-overview.vue
index 504ef20..893e2bd 100644
--- a/pages/tree/t01-tree-overview.vue
+++ b/pages/tree/t01-tree-overview.vue
@@ -25,48 +25,46 @@
-
-
+
+
+
+
+ {{ row.label }}
+ {{ row.summary }}
+
+
+
+
+
-
+
+
-
-
- 同代分支可左右查看
-
-
-
-
- 第十二世 · 始祖
-
-
-
- 第十三世 · 两房
-
-
-
- 第十四世 · 三支
-
+
+
+ 同代分支可左右查看
+
@@ -103,31 +101,32 @@
>
{{ member.years }}
-
+
-
-
-
- {{
- stateCopy.eyebrow
- }}
- {{ stateCopy.title }}
- {{ stateCopy.copy }}
-
-
- {{ stateCopy.action }}
+
+
+
+ {{
+ stateCopy.eyebrow
+ }}
+ {{ stateCopy.title }}
+ {{ stateCopy.copy }}
+
+
+ {{ stateCopy.action }}
+
-
-
+
+
-
-
- 查看资料
-
-
-
- 添加亲属
-
+
+
@@ -165,6 +161,7 @@