fix: 一点修复
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
2ed92d3f7a
commit
785696659a
120
src/api/index.ts
120
src/api/index.ts
|
|
@ -3,69 +3,69 @@
|
||||||
* 统一管理所有API模块,避免直接依赖具体文件名
|
* 统一管理所有API模块,避免直接依赖具体文件名
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// 公用接口
|
export { default as answerSheetScanRecordApi } from './client/answerSheetScanRecord'
|
||||||
export { default as publicApi } from './公用接口';
|
|
||||||
|
|
||||||
// 系统管理相关
|
export * from './client/data-contracts'
|
||||||
export { default as menuApi } from './菜单管理';
|
// 扫描相关
|
||||||
export { default as systemUserApi } from './系统用户';
|
export { default as scannerApi } from './client/scanner'
|
||||||
export { default as systemRoleApi } from './系统角色';
|
export { default as scannerClientApi } from './client/scannerClient'
|
||||||
|
|
||||||
// 学校管理相关
|
|
||||||
export { default as schoolApi } from './学校管理';
|
|
||||||
export { default as studentApi } from './学生管理';
|
|
||||||
export { default as teacherApi } from './教师管理';
|
|
||||||
export { default as subjectApi } from './科目管理';
|
|
||||||
|
|
||||||
// 考试管理相关
|
|
||||||
export { default as examApi } from './考试管理';
|
|
||||||
export { default as examStudentApi } from './考试学生管理';
|
|
||||||
export { default as examManagerApi } from './考试管理员';
|
|
||||||
export { default as examVirtualTeacherApi } from './考试虚拟阅卷老师管理';
|
|
||||||
export { default as examReportConfigApi } from './考试报告发布设置管理';
|
|
||||||
export { default as examSubjectAnswerSheetTemplateApi } from './考试科目答题卡模板';
|
|
||||||
export { default as examSubjectAnswerSheetTemplateQuestionApi } from './考试科目答题卡模板题目';
|
|
||||||
export { default as examSubjectAnswerSheetQuestionApi } from './考试科目扫描答题卡题目';
|
|
||||||
export { default as examMarkingSettingsApi } from './阅卷设置管理';
|
|
||||||
export { default as examStatisticsApi } from './考试统计';
|
|
||||||
export { default as examMarkingProgressApi } from './阅卷进度';
|
|
||||||
export { default as examMarkingQualityApi } from './阅卷质量';
|
|
||||||
export { default as examSubjectManagementApi } from './考试科目管理';
|
|
||||||
export { default as examProblemSheetApi } from './问题卷';
|
|
||||||
export { default as examScanApi } from './扫描答题卡';
|
|
||||||
export { default as examScanV2Api } from './扫描答题卡V2';
|
|
||||||
export { default as examAnalysisSettingApi } from './成绩分析设置';
|
|
||||||
|
|
||||||
// 数据字典相关
|
|
||||||
export { default as dictTypeApi } from './数据字典类型';
|
|
||||||
export { default as dictItemApi } from './数据字典项';
|
|
||||||
|
|
||||||
// 答题卡管理相关
|
|
||||||
export { default as answerSheetApi } from './答题卡管理';
|
|
||||||
|
|
||||||
// 基础服务相关
|
|
||||||
export { default as fileApi } from './文件管理';
|
|
||||||
export { default as fileUploadApi } from './文件上传';
|
|
||||||
export { default as authApi } from './认证';
|
|
||||||
export { default as schedulerApi } from './定时任务';
|
|
||||||
export { default as queueApi } from './消息队列';
|
|
||||||
export { default as queryApi } from './查询筛选';
|
|
||||||
|
|
||||||
// 阅卷相关
|
|
||||||
export { default as examMarkingTaskApi } from './阅卷任务';
|
|
||||||
|
|
||||||
// 统分发布相关
|
|
||||||
export { default as scorePublishApi } from './统分发布';
|
|
||||||
|
|
||||||
|
export { default as templateClientApi } from './client/template'
|
||||||
// 导出所有数据类型
|
// 导出所有数据类型
|
||||||
export * from './data-contracts';
|
export * from './data-contracts'
|
||||||
export * from './client/data-contracts';
|
// 公用接口
|
||||||
|
export { default as publicApi } from './公用接口'
|
||||||
|
// 学校管理相关
|
||||||
|
export { default as schoolApi } from './学校管理'
|
||||||
|
|
||||||
|
export { default as studentApi } from './学生管理'
|
||||||
|
export { default as schedulerApi } from './定时任务'
|
||||||
|
export { default as examAnalysisSettingApi } from './成绩分析设置'
|
||||||
|
export { default as examScanApi } from './扫描答题卡'
|
||||||
|
export { default as examScanV2Api } from './扫描答题卡V2'
|
||||||
|
export { default as teacherApi } from './教师管理'
|
||||||
|
// 数据字典相关
|
||||||
|
export { default as dictTypeApi } from './数据字典类型'
|
||||||
|
export { default as dictItemApi } from './数据字典项'
|
||||||
|
export { default as fileUploadApi } from './文件上传'
|
||||||
|
// 基础服务相关
|
||||||
|
export { default as fileApi } from './文件管理'
|
||||||
|
export { default as queryApi } from './查询筛选'
|
||||||
|
export { default as queueApi } from './消息队列'
|
||||||
|
export { default as subjectApi } from './科目管理'
|
||||||
|
// 答题卡管理相关
|
||||||
|
export { default as answerSheetApi } from './答题卡管理'
|
||||||
|
export { default as systemUserApi } from './系统用户'
|
||||||
|
export { default as systemRoleApi } from './系统角色'
|
||||||
|
// 统分发布相关
|
||||||
|
export { default as scorePublishApi } from './统分发布'
|
||||||
|
|
||||||
// 教师相关
|
// 教师相关
|
||||||
export { default as teacherScoreAnalysisApi } from './老师成绩分析';
|
export { default as teacherScoreAnalysisApi } from './老师成绩分析'
|
||||||
|
export { default as examStudentApi } from './考试学生管理'
|
||||||
|
|
||||||
// 扫描相关
|
export { default as examReportConfigApi } from './考试报告发布设置管理'
|
||||||
export { default as scannerApi } from './client/scanner';
|
|
||||||
export { default as scannerClientApi } from './client/scannerClient';
|
export { default as examSubjectAnswerSheetQuestionApi } from './考试科目扫描答题卡题目'
|
||||||
export { default as answerSheetScanRecordApi } from './client/answerSheetScanRecord';
|
export { default as examSubjectAnswerSheetTemplateApi } from './考试科目答题卡模板'
|
||||||
export { default as templateClientApi } from './client/template';
|
export { default as examSubjectAnswerSheetTemplateQuestionApi } from './考试科目答题卡模板题目'
|
||||||
|
export { default as examSubjectManagementApi } from './考试科目管理'
|
||||||
|
// 考试管理相关
|
||||||
|
export { default as examApi } from './考试管理'
|
||||||
|
export { default as examManagerApi } from './考试管理员'
|
||||||
|
|
||||||
|
export { default as examStatisticsApi } from './考试统计'
|
||||||
|
|
||||||
|
export { default as examVirtualTeacherApi } from './考试虚拟阅卷老师管理'
|
||||||
|
|
||||||
|
// 系统管理相关
|
||||||
|
export { default as menuApi } from './菜单管理'
|
||||||
|
export { default as authApi } from './认证'
|
||||||
|
|
||||||
|
export { default as examProblemSheetApi } from './问题卷'
|
||||||
|
|
||||||
|
// 阅卷相关
|
||||||
|
export { default as examMarkingTaskApi } from './阅卷任务'
|
||||||
|
export { default as examMarkingSettingsApi } from './阅卷设置管理'
|
||||||
|
export { default as examMarkingQualityApi } from './阅卷质量'
|
||||||
|
export { default as examMarkingProgressApi } from './阅卷进度'
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ watch(
|
||||||
(options) => {
|
(options) => {
|
||||||
if (options.length > 0 && !compareClassId.value) {
|
if (options.length > 0 && !compareClassId.value) {
|
||||||
// 排除当前选中的班级,选择第一个其他班级
|
// 排除当前选中的班级,选择第一个其他班级
|
||||||
const otherClasses = options.filter(item => item.value !== homeStore.selectedClassId)
|
const otherClasses = options.filter(item => item.value !== homeStore.selectedClassKey)
|
||||||
if (otherClasses.length > 0) {
|
if (otherClasses.length > 0) {
|
||||||
compareClassId.value = otherClasses[0].value
|
compareClassId.value = otherClasses[0].value
|
||||||
}
|
}
|
||||||
|
|
@ -71,7 +71,7 @@ const {
|
||||||
queryKey: [
|
queryKey: [
|
||||||
'class-trend',
|
'class-trend',
|
||||||
useUserId(),
|
useUserId(),
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedGradeKey,
|
homeStore.selectedGradeKey,
|
||||||
compareClassId,
|
compareClassId,
|
||||||
props.selectedSubjectId,
|
props.selectedSubjectId,
|
||||||
|
|
@ -80,7 +80,7 @@ const {
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const response = await teacherAnalysisTrendUsingPost({
|
const response = await teacherAnalysisTrendUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
class_key_compare: compareClassId.value!,
|
class_key_compare: compareClassId.value!,
|
||||||
subject_id: props.selectedSubjectId || 0,
|
subject_id: props.selectedSubjectId || 0,
|
||||||
|
|
@ -91,7 +91,7 @@ const {
|
||||||
return response || { trend_list: [] }
|
return response || { trend_list: [] }
|
||||||
},
|
},
|
||||||
enabled: computed(() =>
|
enabled: computed(() =>
|
||||||
!!homeStore.selectedClassId
|
!!homeStore.selectedClassKey
|
||||||
&& !!homeStore.selectedGradeKey
|
&& !!homeStore.selectedGradeKey
|
||||||
&& !!compareClassId.value,
|
&& !!compareClassId.value,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ async function queryExamQuestionList(pageNo: number, pageSize: number) {
|
||||||
const result = await teacherAnalysisQuestionStatUsingPost({
|
const result = await teacherAnalysisQuestionStatUsingPost({
|
||||||
body: {
|
body: {
|
||||||
grade_key: homeStore.selectedGradeKey || 0,
|
grade_key: homeStore.selectedGradeKey || 0,
|
||||||
class_key: homeStore.selectedClassId || 0,
|
class_key: homeStore.selectedClassKey || 0,
|
||||||
subject_id: selectedSubjectId.value,
|
subject_id: selectedSubjectId.value,
|
||||||
page: pageNo,
|
page: pageNo,
|
||||||
page_size: pageSize,
|
page_size: pageSize,
|
||||||
|
|
@ -61,7 +61,7 @@ const chartRef = ref<InstanceType<typeof AverageScoreChart>>()
|
||||||
// 班级选择选项(用于对比班级选择,过滤掉当前班级)
|
// 班级选择选项(用于对比班级选择,过滤掉当前班级)
|
||||||
const classOptions = computed(() =>
|
const classOptions = computed(() =>
|
||||||
homeStore.classOptions
|
homeStore.classOptions
|
||||||
.filter(cls => cls.value !== homeStore.selectedClassId)
|
.filter(cls => cls.value !== homeStore.selectedClassKey)
|
||||||
.map(cls => ({
|
.map(cls => ({
|
||||||
label: cls.label,
|
label: cls.label,
|
||||||
value: cls.value,
|
value: cls.value,
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ const {
|
||||||
useUserId(),
|
useUserId(),
|
||||||
selectedExamId,
|
selectedExamId,
|
||||||
homeStore.selectedGradeKey,
|
homeStore.selectedGradeKey,
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedSubjectId,
|
homeStore.selectedSubjectId,
|
||||||
],
|
],
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
|
|
@ -48,7 +48,7 @@ const {
|
||||||
body: {
|
body: {
|
||||||
exam_id: selectedExamId.value!,
|
exam_id: selectedExamId.value!,
|
||||||
grade_key: homeStore.selectedGradeKey!,
|
grade_key: homeStore.selectedGradeKey!,
|
||||||
class_key: homeStore.selectedClassId!,
|
class_key: homeStore.selectedClassKey!,
|
||||||
subject_id: homeStore.selectedSubjectId!,
|
subject_id: homeStore.selectedSubjectId!,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
@ -57,7 +57,7 @@ const {
|
||||||
enabled: computed(() =>
|
enabled: computed(() =>
|
||||||
!!selectedExamId.value
|
!!selectedExamId.value
|
||||||
&& !!homeStore.selectedGradeKey
|
&& !!homeStore.selectedGradeKey
|
||||||
&& !!homeStore.selectedClassId
|
&& !!homeStore.selectedClassKey
|
||||||
&& !!homeStore.selectedSubjectId,
|
&& !!homeStore.selectedSubjectId,
|
||||||
),
|
),
|
||||||
staleTime: 30000,
|
staleTime: 30000,
|
||||||
|
|
@ -94,7 +94,7 @@ async function viewDetail(item: API.QuestionStatInfo) {
|
||||||
body: {
|
body: {
|
||||||
exam_id: selectedExamId.value!,
|
exam_id: selectedExamId.value!,
|
||||||
grade_key: homeStore.selectedGradeKey!,
|
grade_key: homeStore.selectedGradeKey!,
|
||||||
class_key: homeStore.selectedClassId!,
|
class_key: homeStore.selectedClassKey!,
|
||||||
subject_id: homeStore.selectedSubjectId!,
|
subject_id: homeStore.selectedSubjectId!,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
@ -124,7 +124,7 @@ async function viewDetail(item: API.QuestionStatInfo) {
|
||||||
// 查看学生名单 - 跳转到新页面
|
// 查看学生名单 - 跳转到新页面
|
||||||
function handleViewStudentList(question: API.QuestionStatInfo) {
|
function handleViewStudentList(question: API.QuestionStatInfo) {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages/class-analysis/question-score-detail?exam_id=${selectedExamId.value}&grade_key=${homeStore.selectedGradeKey}&class_key=${homeStore.selectedClassId}&subject_id=${homeStore.selectedSubjectId}&question_id=${question.question_id}`,
|
url: `/pages/class-analysis/question-score-detail?exam_id=${selectedExamId.value}&grade_key=${homeStore.selectedGradeKey}&class_key=${homeStore.selectedClassKey}&subject_id=${homeStore.selectedSubjectId}&question_id=${question.question_id}`,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,17 +81,17 @@ const tempSettings = ref({
|
||||||
|
|
||||||
// 从用户store中获取教师信息
|
// 从用户store中获取教师信息
|
||||||
const schoolName = computed(() => {
|
const schoolName = computed(() => {
|
||||||
const userInfo = userStore.getUserInfo
|
const userInfo = userStore.info
|
||||||
return userInfo.schools?.[0]?.name || '学校'
|
return userInfo.schools?.[0]?.name || '学校'
|
||||||
})
|
})
|
||||||
|
|
||||||
const teacherName = computed(() => {
|
const teacherName = computed(() => {
|
||||||
const userInfo = userStore.getUserInfo
|
const userInfo = userStore.info
|
||||||
return userInfo.nickname || '教师'
|
return userInfo.nickname || '教师'
|
||||||
})
|
})
|
||||||
|
|
||||||
const teacherSubject = computed(() => {
|
const teacherSubject = computed(() => {
|
||||||
const userInfo = userStore.getUserInfo
|
const userInfo = userStore.info
|
||||||
// 从角色信息中获取学科,假设角色名包含学科信息
|
// 从角色信息中获取学科,假设角色名包含学科信息
|
||||||
const roleName = userInfo.roles?.[0]?.name
|
const roleName = userInfo.roles?.[0]?.name
|
||||||
if (roleName) {
|
if (roleName) {
|
||||||
|
|
@ -104,10 +104,10 @@ const teacherSubject = computed(() => {
|
||||||
|
|
||||||
// 计算当前选中的班级名称
|
// 计算当前选中的班级名称
|
||||||
const selectedClassName = computed(() => {
|
const selectedClassName = computed(() => {
|
||||||
if (!homeStore.selectedClassId) {
|
if (homeStore.selectedClassId === null) {
|
||||||
return '请选择班级'
|
return '请选择班级'
|
||||||
}
|
}
|
||||||
const selectedClass = homeStore.classOptions.find(item => item.value === homeStore.selectedClassId && item.gradeKey === homeStore.selectedGradeKey)
|
const selectedClass = homeStore.classOptions.find(item => item.value === homeStore.selectedClassId)
|
||||||
return selectedClass?.label || '请选择班级'
|
return selectedClass?.label || '请选择班级'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -145,7 +145,7 @@ const menuItems = [
|
||||||
|
|
||||||
// 获取统计数据
|
// 获取统计数据
|
||||||
async function fetchExamStats() {
|
async function fetchExamStats() {
|
||||||
if (!homeStore.selectedClassId || !homeStore.selectedExamId) {
|
if (!homeStore.selectedClassKey || !homeStore.selectedExamId) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -153,9 +153,9 @@ async function fetchExamStats() {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
const response = await teacherAnalysisRecentExamStatsUsingPost({
|
const response = await teacherAnalysisRecentExamStatsUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
exam_id: homeStore.selectedExamId,
|
exam_id: homeStore.selectedExamId,
|
||||||
grade_key: homeStore.selectedClassId, // 暂时使用class_key,实际可能需要单独的grade_key
|
grade_key: homeStore.selectedClassKey, // 暂时使用class_key,实际可能需要单独的grade_key
|
||||||
excellent_scoring_rate: scoreSettings.value.excellent_scoring_rate,
|
excellent_scoring_rate: scoreSettings.value.excellent_scoring_rate,
|
||||||
good_scoring_rate: scoreSettings.value.good_scoring_rate,
|
good_scoring_rate: scoreSettings.value.good_scoring_rate,
|
||||||
pass_scoring_rate: scoreSettings.value.pass_scoring_rate,
|
pass_scoring_rate: scoreSettings.value.pass_scoring_rate,
|
||||||
|
|
@ -256,7 +256,7 @@ function handleClassChange() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 班级选择确认
|
// 班级选择确认
|
||||||
watch(() => homeStore.selectedClassId, () => {
|
watch(() => homeStore.selectedClassKey, () => {
|
||||||
// 选择班级后重新获取统计数据
|
// 选择班级后重新获取统计数据
|
||||||
fetchExamStats()
|
fetchExamStats()
|
||||||
// 关闭弹窗
|
// 关闭弹窗
|
||||||
|
|
@ -329,7 +329,7 @@ function handleViewDetail() {
|
||||||
|
|
||||||
// 试卷讲评
|
// 试卷讲评
|
||||||
function handleExamReview() {
|
function handleExamReview() {
|
||||||
if (!homeStore.selectedClassId || !homeStore.selectedExamId) {
|
if (!homeStore.selectedClassKey || !homeStore.selectedExamId) {
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '请先选择班级和考试',
|
title: '请先选择班级和考试',
|
||||||
icon: 'none',
|
icon: 'none',
|
||||||
|
|
@ -339,7 +339,7 @@ function handleExamReview() {
|
||||||
|
|
||||||
// TODO: 导航到试卷讲评页,传递当前选择的参数
|
// TODO: 导航到试卷讲评页,传递当前选择的参数
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: `/pages-sub/exam-review/index?classId=${homeStore.selectedClassId}&examId=${homeStore.selectedExamId}&subjectId=${homeStore.selectedExamSubjectId || ''}`,
|
url: `/pages-sub/exam-review/index?classId=${homeStore.selectedClassKey}&examId=${homeStore.selectedExamId}&subjectId=${homeStore.selectedExamSubjectId || ''}`,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -634,12 +634,12 @@ onMounted(async () => {
|
||||||
v-for="classItem in homeStore.classOptions"
|
v-for="classItem in homeStore.classOptions"
|
||||||
:key="classItem.value"
|
:key="classItem.value"
|
||||||
class="flex items-center justify-between rounded-xl p-4 transition-colors"
|
class="flex items-center justify-between rounded-xl p-4 transition-colors"
|
||||||
:class="homeStore.selectedClassId === classItem.value && homeStore.selectedGradeKey === classItem.gradeKey ? 'bg-blue-50 border border-blue-100' : 'bg-slate-50'"
|
:class="homeStore.selectedClassId === classItem.value ? 'bg-blue-50 border border-blue-100' : 'bg-slate-50'"
|
||||||
@tap="homeStore.selectedClassId = classItem.value; homeStore.selectedGradeKey = classItem.gradeKey; showClassPicker = false"
|
@tap="homeStore.selectedClassId = classItem.value;showClassPicker = false"
|
||||||
>
|
>
|
||||||
<text class="text-base" :class="homeStore.selectedClassId === classItem.value && homeStore.selectedGradeKey === classItem.gradeKey ? 'text-blue-600 font-bold' : 'text-slate-700'">{{ classItem.label }}</text>
|
<text class="text-base" :class="homeStore.selectedClassId === classItem.value ? 'text-blue-600 font-bold' : 'text-slate-700'">{{ classItem.label }}</text>
|
||||||
<view
|
<view
|
||||||
v-if="homeStore.selectedClassId === classItem.value && homeStore.selectedGradeKey === classItem.gradeKey"
|
v-if="homeStore.selectedClassId === classItem.value"
|
||||||
class="i-mingcute:check-circle-fill text-xl text-blue-500"
|
class="i-mingcute:check-circle-fill text-xl text-blue-500"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
|
|
|
||||||
|
|
@ -26,14 +26,8 @@ const pagingRef = ref<ZPagingRef>()
|
||||||
// 成绩单数据
|
// 成绩单数据
|
||||||
const scoreList = ref<ScoreSheetInfo[]>([])
|
const scoreList = ref<ScoreSheetInfo[]>([])
|
||||||
|
|
||||||
// 班级选项
|
|
||||||
const classOptions = computed(() => homeStore.classOptions)
|
|
||||||
|
|
||||||
// 科目选项
|
|
||||||
const subjectOptions = computed(() => homeStore.subjectOptions)
|
|
||||||
|
|
||||||
// 当前选中的班级ID
|
// 当前选中的班级ID
|
||||||
const selectedClassId = ref<number | null>(homeStore.selectedClassId)
|
const selectedClassId = ref<number | null>(homeStore.selectedClassKey)
|
||||||
|
|
||||||
// 返回上一页
|
// 返回上一页
|
||||||
function goBack() {
|
function goBack() {
|
||||||
|
|
@ -50,7 +44,7 @@ function handleClassChange(event: { value: string | number, selectedItem: Record
|
||||||
|
|
||||||
// 查询成绩单数据
|
// 查询成绩单数据
|
||||||
async function queryScoreList(pageNo: number, pageSize: number) {
|
async function queryScoreList(pageNo: number, pageSize: number) {
|
||||||
if (!homeStore.selectedClassId || !homeStore.selectedExamId || !homeStore.selectedGradeKey) {
|
if (!homeStore.selectedClassKey || !homeStore.selectedExamId || !homeStore.selectedGradeKey) {
|
||||||
pagingRef.value?.complete([])
|
pagingRef.value?.complete([])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -58,7 +52,7 @@ async function queryScoreList(pageNo: number, pageSize: number) {
|
||||||
try {
|
try {
|
||||||
const response = await teacherAnalysisScoreSheetUsingPost({
|
const response = await teacherAnalysisScoreSheetUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
exam_id: homeStore.selectedExamId,
|
exam_id: homeStore.selectedExamId,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
page: pageNo,
|
page: pageNo,
|
||||||
|
|
@ -123,7 +117,7 @@ function viewSubjectAnswerSheet(student: ScoreSheetInfo, subjectId: number) {
|
||||||
<wd-drop-menu>
|
<wd-drop-menu>
|
||||||
<wd-drop-menu-item
|
<wd-drop-menu-item
|
||||||
v-model="selectedClassId"
|
v-model="selectedClassId"
|
||||||
:options="classOptions"
|
:options="homeStore.classOptions"
|
||||||
@change="handleClassChange"
|
@change="handleClassChange"
|
||||||
/>
|
/>
|
||||||
</wd-drop-menu>
|
</wd-drop-menu>
|
||||||
|
|
@ -167,7 +161,7 @@ function viewSubjectAnswerSheet(student: ScoreSheetInfo, subjectId: number) {
|
||||||
|
|
||||||
<!-- 动态生成科目列 -->
|
<!-- 动态生成科目列 -->
|
||||||
<wd-table-col
|
<wd-table-col
|
||||||
v-for="subject in subjectOptions"
|
v-for="subject in homeStore.subjectOptions"
|
||||||
:key="subject.value"
|
:key="subject.value"
|
||||||
:prop="`subject_${subject.value}`"
|
:prop="`subject_${subject.value}`"
|
||||||
:label="subject.label"
|
:label="subject.label"
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ const activeTab = computed({
|
||||||
})
|
})
|
||||||
|
|
||||||
const isQueryEnabled = computed(() =>
|
const isQueryEnabled = computed(() =>
|
||||||
!!homeStore.selectedClassId && !!homeStore.selectedExamId && !!homeStore.selectedGradeKey,
|
!!homeStore.selectedClassKey && !!homeStore.selectedExamId && !!homeStore.selectedGradeKey,
|
||||||
)
|
)
|
||||||
|
|
||||||
// --- API Hooks (保持逻辑不变) ---
|
// --- API Hooks (保持逻辑不变) ---
|
||||||
|
|
@ -106,7 +106,7 @@ const { data: statsData } = useQuery({
|
||||||
queryKey: [
|
queryKey: [
|
||||||
'overview-stats',
|
'overview-stats',
|
||||||
useUserId(),
|
useUserId(),
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedExamId,
|
homeStore.selectedExamId,
|
||||||
homeStore.selectedGradeKey,
|
homeStore.selectedGradeKey,
|
||||||
selectedSubjectId,
|
selectedSubjectId,
|
||||||
|
|
@ -118,7 +118,7 @@ const { data: statsData } = useQuery({
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
return await teacherAnalysisRecentExamStatsUsingPost({
|
return await teacherAnalysisRecentExamStatsUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
exam_id: homeStore.selectedExamId,
|
exam_id: homeStore.selectedExamId,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
subject_id: selectedSubjectId.value || undefined,
|
subject_id: selectedSubjectId.value || undefined,
|
||||||
|
|
@ -140,7 +140,7 @@ const { data: comparisonData } = useQuery({
|
||||||
'comparison-data',
|
'comparison-data',
|
||||||
useUserId(),
|
useUserId(),
|
||||||
comparisonMode,
|
comparisonMode,
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedExamId,
|
homeStore.selectedExamId,
|
||||||
homeStore.selectedGradeKey,
|
homeStore.selectedGradeKey,
|
||||||
selectedSubjectId.value,
|
selectedSubjectId.value,
|
||||||
|
|
@ -150,7 +150,7 @@ const { data: comparisonData } = useQuery({
|
||||||
return (await teacherAnalysisClassExamComparisonHorizontalUsingPost({
|
return (await teacherAnalysisClassExamComparisonHorizontalUsingPost({
|
||||||
body: {
|
body: {
|
||||||
exam_id: homeStore.selectedExamId,
|
exam_id: homeStore.selectedExamId,
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
subject_id: selectedSubjectId.value || undefined,
|
subject_id: selectedSubjectId.value || undefined,
|
||||||
},
|
},
|
||||||
|
|
@ -159,14 +159,14 @@ const { data: comparisonData } = useQuery({
|
||||||
else {
|
else {
|
||||||
return (await teacherAnalysisClassExamComparisonUsingPost({
|
return (await teacherAnalysisClassExamComparisonUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
subject_id: selectedSubjectId.value || undefined,
|
subject_id: selectedSubjectId.value || undefined,
|
||||||
},
|
},
|
||||||
})).exam_list as ExamComparisonItem[] || []
|
})).exam_list as ExamComparisonItem[] || []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
enabled: computed(() => !!homeStore.selectedClassId && !!homeStore.selectedGradeKey),
|
enabled: computed(() => !!homeStore.selectedClassKey && !!homeStore.selectedGradeKey),
|
||||||
staleTime: 30000,
|
staleTime: 30000,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -175,7 +175,7 @@ const { data: rankStatsData } = useQuery({
|
||||||
'rank-statistics',
|
'rank-statistics',
|
||||||
useUserId(),
|
useUserId(),
|
||||||
selectedClassIds,
|
selectedClassIds,
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedExamId,
|
homeStore.selectedExamId,
|
||||||
selectedSubjectId,
|
selectedSubjectId,
|
||||||
scoreSettings.value.rank_top_1,
|
scoreSettings.value.rank_top_1,
|
||||||
|
|
@ -185,7 +185,7 @@ const { data: rankStatsData } = useQuery({
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const classIds = selectedClassIds.value.length > 0
|
const classIds = selectedClassIds.value.length > 0
|
||||||
? selectedClassIds.value
|
? selectedClassIds.value
|
||||||
: (homeStore.selectedClassId ? [homeStore.selectedClassId.toString()] : [])
|
: (homeStore.selectedClassKey ? [homeStore.selectedClassKey.toString()] : [])
|
||||||
|
|
||||||
if (classIds.length === 0) {
|
if (classIds.length === 0) {
|
||||||
return []
|
return []
|
||||||
|
|
@ -213,14 +213,14 @@ const { data: rankStatsData } = useQuery({
|
||||||
// --- Methods ---
|
// --- Methods ---
|
||||||
|
|
||||||
async function fetchKeyStudentsPaging(pageNo: number, pageSize: number) {
|
async function fetchKeyStudentsPaging(pageNo: number, pageSize: number) {
|
||||||
if (!homeStore.selectedClassId || !homeStore.selectedExamId || !homeStore.selectedGradeKey) {
|
if (!homeStore.selectedClassKey || !homeStore.selectedExamId || !homeStore.selectedGradeKey) {
|
||||||
keyStudentsPaging.value?.complete(false)
|
keyStudentsPaging.value?.complete(false)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const response = await teacherAnalysisKeyStudentUsingPost({
|
const response = await teacherAnalysisKeyStudentUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
exam_id: homeStore.selectedExamId,
|
exam_id: homeStore.selectedExamId,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
subject_id: selectedSubjectId.value || undefined,
|
subject_id: selectedSubjectId.value || undefined,
|
||||||
|
|
@ -271,7 +271,7 @@ function toggleComparisonMode(mode: 'horizontal' | 'vertical') {
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleViewScoreList() {
|
function handleViewScoreList() {
|
||||||
if (!homeStore.selectedClassId || !homeStore.selectedExamId) {
|
if (!homeStore.selectedClassKey || !homeStore.selectedExamId) {
|
||||||
uni.showToast({ title: '请先选择班级和考试', icon: 'none' })
|
uni.showToast({ title: '请先选择班级和考试', icon: 'none' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ safeAreaInsets = systemInfo.safeAreaInsets
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// 获取用户信息
|
// 获取用户信息
|
||||||
const userInfo = computed(() => userStore.getUserInfo)
|
const userInfo = computed(() => userStore.info)
|
||||||
|
|
||||||
// 功能菜单项
|
// 功能菜单项
|
||||||
const menuItems = [
|
const menuItems = [
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ const selectedSubjectId = ref(0)
|
||||||
const { data: reportData, isLoading } = useQuery({
|
const { data: reportData, isLoading } = useQuery({
|
||||||
queryKey: computed(() => [
|
queryKey: computed(() => [
|
||||||
'personal-report',
|
'personal-report',
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedGradeKey,
|
homeStore.selectedGradeKey,
|
||||||
homeStore.selectedExamId,
|
homeStore.selectedExamId,
|
||||||
studentNumber.value,
|
studentNumber.value,
|
||||||
|
|
@ -26,7 +26,7 @@ const { data: reportData, isLoading } = useQuery({
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const response = await teacherAnalysisPersonalReportUsingPost({
|
const response = await teacherAnalysisPersonalReportUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_key: homeStore.selectedClassId,
|
class_key: homeStore.selectedClassKey,
|
||||||
grade_key: homeStore.selectedGradeKey,
|
grade_key: homeStore.selectedGradeKey,
|
||||||
exam_id: homeStore.selectedExamId,
|
exam_id: homeStore.selectedExamId,
|
||||||
student_number: studentNumber.value,
|
student_number: studentNumber.value,
|
||||||
|
|
@ -36,7 +36,7 @@ const { data: reportData, isLoading } = useQuery({
|
||||||
return response
|
return response
|
||||||
},
|
},
|
||||||
enabled: computed(() =>
|
enabled: computed(() =>
|
||||||
!!homeStore.selectedClassId
|
!!homeStore.selectedClassKey
|
||||||
&& !!homeStore.selectedGradeKey
|
&& !!homeStore.selectedGradeKey
|
||||||
&& !!homeStore.selectedExamId
|
&& !!homeStore.selectedExamId
|
||||||
&& !!studentNumber.value,
|
&& !!studentNumber.value,
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ const searchQuery = ref('')
|
||||||
|
|
||||||
// 2. 逻辑计算与 Query (保持原逻辑不变)
|
// 2. 逻辑计算与 Query (保持原逻辑不变)
|
||||||
const canLoadStudents = computed(() => {
|
const canLoadStudents = computed(() => {
|
||||||
return homeStore.selectedClassId && homeStore.selectedExamId && homeStore.selectedExamSubjectId
|
return homeStore.selectedClassKey && homeStore.selectedExamId && homeStore.selectedExamSubjectId
|
||||||
})
|
})
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
|
@ -24,7 +24,7 @@ const {
|
||||||
} = useQuery({
|
} = useQuery({
|
||||||
queryKey: computed(() => [
|
queryKey: computed(() => [
|
||||||
'students',
|
'students',
|
||||||
homeStore.selectedClassId,
|
homeStore.selectedClassKey,
|
||||||
homeStore.selectedExamId,
|
homeStore.selectedExamId,
|
||||||
homeStore.selectedExamSubjectId,
|
homeStore.selectedExamSubjectId,
|
||||||
homeStore.selectedGradeKey,
|
homeStore.selectedGradeKey,
|
||||||
|
|
@ -33,7 +33,7 @@ const {
|
||||||
queryFn: async () => {
|
queryFn: async () => {
|
||||||
const response = await teacherAnalysisStudentListUsingPost({
|
const response = await teacherAnalysisStudentListUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_id: homeStore.selectedClassId!,
|
class_id: homeStore.selectedClassKey!,
|
||||||
exam_subject_id: homeStore.selectedExamSubjectId!,
|
exam_subject_id: homeStore.selectedExamSubjectId!,
|
||||||
grade_id: homeStore.selectedGradeKey!,
|
grade_id: homeStore.selectedGradeKey!,
|
||||||
keyword: searchQuery.value || undefined,
|
keyword: searchQuery.value || undefined,
|
||||||
|
|
@ -81,7 +81,7 @@ async function handleDownload() {
|
||||||
uni.showLoading({ title: '准备中' })
|
uni.showLoading({ title: '准备中' })
|
||||||
const response = await teacherAnalysisExportStudentListUsingPost({
|
const response = await teacherAnalysisExportStudentListUsingPost({
|
||||||
body: {
|
body: {
|
||||||
class_id: homeStore.selectedClassId!,
|
class_id: homeStore.selectedClassKey!,
|
||||||
exam_subject_id: homeStore.selectedExamSubjectId!,
|
exam_subject_id: homeStore.selectedExamSubjectId!,
|
||||||
grade_id: homeStore.selectedGradeKey!,
|
grade_id: homeStore.selectedGradeKey!,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -630,10 +630,6 @@ export type ExamMarkingTaskResponse = {
|
||||||
exam_name?: string;
|
exam_name?: string;
|
||||||
/** 考试类型 */
|
/** 考试类型 */
|
||||||
exam_type?: string;
|
exam_type?: string;
|
||||||
/** 年级 */
|
|
||||||
grade?: string;
|
|
||||||
/** 是否已统分 */
|
|
||||||
is_scored?: boolean;
|
|
||||||
/** 科目列表 */
|
/** 科目列表 */
|
||||||
subjects?: SubjectInfo[];
|
subjects?: SubjectInfo[];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ export interface SelectOption {
|
||||||
value: number
|
value: number
|
||||||
examSubjectId?: number
|
examSubjectId?: number
|
||||||
subjectId?: number
|
subjectId?: number
|
||||||
|
classKey?: number
|
||||||
gradeKey?: number
|
gradeKey?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -36,7 +37,6 @@ export const useHomeStore = defineStore(
|
||||||
const selectedExamId = useUserStorage<number>('home_selectedExamId', 0)
|
const selectedExamId = useUserStorage<number>('home_selectedExamId', 0)
|
||||||
const selectedSubjectId = useUserStorage<number>('home_selectedSubjectId', 0)
|
const selectedSubjectId = useUserStorage<number>('home_selectedSubjectId', 0)
|
||||||
const selectedExamSubjectId = useUserStorage<number>('home_selectedExamSubjectId', 0)
|
const selectedExamSubjectId = useUserStorage<number>('home_selectedExamSubjectId', 0)
|
||||||
const selectedGradeKey = useUserStorage<number>('home_selectedGradeKey', 0)
|
|
||||||
|
|
||||||
// 计算属性:考试选项
|
// 计算属性:考试选项
|
||||||
const examOptions = computed((): SelectOption[] => {
|
const examOptions = computed((): SelectOption[] => {
|
||||||
|
|
@ -48,13 +48,22 @@ export const useHomeStore = defineStore(
|
||||||
|
|
||||||
// 计算属性:班级选项
|
// 计算属性:班级选项
|
||||||
const classOptions = computed((): SelectOption[] => {
|
const classOptions = computed((): SelectOption[] => {
|
||||||
return classList.value.map(item => ({
|
return classList.value.map((item, index) => ({
|
||||||
label: item.label,
|
label: item.label,
|
||||||
value: item.value,
|
value: index,
|
||||||
|
classKey: item.value,
|
||||||
gradeKey: item.gradeKey,
|
gradeKey: item.gradeKey,
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const selectedClassKey = computed(() => {
|
||||||
|
return classOptions.value.find(item => item.value === selectedClassId.value)?.classKey || 0
|
||||||
|
})
|
||||||
|
|
||||||
|
const selectedGradeKey = computed(() => {
|
||||||
|
return classOptions.value.find(item => item.value === selectedClassId.value)?.gradeKey || 0
|
||||||
|
})
|
||||||
|
|
||||||
// 计算属性:根据选中考试获取科目选项
|
// 计算属性:根据选中考试获取科目选项
|
||||||
const subjectOptions = computed((): SelectOption[] => {
|
const subjectOptions = computed((): SelectOption[] => {
|
||||||
if (!selectedExamId.value) {
|
if (!selectedExamId.value) {
|
||||||
|
|
@ -193,6 +202,7 @@ export const useHomeStore = defineStore(
|
||||||
selectedExamId,
|
selectedExamId,
|
||||||
selectedSubjectId,
|
selectedSubjectId,
|
||||||
selectedExamSubjectId,
|
selectedExamSubjectId,
|
||||||
|
selectedClassKey,
|
||||||
selectedGradeKey,
|
selectedGradeKey,
|
||||||
|
|
||||||
// 方法
|
// 方法
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
|
import type { ModelSysUser, ModelTeacherListResponse, ModelUserProfileResponse } from '@/api'
|
||||||
import type { LoginRequest, SysUser } from '@/service/types'
|
import type { LoginRequest, SysUser } from '@/service/types'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { computed, ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
|
import { authApi } from '@/api'
|
||||||
import {
|
import {
|
||||||
authCodeLoginUsingPost,
|
authCodeLoginUsingPost,
|
||||||
authLoginUsingPost,
|
authLoginUsingPost,
|
||||||
|
|
@ -19,7 +21,9 @@ export const useUserStore = defineStore(
|
||||||
// 登录状态
|
// 登录状态
|
||||||
const isLogin = ref(false)
|
const isLogin = ref(false)
|
||||||
// 用户信息
|
// 用户信息
|
||||||
const info = ref<Partial<SysUser>>({})
|
const info = ref<Partial<ModelSysUser>>({})
|
||||||
|
// 教师信息
|
||||||
|
const teacherInfo = ref<Partial<ModelTeacherListResponse>>({})
|
||||||
// 访问令牌
|
// 访问令牌
|
||||||
const accessToken = ref('')
|
const accessToken = ref('')
|
||||||
// 刷新令牌
|
// 刷新令牌
|
||||||
|
|
@ -39,8 +43,9 @@ export const useUserStore = defineStore(
|
||||||
* 设置用户信息
|
* 设置用户信息
|
||||||
* @param newInfo 新的用户信息
|
* @param newInfo 新的用户信息
|
||||||
*/
|
*/
|
||||||
const setUserInfo = (newInfo: SysUser) => {
|
const setUserInfo = (newInfo: ModelUserProfileResponse) => {
|
||||||
info.value = newInfo
|
info.value = newInfo.sys_user
|
||||||
|
teacherInfo.value = newInfo.teacher
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -101,7 +106,7 @@ export const useUserStore = defineStore(
|
||||||
*/
|
*/
|
||||||
const fetchUserProfile = async () => {
|
const fetchUserProfile = async () => {
|
||||||
try {
|
try {
|
||||||
const userData = await authProfileUsingGet({})
|
const userData = await authApi.profileList()
|
||||||
if (userData) {
|
if (userData) {
|
||||||
setUserInfo(userData)
|
setUserInfo(userData)
|
||||||
return userData
|
return userData
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue