智教助手平台:完整初始化

- 前端:Vue3 + TS + Element Plus,24 个页面路由(课件/组题/教案/动画/思维导图/作文批改/命题/课堂/资源/社区等)
- 后端:FastAPI + SQLAlchemy + SQLite,17 个路由模块,AI 服务层含降级模板
- AI:glm-5.x 推理模型已禁用思维链,确保输出真实内容
- 修复:ai_service 两处请求体注入 enable_thinking/thinking disabled
- 测试账号:13900999999 / test1234
This commit is contained in:
Zhang Jing Xuan
2026-07-29 16:29:10 +08:00
commit 0841b1a103
193 changed files with 44995 additions and 0 deletions
+403
View File
@@ -0,0 +1,403 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body, #app {
height: 100%;
font-family: 'PingFang SC', -apple-system, BlinkMacSystemFont, 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
:root {
--primary: #00543D;
--primary-light: #98D997;
--primary-dark: #004532;
--primary-bg: #E8F5EA;
--accent: #2563EB;
--warning: #F59E0B;
--ink: #14213D;
--gradient: linear-gradient(135deg, #0F766E 0%, #14B8A6 52%, #2DD4BF 100%);
--gradient-blue: linear-gradient(135deg, #2563EB 0%, #06B6D4 100%);
--gradient-green: linear-gradient(135deg, #0F766E 0%, #22C55E 100%);
--gradient-orange: linear-gradient(135deg, #F59E0B 0%, #F97316 100%);
--gradient-red: linear-gradient(135deg, #DC2626 0%, #FB7185 100%);
--gradient-pink: linear-gradient(135deg, #DB2777 0%, #F472B6 100%);
--gradient-cyan: linear-gradient(135deg, #0891B2 0%, #22D3EE 100%);
--text-primary: #111827;
--text-secondary: #4B5563;
--text-muted: #8A94A6;
--border-color: #DCE8DE;
--bg-color: #F7FAF6;
--bg-white: #FFFFFF;
--sidebar-width: 252px;
--sidebar-collapsed: 82px;
--header-height: 58px;
--radius-sm: 8px;
--radius-md: 12px;
--radius-lg: 12px;
--radius-xl: 16px;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.06);
}
.page-container {
width: 100%;
max-width: 1480px;
margin: 0 auto;
padding: 22px 32px 28px;
background: var(--bg-color);
min-height: calc(100vh - var(--header-height));
}
.page-header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
margin-bottom: 28px;
}
.page-header h2 {
font-size: 25px;
font-weight: 900;
color: var(--primary);
}
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 16px;
}
.gen-input-section,
.guide-card,
.question-card,
.phase-content,
.resource-card,
.post-card {
border-radius: 14px !important;
border-color: #dce8de !important;
box-shadow: none !important;
}
.guide-cards {
display: grid !important;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)) !important;
gap: 12px !important;
}
.settings-row,
.settings-grid,
.filter-bar {
flex-wrap: wrap;
}
.settings-grid {
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)) !important;
}
.gen-hero {
max-width: 1120px;
margin: 0 auto 18px !important;
align-items: center !important;
}
.gen-hero-icon {
width: 42px !important;
height: 42px !important;
border-radius: 50% !important;
background: #fff !important;
border: 1px solid #d6e4d8 !important;
color: var(--primary) !important;
}
.gen-hero-icon .el-icon,
.gen-hero-icon svg {
color: var(--primary) !important;
}
.gen-hero h2 {
font-size: 25px !important;
color: var(--primary) !important;
font-weight: 900 !important;
}
.gen-hero p {
color: #75867f !important;
font-size: 14px !important;
}
.gen-input-section {
max-width: 1120px;
margin: 0 auto 22px !important;
background: rgba(255,255,255,0.86) !important;
border: 1px solid #cfe0d3 !important;
border-radius: 18px !important;
box-shadow: 0 18px 42px rgba(17, 69, 52, 0.07) !important;
}
.prompt-box :deep(.el-textarea__inner),
.input-area :deep(.el-textarea__inner),
.essay-input :deep(.el-textarea__inner),
.setting-full :deep(.el-textarea__inner) {
background: #fff !important;
border: 1px solid #dce8de !important;
border-radius: 14px !important;
color: #173f35 !important;
}
.prompt-tag,
.sug-tag,
.type-check,
.hot-tag {
border-radius: 18px !important;
background: #fff !important;
border: 1px solid #dce8de !important;
color: #51665f !important;
}
.prompt-tag:hover,
.sug-tag:hover,
.type-check.checked,
.hot-tag:hover {
background: #e8f5ea !important;
border-color: #a8cfab !important;
color: var(--primary) !important;
}
.gen-btn,
.generate-btn,
.create-btn,
.upload-btn,
.grade-btn,
.save-btn,
.action-btn.primary {
background: #00543d !important;
border-radius: 13px !important;
box-shadow: none !important;
}
.guide-section,
.result-section,
.essay-input-panel,
.essay-result-panel,
.info-tags,
.homework-section,
.filter-bar,
.community-layout,
.content-area {
max-width: 1120px;
margin-left: auto;
margin-right: auto;
}
.guide-card,
.guide-item,
.question-card,
.phase-content,
.resource-card,
.post-card,
.cw-card,
.input-card,
.result-panel,
.essay-input-panel,
.essay-result-panel,
.hot-tags-card {
border: 1px solid #dce8de !important;
border-radius: 14px !important;
box-shadow: none !important;
}
.cw-cover,
.template-cover,
.card-thumb {
border-radius: 10px;
margin: 5px;
}
.el-input__wrapper,
.el-textarea__inner,
.el-select__wrapper {
box-shadow: none !important;
border: 1px solid #dce8de !important;
background: #fff !important;
}
@media (max-width: 760px) {
.page-container {
padding: 14px;
}
.page-header {
align-items: flex-start;
flex-direction: column;
margin-bottom: 18px;
}
.prompt-footer,
.result-header,
.header-actions {
align-items: stretch !important;
flex-direction: column !important;
}
}
/* Element Plus overrides */
.el-card {
border-radius: var(--radius-lg) !important;
border: 1px solid var(--border-color) !important;
box-shadow: var(--shadow-sm) !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
}
.el-card:hover {
box-shadow: var(--shadow-lg) !important;
transform: translateY(-2px);
}
.el-button--primary {
background: var(--gradient) !important;
border: none !important;
border-radius: var(--radius-sm) !important;
font-weight: 500 !important;
}
.el-button--primary:hover {
opacity: 0.9;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(79, 70, 229, 0.4) !important;
}
.el-input__wrapper,
.el-textarea__inner,
.el-select__wrapper {
border-radius: var(--radius-sm) !important;
}
.el-form-item__label {
font-weight: 500 !important;
color: var(--text-secondary) !important;
}
/* Dialog */
.el-dialog {
border-radius: var(--radius-lg) !important;
overflow: hidden;
}
.el-dialog__header {
border-bottom: 1px solid var(--border-color);
padding: 20px 24px !important;
margin-right: 0 !important;
}
.el-dialog__title {
font-weight: 600 !important;
font-size: 17px !important;
color: var(--text-primary) !important;
}
.el-dialog__body {
padding: 24px !important;
}
.el-dialog__footer {
border-top: 1px solid var(--border-color);
padding: 16px 24px !important;
}
/* Tag */
.el-tag {
border-radius: 6px !important;
}
/* Dropdown */
.el-dropdown-menu__item {
border-radius: 6px !important;
margin: 2px 6px !important;
padding: 8px 16px !important;
}
/* Message */
.el-message {
border-radius: var(--radius-sm) !important;
box-shadow: var(--shadow-lg) !important;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: #CBD5E1;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #94A3B8;
}
/* Skeleton loading */
.skeleton {
background: linear-gradient(90deg, #F1F5F9 25%, #E2E8F0 50%, #F1F5F9 75%);
background-size: 200% 100%;
animation: shimmer 1.5s ease-in-out infinite;
border-radius: var(--radius-sm);
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* Animations */
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideInLeft {
from { opacity: 0; transform: translateX(-20px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-20px); }
}
@keyframes floatSlow {
0%, 100% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-15px) rotate(3deg); }
}
@keyframes pulse {
0%, 100% { opacity: 0.6; }
50% { opacity: 1; }
}
@keyframes bounce {
0%, 80%, 100% { transform: scale(0); }
40% { transform: scale(1); }
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* Utility classes */
.fade-in-up {
animation: fadeInUp 0.5s ease both;
}
/* Selection */
::selection {
background: var(--primary-bg);
color: var(--primary);
}