Compare commits
4 Commits
c5c19abe18
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36371ab601 | ||
|
|
6889fdee1f | ||
|
|
30ea764c44 | ||
|
|
c7025db514 |
16
docker-compose.yml
Normal file
16
docker-compose.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
log-lottery:
|
||||||
|
image: harbor.lnh2e.com/lingniu-v1/log-lottery:main-0.6.0-5
|
||||||
|
ports:
|
||||||
|
- "8029:80"
|
||||||
|
deploy:
|
||||||
|
replicas: 1
|
||||||
|
restart_policy:
|
||||||
|
condition: on-failure
|
||||||
|
placement:
|
||||||
|
constraints: [node.role == manager]
|
||||||
|
labels:
|
||||||
|
- portainer.hide=false
|
||||||
|
- project=lingniu
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
"autoprefixer": "^10.4.23",
|
"autoprefixer": "^10.4.23",
|
||||||
"baseline-browser-mapping": "^2.9.11",
|
"baseline-browser-mapping": "^2.9.11",
|
||||||
"child_process": "^1.0.2",
|
"child_process": "^1.0.2",
|
||||||
"daisyui": "^5.5.14",
|
"daisyui": "^5.5.19",
|
||||||
"eslint": "^9.39.2",
|
"eslint": "^9.39.2",
|
||||||
"eslint-plugin-vue": "^10.6.2",
|
"eslint-plugin-vue": "^10.6.2",
|
||||||
"fast-glob": "^3.3.3",
|
"fast-glob": "^3.3.3",
|
||||||
|
|||||||
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -196,8 +196,8 @@ importers:
|
|||||||
specifier: ^1.0.2
|
specifier: ^1.0.2
|
||||||
version: 1.0.2
|
version: 1.0.2
|
||||||
daisyui:
|
daisyui:
|
||||||
specifier: ^5.5.14
|
specifier: ^5.5.19
|
||||||
version: 5.5.14
|
version: 5.5.19
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^9.39.2
|
specifier: ^9.39.2
|
||||||
version: 9.39.2(jiti@2.6.1)
|
version: 9.39.2(jiti@2.6.1)
|
||||||
@@ -2448,8 +2448,8 @@ packages:
|
|||||||
csstype@3.2.3:
|
csstype@3.2.3:
|
||||||
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
|
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
|
||||||
|
|
||||||
daisyui@5.5.14:
|
daisyui@5.5.19:
|
||||||
resolution: {integrity: sha512-L47rvw7I7hK68TA97VB8Ee0woHew+/ohR6Lx6Ah/krfISOqcG4My7poNpX5Mo5/ytMxiR40fEaz6njzDi7cuSg==}
|
resolution: {integrity: sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==}
|
||||||
|
|
||||||
data-urls@6.0.0:
|
data-urls@6.0.0:
|
||||||
resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==}
|
resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==}
|
||||||
@@ -7638,7 +7638,7 @@ snapshots:
|
|||||||
|
|
||||||
csstype@3.2.3: {}
|
csstype@3.2.3: {}
|
||||||
|
|
||||||
daisyui@5.5.14: {}
|
daisyui@5.5.19: {}
|
||||||
|
|
||||||
data-urls@6.0.0:
|
data-urls@6.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export const dataEn = {
|
|||||||
operation: 'Operation',
|
operation: 'Operation',
|
||||||
delete: 'Delete',
|
delete: 'Delete',
|
||||||
removePerson: 'Remove the Person',
|
removePerson: 'Remove the Person',
|
||||||
defaultTitle: 'The Prelude to the Six Ministries of the Ming Dynasty Cabinet',
|
defaultTitle: 'Stellar Moments · Tribute to the Driven',
|
||||||
xlsxName: 'personListTemplate-en.xlsx',
|
xlsxName: 'personListTemplate-en.xlsx',
|
||||||
readmeName: 'readme-en.md',
|
readmeName: 'readme-en.md',
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ export const dataZhCn = {
|
|||||||
operation: '操作',
|
operation: '操作',
|
||||||
delete: '删除',
|
delete: '删除',
|
||||||
removePerson: '移入未中奖名单',
|
removePerson: '移入未中奖名单',
|
||||||
defaultTitle: '「氢」春正好,牛人闪耀',
|
defaultTitle: '星耀时刻,致敬奋斗者',
|
||||||
xlsxName: '人口登记表-zhCn.xlsx',
|
xlsxName: '人口登记表-zhCn.xlsx',
|
||||||
readmeName: 'readme-zhCn.md',
|
readmeName: 'readme-zhCn.md',
|
||||||
}
|
}
|
||||||
|
|||||||
16
src/main.ts
16
src/main.ts
@@ -38,6 +38,22 @@ import 'virtual:svg-icons-register'
|
|||||||
// 更新CSS变量
|
// 更新CSS变量
|
||||||
document.documentElement.style.setProperty('--app-font-family', `"${globalConfig.theme.font}", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif`)
|
document.documentElement.style.setProperty('--app-font-family', `"${globalConfig.theme.font}", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 一次性迁移旧的默认标题,确保已有用户也能看到新文案
|
||||||
|
const legacyTitles = new Set([
|
||||||
|
'「氢」春正好,牛人闪耀',
|
||||||
|
'The Prelude to the Six Ministries of the Ming Dynasty Cabinet',
|
||||||
|
])
|
||||||
|
if (globalConfig.topTitle && legacyTitles.has(globalConfig.topTitle)) {
|
||||||
|
const isEn = globalConfig.language === 'en'
|
||||||
|
globalConfig.topTitle = isEn
|
||||||
|
? 'Stellar Moments · Tribute to the Driven'
|
||||||
|
: '星耀时刻,致敬奋斗者'
|
||||||
|
if (storageData.globalConfig) {
|
||||||
|
storageData.globalConfig = globalConfig
|
||||||
|
}
|
||||||
|
localStorage.setItem('globalConfig', JSON.stringify(storageData.globalConfig ? storageData : globalConfig))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
|||||||
@@ -40,22 +40,26 @@ const { t } = useI18n()
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="absolute z-10 flex flex-col items-center justify-center -translate-x-1/2 left-1/2">
|
<div class="absolute z-10 flex flex-col items-center justify-center -translate-x-1/2 left-1/2">
|
||||||
<h2
|
<div class="lingniu-title-row pt-12 mb-12">
|
||||||
class="pt-12 m-0 mb-12 tracking-wide text-center leading-12"
|
<span v-if="!isTextColor" class="title-ornament title-ornament--left" aria-hidden="true" />
|
||||||
:class="{ 'animate-pulse bg-linear-to-r from-primary via-secondary to-accent bg-clip-text text-transparent': !isTextColor }"
|
<h2
|
||||||
:style="titleStyle"
|
class="lingniu-title-text m-0 text-center"
|
||||||
>
|
:class="{ 'lingniu-title-gradient': !isTextColor }"
|
||||||
{{ topTitle }}
|
:style="titleStyle"
|
||||||
</h2>
|
>
|
||||||
|
{{ topTitle }}
|
||||||
|
</h2>
|
||||||
|
<span v-if="!isTextColor" class="title-ornament title-ornament--right" aria-hidden="true" />
|
||||||
|
</div>
|
||||||
<div v-if="isInitialDone" class="flex gap-3">
|
<div v-if="isInitialDone" class="flex gap-3">
|
||||||
<button
|
<button
|
||||||
v-if="tableData.length <= 0" class="cursor-pointer btn btn-outline btn-secondary btn-lg"
|
v-if="tableData.length <= 0" class="cursor-pointer btn btn-outline btn-lg lingniu-btn"
|
||||||
@click="router.push('config')"
|
@click="router.push('config')"
|
||||||
>
|
>
|
||||||
{{ t('button.noInfoAndImport') }}
|
{{ t('button.noInfoAndImport') }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
v-if="tableData.length <= 0" class="cursor-pointer btn btn-outline btn-secondary btn-lg"
|
v-if="tableData.length <= 0" class="cursor-pointer btn btn-outline btn-lg lingniu-btn"
|
||||||
@click="setDefaultPersonList"
|
@click="setDefaultPersonList"
|
||||||
>
|
>
|
||||||
{{ t('button.useDefault') }}
|
{{ t('button.useDefault') }}
|
||||||
@@ -70,11 +74,132 @@ const { t } = useI18n()
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.header-title {
|
.lingniu-title-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
gap: 28px;
|
||||||
|
white-space: nowrap;
|
||||||
-webkit-animation: tracking-in-expand-fwd 0.8s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
|
-webkit-animation: tracking-in-expand-fwd 0.8s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
|
||||||
animation: tracking-in-expand-fwd 0.8s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
|
animation: tracking-in-expand-fwd 0.8s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lingniu-title-text {
|
||||||
|
line-height: 1.2;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.22em;
|
||||||
|
padding-inline: 0.22em; // 防止letter-spacing截断尾字渐变
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lingniu-title-gradient {
|
||||||
|
background: linear-gradient(
|
||||||
|
110deg,
|
||||||
|
#2F2828 0%,
|
||||||
|
#007143 18%,
|
||||||
|
#12a86b 36%,
|
||||||
|
#f5d27a 50%,
|
||||||
|
#12a86b 64%,
|
||||||
|
#007143 82%,
|
||||||
|
#2F2828 100%
|
||||||
|
);
|
||||||
|
background-size: 220% 100%;
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
color: transparent;
|
||||||
|
filter: drop-shadow(0 6px 24px rgba(0, 113, 67, 0.35));
|
||||||
|
animation: lingniu-shine 6s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-ornament {
|
||||||
|
--ornament-w: clamp(56px, 12vw, 140px);
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: var(--ornament-w);
|
||||||
|
height: 1px;
|
||||||
|
background: linear-gradient(to right, transparent 0%, rgba(0, 113, 67, 0.05) 10%, #007143 50%, rgba(0, 113, 67, 0.05) 90%, transparent 100%);
|
||||||
|
flex: none;
|
||||||
|
|
||||||
|
&::before,
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
transform: translateY(-50%) rotate(45deg);
|
||||||
|
background: linear-gradient(135deg, #f5d27a 0%, #d4a960 100%);
|
||||||
|
box-shadow:
|
||||||
|
0 0 14px rgba(0, 113, 67, 0.55),
|
||||||
|
0 0 4px rgba(245, 210, 122, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--left {
|
||||||
|
&::before {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -4px;
|
||||||
|
background: linear-gradient(135deg, #007143 0%, #12a86b 100%);
|
||||||
|
}
|
||||||
|
&::after {
|
||||||
|
right: -4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--right {
|
||||||
|
&::before {
|
||||||
|
left: -4px;
|
||||||
|
}
|
||||||
|
&::after {
|
||||||
|
right: 50%;
|
||||||
|
margin-right: -4px;
|
||||||
|
background: linear-gradient(135deg, #007143 0%, #12a86b 100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lingniu-btn {
|
||||||
|
--btn-color: #007143;
|
||||||
|
--btn-color-hover: #12a86b;
|
||||||
|
color: #fff;
|
||||||
|
border-color: rgba(0, 113, 67, 0.6);
|
||||||
|
background: rgba(0, 113, 67, 0.08);
|
||||||
|
backdrop-filter: blur(6px);
|
||||||
|
box-shadow:
|
||||||
|
0 4px 18px rgba(0, 113, 67, 0.18),
|
||||||
|
inset 0 0 0 1px rgba(245, 210, 122, 0.12);
|
||||||
|
transition: transform 0.25s ease, box-shadow 0.25s ease, background 0.25s ease, border-color 0.25s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: linear-gradient(135deg, rgba(0, 113, 67, 0.85), rgba(18, 168, 107, 0.85));
|
||||||
|
border-color: rgba(245, 210, 122, 0.7);
|
||||||
|
box-shadow:
|
||||||
|
0 10px 28px rgba(0, 113, 67, 0.45),
|
||||||
|
inset 0 0 0 1px rgba(245, 210, 122, 0.45);
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.lingniu-title-row {
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
.title-ornament {
|
||||||
|
--ornament-w: 36px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes lingniu-shine {
|
||||||
|
0% {
|
||||||
|
background-position: 200% 50%;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
background-position: -200% 50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@-webkit-keyframes tracking-in-expand-fwd {
|
@-webkit-keyframes tracking-in-expand-fwd {
|
||||||
0% {
|
0% {
|
||||||
letter-spacing: -0.5em;
|
letter-spacing: -0.5em;
|
||||||
|
|||||||
@@ -5,13 +5,17 @@
|
|||||||
|
|
||||||
<!-- 顶部标题 -->
|
<!-- 顶部标题 -->
|
||||||
<div class="header-wrapper">
|
<div class="header-wrapper">
|
||||||
<h2
|
<div class="lingniu-title-row">
|
||||||
class="page-title"
|
<span v-if="!isTextColor" class="title-ornament title-ornament--left" aria-hidden="true" />
|
||||||
:class="{ 'animate-pulse bg-linear-to-r from-primary via-secondary to-accent bg-clip-text text-transparent': !isTextColor }"
|
<h2
|
||||||
:style="titleStyle"
|
class="page-title lingniu-title-text"
|
||||||
>
|
:class="{ 'lingniu-title-gradient': !isTextColor }"
|
||||||
{{ topTitle }}
|
:style="titleStyle"
|
||||||
</h2>
|
>
|
||||||
|
{{ topTitle }}
|
||||||
|
</h2>
|
||||||
|
<span v-if="!isTextColor" class="title-ornament title-ornament--right" aria-hidden="true" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 抽奖进度和重置按钮 -->
|
<!-- 抽奖进度和重置按钮 -->
|
||||||
@@ -775,14 +779,127 @@ onUnmounted(() => {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-title {
|
.lingniu-title-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
white-space: nowrap;
|
||||||
|
gap: 28px;
|
||||||
padding-top: 48px;
|
padding-top: 48px;
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 48px;
|
margin-bottom: 48px;
|
||||||
letter-spacing: 0.05em;
|
-webkit-animation: tracking-in-expand-fwd 0.8s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
|
||||||
|
animation: tracking-in-expand-fwd 0.8s cubic-bezier(0.215, 0.610, 0.355, 1.000) both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-title {
|
||||||
|
margin: 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 3rem;
|
line-height: 1.2;
|
||||||
font-weight: normal;
|
}
|
||||||
|
|
||||||
|
.lingniu-title-text {
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.22em;
|
||||||
|
padding-inline: 0.22em;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lingniu-title-gradient {
|
||||||
|
background: linear-gradient(
|
||||||
|
110deg,
|
||||||
|
#2F2828 0%,
|
||||||
|
#007143 18%,
|
||||||
|
#12a86b 36%,
|
||||||
|
#f5d27a 50%,
|
||||||
|
#12a86b 64%,
|
||||||
|
#007143 82%,
|
||||||
|
#2F2828 100%
|
||||||
|
);
|
||||||
|
background-size: 220% 100%;
|
||||||
|
background-clip: text;
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
color: transparent;
|
||||||
|
filter: drop-shadow(0 6px 24px rgba(0, 113, 67, 0.35));
|
||||||
|
animation: lingniu-shine 6s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-ornament {
|
||||||
|
--ornament-w: clamp(56px, 12vw, 140px);
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: var(--ornament-w);
|
||||||
|
height: 1px;
|
||||||
|
flex: none;
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(0, 113, 67, 0.05) 10%,
|
||||||
|
#007143 50%,
|
||||||
|
rgba(0, 113, 67, 0.05) 90%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-ornament::before,
|
||||||
|
.title-ornament::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
transform: translateY(-50%) rotate(45deg);
|
||||||
|
background: linear-gradient(135deg, #f5d27a 0%, #d4a960 100%);
|
||||||
|
box-shadow:
|
||||||
|
0 0 14px rgba(0, 113, 67, 0.55),
|
||||||
|
0 0 4px rgba(245, 210, 122, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-ornament--left::before {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -4px;
|
||||||
|
background: linear-gradient(135deg, #007143 0%, #12a86b 100%);
|
||||||
|
}
|
||||||
|
.title-ornament--left::after {
|
||||||
|
right: -4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-ornament--right::before {
|
||||||
|
left: -4px;
|
||||||
|
}
|
||||||
|
.title-ornament--right::after {
|
||||||
|
right: 50%;
|
||||||
|
margin-right: -4px;
|
||||||
|
background: linear-gradient(135deg, #007143 0%, #12a86b 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.lingniu-title-row {
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
.title-ornament {
|
||||||
|
--ornament-w: 36px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes lingniu-shine {
|
||||||
|
0% { background-position: 200% 50%; }
|
||||||
|
100% { background-position: -200% 50%; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes tracking-in-expand-fwd {
|
||||||
|
0% {
|
||||||
|
letter-spacing: -0.5em;
|
||||||
|
transform: translateZ(-700px);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
40% { opacity: 0.6; }
|
||||||
|
100% {
|
||||||
|
transform: translateZ(0);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.prize-info {
|
.prize-info {
|
||||||
|
|||||||
Reference in New Issue
Block a user