Merge branch 'master' of https://xlx.vintom.cn/code/xlx_teacher_app
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
commit
0bd3e761ca
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue