From 638d7bb42f394270b9b85c99277225f0e9f44f35 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 07:28:22 +0000 Subject: [PATCH 1/3] feat: show 20 schedules, detailed stats, and privacy notice - Increased schedule display limit to 20 with horizontal scrolling. - Added comprehensive stats (credits, hours, weeks) and score breakdown. - Implemented system save dialog for screenshots. - Added privacy disclaimer to header. - Updated backend to extract credit and hours from API. --- backend/ranker.py | 93 ++++++++++++------------- jwFetcher.py | 13 ++++ main.py | 81 ++++++++++++++++++++- server.log | 16 +++++ static/app.js | 34 +++++++-- static/index.html | 33 +++++++-- tests/saved_sessions/test_session.json | 2 +- verification/verification.png | Bin 0 -> 67931 bytes verification/verify_frontend.py | 72 +++++++++++++++++++ verification/verify_frontend_robust.py | 71 +++++++++++++++++++ 10 files changed, 352 insertions(+), 63 deletions(-) create mode 100644 server.log create mode 100644 verification/verification.png create mode 100644 verification/verify_frontend.py create mode 100644 verification/verify_frontend_robust.py diff --git a/backend/ranker.py b/backend/ranker.py index 8647202..e2a926c 100644 --- a/backend/ranker.py +++ b/backend/ranker.py @@ -2,18 +2,14 @@ class ScheduleRanker: @staticmethod - def score_schedule(schedule, preferences): + def evaluate_schedule(schedule, preferences): """ - Scores a schedule based on preferences. - Lower score is better? Or Higher? Let's say Higher is better. - - Preferences: - - avoid_early_morning (bool): 1-2节 - - avoid_weekend (bool): Sat/Sun - - compactness (str): "high" (bunch together), "low" (spread out), "none" - - max_daily_load (int): Penalty if > X + Evaluates a schedule based on preferences and returns score + breakdown. """ - score = 100.0 + base_score = 100.0 + details = {} + total_penalty = 0.0 + total_bonus = 0.0 # Merge bitmaps full_bitmap = [0] * 30 # Assume max weeks 25 @@ -29,14 +25,12 @@ def score_schedule(schedule, preferences): val = 0 full_bitmap[w] |= val - # 1. Avoid Early Morning (Nodes 1-2 -> Bits 0-1, 13-14, etc.) + # 1. Avoid Early Morning if preferences.get('avoid_early_morning'): penalty = 0 - for w in range(1, 26): # Check typical weeks + for w in range(1, 26): mask = full_bitmap[w] if mask == 0: continue - # Early morning mask: Day 0..6, Nodes 0..1 - # Bit pos = day*13 + node early_mask = 0 for d in range(7): early_mask |= (1 << (d * 13 + 0)) @@ -44,14 +38,15 @@ def score_schedule(schedule, preferences): if (mask & early_mask): penalty += 1 - score -= penalty * 2 # 严格惩罚早八 - # 2. Avoid Weekend (Days 5, 6) + p_val = penalty * 2 + total_penalty += p_val + details['早八回避'] = -p_val + + # 2. Avoid Weekend if preferences.get('avoid_weekend'): penalty = 0 weekend_mask = 0 - # Day 5 (Sat), Day 6 (Sun). All 13 nodes. - # Bits 65-77 (Sat), 78-90 (Sun) ... wait 5*13=65. for node in range(13): weekend_mask |= (1 << (5 * 13 + node)) weekend_mask |= (1 << (6 * 13 + node)) @@ -59,14 +54,13 @@ def score_schedule(schedule, preferences): for w in range(1, 26): if (full_bitmap[w] & weekend_mask): penalty += 1 - score -= penalty * 2.0 # Higher penalty for weekends - # 3. Compactness (Variance of start times? Or density?) - # Let's use daily variance. - # Compact -> High density, few gaps. - # Spread -> Evenly distributed. + p_val = penalty * 2.0 + total_penalty += p_val + details['周末回避'] = -p_val + + # 3. Compactness if preferences.get('compactness') in ['high', 'low']: - # Calculate gaps total_gaps = 0 for w in range(1, 26): mask = full_bitmap[w] @@ -75,10 +69,6 @@ def score_schedule(schedule, preferences): day_bits = (mask >> (d * 13)) & 0x1FFF if day_bits == 0: continue - # Convert to string binary to find 101 patterns (gap) - bin_str = bin(day_bits)[2:].zfill(13) # LSB is 1st class? - # Actually LSB is node 0 (1st class). `bin` output is MSB left. - # Let's just iterate has_started = False gap_count = 0 current_gap = 0 @@ -96,9 +86,13 @@ def score_schedule(schedule, preferences): total_gaps += gap_count if preferences['compactness'] == 'high': - score -= total_gaps * 0.2 # Penalty for gaps + p_val = total_gaps * 0.2 + total_penalty += p_val + details['课程紧凑'] = -p_val else: - score += total_gaps * 0.2 # Bonus for gaps (spread) + b_val = total_gaps * 0.2 + total_bonus += b_val + details['课程分散'] = +b_val # 4. Max Daily Load limit = preferences.get('max_daily_load') @@ -109,40 +103,43 @@ def score_schedule(schedule, preferences): if mask == 0: continue for d in range(7): day_bits = (mask >> (d * 13)) & 0x1FFF - # Count set bits count = bin(day_bits).count('1') if count > limit: overload += (count - limit) - score -= overload * 5.0 # Heavy penalty + p_val = overload * 5.0 + total_penalty += p_val + details['每日负载'] = -p_val - # 5. Day Max Limit (Specific Days) + # 5. Day Max Limit if preferences.get('day_max_limit_enabled'): limit = preferences.get('day_max_limit_value', 4) - target_days = preferences.get('day_max_limit_days', []) # List of bools, idx 0=Mon - - penalty = 0 - # Ensure target_days has 7 elements + target_days = preferences.get('day_max_limit_days', []) if len(target_days) < 7: target_days = target_days + [False] * (7 - len(target_days)) + penalty = 0 for w in range(1, 26): mask = full_bitmap[w] if mask == 0: continue - for d in range(7): - # Check if this day is selected for limiting - if not target_days[d]: - continue - + if not target_days[d]: continue day_bits = (mask >> (d * 13)) & 0x1FFF count = bin(day_bits).count('1') - if count > limit: - # Penalty calculation - # If limit is 0 (day off), any class is bad. diff = count - limit - penalty += diff * 50.0 # Very heavy penalty + penalty += diff * 50.0 - score -= penalty + p_val = penalty + total_penalty += p_val + details['特定日限制'] = -p_val - return score + final_score = base_score + total_bonus - total_penalty + return { + 'score': final_score, + 'details': details + } + + @staticmethod + def score_schedule(schedule, preferences): + result = ScheduleRanker.evaluate_schedule(schedule, preferences) + return result['score'] diff --git a/jwFetcher.py b/jwFetcher.py index 35e7795..bbde736 100644 --- a/jwFetcher.py +++ b/jwFetcher.py @@ -338,10 +338,23 @@ def search(self, course_name=None, course_code=None, campus="1", semester="2025- # 调用正则解析器 bitmap, sessions = ScheduleBitmapper.generate_bitmap(raw_loc) + # Try to extract credit (XF) and hours (XS) + try: + credit = float(row.get("XF", 0)) + except: + credit = 0.0 + + try: + hours = float(row.get("XS", 0)) + except: + hours = 0.0 + item = { "name": row.get("KCM"), "code": row.get("KCH"), "teacher": teacher, + "credit": credit, + "hours": hours, "location_text": raw_loc, "school": row.get("PKDWDM_DISPLAY") or row.get("KKDWDM_DISPLAY"), # 输出二进制列表 (核心) diff --git a/main.py b/main.py index 743e858..10702b3 100644 --- a/main.py +++ b/main.py @@ -59,18 +59,93 @@ def generate_schedules(self, groups, preferences): raw_schedules = ScheduleSolver.generate_schedules(groups, preferences=preferences) print(f"[Api] Found {len(raw_schedules)} valid schedules") - # 3. Rank + # 3. Rank and Enrich ranker = ScheduleRanker() ranked = [] for s in raw_schedules: - score = ranker.score_schedule(s, preferences) - ranked.append({'courses': s, 'score': score}) + eval_result = ranker.evaluate_schedule(s, preferences) + score = eval_result['score'] + details = eval_result['details'] + + # Calculate stats + total_credits = 0.0 + total_hours = 0 + + # Find week span + min_week = 999 + max_week = -1 + has_classes = False + + for course in s: + total_credits += course.get('credit', 0) + + # Use official hours if available, else calculate + if course.get('hours', 0) > 0: + total_hours += course.get('hours') + else: + # Calculate hours from sessions fallback + for sess in course.get('sessions', []): + p_len = sess['end'] - sess['start'] + 1 + w_len = len(sess['weeks']) + total_hours += (p_len * w_len) + + # Update week span (always needed) + for sess in course.get('sessions', []): + if sess['weeks']: + has_classes = True + min_week = min(min_week, min(sess['weeks'])) + max_week = max(max_week, max(sess['weeks'])) + + avg_weekly = 0.0 + if has_classes and max_week >= min_week: + span = max_week - min_week + 1 + if span > 0: + avg_weekly = total_hours / span + + ranked.append({ + 'courses': s, + 'score': score, + 'score_details': details, + 'stats': { + 'total_credits': round(total_credits, 1), + 'total_hours': total_hours, + 'avg_weekly_hours': round(avg_weekly, 1), + 'week_span': f"{min_week}-{max_week}" if has_classes else "N/A" + } + }) # Sort desc ranked.sort(key=lambda x: x['score'], reverse=True) return {'schedules': ranked} + def save_image_dialog(self, base64_data): + import base64 + try: + active_window = webview.windows[0] + file_path = active_window.create_file_dialog( + webview.SAVE_DIALOG, + directory='', + save_filename='schedule.png', + file_types=('PNG Image (*.png)', 'All files (*.*)') + ) + + if file_path: + if isinstance(file_path, (list, tuple)): + file_path = file_path[0] + + # Remove header if present + if ',' in base64_data: + base64_data = base64_data.split(',')[1] + + with open(file_path, "wb") as f: + f.write(base64.b64decode(base64_data)) + return True + return False + except Exception as e: + print(f"[Api] Save Image Error: {e}") + return False + def save_session(self, groups_json, prefs_json): try: groups = json.loads(groups_json) diff --git a/server.log b/server.log new file mode 100644 index 0000000..01b331c --- /dev/null +++ b/server.log @@ -0,0 +1,16 @@ +127.0.0.1 - - [10/Jan/2026 07:22:19] "GET /static/index.html HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:22:19] "GET /static/vue.global.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:22:19] "GET /static/app.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:22:19] "GET /static/html2canvas.min.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:23:49] "GET /static/index.html HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:23:49] "GET /static/app.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:23:49] "GET /static/html2canvas.min.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:23:49] "GET /static/vue.global.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:21] "GET /static/index.html HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:21] "GET /static/app.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:21] "GET /static/vue.global.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:21] "GET /static/html2canvas.min.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/index.html HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/vue.global.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/app.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/html2canvas.min.js HTTP/1.1" 200 - diff --git a/static/app.js b/static/app.js index a70bb23..0245165 100644 --- a/static/app.js +++ b/static/app.js @@ -252,7 +252,17 @@ createApp({ } else { // Mock schedules.value = [ - { score: 95, courses: [groups.value[0].candidates[0]] } + { + score: 95, + score_details: {'早八回避': -2, '课程紧凑': 5}, + stats: { + 'total_credits': 22.5, + 'total_hours': 400, + 'avg_weekly_hours': 25.0, + 'week_span': '1-16' + }, + courses: [groups.value[0].candidates[0]] + } ]; currentView.value = 'results'; } @@ -330,11 +340,23 @@ createApp({ const downloadImage = () => { const el = document.getElementById('capture-area'); if(window.html2canvas) { - window.html2canvas(el).then(canvas => { - const link = document.createElement('a'); - link.download = 'schedule.png'; - link.href = canvas.toDataURL(); - link.click(); + window.html2canvas(el).then(async (canvas) => { + const dataUrl = canvas.toDataURL(); + if (window.pywebview) { + // Use backend dialog + const success = await window.pywebview.api.save_image_dialog(dataUrl); + if (success) { + showToast("图片已保存"); + } else { + showToast("保存取消或失败"); + } + } else { + // Fallback for browser testing + const link = document.createElement('a'); + link.download = 'schedule.png'; + link.href = dataUrl; + link.click(); + } }); } }; diff --git a/static/index.html b/static/index.html index fc4a236..bfcaf15 100644 --- a/static/index.html +++ b/static/index.html @@ -10,7 +10,7 @@ body { font-family: "Microsoft YaHei", sans-serif; margin: 0; padding: 0; background: #f5f5f5; color: #333; } .container { max-width: 1200px; margin: 0 auto; padding: 20px; } header { background: #6200ea; color: white; padding: 15px 20px; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } - h1 { margin: 0; font-size: 1.2rem; } + h1 { margin: 0; font-size: 1.2rem; display: flex; align-items: baseline; } button { background: #03dac6; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; font-weight: bold; transition: 0.2s; } button:hover { opacity: 0.9; } button.secondary { background: #ccc; } @@ -55,7 +55,11 @@
-

🐋南哪选课助手 当前组数: {{ groups.length }}

+

+ 🐋南哪选课助手 + 当前组数: {{ groups.length }} + 本app所有内容在本地处理,仅获取必要的cookie,不存储用户密码.所有内容只是算法生成,不作为完全参考. +

@@ -230,11 +234,12 @@

偏好设置

推荐方案 (共 {{ schedules.length }} 个)

-
@@ -246,6 +251,24 @@

第 {{ currentScheduleIdx + 1 }} 方案课表

+ +
+
+ 总学分: {{ schedules[currentScheduleIdx].stats?.total_credits }} + 总学时: {{ schedules[currentScheduleIdx].stats?.total_hours }} + 周平均学时: {{ schedules[currentScheduleIdx].stats?.avg_weekly_hours }} + 活跃周次: {{ schedules[currentScheduleIdx].stats?.week_span }} +
+
+ 评分详情: + 基准分: 100 + + {{ key }}: {{ val > 0 ? '+' : ''}}{{ val }} + + = {{ parseInt(schedules[currentScheduleIdx].score) }} +
+
+ diff --git a/tests/saved_sessions/test_session.json b/tests/saved_sessions/test_session.json index ce9924b..a697e94 100644 --- a/tests/saved_sessions/test_session.json +++ b/tests/saved_sessions/test_session.json @@ -1,5 +1,5 @@ { - "timestamp": "2026-01-09T12:26:45.250661", + "timestamp": "2026-01-10T07:21:12.966277", "groups": [ { "id": 1, diff --git a/verification/verification.png b/verification/verification.png new file mode 100644 index 0000000000000000000000000000000000000000..679b17c164a18de964b04f3d491d1bc64d0d0a54 GIT binary patch literal 67931 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 literal 0 HcmV?d00001 diff --git a/verification/verify_frontend.py b/verification/verify_frontend.py new file mode 100644 index 0000000..59ff5ba --- /dev/null +++ b/verification/verify_frontend.py @@ -0,0 +1,72 @@ +from playwright.sync_api import sync_playwright + +def verify_frontend(): + with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page() + + # Access the index.html directly from the static server + page.goto("http://localhost:8080/static/index.html") + + # 1. Verify Privacy Text is present + # It's in the header h1 span with specific text + privacy_text = page.locator("header h1 span").nth(1) + if privacy_text.is_visible() and "本app所有内容在本地处理" in privacy_text.inner_text(): + print("[SUCCESS] Privacy text found.") + else: + print("[FAIL] Privacy text not found or incorrect.") + + # 2. Verify Stats Display logic + # We need to simulate having schedules. + # Inject mock data into the Vue app + page.evaluate(""" + const app = document.getElementById('app').__vue_app__._instance; + app.setupState.schedules = [ + { + score: 95, + score_details: {'早八回避': -2, '课程紧凑': 5}, + stats: { + 'total_credits': 22.5, + 'total_hours': 400, + 'avg_weekly_hours': 25.0, + 'week_span': '1-16' + }, + courses: [] + }, + { score: 90, courses: [] } + ]; + app.setupState.currentView = 'results'; + app.setupState.currentScheduleIdx = 0; + """) + + # Wait for render + page.wait_for_timeout(500) + + # Check Stats Section + stats_section = page.locator("#capture-area div").first + content = stats_section.inner_text() + print(f"Stats Content: {content}") + + if "总学分: 22.5" in content and "早八回避: -2" in content: + print("[SUCCESS] Stats and score details displayed.") + else: + print("[FAIL] Stats incorrect.") + + # 3. Verify Schedule Buttons container styles + # Check if flex-shrink: 0 is applied to buttons + # We can check CSS property + buttons_container = page.locator(".card .secondary").first.locator("..") # parent div + # Actually checking if buttons have flex-shrink: 0 + btn = page.locator(".card button").nth(0) # First scheme button? + # The scheme buttons are inside a div with overflow-x: auto + # Selector: div with padding-bottom: 10px > button + scheme_btn = page.locator("button", has_text="方案 1") + + # Take screenshot + page.screenshot(path="verification/verification.png") + print("Screenshot saved.") + + browser.close() + +if __name__ == "__main__": + verify_frontend() diff --git a/verification/verify_frontend_robust.py b/verification/verify_frontend_robust.py new file mode 100644 index 0000000..844e2c2 --- /dev/null +++ b/verification/verify_frontend_robust.py @@ -0,0 +1,71 @@ +from playwright.sync_api import sync_playwright + +def verify_frontend(): + with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page() + + # Access the index.html directly from the static server + page.goto("http://localhost:8080/static/index.html") + page.wait_for_load_state("networkidle") + + # 1. Verify Privacy Text is present + # Check all spans in h1 + spans = page.locator("header h1 span") + count = spans.count() + print(f"Found {count} spans in header.") + + privacy_found = False + for i in range(count): + txt = spans.nth(i).inner_text() + print(f"Span {i}: {txt}") + if "本app所有内容在本地处理" in txt: + privacy_found = True + + if privacy_found: + print("[SUCCESS] Privacy text found.") + else: + print("[FAIL] Privacy text not found.") + + # 2. Trigger Mock Flow to get to Results + # Search + page.get_by_role("button", name="搜索").click() + page.wait_for_timeout(500) + + # Select first result + page.locator(".result-item input[type='checkbox']").first.click() + + # Create Group + page.get_by_text("将选中项存为一组").click() + + # Go to Planning + page.get_by_text("2. 规划 & 策略").click() + + # Generate + page.get_by_role("button", name="生成课表方案").click() + page.wait_for_timeout(500) + + # Check Stats Section + # It's inside #capture-area + # Look for "总学分" + if page.get_by_text("总学分: 22.5").is_visible(): + print("[SUCCESS] Stats displayed correctly.") + else: + print("[FAIL] Stats not found.") + # Debug content + print(page.locator("#capture-area").inner_text()) + + # Check scrollable container + # We need 20 schedules to test scroll? + # Mock only returns 1. + # But we can verify the CSS class or style. + # The container is the parent of the scheme buttons. + + # Take screenshot + page.screenshot(path="verification/verification.png") + print("Screenshot saved.") + + browser.close() + +if __name__ == "__main__": + verify_frontend() From 8c788b9416a1f25956f4f9b23162a407c918a79b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 07:37:52 +0000 Subject: [PATCH 2/3] feat: show total possible schedules count - Updated solver to count total valid schedules during DFS. - Exposed total count in API response. - Displayed total count in frontend header. --- backend/solver.py | 5 ++- main.py | 6 ++-- reproduce.py | 4 +-- server.log | 4 +++ static/app.js | 5 ++- static/index.html | 2 +- verification/verification_count.png | Bin 0 -> 55690 bytes verification/verify_frontend_count.py | 46 ++++++++++++++++++++++++++ 8 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 verification/verification_count.png create mode 100644 verification/verify_frontend_count.py diff --git a/backend/solver.py b/backend/solver.py index ddea52d..517238d 100644 --- a/backend/solver.py +++ b/backend/solver.py @@ -198,6 +198,7 @@ def generate_schedules(groups, max_results=20, preferences=None): current_bitmap = [0] * 30 counter = itertools.count() + total_found_container = [0] # Pre-calculate group order? # Heuristic: Process groups with FEWEST options first (Fail Fast). @@ -216,6 +217,8 @@ def generate_schedules(groups, max_results=20, preferences=None): def backtrack(group_idx, current_schedule_meta): if group_idx == len(meta_groups): # Found a valid schedule + total_found_container[0] += 1 + # Reconstruct final schedule but include alternatives info final_schedule = [] for m in current_schedule_meta: @@ -281,7 +284,7 @@ def backtrack(group_idx, current_schedule_meta): backtrack(0, []) sorted_results = sorted(top_n_heap, key=lambda x: x[0], reverse=True) - return [item[2] for item in sorted_results] + return [item[2] for item in sorted_results], total_found_container[0] @staticmethod def is_valid_combination(courses): diff --git a/main.py b/main.py index 10702b3..5ef6094 100644 --- a/main.py +++ b/main.py @@ -56,8 +56,8 @@ def generate_schedules(self, groups, preferences): # 2. Generate # Pass preferences to solver for DFS pruning/ordering - raw_schedules = ScheduleSolver.generate_schedules(groups, preferences=preferences) - print(f"[Api] Found {len(raw_schedules)} valid schedules") + raw_schedules, total_count = ScheduleSolver.generate_schedules(groups, preferences=preferences) + print(f"[Api] Found {len(raw_schedules)} top schedules (from {total_count} total explored)") # 3. Rank and Enrich ranker = ScheduleRanker() @@ -117,7 +117,7 @@ def generate_schedules(self, groups, preferences): # Sort desc ranked.sort(key=lambda x: x['score'], reverse=True) - return {'schedules': ranked} + return {'schedules': ranked, 'total_found': total_count} def save_image_dialog(self, base64_data): import base64 diff --git a/reproduce.py b/reproduce.py index 45c3007..0483609 100644 --- a/reproduce.py +++ b/reproduce.py @@ -23,8 +23,8 @@ def test_duplication_repro(): print(f"Loaded {len(groups)} groups.") # Run solver - schedules = ScheduleSolver.generate_schedules(groups, max_results=10) - print(f"Generated {len(schedules)} schedules.") + schedules, total_count = ScheduleSolver.generate_schedules(groups, max_results=10) + print(f"Generated {len(schedules)} schedules (Total found: {total_count}).") if not schedules: print("No schedules found! Checking if candidates are selected...") diff --git a/server.log b/server.log index 01b331c..a7e40e6 100644 --- a/server.log +++ b/server.log @@ -14,3 +14,7 @@ 127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/vue.global.js HTTP/1.1" 200 - 127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/app.js HTTP/1.1" 200 - 127.0.0.1 - - [10/Jan/2026 07:24:50] "GET /static/html2canvas.min.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:32:44] "GET /static/index.html HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:32:44] "GET /static/vue.global.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:32:44] "GET /static/app.js HTTP/1.1" 200 - +127.0.0.1 - - [10/Jan/2026 07:32:44] "GET /static/html2canvas.min.js HTTP/1.1" 200 - diff --git a/static/app.js b/static/app.js index 0245165..9cda4a2 100644 --- a/static/app.js +++ b/static/app.js @@ -21,6 +21,7 @@ createApp({ const hasSearched = ref(false); const schedules = ref([]); + const totalCount = ref(0); const currentScheduleIdx = ref(0); const currentWeek = ref(1); const toastRef = ref(null); @@ -246,6 +247,7 @@ createApp({ showToast("错误: " + res.error); } else { schedules.value = res.schedules; + totalCount.value = res.total_found; currentView.value = 'results'; currentScheduleIdx.value = 0; } @@ -264,6 +266,7 @@ createApp({ courses: [groups.value[0].candidates[0]] } ]; + totalCount.value = 1; currentView.value = 'results'; } } catch (e) { @@ -455,7 +458,7 @@ createApp({ return { currentView, loading, searchParams, searchResults, - groups, preferences, schedules, currentScheduleIdx, currentWeek, + groups, preferences, schedules, totalCount, currentScheduleIdx, currentWeek, filterText, hasSearched, filteredSearchResults, doSearch, createGroup, getGroupName, getActiveCount, removeGroup, generateSchedules, getCell, downloadImage, saveSession, newSession, toastRef, diff --git a/static/index.html b/static/index.html index bfcaf15..8ca760c 100644 --- a/static/index.html +++ b/static/index.html @@ -232,7 +232,7 @@

偏好设置

请先生成方案。
-

推荐方案 (共 {{ schedules.length }} 个)

+

推荐方案 (显示 {{ schedules.length }} 个 / 共 {{ totalCount }} 个可能方案)

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