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,
"bracketSameLine": false,
"singleAttributePerLine": true,
"experimentalSortPackageJson": false,
"embeddedLanguageFormatting": "auto",
"experimentalSortPackageJson": true,
"experimentalSortImports": {},
"experimentalTailwindcss": {},
"ignorePatterns": []
}

View File

@@ -1,23 +1,17 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": null,
"plugins": [
"eslint",
"unicorn",
"vue",
"typescript",
"jsdoc",
"promise",
"vitest"
],
"categories": {},
"rules": {},
"settings": {
"jsx-a11y": {
"polymorphicPropName": null,
"components": {},
"attributes": {}
},
"next": {
"rootDir": []
},
"react": {
"formComponents": [],
"linkComponents": [],
"version": null,
"componentWrapperFunctions": []
},
"jsdoc": {
"ignorePrivate": 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.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.oxc": "always"
// "editor.codeActionsOnSave": {
// "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"
}
}

16
Jenkinsfile vendored
View File

@@ -5,6 +5,19 @@ pipeline {
timestamps()
}
parameters {
choice(
name: 'XSH_DEPLOY_TARGET',
choices: ['main'],
description: 'main眩生花线上版本'
)
booleanParam(
name: 'XSH_DEPLOY_TO_PRODUCTION',
defaultValue: true,
description: '是否自动部署到线上环境(否则只构建产物)\n* 仅在 main 分支生效'
)
}
tools {
nodejs 'NodeJS 22.22'
}
@@ -32,7 +45,10 @@ pipeline {
stage('Build') {
when {
allOf {
expression { currentBuild.currentResult == 'SUCCESS' }
expression { env.TAG_NAME != null }
}
}
steps {
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>
>('App.Digital_VideoTask.Create', payload)
.then((res) => {
if (!!res.data.task_id) {
if (res.data.task_id) {
toast.add({
title: '创建成功',
description: '视频已加入生成队列',

View File

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

View File

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

View File

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

View File

@@ -135,10 +135,10 @@ onMounted(async () => {
</script>
<template>
<div class="relative grid w-full min-h-screen">
<div class="relative grid min-h-screen w-full">
<header>
<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 微课视频研创平台
</span>
<!-- <span class="text-xs text-neutral-600 dark:text-neutral-300">眩生花科技</span> -->
@@ -198,7 +198,7 @@ onMounted(async () => {
</UBadge>
</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 }}
</p>
@@ -208,7 +208,7 @@ onMounted(async () => {
<span class="truncate">{{ item.label }}</span>
<UIcon
: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>
</UDropdown>
@@ -230,7 +230,7 @@ onMounted(async () => {
<style>
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')]; */
}
@@ -271,10 +271,10 @@ body {
<style scoped>
header {
@apply fixed inset-x-0 h-16 bg-white border-b z-30;
@apply dark:bg-neutral-900 dark:border-neutral-800;
@apply fixed inset-x-0 z-30 h-16 border-b bg-white;
@apply dark:border-neutral-800 dark:bg-neutral-900;
@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 {
@@ -282,8 +282,8 @@ main {
}
footer {
@apply h-16 bg-white border-t z-30;
@apply dark:bg-neutral-900 dark:border-neutral-800;
@apply z-30 h-16 border-t bg-white;
@apply dark:border-neutral-800 dark:bg-neutral-900;
@apply flex flex-row items-center justify-between px-4;
}
</style>

View File

@@ -58,11 +58,11 @@ onMounted(() => {
</script>
<template>
<div class="w-full flex relative">
<div class="relative flex w-full">
<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">
<ClientOnly>
<NavItem
@@ -107,7 +107,7 @@ onMounted(() => {
.subpage-enter-from,
.subpage-leave-to {
@apply opacity-0 translate-x-4;
@apply translate-x-4 opacity-0;
}
.loading-screen-leave-active {

View File

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

View File

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