feat: migrate static pages to native tabbar
This commit is contained in:
185
pages/ai/index.js
Normal file
185
pages/ai/index.js
Normal file
@@ -0,0 +1,185 @@
|
||||
const { ROUTES, openStaticRoute } = require('../../utils/static-ux/route-map')
|
||||
|
||||
const AI_PAGE_BLUEPRINT = Object.freeze({
|
||||
title: 'AI助手',
|
||||
historyText: '历史',
|
||||
disclaimerText: '本功能仅供学习参考,不能替代专业医师诊断。',
|
||||
tabs: [
|
||||
{
|
||||
key: 'qa',
|
||||
label: 'AI答疑'
|
||||
},
|
||||
{
|
||||
key: 'analysis',
|
||||
label: '辨证分析'
|
||||
},
|
||||
{
|
||||
key: 'constitution',
|
||||
label: '体质检测'
|
||||
}
|
||||
],
|
||||
panels: {
|
||||
qa: {
|
||||
key: 'qa',
|
||||
badge: 'AI答疑',
|
||||
heading: '您好,我是中医学习助手',
|
||||
subheading: '围绕中医理论、术语和典籍原文快速提问',
|
||||
highlights: ['解答中医理论问题', '解释典籍原文含义', '给出学习型出处引用'],
|
||||
examples: ['什么是阴阳?', '气虚和阳虚有什么区别?', '如何理解肝主疏泄?'],
|
||||
formType: 'qa',
|
||||
actionTitle: '输入你的问题',
|
||||
inputPlaceholder: '例如:什么是气虚?',
|
||||
actionButtonText: '发送'
|
||||
},
|
||||
analysis: {
|
||||
key: 'analysis',
|
||||
badge: '辨证分析',
|
||||
heading: '先整理症状,再查看学习型辨证分析',
|
||||
subheading: '把症状整理为结构化输入,再看学习型辨证思路',
|
||||
highlights: ['输入主要症状', '补充舌象、脉象、体质', '查看学习型辨证结论'],
|
||||
examples: ['乏力、睡眠差应如何整理输入?', '舌淡苔白常见于哪些证型?', '如何理解脾虚湿困?'],
|
||||
formType: 'analysis',
|
||||
actionTitle: '整理辨证输入',
|
||||
primaryField: {
|
||||
label: '主要症状',
|
||||
placeholder: '主要症状,多个用逗号分隔'
|
||||
},
|
||||
secondaryFields: [
|
||||
{
|
||||
key: 'tongue',
|
||||
placeholder: '舌象'
|
||||
},
|
||||
{
|
||||
key: 'pulse',
|
||||
placeholder: '脉象'
|
||||
},
|
||||
{
|
||||
key: 'constitution',
|
||||
placeholder: '体质'
|
||||
},
|
||||
{
|
||||
key: 'course',
|
||||
placeholder: '病程'
|
||||
}
|
||||
],
|
||||
noteField: {
|
||||
label: '补充说明',
|
||||
placeholder: '例如:近两周明显乏力,睡眠浅。'
|
||||
},
|
||||
actionButtonText: '开始分析'
|
||||
},
|
||||
constitution: {
|
||||
key: 'constitution',
|
||||
badge: '体质检测',
|
||||
heading: '体质检测即将开放',
|
||||
subheading: '九种体质入口先按设计稿保留为 UI-first 模式',
|
||||
highlights: ['后续会补齐问卷式体质评估', '保持学习参考语义', '不会输出医疗诊断结论'],
|
||||
examples: ['我总怕冷属于哪种体质?', '气虚质有哪些特征?', '体质结果将如何回到典籍学习?'],
|
||||
formType: 'constitution',
|
||||
actionTitle: '体质检测即将开放',
|
||||
actionDescription:
|
||||
'当前回合先严格对齐 UI 结构,问卷式体质检测会在后续接入真实题目与结果逻辑。',
|
||||
actionButtonText: '查看其它待开放能力'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function cloneTabs(tabs) {
|
||||
return tabs.map(item => ({ ...item }))
|
||||
}
|
||||
|
||||
function cloneSecondaryFields(fields) {
|
||||
return fields.map(item => ({ ...item }))
|
||||
}
|
||||
|
||||
function createPanelByKey(panelKey) {
|
||||
const sourcePanel = AI_PAGE_BLUEPRINT.panels[panelKey] || AI_PAGE_BLUEPRINT.panels.qa
|
||||
|
||||
return {
|
||||
...sourcePanel,
|
||||
highlights: [...sourcePanel.highlights],
|
||||
examples: [...sourcePanel.examples],
|
||||
primaryField: sourcePanel.primaryField ? { ...sourcePanel.primaryField } : undefined,
|
||||
secondaryFields: sourcePanel.secondaryFields
|
||||
? cloneSecondaryFields(sourcePanel.secondaryFields)
|
||||
: undefined,
|
||||
noteField: sourcePanel.noteField ? { ...sourcePanel.noteField } : undefined
|
||||
}
|
||||
}
|
||||
|
||||
function createAiPageData() {
|
||||
return {
|
||||
title: AI_PAGE_BLUEPRINT.title,
|
||||
historyText: AI_PAGE_BLUEPRINT.historyText,
|
||||
disclaimerText: AI_PAGE_BLUEPRINT.disclaimerText,
|
||||
secondaryEntries: [
|
||||
{
|
||||
key: 'ai-history',
|
||||
title: 'AI历史',
|
||||
subtitle: '查看中医问答与辨证分析的静态历史页',
|
||||
route: ROUTES.tcm.aiHistory
|
||||
},
|
||||
{
|
||||
key: 'mingli-interpret',
|
||||
title: '命理解读',
|
||||
subtitle: '进入命理方向的静态解读页',
|
||||
route: ROUTES.mingli.interpret
|
||||
}
|
||||
],
|
||||
tabs: cloneTabs(AI_PAGE_BLUEPRINT.tabs),
|
||||
activeTabKey: 'qa',
|
||||
currentPanel: createPanelByKey('qa')
|
||||
}
|
||||
}
|
||||
|
||||
function showPlaceholderToast(title) {
|
||||
if (typeof wx?.showToast === 'function') {
|
||||
wx.showToast({
|
||||
title: title || '功能建设中',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function showNavigate(route) {
|
||||
if (openStaticRoute(route, wx)) {
|
||||
return
|
||||
}
|
||||
|
||||
showPlaceholderToast()
|
||||
}
|
||||
|
||||
Page({
|
||||
data: createAiPageData(),
|
||||
|
||||
handleTabTap(event) {
|
||||
const { tabKey } = event.currentTarget.dataset
|
||||
|
||||
if (!AI_PAGE_BLUEPRINT.panels[tabKey] || tabKey === this.data.activeTabKey) {
|
||||
return
|
||||
}
|
||||
|
||||
this.setData({
|
||||
activeTabKey: tabKey,
|
||||
currentPanel: createPanelByKey(tabKey)
|
||||
})
|
||||
},
|
||||
|
||||
handleHistoryTap() {
|
||||
showNavigate(ROUTES.tcm.aiHistory)
|
||||
},
|
||||
|
||||
handleSecondaryEntryTap(event) {
|
||||
showNavigate(event.currentTarget.dataset.route)
|
||||
},
|
||||
|
||||
handleActionTap() {
|
||||
showPlaceholderToast()
|
||||
}
|
||||
})
|
||||
|
||||
module.exports = {
|
||||
AI_PAGE_BLUEPRINT,
|
||||
createPanelByKey,
|
||||
createAiPageData
|
||||
}
|
||||
Reference in New Issue
Block a user