249 lines
5.9 KiB
Plaintext
249 lines
5.9 KiB
Plaintext
<template>
|
|
<div>
|
|
<div class="n-layout-page-header">
|
|
<a-card :bordered="false" title="基础表单">
|
|
基础表单,用于向用户收集表单信息,并展示 Password 组件使用示例</a-card
|
|
>
|
|
</div>
|
|
<a-card :bordered="false" class="mt-4 proCard">
|
|
<div class="BasicForm">
|
|
<BasicForm
|
|
ref="basicFormRef"
|
|
submitButtonText="提交预约"
|
|
:labelCol="{ span: 4 }"
|
|
:rowProps="{ gutter: [16, 0] }"
|
|
:colProps="{ span: 24 }"
|
|
:schemas="schemas"
|
|
actInheritLabelCol
|
|
@submit="handleSubmit"
|
|
@reset="handleReset"
|
|
>
|
|
<template #statusSlot="{ model, field }">
|
|
<a-input v-model:value="model[field]" placeholder="请输入状态" />
|
|
</template>
|
|
|
|
<template #passwordSlot="{ model, field }">
|
|
<Password
|
|
ref="passwordRef"
|
|
v-model:value="model[field]"
|
|
@change="changePassword"
|
|
block
|
|
repeat
|
|
/>
|
|
</template>
|
|
</BasicForm>
|
|
</div>
|
|
</a-card>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { ref } from 'vue';
|
|
import { BasicForm, FormSchema } from '@/components/Form/index';
|
|
import { message } from 'ant-design-vue';
|
|
import { Password } from '@/components/Password';
|
|
import { getClassifyList } from '@/api/select/select';
|
|
|
|
const params = {
|
|
type: 1,
|
|
};
|
|
|
|
async function loadSelectData(res) {
|
|
//这里可以进行数据转换处理
|
|
return (await getClassifyList({ ...res, ...params })).map((item, index) => {
|
|
return {
|
|
...item,
|
|
index,
|
|
};
|
|
});
|
|
}
|
|
|
|
const schemas: FormSchema[] = [
|
|
{
|
|
name: 'name',
|
|
component: 'Input',
|
|
label: '姓名',
|
|
labelMessage: '这是一个提示',
|
|
componentProps: {
|
|
placeholder: '请输入姓名',
|
|
onInput: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
rules: [{ required: true, message: '请输入姓名', trigger: ['blur'] }],
|
|
},
|
|
{
|
|
name: 'user.basic.age',
|
|
component: 'InputNumber',
|
|
label: '年龄',
|
|
labelMessage: '这是一个field对象演示',
|
|
componentProps: {
|
|
placeholder: '请输入年龄',
|
|
},
|
|
rules: [{ required: true, type: 'number', message: '请输入年龄', trigger: ['blur'] }],
|
|
},
|
|
{
|
|
name: 'mobile',
|
|
component: 'InputNumber',
|
|
label: '手机',
|
|
componentProps: {
|
|
placeholder: '请输入手机号码',
|
|
showButton: false,
|
|
onInput: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'type',
|
|
component: 'Select',
|
|
label: '类型',
|
|
labelMessage: '选择类型会出现预约时间表单',
|
|
componentProps: {
|
|
placeholder: '请选择类型',
|
|
allowClear: true,
|
|
options: [
|
|
{
|
|
label: '舒适性',
|
|
value: 1,
|
|
},
|
|
{
|
|
label: '经济性',
|
|
value: 2,
|
|
},
|
|
],
|
|
onUpdateValue: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'classify',
|
|
component: 'BasicSelect',
|
|
label: '动态分类',
|
|
componentProps: {
|
|
placeholder: '请选择分类',
|
|
request: loadSelectData,
|
|
block: true,
|
|
onChange: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
rules: [{ required: true, message: '请选择动态分类', trigger: ['change'] }],
|
|
},
|
|
{
|
|
name: 'makeDate',
|
|
component: 'DatePicker',
|
|
label: '预约时间',
|
|
defaultValue: '',
|
|
componentProps: {
|
|
type: 'date',
|
|
onUpdateValue: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
// 根据 上面选择的类型,获取页面其他逻辑字段 处理显示表单
|
|
// 可用字段 schema, values, model, field
|
|
hidden: ({ model }) => {
|
|
return !model.type;
|
|
},
|
|
rules: [{ required: true, type: 'number', message: '请选择预约时间', trigger: ['change'] }],
|
|
},
|
|
{
|
|
name: 'makeTime',
|
|
component: 'TimePicker',
|
|
label: '停留时间',
|
|
componentProps: {
|
|
onUpdateValue: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'makeProject',
|
|
component: 'Checkbox',
|
|
label: '预约项目',
|
|
componentProps: {
|
|
placeholder: '请选择预约项目',
|
|
options: [
|
|
{
|
|
label: '种牙',
|
|
value: 1,
|
|
},
|
|
{
|
|
label: '补牙',
|
|
value: 2,
|
|
},
|
|
{
|
|
label: '根管',
|
|
value: 3,
|
|
},
|
|
],
|
|
onUpdateValue: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'makeSource',
|
|
component: 'RadioGroup',
|
|
label: '来源',
|
|
componentProps: {
|
|
options: [
|
|
{
|
|
label: '网上',
|
|
value: 1,
|
|
},
|
|
{
|
|
label: '门店',
|
|
value: 2,
|
|
},
|
|
],
|
|
onUpdateValue: (e: any) => {
|
|
console.log(e);
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'status',
|
|
label: '状态',
|
|
//插槽
|
|
slot: 'statusSlot',
|
|
},
|
|
{
|
|
name: 'password',
|
|
label: '密码',
|
|
slot: 'passwordSlot',
|
|
},
|
|
];
|
|
|
|
const passwordRef = ref();
|
|
const basicFormRef = ref();
|
|
|
|
function handleSubmit(values: Recordable) {
|
|
// const isVal = passwordRef.value.isValidator();
|
|
// if (!isVal) {
|
|
// return passwordRef.value.showValidator();
|
|
// }
|
|
console.log(basicFormRef.value);
|
|
message.success(JSON.stringify(values));
|
|
}
|
|
|
|
function handleReset(values: Recordable) {
|
|
console.log(values);
|
|
}
|
|
|
|
function changePassword(value) {
|
|
console.log(value);
|
|
}
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.BasicForm {
|
|
width: 550px;
|
|
margin: 0 auto;
|
|
overflow: hidden;
|
|
padding-top: 20px;
|
|
}
|
|
</style>
|