refactor: 一点优化

This commit is contained in:
张哲铜 2025-11-17 22:54:07 +08:00
parent 65e2d19089
commit a57ed52643
7 changed files with 79 additions and 62 deletions

25
project.config.json Normal file
View File

@ -0,0 +1,25 @@
{
"setting": {
"es6": true,
"postcss": true,
"minified": true,
"uglifyFileName": false,
"enhance": true,
"packNpmRelationList": [],
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"useCompilerPlugins": false,
"minifyWXML": true
},
"compileType": "miniprogram",
"simulatorPluginLibVersion": {},
"packOptions": {
"ignore": [],
"include": []
},
"appid": "wxc5e2d4198a20dfdf",
"editorSetting": {}
}

View File

@ -0,0 +1,14 @@
{
"libVersion": "3.11.2",
"projectname": "xlx_teacher_app",
"setting": {
"urlCheck": true,
"coverView": true,
"lazyloadPlaceholderEnable": false,
"skylineRenderEnable": false,
"preloadBackgroundData": false,
"autoAudits": false,
"showShadowRootInWxmlPanel": true,
"compileHotReLoad": true
}
}

View File

@ -62,13 +62,6 @@ const compareClassName = computed(() => {
return cls?.label || '选择对比班级'
})
// grade_key
const compareClassGradeKey = computed(() => {
if (!compareClassId.value)
return null
return homeStore.classGradeMap.get(compareClassId.value) || null
})
// 使 TanStack Query
const {
data: trendData,
@ -81,7 +74,6 @@ const {
homeStore.selectedClassId,
homeStore.selectedGradeKey,
compareClassId,
compareClassGradeKey,
props.selectedSubjectId,
topN,
],
@ -101,8 +93,7 @@ const {
enabled: computed(() =>
!!homeStore.selectedClassId
&& !!homeStore.selectedGradeKey
&& !!compareClassId.value
&& !!compareClassGradeKey.value,
&& !!compareClassId.value,
),
staleTime: 30000, // 30
})

View File

@ -88,10 +88,6 @@ function navigateToQuality(subjectId: number) {
<view class="mb-4">
<view class="mb-2 flex items-center justify-between">
<text class="text-lg font-semibold">{{ task.exam_name }}</text>
<view class="flex items-center">
<view class="i-mingcute:calendar-line mr-1 text-xs text-slate-500" />
<text class="text-xs text-gray-500">{{ formatDate(task.exam_date) }}</text>
</view>
</view>
<!-- 第二行类型 + ID -->
@ -100,6 +96,10 @@ function navigateToQuality(subjectId: number) {
<text class="text-xs text-blue-600"> {{ task.exam_type }}</text>
</view>
<text class="text-xs text-green-600">考试ID: {{ task.exam_id }}</text>
<view class="flex items-center">
<view class="i-mingcute:calendar-line mr-1 text-xs text-slate-500" />
<text class="text-xs text-gray-500">{{ formatDate(task.exam_date) }}</text>
</view>
</view>
</view>

View File

@ -231,7 +231,7 @@ function handleExamChange() {
uni.showActionSheet({
itemList: examNames,
success: (res) => {
const selectedOption = homeStore.examOptions[res.tapIndex]
const selectedOption = homeStore.examOptions[res.tapIndex].filter(item => item.)
homeStore.selectedExamId = selectedOption.value as number
//
fetchExamStats()
@ -449,7 +449,7 @@ onMounted(async () => {
<view class="i-mingcute:group-line mr-1 text-base text-blue-500" />
<text class="text-xs text-slate-600">班级/年级人数</text>
</view>
<text class="text-lg text-slate-800 font-bold">{{ statsData.classCount }}/{{ statsData.totalCount }}</text>
<text class="center text-lg text-slate-800 font-bold">{{ statsData.classCount }}/{{ statsData.totalCount }}</text>
</view>
<!-- 均分排名 -->
@ -458,7 +458,7 @@ onMounted(async () => {
<view class="i-mingcute:chart-bar-line mr-1 text-base text-blue-600" />
<text class="text-xs text-slate-600">均分排名</text>
</view>
<text class="text-lg text-slate-800 font-bold">{{ statsData.ranking }}/{{ statsData.totalRanking }}</text>
<text class="center text-lg text-slate-800 font-bold">{{ statsData.ranking }}/{{ statsData.totalRanking }}</text>
</view>
<!-- 年级前50名 -->
@ -467,7 +467,7 @@ onMounted(async () => {
<view class="i-mingcute:trophy-line mr-1 text-base text-cyan-500" />
<text class="text-xs text-slate-600">年级前50名</text>
</view>
<text class="text-lg text-slate-800 font-bold">{{ statsData.top50Count }}/{{ statsData.top50Total }}</text>
<text class="center text-lg text-slate-800 font-bold">{{ statsData.top50Count }}/{{ statsData.top50Total }}</text>
</view>
<!-- 最高分/最低分 -->
@ -476,9 +476,12 @@ onMounted(async () => {
<view class="i-carbon:chart-line mr-1 text-base text-cyan-600" />
<text class="text-xs text-slate-600">最高分/最低分</text>
</view>
<text class="text-lg text-slate-800 font-bold">{{ statsData.highestScore }}/{{ statsData.lowestScore }}</text>
<text class="center text-lg text-slate-800 font-bold">{{ statsData.highestScore }}/{{ statsData.lowestScore }}</text>
</view>
</view>
<!-- 统计数据卡片 -->
<view class="grid grid-cols-3 mb-2 gap-2">
<!-- 优秀率 -->
<view class="border border-sky-100 rounded-xl from-white to-sky-50 bg-gradient-to-br p-4 shadow-sky-50 shadow-sm">
<view class="mb-1 flex items-center">
@ -496,16 +499,16 @@ onMounted(async () => {
</view>
<text class="text-lg text-slate-800 font-bold">{{ statsData.goodRate }}%</text>
</view>
</view>
<!-- 及格率 -->
<view class="mb-4 border border-blue-100 rounded-xl from-white to-blue-50 bg-gradient-to-br p-4 shadow-blue-50 shadow-sm">
<view class="border border-blue-100 rounded-xl from-white to-blue-50 bg-gradient-to-br p-4 shadow-blue-50 shadow-sm">
<view class="mb-1 flex items-center">
<view class="i-carbon:checkmark mr-1 text-base text-blue-500" />
<text class="text-xs text-slate-600">及格率</text>
</view>
<text class="text-lg text-slate-800 font-bold">{{ statsData.passRate }}%</text>
</view>
</view>
<!-- 底部操作按钮 -->
<view class="flex gap-3 pb-4">
@ -623,11 +626,11 @@ onMounted(async () => {
v-for="classItem in homeStore.classOptions"
:key="classItem.value"
class="flex items-center justify-between rounded-xl bg-gray-50 p-3 active:bg-blue-50"
@tap="homeStore.selectedClassId = classItem.value"
@tap="homeStore.selectedClassId = classItem.value; homeStore.selectedGradeKey = classItem.gradeKey"
>
<text class="text-base">{{ classItem.label }}</text>
<view
v-if="homeStore.selectedClassId === classItem.value"
v-if="homeStore.selectedClassId === classItem.value && homeStore.selectedGradeKey === classItem.gradeKey"
class="i-mingcute:check-line text-lg text-blue-500"
/>
</view>

View File

@ -166,7 +166,7 @@ function getIconColorClass(index: number) {
<!-- 角色信息 -->
<view class="rounded-full bg-white/20 px-3 py-1 backdrop-blur-sm">
<text class="text-sm text-white/90">角色{{ getRoleText }}</text>
<text class="text-sm text-white/90">账号信息{{ userInfo.phone || "17622222222" }}</text>
</view>
</view>
</view>
@ -174,20 +174,8 @@ function getIconColorClass(index: number) {
<!-- 主要内容区域 -->
<view class="relative z-10 mx-2 min-h-[calc(100vh-200px)] rounded-t-3xl bg-white px-2 pt-4">
<!-- 账号和学校信息卡片 -->
<view class="grid grid-cols-2 mx-2 mb-4 gap-3">
<!-- 账号信息 -->
<view class="border border-blue-100 rounded-xl from-white to-blue-50 bg-gradient-to-br p-4 shadow-blue-50 shadow-sm">
<view class="mb-1 flex items-center">
<view class="i-mingcute:user-line mr-1 text-base text-blue-500" />
<text class="text-xs text-slate-600">账号信息</text>
</view>
<text class="text-base text-slate-800 font-bold">
{{ userInfo.phone || "17622222222" }}
</text>
</view>
<!-- 所属学校 -->
<view class="border border-cyan-100 rounded-xl from-white to-cyan-50 bg-gradient-to-br p-4 shadow-cyan-50 shadow-sm">
<view class="mx-2 mb-4 border border-cyan-100 rounded-xl from-white to-cyan-50 bg-gradient-to-br p-4 shadow-cyan-50 shadow-sm">
<view class="mb-1 flex items-center">
<view class="i-mingcute:school-line mr-1 text-base text-cyan-500" />
<text class="text-xs text-slate-600">所属学校</text>
@ -196,7 +184,6 @@ function getIconColorClass(index: number) {
{{ userInfo.schools?.[0]?.name || "光谷四小" }}
</text>
</view>
</view>
<!-- 功能菜单标题 -->
<view class="mx-2 mb-3">

View File

@ -10,6 +10,7 @@ export interface SelectOption {
value: number
examSubjectId?: number
subjectId?: number
gradeKey?: number
}
// 班级信息类型
@ -29,14 +30,13 @@ export const useHomeStore = defineStore(
const loading = ref(false)
const examDataMap = ref<Map<number, ModelTeacherAnalysisExamInfo>>(new Map())
const classList = ref<ClassItem[]>([])
const classGradeMap = ref<Map<number, number>>(new Map())
// 已选择的数据(使用 useUserStorage 实现基于用户的持久化)
const selectedClassId = useUserStorage<number>('home_selectedClassId', 0)
const selectedExamId = useUserStorage<number>('home_selectedExamId', 0)
const selectedSubjectId = useUserStorage<number>('home_selectedSubjectId', 0)
const selectedExamSubjectId = useUserStorage<number>('home_selectedExamSubjectId', 0)
const selectedGradeKey = computed(() => classGradeMap.value.get(selectedClassId.value || 0) || null)
const selectedGradeKey = useUserStorage<number>('home_selectedGradeKey', 0)
// 计算属性:考试选项
const examOptions = computed((): SelectOption[] => {
@ -51,6 +51,7 @@ export const useHomeStore = defineStore(
return classList.value.map(item => ({
label: item.label,
value: item.value,
gradeKey: item.gradeKey,
}))
})
@ -82,18 +83,18 @@ export const useHomeStore = defineStore(
if (response) {
// 处理班级数据并建立班级到年级的映射
classList.value = (response.class_list || []).map((item: ModelTeacherAnalysisClassInfo) => {
const classKey = item.class_key || 0
const gradeKey = item.grade_key || 0
// 建立班级到年级的映射
classGradeMap.value.set(classKey, gradeKey)
if (!item.class_key || !item.grade_key) {
return null
}
const classKey = item.class_key
const gradeKey = item.grade_key
return {
label: `${item.grade || ''} ${item.class || ''}`.trim(),
value: classKey,
gradeKey,
}
})
}).filter(item => item !== null) as ClassItem[]
// 处理考试数据,存储到 map 中
examDataMap.value.clear()
@ -150,7 +151,6 @@ export const useHomeStore = defineStore(
const reset = () => {
classList.value = []
examDataMap.value.clear()
classGradeMap.value.clear()
loading.value = false
clearSelections()
}
@ -195,9 +195,6 @@ export const useHomeStore = defineStore(
selectedExamSubjectId,
selectedGradeKey,
// 内部数据映射
classGradeMap,
// 方法
fetchOptions,
onExamChange,