Merge branch 'master' of https://xlx.vintom.cn/code/xlx_teacher_app
continuous-integration/drone/push Build is passing Details

This commit is contained in:
张哲铜 2025-09-21 12:30:27 +08:00
commit 0bd3e761ca
3 changed files with 130 additions and 48 deletions

View File

@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { useMarkingData } from '@/components/marking/composables/useMarkingData' import { useMarkingData } from '@/components/marking/composables/useMarkingData'
import { useMarkingSettings } from '@/components/marking/composables/useMarkingSettings' import { getSelectedOnekeyScores, useMarkingSettings } from '@/components/marking/composables/useMarkingSettings'
interface Props { interface Props {
isLandscape?: boolean isLandscape?: boolean
@ -37,8 +37,14 @@ const isCollapsed = ref(false)
// //
const displayItems = computed(() => { const displayItems = computed(() => {
if (scoreMode.value === 'onekey') { if (scoreMode.value === 'onekey') {
// //
return settings.value.onekeyScoreScores.map(score => ({ const selectedScores = getSelectedOnekeyScores(
settings.value.stepSize,
props.fullScore,
settings.value.onekeyScoreSelections,
)
return selectedScores.map(score => ({
type: 'score' as const, type: 'score' as const,
value: score, value: score,
label: score.toString(), label: score.toString(),

View File

@ -1,7 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { VueDraggable } from 'vue-draggable-plus' import { VueDraggable } from 'vue-draggable-plus'
import { useMarkingSettings } from '@/components/marking/composables/useMarkingSettings' import {
generateOnekeyScores,
getSelectedOnekeyScores,
updateOnekeyScoreSelection,
useMarkingSettings,
} from '@/components/marking/composables/useMarkingSettings'
interface Props { interface Props {
modelValue: boolean modelValue: boolean
@ -42,16 +47,8 @@ const stepOptions = [0.5, 1, 2, 3, 4, 5]
// - // -
const commonScores = computed(() => { const commonScores = computed(() => {
if (activeTab.value === 'onekey') { if (activeTab.value === 'onekey') {
// ScoreKeyboard.vue //
const numbers: number[] = [] return generateOnekeyScores(settings.value.stepSize, props.fullScore)
const step = settings.value.stepSize
const max = Math.max(props.fullScore, 2)
for (let i = 0; i <= max; i += step) {
numbers.push(i)
}
return numbers
} }
else { else {
// //
@ -62,23 +59,7 @@ const commonScores = computed(() => {
// //
function selectStepSize(step: number) { function selectStepSize(step: number) {
settings.value.stepSize = step settings.value.stepSize = step
updateOnekeyScores() //
}
//
function updateOnekeyScores() {
if (activeTab.value === 'onekey') {
const numbers: number[] = []
const step = settings.value.stepSize
const max = Math.max(props.fullScore, 2)
for (let i = 0; i <= max; i += step) {
numbers.push(i)
}
// 使
settings.value.onekeyScoreScores = numbers
}
} }
// //
@ -88,7 +69,12 @@ const customStepValue = ref('')
// //
const selectedCommonScores = computed(() => { const selectedCommonScores = computed(() => {
if (activeTab.value === 'onekey') { if (activeTab.value === 'onekey') {
return settings.value.onekeyScoreScores //
return getSelectedOnekeyScores(
settings.value.stepSize,
props.fullScore,
settings.value.onekeyScoreSelections,
)
} }
else { else {
return settings.value.quickScoreScores return settings.value.quickScoreScores
@ -102,7 +88,25 @@ const draggableScores = computed({
}, },
set: (newOrder: number[]) => { set: (newOrder: number[]) => {
if (activeTab.value === 'onekey') { if (activeTab.value === 'onekey') {
settings.value.onekeyScoreScores = newOrder //
//
const currentKey = `${settings.value.stepSize}_${props.fullScore}`
Object.keys(settings.value.onekeyScoreSelections).forEach((key) => {
if (key.startsWith(currentKey)) {
delete settings.value.onekeyScoreSelections[key]
}
})
//
newOrder.forEach((score) => {
updateOnekeyScoreSelection(
settings.value.stepSize,
props.fullScore,
score,
true,
settings.value.onekeyScoreSelections,
)
})
} }
else { else {
settings.value.quickScoreScores = newOrder settings.value.quickScoreScores = newOrder
@ -134,15 +138,15 @@ const canAddMoreSteps = computed(() => {
// //
function toggleCommonScore(score: number) { function toggleCommonScore(score: number) {
if (activeTab.value === 'onekey') { if (activeTab.value === 'onekey') {
const currentScores = [...settings.value.onekeyScoreScores] //
const index = currentScores.indexOf(score) const isCurrentlySelected = selectedCommonScores.value.includes(score)
if (index > -1) { updateOnekeyScoreSelection(
currentScores.splice(index, 1) settings.value.stepSize,
} props.fullScore,
else { score,
currentScores.push(score) !isCurrentlySelected,
} settings.value.onekeyScoreSelections,
settings.value.onekeyScoreScores = currentScores )
} }
else { else {
const currentScores = [...settings.value.quickScoreScores] const currentScores = [...settings.value.quickScoreScores]
@ -235,7 +239,9 @@ function cancelCustomInput() {
// //
function resetSortOrder() { function resetSortOrder() {
if (activeTab.value === 'onekey') { if (activeTab.value === 'onekey') {
settings.value.onekeyScoreScores = [...settings.value.onekeyScoreScores].sort((a, b) => a - b) // draggableScores
const sortedScores = [...selectedCommonScores.value].sort((a, b) => a - b)
draggableScores.value = sortedScores
} }
else { else {
settings.value.quickScoreScores = [...settings.value.quickScoreScores].sort((a, b) => a - b) settings.value.quickScoreScores = [...settings.value.quickScoreScores].sort((a, b) => a - b)
@ -257,7 +263,13 @@ function confirm() {
} }
function resetOnekeyScoreScores() { function resetOnekeyScoreScores() {
settings.value.onekeyScoreScores = [] //
const currentKey = `${settings.value.stepSize}_${props.fullScore}`
Object.keys(settings.value.onekeyScoreSelections).forEach((key) => {
if (key.startsWith(currentKey)) {
delete settings.value.onekeyScoreSelections[key]
}
})
} }
function resetQuickScoreScores() { function resetQuickScoreScores() {

View File

@ -42,8 +42,8 @@ export interface MarkingSettings {
quickScoreMode: 'onekey' | 'quick' quickScoreMode: 'onekey' | 'quick'
quickScoreLayout: 'single' | 'double' quickScoreLayout: 'single' | 'double'
// 一键打分相关设置 // 一键打分相关设置 - 保存用户自定义的选择状态(哪些分数被选中)
onekeyScoreScores: number[] onekeyScoreSelections: Record<string, boolean> // key: "stepSize_fullScore", value: 是否选中该分数
// 缩放控制面板相关设置 // 缩放控制面板相关设置
showScalePanel: boolean showScalePanel: boolean
@ -87,8 +87,8 @@ const defaultSettings: MarkingSettings = {
quickScoreScores: [1, 2], quickScoreScores: [1, 2],
quickScoreLayout: 'single', quickScoreLayout: 'single',
// 一键打分默认值 // 一键打分默认值 - 用户选择状态
onekeyScoreScores: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], onekeyScoreSelections: {},
// 缩放控制面板默认值 // 缩放控制面板默认值
showScalePanel: true, showScalePanel: true,
@ -97,6 +97,70 @@ const defaultSettings: MarkingSettings = {
export const markingSettings = useStorage<MarkingSettings>('marking_settings', defaultSettings) export const markingSettings = useStorage<MarkingSettings>('marking_settings', defaultSettings)
/**
*
* @param stepSize
* @param fullScore
* @returns
*/
export function generateOnekeyScores(stepSize: number, fullScore: number): number[] {
const scores: number[] = []
const max = Math.max(fullScore, 2)
for (let i = 0; i <= max; i += stepSize) {
scores.push(i)
}
return scores
}
/**
*
* @param stepSize
* @param fullScore
* @param selections
* @returns
*/
export function getSelectedOnekeyScores(
stepSize: number,
fullScore: number,
selections: Record<string, boolean>,
): number[] {
const allScores = generateOnekeyScores(stepSize, fullScore)
const selectionKey = `${stepSize}_${fullScore}`
// 如果没有保存的选择状态,默认全选
const hasSelections = Object.keys(selections).some(key => key.startsWith(`${stepSize}_`))
if (!hasSelections) {
return allScores
}
// 根据保存的选择状态过滤
return allScores.filter((score) => {
const scoreKey = `${selectionKey}_${score}`
return selections[scoreKey] !== false // 默认选中除非明确设置为false
})
}
/**
*
* @param stepSize
* @param fullScore
* @param score
* @param selected
* @param selections
*/
export function updateOnekeyScoreSelection(
stepSize: number,
fullScore: number,
score: number,
selected: boolean,
selections: Record<string, boolean>,
): void {
const selectionKey = `${stepSize}_${fullScore}_${score}`
selections[selectionKey] = selected
}
export function useMarkingSettings() { export function useMarkingSettings() {
return markingSettings return markingSettings
} }