表单样式优化

master
wujingling0908 6 days ago
parent 1b1d703e0e
commit e26097252a
  1. 10
      src/components/chat-content.vue
  2. 458
      src/components/intelligent-computing.vue

@ -326,9 +326,9 @@
</div>
</div>
<div class="chat-items">
<div class="content-left-main computing-text-box" style="padding: 0">
<div class="content-left-main computing-text-box" style="padding: 0;border-radius:12rem;background: linear-gradient(358deg, #ffffffb3 3%, #f7f8ff 97%);">
<intelligent-computing :itemList="item" :propsType="'yearOld'"
:btnFloat="false"></intelligent-computing>
:btnFloat="!isHistory"></intelligent-computing>
</div>
</div>
</div>
@ -345,7 +345,7 @@
<div class="chat-items">
<div class="content-left-main computing-text-box" style="padding: 0">
<intelligent-computing :itemList="item" :propsType="'observation'"
:btnFloat="false"></intelligent-computing>
:btnFloat="!isHistory"></intelligent-computing>
</div>
</div>
</div>
@ -362,7 +362,7 @@
<div class="chat-items">
<div class="content-left-main computing-text-box" style="padding: 0">
<intelligent-computing :itemList="item" :propsType="'gracePeriod'"
:btnFloat="false"></intelligent-computing>
:btnFloat="!isHistory"></intelligent-computing>
</div>
</div>
</div>
@ -379,7 +379,7 @@
<div class="chat-items">
<div class="content-left-main computing-text-box" style="padding: 0">
<intelligent-computing :itemList="item" :propsType="'takeEffect'"
:btnFloat="false"></intelligent-computing>
:btnFloat="!isHistory"></intelligent-computing>
</div>
</div>
</div>

@ -4,122 +4,160 @@
<div class="intelligent-computing-box" v-if="propsType == 'observation'">
<h3 class="title">观察期计算</h3>
<div class="flex date-box">
<em>保单生效日:</em>
<input class="className" readonly is-link :value="timeValue" @click="showPopup" />
<van-popup v-model:show="show" position="bottom" get-container="body">
<van-datetime-picker
v-model="currentDate"
type="date"
title="请选择日期"
:loading="isLoadingShow"
:formatter="formatter"
@change="seletTimeChange"
@cancel="show = false"
@confirm="confirmPicker"
/>
</van-popup>
</div>
<div class="flex observation">
<span>约定观察期:</span>
<van-radio-group v-model="radio" direction="horizontal" @change="radioChange">
<van-radio name="90" shape="square">90天</van-radio>
<van-radio name="180" shape="square">180天</van-radio>
</van-radio-group>
</div>
<div class="flex">
<em>观察期截止日:</em><span class="end-date">{{ userComputedValue }}</span>
</div>
<button class="compute-btn" @click="userComputed" v-if="btnFloat">计算</button>
<van-cell-group inset>
<van-field
class="className"
readonly
is-link
input-align="right"
v-model="timeValue"
label="保单生效日"
@click-input="showPopup"
:disabled="!btnFloat"
/>
<van-field
name="radio"
class="className"
input-align="right"
label="约定观察期"
:disabled="!btnFloat"
>
<template #input>
<van-radio-group
:disabled="!btnFloat"
v-model="radio"
direction="horizontal"
@change="radioChange"
>
<van-radio name="90" shape="square">90天</van-radio>
<van-radio name="180" shape="square">180天</van-radio>
</van-radio-group>
</template>
</van-field>
<van-field
name="radio"
class="className"
input-align="right"
label="观察期截止日"
:disabled="!btnFloat"
>
<template #input>
{{ userComputedValue }}
</template>
</van-field>
</van-cell-group>
<button class="compute-btn" @click="userComputed('observation')" :disabled="!btnFloat">
计算
</button>
</div>
<div class="intelligent-computing-box" v-if="propsType == 'gracePeriod'">
<h3 class="title">宽限期计算</h3>
<div class="flex date-box flex-around">
<em>应交费日期:</em>
<input class="className" readonly is-link :value="timeValue" @click="showPopup" />
<van-popup v-model:show="show" position="bottom" get-container="body">
<van-datetime-picker
v-model="currentDate"
type="date"
title="请选择日期"
:loading="isLoadingShow"
:formatter="formatter"
@change="seletTimeChange"
@cancel="show = false"
@confirm="confirmPicker"
/>
</van-popup>
</div>
<div class="flex observation flex-around">
<em>宽限期截止日:</em><span class="end-date">{{ userComputedValue }}</span>
</div>
<button class="compute-btn" @click="userComputed" v-if="btnFloat">计算</button>
<van-cell-group inset>
<van-field
class="className"
readonly
is-link
input-align="right"
v-model="timeValue"
label="应交费日期"
@click-input="showPopup"
:disabled="!btnFloat"
/>
<van-field
name="endDate"
class="className"
input-align="right"
label="宽限期截止日"
:disabled="!btnFloat"
>
<template #input>
{{ userComputedValue }}
</template>
</van-field>
</van-cell-group>
<button class="compute-btn" @click="userComputed('gracePeriod')" :disabled="!btnFloat">
计算
</button>
</div>
<div class="intelligent-computing-box" v-if="propsType == 'yearOld'">
<h3 class="title">周岁计算</h3>
<div class="flex date-box flex-around">
<em>出生年月日:</em>
<input class="className" readonly is-link :value="timeValue" @click="showPopup" />
<van-popup v-model:show="show" position="bottom" get-container="body">
<van-datetime-picker
v-model="currentDate"
type="date"
title="请选择日期"
:loading="isLoadingShow"
:min-date="yearOld.minDate"
:max-date="yearOld.maxDate"
:formatter="formatter"
@change="seletTimeChange"
@cancel="show = false"
@confirm="confirmPicker"
/>
</van-popup>
</div>
<div class="flex observation flex-around marginTop5">
<em>周岁:</em><span class="end-date">{{ userComputedValue }}</span>
</div>
<button class="compute-btn" @click="userComputed" v-if="btnFloat">计算</button>
<van-cell-group inset>
<van-field
class="className"
readonly
is-link
v-model="timeValue"
label="出生年月日"
input-align="right"
@click-input="showPopup"
:disabled="!btnFloat"
/>
<van-field
name="age"
class="className"
input-align="right"
label="周岁"
:disabled="!btnFloat"
>
<template #input>
{{ userComputedValue }}
</template>
</van-field>
</van-cell-group>
<button class="compute-btn" @click="userComputed('yearOld')" :disabled="!btnFloat">
计算
</button>
</div>
<div class="intelligent-computing-box" v-if="propsType == 'takeEffect'">
<h3 class="title">生效日对应日计算</h3>
<div class="flex date-box flex-around">
<em>保单生效日:</em>
<input
<van-cell-group inset>
<van-field
class="className"
style="width: 150px"
readonly
is-link
:value="timeValue"
@click="showPopup"
input-align="right"
v-model="timeValue"
label="保单生效日"
@click-input="showPopup"
:disabled="!btnFloat"
/>
<van-popup v-model:show="show" position="bottom" get-container="body">
<van-date-picker
v-model="currentDate"
type="date"
title="请选择日期"
:loading="isLoadingShow"
:formatter="formatter"
@change="seletTimeChange"
@cancel="show = false"
@confirm="confirmPicker"
/>
</van-popup>
</div>
<div class="flex observation flex-around">
<em>保单生效日对应日:</em
><span class="end-date" style="width: 150px">{{ userComputedValue }}</span>
</div>
<button class="compute-btn" @click="userComputed" v-if="btnFloat">计算</button>
<van-field
name="effectDate"
class="className"
input-align="right"
label="保单生效日对应日"
:disabled="!btnFloat"
>
<template #input>
{{ userComputedValue }}
</template>
</van-field>
</van-cell-group>
<button class="compute-btn" @click="userComputed('takeEffect')" :disabled="!btnFloat">
计算
</button>
</div>
<van-popup v-model:show="show" position="bottom" teleport="body" round>
<van-date-picker
v-model="currentDateValues"
title="请选择日期"
:min-date="minDate"
:max-date="maxDate"
:formatter="formatter"
@cancel="show = false"
@confirm="confirmPicker"
/>
</van-popup>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { showToast, Popup, DatePicker, Radio, RadioGroup } from 'vant'
import { ref, computed } from 'vue'
import { showToast } from 'vant'
import { Post } from '@/utils/https'
const props = defineProps({
@ -129,85 +167,92 @@ const props = defineProps({
})
const show = ref(false)
const isLoadingShow = ref(true)
const currentDate = ref(new Date())
const timeValue = ref('日期选择')
const radio = ref('90')
const userComputedValue = ref('')
const userComputedRequest = ref(true)
const yearOld = ref({ minDate: new Date(1970, 0, 1), maxDate: new Date() })
const now = new Date()
const currentDateValues = ref([
String(now.getFullYear()),
String(now.getMonth() + 1).padStart(2, '0'),
String(now.getDate()).padStart(2, '0'),
])
const minDate = computed(() =>
props.propsType === 'yearOld' ? new Date(1970, 0, 1) : new Date(1970, 0, 1),
)
const maxDate = computed(() =>
props.propsType === 'yearOld' ? new Date() : new Date(2099, 11, 31),
)
function valuesToDate(values) {
const [y, m, d] = (values || currentDateValues.value).map((v) => Number(v))
return new Date(y, (m || 1) - 1, d || 1)
}
function showPopup() {
console.log(23232);
// 历史记录中不允许点击选择日期
if (!props.btnFloat) return
show.value = true
isLoadingShow.value = true
setTimeout(() => {
isLoadingShow.value = false
}, 500)
}
function radioChange() {
if (!props.btnFloat) return
userComputedRequest.value = true
userComputedValue.value = ''
}
function confirmPicker(val) {
let year = val.getFullYear()
let month = val.getMonth() + 1
let day = val.getDate()
if (month >= 1 && month <= 9) month = `0${month}`
if (day >= 1 && day <= 9) day = `0${day}`
if (`${year}-${month}-${day}` == timeValue.value) {
userComputedRequest.value = false
} else {
userComputedRequest.value = true
}
timeValue.value = `${year}年${month}月${day}日`
show.value = false
}
function seletTimeChange() {
function confirmPicker({ selectedValues }) {
const values = selectedValues || currentDateValues.value
currentDateValues.value = values
const [year, month, day] = values
const next = `${year}年${month}月${day}日`
userComputedRequest.value = next !== timeValue.value
timeValue.value = next
userComputedValue.value = ''
show.value = false
}
function formatter(type, value) {
if (type === 'year') return `${value}年`
if (type === 'month') return `${value}月`
if (type === 'day') return `${value}日`
return value
function formatter(type, option) {
if (type === 'year') option.text = `${option.text || option.value}年`
if (type === 'month') option.text = `${option.text || option.value}月`
if (type === 'day') option.text = `${option.text || option.value}日`
return option
}
function userComputed() {
if (currentDate.value && timeValue.value !== '日期选择') {
let info = new Date(currentDate.value)
let title = ''
let inputParams = ''
switch (props.propsType) {
case 'observation':
userComputedValue.value = DateAdd('d', parseInt(radio.value), info)
inputParams = getNowFormatDate(currentDate.value) + '|' + radio.value
title = '观察期'
break
case 'gracePeriod':
userComputedValue.value = DateAdd('d', 60, info)
inputParams = getNowFormatDate(currentDate.value)
title = '宽限期'
break
case 'yearOld':
userComputedValue.value = getAges(info)
inputParams = getNowFormatDate(currentDate.value)
title = '周岁'
break
case 'takeEffect':
userComputedValue.value = DateAdd('y', 1, info)
inputParams = getNowFormatDate(currentDate.value)
title = '生效日对应日'
break
}
requestInfo(title, inputParams, userComputedValue.value)
} else {
function userComputed(type) {
if (timeValue.value === '日期选择') {
showToast('请选择时间')
return
}
const info = valuesToDate(currentDateValues.value)
let title = ''
let inputParams = ''
switch (type) {
case 'observation':
userComputedValue.value = DateAdd('d', parseInt(radio.value, 10), new Date(info))
inputParams = getNowFormatDate(info) + '|' + radio.value
title = '观察期'
break
case 'gracePeriod':
userComputedValue.value = DateAdd('d', 60, new Date(info))
inputParams = getNowFormatDate(info)
title = '宽限期'
break
case 'yearOld':
userComputedValue.value = getAges(new Date(info))
inputParams = getNowFormatDate(info)
title = '周岁'
break
case 'takeEffect':
userComputedValue.value = DateAdd('y', 1, new Date(info))
inputParams = getNowFormatDate(info)
title = '生效日对应日'
break
}
requestInfo(title, inputParams, userComputedValue.value)
}
function DateAdd(interval, number, date) {
@ -235,14 +280,15 @@ function getNowFormatDate(data) {
}
function getAges(data) {
let brith = data
let toDay = new Date()
const brith = data
const toDay = new Date()
if (
brith.getFullYear() === toDay.getFullYear() &&
brith.getMonth() === toDay.getMonth() &&
brith.getDate() === brith.getDate()
)
brith.getDate() === toDay.getDate()
) {
return 0
}
let age = toDay.getFullYear() - brith.getFullYear()
if (toDay.getMonth() > brith.getMonth()) return age
if (toDay.getMonth() < brith.getMonth()) return age - 1
@ -260,81 +306,59 @@ function requestInfo(content, inputParams, outputParams) {
}
</script>
<style scoped>
.intelligent-computing,
<style scoped lang="scss">
.intelligent-computing {
padding: 16rem;
}
.intelligent-computing-box .van-cell {
padding: 0;
padding-left: 0;
padding-right: 0;
}
.intelligent-computing .hint-tit {
font-size: 14px;
background: #4f96ff;
border-radius: 18px 18px 0 0;
padding: 5px;
color: #fff;
line-height: 28px;
font-size: 16rem;
line-height: 20rem;
color: #17204d;
margin: 0;
}
.intelligent-computing-box {
padding: 0 15px 15px;
font-size: 15px;
color: #666;
background: transparent;
}
.intelligent-computing-box .title {
padding: 26px 0 13px;
font-size: 18px;
font-size: 16rem;
font-weight: 600;
color: #333;
}
.intelligent-computing-box .observation {
padding: 10px 0;
color: #17204d;
margin: 12rem 0;
}
.intelligent-computing-box .compute-btn {
width: 156px;
height: 33px;
line-height: 33px;
border-radius: 50px;
background: #5a9cff;
margin: 20px auto;
font-size: 14px;
width: 100%;
height: 40rem;
margin-top: 16rem;
border: 0;
border-radius: 22rem;
background: linear-gradient(90deg, #025cea 0%, #0595f6 100%);
color: #fff;
display: block;
border: none;
cursor: pointer;
font-size: 15rem;
&:disabled {
background: linear-gradient(270deg, #63a0ff 0%, #025cea 100%);
opacity: 0.3;
color: inherit;
}
}
.intelligent-computing-box .className {
border: 1px solid #b2b2b2;
font-size: 13px;
border-radius: 4px;
text-indent: 10px;
width: 200px;
height: 21px;
line-height: 21px;
background: url('../assets/images/drop_down_icon.png') no-repeat 95% center;
background-size: 16px;
margin-left: 14px;
text-align: center;
background: transparent;
min-height: 48rem;
align-items: center;
}
.intelligent-computing-box .end-date {
font-size: 13px;
border: 1px solid #b2b2b2;
width: 200px;
height: 21px;
line-height: 21px;
text-align: center;
border-radius: 4px;
:deep(.van-cell-group--inset) {
margin: 0;
padding: 0 12rem;
border-radius: 8rem;
}
.flex-around {
justify-content: space-between;
:deep(.van-field__label label) {
white-space: nowrap;
}
.marginTop5 {
margin-top: 5px;
:deep(.van-cell__right-icon) {
line-height: 25rem;
height: 24rem;
}
</style>

Loading…
Cancel
Save