ykt-wxapp/pages/case/patient-create.vue

133 lines
3.2 KiB
Vue
Raw Normal View History

2026-01-20 16:24:43 +08:00
<template>
<view class="page">
<view class="body">
<scroll-view scroll-y class="scroll">
<view class="form-wrap">
<form-template ref="formRef" :items="baseItems" :form="form" :rule="rules" @change="onChange" />
</view>
</scroll-view>
<view class="footer">
<button class="primary" @click="next">下一步</button>
</view>
</view>
</view>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { onLoad } from '@dcloudio/uni-app';
import FormTemplate from '@/components/form-template/index.vue';
import validate from '@/utils/validate';
const STORAGE_KEY = 'patient-create-base';
const formRef = ref(null);
const form = reactive({
name: '',
gender: '',
age: '',
mobile: '',
birthday: '',
idType: '',
idNo: ''
});
const baseItems = [
{ title: 'name', name: '姓名', type: 'input', operateType: 'formCell', required: true, wordLimit: 20, inputType: 'text' },
{ title: 'gender', name: '性别', type: 'select', operateType: 'formCell', required: false, range: ['男', '女'] },
{ title: 'age', name: '年龄', type: 'input', operateType: 'formCell', required: false, wordLimit: 3, inputType: 'number' },
{ title: 'mobile', name: '手机号', type: 'input', operateType: 'formCell', required: false, wordLimit: 11, inputType: 'number' },
{ title: 'birthday', name: '出生日期', type: 'date', operateType: 'formCell', required: false },
{ title: 'idType', name: '证件类型', type: 'select', operateType: 'formCell', required: false, range: ['身份证', '护照', '港澳台通行证', '其他'] },
{ title: 'idNo', name: '证件号', type: 'input', operateType: 'formCell', required: false, wordLimit: 30, inputType: 'text' }
];
const rules = {
idNo(value) {
if (!value) return true;
if (form.idType === '身份证') {
const [ok, msg] = validate.isChinaId(value);
if (!ok) return msg || '证件号格式不正确';
}
return true;
}
};
onLoad(() => {
const cached = uni.getStorageSync(STORAGE_KEY);
if (cached && typeof cached === 'object') {
Object.assign(form, cached);
}
});
function onChange({ title, value }) {
form[title] = value;
}
function next() {
if (!formRef.value?.verify?.()) return;
uni.setStorageSync(STORAGE_KEY, { ...form });
uni.navigateTo({ url: '/pages/case/patient-inner-info' });
}
</script>
<style lang="scss" scoped>
.page {
height: 100vh;
background: #f6f6f6;
}
.body {
height: 100vh;
display: flex;
flex-direction: column;
}
.scroll {
flex: 1;
}
.form-wrap {
background: #fff;
}
.step-note {
position: fixed;
left: 50%;
bottom: 92px;
transform: translateX(-50%);
background: #f2df52;
color: #000;
font-size: 14px;
padding: 10px 16px;
border-radius: 4px;
box-shadow: 0 6px 14px rgba(0, 0, 0, 0.18);
}
.footer {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.06);
}
.primary {
width: 100%;
height: 48px;
line-height: 48px;
background: #5d8aff;
color: #fff;
border-radius: 6px;
font-size: 16px;
}
.primary::after {
border: none;
}
</style>