Align console UI with school-iot-admin and wire login to serverschool

UI / layout
- rebuild left mode: full-width blue header (60px) + white sidebar below + card-style tags view
- introduce design tokens in variables.css (brand #347df9, sidebar 240px, menu item 49px)
  and theme overrides for dark / dark-blue themes
- restyle navigation bar (logo + platform name / top nav / tools + user), logo, sidebar
  (selected state: light blue bg + blue bar + bold), tags view, app main
- global styles: .app-container white card, .head-title, .btn-blue/.btn-white,
  el-table / el-dialog look, brand color injected into --el-color-primary
- add favorites store (localStorage) wired to sidebar star and header top nav
- disable template watermark / footer / promo notifications by default

Login (serverschool)
- port school-iot-admin login page (background art, right side card, keep-login)
- OAuth2 password mode: GET /oauth/token (raw axios) + GET /uc/account/current
- port phone lookup (/wx/getAccoutList) and forget-password flow
  (/sms/sendCode + /sms/verifyCode) as components/login/Forget.vue
- user store exposes accountInfo / accountType / teamId / roleId and strips password

Infra
- move all devServer proxies and env vars from school-iot-admin/vue.config.js
  (default targets point to production)
- fix empty sidebar: guard short-circuit skipped setRoutes when login page already
  fetched user info
This commit is contained in:
2026-10-27 09:13:39 +08:00
parent 80b8218b23
commit 47dd605067
38 changed files with 1719 additions and 464 deletions
+51 -1
View File
@@ -16,8 +16,58 @@
@import "./view-transition.scss";
// 业务页面几乎都应该在根元素上挂载 class="app-container",以保持页面美观
// 视觉规范对齐 school-iot-admin:白卡片 + 10px 圆角 + 淡蓝阴影
.app-container {
padding: 20px;
padding: 16px 20px 20px;
background-color: var(--el-bg-color);
border-radius: 10px;
box-shadow: 0 0 10px rgba(32, 76, 131, 0.12);
}
// 页面标题(对齐 school-iot-admin 的 .head-title:左侧 6px 蓝色竖条)
.head-title {
position: relative;
display: flex;
align-items: center;
margin: 4px 0 16px;
padding-left: 14px;
font-size: 20px;
font-weight: 500;
color: var(--el-text-color-primary);
&::before {
content: "";
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
width: 6px;
height: 17px;
border-radius: 10px;
background-color: #347df9;
}
.tle {
margin: 0 5px;
}
}
// 主按钮(对齐 school-iot-admin 的 .btn-blue)
.btn-blue {
min-width: 68px;
border-radius: 2px;
font-weight: 500;
color: #ffffff;
background-color: #347df9;
border-color: #347df9;
}
// 次按钮(对齐 school-iot-admin 的 .btn-white)
.btn-white {
min-width: 68px;
border-radius: 2px;
font-weight: 500;
color: #347df9;
background-color: #ffffff;
border: 1px solid #347df9;
}
html {