13 Commits

Author SHA1 Message Date
2c4951ff9b chore(config): 更新格式化和 lint 配置,格式化部分文件 2026-02-10 02:03:35 +08:00
3c98ee0d47 chore(tsconfig): 删除不再使用的 tsconfig.node.json 文件 2026-02-10 01:28:30 +08:00
8d6e2efb53 chore(persist): 修复持久化状态 pick 字段 2026-02-10 01:18:02 +08:00
377c36f846 chore(tsconfig): 修复自动导入引用路径 2026-02-10 01:17:42 +08:00
11581ffad6 fix(typings): 类型移动到 app 目录 2026-02-10 00:47:18 +08:00
9cc21a0107 chore(deps): update deps 2026-02-10 00:42:07 +08:00
5fe7b7f788 Merge pull request 'chore/migrate-to-nuxt4' (#6) from chore/migrate-to-nuxt4 into main 2026-02-10 00:31:46 +08:00
880b85f75d refactor(deps): migrate to nuxt v4 2026-02-10 00:31:04 +08:00
f1b9cea060 chore(deps): 升级 Nuxt 版本至 4.3.1 2026-02-10 00:09:19 +08:00
6a4685f588 chore: 更新项目名称和版本号
Some checks are pending
aigc/aigc_next_multi/pipeline/pr-main Build queued...
aigc/aigc_next_multi/pipeline/head This commit looks good
2026-02-10 00:01:59 +08:00
133c5c661b chore(deps): replace pinia-plugin-persistedstate 2026-02-09 23:55:11 +08:00
6a54ecd003 chore(ide): add Node.js version file for version management
Some checks are pending
aigc/aigc_next_multi/pipeline/pr-main Build queued...
aigc/aigc_next_multi/pipeline/head This commit looks good
2026-02-09 23:53:06 +08:00
8dea27d14a ci: 更新 Jenkinsfile,添加部署参数和构建条件
Some checks are pending
aigc/aigc_next_multi/pipeline/pr-main Build queued...
aigc/aigc_next_multi/pipeline/head This commit looks good
2026-02-09 14:08:10 +08:00
98 changed files with 4670 additions and 5400 deletions

1
.node-version Normal file
View File

@@ -0,0 +1 @@
v22.22.0

View File

@@ -11,6 +11,9 @@
"vueIndentScriptAndStyle": false, "vueIndentScriptAndStyle": false,
"bracketSameLine": false, "bracketSameLine": false,
"singleAttributePerLine": true, "singleAttributePerLine": true,
"experimentalSortPackageJson": false, "embeddedLanguageFormatting": "auto",
"experimentalSortPackageJson": true,
"experimentalSortImports": {},
"experimentalTailwindcss": {},
"ignorePatterns": [] "ignorePatterns": []
} }

View File

@@ -1,23 +1,17 @@
{ {
"$schema": "./node_modules/oxlint/configuration_schema.json", "$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": null, "plugins": [
"eslint",
"unicorn",
"vue",
"typescript",
"jsdoc",
"promise",
"vitest"
],
"categories": {}, "categories": {},
"rules": {}, "rules": {},
"settings": { "settings": {
"jsx-a11y": {
"polymorphicPropName": null,
"components": {},
"attributes": {}
},
"next": {
"rootDir": []
},
"react": {
"formComponents": [],
"linkComponents": [],
"version": null,
"componentWrapperFunctions": []
},
"jsdoc": { "jsdoc": {
"ignorePrivate": false, "ignorePrivate": false,
"ignoreInternal": false, "ignoreInternal": false,

13
.vscode/settings.json vendored
View File

@@ -1,9 +1,14 @@
{ {
"oxc.fmt.configPath": ".oxfmtrc.json",
"editor.defaultFormatter": "oxc.oxc-vscode", "editor.defaultFormatter": "oxc.oxc-vscode",
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.codeActionsOnSave": { // "editor.codeActionsOnSave": {
"source.fixAll.oxc": "always" // "source.fixAll.oxc": "always"
// },
"typescript.tsdk": "node_modules\\typescript\\lib",
"[typescript]": {
"editor.defaultFormatter": "oxc.oxc-vscode"
}, },
"typescript.tsdk": "node_modules\\typescript\\lib" "[json]": {
"editor.defaultFormatter": "oxc.oxc-vscode"
}
} }

18
Jenkinsfile vendored
View File

@@ -5,6 +5,19 @@ pipeline {
timestamps() timestamps()
} }
parameters {
choice(
name: 'XSH_DEPLOY_TARGET',
choices: ['main'],
description: 'main眩生花线上版本'
)
booleanParam(
name: 'XSH_DEPLOY_TO_PRODUCTION',
defaultValue: true,
description: '是否自动部署到线上环境(否则只构建产物)\n* 仅在 main 分支生效'
)
}
tools { tools {
nodejs 'NodeJS 22.22' nodejs 'NodeJS 22.22'
} }
@@ -32,7 +45,10 @@ pipeline {
stage('Build') { stage('Build') {
when { when {
expression { currentBuild.currentResult == 'SUCCESS' } allOf {
expression { currentBuild.currentResult == 'SUCCESS' }
expression { env.TAG_NAME != null }
}
} }
steps { steps {
sh ''' sh '''

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 336 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

Before

Width:  |  Height:  |  Size: 411 KiB

After

Width:  |  Height:  |  Size: 411 KiB

View File

@@ -96,7 +96,7 @@ const onCreateCourseGreenSubmit = async (
BaseResponse<resp.gen.GBVideoCreate> BaseResponse<resp.gen.GBVideoCreate>
>('App.Digital_VideoTask.Create', payload) >('App.Digital_VideoTask.Create', payload)
.then((res) => { .then((res) => {
if (!!res.data.task_id) { if (res.data.task_id) {
toast.add({ toast.add({
title: '创建成功', title: '创建成功',
description: '视频已加入生成队列', description: '视频已加入生成队列',

View File

@@ -26,7 +26,7 @@ export const useHistory = defineStore(
}, },
{ {
persist: { persist: {
storage: persistedState.localStorage, storage: piniaPluginPersistedstate.localStorage(),
}, },
} }
) )

View File

@@ -72,8 +72,8 @@ export const useLoginState = defineStore(
{ {
persist: { persist: {
key: 'xsh_assistant_persisted_state', key: 'xsh_assistant_persisted_state',
storage: persistedState.localStorage, storage: piniaPluginPersistedstate.localStorage(),
paths: ['is_logged_in', 'token', 'user'], pick: ['is_logged_in', 'token', 'user'],
}, },
} }
) )

View File

@@ -32,8 +32,8 @@ export const useTourState = defineStore(
{ {
persist: { persist: {
key: 'xsh_assistant_tour_state', key: 'xsh_assistant_tour_state',
storage: persistedState.localStorage, storage: piniaPluginPersistedstate.localStorage(),
paths: ['tourState'], pick: ['tourState'],
}, },
} }
) )

View File

@@ -135,10 +135,10 @@ onMounted(async () => {
</script> </script>
<template> <template>
<div class="relative grid w-full min-h-screen"> <div class="relative grid min-h-screen w-full">
<header> <header>
<h1 class="inline-flex flex-col"> <h1 class="inline-flex flex-col">
<span class="text-lg text-neutral-600 dark:text-neutral-300 font-bold"> <span class="text-lg font-bold text-neutral-600 dark:text-neutral-300">
AIGC 微课视频研创平台 AIGC 微课视频研创平台
</span> </span>
<!-- <span class="text-xs text-neutral-600 dark:text-neutral-300">眩生花科技</span> --> <!-- <span class="text-xs text-neutral-600 dark:text-neutral-300">眩生花科技</span> -->
@@ -198,7 +198,7 @@ onMounted(async () => {
</UBadge> </UBadge>
</p> </p>
<p <p
class="truncate whitespace-nowrap max-w-40 font-medium text-gray-900 dark:text-white" class="max-w-40 truncate whitespace-nowrap font-medium text-gray-900 dark:text-white"
> >
{{ loginState.user?.username }} {{ loginState.user?.username }}
</p> </p>
@@ -208,7 +208,7 @@ onMounted(async () => {
<span class="truncate">{{ item.label }}</span> <span class="truncate">{{ item.label }}</span>
<UIcon <UIcon
:name="item.icon" :name="item.icon"
class="flex-shrink-0 h-4 w-4 text-gray-400 dark:text-gray-500 ms-auto" class="ms-auto size-4 flex-shrink-0 text-gray-400 dark:text-gray-500"
/> />
</template> </template>
</UDropdown> </UDropdown>
@@ -230,7 +230,7 @@ onMounted(async () => {
<style> <style>
body { body {
@apply bg-neutral-50 dark:bg-neutral-950 bg-fixed; @apply bg-neutral-50 bg-fixed dark:bg-neutral-950;
/* @apply bg-[url('~/assets/background-pattern.svg')] dark:bg-[url('~/assets/background-pattern-dark.svg')]; */ /* @apply bg-[url('~/assets/background-pattern.svg')] dark:bg-[url('~/assets/background-pattern-dark.svg')]; */
} }
@@ -271,10 +271,10 @@ body {
<style scoped> <style scoped>
header { header {
@apply fixed inset-x-0 h-16 bg-white border-b z-30; @apply fixed inset-x-0 z-30 h-16 border-b bg-white;
@apply dark:bg-neutral-900 dark:border-neutral-800; @apply dark:border-neutral-800 dark:bg-neutral-900;
@apply flex flex-row items-center justify-between px-4; @apply flex flex-row items-center justify-between px-4;
@apply bg-opacity-50 dark:bg-opacity-50 backdrop-blur-3xl backdrop-saturate-150; @apply bg-opacity-50 backdrop-blur-3xl backdrop-saturate-150 dark:bg-opacity-50;
} }
main { main {
@@ -282,8 +282,8 @@ main {
} }
footer { footer {
@apply h-16 bg-white border-t z-30; @apply z-30 h-16 border-t bg-white;
@apply dark:bg-neutral-900 dark:border-neutral-800; @apply dark:border-neutral-800 dark:bg-neutral-900;
@apply flex flex-row items-center justify-between px-4; @apply flex flex-row items-center justify-between px-4;
} }
</style> </style>

View File

@@ -58,11 +58,11 @@ onMounted(() => {
</script> </script>
<template> <template>
<div class="w-full flex relative"> <div class="relative flex w-full">
<div <div
class="absolute -translate-x-full md:sticky md:translate-x-0 z-10 flex flex-col h-[calc(100vh-4rem)] bg-neutral-100 dark:bg-neutral-900 p-4 w-full md:w-[300px] border-r border-neutral-200 dark:border-neutral-700 transition-all duration-300 ease-out" class="absolute z-10 flex h-[calc(100vh-4rem)] w-full -translate-x-full flex-col border-r border-neutral-200 bg-neutral-100 p-4 transition-all duration-300 ease-out md:sticky md:w-[300px] md:translate-x-0 dark:border-neutral-700 dark:bg-neutral-900"
> >
<div class="flex flex-col flex-1 overflow-auto overflow-x-hidden"> <div class="flex flex-1 flex-col overflow-auto overflow-x-hidden">
<div class="flex flex-col gap-1"> <div class="flex flex-col gap-1">
<ClientOnly> <ClientOnly>
<NavItem <NavItem
@@ -107,7 +107,7 @@ onMounted(() => {
.subpage-enter-from, .subpage-enter-from,
.subpage-leave-to { .subpage-leave-to {
@apply opacity-0 translate-x-4; @apply translate-x-4 opacity-0;
} }
.loading-screen-leave-active { .loading-screen-leave-active {

View File

@@ -15,7 +15,7 @@ export default defineNuxtConfig({
'radix-vue/nuxt', 'radix-vue/nuxt',
'dayjs-nuxt', 'dayjs-nuxt',
'@pinia/nuxt', '@pinia/nuxt',
'@pinia-plugin-persistedstate/nuxt', 'pinia-plugin-persistedstate',
'@vite-pwa/nuxt', '@vite-pwa/nuxt',
'@nuxtjs/google-fonts', '@nuxtjs/google-fonts',
'@nuxt/image', '@nuxt/image',

View File

@@ -1,6 +1,6 @@
{ {
"name": "xsh-assistant", "name": "xsh-assistant-next",
"version": "0.1.6", "version": "2.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -12,7 +12,6 @@
"lint:fix": "oxlint --fix", "lint:fix": "oxlint --fix",
"postinstall": "nuxt prepare" "postinstall": "nuxt prepare"
}, },
"packageManager": "pnpm@10.22.0",
"dependencies": { "dependencies": {
"@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/ffmpeg": "^0.12.15",
"@ffmpeg/util": "^0.12.2", "@ffmpeg/util": "^0.12.2",
@@ -31,8 +30,9 @@
"highlight.js": "^11.10.0", "highlight.js": "^11.10.0",
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",
"markdown-it": "^14.1.0", "markdown-it": "^14.1.0",
"nuxt": "^3.12.4", "nuxt": "^4.3.1",
"nuxt-driver.js": "^0.0.11", "nuxt-driver.js": "^0.0.11",
"pinia-plugin-persistedstate": "^4.7.1",
"radix-vue": "^1.9.2", "radix-vue": "^1.9.2",
"v-calendar": "^3.1.2", "v-calendar": "^3.1.2",
"vue": "^3.4.34", "vue": "^3.4.34",
@@ -42,22 +42,22 @@
"devDependencies": { "devDependencies": {
"@nuxt/ui": "^2.20.0", "@nuxt/ui": "^2.20.0",
"@nuxtjs/google-fonts": "^3.2.0", "@nuxtjs/google-fonts": "^3.2.0",
"@pinia-plugin-persistedstate/nuxt": "^1.2.1", "@pinia/nuxt": "^0.11.3",
"@pinia/nuxt": "^0.5.2",
"@tailwindcss/typography": "^0.5.13", "@tailwindcss/typography": "^0.5.13",
"@types/markdown-it": "^13.0.9", "@types/markdown-it": "^13.0.9",
"@types/node": "^25.2.2", "@types/node": "^25.2.2",
"@vite-pwa/nuxt": "^0.5.0", "@vite-pwa/nuxt": "^1.1.1",
"@vueuse/core": "^10.11.1", "@vueuse/core": "^14.2.0",
"@vueuse/nuxt": "^10.11.1", "@vueuse/nuxt": "^14.2.0",
"dayjs-nuxt": "^2.1.9", "dayjs-nuxt": "^2.1.11",
"oxfmt": "^0.28.0", "oxfmt": "^0.28.0",
"oxlint": "^1.43.0", "oxlint": "^1.43.0",
"sass": "^1.77.8", "sass": "^1.77.8",
"typescript": "^5.9.3" "typescript": "^5.9.3"
}, },
"peerDependencies": { "peerDependencies": {
"dayjs": "^1.11.12", "dayjs": "^1.11.19",
"tailwindcss": "^3.4.7" "tailwindcss": "^3.4.7"
} },
"packageManager": "pnpm@10.22.0"
} }

9913
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,18 @@
{ {
// https://nuxt.com/docs/guide/concepts/typescript // https://nuxt.com/docs/guide/concepts/typescript
"extends": "./.nuxt/tsconfig.json", "files": [],
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
},
"references": [ "references": [
{ {
"path": "./tsconfig.node.json" "path": "./.nuxt/tsconfig.app.json"
},
{
"path": "./.nuxt/tsconfig.server.json"
},
{
"path": "./.nuxt/tsconfig.shared.json"
},
{
"path": "./.nuxt/tsconfig.node.json"
} }
] ]
} }

View File

@@ -1,11 +0,0 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"strict": true
}
}