feat: 提示最大单次抽奖人数为30

This commit is contained in:
log1997
2026-01-16 15:27:03 +08:00
parent 54b53bf9ce
commit 7296f01c3c
4 changed files with 70 additions and 8 deletions

View File

@@ -0,0 +1,57 @@
<script setup lang='ts'>
import { CircleAlert, CircleCheck, Info, TriangleAlert } from 'lucide-vue-next'
import { computed } from 'vue'
interface Props {
tip: string
type?: 'success' | 'warning' | 'error' | 'info'
direction?: 'top' | 'bottom' | 'left' | 'right'
size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'
}
const props = withDefaults(defineProps<Props>(), {
type: 'info',
direction: 'top',
size: 'sm',
})
const sizeObj = {
'2xs': 'w-2 h-2',
'xs': 'w-3 h-3',
'sm': 'w-4 h-4',
'md': 'w-5 h-5',
'lg': 'w-6 h-6',
'xl': 'w-7 h-7',
'2xl': 'w-8 h-8',
}
const tipClassNames = computed(() => {
return [
`tooltip-${props.direction}`,
]
})
const iconClassNames = computed(() => {
return [
`w-${sizeObj[props.size]}`,
]
})
</script>
<template>
<div class="tooltip" :class="tipClassNames" :data-tip="tip">
<slot name="content" />
<slot>
<div :class="iconClassNames" class="hover:text-primary cursor-pointer">
<CircleAlert v-if="type === 'warning'" class="w-full h-full text-warning" />
<Info v-else-if="type === 'info'" class="w-full h-full" />
<CircleCheck v-else-if="type === 'success'" class="w-full h-full text-success" />
<TriangleAlert v-else-if="type === 'error'" class="w-full h-full text-error" />
</div>
</slot>
</div>
</template>
<style scoped>
</style>

View File

@@ -1,5 +1 @@
export { default as Footer } from './Footer/index.vue' export { default as HoverTip } from './HoverTip/index.vue'
/**
*title: 自动导出组件
*/
export { default as Header } from './Header/index.vue'

View File

@@ -1,3 +1,5 @@
import { SINGLE_TIME_MAX_PERSON_COUNT } from '@/constant/config'
export const tooltipEn = { export const tooltipEn = {
settingConfiguration: 'Setting/Configuration', settingConfiguration: 'Setting/Configuration',
nextSong: 'Right Click to Next Song', nextSong: 'Right Click to Next Song',
@@ -16,6 +18,7 @@ export const tooltipEn = {
timedStop: 'After the lottery begins, it will stop at a scheduled time by default, set to 0, with the unit in seconds. A value of 0 disables the scheduled stopping function', timedStop: 'After the lottery begins, it will stop at a scheduled time by default, set to 0, with the unit in seconds. A value of 0 disables the scheduled stopping function',
uploadImage: 'Upload Image', uploadImage: 'Upload Image',
pleaseGoto: 'Please go to', pleaseGoto: 'Please go to',
onceNumberMax: `The maximum quantity for a single extraction is ${SINGLE_TIME_MAX_PERSON_COUNT}. If it exceeds ${SINGLE_TIME_MAX_PERSON_COUNT}, it will be automatically extracted in batches for you`,
} }
export const tooltipZhCn = { export const tooltipZhCn = {
@@ -36,6 +39,7 @@ export const tooltipZhCn = {
timedStop: '开始抽奖过后定时停止默认为0单位为秒0为关闭定时停止功能', timedStop: '开始抽奖过后定时停止默认为0单位为秒0为关闭定时停止功能',
uploadImage: '上传图片', uploadImage: '上传图片',
pleaseGoto: '请先前往', pleaseGoto: '请先前往',
onceNumberMax: `单次抽取数量最大为${SINGLE_TIME_MAX_PERSON_COUNT},若设置超过${SINGLE_TIME_MAX_PERSON_COUNT}会自动为您分批次抽取`,
} }
export const tooltip = { export const tooltip = {

View File

@@ -2,6 +2,7 @@
import { Grip } from 'lucide-vue-next' import { Grip } from 'lucide-vue-next'
import { VueDraggable } from 'vue-draggable-plus' import { VueDraggable } from 'vue-draggable-plus'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { HoverTip } from '@/components/index'
import EditSeparateDialog from '@/components/NumberSeparate/EditSeparateDialog.vue' import EditSeparateDialog from '@/components/NumberSeparate/EditSeparateDialog.vue'
import PageHeader from '@/components/PageHeader/index.vue' import PageHeader from '@/components/PageHeader/index.vue'
import { usePrizeConfig } from './usePrizeConfig' import { usePrizeConfig } from './usePrizeConfig'
@@ -69,7 +70,7 @@ const { t } = useI18n()
@change="item.isAll = !item.isAll" @change="item.isAll = !item.isAll"
> >
</label> </label>
<label class="w-1/2 max-w-xs form-control"> <label class="w-1/2 max-w-2xl form-control">
<div class="label"> <div class="label">
<span class="label-text">{{ t('table.numberParticipants') }}</span> <span class="label-text">{{ t('table.numberParticipants') }}</span>
</div> </div>
@@ -77,8 +78,8 @@ const { t } = useI18n()
v-model="item.count" type="number" :placeholder="t('placeHolder.winnerCount')" class="w-full max-w-xs p-0 m-0 input-sm input input-bordered" v-model="item.count" type="number" :placeholder="t('placeHolder.winnerCount')" class="w-full max-w-xs p-0 m-0 input-sm input input-bordered"
@change="changePrizePerson(item)" @change="changePrizePerson(item)"
> >
<div class="tooltip tooltip-bottom" :data-tip="`${t('table.isDone') + item.isUsedCount}/${item.count}`"> <div class="tooltip tooltip-bottom w-full" :data-tip="`${t('table.isDone') + item.isUsedCount}/${item.count}`">
<progress class="w-full progress" :value="item.isUsedCount" :max="item.count" /> <progress class="progress w-full" :value="item.isUsedCount" :max="item.count" />
</div> </div>
</label> </label>
<label class="flex items-center w-1/2 max-w-xs gap-2 form-control"> <label class="flex items-center w-1/2 max-w-xs gap-2 form-control">
@@ -105,7 +106,11 @@ const { t } = useI18n()
<label v-if="item.separateCount" class="w-full max-w-xs form-control"> <label v-if="item.separateCount" class="w-full max-w-xs form-control">
<div class="label"> <div class="label">
<span class="label-text">{{ t('table.onceNumber') }}</span> <span class="label-text">{{ t('table.onceNumber') }}</span>
<HoverTip
:tip="t('tooltip.onceNumberMax')"
/>
</div> </div>
<div class="flex justify-start w-full h-full" @click="selectPrize(item)"> <div class="flex justify-start w-full h-full" @click="selectPrize(item)">
<ul <ul
v-if="item.separateCount.countList.length" v-if="item.separateCount.countList.length"