feat:增加月经天数统计
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { cloudService } from './index'
|
import { cloudService } from './index'
|
||||||
import { IPeriodDay, IPeriodSetting } from '@/types/period.ts'
|
import { IMenstrualPeriod, IPeriodDay, IPeriodSetting } from '@/types/period.ts'
|
||||||
|
|
||||||
|
|
||||||
export const updatePeriodDayApi = (id: number, periodDay: IPeriodDay): Promise<boolean> =>
|
export const updatePeriodDayApi = (id: number, periodDay: IPeriodDay): Promise<boolean> =>
|
||||||
@@ -16,6 +16,12 @@ export const queryPeriodDayApi = (month: string): Promise<IPeriodDay[]> =>
|
|||||||
params: { month }
|
params: { month }
|
||||||
})
|
})
|
||||||
|
|
||||||
|
export const getMenstrualDaysApi = (): Promise<IMenstrualPeriod[]> =>
|
||||||
|
cloudService({
|
||||||
|
url: '/home-api/period//menstruate/days',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
|
||||||
export const getMenstruateFirstDateApi = (month: string): Promise<string> =>
|
export const getMenstruateFirstDateApi = (month: string): Promise<string> =>
|
||||||
cloudService({
|
cloudService({
|
||||||
url: '/home-api/period/menstruate',
|
url: '/home-api/period/menstruate',
|
||||||
|
|||||||
@@ -70,6 +70,11 @@
|
|||||||
<i class="fa-solid fa-calendar-days"></i>
|
<i class="fa-solid fa-calendar-days"></i>
|
||||||
<span>记录</span>
|
<span>记录</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
|
<router-link v-if="path.includes('period')" to="/period/status"
|
||||||
|
@click="routerClick()" class="item">
|
||||||
|
<i class="fa-solid fa-chart-pie"></i>
|
||||||
|
<span>统计</span>
|
||||||
|
</router-link>
|
||||||
<router-link v-if="path.includes('period')" to="/period/setting"
|
<router-link v-if="path.includes('period')" to="/period/setting"
|
||||||
@click="routerClick()" class="item">
|
@click="routerClick()" class="item">
|
||||||
<i class="fa-solid fa-gear"></i>
|
<i class="fa-solid fa-gear"></i>
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { IHandleApi } from 'vue3-common/types'
|
import { IHandleApi } from 'vue3-common/types'
|
||||||
import { IPeriodDay, IPeriodSetting } from '@/types/period.ts'
|
import { IMenstrualPeriod, IPeriodDay, IPeriodSetting } from '@/types/period.ts'
|
||||||
import {
|
import {
|
||||||
|
getMenstrualDaysApi,
|
||||||
getMenstruateFirstDateApi,
|
getMenstruateFirstDateApi,
|
||||||
queryPeriodDayApi,
|
queryPeriodDayApi,
|
||||||
queryPeriodSettingApi,
|
queryPeriodSettingApi,
|
||||||
@@ -13,6 +14,7 @@ import { getCurrentMonth } from 'vue3-common/utils/dateUtil'
|
|||||||
export const usePeriodStore = defineStore('period', {
|
export const usePeriodStore = defineStore('period', {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
periodDayList: [] as IPeriodDay[],
|
periodDayList: [] as IPeriodDay[],
|
||||||
|
menstrualDaysList: [] as IMenstrualPeriod[],
|
||||||
periodSetting: {
|
periodSetting: {
|
||||||
id: 0,
|
id: 0,
|
||||||
cycleLength: 0,
|
cycleLength: 0,
|
||||||
@@ -52,6 +54,9 @@ export const usePeriodStore = defineStore('period', {
|
|||||||
async getMenstruateFirstDate(month: string) {
|
async getMenstruateFirstDate(month: string) {
|
||||||
this.menstruateFirstDate = await getMenstruateFirstDateApi(month)
|
this.menstruateFirstDate = await getMenstruateFirstDateApi(month)
|
||||||
},
|
},
|
||||||
|
async getMenstruateDays() {
|
||||||
|
this.menstrualDaysList = await getMenstrualDaysApi()
|
||||||
|
},
|
||||||
async refreshInfo() {
|
async refreshInfo() {
|
||||||
await this.queryPeriodDayList()
|
await this.queryPeriodDayList()
|
||||||
await this.queryPeriodSetting()
|
await this.queryPeriodSetting()
|
||||||
|
|||||||
@@ -35,3 +35,8 @@ export interface IPeriodSetting {
|
|||||||
duration: number;
|
duration: number;
|
||||||
isCalculate: boolean;
|
isCalculate: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IMenstrualPeriod{
|
||||||
|
startDate: string;
|
||||||
|
endDate: string;
|
||||||
|
}
|
||||||
|
|||||||
@@ -143,6 +143,10 @@ export const mobileHomeMeta: IRouteMetaConfig = {
|
|||||||
title: '记录',
|
title: '记录',
|
||||||
icon: ''
|
icon: ''
|
||||||
},
|
},
|
||||||
|
'/period/status': {
|
||||||
|
title: '统计',
|
||||||
|
icon: ''
|
||||||
|
},
|
||||||
'/period/setting': {
|
'/period/setting': {
|
||||||
title: '设置',
|
title: '设置',
|
||||||
icon: ''
|
icon: ''
|
||||||
|
|||||||
105
src/views/period/status.vue
Normal file
105
src/views/period/status.vue
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mobile-period-chart common-mobile-view">
|
||||||
|
<el-tabs v-model="activeName" type="card">
|
||||||
|
<el-tab-pane label="月经周期" name="menstrualDays">
|
||||||
|
<div v-if="periodStore.menstrualDaysList.length > 0" class="content">
|
||||||
|
<div v-for="(item, index) in periodStore.menstrualDaysList"
|
||||||
|
:key="index" class="period-item"
|
||||||
|
:style="{ background: getPeriod(item) > duration ? '#fee2e2' : '#FFFFFF'}"
|
||||||
|
>
|
||||||
|
<span>开始日期: {{ item.startDate }}</span>
|
||||||
|
<span>结束日期: {{ item.endDate }}</span>
|
||||||
|
<span>天数: {{ getPeriod(item) }}天</span>
|
||||||
|
<span v-if="getPeriod(item) > duration" class="warning-menstrual">周期过长</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else class="empty-state">
|
||||||
|
<el-empty description="暂无记录"></el-empty>
|
||||||
|
</div>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { computed, onMounted, ref } from 'vue'
|
||||||
|
import { getDateDifference } from 'vue3-common/utils/dateUtil'
|
||||||
|
import { usePeriodStore } from '@/store/period'
|
||||||
|
import { IMenstrualPeriod } from '@/types/period'
|
||||||
|
|
||||||
|
const periodStore = usePeriodStore()
|
||||||
|
const duration = computed(() => periodStore.periodSetting.duration)
|
||||||
|
|
||||||
|
const activeName = ref('menstrualDays')
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
periodStore.getMenstruateDays()
|
||||||
|
})
|
||||||
|
|
||||||
|
const getPeriod = (item: IMenstrualPeriod) => {
|
||||||
|
return getDateDifference(item.startDate, item.endDate, 'days')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.mobile-period-chart {
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
.period-item {
|
||||||
|
position: relative;
|
||||||
|
background: white;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 20px;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(1)::before {
|
||||||
|
background: #ec4899;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(2)::before {
|
||||||
|
background: #f59e0b;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(3)::before {
|
||||||
|
background: #10b981;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning-menstrual {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
background: #dc2626;
|
||||||
|
color: white;
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 10px;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -6,7 +6,7 @@ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
|
|||||||
import { viteMockServe } from 'vite-plugin-mock'
|
import { viteMockServe } from 'vite-plugin-mock'
|
||||||
|
|
||||||
// const API_HOST = '14.103.235.151'
|
// const API_HOST = '14.103.235.151'
|
||||||
const API_HOST = '100.66.1.3'
|
const API_HOST = '127.0.0.1'
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
// https://vitejs.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
|||||||
Reference in New Issue
Block a user