Files
sundynix-pets/pets-fe/pages/home/home.wxss
T
Blizzard 6fd4977f46 feat(fe): 建档挑方案、计划页套方案、阶段漂移提示
后端上一轮做完了但小程序上看不到,这次接上。

## 建档第四步:挑方案
方案按阶段取,所以必须排在「资料」之后(阶段是第三步定的)。卡片上按重复方式
分开报数(每天 3 项 / 每周 2 项 / 一次性 2 项),不报一个总数——4 条「每天」
套一整月就是 120 多条,只给总数用户会以为出 bug。

「先空着,我自己排」是个平等的选项,和方案卡长一样、就在下面一眼能看到,
不是藏起来的退路:已经养熟的宠物主人有自己的节奏,硬塞一套只会被删掉。

默认选第一套——多数用户是新手,给一个合理默认比让他面对空白好。

编辑档案时不出现第四步:改档案不该顺手改计划。

套方案失败不算建档失败:档案已经建好了,方案之后在计划页还能套,
不该把用户退回表单。

## 计划页:空月份和平时都能套
空月份的提示条带「套一套方案」按钮 —— 空着让用户从零排,多数人会直接退出去。
但「+ 加一件」始终在,不能只给套用。

浮层里写明「套用是往里加,不会覆盖你已经排好的」,因为服务端就是按
「日期+标题」去重的,这句话是真的。套完 toast 报排了几件;一件都没排
(全都已存在)时说「这个月已经有这些安排了」,不说「成功」。

## 阶段漂移提示
首页门面卡下面一张卡:「钞票已经 17个月,从幼年期进入成年期了」,
带上新阶段的划分依据、养护重点和体型说明,点进去到建档页改。

用主色不用红色 —— 这是「可以做一下」不是「出问题了」。
改完回首页 onShow 重拉一次,卡片自然消失。

不在首页直接改阶段:改完要不要套新方案是同一件事,放在建档页一起做才连贯。

## 顺手把合并的尾巴清了
manageTasks 那一支删了:它管的是 DailyTask,而今日任务已经并进计划节点,
增删改都在计划页。留着会出现「这里加的任务」和「计划页加的节点」进不同的表。

连带清掉 7 个死方法 + taskSheets + 一个死 require(简易表单那套早随记录表单
搬到 pages/addrecord 了)。首页现在一个弹层都不开,bottom-sheet 组件也去掉了。

弹层累计:js 1110 → 689 行,wxml 485 → 278 行。

## 验证(预生产库实跑)
  建档四步    6 个月柯基 → 幼年期 → 拉到「幼犬标准照护」→ 套用本月 7 条
              → 首页今日任务 4 条
  先空着      今日任务 0 条,疫苗驱虫提醒仍然建
  计划页套用  0 → 7 条;重复套用 0 条(去重生效)
  漂移检测    17 个月柯基存着幼年期 → drifted=true,给出依据/重点/体型
              改成成年期 → drifted=false
              没生日 → 不提示(算不出就不猜)
              「刚到家」→ 不提示(叠加层不是年龄段)

第一版验证脚本把阶段改成了和算出来一样的值,drifted=False 是对的,
但我的 print 无条件打了提示文案,看着像 bug。重测才验到真的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 12:59:27 +08:00

90 lines
4.2 KiB
Plaintext

/* 门面卡 */
.hero-card{
background:
radial-gradient(circle at 95% 16%, rgba(245,169,71,.22), transparent 32%),
linear-gradient(135deg,#FFFFFF,#FFF6E9);
}
/* 一周日期条 */
/* ===== 日期带(原计划页「日历」tab 并过来) ===== */
/* 某天的安排 */
.dd-title{font-weight:var(--fw-b);font-size:var(--fs-md);margin-bottom:var(--sp-3)}
/* ===== 接下来 ===== */
/* ===== 门面:宠物名片 ===== */
.hero-card{padding:var(--sp-5)}
.hero-row{display:flex;align-items:center;gap:var(--sp-4)}
.hero-av{
position:relative;flex:none;width:128rpx;height:128rpx;border-radius:50%;
background:var(--primary-soft);display:flex;align-items:center;justify-content:center;
font-size:60rpx;overflow:visible;
}
.hero-av-img{width:100%;height:100%;border-radius:50%}
/* 性别徽章叠在头像右下:一个很省事但很出效果的细节 */
.hero-sex{
position:absolute;right:-4rpx;bottom:-4rpx;width:42rpx;height:42rpx;border-radius:50%;
border:4rpx solid #fff;color:#fff;font-size:22rpx;line-height:1;
display:flex;align-items:center;justify-content:center;
}
.hero-sex.male{background:#5B9BE8}
.hero-sex.female{background:#EE85A8}
.hero-main{flex:1;min-width:0}
.hero-title{font-size:var(--fs-xl);font-weight:var(--fw-b);color:var(--text)}
.hero-meta{display:flex;flex-wrap:wrap;gap:var(--sp-3);font-size:var(--fs-sm);color:var(--muted);margin-top:6rpx}
.hero-arrow{flex:none;color:var(--muted2);display:flex;align-items:center}
.hero-days{
margin-top:var(--sp-4);background:var(--primary-soft);color:var(--primary-ink);
border-radius:var(--r-md);text-align:center;padding:var(--sp-3);
font-size:var(--fs-md);font-weight:var(--fw-b);
}
.hd-n{font-size:var(--fs-lg);margin:0 4rpx}
/* ===== 两个入口 ===== */
.entry-card{display:flex;padding:var(--sp-5) var(--sp-3)}
.entry{flex:1;display:flex;flex-direction:column;align-items:center;gap:6rpx}
.entry-ic{
width:96rpx;height:96rpx;border-radius:var(--r-md);
display:flex;align-items:center;justify-content:center;margin-bottom:4rpx;
}
.entry-b{font-size:var(--fs-md);font-weight:var(--fw-b);color:var(--text)}
.entry-p{font-size:var(--fs-cap);color:var(--muted)}
/* ===== 记录时间轴 ===== */
.tl-head{display:flex;align-items:center;justify-content:space-between;margin:var(--sp-5) 0 var(--sp-3)}
.tl-item{display:flex;gap:var(--sp-3)}
.tl-rail{flex:none;width:56rpx;display:flex;flex-direction:column;align-items:center}
.tl-dot{
width:56rpx;height:56rpx;border-radius:50%;flex:none;
display:flex;align-items:center;justify-content:center;
}
/* 竖线连起来才像一条时间轴;最后一条的线会被 body 的高度自然截断 */
.tl-line{flex:1;width:2rpx;background:var(--line);margin:6rpx 0}
.tl-item:last-of-type .tl-line{display:none}
.tl-body{flex:1;min-width:0;padding-bottom:var(--sp-4)}
.tl-when{font-size:var(--fs-cap);color:var(--muted);margin-bottom:6rpx}
.tl-card{background:#fff;border-radius:var(--r-md);box-shadow:var(--sd-1);padding:var(--sp-4)}
.tl-title{font-size:var(--fs-md);font-weight:var(--fw-b);color:var(--text)}
.tl-desc{font-size:var(--fs-sm);color:var(--text-2);margin-top:6rpx;line-height:1.5}
.tl-img{width:100%;height:320rpx;border-radius:var(--r-sm);margin-top:var(--sp-3);display:block}
.tl-more{text-align:center;padding:var(--sp-4);font-size:var(--fs-sm);color:var(--muted)}
.entry-ic{position:relative}
.entry-dot{
position:absolute;top:-2rpx;right:-2rpx;width:18rpx;height:18rpx;
border-radius:50%;background:var(--red);border:3rpx solid #fff;
}
.entry-p.warn{color:var(--red-ink);font-weight:var(--fw-b)}
/* 阶段漂移提示。用主色不用红色:这是「可以做一下」不是「出问题了」 */
.drift-card{border:2rpx solid var(--primary-line);background:var(--primary-soft)}
.drift-top{display:flex;align-items:flex-start;gap:var(--sp-2);color:var(--primary-dark)}
.drift-b{flex:1;min-width:0;font-size:var(--fs-md);font-weight:var(--fw-b);line-height:1.5}
.drift-p{font-size:var(--fs-sm);color:var(--primary-ink);line-height:1.6;margin-top:var(--sp-2)}
.drift-focus{font-size:var(--fs-sm);color:var(--primary-ink);line-height:1.6;margin-top:6rpx}
.drift-size{font-size:var(--fs-cap);color:var(--primary-dark);opacity:.8;margin-top:6rpx}
.drift-cta{margin-top:var(--sp-4)}