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'
|
||||
|
||||
// 直接使用 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([
|
||||
// 全局忽略:自身配置文件、产物、第三方静态资源等不参与 lint
|
||||
@@ -18,24 +21,25 @@ export default defineConfig([
|
||||
'public/**',
|
||||
'vite.config.*',
|
||||
'postcss.config.*',
|
||||
'tailwind.config.*'
|
||||
]
|
||||
'tailwind.config.*',
|
||||
],
|
||||
},
|
||||
{
|
||||
files: ['**/*.{js,mjs,cjs,ts,mts,cts,tsx,vue}'],
|
||||
languageOptions: { globals: globals.browser }
|
||||
languageOptions: { globals: globals.browser },
|
||||
},
|
||||
tseslint.configs.recommended,
|
||||
{
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
// 让 typescript-eslint 使用专用 tsconfig(显式 include .vue)
|
||||
project: [tsconfigEslintPath]
|
||||
}
|
||||
project: [tsconfigEslintPath],
|
||||
tsconfigRootDir,
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/no-explicit-any': 'off'
|
||||
}
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
},
|
||||
},
|
||||
pluginVue.configs['flat/essential'],
|
||||
{
|
||||
@@ -44,22 +48,28 @@ export default defineConfig([
|
||||
parserOptions: {
|
||||
parser: {
|
||||
ts: tseslint.parser,
|
||||
tsx: tseslint.parser
|
||||
tsx: tseslint.parser,
|
||||
},
|
||||
project: [tsconfigEslintPath],
|
||||
tsconfigRootDir,
|
||||
extraFileExtensions: ['.vue'],
|
||||
ecmaFeatures: {
|
||||
jsx: true
|
||||
}
|
||||
}
|
||||
jsx: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'vue/multi-word-component-names': 'off',
|
||||
'vue/no-undef-components': [
|
||||
'error',
|
||||
{
|
||||
ignorePatterns: ['router-view', 'router-link', 'RouterView', 'RouterLink']
|
||||
}
|
||||
ignorePatterns: [
|
||||
'router-view',
|
||||
'router-link',
|
||||
'RouterView',
|
||||
'RouterLink',
|
||||
],
|
||||
},
|
||||
],
|
||||
'@typescript-eslint/no-unused-vars': 'warn',
|
||||
'@typescript-eslint/no-explicit-any': 'off', // 完全禁用 any 检查
|
||||
@@ -71,7 +81,7 @@ export default defineConfig([
|
||||
'@typescript-eslint/no-unsafe-argument': 'off',
|
||||
'@typescript-eslint/no-empty-object-type': 'off', // 允许空接口
|
||||
'@typescript-eslint/no-unused-expressions': 'warn', // 改为警告而非错误
|
||||
'no-unused-expressions': 'off'
|
||||
}
|
||||
}
|
||||
'no-unused-expressions': 'off',
|
||||
},
|
||||
},
|
||||
])
|
||||
@@ -15,6 +15,11 @@
|
||||
</div>
|
||||
|
||||
<div class="rotate-hint">请横屏观看,以获得最佳体验</div>
|
||||
|
||||
<LoadingOverlay
|
||||
:visible="bootstrapLoading"
|
||||
text="正在加载学习数据..."
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -27,8 +32,10 @@ import {
|
||||
useInterviewStore,
|
||||
useBasicElementsStore,
|
||||
} from '@/stores'
|
||||
import { onMounted } from 'vue'
|
||||
import { onMounted, ref } from 'vue'
|
||||
import { syncAllCompletedYibanLessons } from '@/utils/yibanLessonProgress'
|
||||
import { initializeStorageBackend } from '@/utils/yiban'
|
||||
import LoadingOverlay from '@/components/Loading/LoadingOverlay.vue'
|
||||
|
||||
// 使用等比例缩放hook
|
||||
const { scaleStyle } = useScale()
|
||||
@@ -38,6 +45,9 @@ const filmStore = useFilmStore()
|
||||
const interviewStore = useInterviewStore()
|
||||
const basicElementsStore = useBasicElementsStore()
|
||||
|
||||
// 易班数据读取期间的全屏 loading
|
||||
const bootstrapLoading = ref(true)
|
||||
|
||||
onMounted(async () => {
|
||||
const params = new URLSearchParams(window.location.search)
|
||||
const courseId = params.get('courseid')
|
||||
@@ -50,12 +60,18 @@ onMounted(async () => {
|
||||
})
|
||||
}
|
||||
|
||||
await Promise.allSettled([
|
||||
vlogStore.loadVlogStore(),
|
||||
filmStore.loadFilmStore(),
|
||||
interviewStore.loadInterviewStore(),
|
||||
basicElementsStore.loadBasicElementsStore(),
|
||||
])
|
||||
try {
|
||||
await initializeStorageBackend()
|
||||
|
||||
await Promise.allSettled([
|
||||
vlogStore.loadVlogStore(),
|
||||
filmStore.loadFilmStore(),
|
||||
interviewStore.loadInterviewStore(),
|
||||
basicElementsStore.loadBasicElementsStore(),
|
||||
])
|
||||
} finally {
|
||||
bootstrapLoading.value = false
|
||||
}
|
||||
|
||||
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 |