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('') # 样式修正:添加全屏且不滚动条的 CSS ui.add_head_html(''' ''') with ui.header().classes('app-header items-center justify-between shadow-md'): # 左侧:图标和标题 with ui.row().classes('items-center gap-2'): ui.button(icon='arrow_back', on_click=lambda: ui.navigate.to('/')).props('flat round color=white') 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') # 修改点 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')