diff --git a/README.en.md b/README.en.md
index d2750b9..caa3cd9 100644
--- a/README.en.md
+++ b/README.en.md
@@ -1,7 +1,7 @@
# petstore-frontend
#### Description
-宠伴生活馆
+宠小它
#### Software Architecture
Software architecture description
diff --git a/README.md b/README.md
index 1f60fed..508d922 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-# 宠伴生活馆 - UniApp 项目
+# 宠小它 - UniApp 项目
+
+> 品牌:宠小它 · 用心宠小它,温暖伴一生 · 智慧宠物门店服务系统
从 H5 (Vite+Vue3+Vant) 迁移到 UniApp+Vue3,用于生成微信小程序。
@@ -128,3 +130,8 @@ npm run dev:h5
### 报告分享链接与二维码(小程序)
「生成报告」弹层里的链接与二维码指向 **H5** `report.html?token=`,需与线上部署的静态站点一致。请在对应环境的 `.env` / `.env.production` 中配置 **`VITE_REPORT_PUBLIC_ORIGIN`**(例如 `https://www.example.com`,无尾斜杠)。未配置时仍可复制话术,但链接为空、二维码不展示,并会在弹层内提示。
+
+### 宠主预约草稿(P0 C3)
+
+当前实现:**已登录**用户在 `CustAppointmentCreate` 填写的内容会 debounce 写入本地 `uni.storage`(7 天有效),离开页/重进可恢复;提交成功会清除草稿。
+产品文档中的 **「未登录可先填单、提交时再登录并恢复草稿」** 需同时将「新建预约」页加入公开路由(如 `App.vue` 的 `isPublicRoute`)并在登录回跳后合并草稿;若未做公开路由,未登录用户仍会在进入预约页前被拦截到登录。
diff --git a/index.html b/index.html
index 81fc441..8c96816 100644
--- a/index.html
+++ b/index.html
@@ -3,8 +3,8 @@
-
{{ reportData.store?.name || '宠伴生活馆' }}
-
宠物服务,让爱更专业
+
{{ reportData.store?.name || '宠小它' }}
+
用心宠小它,温暖伴一生
服务报告
@@ -134,6 +138,7 @@
import { ref, computed, onMounted } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { getReportByToken, imgUrl, submitReportTestimonial } from '../api/index.js'
+import { trackReportOpen, getReportByTokenWithTimeout } from '../utils/reportOpenTrack.js'
import { drawReportPoster, POSTER_W, computePosterLogicalHeight } from '../utils/reportPosterDraw.js'
import { formatDateTimeYMDHM } from '../utils/datetime.js'
import AppIcon from '../components/AppIcon.vue'
@@ -235,9 +240,10 @@ const loadReport = async () => {
loading.value = true
try {
- const res = await getReportByToken(token)
+ const res = await getReportByTokenWithTimeout(getReportByToken, token)
if (res && res.code === 200 && res.data) {
reportData.value = res.data
+ trackReportOpen(token)
} else if (res && res.code === 404) {
reportData.value = null
notFound.value = true
@@ -247,7 +253,8 @@ const loadReport = async () => {
}
} catch (e) {
reportData.value = null
- loadError.value = NETWORK_ERROR_MSG
+ loadError.value =
+ e && e.message === 'TIMEOUT' ? '加载超时,请检查网络后重试' : NETWORK_ERROR_MSG
} finally {
loading.value = false
}
@@ -469,4 +476,14 @@ onMounted(() => loadReport())
.section-label { font-size: 15px; font-weight: 700; color: #1f2937; margin-bottom: 10px; }
.remark-content { background: #f8fafc; border: 1px solid #e8edf4; border-radius: 12px; padding: 14px; font-size: 14px; color: #64748b; line-height: 1.6; min-height: 60px; }
.action-section { margin: 0 16px 24px; }
+.report-privacy-bar {
+ margin: 0 16px 12px;
+ padding: 10px 12px;
+ font-size: 12px;
+ color: #92400e;
+ line-height: 1.45;
+ background: #fffbeb;
+ border: 1px solid #fde68a;
+ border-radius: 10px;
+}