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>
|
<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(),
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue