feat: 心理健康报告
parent
19cba529b9
commit
5887cfaf5c
|
|
@ -16,7 +16,7 @@
|
|||
bg-color="transparent"
|
||||
>
|
||||
<template #title>
|
||||
<text class="text-[#1F2329] text-[36rpx] font-medium text-[#fff]">性格测评报告</text>
|
||||
<text class="text-[#1F2329] text-[36rpx] font-medium text-[#fff]">能力测评报告</text>
|
||||
</template>
|
||||
</Navbar>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
<template>
|
||||
<view class="rounded-full p-[14rpx] w-max bg-[#fff]">
|
||||
<view class="w-[162rpx] h-[162rpx] custom-style"></view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup></script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.custom-style {
|
||||
border: 10rpx dashed #00b281;
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.custom-style::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
blur: filter(10px);
|
||||
width: 162rpx;
|
||||
height: 162rpx;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<template>
|
||||
<view class="mt-[30rpx] bg-white rounded-[20rpx] p-[30rpx]">
|
||||
<TitleBar :title="title" />
|
||||
|
||||
<view v-for="(item, index) in items" :key="index" class="suggestion-item">
|
||||
<view class="text-[32rpx]">{{ item.title }}</view>
|
||||
<view class="text-[26rpx] font-400 mt-[10rpx]">{{ item.description }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import TitleBar from './TitleBar.vue'
|
||||
defineProps({
|
||||
items: {
|
||||
type: Array<{ title: string; description: string }>,
|
||||
default: () => [],
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.suggestion-item {
|
||||
&:not(:last-child) {
|
||||
margin-bottom: 50rpx;
|
||||
}
|
||||
|
||||
&:first-child {
|
||||
margin-top: 30rpx;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
<template>
|
||||
<view class="relative pt-[40rpx]">
|
||||
<Dashboard class="absolute right-[38rpx] top-0" :score="score" :color="rules[level].color" />
|
||||
<view class="bg-[#fff] rounded-[24rpx] p-[22rpx]">
|
||||
<view class="mt-[30rpx]">
|
||||
<text class="text-[48rpx] text-[#000] font-600">{{ tagName }}</text>
|
||||
<!-- <view class="flex items-center text-[#999] text-[24rpx] mt-[20rpx]">
|
||||
<view class="i-carbon-warning w-[24rpx] h-[24rpx]"></view>
|
||||
<text class="text-[#999] ml-[10rpx]">状态很好哦,继续保持,轻松迎接高考吧!</text>
|
||||
</view> -->
|
||||
<view class="mt-[58rpx]">
|
||||
<ScoreCard :current-position="level" :rules="rules" />
|
||||
</view>
|
||||
|
||||
<view class="relative mt-[68rpx] bg-[#F5FAFF]">
|
||||
<image
|
||||
src="https://api.static.ycymedu.com/src/images/home/test-icon.png"
|
||||
mode="scaleToFill"
|
||||
class="w-[180rpx] h-[52rpx] absolute top-[-9rpx] left-[20rpx]"
|
||||
/>
|
||||
<view class="px-[20rpx] pb-[20rpx] pt-[58rpx] text-[#333] text-[26rpx]">
|
||||
{{ description }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="text-[#999] text-[24rpx] mt-[10rpx]">
|
||||
{{ tip }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import Dashboard from '@/pages-evaluation-sub/evaluate/components/psychologicalReportItem/Dashboard.vue'
|
||||
import ScoreCard from './psychologicalReportItem/ScoreCard.vue'
|
||||
|
||||
defineProps({
|
||||
score: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
rules: {
|
||||
type: Array<{ label: string; range: string; color: string }>,
|
||||
default: () => [],
|
||||
},
|
||||
tip: {
|
||||
type: String,
|
||||
default: '结果只做参考,不能准确判断是否有焦虑症。',
|
||||
},
|
||||
level: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
tagName: {
|
||||
type: String,
|
||||
default: '',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
<template>
|
||||
<view class="flex flex-col bg-white rounded-[24rpx] p-[30rpx] gap-[40rpx]">
|
||||
<view class="flex flex-col gap-[12rpx]">
|
||||
<view class="flex items-center gap-[10rpx]">
|
||||
<image
|
||||
src="https://api.static.ycymedu.com/src/images/home/life-icon.png"
|
||||
mode="scaleToFill"
|
||||
class="w-[38rpx] h-[38rpx]"
|
||||
/>
|
||||
<text class="text-[32rpx] text-[#000]">生活建议</text>
|
||||
</view>
|
||||
<view class="text-[26rpx] text-[#666] font-400">
|
||||
保持规律作息,早睡早起,避免熬夜。 每天适当运动(如散步、跑步),保持精力充沛。
|
||||
避免过度放松,保持适度的学习节奏。
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex flex-col gap-[12rpx]">
|
||||
<view class="flex items-center gap-[10rpx]">
|
||||
<image
|
||||
src="https://api.static.ycymedu.com/src/images/home/diet-icon.png"
|
||||
mode="scaleToFill"
|
||||
class="w-[38rpx] h-[38rpx]"
|
||||
/>
|
||||
<text class="text-[32rpx] text-[#000]">饮食建议</text>
|
||||
</view>
|
||||
<view class="text-[26rpx] text-[#666] font-400">
|
||||
保持规律作息,早睡早起,避免熬夜。 每天适当运动(如散步、跑步),保持精力充沛。
|
||||
避免过度放松,保持适度的学习节奏。
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex flex-col gap-[12rpx]">
|
||||
<view class="flex items-center gap-[10rpx]">
|
||||
<image
|
||||
src="https://api.static.ycymedu.com/src/images/home/learn-icon.png"
|
||||
mode="scaleToFill"
|
||||
class="w-[38rpx] h-[38rpx]"
|
||||
/>
|
||||
<text class="text-[32rpx] text-[#000]">学习建议</text>
|
||||
</view>
|
||||
<view class="text-[26rpx] text-[#666] font-400">
|
||||
保持规律作息,早睡早起,避免熬夜。 每天适当运动(如散步、跑步),保持精力充沛。
|
||||
避免过度放松,保持适度的学习节奏。
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
|
@ -66,7 +66,7 @@ const updateChart = () => {
|
|||
containLabel: true,
|
||||
},
|
||||
legend: {
|
||||
data: ['我的数据', '平均数据'],
|
||||
data: ['我的数据', '平均水平'],
|
||||
right: 'auto',
|
||||
left: 'center',
|
||||
top: 0,
|
||||
|
|
@ -80,7 +80,7 @@ const updateChart = () => {
|
|||
{
|
||||
type: 'category',
|
||||
data: (props.echartData[1] as { name: string[] })?.name.map((item) =>
|
||||
item.replace('智能', ''),
|
||||
item.replace('智能', '').replace(/(.{2})/g, '$1\n'),
|
||||
),
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
|
|
@ -91,14 +91,6 @@ const updateChart = () => {
|
|||
color: '#666',
|
||||
fontSize: 12,
|
||||
interval: 0,
|
||||
rotate: 45,
|
||||
formatter: function (value) {
|
||||
// 处理长文本
|
||||
if (value.length > 4) {
|
||||
return value.replace('智能', '')
|
||||
}
|
||||
return value
|
||||
},
|
||||
},
|
||||
axisTick: {
|
||||
show: false,
|
||||
|
|
@ -144,7 +136,7 @@ const updateChart = () => {
|
|||
data: (props.echartData[1] as { value: number[] })?.value,
|
||||
},
|
||||
{
|
||||
name: '平均数据',
|
||||
name: '平均水平',
|
||||
type: 'line',
|
||||
smooth: true,
|
||||
symbol: 'circle',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,58 @@
|
|||
<template>
|
||||
<view
|
||||
class="rounded-full w-[162rpx] h-[162rpx] bg-[#fff] dashboard-wrapper flex items-center justify-center"
|
||||
:style="{ '--current-color': color }"
|
||||
>
|
||||
<view class="w-[139rpx] h-[139rpx] custom-style flex items-center justify-center">
|
||||
<view
|
||||
v-for="i in 39"
|
||||
:key="i"
|
||||
class="tick"
|
||||
:style="{
|
||||
transform: `rotate(${i * 8 - 90}deg)`,
|
||||
opacity: `${1 - Math.abs(i * 8 - 90) / 90}`,
|
||||
}"
|
||||
></view>
|
||||
<view class="font-500 text-color">
|
||||
<text :class="`${score > 99 ? 'text-[50rpx]' : 'text-[62rpx]'}`">{{ score }}</text>
|
||||
<text class="text-[28rpx]">分</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
defineProps({
|
||||
color: {
|
||||
type: String,
|
||||
default: '#00b281',
|
||||
},
|
||||
score: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.custom-style {
|
||||
border-radius: 50%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.text-color {
|
||||
color: var(--current-color);
|
||||
container-type: inline-size;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.tick {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 50%;
|
||||
width: 4rpx;
|
||||
height: 10rpx;
|
||||
background-color: var(--current-color);
|
||||
transform-origin: 0 67rpx;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<template>
|
||||
<view class="bg-white mx-[24rpx] rounded-[20rpx] pb-[20rpx]">
|
||||
<view class="px-[24rpx] h-[368rpx] z-1">
|
||||
<LEchart ref="echart" :customStyle="`z-index:1;`"></LEchart>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import LEchart from '@/pages-evaluation-sub/uni_modules/lime-echart/components/l-echart/l-echart.vue'
|
||||
const echarts = require('../../../uni_modules/lime-echart/static/echarts.min')
|
||||
const echart = ref(null)
|
||||
</script>
|
||||
|
||||
<script lang="scss" scoped></script>
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
<template>
|
||||
<view
|
||||
class="grid grid-cols-4 items-end gap-[6rpx] relative"
|
||||
:style="`grid-template-columns: repeat(${rules.length},minmax(0,1fr))`"
|
||||
>
|
||||
<view v-for="(item, index) in rules" :key="index" class="">
|
||||
<view
|
||||
:class="['common-rectangle']"
|
||||
:style="`height: ${24 + index * 10}rpx;background-color:${item.color}`"
|
||||
></view>
|
||||
<view
|
||||
class="flex flex-col text-[24rpx] text-center"
|
||||
:style="{ color: currentPosition === index ? item.color : '#999' }"
|
||||
>
|
||||
<text :class="currentPosition === index ? 'font-500' : ''">{{ item.label }}</text>
|
||||
<view v-html="item.range" class="whitespace-nowrap"></view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view
|
||||
:style="{
|
||||
left: `${(currentPosition + 1 / 2) * (100 / rules.length)}%`,
|
||||
top: `${currentPosition * -8 - 10}rpx`,
|
||||
}"
|
||||
class="current-flag-wrapper"
|
||||
>
|
||||
<view class="current-flag">
|
||||
<view class="flag-text">当前</view>
|
||||
<view class="flag-triangle"></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
defineProps<{
|
||||
currentPosition: number // 0-3 分别对应四个矩形的位置
|
||||
rules: {
|
||||
label: string
|
||||
range: string
|
||||
color: string
|
||||
}[]
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.common-rectangle {
|
||||
width: 100%;
|
||||
position: relative;
|
||||
border-radius: 8rpx;
|
||||
clip-path: polygon(100% 0, 100% 0, 100% 100%, 0 100%, 0 10rpx);
|
||||
margin-bottom: 6rpx;
|
||||
}
|
||||
|
||||
.current-flag-wrapper {
|
||||
position: absolute;
|
||||
margin-bottom: 8rpx;
|
||||
transition: left 0.3s ease;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.current-flag {
|
||||
position: relative;
|
||||
width: 82rpx;
|
||||
height: 37rpx;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
border-radius: 20rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.flag-text {
|
||||
color: #fff;
|
||||
font-size: 22rpx;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
line-height: 2;
|
||||
}
|
||||
|
||||
.flag-triangle {
|
||||
position: absolute;
|
||||
bottom: -8rpx;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-left: 8rpx solid transparent;
|
||||
border-right: 8rpx solid transparent;
|
||||
border-top: 8rpx solid rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
<route lang="json5" type="page">
|
||||
{
|
||||
style: {
|
||||
navigationStyle: 'custom',
|
||||
},
|
||||
}
|
||||
</route>
|
||||
|
||||
<template>
|
||||
<view :scroll-y="true" class="flex flex-col h-screen relative custom-bg">
|
||||
<Navbar
|
||||
safeAreaInsetTop
|
||||
:bordered="false"
|
||||
leftArrow
|
||||
@clickLeft="handleBack"
|
||||
bg-color="transparent"
|
||||
>
|
||||
<template #title>
|
||||
<text class="text-[#1F2329] text-[36rpx] font-medium text-[#fff]">MHT心理健康自评</text>
|
||||
</template>
|
||||
</Navbar>
|
||||
|
||||
<view class="flex-1 overflow-auto pb-safe relative mx-[24rpx]">
|
||||
<!-- 顶部卡片 -->
|
||||
<view class="mt-[60rpx]">
|
||||
<StatusCard />
|
||||
</view>
|
||||
<view class="mt-[30rpx]"></view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Navbar from '@/pages-evaluation-sub/components/navbar/Navbar.vue'
|
||||
import StatusCard from '../components/StatusCard.vue'
|
||||
|
||||
import { getCustomScaleExplains } from '@/service/index/api'
|
||||
|
||||
const pageType = ref(0)
|
||||
const pageId = ref(0)
|
||||
|
||||
const handleBack = () => {
|
||||
uni.navigateBack()
|
||||
}
|
||||
|
||||
const studyRecord = ref({
|
||||
description: '',
|
||||
title: '',
|
||||
linChart: [],
|
||||
reportItems: [],
|
||||
hTag: '',
|
||||
})
|
||||
|
||||
onLoad((options) => {
|
||||
pageType.value = +options.type
|
||||
pageId.value = options.id
|
||||
|
||||
getCustomScaleExplains({ CustomScaleId: pageId.value }).then((resp) => {
|
||||
if (resp.code === 200) {
|
||||
studyRecord.value = resp.result as {
|
||||
description: string
|
||||
title: string
|
||||
linChart: any[]
|
||||
reportItems: any[]
|
||||
hTag: string
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.custom-bg {
|
||||
background: linear-gradient(184deg, #0d79fc 0%, #2186fc 100%);
|
||||
}
|
||||
:deep(.icon-class) {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.custom-border {
|
||||
width: 162rpx;
|
||||
height: 162rpx;
|
||||
border-radius: 50%;
|
||||
border: 6rpx dashed;
|
||||
border-color: #05d69c transparent transparent transparent;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
</route>
|
||||
|
||||
<template>
|
||||
<scroll-view :scroll-y="true" class="flex flex-col h-screen relative custom-bg">
|
||||
<view :scroll-y="true" class="flex flex-col h-screen relative custom-bg">
|
||||
<Navbar
|
||||
safeAreaInsetTop
|
||||
:bordered="false"
|
||||
|
|
@ -20,22 +20,58 @@
|
|||
</template>
|
||||
</Navbar>
|
||||
|
||||
<view class="flex-1 overflow-auto pb-[30rpx] relative">
|
||||
<view class="flex-1 overflow-auto pb-safe relative mx-[24rpx]">
|
||||
<!-- 顶部卡片 -->
|
||||
<view class="h-[772rpx] relative">
|
||||
<Dashboard />
|
||||
<view class="mt-[60rpx]">
|
||||
<StatusCard
|
||||
:score="score"
|
||||
:rules="anxietyRules"
|
||||
tip="结果只做参考,不能准确判断是否有焦虑症。"
|
||||
:level="level"
|
||||
:description="studyRecord.description"
|
||||
:tagName="studyRecord.tagName"
|
||||
/>
|
||||
</view>
|
||||
<view class="mt-[30rpx]">
|
||||
<SuggestionCard />
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Navbar from '@/pages-evaluation-sub/components/navbar/Navbar.vue'
|
||||
import Dashboard from '@/pages-evaluation-sub/evaluate/components/Dashboard.vue'
|
||||
import StatusCard from '../components/StatusCard.vue'
|
||||
import SuggestionCard from '../components/SuggestionCard.vue'
|
||||
|
||||
import { getAbilityDimension } from '@/service/index/api'
|
||||
import { getCustomScaleExplains } from '@/service/index/api'
|
||||
|
||||
const pageType = ref(0)
|
||||
const pageId = ref(0)
|
||||
const anxietyRules = [
|
||||
{
|
||||
label: '正常范围',
|
||||
range: '<50分',
|
||||
color: '#00B281',
|
||||
},
|
||||
{
|
||||
label: '轻度焦虑',
|
||||
range: '50-59分',
|
||||
color: '#F8B801',
|
||||
},
|
||||
{
|
||||
label: '中度焦虑',
|
||||
range: '60-69分',
|
||||
color: '#F79C33',
|
||||
},
|
||||
{
|
||||
label: '重度焦虑',
|
||||
range: '≥70分',
|
||||
color: '#F5663E',
|
||||
},
|
||||
]
|
||||
|
||||
const score = ref(0)
|
||||
const level = ref(0)
|
||||
|
||||
const handleBack = () => {
|
||||
uni.navigateBack()
|
||||
|
|
@ -44,24 +80,37 @@ const handleBack = () => {
|
|||
const studyRecord = ref({
|
||||
description: '',
|
||||
title: '',
|
||||
linChart: [],
|
||||
reportItems: [],
|
||||
hTag: '',
|
||||
result: '',
|
||||
tagName: '',
|
||||
})
|
||||
|
||||
const calcLevel = (val: string) => {
|
||||
let _s = JSON.parse(val)
|
||||
if (_s[0].Total >= 70) {
|
||||
return 3
|
||||
} else if (_s[0].Total >= 60) {
|
||||
return 2
|
||||
} else if (_s[0].Total >= 50) {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
onLoad((options) => {
|
||||
pageType.value = +options.type
|
||||
pageId.value = options.id
|
||||
|
||||
getAbilityDimension({ ScaleId: pageId.value }).then((resp) => {
|
||||
getCustomScaleExplains({ CustomScaleId: pageId.value }).then((resp) => {
|
||||
if (resp.code === 200) {
|
||||
studyRecord.value = resp.result as {
|
||||
description: string
|
||||
title: string
|
||||
linChart: any[]
|
||||
reportItems: any[]
|
||||
hTag: string
|
||||
result: string
|
||||
tagName: string
|
||||
}
|
||||
level.value = calcLevel(studyRecord.value.result)
|
||||
score.value = JSON.parse(studyRecord.value.result)[0].Total
|
||||
}
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -0,0 +1,138 @@
|
|||
<route lang="json5" type="page">
|
||||
{
|
||||
style: {
|
||||
navigationStyle: 'custom',
|
||||
},
|
||||
}
|
||||
</route>
|
||||
|
||||
<template>
|
||||
<view :scroll-y="true" class="flex flex-col h-screen relative custom-bg">
|
||||
<Navbar
|
||||
safeAreaInsetTop
|
||||
:bordered="false"
|
||||
leftArrow
|
||||
@clickLeft="handleBack"
|
||||
bg-color="transparent"
|
||||
>
|
||||
<template #title>
|
||||
<text class="text-[#1F2329] text-[36rpx] font-medium text-[#fff]">SDS抑郁测评报告</text>
|
||||
</template>
|
||||
</Navbar>
|
||||
|
||||
<view class="flex-1 overflow-auto pb-safe relative mx-[24rpx]">
|
||||
<!-- 顶部卡片 -->
|
||||
<view class="mt-[60rpx]">
|
||||
<StatusCard
|
||||
:score="score"
|
||||
:rules="depressionRules"
|
||||
tip="结果只做参考,不能准确判断是否有抑郁症。"
|
||||
:level="level"
|
||||
:description="studyRecord.description"
|
||||
:tagName="studyRecord.tagName"
|
||||
/>
|
||||
</view>
|
||||
<view class="mt-[30rpx]">
|
||||
<SuggestionCard />
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Navbar from '@/pages-evaluation-sub/components/navbar/Navbar.vue'
|
||||
import StatusCard from '../components/StatusCard.vue'
|
||||
import SuggestionCard from '../components/SuggestionCard.vue'
|
||||
|
||||
import { getCustomScaleExplains } from '@/service/index/api'
|
||||
|
||||
const pageType = ref(0)
|
||||
const pageId = ref(0)
|
||||
|
||||
// 示例规则2:抑郁评估
|
||||
const depressionRules = [
|
||||
{
|
||||
label: '正常范围',
|
||||
range: '<52分',
|
||||
color: '#00B281',
|
||||
},
|
||||
{
|
||||
label: '轻度抑郁',
|
||||
range: '53-61分',
|
||||
color: '#F8B801',
|
||||
},
|
||||
{
|
||||
label: '中度抑郁',
|
||||
range: '62-71分',
|
||||
color: '#F79C33',
|
||||
},
|
||||
{
|
||||
label: '重度抑郁',
|
||||
range: '≥72分',
|
||||
color: '#F5663E',
|
||||
},
|
||||
]
|
||||
|
||||
const handleBack = () => {
|
||||
uni.navigateBack()
|
||||
}
|
||||
|
||||
const studyRecord = ref({
|
||||
description: '',
|
||||
title: '',
|
||||
result: '',
|
||||
tagName: '',
|
||||
total: '',
|
||||
})
|
||||
|
||||
const calcLevel = (val: string) => {
|
||||
let _s = +val
|
||||
if (_s >= 72) {
|
||||
return 3
|
||||
} else if (_s >= 62) {
|
||||
return 2
|
||||
} else if (_s >= 53) {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
const score = ref(0)
|
||||
const level = ref(0)
|
||||
|
||||
onLoad((options) => {
|
||||
pageType.value = +options.type
|
||||
pageId.value = options.id
|
||||
|
||||
getCustomScaleExplains({ CustomScaleId: pageId.value }).then((resp) => {
|
||||
if (resp.code === 200) {
|
||||
studyRecord.value = resp.result as {
|
||||
description: string
|
||||
title: string
|
||||
result: string
|
||||
tagName: string
|
||||
total: string
|
||||
}
|
||||
level.value = calcLevel(studyRecord.value.total)
|
||||
score.value = JSON.parse(studyRecord.value.total)
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.custom-bg {
|
||||
background: linear-gradient(184deg, #0d79fc 0%, #2186fc 100%);
|
||||
}
|
||||
:deep(.icon-class) {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.custom-border {
|
||||
width: 162rpx;
|
||||
height: 162rpx;
|
||||
border-radius: 50%;
|
||||
border: 6rpx dashed;
|
||||
border-color: #05d69c transparent transparent transparent;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
<route lang="json5" type="page">
|
||||
{
|
||||
style: {
|
||||
navigationStyle: 'custom',
|
||||
},
|
||||
}
|
||||
</route>
|
||||
|
||||
<template>
|
||||
<view :scroll-y="true" class="flex flex-col h-screen relative custom-bg">
|
||||
<Navbar
|
||||
safeAreaInsetTop
|
||||
:bordered="false"
|
||||
leftArrow
|
||||
@clickLeft="handleBack"
|
||||
bg-color="transparent"
|
||||
>
|
||||
<template #title>
|
||||
<text class="text-[#1F2329] text-[36rpx] font-medium text-[#fff]">学习技能报告</text>
|
||||
</template>
|
||||
</Navbar>
|
||||
|
||||
<view class="flex-1 overflow-auto pb-safe relative mx-[24rpx]">
|
||||
<!-- 顶部卡片 -->
|
||||
<view class="mt-[60rpx]">
|
||||
<StatusCard
|
||||
:score="score"
|
||||
:rules="anxietyRules"
|
||||
tip="测评结果只做参考。"
|
||||
:level="level"
|
||||
:description="studyRecord.description"
|
||||
:tagName="studyRecord.tagName"
|
||||
/>
|
||||
</view>
|
||||
<view>
|
||||
<LearnSkillSuggestion
|
||||
v-for="(item, index) in suggestions"
|
||||
:key="index"
|
||||
:items="item.items"
|
||||
:title="item.title"
|
||||
></LearnSkillSuggestion>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Navbar from '@/pages-evaluation-sub/components/navbar/Navbar.vue'
|
||||
import StatusCard from '../components/StatusCard.vue'
|
||||
import LearnSkillSuggestion from '../components/LearnSkillSuggestion.vue'
|
||||
|
||||
import { getCustomScaleExplains } from '@/service/index/api'
|
||||
|
||||
const pageType = ref(0)
|
||||
const pageId = ref(0)
|
||||
const anxietyRules = [
|
||||
{
|
||||
label: '很差',
|
||||
range: '≤80分',
|
||||
color: '#F5663E',
|
||||
},
|
||||
{
|
||||
label: '较差',
|
||||
range: '81-104分',
|
||||
color: '#F8B801',
|
||||
},
|
||||
{
|
||||
label: '一般',
|
||||
range: '105-136分',
|
||||
color: '#F3A953',
|
||||
},
|
||||
{
|
||||
label: '较好',
|
||||
range: '137-160分',
|
||||
color: '#55E5C5',
|
||||
},
|
||||
{
|
||||
label: '优秀',
|
||||
range: '≥161分',
|
||||
color: '#00B281',
|
||||
},
|
||||
]
|
||||
|
||||
const score = ref(0)
|
||||
const level = ref(0)
|
||||
|
||||
const handleBack = () => {
|
||||
uni.navigateBack()
|
||||
}
|
||||
|
||||
const studyRecord = ref({
|
||||
description: '',
|
||||
title: '',
|
||||
result: '',
|
||||
tagName: '',
|
||||
suggestions: '',
|
||||
})
|
||||
|
||||
const calcLevel = (val: string) => {
|
||||
let _s = JSON.parse(val)
|
||||
if (_s[0].Total >= 161) {
|
||||
return 4
|
||||
} else if (_s[0].Total >= 137) {
|
||||
return 3
|
||||
} else if (_s[0].Total >= 105) {
|
||||
return 2
|
||||
} else if (_s[0].Total >= 81) {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
const suggestions = ref([])
|
||||
|
||||
onLoad((options) => {
|
||||
pageType.value = +options.type
|
||||
pageId.value = options.id
|
||||
|
||||
getCustomScaleExplains({ CustomScaleId: pageId.value }).then((resp) => {
|
||||
if (resp.code === 200) {
|
||||
studyRecord.value = resp.result as {
|
||||
description: string
|
||||
title: string
|
||||
result: string
|
||||
tagName: string
|
||||
suggestions: string
|
||||
}
|
||||
level.value = calcLevel(studyRecord.value.result)
|
||||
score.value = JSON.parse(studyRecord.value.result)[0].Total
|
||||
suggestions.value = JSON.parse(studyRecord.value.suggestions).succestions
|
||||
console.log(suggestions)
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.custom-bg {
|
||||
background: linear-gradient(184deg, #0d79fc 0%, #2186fc 100%);
|
||||
}
|
||||
:deep(.icon-class) {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.custom-border {
|
||||
width: 162rpx;
|
||||
height: 162rpx;
|
||||
border-radius: 50%;
|
||||
border: 6rpx dashed;
|
||||
border-color: #05d69c transparent transparent transparent;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
<route lang="json5" type="page">
|
||||
{
|
||||
style: {
|
||||
navigationStyle: 'custom',
|
||||
},
|
||||
}
|
||||
</route>
|
||||
|
||||
<template>
|
||||
<view :scroll-y="true" class="flex flex-col h-screen relative custom-bg">
|
||||
<Navbar
|
||||
safeAreaInsetTop
|
||||
:bordered="false"
|
||||
leftArrow
|
||||
@clickLeft="handleBack"
|
||||
bg-color="transparent"
|
||||
>
|
||||
<template #title>
|
||||
<text class="text-[#1F2329] text-[36rpx] font-medium text-[#fff]">考试焦虑测评报告</text>
|
||||
</template>
|
||||
</Navbar>
|
||||
|
||||
<view class="flex-1 overflow-auto pb-safe relative mx-[24rpx]">
|
||||
<!-- 顶部卡片 -->
|
||||
<view class="mt-[60rpx]">
|
||||
<StatusCard
|
||||
:score="score"
|
||||
:rules="anxietyRules"
|
||||
tip="结果只做参考,不能准确判断是否有焦虑症。"
|
||||
:level="level"
|
||||
:description="studyRecord.description"
|
||||
:tagName="studyRecord.tagName"
|
||||
/>
|
||||
</view>
|
||||
<view class="mt-[30rpx]"></view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import Navbar from '@/pages-evaluation-sub/components/navbar/Navbar.vue'
|
||||
import StatusCard from '../components/StatusCard.vue'
|
||||
|
||||
import { getCustomScaleExplains } from '@/service/index/api'
|
||||
|
||||
const pageType = ref(0)
|
||||
const pageId = ref(0)
|
||||
const anxietyRules = [
|
||||
{
|
||||
label: '正常范围',
|
||||
range: '<50分',
|
||||
color: '#00B281',
|
||||
itemColorName: 'green',
|
||||
},
|
||||
{
|
||||
label: '轻度焦虑',
|
||||
range: '50-59分',
|
||||
color: '#F8B801',
|
||||
itemColorName: 'yellow',
|
||||
},
|
||||
{
|
||||
label: '中度焦虑',
|
||||
range: '60-69分',
|
||||
color: '#F79C33',
|
||||
itemColorName: 'origin',
|
||||
},
|
||||
{
|
||||
label: '重度焦虑',
|
||||
range: '≥70分',
|
||||
color: '#F5663E',
|
||||
itemColorName: 'red',
|
||||
},
|
||||
]
|
||||
|
||||
const score = ref(0)
|
||||
const level = ref(0)
|
||||
|
||||
const handleBack = () => {
|
||||
uni.navigateBack()
|
||||
}
|
||||
|
||||
const studyRecord = ref({
|
||||
description: '',
|
||||
title: '',
|
||||
result: '',
|
||||
tagName: '',
|
||||
})
|
||||
|
||||
const calcLevel = (val: string) => {
|
||||
let _s = JSON.parse(val)
|
||||
if (_s[0].Total >= 70) {
|
||||
return 3
|
||||
} else if (_s[0].Total >= 60) {
|
||||
return 2
|
||||
} else if (_s[0].Total >= 50) {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
onLoad((options) => {
|
||||
pageType.value = +options.type
|
||||
pageId.value = options.id
|
||||
|
||||
getCustomScaleExplains({ CustomScaleId: pageId.value }).then((resp) => {
|
||||
if (resp.code === 200) {
|
||||
studyRecord.value = resp.result as {
|
||||
description: string
|
||||
title: string
|
||||
result: string
|
||||
tagName: string
|
||||
}
|
||||
level.value = calcLevel(studyRecord.value.result)
|
||||
score.value = JSON.parse(studyRecord.value.result)[0].Total
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.custom-bg {
|
||||
background: linear-gradient(184deg, #0d79fc 0%, #2186fc 100%);
|
||||
}
|
||||
:deep(.icon-class) {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.custom-border {
|
||||
width: 162rpx;
|
||||
height: 162rpx;
|
||||
border-radius: 50%;
|
||||
border: 6rpx dashed;
|
||||
border-color: #05d69c transparent transparent transparent;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
v-for="item in menus"
|
||||
:key="item.key"
|
||||
:class="[
|
||||
'flex items-center view-block pl-[32rpx] h-[96rpx] text-[28rpx] font-semibold',
|
||||
'flex items-center view-block pl-[32rpx] min-h-[96rpx] h-[96rpx] text-[28rpx] text-[#666] font-semibold',
|
||||
currentMenuObj?.key === item.key ? 'active' : '',
|
||||
]"
|
||||
@click="changeMenu(item)"
|
||||
|
|
|
|||
|
|
@ -37,19 +37,19 @@
|
|||
class="h-full"
|
||||
:type="1050"
|
||||
:keyword="searchValue"
|
||||
v-if="currentTab === 0"
|
||||
v-show="currentTab === 0"
|
||||
></MajorList>
|
||||
<MajorList
|
||||
class="h-full"
|
||||
:type="1070"
|
||||
:keyword="searchValue"
|
||||
v-if="currentTab === 1"
|
||||
v-show="currentTab === 1"
|
||||
></MajorList>
|
||||
<MajorList
|
||||
class="h-full"
|
||||
:type="1060"
|
||||
:keyword="searchValue"
|
||||
v-if="currentTab === 2"
|
||||
v-show="currentTab === 2"
|
||||
></MajorList>
|
||||
</view>
|
||||
</view>
|
||||
|
|
|
|||
|
|
@ -59,6 +59,19 @@ const toDetail = (item: any) => {
|
|||
url = `/pages-evaluation-sub/evaluate/academicReport/opinionAboutReport?id=${item.reportsId}&type=${item.type}`
|
||||
} else if (item.type === 6) {
|
||||
url = `/pages-evaluation-sub/evaluate/psychologicalReport/sasReport?id=${item.reportsId}&type=${item.type}`
|
||||
} else if (item.type === 7) {
|
||||
url = `/pages-evaluation-sub/evaluate/psychologicalReport/sdsReport?id=${item.reportsId}&type=${item.type}`
|
||||
} else if (item.type === 9) {
|
||||
// url = `/pages-evaluation-sub/evaluate/psychologicalReport/mhtReport?id=${item.reportsId}&type=${item.type}`
|
||||
uni.showToast({
|
||||
title: '开发中....',
|
||||
icon: 'none',
|
||||
})
|
||||
return
|
||||
} else if (item.type === 4) {
|
||||
url = `/pages-evaluation-sub/evaluate/studyReport/LearnStudyReport?id=${item.reportsId}&type=${item.type}`
|
||||
} else if (item.type === 5) {
|
||||
url = `/pages-evaluation-sub/evaluate/studyReport/LearnSkillReport?id=${item.reportsId}&type=${item.type}`
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '开发中....',
|
||||
|
|
|
|||
|
|
@ -371,12 +371,40 @@
|
|||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "evaluate/psychologicalReport/mhtReport",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "evaluate/psychologicalReport/sasReport",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "evaluate/psychologicalReport/sdsReport",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "evaluate/studyReport/LearnSkillReport",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "evaluate/studyReport/LearnStudyReport",
|
||||
"type": "page",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -449,3 +449,7 @@ export const downloadPDF = (params: { id: number; location: string }) => {
|
|||
export const getBatchDynamicData = (params: { LocationCode: string; Course: string }) => {
|
||||
return http.get('/api/busBatchBase/batch', params)
|
||||
}
|
||||
|
||||
export const getCustomScaleExplains = (params: { CustomScaleId: number }) => {
|
||||
return http.get('/api/busScale/GetCustomScaleExplains', params)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,11 @@ interface NavigateToOptions {
|
|||
"/pages-evaluation-sub/evaluate/academicReport/characterReport" |
|
||||
"/pages-evaluation-sub/evaluate/academicReport/interestReport" |
|
||||
"/pages-evaluation-sub/evaluate/academicReport/opinionAboutReport" |
|
||||
"/pages-evaluation-sub/evaluate/psychologicalReport/mhtReport" |
|
||||
"/pages-evaluation-sub/evaluate/psychologicalReport/sasReport" |
|
||||
"/pages-evaluation-sub/evaluate/psychologicalReport/sdsReport" |
|
||||
"/pages-evaluation-sub/evaluate/studyReport/LearnSkillReport" |
|
||||
"/pages-evaluation-sub/evaluate/studyReport/LearnStudyReport" |
|
||||
"/aiService-sub/index/index";
|
||||
}
|
||||
interface RedirectToOptions extends NavigateToOptions {}
|
||||
|
|
|
|||
Loading…
Reference in New Issue