You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/.trae/skills/teacher-edu-style/SKILL.md

269 lines
15 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
name: teacher-edu-style
description: 应用教师端极简 SaaS 教育风(纯白画布 + 教育蓝 outline 按钮)到新页面或改造旧页面。Use when 用户要求教师端页面美化、统一按钮/输入框/间距、教育风格,或改 teacherEnd 下任意页面样式。Do not use for 学生端墨黑风或管理端深色风。
---
# 教师端 · 极简 SaaS 教育风
为教师端(roleId === 3)页面套用统一视觉。**只改视觉,不动业务逻辑。**
## 样式落点(先读,避免乱建文件)
| 层级 | 文件 | 责任 |
|------|------|------|
| 全局统一外观 | [teacher-light.scss](file:///d:/TZ/dianshang-qianduan/src/assets/styles/teacher-light.scss) | 按钮、输入框、弹窗、分页、表格配色。跨页通用规则写这里 |
| 页面自身布局 | 页面 `.vue` 的 `<style scoped>` | 布局、间距、卡片结构,引用令牌,不重复定义外观 |
| 旧深色残留 | [AppMain.vue](file:///d:/TZ/dianshang-qianduan/src/layout/components/AppMain.vue) | 非 scoped 块里禁止再写按钮渐变(见"覆盖陷阱") |
教师端 AppMain 根节点带 `teacher-main` 类,Navbar 带 `teacher-navbar`,可作为锚点。
## 页面骨架基准(以班级管理页为模板复刻,2026-09 定稿)
**后续所有教师端页面改造以 `teacherEnd/class/index.vue` 为参照实现复刻**(教师管理页已同步)。
### 根标签
| 规则 | 说明 |
|------|------|
| 只挂页面语义类 | 如 `<div class="class-page">` |
| **禁止 `app-container`** | 旧白卡包裹形态已废弃——白底+圆角+阴影+padding 会把整页包成一张大卡,与画布脱节。**教师端全部 15 页已迁移完成(2026-09-23),新增页面同样禁止** |
| **禁止页头 `page-header`** | 不设页头大卡(图标+标题+副标题+统计)。页面标题语境由筛选条/工具条承担;计数信息由分页"共 N 条"与筛选结果数展示。student、trainingTask 已删除 |
| 根类不设 background / padding | 留白由 `teacher-main` 提供(22px 24px 28px) |
### 画布(统一来源,页面不得自设)
`#app .teacherLayout .teacher-main` 浅蓝灰渐变(sidebar.scss L813-818:`#f7fafd → #eef4fb → #f5f8fc`)。页面根类与 scoped 一律不再声明背景,白卡片直接浮在画布上。
### 页面结构(自上而下)
1. **扁平筛选条**(无卡片底/边框)
2. **操作按钮行**(实心深蓝主按钮 + ghost 次级,全部带图标)
3. **白卡表格**(灰线、白表头、名称列首字徽标、自定义空状态)
4. **右对齐分页**(教育蓝当前页)
## 设计令牌(唯一定义点:teacher-light.scss 第 0 节)
**令牌挂在 `#app .teacherLayout` 上(teacher-light.scss 第 0 节,18 个变量)全端自动继承,页面 .vue 内禁止重复声明。**
例外:teleport 到 body 的弹层继承不到(如 trainingTask 抽屉 `.drawer-shell`,自带令牌块);教师端首页 `teacherEnd/index.vue` 用独立命名体系(--edu-text/--fs-display/--fw-*/--lh-*),不在标准令牌范围。
完整可复制的变量块见 [references/snippets.md](file:///d:/TZ/dianshang-qianduan/.trae/skills/teacher-edu-style/references/snippets.md)。速查:
### 颜色
| 令牌 | 值 | 用途 |
|------|------|------|
| `--edu-primary` | `#3b82f6` | 链接、描边、激活文字、图标 |
| `--edu-primary-deep` | `#2563eb` | hover 文字、axisPointer 标签底 |
| `--edu-primary-soft` | `#eff6ff` | 激活浅底、hover 浅底 |
| `--text-strong` | `#1f2937` | 标题、强调正文 |
| `--text-body` | `#6b7280` | 普通正文 |
| `--text-muted` | `#9ca3af` | 辅助、占位符 |
| `--border-color` | `#e5e7eb` | 卡片、输入框、分割线 |
| 语义色 | `#ef4444` 红 / `#2ba471` 绿 / `#f59e0b` 橙 | **只**表示状态(错误/成功/警示),不做装饰 |
画布纯白 `#ffffff`。禁止深色渐变背景、彩色表头、彩色按钮堆叠。
### 字号(6 级,紧凑体系)
| 令牌 | 值 | 用途 |
|------|------|------|
| `--fs-page` | `17px` | 页面标题 |
| `--fs-card` | `14px` | 卡片标题 |
| `--fs-body` | `12px` | 正文、按钮、输入框 |
| `--fs-tag` | `11px` | 标签、辅助、轴标签 |
| `--fs-kpi` | `26px` | KPI 大数字 |
| `--fs-num` | `20px` | 行内强调数字 |
字重:标题 `700`、按钮/强调 `600`、正文 `400`。行高 1.5(标题 1.35、数字 1)。
### 圆角
卡片 `12px`(`--r-card`);控件/按钮/行 `8px`(`--r-control`)。
## 按钮规范(重点)
**统一尺寸:高 36px、横向 padding 16px、8px 圆角、12px/600、transition 0.18s。**
### 主按钮 primary —— 方案 A 实心深蓝(默认,唯一主操作)
全页最多一个,承载"查询/提交/保存/新增"。落地配方见下方"方案 A 配方";描边 outline 降为备选变体(透明底 + 蓝边,视觉需要减重时用)。
**outline 备选变体:**
| 状态 | background | border | color |
|------|-----------|--------|-------|
| 默认 | `transparent` | `1px solid #3b82f6` | `#3b82f6` |
| hover/focus | `rgba(59,130,246,0.1)` | `#3b82f6` | `#2563eb` |
| active 按下 | `rgba(59,130,246,0.18)` | `#2563eb` | `#2563eb` |
| disabled | 透明 | 蓝 | 蓝 + opacity .5 |
无阴影、无位移。plain 朴素态同样式。写法见 snippets。
### 方案 A 配方(主按钮默认态,已全面落地 2026-09)
已落地:首页成绩管理中心"查询"、教师管理页"新增"、班级管理页全部实心 primary。三级深蓝 + 品牌染色阴影,按钮有"浮起"厚度感:
| 状态 | background | border | color | 阴影 |
|------|-----------|--------|-------|------|
| 默认 | `#2563eb` | `#2563eb` | `#fff` | `0 1px 2px rgba(37,99,235,.35), 0 3px 10px rgba(37,99,235,.22)` |
| hover/focus | `#1d4ed8` | `#1d4ed8` | `#fff` | 第二层阴影放大加深(抬升感) |
| active | `#1e40af` | `#1e40af` | `#fff` | 阴影收敛 + `translateY(1px)` |
字重 `500`(非 600/700)、过渡 `0.16s`。配套原则:**次级按钮一律幽灵化**(白底 + `#e5e7eb` 边 + `#1f2937` 字),整排只允许主按钮一个彩色——这是高级感的第一原则。
### 其他按钮
| 类型 | 样式 |
|------|------|
| 默认(取消) | 白底 + `#e5e7eb` 边 + `#1f2937` 字;hover 底 `#f9fafb`、边 `#9ca3af` |
| success / warning / danger | 实色(绿/橙/红)白字,只用于对应语义 |
| 表格行内文字按钮 | 透明底;primary 蓝、danger 红,无填充 |
| is-text / is-link 的 primary | 同样收敛为 outline |
### 按钮内图标(按钮必须配 EP 图标)
- 图标-文字间距由**全局接管**(teacher-light.scss:按钮层 + EP 内层 span 层双层 `gap: 8px` + icon margin 清零),页面无需再写
- EP `.el-icon` 默认间距仅 6px 且对裸文字节点无效;**自定义 SVG 必须显式 `gap: 8px`**,否则图标贴文字
- 图标尺寸 `14px`,用 `currentColor` 自动跟随文字颜色(不要写死 fill)
- 工具条按钮语义:搜索→Search、新增→Plus、导入→Upload、导出→Download、模板下载→Document、刷新→Refresh;行内:编辑→Edit、删除→Delete、密码初始化→Key
## 输入框规范(input / select / date 完全一致)
| 属性 | 值 |
|------|------|
| 高 | `36px`(与按钮同高) |
| 圆角 | `8px` |
| 背景/边框 | 白底 + `1px solid #e5e7eb` |
| hover 边 | `#d1d5db`;focus 边 `#3b82f6` + `0 0 0 3px rgba(59,130,246,0.12)` 光晕 |
| 文字 | 12px、`#1f2937`;placeholder `#9ca3af` |
**EP 关键坑:select 的边框在 `.el-select__wrapper` 上,不在 `.el-input__wrapper`。两个选择器必须同步覆盖**,否则下拉框和输入框对不齐。禁用态浅灰底 `#f3f4f6`。
## 间距规范(重点)
4px 基准,只允许 5 档:
| 令牌 | 值 | 用途 |
|------|------|------|
| `--sp-1` | `4px` | 图标与紧贴文字 |
| `--sp-2` | `8px` | 同组元素 gap、行内间距 |
| `--sp-3` | `12px` | 分区竖向间距、卡片内分组 |
| `--sp-4` | `16px` | 大区块 gap、卡片 padding |
| `--sp-5` | `20px` | 页面级大分区间距 |
- 卡片 padding `16px`;卡片标题与内容间距 `12px`
- 筛选条**扁平化**:无卡片背景/边框/阴影,直接落在画布上(class 页 `.query-bar`、teacher 页 `.df` 均已扁平);字段间距 `12px`,字段统一宽 `200px`(`--field-w`)
- KPI 卡行 gap `16px`;图表双栏 gap `16px`
### 留白责任分层(防 padding 叠加,反复踩过)
1. **app-main 自带 padding,页面根类不许再写页面级 padding/背景**
2. 卡片、分区内部才写内容 padding
3. 禁止在系统层(teacherLayout/main-container/app-main/app-container)为单个页面加 padding 覆盖
4. 不允许双层 app-main + app-container 同时留白
## 背景规范
- 全链路(teacherLayout → main-container → app-main → app-container → 页面)在教育风页面统一纯白
- 卡片:白底 + `1px #e5e7eb` 边 + 极淡阴影 `0 1px 3px rgba(0,0,0,0.06)`,hover 不上色(需要时轻微上浮可选)
- 图表:`backgroundColor: "transparent"`,tooltip 白底深字
- 图表悬停轴标签(axisPointer.label):`#2563eb` 底 + 白字,默认浅蓝底白字看不清,必须显式设置
## 表格风格规范
整体:**纯白底、灰色细线、无彩色填充、无发光**。结构与层次如下。
### 表格容器
| 属性 | 值 |
|------|------|
| `background` | `#ffffff` |
| `border` | `1px solid #e5e7eb` |
| `border-radius` | `12px`(卡片级),`overflow: hidden` |
| 阴影 | 无(表格已在卡片内时)或极淡 `0 1px 3px rgba(0,0,0,0.06)` |
| CSS 变量 | `--el-table-bg-color` / `--el-table-tr-bg-color` 均 `#ffffff` |
### 表头(不靠填充区分)
| 属性 | 值 |
|------|------|
| `--el-table-header-bg-color` | `#ffffff`(禁止 `#e3effb` 等浅蓝)|
| 表头 th 背景 | `#ffffff !important`,禁止 linear-gradient |
| 文字 | `#1f2937`、13px、600、无 text-shadow |
| border-bottom | `1px solid #e5e7eb`(表头与数据行唯一分界)|
| 表头高度 | 38px;`.cell` 文字同步样式 |
| 页面 `tableHeaderStyle` 内联对象 | 同步白底 + `#1f2937` 字 |
### 数据行
| 属性 | 值 |
|------|------|
| 行背景 | `#ffffff`(透明),禁止斑马纹彩色 |
| 文字 | `#1f2937`、12px(`--fs-body`)|
| 行分隔线 | `1px solid #e5e7eb`(`--el-table-border-color`)|
| 行 hover | `#f9fafb`(中性灰,禁止浅蓝 `#eff6ff`)|
| 单元格 padding | 纵向 12px 左右,保持紧凑 |
| 选中/当前行 | 仅在确需时用极淡灰,不引入蓝底 |
### 单元格内元素
- 状态用 `el-tag`:成功绿 / 警示橙 / 信息灰,**标签本身保留语义浅底**(小面积,不影响整表白底)
- 行内操作按钮:文字按钮透明底,primary 蓝、danger 红,按钮间 `gap: 8px`
- 空数据:居中、`#9ca3af`、12px,不额外加色块
### 分页
- 白底;页码按钮灰边,当前页教育蓝底白字(小面积强调)
- "共 N 条 / 每页条数" 文字 `#6b7280`、12px
- 分页与表格间距 `16px`,右对齐
### 名称列首字徽标(实体表标配)
实体名称列(班级/教师/学生等)用**22px** 教育蓝软底首字方块(紧凑行高):`--edu-primary-soft` 底 + `--edu-primary` 字 + 6px 圆角 + 11px/600,名称 600 加粗。**列必须左对齐**(`align="left"`,徽标起点垂直成线,禁止居中导致徽标随名称长度浮动)。页面 scoped 写 22px;teacher-light.scss 表格区已有全局 `[class$="-badge"]` 紧凑覆盖兜底。参考 student 页 `.name-cell` / task 页 `.task-badge`。
### 自定义空状态(标配)
`<template #empty>` + `FolderOpened` 图标(28px、`--text-muted`)+ "暂无XX"(600)+ 引导语"可通过XX'新增'按钮创建"(`--fs-tag`)。参考 `.table-empty`,禁止 EP 默认灰色"暂无数据"。
### 防横向滚动(教师管理页教训)
1. 行内操作必须用**透明文字按钮**(实心胶囊 ~230px 会撑爆操作列导致溢出)
2. 各列用 `min-width` 弹性分配(名下班级 200、学生数量 90),禁固定宽叠加超出容器
3. 表格容器 `overflow: hidden` + 圆角由外层卡控制
### 落地位置
跨页通用表格外观写 teacher-light.scss;页面 scoped 只做布局与列宽。注意 EP 表格变量(`--el-table-header-bg-color` 等)是注入暗色的常见入口,必须显式覆盖。
## 实施步骤
1. 读目标页面,确认所属层级与现有类名;**对照"页面骨架基准"检查根标签**(去掉 `app-container`、根类无背景/padding)
2. 通用外观缺什么补到 teacher-light.scss(按钮/输入框/表格/图标间距均已覆盖,不要重复写);**禁止在页面重复声明 18 个全局令牌**
3. 页面 scoped 里只写布局与间距,全部引用令牌,硬编码色值归零;**按钮外观改动一律写进 teacher-light.scss**(见陷阱 5)
4. 图表 tooltip / axisPointer 按本规范设置
5. 浏览器实测:getComputedStyle 同时检查 `backgroundColor` 和 `backgroundImage`(见陷阱)
6. Ctrl+F5 或确认 dev server 端口是最新进程
## 覆盖陷阱(必读,均真实发生过)
1. **background 简写污染 background-image**:旧规则 `.teacher-main .el-button--primary{background:linear-gradient(...)}` 会把渐变写进 `background-image`,只覆盖 `background-color:transparent` 无效。必须同时 `background-image:none !important`,或从源头删渐变。
2. **陈旧 dev server**:多实例时 Vite 顺延端口(147→148),旧端口不热更新全局 scss。改了没反应先核对浏览器端口对应最新进程并重启。
3. **select wrapper 独立**:见输入框坑。
4. **EP `-webkit-text-fill-color`**:select 选中值可能透明,必要时显式设置。
5. **页面 scoped 永远赢不了按钮外观覆盖**:teacher-light.scss 全部规则挂在 `#app .teacherLayout` 下,id 特异性 + `!important` 必然压过页面 scoped 同类规则(scoped 无 id,即使都带 `!important`)。改按钮/输入框外观**必须写进 teacher-light.scss**,且类链要足够长——如 `#app .teacherLayout .grade-center .filter-bar .search-btn`(1id+4class)才能压过 primary 重铸规则(1id+3class)。真实案例:首页查询按钮在 scoped 写实心深蓝完全不生效,提升到全局后立即生效。页面 scoped 只写布局(间距/尺寸/图标),注释注明外观归全局。
## 完成验证清单
- [ ] 根标签只挂语义类、无 `app-container`、无背景/padding(骨架基准)
- [ ] 页面内无重复令牌声明(18 个全局令牌来自 teacher-light.scss 第 0 节)
- [ ] 无硬编码色值(除语义状态、3px 装饰条、图表内模板)
- [ ] 主按钮方案 A 实心深蓝(唯一彩色)+ 次级 ghost + 按钮全部带图标(间距 8px 全局接管)
- [ ] 输入框与按钮同高 36px,input/select/date 外观一致
- [ ] 筛选条扁平无卡片底
- [ ] 表格:白表头 + 灰横线 + 名称列首字徽标 + 自定义空状态 + 无横向滚动
- [ ] 间距只用 5 档令牌,无随意像素值
- [ ] 字号只用 6 级令牌
- [ ] 页面根类无重复 padding/背景
- [ ] GetDiagnostics 无报错
- [ ] 真实鼠标验证 hover / 轴标签可读性