Compare commits

1 Commits
master ... ai

Author SHA1 Message Date
Hannah
4f5372bf4b feat(home): 重构首页问诊表单为模块化可折叠结构
- 将原有的简单表单替换为模块化问诊表单,包含就诊类型、基本信息、病史信息等7个模块
- 新增可折叠功能,每个模块在填写完成后自动收起
- 添加表单数据管理文件 inquiryFormData.js,包含638行结构化问诊字段
- 调整登录后默认跳转页面为首页而非医生页面
- 开发环境API切换为线上正式环境
- 启用首页作为应用启动页
2026-01-24 22:39:53 +08:00
5 changed files with 741 additions and 71 deletions

View File

@@ -3,8 +3,8 @@ let baseUrl = "";
let socketUrl = "";
if (process.env.NODE_ENV === 'development') {
// 开发环境
baseUrl = "http://192.168.110.100:9200/pb/"; // 张川川
// baseUrl = "https://api.nuttyreading.com/"; //线上正式
// baseUrl = "http://192.168.110.100:9200/pb/"; // 张川川
baseUrl = "https://api.nuttyreading.com/"; //线上正式
} else if (process.env.NODE_ENV === 'production') {
// baseUrl = "http://192.168.110.100:9200/pb/"; // 张川川
baseUrl = "https://api.nuttyreading.com/"; //线上正式

View File

@@ -1,16 +1,16 @@
{
"pages": [ //pages数组中第一项表示应用启动页参考https://uniapp.dcloud.io/collocation/pages
// {
// "path": "pages/home/index",
// "style": {
// "navigationBarTitleText": "首页",
// "app-plus": {
// "bounce": "none",
// "titleNView": false,
// "popGesture": "none"
// }
// }
// },
{
"path": "pages/home/index",
"style": {
"navigationBarTitleText": "首页",
"app-plus": {
"bounce": "none",
"titleNView": false,
"popGesture": "none"
}
}
},
{
"path": "pages/doctors/index",
"style": {

View File

@@ -24,57 +24,30 @@
</view>
</view>
</view>
<view class="home_form">
<template>
<view class="form_item">
<text>患者姓名</text>
<input type="text" v-model="formData.name" placeholder="如果您是医生,建议填写" placeholder-class="custom-placeholder" />
<uni-forms ref="inquiryForm" :modelValue="inquiryFormModel" class="home_form">
<view v-for="(item,index) in inquiryFormData" :key="index" class="inquiry-block">
<view class="inquiry-block-title" @click="toggleInquiryBlock(index)">
{{item.title}}
<text class="collapse-icon">{{ inquiryCollapsed[index] ? '展开' : '收起' }}</text>
</view>
<view class="form_item">
<text>西医诊断</text>
<input type="text" v-model="formData.diagnosis" placeholder="请输入西医诊断" placeholder-class="custom-placeholder" />
<view v-if="!inquiryCollapsed[index]" v-for="(child, childIndex) in item.content" class="child-inquiry">
<view class="title">{{ child.label }}</view>
<radio-group v-if="child.type=='radio'" @change="onRadioChange(index, childIndex, $event)">
<label v-for="options in child.options" class="radio-label">
<radio :value="options" :checked="child.value === options" />
<text>{{ options }}</text>
</label>
</radio-group>
<uni-easyinput v-if="child.type=='input'" v-model="child.value" placeholder="请输入内容" @input="onInputChange(index, childIndex, $event)" />
<checkbox-group v-if="child.type=='checkbox'" @change="onCheckboxChange(index, childIndex, $event)">
<label v-for="options in child.options" class="radio-label">
<checkbox :value="options" :checked="Array.isArray(child.value) && child.value.includes(options)" />
<text>{{ options }}</text>
</label>
</checkbox-group>
</view>
<view class="form_item">
<text>主要病史</text>
<textarea v-model="formData.illness" maxlength="-1"
auto-height
placeholder="请输入病情历史记录"
placeholder-class="custom-placeholder" />
</view>
<view class="form_item">
<text>主要症状</text>
<textarea auto-height v-model="formData.symptoms" maxlength="-1"
placeholder="请输入目前的主要症状" placeholder-class="custom-placeholder" />
</view>
<view class="form_item">
<text>检查结果</text>
<textarea auto-height v-model="formData.result" maxlength="-1"
placeholder="请输入检查结果" placeholder-class="custom-placeholder" />
</view>
<view class="form_item">
<text>基因检测阳性</text>
<textarea auto-height v-model="formData.genetic" maxlength="-1"
v-if="selectedItems.length==0"
@input="handleInput"
:placeholder="selectedItems.length==0?'选填 可多填':''"
placeholder-class="custom-placeholder" />
<!-- 已选标签展示区 -->
<view class="tags-block" v-if="selectedItems.length > 0">
<view class="tags-container">
<view
v-for="(item, index) in selectedItems"
:key="item.id"
class="tag">
{{ item }}
<span @click="removeTag(index)" class="tag-close">×</span>
</view>
</view>
<input @input="handleInput" v-model="formData.genetic" />
</view>
</view>
</template>
</view>
</view>
</uni-forms>
<!-- 搜索结果列表 -->
<scroll-view scroll-y class="result-list" v-if="searchResultStatus&&searchResults.length > 0">
<view
@@ -188,6 +161,7 @@
import $http from "@/config/requestConfig.js";
import { mapState, mapMutations } from "vuex";
import qs from 'qs'
import inquiryFormData from '@/pages/home/inquiryFormData.js'
export default {
data() {
return {
@@ -200,6 +174,9 @@ export default {
genetic: '',
name: '',
},
inquiryFormData: inquiryFormData,
inquiryFormModel: {},
inquiryCollapsed: [],
chatId: null, //选择助手的id
chatName: '',
chatAssistants: [],
@@ -243,9 +220,22 @@ export default {
computed: {
...mapState(["userInfo"]),
},
watch: {
inquiryFormData: {
handler() {
this.inquiryFormData.forEach((block, index) => {
if (this.isInquiryBlockComplete(block) && !this.inquiryCollapsed[index]) {
this.$set(this.inquiryCollapsed, index, true);
}
});
},
deep: true
}
},
onLoad() {
uni.hideTabBar();
uni.removeStorageSync('homeParams');
this.inquiryCollapsed = this.inquiryFormData.map(() => false);
//获取设备信息
const systemInfo = uni.getSystemInfoSync();
this.containerHeight = systemInfo.windowHeight; //获取设备的窗口高度
@@ -270,6 +260,39 @@ export default {
}
},
methods: {
toggleInquiryBlock(index) {
this.$set(this.inquiryCollapsed, index, !this.inquiryCollapsed[index]);
},
onRadioChange(blockIndex, childIndex, event) {
const value = event && event.detail ? event.detail.value : '';
this.$set(this.inquiryFormData[blockIndex].content[childIndex], 'value', value);
this.autoCollapseBlock(blockIndex);
},
onCheckboxChange(blockIndex, childIndex, event) {
const value = event && event.detail ? event.detail.value : [];
this.$set(this.inquiryFormData[blockIndex].content[childIndex], 'value', value);
this.autoCollapseBlock(blockIndex);
},
onInputChange(blockIndex, childIndex, event) {
const value = event && event.detail ? event.detail.value : event;
this.$set(this.inquiryFormData[blockIndex].content[childIndex], 'value', value);
this.autoCollapseBlock(blockIndex);
},
autoCollapseBlock(index) {
const block = this.inquiryFormData[index];
if (this.isInquiryBlockComplete(block) && !this.inquiryCollapsed[index]) {
this.$set(this.inquiryCollapsed, index, true);
}
},
isInquiryBlockComplete(block) {
if (!block || !Array.isArray(block.content)) return false;
return block.content.every(field => {
if (field.type === 'checkbox') {
return Array.isArray(field.value) && field.value.length > 0;
}
return field.value !== '' && field.value !== null && field.value !== undefined;
});
},
//设置滚动到最底部
scrollToBottom() {
this.scrollIntoView = '';
@@ -1493,7 +1516,7 @@ h3{
}
.aiFlag{
position: absolute;
bottom: 55px;
bottom: 80px;
left: 20px;
width: calc(100% - 40px);
font-size: 11px;
@@ -1505,4 +1528,13 @@ h3{
padding: 5px;
border-radius: 6px;
}
/* 模块标题条 */
.inquiry-block{margin:14px 12px;background:#fff;border-radius:18px;padding:14px 14px 10px;box-shadow:0 8px 20px rgba(15,23,42,.06);border:1px solid #e2e8f0}
.inquiry-block-title{display:flex;align-items:center;justify-content:space-between;font-size:15px;font-weight:600;margin-bottom:12px;cursor:pointer;padding-bottom:8px;border-bottom:1px dashed #e2e8f0;}
.inquiry-block-title .collapse-icon{font-size:12px;color:#64748b;font-weight: normal;}
.inquiry-block-title::before{content:"";width:6px;height:16px;border-radius:3px;background:linear-gradient(180deg,#2563eb,#60a5fa);margin-right:8px}
.child-inquiry{margin-bottom:14px;}
.child-inquiry .title{font-size:13px;color:#64748b;margin-bottom:6px}
</style>

View File

@@ -0,0 +1,638 @@
const inquiryFormData = [
{
title: '就诊类型',
content: [
{
label: '就诊类型',
type: 'radio',
field: 'visitType',
value: '',
options: ['初诊', '复诊']
}
]
},
{
title: '基本信息',
content: [
{
label: '性别',
type: 'radio',
field: 'gender',
value: '',
options: ['男', '女']
},
{
label: '年龄',
type: 'input',
field: 'age',
value: '',
options: []
},
{
label: '婚姻状况',
type: 'radio',
field: 'isMarried',
value: '',
options: ['已婚', '未婚']
},
{
label: '孕',
type: 'input',
field: 'pregnancyCount',
value: '',
options: []
},
{
label: '产',
type: 'input',
field: 'deliveryCount',
value: '',
options: []
},
{
label: '是否哺乳',
type: 'radio',
field: 'isBreastfeeding',
value: '',
options: ['是', '否']
},
{
label: '肿瘤家族史',
type: 'input',
field: 'familyCancerHistory',
value: '',
options: []
}
]
},
{
title: '病史信息',
content: [
{
label: '确诊时间(年/月)',
type: 'input',
field: 'diagnosisTime',
value: '',
options: []
},
{
label: '派杰氏病',
type: 'radio',
field: 'pagetDisease',
value: '',
options: ['有', '无']
},
{
label: '乳头溢液或溢血',
type: 'radio',
field: 'nippleDischarge',
value: '',
options: ['有', '无']
},
{
label: '骨转移',
type: 'radio',
field: 'boneMetastasis',
value: '',
options: ['有', '无']
},
{
label: '肺转移',
type: 'radio',
field: 'lungMetastasis',
value: '',
options: ['有', '无']
},
{
label: '胸腔积液(就诊当下情况)',
type: 'radio',
field: 'pleuralEffusion',
value: '',
options: ['有', '无']
},
{
label: '肝转移',
type: 'radio',
field: 'liverMetastasis',
value: '',
options: ['有', '无']
},
{
label: '脑转移',
type: 'radio',
field: 'brainMetastasis',
value: '',
options: ['有', '无']
},
{
label: '其他转移部位',
type: 'input',
field: 'otherMetastasisSites',
value: '',
options: []
},
{
label: '治疗史',
type: 'input',
field: 'treatmentHistory',
value: '',
options: []
},
{
label: '手术史',
type: 'input',
field: 'surgeryHistory',
value: '',
options: []
},
{
label: '化疗史',
type: 'input',
field: 'chemoHistory',
value: '',
options: []
},
{
label: '放疗史',
type: 'input',
field: 'radiotherapyHistory',
value: '',
options: []
},
{
label: '靶向治疗史',
type: 'input',
field: 'targetedTherapyHistory',
value: '',
options: []
},
{
label: '免疫治疗史',
type: 'input',
field: 'immunotherapyHistory',
value: '',
options: []
}
]
},
{
title: '病理信息',
content: [
{
label: 'ER',
type: 'radio',
field: 'erStatus',
value: '',
options: ['阳性', '阴性']
},
{
label: 'PR',
type: 'radio',
field: 'prStatus',
value: '',
options: ['阳性', '阴性']
},
{
label: 'HER2',
type: 'radio',
field: 'her2Status',
value: '',
options: ['阳性', '阴性']
},
{
label: '导管扩张或液体潴留',
type: 'radio',
field: 'ductDilation',
value: '',
options: ['有', '无']
},
{
label: 'Ki-67%',
type: 'input',
field: 'ki67',
value: '',
options: []
},
{
label: '淋巴结转移',
type: 'radio',
field: 'lymphNodeMetastasis',
value: '',
options: ['有', '无']
},
{
label: '硬癌',
type: 'radio',
field: 'hardCarcinoma',
value: '',
options: ['是', '否']
},
{
label: '炎性乳癌',
type: 'radio',
field: 'inflammatoryBreastCancer',
value: '',
options: ['是', '否']
}
]
},
{
title: '基因检测',
content: [
{
label: '基因检测异常结果',
type: 'input',
field: 'geneTestAbnormal',
value: '',
options: []
}
]
},
{
title: '实验室检查',
content: [
{
label: '催乳素',
type: 'radio',
field: 'prolactin',
value: '',
options: ['正常', '升高']
},
{
label: '血小板',
type: 'radio',
field: 'platelet',
value: '',
options: ['10万以下', '正常', '30万以上']
},
{
label: '白细胞',
type: 'radio',
field: 'whiteBloodCell',
value: '',
options: ['正常', '升高', '降低']
},
{
label: '红细胞',
type: 'radio',
field: 'redBloodCell',
value: '',
options: ['正常', '升高', '降低']
},
{
label: '凝血酶原时间PT',
type: 'input',
field: 'pt',
value: '',
options: []
},
{
label: '部分凝血活酶时间APTT',
type: 'input',
field: 'aptt',
value: '',
options: []
},
{
label: 'D-二聚体',
type: 'input',
field: 'dDimer',
value: '',
options: []
},
{
label: '血尿酸',
type: 'radio',
field: 'uricAcid',
value: '',
options: ['正常', '升高']
},
{
label: '直接胆红素',
type: 'radio',
field: 'directBilirubinStatus',
value: '',
options: ['正常', '升高']
},
{
label: '直接胆红素(数值)',
type: 'input',
field: 'directBilirubinValue',
value: '',
options: []
},
{
label: '间接胆红素',
type: 'radio',
field: 'indirectBilirubinStatus',
value: '',
options: ['正常', '升高']
},
{
label: '间接胆红素(数值)',
type: 'input',
field: 'indirectBilirubinValue',
value: '',
options: []
},
{
label: 'ALT',
type: 'radio',
field: 'altStatus',
value: '',
options: ['正常', '升高']
},
{
label: 'ALT数值',
type: 'input',
field: 'altValue',
value: '',
options: []
},
{
label: 'AST',
type: 'radio',
field: 'astStatus',
value: '',
options: ['正常', '升高']
},
{
label: 'AST数值',
type: 'input',
field: 'astValue',
value: '',
options: []
},
{
label: 'GGT',
type: 'radio',
field: 'ggtStatus',
value: '',
options: ['正常', '升高']
},
{
label: 'GGT数值',
type: 'input',
field: 'ggtValue',
value: '',
options: []
},
{
label: 'ALP',
type: 'radio',
field: 'alpStatus',
value: '',
options: ['正常', '升高']
},
{
label: 'ALP数值',
type: 'input',
field: 'alpValue',
value: '',
options: []
},
{
label: '肿瘤标志物(最近一次异常及数值)',
type: 'input',
field: 'tumorMarkers',
value: '',
options: []
}
]
},
{
title: '症状与体征',
content: [
{
label: '四肢冰凉',
type: 'radio',
field: 'coldLimbs',
value: '',
options: ['有', '无']
},
{
label: '乏力',
type: 'radio',
field: 'fatigue',
value: '',
options: ['有', '无']
},
{
label: '失眠',
type: 'radio',
field: 'insomnia',
value: '',
options: ['有', '无']
},
{
label: '便秘',
type: 'radio',
field: 'constipation',
value: '',
options: ['有', '无']
},
{
label: '腹泻',
type: 'radio',
field: 'diarrhea',
value: '',
options: ['有', '无']
},
{
label: '厌食',
type: 'radio',
field: 'anorexia',
value: '',
options: ['有', '无']
},
{
label: '胃痛',
type: 'radio',
field: 'stomachPain',
value: '',
options: ['有', '无']
},
{
label: '恶心呕吐',
type: 'radio',
field: 'nauseaVomiting',
value: '',
options: ['有', '无']
},
{
label: '口苦',
type: 'radio',
field: 'bitterTaste',
value: '',
options: ['有', '无']
},
{
label: '心悸',
type: 'radio',
field: 'palpitation',
value: '',
options: ['有', '无']
},
{
label: '多汗',
type: 'radio',
field: 'hyperhidrosis',
value: '',
options: ['有', '无']
},
{
label: '潮热',
type: 'radio',
field: 'hotFlush',
value: '',
options: ['有', '无']
},
{
label: '口舌生疮',
type: 'radio',
field: 'mouthSores',
value: '',
options: ['有', '无']
},
{
label: '外阴瘙痒',
type: 'radio',
field: 'vulvarItching',
value: '',
options: ['有', '无']
},
{
label: '腰膝酸软',
type: 'radio',
field: 'lowBackWeakness',
value: '',
options: ['有', '无']
},
{
label: '腿抽筋',
type: 'radio',
field: 'legCramps',
value: '',
options: ['有', '无']
},
{
label: '烦躁',
type: 'radio',
field: 'irritability',
value: '',
options: ['有', '无']
},
{
label: '紧张',
type: 'radio',
field: 'tension',
value: '',
options: ['有', '无']
},
{
label: '焦虑',
type: 'radio',
field: 'anxiety',
value: '',
options: ['有', '无']
},
{
label: '抑郁',
type: 'radio',
field: 'depression',
value: '',
options: ['有', '无']
},
{
label: '疼痛',
type: 'radio',
field: 'pain',
value: '',
options: ['有', '无']
},
{
label: '疼痛部位',
type: 'input',
field: 'painLocation',
value: '',
options: []
},
{
label: '肿瘤破溃',
type: 'radio',
field: 'tumorUlceration',
value: '',
options: ['有', '无']
},
{
label: '上肢淋巴水肿',
type: 'radio',
field: 'upperLimbLymphedema',
value: '',
options: ['有', '无']
},
{
label: '手术切口不愈合',
type: 'radio',
field: 'incisionNonHealing',
value: '',
options: ['有', '无']
},
{
label: '手术切口不愈合描述',
type: 'input',
field: 'incisionNonHealingDetail',
value: '',
options: []
},
{
label: '其他症状',
type: 'input',
field: 'otherSymptoms',
value: '',
options: []
}
]
},
{
title: '中医舌脉信息',
content: [
{
label: '舌色',
type: 'radio',
field: 'tongueColor',
value: '',
options: ['淡', '正常', '红']
},
{
label: '舌形态',
type: 'checkbox',
field: 'tongueShape',
value: [],
options: ['胖大', '瘦小', '舌边沿肿大', '齿痕']
},
{
label: '苔色',
type: 'radio',
field: 'coatingColor',
value: '',
options: ['白', '黄', '黄白夹杂']
},
{
label: '苔厚度',
type: 'radio',
field: 'coatingThickness',
value: '',
options: ['厚腻', '正常', '薄、少', '花剥', '无苔']
},
{
label: '脉象',
type: 'checkbox',
field: 'pulseType',
value: [],
options: ['沉', '缓', '迟', '数', '滑', '涩', '微', '洪', '大', '细', '弦', '芤']
}
]
}
]
export default inquiryFormData

View File

@@ -417,12 +417,12 @@ export default {
setTimeout(() => {
uni.setStorageSync("isJump", "false");
// uni.reLaunch({
// url: "/pages/home/index"
// });
uni.reLaunch({
url: "/pages/doctors/index"
url: "/pages/home/index"
});
// uni.reLaunch({
// url: "/pages/doctors/index"
// });
}, 100);
}).catch(e => {
uni.showToast({
@@ -459,12 +459,12 @@ export default {
title: "登录成功",
});
setTimeout(() => {
// uni.reLaunch({
// url: "/pages/home/index"
// });
uni.reLaunch({
url: "/pages/doctors/index"
url: "/pages/home/index"
});
// uni.reLaunch({
// url: "/pages/doctors/index"
// });
}, 500);
}).catch(e => {
uni.showToast({