From 97f3aa35a9f74c082ed93259a62d2348c9d44e21 Mon Sep 17 00:00:00 2001 From: MaDaLei Date: Sun, 19 Apr 2026 14:26:25 +0800 Subject: [PATCH] deploy: update docs --- P0-研发落地清单.md | 108 ++++++++++++++++ logo-concept-draft.png | Bin 0 -> 78417 bytes 产品全方位优化说明-v1.md | 191 +++++++++++++++++++++++++++++ 产品改进建议.md | 9 +- 产品设计文档.md | 13 +- 公众号协同与全链路触达-产品说明.md | 161 ++++++++++++++++++++++++ 前端UI规范.md | 21 ++-- 品牌替换清单-宠小它.md | 109 ++++++++++++++++ 宠小它-Logo与品牌识别说明.md | 92 ++++++++++++++ 本期主线-下一步产品优化点.md | 1 + 洗美报告短视频成片方案.md | 2 +- 11 files changed, 693 insertions(+), 14 deletions(-) create mode 100644 P0-研发落地清单.md create mode 100644 logo-concept-draft.png create mode 100644 产品全方位优化说明-v1.md create mode 100644 公众号协同与全链路触达-产品说明.md create mode 100644 品牌替换清单-宠小它.md create mode 100644 宠小它-Logo与品牌识别说明.md diff --git a/P0-研发落地清单.md b/P0-研发落地清单.md new file mode 100644 index 0000000..6712a5e --- /dev/null +++ b/P0-研发落地清单.md @@ -0,0 +1,108 @@ +# 宠小它 — P0 研发落地清单 + +> 用途:发给研发拆任务与验收;**仅含 P0**(本期质量与主线闭环必需,不含 P1/P2 增强)。 +> 依据:《产品全方位优化说明 v1》《本期主线》《宠主端预约体验优化》《产品设计文档》及当前仓库实现粗对齐。 +> 更新:2026-04-19 + +**关联**: [产品全方位优化说明-v1](./产品全方位优化说明-v1.md) · [本期主线-下一步产品优化点](./本期主线-下一步产品优化点.md) · [宠主端预约体验优化-产品说明](./宠主端预约体验优化-产品说明.md) + +--- + +## 优先级说明 + +- **P0**:本迭代必须交付;阻塞对外口碑、数据脏读、合规提示缺失、或主线(传播/成片/留资)不可用。 +- 已部分实现的项:**仍保留**,以下方「验收标准」为准做 gap 关闭。 + +--- + +## A. 后端(Spring Boot) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **A1** | **预约状态机校验**:`PUT /appointment/status`(及任意改状态入口)禁止非法迁移 | 仅允许:`new→doing`、`new→cancel`、`doing→done`(若报告提交会改 done 则接口侧与之一致)、`doing→cancel`(若产品允许,需与前端一致;**若产品规定仅 new 可取消**则 `doing→cancel` 返回 `CANCEL_NOT_ALLOWED`) | 当前 `AppointmentService.updateStatus` / `startService` 偏「直接赋值」,需按《产品设计文档》矩阵校验;非法迁移返回 **4xx + 明确业务码**(如 `INVALID_STATUS`) | +| **A2** | **开始服务**仅当 `status=new` | `startService` 非 `new` 时拒绝,勿静默改库 | 与「谁点谁服务」一致 | +| **A3** | **取消预约**(若独立接口)校验:仅允许目标状态为 `cancel` 且前置状态符合产品规则 | 与 A1 同一套状态机;前端取消按钮仅 `new` 时展示则后端仍要防篡改 | 防恶意请求 | +| **A4** | (可选 P0,若本期上留资)**留资去重**:同一 `report_token` + 同一手机号 | 二次提交返回成功态或「已提交」语义,不重复插库 | 口径见《本期主线》C | + +--- + +## B. 小程序 — 门店端(老板/员工) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **B1** | **「已完成」Tab 列表默认不含已取消** | Tab「已完成」下默认仅展示 `status===done`;`cancel` 通过 **次级筛选**(如「包含已取消」开关)或 **单独子 Tab「已取消」** 二选一实现 | 当前 `Home.vue` 约 `currentStatus==='done'` 时含 `cancel`,需改 | +| **B2** | **发送报告成功页**:同屏 **报告链接 + 二维码 + 两条可复制话术** | 话术支持变量:`{宠物名}{服务类型}{门店名}{链接}`;一键复制单条话术;二维码与链接不拆多页 | 对齐《本期主线》A「员工动作成本」 | +| **B3** | **报告提交锁死提示** | 填写报告页底部或提交前弹窗固定文案:**「提交后不可修改,请确认照片与备注无误」**(与产品 v1 锁死策略一致) | 若已有则核对文案 | +| **B4** | **「我的」老板端分组标题** | 至少两组:`店铺与经营` / `团队与账号`(或等价命名),高频在上;使用现有 `.module-title` | 降低入口迷失,见《产品全方位优化说明》§2.2 | + +--- + +## C. 小程序 — 宠主端(customer) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **C1** | **单一主预约路径** | 首屏仅保留 **一个**主级「预约服务」入口;**不再同屏强并存**「大按钮 + 空态大按钮 + FAB +」等效重复(保留 FAB 则须显著弱于主按钮或仅老用户) | 见《宠主端预约体验优化》§9;需对照当前 `Home.vue` 是否仍重复 | +| **C2** | **扫码 / 分享落地 `storeId`** | `CustAppointmentCreate` 支持 `onLoad` 读 `storeId`(已有则做 **全入口** 回归:普通二维码、小程序码 scene、分享 path/query) | 预填门店且可「更换门店」 | +| **C3** | **登录时机与草稿** | 业务规则二选一落地并写 README:**(1)** 未登录可填单,提交时再登录,返回后 **草稿恢复**;**(2)** 进入预约页即要求登录。推荐 (1) | `uni.storage` 或状态恢复;避免白填 | +| **C4** | **异常可理解** | 无可用时段、网络失败、未登录:均有 **toast / 空态 / 重试**,禁止静默失败 | 专文 §7 | + +--- + +## D. H5 报告页(`report-view` / 独立 H5) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **D1** | **隐私提示(短期策略)** | 首屏或固定条:**「本页含宠物服务影像,请勿公开转发或发群」**(文案可微调,须合规友好) | 对齐《本期主线》A token 风险 | +| **D2** | **短片三态与文案对齐小程序** | `processing / failed / success` 与 `ReportHighlightBlock` 一致;失败展示 **归类中文**,不暴露堆栈;成功展示可变时长说明 | H5 与小程序报告页行为一致 | +| **D3** | **弱网 / 失败重试** | 报告主接口失败:**按钮「重新加载」**;超时阈值产品建议 **8~10s** 后出失败态 | 与《产品全方位优化说明》§3.3 | + +--- + +## E. 传播与埋点(P0 最小集) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **E1** | **分享卡片元信息规则** | 小程序 `onShareAppMessage`:标题 **宠物名 + 服务 + 门店**;封面优先级 **成片封面 > 服务后首图 > Logo**(与 `reportShare.js` 逻辑对齐) | 见 `frontend/src/utils/reportShare.js` | +| **E2** | **埋点:报告打开** | 至少上报:`report_token` 或匿名 hash、**首次/再次**(可用本地 storage 记首次)、时间戳;落地页 H5 亦要能报(像素/接口二选一,研发定方案) | 不要求看板,要求 **可统计**《本期主线》 | + +--- + +## F. 视觉与规范(工程债) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **F1** | **禁止业务页硬编码主色** | 主色/品牌浅底统一 `var(--c-brand)`、`var(--c-brand-light)` 等;全局 grep `#16a34a`、`#2db96d`(除 `global.css` / 极少量渐变定义)**业务 vue 内为 0** | 《前端 UI 规范》已对齐 `--c-*` | +| **F2** | **空态禁用 emoji 作主视觉**(若违反现有 UI 禁止项) | 宠主空态等用 `AppIcon` 或插图占位,不用 📋 等作为主视觉 | 见 `Home.vue` 空态 slot | + +--- + +## G. 文案与对外承诺(配置级) + +| ID | 需求 | 验收标准 | 备注 | +|----|------|----------|------| +| **G1** | **无容量模型不写「排队」** | 全局检索「排队」「不排队」;宠主副标题等改为不承诺排队能力的表述(如「在线选时段」) | 与《产品全方位优化说明》D2 一致 | +| **G2** | **对内录单表述(可选)** | 门店端新建预约入口文案是否改为「代客预约」由产品拍板;若改则全局统一 | 降低「预约」歧义 | + +--- + +## 建议排期顺序(供研发参考) + +1. **A1~A3**(后端状态机)— 防脏数据,优先合。 +2. **B1**(已完成 Tab)— 前端小改、用户感知强。 +3. **B2、D1、D2、E1**(传播与报告体验)— 主线门面。 +4. **C1~C4**(宠主)— 与登录/路由并行可排。 +5. **E2、F1、F2、G1** — 可并行或插空。 + +--- + +## 不在 P0(勿与本清单混排) + +- 会员卡 / 储值 / 次卡 +- 报告 token **作废重发**(中期,见 D3 决策) +- 多技师分成、排班深度联动 +- 复杂数据看板、漏斗大屏 +- 分包优化(可 P1) + +--- + +*评审后可将本页 ID 勾进看板;与专文冲突以迭代评审为准。* diff --git a/logo-concept-draft.png b/logo-concept-draft.png new file mode 100644 index 0000000000000000000000000000000000000000..1993f7146e98cf29b31954efe3c5850e9171f535 GIT binary patch literal 78417 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 z zYSu=@&7}Plc2u9r#&Q&@714mLD;G1^R< zIxU^k-yrKtYdVYHxxd6oh8xg=n~WH@(geO0NB*cZIxIa%`j}MBxl*spzO1&qcbHmz z{AM=E0q=4pIR0?_Y*DdwJZ^c!x?IEbtEzIegWTH>$q#_Uh`n}tNx>8-ch}tOBMU5* zn~XVJkQZxCC0Wd+cpxcS-`MeC*`q3uhg2oc+{d7e2ZAWue{<$0m2vQh-r}97E~_R` zgAD4y?qTH#AK8%#Z>p(fev!HQn|XR-Lro9*2D_bQd~NWK#j<&GnA=7uw8M>ra-6r` zY$j!?00rMmy6O6d$-x_3-3+lr0NF1ii}iB|v69(uisE5&OM& zmu=6%eLbLI(UH}H98p~mN1T4-w_W84cA$>GWE&vfwX#`E?9cIzGue3SAC4=L{mo@_I9b5%YIGZ?IXLO`U0nkpjFPscRJ z;>JGA^zLLS6rjV+Q+G$Ob&d9dLxF~;t&lHvciLnkw4Cq1oRSHge#pJY*LQm=zwy%c%~T()z~sdF zXp>TFK29MP1`*|UEzcjoxk+PQw=wkuskNLeRSU#%_oBBeO?+5iuFFcVMj1&fi&N&v1Xp#kDZHX?Mi5=ihh3{Lo3T0Rxf=hL$x%%Ue8>remg za|I-8-DiA%?#Z8EKC8F zMIvJEwrGNL*D@+Kx+%`Ry=(vueVCYFsFh$qGND4OrSJMFot|rIIaYrRxRN;r+uGN< z{O)bV1Bv&kSH_49Kl28?bfNz6fzAtdFdCo!ogjQE4+KhJfDculT;1d5+nOiWOA=LX zR90x@cQ-J`@GYt3FqoxNv=NaKA*&d32fxdkObAHw#e^?}$xw8eETPq`nw{1C^e++qPg@if}Okd;q7^x z{Ih8<_%bUkO}QsL_DQCmv9vuylnV1H8du@L#)_|lxI{$et^|F(8{JVCg$RoDj~Km+ zCyx`VcVIvNd~3D)2MUjWU)peFdTnfQlTcOdE?ZA%o-Q0A0302!VVeETQL+OPf$byvLAr*oMw7ucmPAy;{-tP~S67(S8R7a#L@EUMvIVbS7aeLz@{1vI zA&_8M;4)}7SLo{E+F*F#LhTnRn&U4jo>LM0r0q3gjY$ERAe z5?ztX+u`y!uS7#HnaILdt31U+)*T(2K7~jc%bFP$22B)QLVa>g?z@?LXE|hV{g7HH z{s$Fl(lw>~S8~NjA~no7C-?aC&ra#WxjhXQ-**Q*u9qP!zd=0Y$76f@)U&fNR`QfWKJv?Rk$}fXoQ3P>#CjR(n-#fF ziIXn*0bFY)hlYtNcWJDp7YIxBd_SuSQ~!SXz#a#tGA?VDzG(c}sWjxUmjr+48rj|9 z+SjBq$Dbl z7c?Y`Uz>H51H~*~vt1z@n)JnddlQgxpsgOzi5p`Q!WC_zO zwp(um4i(CL?%&B>@HBppuG+bN{*$?7PH5qpxQ3S3G?WxSvG$VsXP7<9e)`@9l}m5w zyN86Y9Pp@$J49N5VrI9CgN%bI$uhVtwU7G20mB8hzByu8zTmK-h;`zGB#a^(F2f9rwJWU%D^4;T89 zV18E&xf}D@$s$0F)zJx`Ef9%-8epb@t4b!F#Y|ame@uBWEhQ}|T((fkkkFktLp2}c zBB4K(;%5uzW+l=0w<^swz%~EmJ*G#oxtGUsWsJ6pBQfl`^rqk)(D;4glS zxmTO5Ahs;ve}04v?;%%p&I5E=D=?al2AGbb{g6j3;4cpD>8(Foeg;%$gPq zL&0W!cRf6*xLdo$SN@G;c}LPUQ{e3PeRu8tVg}jZS3RPD7E3Gf*php_^{)1;1W)K- zQ>}#Q^+6OBY;=(v?SWz8^>N_wT6)8}vD$4otGY%{U>d3b_%YEUaKZ3N6}g$(NyS1- zEEE11vBXiJ-uu->E@a@PYGF)n>bmvje84e4V*&iJV@z`)+l0fXQa$de6i8$Im)SE6 zep~pglq2#@+fs+Uo(0>|AqWD6tPeg>x>c&BK!Y416_yQ~7_>vF{sba3|F zmUmi(h|+l+%}MB6>hBMnfp)E|$3$V34W6|F$I|JPJ&^lXQB^PN+UH9rv8Hu-Gyl+$Ah}*l)1qCG~ zn@g{O5F zoxw3`#W}cgSK3&O{`EFHcPaIAy>M&EPi8~wOS9eMxpTCQ(ON?7>1HnUT2JO|mxTP& z?U)K0#l;+|jr6G!xh&Gl@yAUyXg?_8@dHPDOJvR8mI&gKZ_S}XzcC6x!_qoxh>7MM z6=u#rGDNF;BG1U~ymk)pYu2Gn^vy%Jy=h{QjC^%jwjXo0H&VU4D5@OdZS8FU)I%9c zpL3G9?Q3l!=HM3uWJMZQBZebb-o}Rm|AT2S)=s|pPV3X-`pjeTyBQKijA<8izIqhv ztUmz?t#CNt?p(JxakE#@drdnFcqhLwo45cDeXW=D8OCawm7^#5Vo56~xN6{8{9fTZ z-|0(+4%5qT6wnEEbD7Td4F&IZ7i_a5Vxw^B3NDTlJ-yb|xLQFCFAcFvOx$Mo4ymfh z@o)BWR=gPBE>8;4)0t_7b0JDE&1bwAlKg&WZKMj*M&j8!jZPM4Qq~`xnH|NxL{D z9G|UFJg>80&X9DTR9q8vYuKH?`tetOHQ`c7Sl~?>sxw5gTiOhX3l>MMsPR3?f~EWg zpPs16`xA4iZk(i^OZR2I(7 zlxxG&#w?B;BS@Yw!24PQv&CiXKelx1DM-ZSjCF79WNYy;X89Va-;lprdJE5-mQiy- zmtvFYv@rkR}XuIV_s z`*+*t`}@zIkLTRaeO=e9E?Wnrs}6qM0G>!s>q9R>xtHyMO7vt4q=<5mpR_mYUr#SR z-((Yr9%)sFgl8|Le9$TZpw6C1(McIxLxNDP{kykZtRa$?y|#Tk`@ z6fwc;&wVdCQ1ez%3P;N)2f-p~g%1zUbR6crT$4okHtC@eaZH?xcX< z@%zI+6~IX&1R3{M3fvG+yz4)&9FyrVyh+u}6iXMUSLJ`f2P;)Ts|oWS(is#ieXRP$ zzepZ-GgcUJwj^@$+12;s4IVwhDYe0)tIoB#_3Pz!-7MYSp|ABu`QAsw!HquRZdvrM zd~>L=Acf%ObZiIVyWP)Sx4Soc1H1Zl@#D(geSKcC(ebL1SH8sktrn24Ar>x!5%{;r zup4qjdMCm#r@pGEvdYL%bj61Dv<#8X6IaZ|hFcb_S}w>N@-=u*6<+$hPT@$h{Wv<6 zsY7U#@&m!Z%of%B%{kQi$i(o=1<9D+`BZ!O@Am8FZAa#Hk; z8nbR>lD>Zo^zbS_>?9EkrBM$%*&E?-;~A587zMS3P2IOy&ot>{SEz2 zBobCaq&u;5YnF3nBOZV4j;ytzrJ=t3iQXv};xB~yXP=9>_sz}Axd6PduE@+da5 zJgT$z!_8;cxR_wJ3mzJTf%sw9%1q0TD5Ep?(T1B#2fWt@c}4Sh4eyVlbNboNEvwV` zH#qQ)B7@RP=&!o$shi&9S%k_H1hiLEpW6iwj3f9eJL$#8%jSfy^&%eZ_=owFn~qyR zGZI@D_}LIP$E;Dq^NLDamfY^BD1Kukgt@gAc6_D7kY!VVn;{iIPl1K?M1p)>1#^^j z)Mo+juDq0XH71CZc5g3McWZ>*t zIPE;sre@}YhMRZF)ix?!Cu!>IiK%AjPE$ikIWS|2V53~t`)=B(G5Hr1}RmzCwkC+B4B4bQ$&dJ+4? zVYDW9jhgz%CsJEhk+O*Hk4Q%G5svqKuR~;<9;5K2!U6fl^W%*p@Hrkflo|Pycg~b& z73B?#J>JMC@XS|O1vIgonuOaZGb$=k{3I(E7d@=&w!R2AW1-f<9v)4KX(nJ#m?yRM z`EV@wW*ft7!Ur)UT;qq5|(V+&MNsHp+>Dtv9+tN0d~vzi-D@kJ zlIpZ%&r4n&tyj8Yk;) z!o-qp=RYxC^^RSipnsz@pY;8nxTF7><^v@>BG)7Xafby&LJU%B07nT0C6xjV_23CG z5!&+t^%RP*9z6Q-i`;pElj)aL2E&gR%?ct9bL+T%b7DOi_;{26JF~sG(vvFXKn*C& zgvS|c1vW%-liwa(>;zxD63Pf!%XW#IpvjWj332!|aL{h6T zs~+vwZs`uCCttO>n*ypR>hET7fFPVKKdsbZ(3tZGaP{P#({!V*bQzg9&|hOZ`WMvln}vMe2;7O@EIj3<&Bb;m_t ziV_rzedoW*jz%6d{Z86HtCOhKK3%x2P9l(~4zq~Vcpv((BJMv5QB*AhB29YL9qWdV zS1R?q!!BdLQp*q_H%^YU#7sHt&swO-dgmQCR+aa*Z-V{9Ce9RHTCZgr+;4%ScKp%D zaGoF{_6nTV`Eth=65|8Hmg(%z)P$v1u{XIoL7A7OK=;coS^q_R>8P!V(KH2^0!SR; zuwj#k;VHj!)tMv=yiZTSAQy~U6^~+S=`SI(rSE)g#2{I+XH&GAhBAOY8IvK#HHC({ z{aadD2@3T(-v;Q&4!>c^4g|uRY1z|W zwS%yqWr>#;qocA14dm#>emflvCrcMV$sB_L-l9(UeyA-f1>S zxPC}NZLE#XF^M~4A#^i#X|w$Kp3n>8U9SoNMpzZLnH+15=j5fZdpQPNOF;~o^F=%x z+4BCQ_;&4gnLRNPxmUlhBf&Su2L9Cuxyv7P()XX(H$9DotP5q@ExX;fP9Hr=gc-@- z#RnT8Q6(V~u7_l3oKIoG4UkY=Ih4w(5?7_whu5}82~l&g>!sS}Z8H=n4jaxGXA+JH zORO3$&{|&|D(vlgdZYKe?LUMJ7Wg;HFroEq;;l zmz&S9mS`7caDERbs_E;swT}TOL1vQG*<&+^tuMn zAsz8DO8Nw{Om=J1Yp4vGa05y-5o{g*Lf==}XAnih|G7{ke`PlOr z=iE!jGD&&jQ_2KNDQSiu!Xgzqe2KjkE<(DZALzIxA8$GwFU7I?nVtyGIDWX<=H-Uz?$19SceqVFh)i@u7<7#c zkDbO^1`%i+eoTHGhV|8h+t!w21p=Xa;kaY!zb26<*1?I@PwDb0OH_a46~K?y`~SSu zG`25|%Fd<;x*#Jx<$l?2c4|-pZs3}dv$QB}@$-5G}qc$J~-7(LX4lVr_n40@vt6(z5Q<_*aYs=_@bh8b@LxF_b~ zC;6n5zDIHVJfqTG9BmH;x``kx~2l-z$3FRmI0+#DvC3isT`Fqjxg_RH$x$d%f> z?_u77dyK9yJ1RX+=BF}A+JmcsulDPzbQHq>b-&J+1?*oa82ebr&6?UwG61Hq!WBp| z3|fv$8n?o^`Z8aw{7?_MF+W}7{Y$6i-w)$2=|)LDR5W`gu7sq{P+ zIITlGzOAd?I49{#GWUCCerkD(T1+JejT+dkHTH9xz8mc7a6+{MbW|6G8O3r=IVXdC z=dbF`?67`@#IK9eQVOY$ zM-P~58_4|zwiJx#UV1arRaQS18vzc)qX5Qfd%OP#@$mB*cC+7XIvF&IS}Y_y5dnsJ zI3ETy@fpjf<8bMFjOan=P}08K&EWdgb!3Z<#KdC@9lQ{l<)uO1Wwn@8&GpT_-Z!9tC+XJh(Qy?y3lmu!0+%UzJaY6@LWWfa;gCsKOm; z)uEQV#uEZ=13NrM+JcJ!E8PTrfl@ArzqSG_9b#kgkyJ)2$lye3Ajns**6m1YeqFj% zRQjK_?frs=SwrS0kEWcbJYZPXX=E-*nXC-&aOobPqqE=BBqt@;4q8yN6=CCL8qoU4)YUxK>qVg_J zJeQR2)>g$#0+Lt8-KM9gs2Ksx+@Z2>O&i1agjgy}4_wjo%#Y+h)lKR&yJ^H>cqE}I zOpXBkWxRjNtmI7xpOQs{%j=tSo=;F~O>d=*X*X3 z2)}2R``rm+GP|yqL{uU2C){Q}ljpFtRF^HrGoiqNM~%#jb)~lvjVkMsWRV9Ah3zNc zmn8pmhkcriS(7@M<8{5FmUmx(RIrI~Xt$e{mF9(d47`QETl2xx@q(+79=)Up+sdY0 z|3YxGm(#|@eB!+B?eh&4^~G4FqQ>sGnTx!>!9 z3tF%36&;5EJe_Fv5=2F1WLzZBG;i*c5VT+T>6_H)a+I==aiQnT0PrplM?;EZB_9az zRv25?T@KD>Fq_Bb)7HM5{=`%*D%+=S#Inq;ldpEYhzP&`5N#=hu>ns2YJV-!8EdV0 z*(Q19ewwqM9JHr0dTd>BM)lxSv})AlkR?z)MVeRtPneSXJSBalBWzoGH~0Bx{E(65 z(+CU`OkX+KVtfzKKj7AiH+hJZC%yPj^NExN-D)61_}KACmgS0l9(~C4qdZJ@-=3lP zCJE=&pf^UEg$-OQ{M2MrK9F!Cv^A9H1p%;1(M5jzCP&@)B4L`^b$RVU7;AV#o8KOL$mOGsYA30jvmhEbx)l}7$tAs^@@`BV z1{m;d=1(@|ZQ<0#MtwewZanicZ30400oib?=7cBB1Qm8^4&OMi%0U}dl3>w$WtEdb+bl7zHua?cHvp0(h7!scLjuh-SUvS=0$_@y^J zflaZqFeV z?#1=>LfksPB|H&qyWW_!v#nba!rw}Rkd3a?M-Pu7QC zcdCn))EEtTM08i|#M)?U6u72}dsqjiQ)lE_!RMxJk%_5o1k2JsgHE>=>of{RKNy%7 zHWpuc&J|~ZdL*jt z!kst5WF576bt`Zj*0C!H;w5}pgX=AMVT(r3dNFxI6Z}-QNeE`gacA}>%TvxijozzA zNR;8m0^N&dwmYbA9QPE|Lm(SraDj6NwS)@JCA5m4;G$OY5T!%gpXHq;3*1)|A3_`W|h;?di z*by@zSfFYec1o#{qKLc#S~qSV4Vg?Im1d9r=bR3YU}V>8H_PNFTQynG@wI^b(&{H$ z%VG0;bXQ?`e0R0RS2?v}4Gy!2k8u~VC%wFbO7bcrB&W^oiYY8R2j|HS5r)i{L_jc& zEM61G9mw7DQ)h{u&o4C|grTAyD2&lN*cr``*WH|TEJ(;JerH2PVFO~0`s*VGp<@^* zlmB(psO&suo}t^GdW^IVznmJ5+>?pqzrPY|kbT|~phYFoz@hCQaflFLe@7%+ci zdV85$vg;sOf19O`ul~MY*Eq@MN)9c+I|q|YgtfP%WS`3YbW8DyZFG_dhIuA_LRroCIvsu*L@V+Ytu+)^rH(!@YPG7 z$xSzWGBBd9514zl%GfW^T0|;!_5{f&Jm%+Tfase0>9RaF5R9)b-EPf@;>UoE#m_BH ztyur9E7>M%J3R`2mkZoJ`qdPzxJ#K0()Th0Yes!(SszlO8h)f8T0q4@^1ICz|8JV# zE154b=Q7{@)gPNU4Q!0`8Z#g!ndtk|mha>2xW;G`$|YGuqa_Ug`P z|K)boPl52nyy#s20lQtcd<nK>{ImT4x~-k_<7F_5-{vmv z;h~%VXu05ED_4uuu>_=vHOBBR`oXo3)a2g4q6FMuh~3K(9+5Y$=ObhF+jk@2C;kfk zOr{chiKAk8x?cqdBr%7!g-6E|fnw?L$(2#ft~0VFAPVJOxQlRlWA<}}qmcV?qAAGN zu@gz%3CeZOi7YqpT6$Z#*I9`d1CD3zx*u)b!Br6dPls05sMUuMOTCBw?P#cm*bk4s zM2K*r?E=KfpN2r?FfSHV3@8NRb;Qatn;rIm=)QZCV*J7_OrUvKepRb~Ih(!=*9+P6 z9oQ6Ad)=v&OGCK60xRLDp^ZG;eYrw`vENpy8`UNOiER3IfF9wi%46SA#X&#mC}O%=j_SlQ>hgS9Vu> zQ4NS>>dVX%nfXe_#ttC!zh`9DfjdjES+d5pYhswyZo}Cptz>yv;gU|V(JN%hvEuHt z@P0qzkwVn*GYz+4gP@d<;-O>WSDGI}A!FO`E0@O&z*!{oKz;KE2QcliZ} zgI}i^@R3_M-!j6xkTT5`0mlh4+d`6tO%Rk&ZdgM4iuge_@2{4rC*7(3*S;Hj;8QspyvEib)sTZnA5Awr zK--dKZ{f;|&D_nZxnecCYmFVE`{;Wzwi_l{sSRM=uM z-+{8f+KO|qkbiesP$y;=t_WffZi}#$kmD3K~u)p;9mw{RMTH>;qC-wq6Mhh2;ElnW<@g>QZ(H&Gwn4mj2XfY=c8w5CXTrMFx2=Y*TC(+Hrrs%tqv&DM?)rM5n)plR#x z0sZH0xJx&GG#atzCcF8R{}?zgAsntof~0t_C=0QkaiZF3OKlcnKs(6S^&cn&znba< ztZByF;i=Dn3MCD*<1p60#LQ*#h6@d#p}i*^3ImM-;@qrH>EwA!D4Y*lKxr zJ~c9hPgQh#4QXb#$$68GhZTNi2@);#k{1px>=Db+fNLnksW}IUJ-p3_y8>PLFyp(A z>P0Z2aJRy37b9QQ0f-XC7k2j&EEKh05Pxx^=i0<(Q4-}2Lf|@MNCQu|75nKdQK;=(@PT(rY7hu`4B%e$#me?q`+m0≻f6AQxVt3dCt+P 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

wY~M!vuCdl(v_86Cgd&l#~|0_ z^i5OUd9{#U?d37O7l*!E*6`r$TcHiJ&HAK$qUQCFc2_Zz+yAIV+&Sga*I=z;^v9$B zO*zK^ls7eJV!P{`HA3@-SnwN@h$4uzye7_Mm#@`3%gn?FROCNI2}O4UUe=PkAHIc| z`p#KnLoem%V*h@$*^;g17~2oajKFG0OMDbHd+)zBO9NYK$2?OY#!&Y5Xo>Y(U2Vvj z@Qj&{z}<$X`?RR&sa;yX%BUtmtkwox$o*zL6v%g%%m^5Q>{TslB^wF zIbQ=oC$^~(;kjc=loj(m=9dv_7WP~ocG~?D752d5j2#^FZ#~5gO`!|fF~wq^gZY88 z2DEJslNNq3_sOHaVv!-m&ih_QAKfx&CpL?y9mXCEV-{;{{{5i!6AX`L`#|%5Az!wj zR@fjAcXn$U6vK}ti`#dwYU|Pip0>!Cf+p|b7@uppx6NL-AO6*l%d|m>yZwA^zx2(; z0d12I{e#&nFf@q65~ACf-iHg>dLQ4?FX}IwMbA&DZ`eH{*Xwpyaz%v7FNO#2u;$x0LWZpS#!g&m%lZg+|G-? z-IQlVUT-+x-N9_7$@h9c=Y%E%Hxyoy)esrq9y(o7>%%GtWX_rEIh^adlkWar8~4iU z_Dk7GrNR;6rSsNQKi_D@yol?g#X1OvGH6$A|6rRf8@PU?G)(q|0)hdD3j~$Mdupph zRs^uUrpY)*Tg|^49lfN;mDI~cjBZr?wcj-}$i>zLvPevkPyZ3;54U9ZppkUTFB2-29&K4{DaBjBNQXj4-3sq zjuU0Qmu4~BeMYCRwoG33Fv+~ExG|-lw3v9->={YFRk1zq7vUG%fhkOtM|-GcL$XEL z`pd|l5~iie8eKm*?htvN40KoP8)u8%wcDBJ@8@6=nw4}zLFrH3)60a##Pb^lLnn^f zvURVFtMWUR@y`412#WDkls{oi<$-r5DaTN~neUx6p6@5bbC-cxmqwoT6aKWu{ej$V zIFs0JdY^TSajRK?fL=)4ubw;DmaTnptEo&3$ z)<^1usmeY_UOq3@q@zlG`0Y6rqxqqvwamw34;3@`I~*!Ktn)|MOq}yK#>ZMhHv~$A z!XR|w1pChsuJy7VZF?Ga*In$QKVmnGHFGYL&nZ4&J^F*H$i1^=U|KkkqjGb>G3j#? z-?2UqMcEqmz7yYWnY`BSPBdzr`_>zG@mRt8g}p~FD=N}SF=IPLMbqQAwT-6seCM!1 z3y7?uJ(vQNv40B0&qB*rGt;khTzpDyXm8p$l7#&ELjXk#!~)ci=he_bZ{;wCz;It4 z)cc^j1NUI|n>V`qV}bzAtha-;I&5ORu#g8{wjz*2>Yw;Q3Aae{&SqHwLD8opUKM2G zNBI4lw`+zs5sYv1UfZz4$T2^>s2#AW>9{+#-Brv9OBRjnM+2WD$d=cv)uWp^?U67U zk%atfLDPY7Mv>RA`;$-k-Cn#*QKxbRj`^(WB}#0lHaQeDFgO@PFD8+{umbwVkj;+M zP_{dbF94@F79sxJ?ZMg#!c5N;dmWetb)>!!K|t6}Wng1@K)Ihn>M9n=V%Dz6^`L$o z2t9n+_=y|oLgoF{l@Ww7nMSaqbMAO;i;o!{8)&U{+OW512Fv6JjWVlv>n`NIs)1Bp zfduT|7B{OCNo7wSCcMl(C|knw0vTe_N1YU6FD@apLVxK6dasouoCv5KKQ3Racljp# z=#9M~>h%#jNUo=|`1TopPj+-*W8tmlh~%2#8N!2U$-V!IZdiU6XS%Pp>20%>87QWIjb`x|7+A}ig3ZFc6EHKlPHHTL1dl$SCxhBqvYm!bRd zP~+1OrX}k&E3_Ds81asmCp~k{*(a=;w+{=sF%=n7c&8pROOf`cA}6)^KjdKjkjRfz zD%wkz0sJyh$T07%LZK@Rzp}zr@{KdLbq3S7zfTI}yMvq^WikLZtb==%Fq}|AFvymF zT^IQpacgM~lL{JKKHSlC^~t~ao`Z-kekuQv!?kEb5K?H+vYX%Lo^ruf$wq(gT^6DHWA4Y}#|`5)u66Wl^|BsrV$9KT zu{?@&6G{wlCapPonjlLtpuOEC{4`gyf#9xzFXiJM?0?fRdSM`5Hg75AMJ>7c%4aUF zfOby{NZw4gFY(-y1c6fF!x|T}Mk6>XS#JoS1#q~|5H&B$jLm*y^hPp`Cn-@ErW9KZcSjGqjoW7&Of+jthkaldRC;zGjd6{=SL8Cj=vftq(|u(TaZ ztg)mICIlS^8d$av*_7|G#R=_zG)nTn1ZcfWBHUT zgPYx$OU^4FWuMbwoh85_ualU|EPLE@>a+Lu%ZioX3oM9hE6Fji^46F6N!3;z{}Fl= zB}jrz$Oc+D4}oXfpZUo(_cfU6#9J^tWL$j+paj3iCB+<|9;Da23>1(6;v#=Z^%^^; zd2DQzF2RYRBj9szl6g1zx|;D9{;V}5t)3wtOhQKo({+)HB?*=rth)wzh39El+RNc( zXT(Ge#KbB12t@3G6yHUVeyA4oF0AITBb-I8=3;yJGNQ%)-3d=6ZqRsy8hdQ_D$Y@|(6Xjp4 zB0dp{)4LK-6oS8U6Aaz&4@I=Rwvo2}c*~t=CqBU_@35VXukoX6+_1}Hh`srr7NB(Q zSWtnM(dBR6qq0Y|4|drV|7oi%O{DV4Z&XhC_Y>UL&b=rwKk@V=e`3ul@cD zptfi+`U6OCOFy8547>IEwY#mwGG3B|(Nq8_hYfu#b7OSKJcD<4$b^XdH#l$la84k< z-@>muE@+y7c7zV59(@iXKTV#-Gxh{L84PV*wm~zhl$9y24_?hd>Q)4JqDIEV*-d z5_m~+rz?Wzk?tASO?VzvCym8CSd6k$6Jo2OHKoKZ-X+}>qL*7_%)_~#Z$nYYq`*)w z=@!rR{|8W%eZXubQN7I@2T6wHUn(Bs&8^<|5jdc)5rm)xWK`6Y?>l^zoh9d18vR-7 zip~KzY@2BGE}G-|oHR3J)oqu>C3a*|-7DazMCJ)^C2)U{PPsSmzWlp5_9>giL=o6?N#F18;kj*T1(GhiU2YLQ!EVS z9`Mz#Kz?n4Pa$P_H0G-40Lqpi!mEy&eMkDG5A?J_H=M-qd+XnCvzBH&?bygQV=WSg zgb)ueh-;njV``_fr6fcyP!^yzFWiy+pclV45@9!dsRH2nf zd237VVx~b(|^=}9ZQfM!pjV1HopK-LERMnyh)^#uE zET3GLK)yErJ!C5o(TTy!d}os@33zw_cmr{2@+bSVsKno8C1L>67z-W(EP&#>B(S2! z&X$BJGq^S}Oh+e;dgq zOzOKEfCIHX#M2T)&+t?p#)-_eXXK7`LJEF)JGO#By|I(TTdfx4CvsTe(n`k7W^1AT z7*Q{E8~z?UfUm7V0-Ocm`kl`fjhLP(+be-{xPnxNfWyPHbI`*`q3=ExP)1usv`YTL z{<_kP^&hw`Uc+cc!T`nN+Lk z&II$*O@+?<(rQfuargQ%o08SV|^ zH!%Kem++WSquBE`ZE-t(?%&q9fF<+>>{+~UE^FMa-auz`VL*I6(GCzhY4wc`lc-)s zACEfQkty80JZpggo7wtV@a5M1E6`ecIuFOrUsG`szgL8DzeN!gi#==D#GW~3N&}f9xw!mY(atExg=3K~DG$v)#n$-0_E3~9 zx)2Nq^1EAviFs$}MD-H4_Nu%bwT+j91vyOXnb4h=R}d7AV#+1;--o{qnv@koXBO_d zT-c#{Y`cmExqt^GoFD!Q`8Z320RyAa0JGIM34N+lT1aPKp#k%R6%8>R8!q3$J8J|J zh2T!>yT)k++t+^|a5|K3I{7xLSv75!F5;&9MK6$M_r)Y}DQ0ixo;`WDEr$Jj7*kN@ z^;uJH->$PzfOm|M*#z@FOsDXU_b0TSPw6|~i^CsFNYbT|KyPPz(?m$`lqvyYyn!!( zrUjA`NT!qjA#8VWdXmRXqCt1^$)>TKSAuyn$+`AqP0c|Wm_mI2gn`-mS`=`yiv%HF zT?iNL9swA!<;zH7Ay&e}x7c49=F(aQr^klYFLxA>>yzltWM|_5J3(bK9bSoxeAR(n zar0M`5>7Xqmzy9(%1oSt_-9dj;P{lfy$!=OX!KFF`=FnxHeEa`KxPJOHNTcZ&kJ>#N$2$ z*xuTJmZYi>lOS+cm-uQdu#njA31w$&{DctsO;0s>=GI2xD=_f({?~5CONY`8JL@`! zMP!g~-FB)hAlsT`_vRGbxho1c+%1jujt_Bd`_$0CyQIT422#hf`T&hHHOaUv60idq zUJF~b3nc*voXcx}CM5-`WPF|z6-|n+lf8B@&jqHP@;~tYc(Kb3TnxnXeu$&N8`X5< zh-i;nLhkH9FU3n?INp=7kKomY+vu~>l@@h`mI^?7Ccpra6OqgDF9vsNY>*&X+B_i*cJN&t zar=NOkfS#@GFkJev;ScNj@}9LkE>@uqe24H8bpx8OwB+;5P9{P98L6>QFS>n;gk)p zn-{Bib#~$;eGr9%^0MM&&Ur-|N2IQ2QgI?yvO`a3qC0ZudsB85YH)IhWi+a`61|l2 z`Rz%iVcLWeAt%tdwA?3k|2@96%@ANacaIUUFLkIqR|naE2L}O1O)}oL6g?!)eLkco3}*agaft30~H$%G7T>UoEvo^_lPEtXa8ug^^2 z>63NvhvT?DAiR-qcIamADk0fie^wsYR~J21m7XdL?<&R9kQTL6ymC-nVP*RlMj=-7 z(w69e0rKIGEgw8oD;a+aBrsQ?1Qb28`~{@3C2nb=2Rzb3V>pcl^i2nZNs)*2J?f`m z0kQTWS{~DsX_A_P_2(-G!dV3l5x{~!$G=lLdudWmtM`E$tjn?!S~#5b3ql+Og{udJ zA_W(~hrQSgw9y`4N~376`anuZlbfxF`}Hgs>?*zv;6W#T)M%nsW$^hllIpx5^v{5Y z@Gl{^nB637VVipUIXs>nG}yV<#?oSJW)4RgWX{57TpqO7GC4O8&L08+zKY8s{>3% zDocisJ8Er(tloV29SEM1RomVPQ=j?v6BCq}qUJgDYeSY$+wb2E2>q}t5kn0#>@iZY zQ7XIN^*x_KN9?eV%&6|sypd93^pRJI=ZoKIVj%IC|L&sZ_4IuQeBL1zwsSJti}r!9 zw_6O9?|ODGXcY%ogv*-Uba={A$f4hH{U_JqD|U1TzFvDQoCBXJoteRB1+qZ;d8;^d zu))+E!vaeuu2H)h32p8lpAyxeNMvyl10?aC{M{KX?hQefk&DdFQ9q3M zIq5@JQVq&_07^Ghi^O>xDhy%-{e0F>vc5##YJCs@D{u?`LDHL?`b!2jf~Sgis^*cO z8g^bQ#7YwS#b;r|&q^#0ppv$Q>vLy8nGv$YA`Q{8 zYGj%&y}F^Ljg~-Zl9I7R@)~*~>Y$%cDA>~B>TOwdyc^7^OX`?e!P?{5HQ!S za-N(C%FXB=%3;ENAux{Z0X-an|3ahyHL+Y%m+(2!?U6eE=6SYgcJt|}4}}oU?DAXU zfJC>?kr>u13tPH|es4qZf3(y5E^vr8nK<4rPP;)iq4%OU1$Qr_#TaW|9TDCC9Lt=* z8n!JE=9UVyw2KNA<&}!2pIeSF+3H>*wLV2`{VX<>CzB%!fFss3!Zkj0J+4W5+7)kh zY_3A~M-hQ-wle4CdphH^+LsD}!Bs3o?b0cPF>F0zt~fsz;jBu>5KB(;UT!H|9at z72VF_q{h0z#vx+mtB1u{sl0dkr+%J_FjWL(@a^bqAu_n{t4rN24v(}yEW0_N+a)%* z>2mm76RfxoCB^`aFGbdv=}V_5u*92(CH-Cr?fq-s?tL5Ke;3c3jUEoqTS^qKevpS5 z|F%2~`RHFE{qcB*_jdW-MQW;nrz5J+c;O2W2$I55|H}F>t4kED1h`309S#(4H|bEx zEMXF^yrVu;mlfKKa}}Sbk@~rZDZ!ZCF36KB8I_fJ>~(cRgKn2!7@^EuKLXD7yO4lJ zm7qu#D0mo$OceiBJN=0(KY`~4(CqW=B>(V6AP|C(@lx4WLCJy=Bez+7d_MRFc{D8 zE2|@MC&mdXeBDXvS2UNSi37Q}tyt_^PNLdBL}M&fK|0*6Co}HBfH631TM+Y~oH%vs zy2pR^>m=VzoX+0JlOlIbGsETNLPbbpi-7}VJ`t^Kv6_6w>O5x5^ z1C^Zqmfdu)M5R*2u=S8C)Xm_I;bPj;l_m`nGOI=Zq{Q*Nc&~#Y6!fsA=794*o8RX) z@=Bl5%?XojTuw&M-CNBmu4E_KkX9U%0&muYKvrRSM#st?oUe0{rAbx>+wwE;)W9H+5kz) z(y?s47<>$UREw#9zo2eDBk`g~4`nlRUKgBK%J)75QoWC;Gcl+@WQeX5hMi9bU((N3 zUa^ptMt+Nq^o&oS&-lrriiz=95o9gmWulnsMf<__z z?iT{QiF=xTs>RUW`~iY=7@ww;F443aKoAMr%c;xAJF2(ZYqmv;qQ40>A6h#s1SY19 zX_U5BU_)1i3)vVxg&y_xU;SLp@w0ibKk~Avz)IYe^7j%K_Mt`BsB8)gJkd^T{^IUf zZC>;_-_HK*-r8P+vDJ{L)j(~Cl4{zsC17Jnn*l+QF5^Xeega(*Vir#&}E(;H56_<#TYIWW{s z0ZT-#P;Q=HHa{=*p3f<{Xntz_T~AREzE~zbpu3Xe6C8(sUjUvL?XGije(k(hpL^`q zZywF}5bT9Z*wBhhI5pu<-23%RSbF{Ttzi8Up?R;e zatuFmV8)j}8iz_2YrA~@N3HGon4K(&WSCS^XW<^CjY`B`#?mf4Y@7JV+i+>BW^kuo zOVeg%IA-rJ7Jf=BrkhjicWmg>F5AP8PeoGwMBJ}-f9E@FhT@*S0vYZY2wIqcm#<4E zmpO9gGpO6{bHE?ap^w}3p272~i8%8Vrer5ySWqfUv?T3P;*Q}-8R%tKKBdy~>*f`) z6Lr?g?hkVw-0N z^5d|<4lF~UOneW6&lQ#j{H60=jM|jQ%hrq4RH8G(#@mZ*@rj;6F?s-QBl^Wi%6+T`mR@pL zN^S+H3tl)?ti(x1r}(-K+u99>B8~hka}XJZIU*4no!Ik7pf zokpSy1o%0I-nj}K8iTP&9J4i7=1ETC%)zh@|283?Y|-4epQUq+&&TAig4V?ud7L6z zfxBCX_SHr5z2^e2G)TZf{H4IUZ{ht|5R@{Ws9 z3q2f)8zb_F_u2P8?cV7h4|08%O&q#jDi$|0v%32VK%G5%QC8oamMMtxQX3Bi{W#!> z`%gX&J;f=oZ_$2?C~Hn7z_T*G9@APo$lUR}+CMd*SR@@A3>HRVVSr7pGoIi3mSdbI0X7!B-V^8F{8H@3@h50E5$9{f>Zx3vPdb zpMn6N!FW-0SFMd#6a8k>iGTih`%4)Ls{SJkjMY1MDWX-s?qiLE-J&0l2*gD^k>;6y zKzfl%%ITZIG9aA7|1raXM;fdM#D3sT7Hm`{;KUsuWb$2F4ilut#n_0_$=|A!TrnI?zbWMF7FP6o&wr#27QJyx^eY9mYo4&cp@M%#}#{}Y@%s&}i zaLcf+Whiuq8``%$CT-tVQnD-7bQ9S5=5H1u@3k5fBM}%d@0pzrBwf~F)h8Lh+91Ht z%0n3Hu8DOuUT4l3c8jJbNhm8zzzwd=Ho<>&kswxd(mEzaiUX7jIj=IZa@qIncc+c5 zRPRr3wtpaL5eBZQBZTYg?DP@htNx~&xha&{^+`#XtKPH5YQBZfLau1{AYJhR7;%Af z1{-Bf1l|fgj7Rox0en?(7820Cx?}3QBcAXbsUbvo6e`rN`kL4$1wZFem9@T3Os)_MCq|%biJGZ zyv`%%4tB5#3}z{rLVkhC?KAt)$3{rhVyEBQcrGbW$))#;zzCNR6F7RtT7E^`#hVGj zB2-BS8=?P+miusDiQUy>2d(VoF6`j{@DWY~cL&S^AO)C zGeyISBz#a{)EfM>o-Ni%3NaHbGtVAQ%K2BSbP?`|iL_$1$AzvYOW3EKWpJ-(ie(hY zTFM1anY7B|Ufx(7>6C^&kCRO2+s&5%ZS_PQ@eG{v6$nI1AcRUF{fk&M*yZq1Z(r=D zkY3;$Z^be3^X#k_$z52-RRpxi;j%IsK7A!V-x!QaiIshy#6QMdbLFvgVemdgF(R_A zDPj83L$yDm$6!S+la^vVvzBhwTSs#^rqn!pGxk;Pc@3z`l>TbKR6A1`?`y>%T10Hc zuM$`IdF^VMrKnG_#VQKXY0o)7;fvU;om8=bL$yU00y&M5q$9#;`7Vn!NpO)efP#_U zcy^plpS*jDlaIKIml7$yv%l~gS`=Z$ZT}2%I9nfB%eP}qIqNz(Uqek7-OQBJ@yA(4 zssHp;`}s4<%pXAxs-`E=V(5;h)_4)eb_sqP zS2lP-Wf>L1|4HBNrNMl>#jXkq#e)<{Y>c0vC*sjA^9Jm0TL|%QWEVn=+YP5&)+W;Crn6)_I$Vn7&r#K9zLl%)BAsfi zZ@7Jp7oV?fim!C2WrVF|1jnTt=7g$#m}eK73eHzO_}M^^@{xceCjb<-YHdV9jG5gy z0pl}nhttN6ukjRt{klg8&T7fbRl&LSbCqb#Qzk|n3*-LCmjU94qgDDfn~h1;xTAy; zxMBIqi~?78N3o4Z2E#v%m(b$!fnd6RLZn=Q9JJ2pjZ;K@Prn%Rv*-u7H;!wbhqbk? zS|?;hl(3IAefY!> zZ%3!E1fa0-R{2uQX)Q`A;q;iNEj@TUTl^CaUe!aXVyWxsBLj5ogXFT4At%#Llup}> zuNeC$AFHF}?W?qU5+#=zorJyd_GQiZ#XEXe*jAw#02&sAbseA*RLM^QHqw(yf~E23 zGwKkZO}o046^k7Kjv=+T|1g|DWA%^-FGU&AD~4gnrhtDH*g11F-SEy!sF3tv?TmMj z<1wCAgsQILcHVN-7vu|aRiTZGT|e`^V}q1?Q%ByA0PfEoijh7i9Vi3T>iUE2l4vh0 zW4&sJ=y19vPWxZh9LGt1CNt~_Rve*SX1LJujCYf>z7pcFq<@Rgy%nF$Ji9kBuvmAo zlZ+y>UF;t@W)} zrZ5XDS{`>Nly2zA5+@-|M!EgAKl!2G9JON^dm7tDT~IRguXwAyu|4l1o_6&vVcxK7 z)FTu<%2O66CrLy}VnZE4t~MVTD*;{#ZLIR1l*+d-db>G9T=zRS?q|{NGsHe;$gJBR2ipoYH)eCmbEL~R6ed_P3xqk zEWxFw`65E2vB!WK?Rv6=Pfls-7xBxAz~6KHavR*Zc?dj9e*SSnjcl4YP9YDc*9*Gc zX8D#%tyf&QtG7R2kLi@!M!H+e)LR+rTkmD^3t_i_mw0ZW-6!69dEmd5hO&LrNsM=| zIY5fAxKqkkS_Ug@=S1t&Ovp!sQ`lZN`$ZiFhP?`=zxmo*Z2z21%G^&GaCm1Q(*UIg z9)=cclFQJ)k0zzM_3~-NnsIwC$e|lgll8~Eu^?VddOV46ucVBohPRj!v!SK$J64;I zoR30zgIf|`zz0mX5w6N_{Lc3?kA-UZ2wa-nmXdgxQeE!&rShI}33+m9vMD!GeHYCQ zF!aTgxPB&<$?=$-tcSjamrkGJPBCizj_^-(Mq*-YFZS(;1$+kPA2v zJQ3cE3+7Iz_^drMUY$|M0{cy3>A`2Vy3;7&-`mZWx8A#hyYnXm!cDaYV0|5RPvF#6#WTkcm=xdbEaKD(52 zsB$e!ZK+3GDrcC=%wG!dGU*WxihF(cYExbV#fPZt;roQ8)(+Hrf;#~#f`18HqsML*u1H#(mrP(CQE&9;{y|!gx1xk^hrdQ~Ov6pZn)sMRCjw441Dic* zP4%C(6L#-;jk^_xpND~sp=&BWKcMGhJ=P$@Ay^iGwSffbaz5K6vz7y9UT;J~NQ z9%6&~-3pzW8rjCET6D537NO%B;_^y;GSG|5sM5O53G>ixT4S8cM0{SIu#*h#B_xDa zzE&IS(7+6MLa&9aJd7YdK|UR_2;x=#d!7)^Vh!p8BD|vy67Ose`(3ax${zMu52$3? zco~;f*A}uduD0j5;ahSW_BxQ$xcu|w7o+OL$6I<3kXZU?#fFB^=Cz)i2CAl^uSww1 z&{&vak|zfb!;uuD&t~DN-BfwC&2LT8$#=B7s?#nm_xu}N4Rc2C5%X9?P*uEyW)A&< zgegl2=fz)y^8RYk$Tn1i$aL{ID(Ir_i=gxy(V+hhyp76la0PL{{RWB4JL)Rf&(c{BJ%A1q_B|= z2mpn#<1OJX^Q(TA)*G?*Jsop*Uu+(bb+c>Oo#|eb&vK<#VmiHd>!vvy%;bk-B5|zlrGbJ? zbiJ@rk-f9#DRkr;o-40JjcP`@b5lzSBp_fva6>2Yv{GOe3+21> ziHT8!d6TvxOuRMl{eMdz^oS!Q{t-x)JjFo#$(DujZRx6(doSWmnx-#(JeFQZb!~1%_n=w#tRzU zE{m0D{+)>-z6G^vtd(nB1!i@uXO8SbK4lIyQ~rAdm=a-~EgC}bX+m|KK!RuYnm6+L z8)vzvn)3V6L1-`H@cc^2Zaf7}mjlrIq#%b0jAAkygCFm6GR1UsuG@uo`O%zvs`cM@ zVj2;k0+zM935?1WEzt}dbRnYUMK?II%4}D$p?w}umwfTXw7!8XFFFbn19!oSf3o8| zJDUaa=RF#vo2nXE8_y5lk&lc&5%@DegeQ3p&hn(~|6}T_yz}4g-n%>Z+%sp+IoEZr zvAP4|Ir9CxNz?Kp*GP-jFa{vuTO3{%r>v>Jg2=-xBr#%{Gy_jtl}rDji6pI*sNKW{ zKtpd?!H~??R(idw#4)yo_YSoM*m`0#;zJ1;o|rm)6Mnf!%FxEYB53eSlpu8zk@aDk zMJ;AeQWfG`e{rl>x0e4= zb!a{3_tB^4g6VLlxctrw<$mpx>>}%AH5uUh93o&eWaiOw16}coZZJ3X%U)^2gt+!z zC|^t!Z@n3q)7WtAzF7zeFCH?D5BI-xbRJRAn^BjenJ+g1^ zwYOiOAFoYT^SCK19l(F|S6#*_|7KpobPDag(K1y*6QSfeIfTH_2qO zxe58XNHn`U`kmf`5(B{B8eiMg{}!)RbdcocdhPjA0B`~VnPgB};vn0N2StmD4&Fx= zNv(dG?_{=)bv)Z_t^a99%u`1JPE8S5_)8%v3$W{9f-cuKGwcGR#Zw%6(nT%XK$Hppoi|r@+rDTChmJiH{ z@MQMH@$`sv1-`y!ekr z{b^m^_{r6F99hWD}rZWsdE4AKzKt4i8)W z4HklnfI#eyrgcA$DjGe!HC*#yBH zS5`BjOU{ZU+$a(iG#sRwqR^s&mM-WI#dX9&4{V+WVQ39T-hSWJp;+L+I+?FA3V@&U z+45KaCGtnBj7XOu*{?gQktf=9DZXYUZ1k=2UG8dqMBx2|jN4p-9n0hu4#Z{lkKt|H z)ky>Am^5|N9WdARR-BIudVP5wU8af}9i#@N_{c@zT8o9lF=uGA5QA^|(lqV)T+e#9 z1HsPOw}Scvg}U;ZklrdG6aO#>-T2|xRpsKn6vWCJr$yM6ZN{WRilz4*0jA1wjSdHN zW)6y_cPlyTVViVNzy866$t0r5M{LAiue|RjTEHI7+IJVc(WEVgHMOS^S=dzx8ZlXWL8VwstEv9Mw4&LwF+DjRKPB1 zRRQCjB>VL}HZ~_AU!gtnZvZ&|i=b1U%__8`FA+SBn|~%hdZDidQW z1jc0rpjBL-g1gf648LdC z2*=>!=5-rPzT7o%_)Jt7xu^V)HSs1J-1BhG%4D`NmxSQ?oZs~&&Y|e1wB+JERTVd? zDmKPeYv$F9!^-AGn0uv68L&#^u>IJbd6;6H`8n;on0uu+DX>Zs`+}KT4rCope*_Fy z@+f!Z!fhsaT064+H#y07UyhaW+1&nq6Ys07u?j5a?{9HySTEgfUDGSW0e!}8ak8Uv zH}`Y*3pXPQo*p9k+hTl@*q8iY>QsXmtxtbIng=(&p*NBCbGZ;%SgvpNnLhK$>1_vk zq5&@dp&ePEz;pj7g-&0O-3fmn^1CQ5t#`cKz~Ao)X$&K`@rH8WWoDV{ePxOKX0mHD z?DcwDH{(xq#CQOq<>_!x_Dd{;Dmj5RX-d%=(@z)`-MD?Y zpg*si;!K23a=F<%LZOd1km;#3x>UfYqqo#r1yk4{TSdloE{S{}U-D~F9JbOI4RMB? zuVbWE!cxAi=Xo|i+iW{F7Spw)))1(#`tDTFcVkrO>oRRe3>8oHdXtIlCe}bTN2KQ3 zR#ZnfB%lTd3qeD9iN#?Gu;sV-z7i_|fn5{Iq=dwNj@@#pov>y>+jlmil8-^o#@ft? zhYh}hsFCVM-ok;1hm_7#6JgXpmi{t{1w!Q7Wb_o;>fVt*8V{zrHMyJ4JNB9#GBrD% zJWAtvj)kxwBhcnW>c0h=z8$KxW6xrJG#+?tHM;lPk4&h86sk0~k|E#B2XYDuZS-4Z z%lhee#+mg=LER(Y&8vkeMSQ5FH#JP}=FT#*WXK@VWXs=Y;_1NAFoYn$gUaz@ zA--A?xW_aT#?~ylVG5=vby#n29N48iA^V&Djk@KTQ<+gBVE)i?vXlUQ91%C^vB*T>Z5s%c!iC3 z)7DmS!4m`3XNpcqmuqcj9ORiw36YauQWkll;$7<-)edZbhrbn{o2{Y}Q)TVb zEp_XKz?@t~uz7C$nG8d?Jf6G7jD>oF4@G}n4!w)dvSG8a^*ZV(f8NM#7G|V|5~#g) zpRfP{vw-r8-L%)FZ>yjSWSCQ03stEZ=;=!yt9&K2SLIpkyS%>UbPr^b^nmG)rxXeR zJ4Yvd^Sw+AvyT@@3xAA-T_vbwvHivnxvwFWy)@S-3iiYSf1I04ti}KJ4Zov~`l6l_ z$?XfT!wJS09HL!Kt6=^yQsn6KF$%p~9R>01>w1vv3%|!)?fHDUiCX>q)5R`Wx2r!7 zkIk(rbSVr*n4bn5zw~fZYW#Iyp~eKaXzm4>h6J^gw=lX?jojI7&*R+oFMsrddiOq= zKfRlqUqV4QMZi-|@2xkYKkDf#-CDUUxVWBFKa`k|UZ(7+|G;yrv8F+n>}G)mlo;Ya zsG}s*U*vNzsbH;x4}D~=#kyM&0Ug4eoO2%xs&o4o_dbKcz$iEX&of3@;3=4P*#dWJ zg|Y&Dl)tz&?)C52$uiEJk5%_bPuh#)L7h6uhw;Yz4PwPo+C-Vo8IA2hfvRmr~QpC>XO#TM!X2o1OVjp3^M_p8wn%-`XOUP^))& zTs&sI*ex4z^wcigkBX@CoU>D2u+8>9AY^wqz00JcFc-Zgo(|8#`Qej9cBARs{CK81 zW+PeD{Ds^Wm~~$eu&Ow0da~tOm-zQ*(3(4>srKYHG?(Z6@LVbK`T)ToZ2*q?+_Kidzfa)34}5kCsN@ zCXM139Gwu1!^s@A__?ZaU2!zRJwLoU!>_Z1&Gdi1KlG z-{N51GFB7fE>|zFQtYd1@Roun5al#(z6T=Z#YJw@4N10j9Yh1R#zlXSsecmR4`QRo zgFiI+3>asKDb9&18l~*zD~j8-^?b9{Ze7R=OUkHReF4EVe=J)cOz^pDT4c}WdB;Kw zJ-(WgtuSYpFyg9ej6B(7E`FzFS=bFp2RwS9LOP?3Z~q89ZUBX@(WR9s%d%y8yG{3v zjlUY~2`Pv`HLXJYYX-=wWr;hzUp@qfvSNxN-37v&i|AJh=ywLTcEvU)$Lg!fzS?Ox zZ4G4^4uc$X-$2>dnx--bWWK|QuIxmGM4yGvxo2=yy<2t1DUk&QMce&%rz$3+IFO3< zX;k28cz*Oz=X6hUpqIYn+^g|50Avg&urN!padQ`HNf+cjNH+j|y$73Vw5q|sj+TEM zw_Vi@4lmW~G-1Qs&v*Ig2T+FKDX%wYn*#gqYHP5y@H_I^gYt4bD^zi2TU2sPNR*mu z@X*n(Z1+L7zf(TjOVy)od|cLyQBS^l)3AH%L-g^3x$%sV-CyJr z=&g}&UmNW-UZ}JX4c^nVnMl}p%A0myYV=**!ygly?HibhYmurO_4e6V-QWB*C`daO z34Ua~ZDWAZm9owTGJSeR756IYC}mV)p~*2}Yh3dudDw3dp29D~t*?Mm#0(@+cNaRv z-C(*-#9=6GEDcz?g~@W9vgf@BZ|CLRF3Otu_`1bJ%|abo3UdsK9YD}Oq22l}1)onB z?xH4aT=$&Me$Q0s`?`*I*(tmo9!M|*%H+3ku3hqbqULLIDWB6-B@s#Nc!V4&xY%f~6co;_tPe>jz8Z|*r{W?Vm( zX6Ih)<5{#hE7;$jSC+k1Zv2wW`|S5ft4Fcn@c1CZc9mXn?NTcRx{6qq6Dv&$ITLHJ z`Z4l!9?KEiZ|z_%o_r(|;i5hJ09(n2!(`g^ypiEaGdj_C60y~T@i{->Y?2n}qjJ2F zX}i$niwDkk0tj&>MBoJ|)q5hxILx4vv!%FO$M5Pf9=stCkeuk|f(zYz@wb$pmIBly zcUBdCL)9u>oSgU%%Pai-Am#dCnMygG@5ak?<~Jjz@1!{QekglBXTm5BlsU9M-CZkB zndW`zW={RacK2Z6o^k(<{CoElUtM10=B}CBb>Jb}D+ar6z#h0Vm8%4-9m{8oV74%+ z?%QA5%oirGBU>JTvwcVjM4s~dnOY6K-?#t1Db;2;RjPU4`G?O(;Ff)QUuZLwqkN|0 zu$e(M{f71L5VwU4oOyph^^9MRtV^fFEG%z3h?`_dIf8;bTlqur;a zZ7BxFq}V+JetrVd8{K0jAnon|a9HHU{10OW`GYkO%X94!^R9|s#Fm@dYWK#lz?niPrcp{^vbmBZU-ftm=W<`lMLP4s4U9{uv6W`PG3v?dy-cL85l~6Y;km`$ zxF%gl%c4VY@R=K+4zH2|cnUU1wjkdz!vVy4x?^BZyFrFP^f*?LVPr^*L$c4B)3AcF zhlrfu{=o>XodN(3b}eI9U?RPh!zX_X+2hF`5ZSO4t1KB8ljbj*C|jwkcq|vH3r_#B z*nFX{{mbW;l_uBS zwQ=aLQ34pl@LT`*8LFH1XIMXns716p`YSc)EIC1{72=f)@M^UUB#P;Gkdr?+HZD{( zfi*r3b$eK@!8~7;hXZjc-i%-o^353vy}-el^_#vpO$1~JN;fW+NNGH1cWYLVkII)O zOrLxL=I}W7XNQKTp`5*#f_H)0jv0CR0aT{9INKj^Bwu z#2rwZ16E;p!&}6F*|C?QsWwebWm#xM*UZL)1sjDzYn)NZ1zLxv54Z{FuQ_0$L{#ve zGB*=uaFkuLsxdbLZ8{dl_k4%+8pd-=hRo6O#BWX`#L^U^vroPq-x=gy#60Qkovn! z(WQ;z10qrrqw6Dmu-@`$%yRh%9JBdynA8W!%5T(NcKfihw`-1 za%1Dz4kzQ{>s!p8T-o6+6dD|ReXP2dMFG>Ib2jVp%|u`1%OkOvlc~feP~{-?&;*ot zG&l)F5vKlNATCQ;e@6H zU<-cGgdu~eiQHZ>(Mp1fI2G(6^TxR!WITaB559OBd0R~uJ#z0f{XQ+lkf+%mK(1>C zGucv&YjkPQZ#o$1rL_JbeWzh6$fdHQEF?=6U2@mcr}D)vJcqNUP++w}WAVkge-gnX zVc%JlvZWZRlLormuwjHYHoKGOJb`>pzFueULVrui$V8I*22O>8vCF{ckDU(JCfAPZ zeI*a$@mq|g*+r<7JE-MNIY4I%j)AY&vI@|eBAJ!yMzEbffC=4pc2Yd>m)g(%VQfYB z{tl6j3~)w^D_3x85U}e->fR3@_t3~UhCFKWQv1?R%uGSB=JiQ9^J|L_CNte${f4=% z$KpUhVh_W;nVuoCz+L=9{QKwBv_dH+0@!|9grE41h!wh+iEb%{`+4bUYbx>SG4C5( zyM)*C=vUuNF6q0C5Bb*Y*7byPu1ei8?4eH3*?|&a!O1|f%b?YkL+BDQc=gVy`SUOE z=yR}@en%$`=a#dpZ+b6|9v&-bzWAxH$mbTH=Z~}ytFQ0JM>A6BsnfL~km8gEk_#tm zhrabUyC3MkKwLk-*3sQ?QuftJJ!xH*l-MK|&#nbAtoWkCfhfdrkOJLZzbt;xr-YDI zv7dB}rgLt5e>7vZb__3O(uaQ? zzOr6M#L7}7FR5Z7cEDk9;YtF`6hmv0=nDgEKPnE;`8{kuclY+?vBX{$VY1U#7YFEu z^yI+eSH9H>^!DAq^$&E+xW5CA{;d_wpy!{?UFs@*R(>}CD#v!rOpwUU^3NQ*kvyLO zYV#apCwU2CN^HK%^sWB)Rnnlfx9rzw9zfl5qD71}+3 zhq;A%-_P_;oljswNZFGm&`ERkg@QPJ=52=RH*9~&!|de5&R6fbpMFWFOcsa;KdJ*+ zRT?O?doaog@P+w-e9eNIE+8+xh_f^NGjILwB~bP_(Y=eS6!!7t8365_hDeVuyf6o? z`))0&wa&QBzi^?erA5yS@uE}R&+d2@+dQ z;*FkvX%l>B^ET#tqk>{T0gQ*z-tB}oYoKx3nSka zutzn2RN9KKa`oO1YfG712Vs$62q4hFDY5-Lo_rc3E!FIraKd*MuezeHfZ||2PART( z+3p7WMFC^=8|4yn;usgl{=_};uc!RklPE(+#SZ=v#^Z)YS)aYA#Pkw~zp4js7rqS$ z+6SZ0|1|bUw)mr24&Tof?teqbve{>01Yg5uY#;Czo$!X@t+NN^!hb_E&5z+;87R721>(a_Mp)|Hy*ab`Aorq z)`ig+R~SV{zO$Y`f~|N^k)D@sJ8}G|XR1+n?Q^otT#3H)L?O{HbqN_!f&n+X$dF-- zyQ27M#^=t`@c(fE$kV*f0_B}in|&oB0OI1~X0uQKuq;C_4dQn^Xq@9h`axNLu@6#l zfN5J?#oLj^r(H0d;Hgn~bAkRS>Uc8E*xPD3aUxtm8COZ-GB7P-sI9z7U!-xUV;$@= zHU}~_zq09a(waPmStNz-h?(HSmX3}y(JFckI^;e^rpgoh31%1KLC@b$0{+T)jPDPd z^r90x&qt|DRLSi)1p*q<9>~2tP%73g$kt}APdLHD{4$$i<)}y4Ss(@ghf!D&&n^b) z-#jEbLndApH4JU+m$!IzefFEv!dxO>x9wm;o-!sy8lLjgUN;<-zwpq0_D9+F_ljSF zHfKCW^##LQz{+Hk-*SM#dmq9b+vg)#}q|dP%>%@x9 zvbA<43Cm0IiIcMBf*h!;y+TxKQFVsZpF@ z0FqSSo!(24mE3!~8kc!R5sfX*Skl}vZU?w#s^iBm$hR?>yKg^wnM~^793bxOzj}HS zcBBQ?vCCsS@6PN-Pp7;(&TBr?n<#O&$-Ryhw*ncmqYt6kidcyIz|Z_6JIVohekl%{ zP_)*s%t|%Zz++r*mhEQ9F;S^lz6yaj0n>PCn~Jvh9!T?M;b1oPBxmgI;;zMEJLTWv zCouEL9`Fsr@lPU?at?uTsXeM~QqKJXW7dgDd4_yRal;!e;=5WKX#B{ir16oySh2IMY$pB)ES6p|CUhd|snY?Qqro!SV2zh$F*-TxtEk8Ehs5Kr zQaj+GxUTP}oS5^o{jJs~`FM*BE_)zdNjHK|bv=@tw+(k9o3R!LV!4{x|IDP(`g|SD zQ=su?yq@Q8*i_G!=lmZ|4(}lb8RVkk>X9#DxgG?I?-pB0^!7J2<$@!2?6C6;$xX0( zJcB^o)Jz(gsm7vv8V>;zF@dX6+OsV<(2a}9T`Hl=wK?Ydd(VD%aLA7Mq|XPjuC_0# z=)|_uzmfP7z&GbqS_^V6KBCCIf3gUeHNfQ!#@)Wg!%&R_;o*kUD}~p_%8UJx=2B|3 zKKp`Rs%lYY_VnHwXC{!JI4O5HtWHe7Hum5#_2npD!|`7i4k_aFA^;0CpIs%9VocWT zm{@VG&daXErhHssud(`i27c9=4|;dn70pGM5JDhJ%gu9u1*k<*(2SkA>to?G*pUv&Sk2A>rbVy!I;qVR z)!~+BQ~6e;I(c}x%X7c1-7lab{5`<`S{KWx#x!eiOQ8W~{ zwuM8=v?-)gyq?{Hiv_UR;hE-IpBQibktc z(`Ty+fF>V5L8ojbU`*_X1Ov2y;LOZ5Z_^4@FMfN^A@-}A%KIRlwS50gVf5Sl&*`ggb!~pmr$1bt&^tz;yq94{ zA4L02lrhinwqY85MS{F6s-uYnz`v84A>14xJXqZFh!{;H!)%@Z_ z-QHMOSUR|a*wkYn7*T@7$U3WktO0aXaR+p_y+xYj$E%=*0PNzRI@2U8 zw$>kQD89&ljh+nn#swqL<_UdPs-#9YmWEHQ)0E`mU)JZ`E&UtnLcKrUUQU(BDT`uh z?SInq=xb~>jjImE`snn8J{ zuXFf?zGe&H&$cc;CX-3=1+@yam)Z2e>O}9p*`iy$8*{3ctU7)XPASfE$)5`slNZL0 zFH(tqGrt(Hwq>wTqreC%!Qg*g(50qN?+|GkS>Xa&m!3HF_X(0FzDK@C&6jzIG0yXr z>MB!TB>Q55IwSXbKPzKg`W%8Sh4Pl^EP{%n(*tGtdkotxJn%@@fVC|7{+!>Cp2?ZL z{g3WKU&b2Ki$9jpZDBaT=B8hAQd8j|>AC^XIw%@V%=2!IS)*z0CCSU^F za)6<>T)%jXPOC4lGs>o07S-Ne(NZR5mOAfIJh%0&y#!t25 zG89IeZ|S!Y5)?$3gtbtiS(1`8@LtNO_8H2u5#xVS*cTt4YbM2MB%egr&CWI_{2EE@ z<-ygo1_c4WFk~Lye|RBC@9L?utcIw1oKWGcdDO|wO}^I1h4@<}DG7NpD{07;)C}kI z5r8vd8}seM5UAtkeLx{`KHg}W!o;Je3S9^{CvFz=e8)5t5hojb!6`H zNNL_G=L#@s^kVy~>)BYodvxL>*d6r@pZ@hyByQq8K-qZ!hN)qlrM-ebikt?(QC#nmQJ^p%`oB97obH|}e^<|-e`x{?=UI-h)> zE;mtSpZhH5cQvHB{D#}~HF2Zex7vm(gf;K*og904xkLOXa-o0+oAgqidI|SwxJoa* z#AxcOZDa_j26%Yl&pNWvv>Dr&9r*+OLW(PzuNRG31M8Lu0-=E}B#1v(!b;EtsoM@h zk|avN49?BpI-5QAG4}ja$BhOt5L%~ob1KSc#&ILYlANG%JA66pO}Jmt+V0Ua)#r5T zDlI27Ha2yYVyY0pKYM6U1ZsX|@*t4u2M(xf4_JADyux#mm#lcXYCHoxIQ!rZIP~KF zCMl*J6%CqEJO_Eg#*UMupOJ2?-kYI`3f2!z+i1xCu7e~!pglYOfgMQ1g96II>tuAn zWui<}W1KC`d9v0i3WK*d(!19Erc$xlt}R+52Ln2%K_i6>+4Ig|j;U2)OMJLyn};XH_Ep zy`I4`7beTe6|qHNNAZ>_DH`7WBR}ko31V&H=uZDgiaYwOV{;wI6Bt;*Vmx1eeTPS6 z)Ev{wx=POhQ0~{lH_JIWochb$>_!F$Qwj3JFkGBi;%)Y^$;7EuWl*T`h5JIa+%H&1 zXZA1DX}y!OB3oZZlvmlSVe!GopjN@U2tc3)phT}GtrFsoSfl>o4~Kc*u%GI`{*oM$ zYSVPGl-A%6i{!aQ2kOyqnD^rRIMf$poIz5#nRR++vAvCl z8;QpiLY;>&F`|L;v4Oz$Y`(|PLBnzviMeLY2N2Vo2$OF({?FcVzErGh2J&r1rJNV@ zt9E%7ViUlU|+1!+|*@3+i*UDyL zp-p1V@IH!m3mPUJeiO?F_T&+KYRykr#vqN|56z z4ltgczQEB8bBoqjr+eN5UwDNZTwmD3^Ym_R%I0-!zdBW4r=}i5 zC1g)+oOmh!3sSb~i=W|)wv$if*K5r6SYGpHUu#((^Q+AP<@^I_&kC9YFP*&_#IE!X z=Wk>xbe50R>TZxVRddDT41-t!>3i&}!iw4AEK^cUwQ~|ZO<&K~cv{mH`TDYh6hIJE zI*Wf zN)d1!RT=I8X7T+;JEFrDo~I!E2Rm0M{|+eqa>@sk;X0$kd*e~o0`%MUmT$x3$P(+U zD*y#__Xu|=?cU+_E$1I|4um4gpaxb$5BVgye5VPkDgNXN)a>bvYD*de}5OaFO|>10oeu> z4kvo8!OOR3py7j0?Wg>Levy05TeT&B;k{Vyv%;LXo?OxzCt}+!hA#$4rGaocunO_+GYKJz6{%CSzDpYC%^No#Oh-nNn;u6)tIy+Y)lxQ zhW$IG-wowN1daRQi7sZwYE(`Q=gErQbsY0GyXcRN-550)LHeoZRJ%i}XPaP_uHqXc zBWCKC7#3Cu3XE`;W_}N8SIb|YVw$Y1nZ|5;8`p0q4V2A|REr10yBT^#H(LX*1`BLk z2}aq;$QkL60-6lyCq!6!HY@Z7a}X!Ob~jt~a3cLcpH_ggb%kUoe}d z!M}>bJyt#3&bKk@?=GAVXi6nd2{YCQ?jEjNTtw{TFP^Rcws*DtMDrvfm_fZxc5V_- zPkpD{CL^O&GX}|6srs`)aorKTBm~S!dK}20*$k6AucH%w>6Wx5@FGe)AP{%b{(Zt& zfE=IM$z4)xZwpwWlTu#OP%YR@8n#k&vQTu2rIeV5`*~&**rvE4Z_^*oO#Mx#^^p(| zS&De&-QCKRhnO*rn|=lQkN-no8wM8&fE5iqfkJm$zd`(4s)wTpU#{PbSwS3C+Bkda zfATaGt2d3l$dezhW8FLnIyexHO`=HVcJ6A^3&J5$1<0>7AYfmWI>MgaX9Qj<8+QZw zROKr>q&#Jw#@j*oS<4ros!)abcC+cI$TPpVa4DCB7$~N~#*X;*k zhuL6Z-tNE`b9#|VYtsoAv@yWHQVwdA2v80pLOa&Z_$UrbzEb zw$|ngvb5}*2B6wIUziiF^)@?5Nw@PDxOi$}L-1w1h+)=60ot&3Ht$jZ8YZ)JgpIdLq@6ILO z?UD2!4pd+-SAW#x`m7k#kzbZyF=N^fe0VrR@fcn-2iXW)Iox)G&k2;4_^$pz9OXP; zqQ#R0_(BDLiOU7%8h-j)jnuMk>lkcxwMXUyZvmW#x(^B(tq_-($YKIDwZT}{Vs1zh zeow=>x@WEIC%>V=)rx zn4%Q2ce$cwV~I=oi)iw=SbX{ir_l?#YZ&(-wb~(-y47n%=l)hG17bRgM8(i|c+b;5 z{5*Fs=T!3+neoC@n&-&RO$#kd4{X)tDXt%lMxAB*oKz+rG^0zJ63&u8|7l-8I94)X^ zzx|0gX3DN%!w?qz4%&=hJAu?ikZb!Ysf(PRH=;H|(iy1wUtz3QoHX!(lOV-cUM!bl zFue9E3U9bY&Ls?4GoWeeLn}=yG|QA6BY7XW&>J|aJ4FY{-%$2WSj|aAnD}7C{}d$$ z78qNF<4NqhoISI{?2{jyop$D<1LU~N?@5QjCEs#@A#VpMS$75-lOPh$Oj}JQ%=|@4|RD2bPV5n&DG{?dCI!!?_qjKwy`WnR!>+2cZTuu zC=dBp9^zh8K(YWyckPA@ds;I4OgyX)H~Ju+3&!zD!zjZJ7sMg=Dygbb78Uwm2`3*nxki<>8`nA_Mk zkmyA7JRq1ijIBAJ^|q;#?ea8Y#N=}LKhMuqn!5P(hp>#CEp>%LUHUWoij(GRu_lwX zbK70ZSM;P+Ka~@r0;ikCFPhXFJ$8#R7iykMIf*Q^D>wO>g(fnw?qPwvh9VnW2dC!6 zr!Gc=@7P!t8Ps~kKQbtuo1Iqa?x&o%x-(?#=T$c;TnC7Xqbl}q`e;#YJN@^Qn_5_@ zl@OgsJKLGAXuyL4OW&>O5CtkKi5?1q>U!6v-KnDp3d^8#Mu&AyoZ*V~U4Yu`+zK$y z5uh{>ofGyAr00hiJfzs1!p;^$-K1(O{LsWsBbMM^cboooIR0>Jtspa@aiip6^VE#x z)=~3JW~=eF7d$`rKD3$RQ>+%L0;7#uB?Nd!PZrL1AG1$OE>u#(&d*7J>ytVtme5fC z@YxRn*LwSDi@FAzr{3ovp}>uMR0s$r9|QYcx;SwO8jgwc8lDKv9eOV zXFHxnt|%5FI@@<0=9vPkO(2!$GSHv8YQ##~WT!rSfeH7v3;!+pl(Nx94lYnqjbd%K z73&2l6?fm#7xT878Uw~@dw>j4zS%VWj;FvitlkRw_Nl)Cnz<5HXKo<`o0z^3mv45TdgeZ=(3AAqeB2WA?A{*H@Jr|R8P#_wj;t-2 zm8!?XeT+ z)nHh;oNt%+?D~xllI974J|OW#yVQ7;|5K;#5|cs83vVU5+oc@XXd((c zEmV?j+vwg<^!?TN7tkktg%5)S0*6o)T~5vz>L$#RrIF(6{Z-A;gt2`9-DG}Vv! z;kF6AY=Bz^3g6y~Gdp&1aJ|T#Ho`2YYet-oQj9oZVNqf3sVHfm#MgPH9M`8DpQYg4 zxqKFQ0qDu8lGdioY-^|Jtvm9wO`21Ok;d69sa_i~i3&E%dO5^q0Qut+WV;(4;c*T5 z9Xp;}uS$F=H)8iq;30SrgauC^HqXtw!#Wf1veNVe<~Vs|gUH{V9$T+l9vj|u^;Og5 zE*IpL5k8Xk!(A8KGpIsv1Kj~Vaw+bZl0*dyUD9PPo>RetAZ^1^fKM0nwp@bLP24R$ zt~){L)03DA_2AmADF>H1*^6s6+hu?3jt-{xSjpE%cfX%$K4JoKSyb4HgS47(+_yU* zy#aRziG1^jbuVll=8`Eia3JG=5#k-ULWxJJi;rjbYthTg=W1re1ssd;sGxK1vR+#O zmXul8MehMC)rxQp`!G*Ir(u7evdg-lPM*=kjhvTEdI1!oRAU3u*1L97PPC*xL zWIsCVxIBh&i?F6SJ)Ihz@w#7a?6h;8q-ouLnyV?jcI~{g&ery%OIG6c)@yV@Vls8D zOVyyJu=uM7k5>9Otq`x3z@JF6waI7L>r#UIrN3`@_-+YzdGx!CVf7L?Na7?PjyjX( zke#;7LYRaJR3EriZAObfgH87Md#-ta?L^xiHY2ALD;T3!7`t<^o6!unC&1#(hno!1 z?rWT_1VzvpEcao1=NA7eVnviHgTLctgID0xTD!jY7(V+F2n1tbKw^&g)bP46n_iCH z1K={izW%2Ox=RgAK24Qyx(2L-S_dx>aJW9W!%FJsKLADwXkb_FV5L|t!VU_qUGFGh zlPqYHCr<)efuJEoNPyqrCUG%JMQ%aqC(8zBhmc>t`~=Ga)ZMINxoA61Wx$mPuyV|4 zy_pS)h;tv$4M8SZhcm-Y{lQoSgH)T$RfzHLuaL?(5I2q)Z7L~uB?1xvz* zk}b8}c`W6I@+m}s+qrC)5{~{@5*Jr5vBImR%9BH660CwAixfaCQ zdV|OSv=4?bBzUOgevGRKSGF*5@>%#JivCg+_l5S?r@O-$5Vi& z=cuz;gLCi<&m;IgSXrR)-H-R=&GaU^a1NWX-ERR~9%x92b`2G_ zju>rafY-iEp3L0{wf@$!Mp&Si`Ld|!t& z#~H!!-@R(-aF5^r&x|+$)Eu9Ig7xY`cow!_ku-Q`1+gzdOR;cSoP60VXelnw2>1Y& zHfRV(-Nh(85;yjLKbJ$NvnhrusU-x!iu-A1y2IGN%V0;jjt{xSoMSuiE>rK$PLB<) zz78A310z724u@UcH5M!=7u4vxe!-Jh3y-O$FtFp(s#a0@~$o0-Xa>7pzE7`3#zN1fQE2O8Vb0X=m|eE?x6`Bknh8 zFhfMU#BSSn$frlv%H;!0omSS!7E1 zCG-PYyBu4|!NqGnQ>CwnHO@zm|NRKBAjmFRKvl&dKzZo0eQ4s#jz_h%PjxdpEvH|V zgM)Wr^p}%YHpRE%Og99OdHhe^|68H!5Qu3uPICOe(MR0Zjn} zFYxz2{aa2?-C;n2AeEEc;yzr=jjgHi|NF@SO1zCm4ZP}tl?RBq@d?wmBzM^t~Uj_5Njm1eS1P#f$cJ(LlEby<18V_KwtCuk8 zymmm0)Rvk_bxxE=_eS9w@Gvi{0`>%G1v{4mZMnPk1!rj700x))zfmp)=>jx_<=VWtLwwM9#{p_dDP`)%EAGaoZ~ebM zi~>MC7-A?vn`lQYd8%@C>E%SlB;nTf8tCA>Gn7Sf{xgX5`Hs&CBW{^Sv$v_@yq54g znU}M_y8eR>So?8bNB;WvnIj270avaoj?04S?;0GEn^*G+*jR`g zuYG!t3z_KEWmt<`l3#jd8ezKXbPFQbn15Uv@KL*VeE)r97F8b58nt=I(MEP#%+cMi z`@i+yej8}+Opc!Bd-$!7PyGE3avYa(-=OhkAlSxLkY(dn))i@{V?hjP$=UEUE7bhe zM1!g3I%=|LSGmY@{($6{!K%@e=8ECh|C^fNv8S7{NvpH8e?VGoBI<_zZ!(h*1iG}% zx+^5SAiJ7myjnFx5Lqa%I0ALfhW&5eS>(090(tcsZF)cJH<`1K@Gj|RpdsG?0^+V6 zEl~~}C7xLFmIeF2FMtiKWbnV9N(0&0Oc*Ekzi&Wv7B#s#e?gzVM0${t81_*7TmNu0 zwqJM_5G|!w9aUPn)VK!?l?QT)FUUquuWkbV4b0S|sG_x+M3nUSe@;;yABHkGm>o<~ zbd->DslR{p)wKwb%dC>*`n|wSXV{;ziv(iI|Bd4h1me%XK|!|5r}s*C!t71{TU}q; z<-_5VLoSAsPi=6!w?n?3|8JA$4F`Zkr>QHE-^2lJ4>PX|HOK#khVoMTSw~8Ukxb#= zRCu6c!9zCk5Xz-aKEir~?dndD4|Jppp?Q9=cuKu6#N^YNM|i2xyQr)Gh1+8Ll^s=q z`Za5!K=Hy76Cf1&pHT#(xbbfk9d#^vxZA{m!wVYNTDkVV!(rmIQh=Lo=vKuD2Lv9_ zF8zaGQ9m|DZ0a6n`(cK^|NR3{v2(qVspR|bK506@9^8lh|F(K|1GK*D3VympXoVEh z-B)r2{kkDbSi5FCV1P3a^6!UbCg|CbRR`od4o)GwUuszGn(M%I5Pr8(SUZ1z>|K--S z6!ZT_5!vQ+L&I7-u+>vnpQ<%u+ze^LtndkSGN1E~5qNe6uuw8$PB&|Gi-sn4IROi2 zuF{2G94RaTHsuFmvkx$XBf%jOcnlK{(`ugu9mNe0wHooEtFjINTTOmO1v}0GH#mU6 zQ&4URc-ZiI$>BX4TVMU}isH#I2g@t~PHa2#0*?_+muNh3O(Z3`;ZP;$&{_}x7FY(q zd6?XwEicYhchZF=^q`UoZIbWm2GAuh4rQPKVzaYRE*-nClK}cY=C8bN7eZJy^nU2sN_B z1a3svLfbe28&|E_*7T>133!DP2mreVG0YrqfXkVR8;#2kWZ7QG&<0B^_`}Q;Y5{Uu zDkvlsqGOOsc;J==9&o|M0IV;vR0Dij!ps?&p$!0wP|0xZM$-)ecTdQJ9QYv1aKS~e znV<^Y;?!N zSXUN3Vt78o`Mdj@{@0S>&Wx}|ZKlHlF7{3Ca?d_B{RwcGR}6D2uqkviz~TH^g$0Kp zF5n6Vws|hB`NdGV4&D_q2|Xv+mSweY;U&h(FAMLwENBzkCBzJ?=70lY#wCa6xvaP? z%(2GC;i^cAawC$f105Dff4g?yYSn>OH%QT>)dpUoFl*vbMB)C3A^lpzXTjG2&Ze^+ z7B7Uj1>wfg}busHo$G(KoHWQ z6`S!)sBC&;z{ZBDd@sTx8y}v5Y5*pH47Xz&niy8sD12vscd#Wa%E1M!%i$+57{Z!9 zpHW!w7%b3W6gKs(;soINmX?sP1~x}tR&DE7u+BbU_roCn9m8=MaQp_Gdn3jS+`ZTx z^OpfyXih!M$+6{TIwbjk4B9)<`pN`$aFyQRl`LPZ@kWn%_i=|_-6d-wmT?76y?A-n z#EYeSS5!4LK*YQPr~0y%AQI&!U}2c;rwD6Ay7;j+Dgamh0>OeLU~f-q3UEXW2m&@j ztAd6VMR^k;H4QLHm)x~GJwXYUBJ~u&Y8gbk8z78=Gm2maaB&NmUXUaRaX#omXb{kv zmnad+`u_6*FfSnU6L7qEHIqDRohVpfs?YVWT5@0?GHA`=;i&ivF5?@xmS;vy&CC#L1s6P8IIP5ULs{q-mJi9dnlF@4WHfPVe#a z^WO`j-_+k1fAUY~!TXb0Ki@xG^sjm^%k|6L|Gt-h{P%mqm;d|Df4Vyi*Tdv0zT=Np-Ur$#*mvv4FO#l}{9 角色:资深产品 + UI/UX 方向说明,与当前仓库文档、页面结构对齐,供评审与拆迭代。 +> 日期:2026-04-19 +> 说明:本文件为 **v1 汇总落地版**;细节子域仍以专文为准,避免重复维护时以专文覆盖冲突段落。 + +**关联文档** + +| 文档 | 用途 | +|------|------| +| [产品设计文档](./产品设计文档.md) | 功能、数据模型、状态机基线 | +| [产品改进建议](./产品改进建议.md) | 中长期方向库 | +| [本期主线-下一步产品优化点](./本期主线-下一步产品优化点.md) | 报告传播 + 成片 + 留资 + 绑定切片 | +| [宠主端预约体验优化-产品说明](./宠主端预约体验优化-产品说明.md) | C 端预约入口与表单 | +| [前端 UI 规范](./前端UI规范.md) | 视觉与组件基线(已与 `global.css` 对齐主色与 token) | +| [洗美报告短视频成片方案](./洗美报告短视频成片方案.md) | 成片边界与工程契约 | +| [**P0 研发落地清单**](./P0-研发落地清单.md) | **发给研发的 P0 任务与验收表** | + +--- + +## 〇、待决策项(避免返工) + +| ID | 议题 | 选项 | 建议 | +|----|------|------|------| +| D1 | 主色唯一源 | A `#2db96d`(`--c-brand`,与 `pages.json`/全局样式一致) / B `#16a34a` | **已采纳 A**:以代码与品牌 VI 为准;见《前端 UI 规范》修订 | +| D2 | 对外是否承诺「排队」 | 有容量模型再写 / 不写 | **无容量模型则不写**「排队」「不排队」类绝对话术 | +| D3 | 报告 token | 仅页内提示 / + 作废重发 MVP / + 有效期 | 短期提示 + 埋点;中期 **作废重发** 优先于复杂有效期 | + +--- + +## 一、定位、场景与核心流程 + +### 1.1 问题与方向 + +| 问题 | 方案 | 理由 | +|------|------|------| +| 价值偏「台账工具」,老板难感知增收留客 | **双叙事**:B 端强调「工单 + 可传播报告 + 线索」;C 端强调「少填一步 + 报告回看 + 提醒」 | 与 SaaS 北极星、主线文档一致 | +| 预约多为店员录单,与「用户自助预约」心智混 | 短期文案统一为 **「代客预约」** 或 **「门店预约」**;中长期宠主自助 + 核销见宠主专文 | 降低期望落差 | +| 状态迁移接口未完全收口 | 后端状态机校验 + 取消权限与按钮显隐一致;错误码:`INVALID_STATUS`、`CANCEL_NOT_ALLOWED` | 防脏数据、纠纷 | +| 报告提交后是否可改 | **v1 锁死**则全链路提示「提交后不可修改」;补救能力单独立项 | 减少客诉与随意改档 | + +### 1.2 落地规范(研发验收) + +- 预约状态机以《产品设计文档》矩阵为准;列表筛选默认 **不含已取消**(见 §二)。 +- 对外宣传物料与小程序描述:**不写**未实现的排队/叫号能力。 + +--- + +## 二、信息架构、菜单与导航 + +### 2.1 问题与方向 + +| 问题 | 方案 | 理由 | +|------|------|------| +| 「我的」入口随功能增长臃肿 | **角色分流**:`Home`/`Mine` 内按 `role` 分支;宠主 **不展示** 门店 KPI 看板 | 专文已明确:C 端不进「后台感」 | +| 「已完成」Tab 含取消单 | 列表默认 `status=done`;提供「含已取消」筛选或子 Tab | 财务与心智分离 | +| 深链不足 | **Query 协议**(建议统一文档化):`storeId`、`petId`、`from=report&reportToken=` 等;`CustAppointmentCreate` `onLoad` 解析并预填 | 扫码、报告再约、分享落地 | + +### 2.2 落地规范 + +**「我的」分组(老板示例)** + +1. **经营与订单**:我的订单、预约相关入口(若未合并则保留高频项) +2. **店铺配置**:店铺设置、服务类型、排班(中频) +3. **团队与线索**:员工管理、线索(Leads) +4. **个人**:资料、退出 + +每组 ≤5 个一级入口;使用 `.module-title` 分组标题。 + +**深链优先级**:扫码参数 > 报告带来的预填 > 用户上次默认(门店/宠物)。 + +--- + +## 三、交互、路径、文案、空态与异常 + +### 3.1 问题与方向 + +| 问题 | 方案 | 理由 | +|------|------|------| +| 宠主首屏「+」弱、空列表冷启动差 | 首屏 **主按钮「预约服务」**;空列表主 CTA 置顶 | 见宠主专文 P0 | +| 发送报告步骤多 | **发送成功页同屏**:链接 + 二维码 + **2 条可复制话术**(变量模板) | 降店员切换成本 | +| 成片/留资仅成功态精致 | **统一三态**:骨架/加载、失败(归类原因+重试)、成功 | 信任与主线文档一致 | +| 登录打断填单 | **点击预约再登录**;返回保留草稿(Storage 或状态恢复) | 降首步流失 | + +### 3.2 按钮与文案常量(前端可抽 `copy` 模块) + +| 场景 | 主按钮 | 次要 | 危险操作 | +|------|--------|------|----------| +| 工单 | 开始服务 | 查看详情 | 取消预约(二次确认) | +| 报告 | 提交报告 → 发送报告 | 稍后生成短片 | — | +| 宠主 | 预约服务 | 更换门店 | 取消预约 | +| 发送成功 | 复制链接 | 保存二维码到相册 | — | + +**失败原因对用户映射(示例)** + +- `NETWORK`:网络异常,请重试 +- `ASSET`:素材不足或损坏,请补充后重试 +- `BUSY`:生成排队中,请稍后查看报告 +- `UNKNOWN`:服务暂时不可用,请联系门店 + +禁止直接展示堆栈或内部英文错误句。 + +### 3.3 空态与网络 + +- 统一 `.empty`;弱网:首屏请求超时内置阈值(如 10s)后展示「网络不佳,点击重试」。 +- 列表首屏:**骨架屏** 3~5 行占位(与《前端 UI 规范》并行落地)。 + +--- + +## 四、UI、色彩、字体与卡片 + +### 4.1 问题与方向 + +| 问题 | 方案 | 理由 | +|------|------|------| +| 历史规范主色与代码不一致 | **以 `src/assets/global.css` 的 `--c-*` 为唯一源**;禁止业务页写死绿色 | 设计系统可维护 | +| 工具感偏强 | 高亮区用 `--c-brand-light`;卡片白底 + `--c-border` + `--c-shadow` | 与品牌「温暖」一致 | + +### 4.2 落地规范 + +- **主色**:`var(--c-brand)` `#2db96d`;深绿 `var(--c-brand-dark)`;浅底 `var(--c-brand-light)`。 +- **字体层级**:标题 18/700,正文 14~15/400~500,辅助 12;禁止 ≤11px。 +- **圆角**:组件 12~16px;页面左右边距 16px(`.page-section`)。 +- **H5 报告页模块顺序**:店信息 → 服务摘要 → **短片区(若有)** → 前后对比 → 过程素材 → 备注 → 留资/绑定 CTA。 + +--- + +## 五、功能细节、边缘场景、会员与闭环 + +| 问题 | 方案 | 备注 | +|------|------|------| +| `report_token` 长期有效 | 页内隐私提示;埋点异常频次;中期作废重发 | 见《产品改进建议》§六 | +| 谁点谁服务、无协作记录 | 短期备注协作;长期多技师/分工表 | 不改表则产品不写「多技师提成」 | +| 宠物历史 MVP | 列表/详情展示「第 N 次 / 距上次 X 天」**有数据才展示** | 与 `/api/pet/history` 等对齐 | +| 会员储值 | 路线图 P0;本期仅预留客户域字段亦可 | 避免前端假功能 | +| 时段已满 | 明确文案 + **快捷切次日** | 宠主专文 | + +**报告媒体类型**:前后端统一枚举;优先字段化 `media_type`,与成片任务对齐。 + +--- + +## 六、商业化、转化、留存 + +| 方向 | 动作 | 指标建议(与主线一致,可二选一) | +|------|------|----------------------------------| +| 传播 | 分享标题规则:宠物名 + 服务 + 门店;封面:成片封面帧 > 后图首帧 > Logo | `report_open` / `report_reopen` | +| 成片 | 成功页引导保存/转发;失败可重试 | `highlight_share`、生成成功率 | +| 留资 | **单钩子** + 最少字段(手机必填);隐私一句 | `lead_submit`、转化率 | +| 绑定 | 留资后一句话价值 + 最短路径授权 | `wx_bind_success` | +| 回访 | Leads 超时未跟进标红(阈值运营定) | 门店执行率 | + +计费模型(按店/月、成片加量包等)在《产品改进建议》§七层次定假设,指导裁剪。 + +--- + +## 七、微信小程序与性能 + +| 方向 | 规范 | +|------|------| +| 能力差异 | H5 不承诺原生分享卡片;以长按保存、复制链接为主;小程序以 `onShareAppMessage` 为主 | +| 成片 | 接口返回 `posterUrl`、`durationSec`;前端视频 `poster`、封面优先加载 | +| 分包 | 低频管理页(服务类型、排班、线索等)评估 `subPackages` 减小主包 | +| 安全区 | `navigationStyle: custom` 下统一底部 **≥120rpx** 与刘海适配自检 | +| 图片 | 列表缩略图 lazy-load;报告页大图渐进 | + +--- + +## 八、建议迭代切片(排期用) + +| 切片 | 内容 | 产出 | +|------|------|------| +| S0 | UI token 与规范文档一致;扫硬编码色 | MR + 自检表 | +| S1 | 宠主 P0:首屏 CTA、空态、扫码 storeId、登录与草稿 | 专文验收项 | +| S2 | 传播:发送成功页话术 + 分享元信息 + `report_open` 埋点 | 埋点表 | +| S3 | 成片三态 + 对外文案「可变时长有上限」 | 报告页/H5 文案冻结 | +| S4 | 留资 MVP + 绑定引导 + Leads 状态 | 接口与页面状态机 | +| S5 | 列表筛选默认 done、可选取消 | 接口参数 + UI | + +实际顺序可按依赖调整(埋点可与 S1/S2 并行)。**P0 必做项已拆为独立表** → [P0-研发落地清单](./P0-研发落地清单.md)。 + +--- + +## 九、修订记录 + +| 版本 | 日期 | 说明 | +|------|------|------| +| v1 | 2026-04-19 | 首版:汇总深度优化结论并落盘;主色与 `global.css` 对齐决策记入 §〇 | + +--- + +*实施时以迭代看板为准;专文与主设计文档冲突处,以评审后更新专文为准。* diff --git a/产品改进建议.md b/产品改进建议.md index b9fc150..f0ccf6b 100644 --- a/产品改进建议.md +++ b/产品改进建议.md @@ -1,4 +1,6 @@ -# 宠伴生活馆(petstore)— 产品改进建议备忘 +# 宠小它(petstore)— 产品改进建议备忘 + +> 品牌:宠小它 · 用心宠小它,温暖伴一生 · 智慧宠物门店服务系统 > 来源:产品设计复盘(与当前代码/《产品设计文档》对齐) > 用途:方向备忘,实施时以迭代计划与数据为准。 @@ -126,7 +128,8 @@ v1 宠主多为「链接访客」,若不沉淀 openid/手机号,门店无法 - 《产品设计文档.md》:v1 功能与数据模型以该文档为准。 - 《洗美报告短视频成片方案.md》:成片能力与 §5.3 延伸对应;文内「约 15s 分镜」为**参考示例**,实际成片时长以素材与配置上限为准。 -- 《前端UI规范.md》:实现层视觉基线。 +- 《前端UI规范.md》:实现层视觉基线(`--c-*` token 与 `global.css` 一致)。 +- 《产品全方位优化说明-v1.md》:定位、信息架构、交互/UI、商业化与小程序体验的**横向汇总**及排期切片;与本文互补,实施时以迭代目标裁剪。 --- @@ -135,3 +138,5 @@ v1 宠主多为「链接访客」,若不沉淀 openid/手机号,门店无法 --- **修订备忘(2026-04-18)**:全局措辞同步——成片由「固定 15s」统一为「竖屏、可变时长、配置上限、双编排」;与《洗美报告短视频成片方案》§0、《产品设计文档》v1.8 一致。 + +**修订备忘(品牌)**:对外品牌统一为 **宠小它**;主/副 Slogan 见《产品设计文档》v1.9 与《品牌替换清单-宠小它.md》。 diff --git a/产品设计文档.md b/产品设计文档.md index 8ae6e7a..0b0591d 100644 --- a/产品设计文档.md +++ b/产品设计文档.md @@ -1,13 +1,18 @@ -# 宠伴生活馆 - 产品设计文档 +# 宠小它 - 产品设计文档 -> 版本:v1.8 -> 日期:2026-04-18(v1.8:成片「可变时长 + 双编排」措辞与 §5.3 对齐专文 §0) +> 版本:v1.9 +> 日期:2026-04-18(v1.9:对外品牌统一为「宠小它」及主/副 Slogan;v1.8:成片「可变时长 + 双编排」与 §5.3 对齐专文 §0) + +> **品牌**:宠小它 · **主 Slogan**:用心宠小它,温暖伴一生 · **副 Slogan**:智慧宠物门店服务系统 +> **Logo / VI**:[《宠小它-Logo与品牌识别说明》](./宠小它-Logo与品牌识别说明.md)(含概念草案图) > 状态:产品设计确认中;**本期迭代重点:洗美过程短视频自动成片(竖屏、可变时长、双编排)** **相关子文档:** - [洗美报告短视频成片方案](./洗美报告短视频成片方案.md) — **本期迭代主方案**:过程短视频与自动成片(与 §5.3 服务报告延伸能力对应;时长与编排以专文「与工程实现同步」为准) - [产品改进建议](./产品改进建议.md) — 中长期方向库;**§〇** 为本期重点说明 +- [产品全方位优化说明 v1](./产品全方位优化说明-v1.md) — 定位/IA/交互/UI/商业化/小程序体验汇总与排期切片(**与专文互补**,冲突以评审更新为准) +- [**P0 研发落地清单**](./P0-研发落地清单.md) — **本期必做**:后端状态机、Tab 筛选、发送报告话术、H5 隐私提示、宠主路径、埋点最小集等(**可直接拆 issue**) --- @@ -343,7 +348,7 @@ CREATE TABLE t_report_image ( ## 九、后续事项(开放清单) -- [ ] 宠伴生活馆 Logo 素材 +- [ ] 宠小它 Logo 素材 - [ ] 图片存储方案(本地 / OSS) - [ ] 短信验证码服务商接入 - [ ] 微信授权登录 AppID/AppSecret diff --git a/公众号协同与全链路触达-产品说明.md b/公众号协同与全链路触达-产品说明.md new file mode 100644 index 0000000..96d43e0 --- /dev/null +++ b/公众号协同与全链路触达-产品说明.md @@ -0,0 +1,161 @@ +# 公众号协同与全链路触达 — 产品说明 + +> 范围:从 **预约 → 到店服务 → 洗美报告(海报/短视频)→ 分享朋友圈 → 提醒下次洗护** 的闭环中,**微信公众号**如何与小程序、门店运营配合。 +> **账号类型(已确认)**:本项目以 **微信服务号** 为对外服务与触达主号(非订阅号)。下文能力与排期均按服务号理解。 +> 说明:具体接口、类目、模板 ID 以微信后台与研发联调为准;本文以**产品规则与触点**为主。 + +--- + +## 1. 全链路一图(心智与资产) + +``` +宠主动机:想给宠物洗护/美容 + ↓ +【小程序】选店、选时、下单(预约) + ↓ +到店服务(线下) + ↓ +【门店端小程序】填写报告、上传素材、生成海报/成片 + ↓ +【宠主侧】打开报告页:对比图、过程素材、短片、海报 + ↓ +情绪高点:保存海报 / 保存短片 → 【引导分享朋友圈】(小程序内能力 + 话术) + ↓ +沉淀与回访:关注公众号 / 已关注用户 → 【模板/订阅消息】提醒下次洗护、报告更新 + ↓ +复购:从消息或菜单回到小程序 → 再次预约 +``` + +**公众号在其中的角色**:不是替代小程序做业务,而是 **触达、提醒、品牌阵地、弱打扰的「拉回」**;**交易与重交互仍在小程序**。 + +--- + +## 2. 小程序 vs 公众号:分工原则 + +| 维度 | 小程序 | 微信公众号 | +|------|--------|-------------| +| **预约、改约、查进度** | ✅ 主阵地 | 菜单跳转小程序页(路径带参) | +| **报告详情、播放短片、存海报** | ✅ 主阵地 | 同上;不宜用长图文替代 H5/小程序页 | +| **分享朋友圈** | 小程序卡片、页面引导;**注意**:朋友圈分享规则以微信为准 | 图文可放二维码/链接,转化路径更长 | +| **定时提醒、服务通知** | 订阅消息(需用户触发订阅)、站内消息(若自建) | **模板消息/类目模板**(服务号能力更强)、订阅通知(视类目) | +| **品牌内容、活动推文** | 可嵌入 web-view 或跳转 | ✅ 推文、自动回复、关键词 | + +**产品结论**:**预约与报告体验以小程序为准**;公众号负责 **关注后菜单导航、关键节点推送、内容运营**,与《本期主线》中的留资、绑定、复购提醒对齐。 + +--- + +## 3. 用户身份如何打通(产品必须先定口径) + +要让「推送」「菜单个人中心」不串号,需约定: + +- **小程序 openid**、**公众号 openid** 不同;若同一微信开放平台主体下绑定小程序与公众号,可有 **unionid** 做统一客户标识(技术实现由研发定)。 +- **产品规则**: + - 「下次洗护提醒」应对 **已绑定手机或已授权且可识别为同一用户** 的对象发送,避免骚扰陌生人。 + - 报告链接 **token** 与登录态关系已在《产品改进建议》§六讨论;公众号内跳转尽量 **带场景参数**,便于统计「从推送打开预约」的转化。 + +*本节不涉及实现细节,但属于上线前必须评审项。* + +--- + +## 4. 公众号菜单建议(可随阶段裁剪) + +以下为 **服务号/已认证订阅号** 常见结构的产品化版本;实际以微信后台可配置项为准。 + +### 4.1 一级菜单(示例三栏) + +| 一级 | 指向 | 产品意图 | +|------|------|----------| +| **我要预约** | 跳转小程序指定页:`/pages/appointment/CustAppointmentCreate` 或首页(可带 `storeId`) | 最短路径复购 | +| **我的服务** | 子菜单见下 | 查单、报告、宠物 | +| **门店/帮助** | 子菜单:门店地址电话、客服消息、关于我们 | 信任与到店 | + +### 4.2 「我的服务」下二级菜单(示例) + +| 二级 | 跳转 | 说明 | +|------|------|------| +| **我的预约** | 小程序首页或 `MyOrders` | 与 Tab「服务预约」一致心智 | +| **洗美报告** | 小程序 `MyReports` 或最近一单报告(需登录态) | 聚合历史报告入口 | +| **我的宠物** | 小程序 `MyPets` | 档案与复购锚点 | + +未登录时:统一落地 **小程序登录页** 或 **报告 token 链接说明页**(产品需定义优先级)。 + +### 4.3 菜单与「分享朋友圈」的关系 + +- 朋友圈分享 **主要靠小程序页面右上角分享 + 海报保存**,公众号菜单**不承担「分享」动作**,只承担 **「再来一单」「看报告」入口**。 +- 可在 **首次关注自动回复** 或 **菜单旁推文** 中教用户:「保存海报发圈」「报告页点右上角分享」——属于 **运营话术**,非菜单必选。 + +--- + +## 5. 推送:在什么时机、推什么(产品场景表) + +微信对营销类推送限制多,**服务通知类**需走模板;以下为 **产品侧可评审** 的场景,是否开通以账号类目与审核为准。 + +### 5.1 建议的推送类型与触发 + +| 场景 | 内容概要 | 落地动作 | 备注 | +|------|----------|----------|------| +| **报告已生成** | 宠物名 +「服务报告已就绪」 | 点击进小程序报告页 / H5 token 链接 | 高价值、用户强相关;注意频次 | +| **成片已生成** | 「回顾短片已就绪,可观看保存」 | 同报告页锚点到短片模块 | 与主线「成片」一致 | +| **预约成功 / 开始前提醒** | 时间、门店、项目 | 进预约详情 | 减少爽约 | +| **下次洗护建议日**(与 Reminder/间隔产品一致) | 「根据上次服务,建议在 × 月 × 日前后安排洗护」 | 进预约页,可预填宠物 | **复购核心**;需与店内真实规则一致,避免虚假宣传 | +| **留资/活动** | 优惠券、问卷 | H5 或小程序活动页 | 偏营销,注意防骚扰与退订 | + +### 5.2 通道选择(产品认知 · 服务号前提) + +- **模板消息 / 类目模板(服务号核心能力)**:适合「服务结果通知」类(报告就绪、预约成功、服务完成等);需在公众平台选用与**账号类目**匹配的模板,**不可发纯营销/骚扰内容**(易违规封号)。服务号相较订阅号,在**主动服务类触达**上更可依赖模板能力做闭环。 +- **订阅消息(小程序内)**:用户在小程序内**主动订阅**某次通知,适合「预约开始前」等;与公众号模板消息需 **去重**(见 §6),避免同一事件双推。 +- **客服消息(48 小时)**:用户与公众号互动后 48 小时内可发一定类型消息,适合**人工跟进**,不适合大规模自动营销。 + +**产品建议**:**报告/成片就绪** 用 **强相关、低频次** 通知;**洗护周期提醒** 用 **可预期的、可关闭的** 规则(与《Unsubscribe》类退订能力对齐)。 + +--- + +## 6. 从「分享朋友圈」到「下次洗护」的衔接 + +1. **分享当下**:报告页突出 **海报保存 + 短片保存**(已实现方向见《报告短片下载功能》),配 **短文案**:「晒晒你家毛孩子」+ 合规提示。 +2. **分享后无即时推送**:避免用户刚发圈就收到公众号推送(体验怪);可在 **次日或 T+3** 做轻量内容(若做运营推文)。 +3. **复购提醒**:依据 **服务间隔配置**(店内或总部统一),在 **建议日前 3~7 天** 发一条「该安排洗护啦」类模板/订阅消息,**一键进预约**。 +4. **公众号配合**:同一策略在 **菜单「我要预约」** 保持入口;推文可周期性发「洗护小贴士」**软植入**预约入口。 + +--- + +## 7. 合规与体验底线 + +- **关注与授权**:推送前用户需 **关注公众号** 且模板消息符合微信规范;小程序订阅消息需 **用户勾选**。 +- **退订**:短信/公众号营销类需 **退订路径**(项目已有退订页方向的,需与公众号侧说明一致)。 +- **频率**:同一用户 **报告类 + 提醒类** 建议设 **周上限**(产品定数字,研发实现),避免被投诉骚扰。 + +--- + +## 8. 分期落地建议 + +| 阶段 | 公众号侧 | 小程序侧 | +|------|----------|----------| +| **P0** | 菜单三项打通小程序;自动回复/关注欢迎语含「预约」「报告」关键词说明 | 报告页分享/保存链路稳定 | +| **P1** | 报告/成片就绪类 **模板消息**(能开则开) | 订阅消息与推送 **去重规则** | +| **P2** | 洗护周期提醒 + 推文运营日历 | Reminder 与预约页深链、宠物档案联动 | + +--- + +## 9. 附录:服务号相对订阅号(产品侧为何要定服务号) + +| 维度 | 对本期闭环的意义 | +|------|------------------| +| **模板消息 / 服务通知** | 报告就绪、预约提醒、洗护建议日等 **可产品化、可排期**;订阅号对「主动推送给未互动用户」限制更多,不适合作为「服务通知主通道」。 | +| **菜单与小程序** | 服务号支持 **自定义菜单跳转小程序**(路径与参数),与 §4 菜单设计一致。 | +| **品牌与服务心智** | 用户认知偏「官方服务窗口」,与预约、报告、提醒的 **服务属性** 一致。 | +| **群发与推文** | 服务号群发频次低于订阅号,**不适合依赖日更推文拉活**;本期应以 **小程序 + 模板消息 + 菜单** 为主,推文作辅助。 | + +**产品排期含义**:P1「模板消息打通」在服务号上 **优先级高、可验收**;若误用订阅号,同一需求需改方案(偏小程序订阅消息 + 菜单)。 + +--- + +## 10. 相关文档 + +- 《本期主线-下一步产品优化点.md》:传播、成片、留资、绑定。 +- 《产品改进建议》§八合规、§二触达。 +- 《产品设计文档》§5.4~5.5 报告与 H5。 + +--- + +*本文为产品与市场协同用说明;微信能力与模板文案以当时平台规则与审核结果为准,上线前需法务/运营复核。* diff --git a/前端UI规范.md b/前端UI规范.md index 3fd5995..9d45d91 100644 --- a/前端UI规范.md +++ b/前端UI规范.md @@ -8,14 +8,21 @@ ## 设计基线 -- 主色:`#16a34a` -- 页面背景:`var(--pet-bg)` -- 主文案:`var(--pet-text)` -- 次级文案:`var(--pet-subtext)` -- 分割/边框:`var(--pet-border)` -- 卡片阴影:`var(--pet-card-shadow)` +**唯一源**:`frontend/src/assets/global.css` 的 `:root` **CSS 变量(`--c-*`)**;`pages.json` 的 `navigationBarBackgroundColor` 与主色保持一致。 -以上变量统一在 `src/assets/global.css` 维护,页面中不要写死同类颜色。 +- 主色 / 品牌:`var(--c-brand)`(`#2db96d`) +- 品牌深 / 渐变收边:`var(--c-brand-dark)`(`#1e9a55`) +- 品牌浅底 / 选中弱背景:`var(--c-brand-light)`(`#eaf8f0`) +- 页面背景:`var(--c-bg)`(`#fafaf8`) +- 卡片表面:`var(--c-surface)` / `var(--c-surface-alt)` +- 主文案:`var(--c-text)`;次级:`var(--c-text-2)`;辅助:`var(--c-text-3)` / `var(--c-text-4)` +- 分割/边框:`var(--c-border)` / `var(--c-border-light)` +- 阴影:`var(--c-shadow-sm)` / `var(--c-shadow)` / `var(--c-shadow-lg)` +- 圆角:`var(--radius-sm)` / `var(--radius)` / `var(--radius-lg)` + +业务页面**禁止**写死同类十六进制色,统一使用上述变量。历史文档中出现的 `--pet-*` 已废弃,以 `--c-*` 为准。 + +> 全站优化说明与决策记录见 [《产品全方位优化说明 v1》](./产品全方位优化说明-v1.md) §〇、§四。 ## 字体与层级 diff --git a/品牌替换清单-宠小它.md b/品牌替换清单-宠小它.md new file mode 100644 index 0000000..ecc3ed3 --- /dev/null +++ b/品牌替换清单-宠小它.md @@ -0,0 +1,109 @@ +# 品牌替换清单:宠小它 + +> **同步状态**:前端/后端/主文档已按下列定稿替换;微信短信签名、公众平台名称需线下配置。 + +## 定稿品牌资产(产品) + +| 类型 | 内容 | +|------|------| +| **品牌名** | 宠小它 | +| **主 Slogan** | 用心宠小它,温暖伴一生 | +| **副 Slogan** | 智慧宠物门店服务系统 | + +**使用建议(供研发/设计落地)** + +- **主 Slogan**:偏 **宠主情感与品牌记忆**,适合:登录页主副文案、报告页/H5 页脚情感行、海报底部、运营朋友圈话术;字数较长时注意 **小屏换行** 与字号层级。 +- **副 Slogan**:偏 **产品定位 / B 端心智**,适合:`manifest` / 应用商店式 **description**、商家后台页脚、对内文档、官网或公众号简介;**不宜**与主 Slogan 同屏并排抢视觉,通常 **二选一主展示**。 +- **门店名称**:有 `store.name` 时仍以门店为准;无门店兜底时用品牌名 **宠小它**(见下文第二节)。 + +--- + +以下为 **历史梳理**(替换项多数已在代码中落实)。 + +--- + +## 一、建议保留不替换(技术标识) + +以下与 **代码包名、数据库、路径** 绑定,改名成本高且用户不可见,**可不随品牌改**(除非整体重构): + +| 类型 | 示例 | 说明 | +|------|------|------| +| Maven / npm 工程名 | `petstore-backend`、`petstore-uniapp` | artifactId / package.json name | +| Java 包名 | `com.petstore` | 全量重构级 | +| 本地存储 Key | `petstore_user`、`petstore_store` 等 | 改则老用户本地态可能异常,需迁移方案 | +| 数据库名 / 日志 logger | `petstore`、日志 `com.petstore` | 运维与历史日志 | +| 服务器上传路径 | `application.yml` 中 `/www/petstore/uploads` | 与部署路径一致时可保留 | + +--- + +## 二、必须替换:用户可见 / 审核相关 + +### 1. 小程序与 H5(`frontend/`) + +| 位置 | 当前内容 | 建议 | +|------|----------|------| +| `src/manifest.json` | `name`、可选 `description` | **name:宠小它**;**description:建议含副 Slogan**(如「宠小它|智慧宠物门店服务系统」或仅副 Slogan,保持简短) | +| `src/pages.json` | `navigationBarTitleText` | **宠小它** | +| `src/pages/login/Login.vue` | 品牌名、副标题 | **宠小它** + **主 Slogan**(原「让爱更专业」一行替换) | +| `src/pages/home/Home.vue` | `storeInfo.name` 缺省兜底 | **宠小它**(两处) | +| `src/pages/report-view/reportView.vue` | 店名兜底、页脚、分享默认 | 兜底 **宠小它**;页脚副线:**主 Slogan**(或店名+主 Slogan,按设计稿) | +| `src/views/ReportView.vue`(H5) | logo 区、brand-sub | 兜底 **宠小它**;副文案 **主 Slogan** | +| `src/utils/reportShare.js` | 默认店名 | **宠小它** | +| `src/utils/reportPosterDraw.js` | 海报默认店名 | **宠小它**(海报是否印主 Slogan 由设计定) | +| `src/pages/mine/Store.vue` | 页脚 | **宠小它 · 商家版** 或 **宠小它** + 下一行 **副 Slogan**(二选一,避免堆叠三行) | +| `src/pages/mine/Profile.vue` | 页脚 | **宠小它 · {{ editionLabel }}**;若需系统定位可加 **副 Slogan** 于更弱字号 | +| `src/assets/global.css` | 注释头 | **宠小它** — 设计系统 | +| `index.html` | title、meta description | **宠小它**;description 建议 **主 Slogan** 或 **主+副** 择一,控制长度 | +| `report.html` | `` | **服务报告 - 宠小它** | +| `login.html` / `register-boss.html` / `register-staff.html` | title、成功页 | 品牌 **宠小它**;副文可用 **主 Slogan** | +| `login.html` | 演示店名 | **宠小它测试店** | + +### 2. 后端(`backend/`) + +| 位置 | 建议 | +|------|------| +| `pom.xml` `<description>` | **宠小它** 后端服务;可括号 **副 Slogan** | +| 短信验证码文案 | **【宠小它】**…(与短信模板、签名同步) | + +### 3. 文档(`docs/`) + +全文「宠伴生活馆」→ **宠小它**;产品主文档可在扉页增加 **主/副 Slogan** 一句。`产品改进建议.md`、`产品设计文档.md`、`洗美报告短视频成片方案.md` 等交叉引用书名同步。 + +### 4. README + +`frontend` / `backend` README 展示名改为 **宠小它**,可加一行 Slogan。 + +--- + +## 三、平台侧(非代码仓,需运营配置) + +| 项 | 说明 | +|----|------| +| **微信小程序名称 / 简介** | 与 **宠小它** 及 **副 Slogan** 或短描述一致 | +| **短信签名** | **宠小它** | +| **公众号名称、菜单、模板消息抬头** | 与品牌一致 | + +--- + +## 四、替换后建议自检 + +- [ ] 全局搜索:`宠伴`、`生活馆`、`让爱更专业`(旧 slogan) +- [ ] 主/副 Slogan 是否出现在 **约定场景**(见上文「使用建议」),无重复堆砌 +- [ ] 小程序真机:标题、登录页、报告页 +- [ ] H5:标题与 meta +- [ ] 短信、海报默认字 + +--- + +## 五、与「门店品牌」的边界 + +- **连锁多店**:仍以 **`store.name`** 为主展示;平台兜底 **宠小它**。 +- **单店模式**:若对外只露出店名,兜底规则另定并写入《产品设计文档》。 + +--- + +*实际字符串替换由研发在分支执行;本文档为产品与验收口径。* + +--- + +**Logo 与 VI**:详见 [《宠小它-Logo与品牌识别说明》](./宠小它-Logo与品牌识别说明.md) 与仓库 `docs/logo-concept-draft.png`(概念草案)。 diff --git a/宠小它-Logo与品牌识别说明.md b/宠小它-Logo与品牌识别说明.md new file mode 100644 index 0000000..53cdf75 --- /dev/null +++ b/宠小它-Logo与品牌识别说明.md @@ -0,0 +1,92 @@ +# 宠小它 — Logo 与品牌识别说明(设计 Brief) + +> 角色:供 **设计师定稿** 与 **研发切图** 使用;本文为产品侧能交付的完整度。 +> 关联:品牌名与 Slogan 见《产品设计文档》v1.9、《品牌替换清单-宠小它.md》。 + +--- + +## 1. 品牌一句话 + +| 项 | 内容 | +|----|------| +| 名称 | 宠小它 | +| 主 Slogan | 用心宠小它,温暖伴一生 | +| 副 Slogan | 智慧宠物门店服务系统 | +| 调性关键词 | **温暖、可靠、偏年轻、不低幼**;服务属性强于纯社交卖萌 | + +--- + +## 2. Logo 形态建议(可并行出稿) + +| 形态 | 用途 | 说明 | +|------|------|------| +| **图形标(Icon / 符号)** | 小程序图标、推送小图、Tab 角标、水印 | 需 **16~24px 仍可辨认**,避免细线、过多细节 | +| **字标(Wordmark)** | 报告页顶栏、海报、公众号头图 | 「宠小它」三字,字重与字距需单独调;可加英文副标 *ChongXiaoTa* 可选 | +| **组合标** | 开屏、门店物料、官网 | 图形 + 字标左右或上下组合;规定 **安全区与最小宽度** | + +**方向 A(推荐优先试稿)**:**抽象小生灵轮廓**(猫/狗合一的极简形)+ **柔和负形或一笔曲线**(暗示「陪伴」),避免写实照片风。 +**方向 B**:**字母/笔画几何化**——「小」字一点或「它」的偏旁做记忆点(需避免与现有字体库撞车,宜定制字标)。 +**方向 C 慎用**:单独 **爪印/狗骨头**——易同质化,若采用需与图形强组合或定制变形。 + +--- + +## 3. 色彩(与现有产品对齐) + +当前前端主品牌色(见 `global.css`): + +| 用途 | 色值 | 说明 | +|------|------|------| +| **主绿(首选)** | `#2db96d` | `--c-brand`,用于 Logo 主形、主按钮联想 | +| **深绿(强调)** | `#1e9a55` | `--c-brand-dark`,描边、深色底反白时辅助 | +| **浅绿(背景)** | `#eaf8f0` | `--c-brand-light`,卡片底、浅色水印 | + +**扩展(可选,设计师定)**:暖色点缀 **琥珀/橙** `#f5913e`(与现有 `--c-orange` 一致)仅用于 **活动/促销子品牌**,**主 Logo 默认不用橙色**,避免识别分裂。 + +**反白稿**:需提供 **纯白 Logo + 透明底** 用于绿底/深色图;**单色黑** 用于传真/黑白印刷。 + +--- + +## 4. 安全区与最小尺寸(验收用) + +- **安全区**:Logo 完整外接矩形四周预留 **≥ 0.5× Logo 高度** 的留白(组合标以整块外轮廓计)。 +- **数字端最小高度**:字标/组合标 **≥ 16px**(逻辑像素);纯图形标 **≥ 24×24**(小程序 Tab 常见)。 +- **禁止**:拉伸变形、改色为未定义色、加投影/描边破坏统一规范(营销特例需单独规范)。 + +--- + +## 5. 错误使用示例(给设计与市场对照) + +- 把 Logo 压在 **高杂讯照片** 上且未加底托; +- **同时**使用未定义的第三色与强渐变; +- 与竞品 **同构图** 的爪印/骨头 **无差异**; +- 在 **过小区域** 使用完整组合标导致字糊成一团——应改用 **纯图形标**。 + +--- + +## 6. 交付物清单(建议设计师输出) + +| 交付物 | 规格 | 用途 | +|--------|------|------| +| 矢量源文件 | AI / SVG | 研发与延展 | +| 小程序 **AppIcon** | 1024×1024 PNG,圆角由平台裁切 | 微信提审 | +| 多倍率 PNG | @2x @3x,透明底 | 小程序内嵌 | +| 字标横排/竖排 | SVG + PNG | 报告、海报 | +| 单色稿 | 黑 / 白 | 印刷、水印 | +| 一页 **PDF 简版规范** | 色值、最小尺寸、错误示例 | 对外统一 | + +--- + +## 7. 与工程衔接(研发) + +- 替换 `static` / `tab` 图标前,**先替换设计稿**,避免线上半新半旧。 +- 小程序 **navigationBar** 与 **分享卡片封面** 若用 Logo,需各提供 **反白/深色** 两套或统一底色素材。 + +--- + +## 8. 概念草案图(AI 生成 · 非最终稿) + +与本文件同目录:**[`logo-concept-draft.png`](./logo-concept-draft.png)**(仅 **图形标方向** 之一),为视觉参考,**不替代**设计师矢量定稿;商标、版权与是否采用以法务/设计确认为准。 + +--- + +*修订:首版由产品侧起草;定稿后以设计团队输出为准并更新本文色值与路径。* diff --git a/本期主线-下一步产品优化点.md b/本期主线-下一步产品优化点.md index 77db4b8..8b681d5 100644 --- a/本期主线-下一步产品优化点.md +++ b/本期主线-下一步产品优化点.md @@ -85,6 +85,7 @@ - 《产品改进建议.md》:战略与中长期方向库。 - 《产品设计文档.md》§5.3–5.5:报告与发送流程基线。 - 《洗美报告短视频成片方案.md》:成片能力边界(需与当前「可变时长、双编排」实现同步修订)。 +- 《产品全方位优化说明-v1.md》:与本主线配套的横向体验与排期切片(埋点、三态、深链、小程序差异等汇总)。 - 《产品协作约定.md》:产品说明默认落 `docs/`,代码由研发实现。 --- diff --git a/洗美报告短视频成片方案.md b/洗美报告短视频成片方案.md index 445f74c..f0226a3 100644 --- a/洗美报告短视频成片方案.md +++ b/洗美报告短视频成片方案.md @@ -2,7 +2,7 @@ > **本期产品迭代重点(2026-04)** — 与《产品改进建议》§〇、《产品设计文档》§5.3、§七 联动更新;**措辞与工程实现冲突时,以「§0 与工程实现同步」为准。** -> **主文档:** [《宠伴生活馆 - 产品设计文档》](./产品设计文档.md)(预约与洗美报告主流程见 **第二章、§5.3~§5.5**) +> **主文档:** [《宠小它 - 产品设计文档》](./产品设计文档.md)(预约与洗美报告主流程见 **第二章、§5.3~§5.5**) 本文档沉淀「洗美报告增加过程短视频 + 自动生成成片」的产品与技术方向讨论结论,供设计与开发对齐。**第一版采用模板化剪辑为主、强生成式画面不做。**