feat: 添加 PrimeVue 组件演示页面
All checks were successful
CI/CD Pipeline / playwright (push) Successful in 2m39s
CI/CD Pipeline / build-and-deploy (push) Successful in 2m51s

This commit is contained in:
严浩
2025-10-28 23:48:14 +08:00
parent 33e8a4a5d6
commit c490cb1c8e
15 changed files with 136 additions and 9 deletions

View File

@@ -2,4 +2,5 @@
echo "🧹 [Pre-commit] 正在运行 lint-staged..." echo "🧹 [Pre-commit] 正在运行 lint-staged..."
time pnpm exec lint-staged time pnpm exec lint-staged
time pnpm run lint:vue-i18n-extract time pnpm run lint:vue-i18n-extract
# time pnpm run type-check
echo "🧹 [Pre-commit] lint-staged 完成!" echo "🧹 [Pre-commit] lint-staged 完成!"

8
auto-imports.d.ts vendored
View File

@@ -7,7 +7,10 @@
export {} export {}
declare global { declare global {
const APP_THEME_MODES: typeof import('./src/stores/app-store')['APP_THEME_MODES'] const APP_THEME_MODES: typeof import('./src/stores/app-store')['APP_THEME_MODES']
const ConfirmationService: typeof import('utils4u/primevue')['ConfirmationService']
const DialogService: typeof import('utils4u/primevue')['DialogService']
const EffectScope: typeof import('vue')['EffectScope'] const EffectScope: typeof import('vue')['EffectScope']
const ToastService: typeof import('utils4u/primevue')['ToastService']
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const arrayToTree: typeof import('utils4u/array')['arrayToTree'] const arrayToTree: typeof import('utils4u/array')['arrayToTree']
const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
@@ -255,6 +258,7 @@ declare global {
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
const usePreferredReducedTransparency: typeof import('@vueuse/core')['usePreferredReducedTransparency'] const usePreferredReducedTransparency: typeof import('@vueuse/core')['usePreferredReducedTransparency']
const usePrevious: typeof import('@vueuse/core')['usePrevious'] const usePrevious: typeof import('@vueuse/core')['usePrevious']
const usePrimevueDialogRef: typeof import('utils4u/primevue')['usePrimevueDialogRef']
const useRafFn: typeof import('@vueuse/core')['useRafFn'] const useRafFn: typeof import('@vueuse/core')['useRafFn']
const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
const useRefs: typeof import('utils4u/vue-use')['useRefs'] const useRefs: typeof import('utils4u/vue-use')['useRefs']
@@ -345,7 +349,10 @@ declare module 'vue' {
interface GlobalComponents {} interface GlobalComponents {}
interface ComponentCustomProperties { interface ComponentCustomProperties {
readonly APP_THEME_MODES: UnwrapRef<typeof import('./src/stores/app-store')['APP_THEME_MODES']> readonly APP_THEME_MODES: UnwrapRef<typeof import('./src/stores/app-store')['APP_THEME_MODES']>
readonly ConfirmationService: UnwrapRef<typeof import('utils4u/primevue')['ConfirmationService']>
readonly DialogService: UnwrapRef<typeof import('utils4u/primevue')['DialogService']>
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']> readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
readonly ToastService: UnwrapRef<typeof import('utils4u/primevue')['ToastService']>
readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']> readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
readonly arrayToTree: UnwrapRef<typeof import('utils4u/array')['arrayToTree']> readonly arrayToTree: UnwrapRef<typeof import('utils4u/array')['arrayToTree']>
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']> readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
@@ -593,6 +600,7 @@ declare module 'vue' {
readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']> readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']>
readonly usePreferredReducedTransparency: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedTransparency']> readonly usePreferredReducedTransparency: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedTransparency']>
readonly usePrevious: UnwrapRef<typeof import('@vueuse/core')['usePrevious']> readonly usePrevious: UnwrapRef<typeof import('@vueuse/core')['usePrevious']>
readonly usePrimevueDialogRef: UnwrapRef<typeof import('utils4u/primevue')['usePrimevueDialogRef']>
readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']> readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']>
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']> readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
readonly useRefs: UnwrapRef<typeof import('utils4u/vue-use')['useRefs']> readonly useRefs: UnwrapRef<typeof import('utils4u/vue-use')['useRefs']>

View File

@@ -18,7 +18,7 @@
"type-check": "vue-tsc --build", "type-check": "vue-tsc --build",
"lint": "run-s lint:*", "lint": "run-s lint:*",
"lint:vue-i18n-extract": "vue-i18n-extract report --vueFiles './src/**/*.?(ts|tsx|vue)' --languageFiles './src/locales/*.?(json|yml|yaml|js)' --ci", "lint:vue-i18n-extract": "vue-i18n-extract report --vueFiles './src/**/*.?(ts|tsx|vue)' --languageFiles './src/locales/*.?(json|yml|yaml|js)' --ci",
"lint:stylelint": "stylelint \"**/*.{css,less,scss,vue}\" --fix --ignore-path .gitignore", "lint:stylelint": "stylelint --fix --ignore-path .gitignore \"**/*.{css,less,scss,vue}\"",
"lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore", "lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore",
"lint:eslint": "eslint . --fix", "lint:eslint": "eslint . --fix",
"test:unit:DisableWatch": "vitest --run", "test:unit:DisableWatch": "vitest --run",
@@ -27,14 +27,15 @@
"prepare": "husky" "prepare": "husky"
}, },
"lint-staged": { "lint-staged": {
"{server,src,e2e}/**/*.{js,jsx,ts,tsx,vue}": [ "{src,e2e}/**/*.{js,jsx,ts,tsx,vue}": [
"prettier --write",
"eslint --fix", "eslint --fix",
"oxlint --fix" "oxlint --fix",
"prettier --write"
], ],
"{src,packages}/**/*.{css,less,scss,vue}": [ "{src,packages}/**/*.{css,less,scss,vue}": [
"stylelint --fix" "stylelint --fix"
] ],
"{src/locales-4-route,src/locales}/**/*": "node scripts/type-check-for-lint-staged.mjs"
}, },
"pnpm": { "pnpm": {
"overrides": { "overrides": {
@@ -61,6 +62,7 @@
"highlight.js": "^11.11.1", "highlight.js": "^11.11.1",
"naive-ui": "^2.43.1", "naive-ui": "^2.43.1",
"pinia": "^3.0.3", "pinia": "^3.0.3",
"primeicons": "^7.0.0",
"primelocale": "^2.1.7", "primelocale": "^2.1.7",
"primevue": "^4.3.9", "primevue": "^4.3.9",
"ts-enum-util": "^4.1.0", "ts-enum-util": "^4.1.0",

8
pnpm-lock.yaml generated
View File

@@ -44,6 +44,9 @@ importers:
pinia: pinia:
specifier: ^3.0.3 specifier: ^3.0.3
version: 3.0.3(typescript@5.9.2)(vue@3.5.22(typescript@5.9.2)) version: 3.0.3(typescript@5.9.2)(vue@3.5.22(typescript@5.9.2))
primeicons:
specifier: ^7.0.0
version: 7.0.0
primelocale: primelocale:
specifier: ^2.1.7 specifier: ^2.1.7
version: 2.1.7 version: 2.1.7
@@ -4609,6 +4612,9 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
primeicons@7.0.0:
resolution: {integrity: sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==}
primelocale@2.1.7: primelocale@2.1.7:
resolution: {integrity: sha512-BzqPNAhr0lDDX4tnKM7FUDeCbpXcC558pHaQULTelhi7LG5rEtTx/isqy3ueHTNdyFl3evoY3ZRZ9x21zxUtRg==} resolution: {integrity: sha512-BzqPNAhr0lDDX4tnKM7FUDeCbpXcC558pHaQULTelhi7LG5rEtTx/isqy3ueHTNdyFl3evoY3ZRZ9x21zxUtRg==}
engines: {node: '>=18.0.0', npm: '>=8.6.0'} engines: {node: '>=18.0.0', npm: '>=8.6.0'}
@@ -10373,6 +10379,8 @@ snapshots:
prettier@3.6.2: {} prettier@3.6.2: {}
primeicons@7.0.0: {}
primelocale@2.1.7: {} primelocale@2.1.7: {}
primevue@4.4.1(vue@3.5.22(typescript@5.9.2)): primevue@4.4.1(vue@3.5.22(typescript@5.9.2)):

View File

@@ -0,0 +1,15 @@
#!/usr/bin/env node
/**
* Type check script for lint-staged
* This script ignores file arguments passed by lint-staged and runs type-check on the entire project
*/
import { spawnSync } from 'child_process';
const result = spawnSync('pnpm', ['run', 'type-check'], {
stdio: 'inherit',
shell: process.platform === 'win32',
});
process.exit(result.status ?? 1);

View File

@@ -5,6 +5,8 @@ export default {
DemosApiDemo: 'API Demo', DemosApiDemo: 'API Demo',
DemosCounterDemo: 'Counter Demo', DemosCounterDemo: 'Counter Demo',
DemosI18nDemo: 'i18n Demo', DemosI18nDemo: 'i18n Demo',
DemosPrimevueDemo: 'PrimeVue Demo',
DemosWebsocketDemo: 'WebSocket Demo', DemosWebsocketDemo: 'WebSocket Demo',
Home: 'Home', Home: 'Home',
} as const satisfies PageTitleLocalizations; Login: 'Login',
} satisfies PageTitleLocalizations;

View File

@@ -5,6 +5,8 @@ export default {
DemosApiDemo: 'API 调用示例', DemosApiDemo: 'API 调用示例',
DemosCounterDemo: '点击计数器', DemosCounterDemo: '点击计数器',
DemosI18nDemo: '国际化示例', DemosI18nDemo: '国际化示例',
DemosPrimevueDemo: 'PrimeVue 组件示例',
DemosWebsocketDemo: 'WebSocket 示例', DemosWebsocketDemo: 'WebSocket 示例',
Home: '首页', Home: '首页',
} as const satisfies PageTitleLocalizations; Login: '登录',
} satisfies PageTitleLocalizations;

5
src/pages/Login.page.vue Normal file
View File

@@ -0,0 +1,5 @@
<script setup lang="ts"></script>
<template>
<div>Login</div>
</template>

View File

@@ -0,0 +1,45 @@
<script setup lang="ts">
import type { ToastMessageOptions } from 'primevue/toast';
definePage({
meta: {},
});
</script>
<template>
<div class="prime-vue-demo-page">
<Card>
<template #title>PrimeVue 组件演示</template>
<template #content>
<Message severity="info">演示 PrimeVue 各种组件的使用方法和功能特性</Message>
<Panel header="Toast 消息" class="mt-1.5">
<div flex="~ wrap" gap="4">
<Button
v-for="severity in [
'secondary',
'success',
'info',
'warn',
'error',
'contrast',
undefined,
] satisfies ToastMessageOptions['severity'][]"
:key="severity ?? 'default'"
@click="
ToastService.add({
severity: severity,
summary: `severity: ${severity ?? 'default'}`,
life: 5000,
detail: '消息内容',
})
"
>
{{ `${severity ?? 'default'}` }}
</Button>
</div>
</Panel>
</template>
</Card>
</div>
</template>

View File

@@ -6,6 +6,7 @@ import Aura from '@primeuix/themes/aura';
import zhCN from 'primelocale/zh-CN.json'; import zhCN from 'primelocale/zh-CN.json';
import PrimeVue from 'primevue/config'; import PrimeVue from 'primevue/config';
import StyleClass from 'primevue/styleclass'; import StyleClass from 'primevue/styleclass';
import ToastService from 'primevue/toastservice';
export function install({ app }: { app: import('vue').App<Element> }) { export function install({ app }: { app: import('vue').App<Element> }) {
app.directive('styleclass', StyleClass); app.directive('styleclass', StyleClass);
@@ -25,4 +26,5 @@ export function install({ app }: { app: import('vue').App<Element> }) {
preset: Aura, preset: Aura,
}, },
}); });
app.use(ToastService);
} }

View File

@@ -1,3 +1,6 @@
import 'nprogress/nprogress.css'; // <link rel="stylesheet" href="https://testingcf.jsdelivr.net/npm/nprogress/nprogress.css" /> import 'nprogress/nprogress.css'; // <link rel="stylesheet" href="https://testingcf.jsdelivr.net/npm/nprogress/nprogress.css" />
import 'primeicons/primeicons.css';
import './reset-primevue.css';
import 'virtual:uno.css'; import 'virtual:uno.css';

View File

@@ -0,0 +1,8 @@
.p-confirmdialog,
.p-toast {
max-width: calc(100% - 50px);
}
.p-toast .p-toast-message-text {
margin-top: -0.2rem;
}

26
typed-router.d.ts vendored
View File

@@ -65,6 +65,13 @@ declare module 'vue-router/auto-routes' {
Record<never, never>, Record<never, never>,
| never | never
>, >,
'DemosPrimevueDemo': RouteRecordInfo<
'DemosPrimevueDemo',
'/demos/primevue-demo',
Record<never, never>,
Record<never, never>,
| never
>,
'DemosWebsocketDemo': RouteRecordInfo< 'DemosWebsocketDemo': RouteRecordInfo<
'DemosWebsocketDemo', 'DemosWebsocketDemo',
'/demos/websocket-demo', '/demos/websocket-demo',
@@ -79,6 +86,13 @@ declare module 'vue-router/auto-routes' {
Record<never, never>, Record<never, never>,
| never | never
>, >,
'Login': RouteRecordInfo<
'Login',
'/Login',
Record<never, never>,
Record<never, never>,
| never
>,
} }
/** /**
@@ -128,6 +142,12 @@ declare module 'vue-router/auto-routes' {
views: views:
| never | never
} }
'src/pages/demos/primevue-demo.page.vue': {
routes:
| 'DemosPrimevueDemo'
views:
| never
}
'src/pages/demos/websocket-demo.page.vue': { 'src/pages/demos/websocket-demo.page.vue': {
routes: routes:
| 'DemosWebsocketDemo' | 'DemosWebsocketDemo'
@@ -140,6 +160,12 @@ declare module 'vue-router/auto-routes' {
views: views:
| never | never
} }
'src/pages/Login.page.vue': {
routes:
| 'Login'
views:
| never
}
} }
/** /**

View File

@@ -73,7 +73,7 @@ export function loadPlugin(_configEnv: ConfigEnv): PluginOption {
'pinia', 'pinia',
'@vueuse/core', '@vueuse/core',
VueRouterAutoImports, VueRouterAutoImports,
createUtils4uAutoImports([]), createUtils4uAutoImports(['primevue']),
{ {
'consola/browser': ['consola'], 'consola/browser': ['consola'],
'vue-router/auto': ['useLink'], 'vue-router/auto': ['useLink'],

View File

@@ -20,7 +20,7 @@ export const viteConfigRollupOptions: RollupOptions = {
// assetFileNames:'', // 默认: "assets/[name]-[hash][extname]" // assetFileNames:'', // 默认: "assets/[name]-[hash][extname]"
// https://cn.rollupjs.org/configuration-options/#output-assetfilenames // https://cn.rollupjs.org/configuration-options/#output-assetfilenames
assetFileNames(chunkInfo: PreRenderedAsset) { assetFileNames(chunkInfo: PreRenderedAsset) {
const names = chunkInfo.names; const names = [...new Set(chunkInfo.names)];
if (names.length !== 1) { if (names.length !== 1) {
console.error('Multiple names for asset:', chunkInfo); console.error('Multiple names for asset:', chunkInfo);