refactor: 一键打分分数按题目隔离
continuous-integration/drone/push Build is passing Details

This commit is contained in:
AfyerCu 2025-09-20 21:31:40 +08:00
parent 3199fb7748
commit c2212f6b77
3 changed files with 130 additions and 48 deletions

View File

@ -1,7 +1,7 @@
<script lang="ts" setup>
import { computed, ref } from 'vue'
import { useMarkingData } from '@/components/marking/composables/useMarkingData'
import { useMarkingSettings } from '@/components/marking/composables/useMarkingSettings'
import { getSelectedOnekeyScores, useMarkingSettings } from '@/components/marking/composables/useMarkingSettings'
interface Props {
isLandscape?: boolean
@ -37,8 +37,14 @@ const isCollapsed = ref(false)
//
const displayItems = computed(() => {
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,
value: score,
label: score.toString(),

View File

@ -1,7 +1,12 @@
<script lang="ts" setup>
import { computed, ref } from 'vue'
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 {
modelValue: boolean
@ -42,16 +47,8 @@ const stepOptions = [0.5, 1, 2, 3, 4, 5]
// -
const commonScores = computed(() => {
if (activeTab.value === 'onekey') {
// ScoreKeyboard.vue
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)
}
return numbers
//
return generateOnekeyScores(settings.value.stepSize, props.fullScore)
}
else {
//
@ -62,23 +59,7 @@ const commonScores = computed(() => {
//
function selectStepSize(step: number) {
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(() => {
if (activeTab.value === 'onekey') {
return settings.value.onekeyScoreScores
//
return getSelectedOnekeyScores(
settings.value.stepSize,
props.fullScore,
settings.value.onekeyScoreSelections,
)
}
else {
return settings.value.quickScoreScores
@ -102,7 +88,25 @@ const draggableScores = computed({
},
set: (newOrder: number[]) => {
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 {
settings.value.quickScoreScores = newOrder
@ -134,15 +138,15 @@ const canAddMoreSteps = computed(() => {
//
function toggleCommonScore(score: number) {
if (activeTab.value === 'onekey') {
const currentScores = [...settings.value.onekeyScoreScores]
const index = currentScores.indexOf(score)
if (index > -1) {
currentScores.splice(index, 1)
}
else {
currentScores.push(score)
}
settings.value.onekeyScoreScores = currentScores
//
const isCurrentlySelected = selectedCommonScores.value.includes(score)
updateOnekeyScoreSelection(
settings.value.stepSize,
props.fullScore,
score,
!isCurrentlySelected,
settings.value.onekeyScoreSelections,
)
}
else {
const currentScores = [...settings.value.quickScoreScores]
@ -235,7 +239,9 @@ function cancelCustomInput() {
//
function resetSortOrder() {
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 {
settings.value.quickScoreScores = [...settings.value.quickScoreScores].sort((a, b) => a - b)
@ -257,7 +263,13 @@ function confirm() {
}
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() {

View File

@ -42,8 +42,8 @@ export interface MarkingSettings {
quickScoreMode: 'onekey' | 'quick'
quickScoreLayout: 'single' | 'double'
// 一键打分相关设置
onekeyScoreScores: number[]
// 一键打分相关设置 - 保存用户自定义的选择状态(哪些分数被选中)
onekeyScoreSelections: Record<string, boolean> // key: "stepSize_fullScore", value: 是否选中该分数
// 缩放控制面板相关设置
showScalePanel: boolean
@ -87,8 +87,8 @@ const defaultSettings: MarkingSettings = {
quickScoreScores: [1, 2],
quickScoreLayout: 'single',
// 一键打分默认值
onekeyScoreScores: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
// 一键打分默认值 - 用户选择状态
onekeyScoreSelections: {},
// 缩放控制面板默认值
showScalePanel: true,
@ -97,6 +97,70 @@ const defaultSettings: MarkingSettings = {
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() {
return markingSettings
}