<!-- 快速上报表单 --> <div> <van-form ref="quickReportFormRef"> <div class="bg-#fff"> <div class="flex items-center p-2"> <div class="h-6 w-1.5 rounded-r-1.5 bg-#0AB389" /> <div class="ml2 text-4"> 事件核心信息 </div> </div> <a-divider style="margin: 2px 0" /> <van-cell-group> <!-- 发生时间 --> <van-field v-model="occurrenceTimeDisplay" is-link readonly name="datePicker" label="发生时间" placeholder="点击选择时间" :rules="[{ required: true, message: '请选择发生时间' }]" @click="showPicker = true" /> <van-popup v-model:show="showPicker" destroy-on-close position="bottom"> <DateTimePicker :value="formState.occurrenceTime" title="选择发生时间" @confirm="onDateTimeConfirm" @cancel="showPicker = false" /> </van-popup> <!-- 事发地点 --> <van-field v-model="formState.occurrenceArea" is-link readonly name="area" label="事发地点" placeholder="点击选择省市区" :rules="[{ required: true, message: '请选择事发地点' }]" @click="showArea = true" /> <van-popup v-model:show="showArea" destroy-on-close position="bottom"> <van-cascader v-model="regionValue" title="请选择所在地区" :options="formattedData.regionCascaderOptions" @close="showArea = false" @finish="onFinish" /> </van-popup> <!-- 详细地点 --> <van-field v-model="detailedAddressDisplay" name="detailLocation" label="详细地点" placeholder="请输入详细地点" :rules="[{ required: true, message: '请填写详细地点' }]" /> <!-- 事件类型 --> <van-field v-model="formState.incidentType" is-link readonly name="picker" label="事件类型" placeholder="点击选择类型" :rules="[{ required: true, message: '请选择事件类型' }]" @click="showTypePicker = true" /> <van-popup v-model:show="showTypePicker" destroy-on-close position="bottom"> <van-picker :columns="formattedData.accidentTypePickerColumns" @confirm="onTypeConfirm" @cancel="showTypePicker = false" /> </van-popup> <!-- 事发校内外 --> <van-field name="location_type" label="事发校内外"> <template #input> <van-radio-group v-model="formState.isOnCampus" direction="horizontal"> <van-radio :name="true">校内</van-radio> <van-radio :name="false">校外</van-radio> </van-radio-group> </template> </van-field> <!-- 死亡人数 --> <van-field v-model="formState.deathCount" type="number" name="death" label="死亡人数" placeholder="请输入死亡人数" :min="0" /> <!-- 重伤人数 --> <van-field v-model="formState.severeInjuryCount" type="number" name="seriousInjury" label="重伤人数" placeholder="请输入重伤人数" :min="0" /> <!-- 轻伤人数 --> <van-field v-model="formState.minorInjuryCount" type="number" name="minorInjury" label="轻伤人数" placeholder="请输入轻伤人数" :min="0" /> <!-- 事件等级(初判) --> <van-field v-model="formState.incidentLevel" is-link readonly name="levelPicker" label="事件等级(初判)" placeholder="点击选择等级" :rules="[{ required: true, message: '请选择事件等级' }]" @click="showLevelPicker = true" /> <van-popup v-model:show="showLevelPicker" destroy-on-close position="bottom"> <van-picker :columns="formattedData.eventLevelPickerColumns" @confirm="onLevelConfirm" @cancel="showLevelPicker = false" /> </van-popup> <!-- 事件标题 --> <van-field v-model="formState.incidentTitle" name="title" label="事件标题" placeholder="请输入事件标题" :rules="[{ required: true, message: '请填写事件标题' }]" type="textarea" rows="1" autosize @input="titleEdited = true" /> <!-- 事件简要情况 --> <van-field v-model="incidentDescriptionDisplay" rows="4" autosize type="textarea" name="description" label="事件简要情况" placeholder="请简要描述具体情况" :rules="[{ required: true, message: '请填写事件简要情况' }]" label-align="top" /> <!-- 附件上传 --> <van-field name="attachment" label="附件上传" label-align="top"> <template #input> <MobileUpload v-model:file-list="attachmentFileView" v-model:value="formState.attachment" :config="{ multiple: true, immediateReturn: true, menu: [FileType.文档, FileType.图片, FileType.视频], fileAttribution: FileAttribution.管理认证, }" /> <!-- <van-uploader v-model="attachmentsDisplay" multiple :max-count="5" upload-text="点击上传附件,支持图片、视频、文档" upload-icon="plus" > <div class="flex"> <div class="mr-4 size-48px min-h-48px min-w-48px center border-(1px #ccc solid) rounded"><div class="i-carbon-upload text-6" /></div> <div v-if="attachmentsDisplay.length === 0">点击上传附件,支持图片、视频、文档</div> </div> </van-uploader> --> </template> </van-field> </van-cell-group> </div> <div class="mt-2 bg-#fff"> <div class="flex items-center p-2"> <div class="h-6 w-1.5 rounded-r-1.5 bg-#0AB389" /> <div class="ml2 text-4"> 舆情跟踪 </div> </div> <a-divider style="margin: 2px 0" /> <van-cell-group> <van-field name="applyPublicOpinionTracking" label="是否申请舆情追踪"> <template #input> <van-radio-group v-model="formState.applyPublicOpinionTracking" direction="horizontal"> <van-radio :name="true">是</van-radio> <van-radio :name="false">否</van-radio> </van-radio-group> </template> </van-field> <div class="flex p-4"> <c-icon-question-circle-outlined /> <div class="ml-2 rounded bg-#383838 px-2 py-1 text-xs c-#fff">如本事件有舆情扩散风险,校园安全舆情监测中心将对本事件进行全网监测,辅助了解网络舆情传播情况.</div> </div> </van-cell-group> </div> <!-- 处置联系人 --> <div class="mt-2 bg-#fff"> <div class="flex items-center p-2"> <div class="h-6 w-1.5 rounded-r-1.5 bg-#0AB389" /> <div class="ml2 text-4"> 处置联系人 </div> </div> <a-divider style="margin: 2px 0" /> <van-cell-group> <van-field v-model="formState.departmentName!" name="title" label="处置责任单位" placeholder="请输入处置责任单位" :rules="[{ required: true, message: '请填写处置责任单位' }]" /> <van-field v-model="formState.unitHead!" name="title" label="单位负责人" placeholder="请输入单位负责人" :rules="[{ required: true, message: '请填写单位负责人' }]" /> <van-field v-model="formState.unitContactPhone!" name="title" label="负责人联系电话" placeholder="请输入负责人联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" /> <van-field v-model="formState.handlingContact!" name="title" label="上报负责人" placeholder="请输入上报负责人联系电话" :rules="[{ required: true, message: '请填写上报负责人联系电话' }]" /> <van-field v-model="formState.handlingContactPhone!" name="title" label="负责人联系电话" placeholder="请输入上报负责人联系电话" :rules="[{ required: true, message: '请填写上报负责人' }]" /> </van-cell-group> </div> <div class="m-4 text-center space-x-2"> <van-button type="default" @click="goBack">取消</van-button> <van-button v-if="!isEdit || currentIncidentStatus === IncidentStatus.草稿" type="primary" plain :loading="saveLoading" @click="saveDraft(true)" > 保存草稿 </van-button> <van-button v-if="$auth([_Role.网格联络员]) && canSubmit" type="primary" :loading="saveLoading" @click="saveDraft(false)" > {{ submitButtonText }} </van-button> </div> </van-form> </div>这是一个上报表单,当前操作过于复杂用户不方便使用,你按照我的要求做出以下更改。创建一个新的上报表单1、去除所有必填项2、将 事件简要情况 作为主要填报内容的第一步 该项必填2、将其余表单内容作为非必填的步骤,一步步引导用户根据实质情况去填写,如果没有这些情况则无需填写 直接上报
我来为你创建一个优化后的分步式上报表单。我将把复杂的多字段表单改造成一个更加友好的流程:先收集最核心的"事件简要情况",然后根据需要引导用户逐步填写其他信息。
我为你创建了一个全新的分步式上报表单系统。核心改进包括:
用户现在可以仅输入事件描述就立即上报,也可以根据实际情况展开其他部分来补充更详细的信息。
让我查看现有的表单组件,以及其他相关组件的实现方式:
现在我理解了。这个项目使用的是 Tailwind CSS + shadcn/ui 组件库(Web 版),而原始代码使用的是 Vant 组件库(移动端)。让我为移动端优化这个表单,充分考虑手机屏幕的有限空间和用户体验。
我为您重新优化了移动端表单,充分考虑了手机屏幕限制。核心改进:
移动端优化方案:
现在用户在手机上可以快速填写必填项"事件简要情况"就立即上报,无需滚动过长页面,按需展开其他可选信息。