ZhangQiPro/src/components/PageLayout.vue
sladro 29b58e6888 chore: ESLint代码规范修复 - 从779个问题降至13个警告
修复内容:
1.  ESLint配置完善
   - 添加浏览器全局变量:setTimeout, localStorage, getComputedStyle等
   - 禁用保留组件名规则 (vue/no-reserved-component-names)

2.  清理未使用的导入(自动修复648个警告)
   - BigScreenPortrait.vue: 移除reactive, mockPortraitData, generateChartData等
   - Evaluate.vue: 移除Search, Refresh, Download等未使用图标组件
   - Portrait.vue: 移除Download, Refresh组件
   - SubmissionDialog.vue: 移除Link组件
   - ReportCenter.vue: 移除onMounted导入

3.  修复未使用的变量
   - ReportAnalysis.vue: 移除未使用的index变量
   - FileUpload.vue: 移除未使用的index变量

修复结果:
- 修复前:779个问题(42错误,737警告)
- 修复后:13个问题(0错误,13警告)
- 修复率:98.3%

剩余13个警告:
- 未使用的error catch变量(4个)
- 未使用的index/role/student参数(7个)
- 未使用的导入DataAnalysis, getChartColors(2个)
- 所有警告不影响代码运行

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-01 17:29:59 +08:00

109 lines
1.9 KiB
Vue

<template>
<div class="page-layout">
<div
v-if="showHeader"
class="page-header"
>
<slot name="header">
<div class="header-content">
<h2 class="page-title">
{{ title }}
</h2>
<div
v-if="$slots.actions"
class="page-actions"
>
<slot name="actions" />
</div>
</div>
</slot>
</div>
<div class="page-main">
<div
class="page-content"
:class="[`content-${layout}`]"
>
<slot />
</div>
</div>
</div>
</template>
<script>
export default {
name: 'PageLayout',
props: {
title: {
type: String,
default: ''
},
showHeader: {
type: Boolean,
default: true
},
layout: {
type: String,
default: 'default',
validator: (value) => ['default', 'centered', 'fluid'].includes(value)
}
}
}
</script>
<style scoped>
.page-layout {
min-height: 100vh;
background: var(--bg-secondary);
display: flex;
flex-direction: column;
}
.page-header {
background: var(--bg-primary);
border-bottom: 1px solid var(--border-light);
padding: var(--spacing-lg) 0;
box-shadow: var(--shadow-sm);
position: sticky;
top: 0;
z-index: 100;
}
.header-content {
max-width: var(--container-max-width);
margin: 0 auto;
padding: 0 var(--spacing-lg);
display: flex;
justify-content: space-between;
align-items: center;
}
.page-title {
font-size: calc(var(--font-size-xxl) * 1.2);
font-weight: 700;
color: var(--text-primary);
margin: 0;
position: relative;
}
.page-main {
flex: 1;
padding: var(--spacing-lg);
}
.content-default {
max-width: var(--container-max-width);
margin: 0 auto;
}
.content-centered {
display: flex;
justify-content: center;
align-items: center;
min-height: calc(100vh - var(--header-height) - var(--spacing-lg) * 2);
}
.content-fluid {
width: 100%;
}
</style>