Merge pull request #101 from LOG1997/94-添加软件打包tauri

94 添加软件打包tauri
This commit is contained in:
LOG1997
2025-12-09 23:25:54 +08:00
committed by GitHub
12 changed files with 493 additions and 358 deletions

View File

@@ -5,7 +5,7 @@ name: Node.js CI
on: on:
pull_request: pull_request:
branches: [ "main" ] branches: [main]
jobs: jobs:
build: build:
@@ -19,26 +19,24 @@ jobs:
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: pnpm/action-setup@v2 - uses: pnpm/action-setup@v2
with: with:
version: 8 version: 8
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
cache: 'pnpm' cache: pnpm
- run: pnpm install - run: pnpm install
- run: pnpm build - run: pnpm build
- name: Copy and Rename index.html to dist - name: Copy and Rename index.html to dist
run: cp dist/index.html dist/404.html run: cp dist/index.html dist/404.html
- name: Deploy to gh-pages
uses: crazy-max/ghaction-github-pages@v2
with:
target_branch: gh-pages
build_dir: dist
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
- name: Deploy to gh-pages
uses: crazy-max/ghaction-github-pages@v2
with:
target_branch: gh-pages
build_dir: dist
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}

View File

@@ -6,9 +6,8 @@ on:
- 'v*' - 'v*'
jobs: jobs:
build-and-release: build-web:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
@@ -26,18 +25,18 @@ jobs:
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: '22.x' node-version: 22.x
cache: 'pnpm' cache: pnpm
- name: Install dependencies - name: Install dependencies
run: pnpm install run: pnpm install
- name: Install dependency fast-glob
run: pnpm add fast-glob -D
- name: Build for production - name: Build for production
run: pnpm build run: pnpm build
- name: Build for file protocol
run: pnpm build:file
- name: Prepare directories - name: Prepare directories
run: | run: |
mv dist dist-prod mv dist dist-prod
@@ -45,18 +44,78 @@ jobs:
- name: Create production build archive - name: Create production build archive
run: | run: |
tar -czf dist.tar.gz dist-prod zip -r dist.zip dist-prod
- name: Create file protocol build archive - name: Upload web build artifact
run: | uses: actions/upload-artifact@v4
tar -czf dist-file.tar.gz dist-file with:
name: web-build
path: dist.zip
- name: Release publish-tauri:
permissions:
contents: write
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: ./src-tauri -> target
- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 8
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 22.x
cache: pnpm
- name: Install frontend dependencies
run: pnpm install
- name: Install dependency fast-glob
run: pnpm add fast-glob -D
- name: Build the app
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tagName: ${{ github.ref_name }}
releaseName: 'Release ${{ github.ref_name }}'
releaseBody: See the assets to download this version and install.
releaseDraft: true
prerelease: false
run: pnpm tauri build
release:
needs: [build-web, publish-tauri]
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Download web build artifact
uses: actions/download-artifact@v4
with:
name: web-build
- name: Create Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
with: with:
files: | files: |
dist.tar.gz dist.zip
dist-file.tar.gz name: 'Release ${{ github.ref_name }}'
draft: true draft: true
prerelease: false prerelease: false
generate_release_notes: true generate_release_notes: true

2
.gitignore vendored
View File

@@ -35,6 +35,8 @@ bower_components
# node-waf configuration # node-waf configuration
.lock-wscript .lock-wscript
pnpm-lock.yaml
# Compiled binary addons (https://nodejs.org/api/addons.html) # Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release build/Release

22
build/syncVersion.js Normal file
View File

@@ -0,0 +1,22 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 读取 package.json 版本号
const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
const version = packageJson.version;
// 读取并更新 tauri.conf.json
const tauriConfPath = path.join(__dirname, '..', 'src-tauri', 'tauri.conf.json');
const tauriConf = JSON.parse(fs.readFileSync(tauriConfPath, 'utf8'));
// 更新版本号
tauriConf.version = version;
// 写回 tauri.conf.json
fs.writeFileSync(tauriConfPath, JSON.stringify(tauriConf, null, 2));
console.log(`Tauri 配置版本号已同步至: ${version}`);

View File

@@ -2,7 +2,7 @@ import antfu from '@antfu/eslint-config'
export default antfu( export default antfu(
{ {
ignores: ['**/node_modules', '**/public', '**/dist', '**/package.json', '**/*.yaml', '**/.gitignore', '**/.env*', '**/tsconfig*', '**/*.config.js'], ignores: ['**/node_modules', '**/build', '**/public', '**/dist', '**/package.json', '**/*.yaml', '**/.gitignore', '**/.env*', '**/tsconfig*', '**/*.config.js'],
}, },
{ {
rules: { rules: {

View File

@@ -9,6 +9,7 @@
"build": "vue-tsc --noEmit && vite build", "build": "vue-tsc --noEmit && vite build",
"build:pre": "vue-tsc --noEmit && vite build --mode prebuild", "build:pre": "vue-tsc --noEmit && vite build --mode prebuild",
"build:file": "vue-tsc --noEmit && vite build --mode file", "build:file": "vue-tsc --noEmit && vite build --mode file",
"tauri":"node ./build/syncVersion.js && tauri",
"test": "vitest", "test": "vitest",
"test:ui": "vitest --ui", "test:ui": "vitest --ui",
"preview": "vite preview", "preview": "vite preview",
@@ -30,8 +31,8 @@
"pinia": "^3.0.3", "pinia": "^3.0.3",
"pinia-plugin-persist": "^1.0.0", "pinia-plugin-persist": "^1.0.0",
"sparticles": "^1.3.1", "sparticles": "^1.3.1",
"three": "^0.166.0", "three": "0.166.0",
"three-css3d": "^1.0.6", "three-css3d": "1.0.6",
"uuid": "^13.0.0", "uuid": "^13.0.0",
"vue": "^3.5.13", "vue": "^3.5.13",
"vue-dompurify-html": "^5.2.0", "vue-dompurify-html": "^5.2.0",
@@ -57,7 +58,7 @@
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/markdown-it": "^14.1.2", "@types/markdown-it": "^14.1.2",
"@types/node": "^24.10.2", "@types/node": "^24.10.2",
"@types/three": "^0.166.0", "@types/three": "0.166.0",
"@typescript-eslint/eslint-plugin": "^8.49.0", "@typescript-eslint/eslint-plugin": "^8.49.0",
"@typescript-eslint/parser": "^8.49.0", "@typescript-eslint/parser": "^8.49.0",
"@vitejs/plugin-legacy": "^7.2.1", "@vitejs/plugin-legacy": "^7.2.1",

36
pnpm-lock.yaml generated
View File

@@ -51,10 +51,10 @@ importers:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1 version: 1.3.1
three: three:
specifier: ^0.166.0 specifier: 0.166.0
version: 0.166.0 version: 0.166.0
three-css3d: three-css3d:
specifier: ^1.0.6 specifier: 1.0.6
version: 1.0.6(three@0.166.0) version: 1.0.6(three@0.166.0)
uuid: uuid:
specifier: ^13.0.0 specifier: ^13.0.0
@@ -127,7 +127,7 @@ importers:
specifier: ^24.10.2 specifier: ^24.10.2
version: 24.10.2 version: 24.10.2
'@types/three': '@types/three':
specifier: ^0.166.0 specifier: 0.166.0
version: 0.166.0 version: 0.166.0
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.49.0 specifier: ^8.49.0
@@ -1394,36 +1394,42 @@ packages:
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@parcel/watcher-linux-arm-musl@2.5.0': '@parcel/watcher-linux-arm-musl@2.5.0':
resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@parcel/watcher-linux-arm64-glibc@2.5.0': '@parcel/watcher-linux-arm64-glibc@2.5.0':
resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@parcel/watcher-linux-arm64-musl@2.5.0': '@parcel/watcher-linux-arm64-musl@2.5.0':
resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@parcel/watcher-linux-x64-glibc@2.5.0': '@parcel/watcher-linux-x64-glibc@2.5.0':
resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@parcel/watcher-linux-x64-musl@2.5.0': '@parcel/watcher-linux-x64-musl@2.5.0':
resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@parcel/watcher-win32-arm64@2.5.0': '@parcel/watcher-win32-arm64@2.5.0':
resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==}
@@ -1494,56 +1500,67 @@ packages:
resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.52.0': '@rollup/rollup-linux-arm-musleabihf@4.52.0':
resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.52.0': '@rollup/rollup-linux-arm64-gnu@4.52.0':
resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.52.0': '@rollup/rollup-linux-arm64-musl@4.52.0':
resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.52.0': '@rollup/rollup-linux-loong64-gnu@4.52.0':
resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-gnu@4.52.0': '@rollup/rollup-linux-ppc64-gnu@4.52.0':
resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.52.0': '@rollup/rollup-linux-riscv64-gnu@4.52.0':
resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.52.0': '@rollup/rollup-linux-riscv64-musl@4.52.0':
resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.52.0': '@rollup/rollup-linux-s390x-gnu@4.52.0':
resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.52.0': '@rollup/rollup-linux-x64-gnu@4.52.0':
resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.52.0': '@rollup/rollup-linux-x64-musl@4.52.0':
resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-openharmony-arm64@4.52.0': '@rollup/rollup-openharmony-arm64@4.52.0':
resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==}
@@ -1628,24 +1645,28 @@ packages:
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.13': '@tailwindcss/oxide-linux-arm64-musl@4.1.13':
resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==} resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.13': '@tailwindcss/oxide-linux-x64-gnu@4.1.13':
resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==} resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.13': '@tailwindcss/oxide-linux-x64-musl@4.1.13':
resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==} resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.13': '@tailwindcss/oxide-wasm32-wasi@4.1.13':
resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==} resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==}
@@ -1708,30 +1729,35 @@ packages:
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@tauri-apps/cli-linux-arm64-musl@2.9.5': '@tauri-apps/cli-linux-arm64-musl@2.9.5':
resolution: {integrity: sha512-/gRBMnphS9E8riZ0LIbBhZ9Oy16A2rx/g3DGR0DcDBvUtkLfbL0lMu4s+sY85nkn9An15+cZ1ZK6d7AIqWahLA==} resolution: {integrity: sha512-/gRBMnphS9E8riZ0LIbBhZ9Oy16A2rx/g3DGR0DcDBvUtkLfbL0lMu4s+sY85nkn9An15+cZ1ZK6d7AIqWahLA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@tauri-apps/cli-linux-riscv64-gnu@2.9.5': '@tauri-apps/cli-linux-riscv64-gnu@2.9.5':
resolution: {integrity: sha512-NOzjPF9YIBodjdkFcJmqINT0k3YDoR5ANM/jg6Z6s3Zmk8ScN6inI60jTxcfgfWyITiKsPy7GJyYou3Cm2XNzw==} resolution: {integrity: sha512-NOzjPF9YIBodjdkFcJmqINT0k3YDoR5ANM/jg6Z6s3Zmk8ScN6inI60jTxcfgfWyITiKsPy7GJyYou3Cm2XNzw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@tauri-apps/cli-linux-x64-gnu@2.9.5': '@tauri-apps/cli-linux-x64-gnu@2.9.5':
resolution: {integrity: sha512-SfGbwgvTphM5y+J91NyU/psleMUlyyPkZyDCFg8WU1HX8DpKUT3Vwhb/W1xpUBGb56tJgGCO46FCVkr8w4Areg==} resolution: {integrity: sha512-SfGbwgvTphM5y+J91NyU/psleMUlyyPkZyDCFg8WU1HX8DpKUT3Vwhb/W1xpUBGb56tJgGCO46FCVkr8w4Areg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@tauri-apps/cli-linux-x64-musl@2.9.5': '@tauri-apps/cli-linux-x64-musl@2.9.5':
resolution: {integrity: sha512-ZfeoiASAOGDzyvN+TDAg8A1pCeS082h4uc0vZKvtWUN+9QBIMfz0yJwltAv+SN/afap6NS6DVkbPV3UVuI9V5A==} resolution: {integrity: sha512-ZfeoiASAOGDzyvN+TDAg8A1pCeS082h4uc0vZKvtWUN+9QBIMfz0yJwltAv+SN/afap6NS6DVkbPV3UVuI9V5A==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@tauri-apps/cli-win32-arm64-msvc@2.9.5': '@tauri-apps/cli-win32-arm64-msvc@2.9.5':
resolution: {integrity: sha512-ulg7irow+ekjaK4inFHVq7m1KQebDSYNb17DFKV+h+x7qnLZymz2gHK7df2u4YyEjqvzwRd3AJpU3HNxRurSFQ==} resolution: {integrity: sha512-ulg7irow+ekjaK4inFHVq7m1KQebDSYNb17DFKV+h+x7qnLZymz2gHK7df2u4YyEjqvzwRd3AJpU3HNxRurSFQ==}
@@ -3886,24 +3912,28 @@ packages:
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.30.1: lightningcss-linux-arm64-musl@1.30.1:
resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.30.1: lightningcss-linux-x64-gnu@1.30.1:
resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.30.1: lightningcss-linux-x64-musl@1.30.1:
resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.30.1: lightningcss-win32-arm64-msvc@1.30.1:
resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
"productName": "log-lottery", "productName": "log-lottery",
"version": "0.1.0", "version": "0.0.4",
"identifier": "to2026.xyz", "identifier": "to2026.xyz",
"build": { "build": {
"frontendDist": "../dist", "frontendDist": "../dist",

View File

@@ -1,153 +1,153 @@
export default { export default {
button: { button: {
enterLottery: 'Enter Lottery', enterLottery: 'Enter Lottery',
start: 'Start', start: 'Start',
selectLucky: 'Draw the Lucky', selectLucky: 'Draw the Lucky',
continue: 'Continue', continue: 'Continue',
confirm: 'Confirm', confirm: 'Confirm',
cancel: 'Cancel', cancel: 'Cancel',
setting: 'Setting', setting: 'Setting',
delete: 'Delete', delete: 'Delete',
allDelete: 'Delete All', allDelete: 'Delete All',
downloadTemplate: 'Download Template', downloadTemplate: 'Download Template',
importData: 'Import Data', importData: 'Import Data',
resetData: 'Reset Data', resetData: 'Reset Data',
exportResult: 'Export Result', exportResult: 'Export Result',
add: 'Add', add: 'Add',
resetDefault: 'Reset Default', resetDefault: 'Reset Default',
resetAllData: 'Reset All Data', resetAllData: 'Reset All Data',
clearPattern: 'Clear Pattern', clearPattern: 'Clear Pattern',
DefaultPattern: 'Default Pattern', DefaultPattern: 'Default Pattern',
upload: 'Upload', upload: 'Upload',
reset: 'Reset', reset: 'Reset',
play: 'Play', play: 'Play',
setLayout: 'Set Layout', setLayout: 'Set Layout',
close: 'Close', close: 'Close',
noInfoAndImport: 'No Info and import it', noInfoAndImport: 'No Info and import it',
useDefault: 'Use Default Data', useDefault: 'Use Default Data',
}, },
sidebar: { sidebar: {
personConfiguration: 'Person Configuration', personConfiguration: 'Person Configuration',
personList: 'Person List', personList: 'Person List',
winnerList: 'Winner List', winnerList: 'Winner List',
prizeConfiguration: 'Prize Configuration', prizeConfiguration: 'Prize Configuration',
globalSetting: 'Global Configuration', globalSetting: 'Global Configuration',
viewSetting: 'View Setting', viewSetting: 'View Setting',
imagesManagement: 'Images Management', imagesManagement: 'Images Management',
musicManagement: 'Music Management', musicManagement: 'Music Management',
operatingInstructions: 'Operating Instructions', operatingInstructions: 'Operating Instructions',
}, },
viewTitle: { viewTitle: {
personManagement: 'Person Management', personManagement: 'Person Management',
winnerManagement: 'Winner Management', winnerManagement: 'Winner Management',
prizeManagement: 'Prize Management', prizeManagement: 'Prize Management',
globalSetting: 'Global Setting', globalSetting: 'Global Setting',
operatingInstructions: 'Operating Instructions', operatingInstructions: 'Operating Instructions',
}, },
table: { table: {
// person configuration // person configuration
number: 'Number', number: 'Number',
name: 'Name', name: 'Name',
prizeName: 'Name', prizeName: 'Name',
department: 'Department', department: 'Department',
identity: 'Identity', identity: 'Identity',
isLucky: 'Is Lucky', isLucky: 'Is Lucky',
operation: 'Operation', operation: 'Operation',
setLuckyNumber: 'Set Lucky Number', setLuckyNumber: 'Set Lucky Number',
luckyPeopleNumber: 'Lucky People Number', luckyPeopleNumber: 'Lucky People Number',
detail: 'Detail', detail: 'Detail',
noneData: 'No Data', noneData: 'No Data',
// prize configuration // prize configuration
fullParticipation: 'FullParticipation', fullParticipation: 'FullParticipation',
numberParticipants: 'NumberParticipants', numberParticipants: 'NumberParticipants',
isDone: 'is Done', isDone: 'is Done',
image: 'Image', image: 'Image',
onceNumber: 'Once Number', onceNumber: 'Once Number',
time: 'Time', time: 'Time',
// view setting // view setting
title: 'Main Title', title: 'Main Title',
columnNumber: 'Column Number', columnNumber: 'Column Number',
theme: 'Theme', theme: 'Theme',
language: 'Language', language: 'Language',
cardColor: 'Card Color', cardColor: 'Card Color',
winnerColor: 'Winner Color', winnerColor: 'Winner Color',
textColor: 'Text Color', textColor: 'Text Color',
cardWidth: 'Card Width', cardWidth: 'Card Width',
cardHeight: 'Card Height', cardHeight: 'Card Height',
textSize: 'Text Size', textSize: 'Text Size',
highlightColor: 'HighLight Color', highlightColor: 'HighLight Color',
patternSetting: 'Pattern Setting', patternSetting: 'Pattern Setting',
alwaysDisplay: 'Always Display Prize List', alwaysDisplay: 'Always Display Prize List',
avatarDisplay: 'Show avatars or not', avatarDisplay: 'Show avatars or not',
selectPicture: 'Select a Picture', selectPicture: 'Select a Picture',
backgroundImage: 'Select Background Image', backgroundImage: 'Select Background Image',
}, },
dialog: { dialog: {
titleTip: 'Tip!', titleTip: 'Tip!',
titleTemporary: 'Add Temporary Activity', titleTemporary: 'Add Temporary Activity',
dialogPCWeb: 'Please use a PC browser to access for optimal display performance', dialogPCWeb: 'Please use a PC browser to access for optimal display performance',
dialogDelAllPerson: 'This operation will delete all personnel list data. Do you want to continue?', dialogDelAllPerson: 'This operation will delete all personnel list data. Do you want to continue?',
dialogResetWinner: 'This operation will clear the winning information of personnel. Do you want to continue?', dialogResetWinner: 'This operation will clear the winning information of personnel. Do you want to continue?',
dialogResetAllData: 'This operation will reset all data. Do you want to continue?', dialogResetAllData: 'This operation will reset all data. Do you want to continue?',
dialogSingleDrawLimit: 'Only 10 characters can be extracted in a single draw', dialogSingleDrawLimit: 'Only 10 characters can be extracted in a single draw',
dialogLatestBrowser: 'Please use the latest version of Chrome or Edge browser', dialogLatestBrowser: 'Please use the latest version of Chrome or Edge browser',
tipResetPrize: 'Performing operations may reset data, please proceed with caution', tipResetPrize: 'Performing operations may reset data and cant recover, please proceed with caution',
}, },
tooltip: { tooltip: {
settingConfiguration: 'Setting/Configuration', settingConfiguration: 'Setting/Configuration',
nextSong: 'Right Click to Next Song', nextSong: 'Right Click to Next Song',
noSongPlay: 'No Song to Play', noSongPlay: 'No Song to Play',
prizeList: 'Prize List', prizeList: 'Prize List',
addActivity: 'Add Activity', addActivity: 'Add Activity',
downloadTemplateTip: 'After downloading the file, please fill in the data in Excel and save it in xlsx format', downloadTemplateTip: 'After downloading the file, please fill in the data in Excel and save it in xlsx format',
uploadExcelTip: 'Upload the modified Excel file', uploadExcelTip: 'Upload the modified Excel file',
leftClick: 'Left Click to Slice', leftClick: 'Left Click to Slice',
toHome: 'to Home', toHome: 'to Home',
resetLayout: 'This item is time-consuming and performance intensive', resetLayout: 'This item is time-consuming and performance intensive',
defaultLayout: 'The default pattern setting is valid for 17 columns, please set the number of other columns yourself', defaultLayout: 'The default pattern setting is valid for 17 columns, please set the number of other columns yourself',
doneCount: 'Number of winners', doneCount: 'Number of winners',
edit: 'Edit', edit: 'Edit',
delete: 'Delete', delete: 'Delete',
}, },
error: { error: {
require: 'required field', require: 'required field',
requireNumber: 'please enter a number', requireNumber: 'please enter a number',
minNumber1: 'the minimum is 1', minNumber1: 'the minimum is 1',
maxNumber100: 'the maximum is 100', maxNumber100: 'the maximum is 100',
uploadSuccess: 'Upload Success', uploadSuccess: 'Upload Success',
uploadFail: 'Upload Failed', uploadFail: 'Upload Failed',
notImage: 'Not Image', notImage: 'Not Image',
personIsAllDone: 'All Person Is Done', personIsAllDone: 'All Person Is Done',
personNotEnough: 'Person Is Not Enough', personNotEnough: 'Person Is Not Enough',
startDraw: 'Now Draw {count} {leftover} people', startDraw: 'Now Draw {count} {leftover} people',
completeInformation: 'Please provide complete information', completeInformation: 'Please provide complete information',
}, },
placeHolder: { placeHolder: {
enterTitle: 'Enter Title', enterTitle: 'Enter Title',
name: 'Name', name: 'Name',
winnerCount: 'Lucky Person Count', winnerCount: 'Lucky Person Count',
}, },
data: { data: {
yes: 'Yes', yes: 'Yes',
no: 'No', no: 'No',
number: 'Number', number: 'Number',
isWin: 'isWin', isWin: 'isWin',
avatar: 'avatar', avatar: 'avatar',
department: 'Department', department: 'Department',
name: 'Name', name: 'Name',
identity: 'Identity', identity: 'Identity',
prizeName: 'Prize Name', prizeName: 'Prize Name',
prizeTime: 'Prize Time', prizeTime: 'Prize Time',
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: 'The Prelude to the Six Ministries of the Ming Dynasty Cabinet',
xlsxName: 'personListTemplate-en.xlsx', xlsxName: 'personListTemplate-en.xlsx',
readmeName: 'readme-en.md', readmeName: 'readme-en.md',
}, },
footer: { footer: {
'self-reflection': 'Turn inward and examine yourself when you encounter difficulties in life.', 'self-reflection': 'Turn inward and examine yourself when you encounter difficulties in life.',
'thiefEasy': 'Thief difficult mountain thief easily, breaking heart.', 'thiefEasy': 'Thief difficult mountain thief easily, breaking heart.',
}, },
} }

View File

@@ -1,153 +1,153 @@
export default { export default {
button: { button: {
enterLottery: '进入抽奖', enterLottery: '进入抽奖',
start: '开始', start: '开始',
selectLucky: '抽取幸运儿', selectLucky: '抽取幸运儿',
continue: '继续', continue: '继续',
confirm: '确认', confirm: '确认',
cancel: '取消', cancel: '取消',
setting: '设置', setting: '设置',
delete: '删除', delete: '删除',
allDelete: '删除全部', allDelete: '删除全部',
downloadTemplate: '下载模板', downloadTemplate: '下载模板',
importData: '导入数据', importData: '导入数据',
resetData: '重置数据', resetData: '重置数据',
exportResult: '导出结果', exportResult: '导出结果',
add: '添加', add: '添加',
resetDefault: '重置为默认', resetDefault: '重置为默认',
resetAllData: '重置所有数据', resetAllData: '重置所有数据',
clearPattern: '清除图案', clearPattern: '清除图案',
DefaultPattern: '默认图案', DefaultPattern: '默认图案',
upload: '上传', upload: '上传',
reset: '重置', reset: '重置',
play: '播放', play: '播放',
setLayout: '重设布局', setLayout: '重设布局',
close: '关闭', close: '关闭',
noInfoAndImport: '暂无人员信息,前往导入', noInfoAndImport: '暂无人员信息,前往导入',
useDefault: '使用默认数据', useDefault: '使用默认数据',
}, },
sidebar: { sidebar: {
personConfiguration: '人员配置', personConfiguration: '人员配置',
personList: '人员列表', personList: '人员列表',
winnerList: '中奖人员', winnerList: '中奖人员',
prizeConfiguration: '奖品配置', prizeConfiguration: '奖品配置',
globalSetting: '全局配置', globalSetting: '全局配置',
viewSetting: '界面设置', viewSetting: '界面设置',
imagesManagement: '图片管理', imagesManagement: '图片管理',
musicManagement: '音乐管理', musicManagement: '音乐管理',
operatingInstructions: '操作说明', operatingInstructions: '操作说明',
}, },
viewTitle: { viewTitle: {
personManagement: '人员管理', personManagement: '人员管理',
winnerManagement: '已中奖人员管理', winnerManagement: '已中奖人员管理',
prizeManagement: '奖项配置', prizeManagement: '奖项配置',
globalSetting: '全局配置', globalSetting: '全局配置',
operatingInstructions: '操作说明', operatingInstructions: '操作说明',
}, },
table: { table: {
// person configuration // person configuration
number: '编号', number: '编号',
name: '姓名', name: '姓名',
prizeName: '名称', prizeName: '名称',
department: '部门', department: '部门',
identity: '身份', identity: '身份',
isLucky: '是否中奖', isLucky: '是否中奖',
operation: '操作', operation: '操作',
setLuckyNumber: '设置中奖人数', setLuckyNumber: '设置中奖人数',
luckyPeopleNumber: '中奖人数', luckyPeopleNumber: '中奖人数',
detail: '详细信息', detail: '详细信息',
noneData: '暂无数据', noneData: '暂无数据',
// prize configuration // prize configuration
fullParticipation: '全员参加', fullParticipation: '可重复',
numberParticipants: '抽奖人数', numberParticipants: '抽奖人数',
isDone: '已抽取', isDone: '已抽取',
image: '图片', image: '图片',
onceNumber: '单次抽取个数', onceNumber: '单次抽取个数',
time: '时间', time: '时间',
// view setting // view setting
title: '主标题', title: '主标题',
columnNumber: '列数', columnNumber: '列数',
theme: '主题', theme: '主题',
language: '语言', language: '语言',
cardColor: '卡片颜色', cardColor: '卡片颜色',
winnerColor: '中奖卡片颜色', winnerColor: '中奖卡片颜色',
textColor: '文字颜色', textColor: '文字颜色',
cardWidth: '卡片宽度', cardWidth: '卡片宽度',
cardHeight: '卡片高度', cardHeight: '卡片高度',
textSize: '文字大小', textSize: '文字大小',
highlightColor: '高亮颜色', highlightColor: '高亮颜色',
patternSetting: '图案设置', patternSetting: '图案设置',
alwaysDisplay: '常显奖项列表', alwaysDisplay: '常显奖项列表',
avatarDisplay: '是否显示头像', avatarDisplay: '是否显示头像',
selectPicture: '选择一张图片', selectPicture: '选择一张图片',
backgroundImage: '选择背景图片', backgroundImage: '选择背景图片',
}, },
dialog: { dialog: {
titleTip: '提示!', titleTip: '提示!',
titleTemporary: '增加临时抽奖', titleTemporary: '增加临时抽奖',
dialogPCWeb: '请使用PC进行访问以获得最佳显示效果', dialogPCWeb: '请使用PC进行访问以获得最佳显示效果',
dialogDelAllPerson: '该操作会删除所有人员数据,是否继续?', dialogDelAllPerson: '该操作会删除所有人员数据,是否继续?',
dialogResetWinner: '该操作会清空人员中奖信息,是否继续?', dialogResetWinner: '该操作会清空人员中奖信息,是否继续?',
dialogResetAllData: '该操作会重置所有数据,是否继续?', dialogResetAllData: '该操作会重置所有数据,是否继续?',
dialogSingleDrawLimit: '单次抽取只能抽取10位', dialogSingleDrawLimit: '单次抽取只能抽取10位',
dialogLatestBrowser: '请使用最新版Chrome或者Edge浏览器', dialogLatestBrowser: '请使用最新版Chrome或者Edge浏览器',
tipResetPrize: '进行操作可能会重置数据,请谨慎操作', tipResetPrize: '进行操作可能会重置数据并不可恢复,请谨慎操作',
}, },
tooltip: { tooltip: {
settingConfiguration: '设置/配置', settingConfiguration: '设置/配置',
nextSong: '右键点击下一首', nextSong: '右键点击下一首',
noSongPlay: '没有音乐可以播放', noSongPlay: '没有音乐可以播放',
prizeList: '奖项列表', prizeList: '奖项列表',
addActivity: '添加抽奖', addActivity: '添加抽奖',
downloadTemplateTip: '下载文件后请在excel中填写数据并保存为xlsx格式', downloadTemplateTip: '下载文件后请在excel中填写数据并保存为xlsx格式',
uploadExcelTip: '上传修改好的excel文件', uploadExcelTip: '上传修改好的excel文件',
leftClick: '左键切割', leftClick: '左键切割',
toHome: '主页', toHome: '主页',
resetLayout: '该项比较耗费时间和性能', resetLayout: '该项比较耗费时间和性能',
defaultLayout: '默认图案设置针对17列时有效其他列数请自行设置', defaultLayout: '默认图案设置针对17列时有效其他列数请自行设置',
doneCount: '已抽取', doneCount: '已抽取',
edit: '编辑', edit: '编辑',
delete: '删除', delete: '删除',
}, },
error: { error: {
require: '必填项', require: '必填项',
requireNumber: '请输入数字', requireNumber: '请输入数字',
minNumber1: '最小为1', minNumber1: '最小为1',
maxNumber100: '最大为100', maxNumber100: '最大为100',
uploadSuccess: '上传成功', uploadSuccess: '上传成功',
uploadFail: '上传失败', uploadFail: '上传失败',
notImage: '不是图片', notImage: '不是图片',
personIsAllDone: '抽奖抽完了', personIsAllDone: '抽奖抽完了',
personNotEnough: '抽奖人数不足', personNotEnough: '抽奖人数不足',
startDraw: '现在抽取{count}{leftover}人', startDraw: '现在抽取{count}{leftover}人',
completeInformation: '请填写完整信息', completeInformation: '请填写完整信息',
}, },
placeHolder: { placeHolder: {
enterTitle: '输入标题', enterTitle: '输入标题',
name: '名称', name: '名称',
winnerCount: '中奖人数', winnerCount: '中奖人数',
}, },
data: { data: {
yes: '是', yes: '是',
no: '否', no: '否',
number: '编号', number: '编号',
isWin: '是否中奖', isWin: '是否中奖',
avatar: '头像', avatar: '头像',
department: '部门', department: '部门',
name: '姓名', name: '姓名',
identity: '身份', identity: '身份',
prizeName: '获奖', prizeName: '获奖',
prizeTime: '获奖时间', prizeTime: '获奖时间',
operation: '操作', operation: '操作',
delete: '删除', delete: '删除',
removePerson: '移入未中奖名单', removePerson: '移入未中奖名单',
defaultTitle: '大明内阁六部御前奏对', defaultTitle: '大明内阁六部御前奏对',
xlsxName: '人口登记表-zhCn.xlsx', xlsxName: '人口登记表-zhCn.xlsx',
readmeName: 'readme-zhCn.md', readmeName: 'readme-zhCn.md',
}, },
footer: { footer: {
'self-reflection': '行有不得,反求诸己', 'self-reflection': '行有不得,反求诸己',
'thiefEasy': '破山中贼易,破心中贼难', 'thiefEasy': '破山中贼易,破心中贼难',
}, },
} }

View File

@@ -1,9 +1,9 @@
<script setup lang='ts'> <script setup lang='ts'>
import localforage from 'localforage'
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import { onMounted, ref, watch } from 'vue' import { onMounted, ref, watch } from 'vue'
import { ColorPicker } from 'vue3-colorpicker' import { ColorPicker } from 'vue3-colorpicker'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { useRouter } from 'vue-router'
import { z as zod } from 'zod' import { z as zod } from 'zod'
import { daisyuiThemes } from '@/constant/theme' import { daisyuiThemes } from '@/constant/theme'
import i18n, { languageList } from '@/locales/i18n' import i18n, { languageList } from '@/locales/i18n'
@@ -13,6 +13,7 @@ import { clearAllDbStore } from '@/utils/localforage'
import PatternSetting from './components/PatternSetting.vue' import PatternSetting from './components/PatternSetting.vue'
import 'vue3-colorpicker/style.css' import 'vue3-colorpicker/style.css'
const router = useRouter()
const { t } = useI18n() const { t } = useI18n()
const globalConfig = useStore().globalConfig const globalConfig = useStore().globalConfig
const personConfig = useStore().personConfig const personConfig = useStore().personConfig
@@ -315,7 +316,11 @@ onMounted(() => {
<span class="truncate w-option-xs">{{ item.name }}</span> <span class="truncate w-option-xs">{{ item.name }}</span>
</option> </option>
</select> </select>
<span class="label">请先前往图片管理上传图片</span> <span class="label">请先前往
<a class="link link-info" @click="() => { router.push('image') }">
图片管理
</a>
上传图片</span>
</div> </div>
<div class="grid w-full grid-cols-2 gap-4"> <div class="grid w-full grid-cols-2 gap-4">
<div class="flex flex-col items-center max-w-xs gap-1 form-control"> <div class="flex flex-col items-center max-w-xs gap-1 form-control">

View File

@@ -1,18 +1,36 @@
<script setup lang='ts'> <script setup lang='ts'>
import markdownit from 'markdown-it' import markdownit from 'markdown-it'
import { onMounted, ref } from 'vue' import { onMounted, ref, watch } from 'vue'
import readmeEn from '@/../public/readme-en.md?raw'
import readmeZh from '@/../public/readme-zhCn.md?raw'
import i18n from '@/locales/i18n' import i18n from '@/locales/i18n'
const md = markdownit() const md = markdownit()
const readmeHtml = ref('') const readmeHtml = ref('')
function readMd() {
fetch(`/log-lottery/${i18n.global.t('data.readmeName')}`)
.then(res => res.text())
.then((res) => {
readmeHtml.value = md.render(res)
})
}
function getReadmeContent() {
const locale = i18n.global.locale.value
if (locale === 'zhCn') {
return readmeZh
}
else {
return readmeEn
}
}
function readMd() {
try {
const content = getReadmeContent()
readmeHtml.value = md.render(content)
}
catch (error) {
console.error('Failed to load readme:', error)
readmeHtml.value = '<p>Failed to load README content.</p>'
}
}
// 监听语言变化
watch(() => i18n.global.locale.value, () => {
readMd()
})
onMounted(() => { onMounted(() => {
readMd() readMd()
}) })