Files
growth_report/ui/views/config_page.py
2025-12-19 21:37:44 +08:00

93 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from nicegui import ui
import os
from utils.template_utils import get_template_files
# 修改点 1统一导入避免与变量名 config 冲突
from config.config import load_config, save_config
def create_config_page():
# 修改点 2将加载逻辑放入页面生成函数内确保每次刷新页面获取最新值
conf_data = load_config("config.toml")
template_options = get_template_files()
current_filename = os.path.basename(conf_data.get('source_file', ''))
if current_filename and current_filename not in template_options:
template_options.append(current_filename)
ui.add_head_html('<link href="/assets/style.css" rel="stylesheet" />')
# 样式修正:添加全屏且不滚动条的 CSS
ui.add_head_html('''
<style>
body { overflow: hidden; }
.main-card { height: calc(100vh - 100px); display: flex; flex-direction: column; }
.q-tab-panels { flex-grow: 1; overflow-y: auto !important; }
</style>
''')
with ui.header().classes('app-header items-center justify-between shadow-md'):
# 左侧:图标和标题
with ui.row().classes('items-center gap-2'):
ui.image('/assets/icon.ico').classes('w-8 h-8').props('fit=contain')
ui.label('尚城幼儿园成长报告助手').classes('text-xl font-bold')
# 右侧:署名 + 配置按钮
with ui.row().classes('items-center gap-4'):
ui.label('By 寒寒 | 这里的每一份评语都充满爱意').classes('text-xs opacity-90')
ui.button(icon='home', on_click=lambda: ui.navigate.to('/')).props('flat round color=white')
# 修改点 3使用 flex 布局撑满
with ui.card().classes('w-full max-w-5xl mx-auto shadow-lg main-card p-0'):
with ui.tabs().classes('w-full') as tabs:
tab_path = ui.tab('路径设置', icon='folder')
tab_class = ui.tab('班级与教师', icon='school')
tab_ai = ui.tab('AI 接口配置', icon='psychology')
with ui.tab_panels(tabs, value=tab_path).classes('w-full flex-grow bg-transparent'):
# --- 路径设置 ---
with ui.tab_panel(tab_path).classes('w-full p-0'):
with ui.column().classes('w-full p-4 gap-4'):
source_file = ui.select(options=template_options, label='PPT 模板', value=current_filename).props('outlined fill-input').classes('w-full')
excel_file = ui.input('Excel 文件', value=os.path.basename(conf_data.get('excel_file', ''))).props('outlined').classes('w-full')
image_folder = ui.input('图片目录', value=os.path.basename(conf_data.get('image_folder', ''))).props('outlined').classes('w-full')
output_folder = ui.input('输出目录', value=os.path.basename(conf_data.get('output_folder', 'output'))).props('outlined').classes('w-full')
# --- 班级信息 ---
with ui.tab_panel(tab_class).classes('w-full p-0'):
with ui.column().classes('w-full p-4 gap-4'):
class_name = ui.input('班级名称', value=conf_data.get('class_name', '')).props('outlined').classes('w-full')
age_group = ui.select(
options=['小班上学期', '小班下学期', '中班上学期', '中班下学期', '大班上学期', '大班下学期'],
label='年龄段', value=conf_data.get('age_group', '中班上学期')
).props('outlined').classes('w-full')
teachers_text = ui.textarea('教师名单', value='\n'.join(conf_data.get('teachers', []))).props('outlined').classes('w-full h-40')
# --- AI 配置 ---
with ui.tab_panel(tab_ai).classes('w-full p-0'):
with ui.column().classes('w-full p-4 gap-4'):
ai_key = ui.input('API Key', value=conf_data['ai'].get('api_key', '')).props('outlined password').classes('w-full')
ai_url = ui.input('API URL', value=conf_data['ai'].get('api_url', '')).props('outlined').classes('w-full')
ai_model = ui.input('Model Name', value=conf_data['ai'].get('model', '')).props('outlined').classes('w-full')
ai_prompt = ui.textarea('System Prompt', value=conf_data['ai'].get('prompt', '')).props('outlined').classes('w-full h-full')
# 底部固定按钮
with ui.row().classes('w-full p-4'):
async def handle_save():
new_data = {
"source_file": source_file.value,
"excel_file": excel_file.value,
"image_folder": image_folder.value,
"output_folder": output_folder.value,
"class_name": class_name.value,
"age_group": age_group.value,
"teachers": [t.strip() for t in teachers_text.value.split('\n') if t.strip()],
"ai": {
"api_key": ai_key.value,
"api_url": ai_url.value,
"model": ai_model.value,
"prompt": ai_prompt.value
}
}
# 修改点 4直接调用导入的 save_config 函数名
success, message = save_config(new_data)
ui.notify(message, type='positive' if success else 'negative')
ui.button('保存配置', on_click=handle_save).classes('w-full py-4').props('outline color=primary')