From 62fbbaf9176577bf5f57c74959a06ed32de6b8d8 Mon Sep 17 00:00:00 2001 From: weijuesen Date: Wed, 12 Aug 2026 15:52:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(miniapp):=20SERS=20=E6=95=99=E7=A8=8B?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E4=B8=8E=E5=AD=A3=E8=8A=82=E6=80=A7=E9=98=B2?= =?UTF-8?q?=E6=8E=A7=E6=8F=90=E9=86=92=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miniapp/src/api/knowledge.ts | 2 + miniapp/src/pages/knowledge/index.module.scss | 41 ++++++++++++++ miniapp/src/pages/knowledge/index.tsx | 55 +++++++++++++------ 3 files changed, 82 insertions(+), 16 deletions(-) diff --git a/miniapp/src/api/knowledge.ts b/miniapp/src/api/knowledge.ts index c30c72c..8ace2aa 100644 --- a/miniapp/src/api/knowledge.ts +++ b/miniapp/src/api/knowledge.ts @@ -46,6 +46,8 @@ export const listDiseases = () => get('/knowledge/diseases'); export const getDisease = (id: string) => get(`/knowledge/diseases/${id}`); export const listAIGuides = () => get('/knowledge/articles', { kind: 'ai_guide' }); export const listLAMPGuides = () => get('/knowledge/articles', { kind: 'lamp_guide' }); +export const listSERSGuides = () => get('/knowledge/articles', { kind: 'sers_guide' }); +export const listSeasonalTips = () => get('/knowledge/articles', { kind: 'seasonal_tip' }); export const getArticle = (id: string) => get(`/knowledge/articles/${id}`); export const getStageHints = (stage?: string) => get('/knowledge/stage-hints', stage ? { stage } : undefined); diff --git a/miniapp/src/pages/knowledge/index.module.scss b/miniapp/src/pages/knowledge/index.module.scss index c91f452..1d0a61b 100644 --- a/miniapp/src/pages/knowledge/index.module.scss +++ b/miniapp/src/pages/knowledge/index.module.scss @@ -130,6 +130,47 @@ margin-top: 4rpx; } +.seasonCard { + background: linear-gradient(135deg, $color-primary 0%, $color-primary-dark 100%); + border-radius: $radius-lg; + padding: $spacing-lg; + box-shadow: $shadow-card; + margin-bottom: $spacing-md; +} + +.seasonHeader { + display: flex; + align-items: center; + gap: $spacing-sm; + margin-bottom: $spacing-sm; +} + +.seasonBadge { + font-size: $font-size-xs; + color: $color-primary; + background: rgba(255, 255, 255, 0.9); + padding: 4rpx $spacing-sm; + border-radius: $radius-round; + flex-shrink: 0; +} + +.seasonTitle { + font-size: $font-size-lg; + font-weight: $font-weight-semibold; + color: $color-text-white; + flex: 1; + min-width: 0; +} + +.seasonContent { + display: block; + font-size: $font-size-sm; + color: rgba(255, 255, 255, 0.95); + line-height: $line-height-loose; + white-space: pre-wrap; + word-break: break-all; +} + .diseaseList { display: flex; flex-direction: column; diff --git a/miniapp/src/pages/knowledge/index.tsx b/miniapp/src/pages/knowledge/index.tsx index 8fb5f2d..1c03f68 100644 --- a/miniapp/src/pages/knowledge/index.tsx +++ b/miniapp/src/pages/knowledge/index.tsx @@ -5,6 +5,8 @@ import styles from './index.module.scss'; import { listAIGuides, listLAMPGuides, + listSERSGuides, + listSeasonalTips, listDiseases, getStageHints, type Disease, @@ -15,6 +17,7 @@ import { const GUIDE_LABELS: Record = { ai_guide: 'AI 解读', lamp_guide: 'LAMP 教程', + sers_guide: 'SERS 教程', }; const STAGE_OPTIONS = [ @@ -24,6 +27,14 @@ const STAGE_OPTIONS = [ { key: 'pupa', label: '蛹期' }, ]; +const currentSeason = (() => { + const m = new Date().getMonth() + 1; + if (m >= 3 && m <= 5) return '春季'; + if (m >= 6 && m <= 8) return '夏季'; + if (m >= 9 && m <= 11) return '秋季'; + return '冬季'; +})(); + const CATEGORY_LABELS: Record = { viral: '病毒性', fungal: '真菌性', @@ -35,7 +46,7 @@ const CATEGORY_LABELS: Record = { const KnowledgePage: React.FC = () => { const [diseases, setDiseases] = useState([]); const [guides, setGuides] = useState([]); - const [lampGuides, setLampGuides] = useState([]); + const [seasonalTips, setSeasonalTips] = useState([]); const [stage, setStage] = useState('young'); const [stageHints, setStageHints] = useState([]); const [loading, setLoading] = useState(true); @@ -53,14 +64,16 @@ const KnowledgePage: React.FC = () => { const fetchData = useCallback(async () => { try { - const [diseaseRes, guideRes, lampRes] = await Promise.all([ + const [diseaseRes, guideRes, lampRes, sersRes, seasonalRes] = await Promise.all([ listDiseases().catch(() => [] as Disease[]), listAIGuides().catch(() => [] as KnowledgeArticle[]), listLAMPGuides().catch(() => [] as KnowledgeArticle[]), + listSERSGuides().catch(() => [] as KnowledgeArticle[]), + listSeasonalTips().catch(() => [] as KnowledgeArticle[]), ]); setDiseases(diseaseRes); - setGuides(guideRes); - setLampGuides(lampRes); + setGuides([...guideRes, ...lampRes, ...sersRes]); + setSeasonalTips(seasonalRes); } catch (err) { console.error('[Knowledge] 数据加载失败:', err); Taro.showToast({ @@ -85,7 +98,7 @@ const KnowledgePage: React.FC = () => { }); const openGuide = (a: KnowledgeArticle) => { - Taro.navigateTo({ url: `/pages/knowledge/detail/index?kind=ai_guide&id=${a.id}` }); + Taro.navigateTo({ url: `/pages/knowledge/detail/index?kind=article&id=${a.id}` }); }; const openDisease = (d: Disease) => { @@ -105,17 +118,6 @@ const KnowledgePage: React.FC = () => { ))} - {lampGuides.map((a) => ( - openGuide(a)}> - - {GUIDE_LABELS[a.kind] || a.kind} - - - {a.title} - {a.summary ? {a.summary} : null} - - ))} - 饲养阶段风险提示 {STAGE_OPTIONS.map((opt) => ( @@ -153,6 +155,27 @@ const KnowledgePage: React.FC = () => { )) )} + 季节性防控提醒 + {seasonalTips + .filter((t) => t.title.startsWith(currentSeason)) + .map((t) => ( + openGuide(t)}> + + 当前 {currentSeason} + {t.title} + + {t.content} + + ))} + + {seasonalTips.map((t) => ( + openGuide(t)}> + {t.title} + {t.summary ? {t.summary} : null} + + ))} + + 蚕病百科 {diseases.map((d) => (