|
|
@@ -0,0 +1,402 @@
|
|
|
+<template>
|
|
|
+ <div class="app-container">
|
|
|
+
|
|
|
+ <!-- 主表单区域 -->
|
|
|
+ <form @submit.prevent="handleSubmit">
|
|
|
+ <h2 class="form-title">信息录入</h2>
|
|
|
+
|
|
|
+ <!-- 基本信息组 -->
|
|
|
+ <!-- <fieldset class="form-group">
|
|
|
+ <legend>基本信息</legend> -->
|
|
|
+ <van-field
|
|
|
+ v-model="formData.name"
|
|
|
+ label="姓名"
|
|
|
+ placeholder="请输入姓名"
|
|
|
+ required
|
|
|
+ clearable
|
|
|
+ :label-width="100"
|
|
|
+ class="right-placeholder-field"
|
|
|
+ :error-message="errorform.name"
|
|
|
+ @input="nameError"
|
|
|
+ @blur="nameError"
|
|
|
+ />
|
|
|
+
|
|
|
+ <single-select
|
|
|
+ v-model="formData.gender"
|
|
|
+ label="性别"
|
|
|
+ :options="getLabelForValue(dict.type.dict_sex)"
|
|
|
+ required
|
|
|
+ placeholder="请输入性别"
|
|
|
+ labelWidth="3em"
|
|
|
+ :errorMessage="errorform.gender"
|
|
|
+ @error-message="genderError"
|
|
|
+ />
|
|
|
+
|
|
|
+ <van-field
|
|
|
+ v-model="formData.mobile"
|
|
|
+ label="联系电话"
|
|
|
+ placeholder="请输入手机号"
|
|
|
+ required
|
|
|
+ clearable
|
|
|
+ :label-width="100"
|
|
|
+ :error-message="errorform.mobile"
|
|
|
+ @input="mobileError"
|
|
|
+ @blur="mobileError"
|
|
|
+ />
|
|
|
+
|
|
|
+ <div style="margin-top: 1rem;">
|
|
|
+ <van-field
|
|
|
+ v-model="formData.idCard"
|
|
|
+ label="身份证号码"
|
|
|
+ placeholder="请输入身份证号码"
|
|
|
+ required
|
|
|
+ clearable
|
|
|
+ :label-width="100"
|
|
|
+ :error-message="errorform.idCard"
|
|
|
+ @input="idCardError"
|
|
|
+ @blur="idCardError"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <date-picker
|
|
|
+ v-model="formData.birthDate"
|
|
|
+ label="出生年月"
|
|
|
+ required
|
|
|
+ />
|
|
|
+
|
|
|
+ <van-field
|
|
|
+ v-model="formData.age"
|
|
|
+ label="年龄"
|
|
|
+ placeholder="请输入年龄"
|
|
|
+ required
|
|
|
+ clearable
|
|
|
+ :label-width="100"
|
|
|
+ :error-message="errorform.age"
|
|
|
+ @input="ageError"
|
|
|
+ @blur="ageError"
|
|
|
+ />
|
|
|
+
|
|
|
+
|
|
|
+ <!-- <single-select
|
|
|
+ v-model="formData.profession"
|
|
|
+ label="职业"
|
|
|
+ placeholder="请输入职业"
|
|
|
+ :options="professionOptions"
|
|
|
+ required
|
|
|
+ labelWidth="3em"
|
|
|
+ /> -->
|
|
|
+
|
|
|
+ <single-select
|
|
|
+ v-model="formData.education"
|
|
|
+ label="教育程度"
|
|
|
+ :options="getLabelForValue(dict.type.education_type)"
|
|
|
+ placeholder="请输入教育程度"
|
|
|
+ required
|
|
|
+ labelWidth="5em"
|
|
|
+ :errorMessage="errorform.education"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 病史多选题组 -->
|
|
|
+ <MultiSelect
|
|
|
+ v-model="formData.medicalHistory"
|
|
|
+ label="现病史(多选)"
|
|
|
+ :options="getLabelForValue(dict.type.medical_current_type)"
|
|
|
+ />
|
|
|
+
|
|
|
+ <MultiSelect
|
|
|
+ v-model="formData.familyHistory"
|
|
|
+ label="既往史(多选)"
|
|
|
+ :options="getLabelForValue(dict.type.medical_his_type)"
|
|
|
+ />
|
|
|
+
|
|
|
+ <MultiSelect
|
|
|
+ v-model="formData.familyHistory"
|
|
|
+ label="家族史(多选)"
|
|
|
+ :options="getLabelForValue(dict.type.genetic_disease)"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 诊断结果多选题组 -->
|
|
|
+ <MultiSelect
|
|
|
+ v-model="formData.diagnosis"
|
|
|
+ label="诊疗结果(多选)"
|
|
|
+ :options="getLabelForValue(dict.type.diagnose_result_type)"
|
|
|
+ />
|
|
|
+
|
|
|
+ <MultiSelect
|
|
|
+ v-model="formData.diagnosis"
|
|
|
+ label="认知障碍(多选)"
|
|
|
+ :options="getLabelForValue(dict.type.game_type)"
|
|
|
+ />
|
|
|
+ <!-- 提交按钮 -->
|
|
|
+ <button type="submit" class="submit-btn">提交</button>
|
|
|
+ </form>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+
|
|
|
+import InputField from '@/components/OfficialAccounts/InputField.vue';
|
|
|
+import SingleSelect from '@/components/OfficialAccounts/SingleSelect.vue';
|
|
|
+import MultiSelect from '@/components/OfficialAccounts/MultiSelect.vue';
|
|
|
+import DatePicker from '@/components/OfficialAccounts/DatePicker.vue';
|
|
|
+
|
|
|
+export default {
|
|
|
+ dicts: ['equipment_class', 'education_type', 'dict_sex', 'medical_his_type', 'medical_current_type', 'diagnose_result_type', 'career', 'game_type', 'genetic_disease', 'department', 'patient_source', 'pay_status', 'pay_method'],
|
|
|
+ components: {
|
|
|
+ InputField,
|
|
|
+ SingleSelect,
|
|
|
+ MultiSelect,
|
|
|
+ DatePicker
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ minDate: new Date(1990,1,1),
|
|
|
+ formData: {
|
|
|
+ name: '',
|
|
|
+ gender: '',
|
|
|
+ mobile: '',
|
|
|
+ birthDate: '',
|
|
|
+ age: '',
|
|
|
+ idCard: '',
|
|
|
+ education: '',
|
|
|
+ medicalHistory: [],
|
|
|
+ familyHistory: [],
|
|
|
+ diagnosis: []
|
|
|
+ },
|
|
|
+ errorform: {
|
|
|
+ name: '',
|
|
|
+ gender: '',
|
|
|
+ mobile: '',
|
|
|
+ birthDate: '',
|
|
|
+ age: '',
|
|
|
+ idCard: '',
|
|
|
+ education: '',
|
|
|
+ medicalHistory: [],
|
|
|
+ familyHistory: [],
|
|
|
+ diagnosis: []
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ getLabelForValue(educationData) {
|
|
|
+ return educationData.map(item => ({
|
|
|
+ label: item.label,
|
|
|
+ value: item.value
|
|
|
+ }))
|
|
|
+ },
|
|
|
+ handleSubmit() {
|
|
|
+ // 表单验证
|
|
|
+ if (!this.validateForm()) return;
|
|
|
+
|
|
|
+ // 处理提交逻辑
|
|
|
+ console.log('提交数据:', this.formData);
|
|
|
+ },
|
|
|
+ validateForm() {
|
|
|
+ // 手机号验证
|
|
|
+ const phoneRegex = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
|
|
|
+ if (!phoneRegex.test(this.formData.phone)) {
|
|
|
+ this.errorform.mobile = "请输入有效的手机号码"
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 年龄验证
|
|
|
+ if (isNaN(this.formData.age) || this.formData.age < 0) {
|
|
|
+ this.$toast.error('请输入有效的年龄');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ },
|
|
|
+ //校验
|
|
|
+ nameError() {
|
|
|
+ this.errorform.name = this.formData.name.trim().length === 0
|
|
|
+ ? '姓名不能为空'
|
|
|
+ : '';
|
|
|
+ },
|
|
|
+ genderError() {
|
|
|
+ this.errorform.gender = this.formData.gender.trim().length === 0
|
|
|
+ ? '性别不能为空'
|
|
|
+ : '';
|
|
|
+ },
|
|
|
+ mobileError() {
|
|
|
+ this.errorform.mobile = this.formData.mobile.trim().length === 0
|
|
|
+ ? '手机号不能为空'
|
|
|
+ : '';
|
|
|
+ },
|
|
|
+ birthDateError() {
|
|
|
+ this.errorform.birthDate = this.formData.birthDate.trim().length === 0
|
|
|
+ ? '出生年月不能为空'
|
|
|
+ : '';
|
|
|
+ },
|
|
|
+ ageError() {
|
|
|
+ this.errorform.age = this.formData.age.trim().length === 0
|
|
|
+ ? '年龄不能为空'
|
|
|
+ : '';
|
|
|
+ },
|
|
|
+ idCardError() {
|
|
|
+ const idCard = this.formData.idCard.trim();
|
|
|
+
|
|
|
+ // 基础格式校验
|
|
|
+ const idCardPattern = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
|
|
|
+
|
|
|
+ if (!idCard) {
|
|
|
+ this.errorform.idCard = '身份证号码不能为空';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!idCardPattern.test(idCard)) {
|
|
|
+ this.errorform.idCard = '身份证号码格式不正确';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.formData.idCard.length == 18) {
|
|
|
+ this.formData.birthDate = this.formData.idCard.substring(6, 10) + "-" + this.formData.idCard.substring(10, 12) + "-" + this.formData.idCard.substring(12, 14)
|
|
|
+ this.formData.age = this.calculateAge(this.formData.idCard)
|
|
|
+ }
|
|
|
+ this.errorform.idCard = '';
|
|
|
+ },
|
|
|
+ // 获取年龄
|
|
|
+ calculateAge(iden) {
|
|
|
+ if (iden.length == 18) {
|
|
|
+ let ye = iden.substring(6, 10)
|
|
|
+ let date = new Date();
|
|
|
+ let year = date.getFullYear();
|
|
|
+ return year - ye
|
|
|
+ }
|
|
|
+ },
|
|
|
+ educationError() {
|
|
|
+ this.errorform.education = this.formData.education.trim().length === 0
|
|
|
+ ? '教育程度不能为空'
|
|
|
+ : '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+.app-container {
|
|
|
+ width: 100vw;
|
|
|
+ background-color:#f8f9fa;
|
|
|
+ box-sizing: border-box;
|
|
|
+}
|
|
|
+
|
|
|
+.status-bar {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 30px;
|
|
|
+ color: #666;
|
|
|
+ font-family: Arial;
|
|
|
+
|
|
|
+ .time, .battery {
|
|
|
+ font-size: 1.2em;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+form {
|
|
|
+
|
|
|
+
|
|
|
+ h2.form-title {
|
|
|
+ text-align: center;
|
|
|
+ margin-bottom: 30px;
|
|
|
+ color: #333;
|
|
|
+ font-size: 1.5em;
|
|
|
+ }
|
|
|
+
|
|
|
+ .submit-btn {
|
|
|
+ background-color: #007bff;
|
|
|
+ color: white;
|
|
|
+ padding: 12px 25px;
|
|
|
+ border: none;
|
|
|
+ border-radius: 5px;
|
|
|
+ font-size: 1.1em;
|
|
|
+ cursor: pointer;
|
|
|
+ width: 100%;
|
|
|
+ margin-top: 20px;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ background-color: #0056b3;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// /* 输入框和选择器通用样式 */
|
|
|
+// .single-select, .multi-select, .date-picker {
|
|
|
+// width: 100%;
|
|
|
+// margin-bottom: 15px;
|
|
|
+
|
|
|
+// label {
|
|
|
+// display: block;
|
|
|
+// margin-bottom: 5px;
|
|
|
+// color: #495057;
|
|
|
+// font-weight: 500;
|
|
|
+// }
|
|
|
+
|
|
|
+// select {
|
|
|
+// width: 100%;
|
|
|
+// padding: 10px;
|
|
|
+// border: 1px solid #ddd;
|
|
|
+// border-radius: 5px;
|
|
|
+// font-size: 1em;
|
|
|
+
|
|
|
+// &:focus {
|
|
|
+// outline: none;
|
|
|
+// border-color: #007bff;
|
|
|
+// box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// .multi-select {
|
|
|
+// display: flex;
|
|
|
+// flex-direction: column;
|
|
|
+
|
|
|
+// .option-btn {
|
|
|
+// margin: 5px 0;
|
|
|
+// padding: 8px;
|
|
|
+// background-color: #fff;
|
|
|
+// border: 1px solid #ddd;
|
|
|
+// border-radius: 3px;
|
|
|
+// cursor: pointer;
|
|
|
+
|
|
|
+// &.selected {
|
|
|
+// background-color: #007bff;
|
|
|
+// color: white;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+/* 日期选择器样式 */
|
|
|
+// .date-picker {
|
|
|
+// position: relative;
|
|
|
+
|
|
|
+// input {
|
|
|
+// cursor: pointer;
|
|
|
+// }
|
|
|
+
|
|
|
+// .calendar-icon {
|
|
|
+// position: absolute;
|
|
|
+// right: 10px;
|
|
|
+// top: 50%;
|
|
|
+// transform: translateY(-50%);
|
|
|
+// font-size: 1.2em;
|
|
|
+// color: #666;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+/* 提示信息样式 */
|
|
|
+.toast {
|
|
|
+ position: fixed;
|
|
|
+ top: 20px;
|
|
|
+ right: -300px;
|
|
|
+ padding: 15px 25px;
|
|
|
+ background-color: #fff;
|
|
|
+ border: 1px solid #ddd;
|
|
|
+ border-radius: 5px;
|
|
|
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
|
|
+ transition: right 0.3s ease;
|
|
|
+}
|
|
|
+</style>
|