feat: 完善实战进度与技能树联动
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
No files matched your search
@@ -5,7 +5,10 @@ import { defineConfig } from 'eslint/config'
|
|||||||
import { fileURLToPath } from 'node:url'
|
import { fileURLToPath } from 'node:url'
|
||||||
|
|
||||||
// 直接使用 tsconfig 的绝对路径,避免中文路径在 URL/路径互转时被编码导致读取失败
|
// 直接使用 tsconfig 的绝对路径,避免中文路径在 URL/路径互转时被编码导致读取失败
|
||||||
const tsconfigEslintPath = fileURLToPath(new URL('./tsconfig.eslint.json', import.meta.url))
|
const tsconfigRootDir = fileURLToPath(new URL('.', import.meta.url))
|
||||||
|
const tsconfigEslintPath = fileURLToPath(
|
||||||
|
new URL('./tsconfig.eslint.json', import.meta.url),
|
||||||
|
)
|
||||||
|
|
||||||
export default defineConfig([
|
export default defineConfig([
|
||||||
// 全局忽略:自身配置文件、产物、第三方静态资源等不参与 lint
|
// 全局忽略:自身配置文件、产物、第三方静态资源等不参与 lint
|
||||||
@@ -18,24 +21,25 @@ export default defineConfig([
|
|||||||
'public/**',
|
'public/**',
|
||||||
'vite.config.*',
|
'vite.config.*',
|
||||||
'postcss.config.*',
|
'postcss.config.*',
|
||||||
'tailwind.config.*'
|
'tailwind.config.*',
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
files: ['**/*.{js,mjs,cjs,ts,mts,cts,tsx,vue}'],
|
files: ['**/*.{js,mjs,cjs,ts,mts,cts,tsx,vue}'],
|
||||||
languageOptions: { globals: globals.browser }
|
languageOptions: { globals: globals.browser },
|
||||||
},
|
},
|
||||||
tseslint.configs.recommended,
|
tseslint.configs.recommended,
|
||||||
{
|
{
|
||||||
languageOptions: {
|
languageOptions: {
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
// 让 typescript-eslint 使用专用 tsconfig(显式 include .vue)
|
// 让 typescript-eslint 使用专用 tsconfig(显式 include .vue)
|
||||||
project: [tsconfigEslintPath]
|
project: [tsconfigEslintPath],
|
||||||
}
|
tsconfigRootDir,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
'@typescript-eslint/no-explicit-any': 'off'
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pluginVue.configs['flat/essential'],
|
pluginVue.configs['flat/essential'],
|
||||||
{
|
{
|
||||||
@@ -44,22 +48,28 @@ export default defineConfig([
|
|||||||
parserOptions: {
|
parserOptions: {
|
||||||
parser: {
|
parser: {
|
||||||
ts: tseslint.parser,
|
ts: tseslint.parser,
|
||||||
tsx: tseslint.parser
|
tsx: tseslint.parser,
|
||||||
},
|
},
|
||||||
project: [tsconfigEslintPath],
|
project: [tsconfigEslintPath],
|
||||||
|
tsconfigRootDir,
|
||||||
extraFileExtensions: ['.vue'],
|
extraFileExtensions: ['.vue'],
|
||||||
ecmaFeatures: {
|
ecmaFeatures: {
|
||||||
jsx: true
|
jsx: true,
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
'vue/multi-word-component-names': 'off',
|
'vue/multi-word-component-names': 'off',
|
||||||
'vue/no-undef-components': [
|
'vue/no-undef-components': [
|
||||||
'error',
|
'error',
|
||||||
{
|
{
|
||||||
ignorePatterns: ['router-view', 'router-link', 'RouterView', 'RouterLink']
|
ignorePatterns: [
|
||||||
}
|
'router-view',
|
||||||
|
'router-link',
|
||||||
|
'RouterView',
|
||||||
|
'RouterLink',
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
'@typescript-eslint/no-unused-vars': 'warn',
|
'@typescript-eslint/no-unused-vars': 'warn',
|
||||||
'@typescript-eslint/no-explicit-any': 'off', // 完全禁用 any 检查
|
'@typescript-eslint/no-explicit-any': 'off', // 完全禁用 any 检查
|
||||||
@@ -71,7 +81,7 @@ export default defineConfig([
|
|||||||
'@typescript-eslint/no-unsafe-argument': 'off',
|
'@typescript-eslint/no-unsafe-argument': 'off',
|
||||||
'@typescript-eslint/no-empty-object-type': 'off', // 允许空接口
|
'@typescript-eslint/no-empty-object-type': 'off', // 允许空接口
|
||||||
'@typescript-eslint/no-unused-expressions': 'warn', // 改为警告而非错误
|
'@typescript-eslint/no-unused-expressions': 'warn', // 改为警告而非错误
|
||||||
'no-unused-expressions': 'off'
|
'no-unused-expressions': 'off',
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
])
|
])
|
||||||
@@ -15,6 +15,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rotate-hint">请横屏观看,以获得最佳体验</div>
|
<div class="rotate-hint">请横屏观看,以获得最佳体验</div>
|
||||||
|
|
||||||
|
<LoadingOverlay
|
||||||
|
:visible="bootstrapLoading"
|
||||||
|
text="正在加载学习数据..."
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -27,8 +32,10 @@ import {
|
|||||||
useInterviewStore,
|
useInterviewStore,
|
||||||
useBasicElementsStore,
|
useBasicElementsStore,
|
||||||
} from '@/stores'
|
} from '@/stores'
|
||||||
import { onMounted } from 'vue'
|
import { onMounted, ref } from 'vue'
|
||||||
import { syncAllCompletedYibanLessons } from '@/utils/yibanLessonProgress'
|
import { syncAllCompletedYibanLessons } from '@/utils/yibanLessonProgress'
|
||||||
|
import { initializeStorageBackend } from '@/utils/yiban'
|
||||||
|
import LoadingOverlay from '@/components/Loading/LoadingOverlay.vue'
|
||||||
|
|
||||||
// 使用等比例缩放hook
|
// 使用等比例缩放hook
|
||||||
const { scaleStyle } = useScale()
|
const { scaleStyle } = useScale()
|
||||||
@@ -38,6 +45,9 @@ const filmStore = useFilmStore()
|
|||||||
const interviewStore = useInterviewStore()
|
const interviewStore = useInterviewStore()
|
||||||
const basicElementsStore = useBasicElementsStore()
|
const basicElementsStore = useBasicElementsStore()
|
||||||
|
|
||||||
|
// 易班数据读取期间的全屏 loading
|
||||||
|
const bootstrapLoading = ref(true)
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const params = new URLSearchParams(window.location.search)
|
const params = new URLSearchParams(window.location.search)
|
||||||
const courseId = params.get('courseid')
|
const courseId = params.get('courseid')
|
||||||
@@ -50,12 +60,18 @@ onMounted(async () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
await Promise.allSettled([
|
try {
|
||||||
vlogStore.loadVlogStore(),
|
await initializeStorageBackend()
|
||||||
filmStore.loadFilmStore(),
|
|
||||||
interviewStore.loadInterviewStore(),
|
await Promise.allSettled([
|
||||||
basicElementsStore.loadBasicElementsStore(),
|
vlogStore.loadVlogStore(),
|
||||||
])
|
filmStore.loadFilmStore(),
|
||||||
|
interviewStore.loadInterviewStore(),
|
||||||
|
basicElementsStore.loadBasicElementsStore(),
|
||||||
|
])
|
||||||
|
} finally {
|
||||||
|
bootstrapLoading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
await syncAllCompletedYibanLessons()
|
await syncAllCompletedYibanLessons()
|
||||||
})
|
})
|
||||||
|
|||||||
|
After Width: | Height: | Size: 428 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 460 KiB |
|
After Width: | Height: | Size: 432 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 420 KiB |
|
After Width: | Height: | Size: 2.3 MiB |
|
After Width: | Height: | Size: 351 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 244 KiB |
|
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 232 KiB |
|
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 280 KiB |
|
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 246 KiB |
|
After Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 263 KiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 238 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 271 KiB |
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 272 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 243 KiB |
|
Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 261 KiB |
|
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 241 KiB |
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 233 KiB After Width: | Height: | Size: 267 KiB |
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 213 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 243 KiB |
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 229 KiB After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 235 KiB After Width: | Height: | Size: 261 KiB |
|
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 269 KiB |
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 268 KiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 285 KiB |
|
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 275 KiB |
|
Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 288 KiB |
|
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 289 KiB |
|
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 289 KiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 286 KiB |
|
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 293 KiB |
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 281 KiB |
|
Before Width: | Height: | Size: 269 KiB After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 288 KiB |
|
Before Width: | Height: | Size: 269 KiB After Width: | Height: | Size: 275 KiB |
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 281 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 293 KiB |
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 281 KiB |
|
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 264 KiB |
|
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 287 KiB |
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 647 KiB After Width: | Height: | Size: 727 KiB |
|
Before Width: | Height: | Size: 4.7 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.1 MiB |