(Python)待辦事項升級網頁版(html)(Python項目)

源代碼:

app.py

from flask import Flask, render_template, request, redirect, url_for, jsonify
import json
import osapp = Flask(__name__)# 數據存儲文件
DATA_FILE = "todos.json"def load_todos():"""從文件加載待辦事項"""if os.path.exists(DATA_FILE):try:with open(DATA_FILE, "r") as f:return json.load(f)except:return []return []def save_todos(todos):"""保存待辦事項到文件"""with open(DATA_FILE, "w") as f:json.dump(todos, f)@app.route('/')
def index():"""顯示主頁"""todos = load_todos()# 計算完成和未完成的任務數量completed = sum(1 for todo in todos if todo["done"])not_completed = len(todos) - completedreturn render_template('index.html', todos=todos, completed=completed, not_completed=not_completed)@app.route('/add', methods=['POST'])
def add_todo():"""添加新任務"""task = request.form.get('task')if task:todos = load_todos()todos.append({"task": task, "done": False})save_todos(todos)return redirect(url_for('index'))@app.route('/toggle/<int:index>')
def toggle_todo(index):"""切換任務狀態(完成/未完成)"""todos = load_todos()if 0 <= index < len(todos):todos[index]["done"] = not todos[index]["done"]save_todos(todos)return redirect(url_for('index'))@app.route('/delete/<int:index>')
def delete_todo(index):"""刪除任務"""todos = load_todos()if 0 <= index < len(todos):todos.pop(index)save_todos(todos)return redirect(url_for('index'))@app.route('/clear')
def clear_completed():"""清除已完成的任務"""todos = load_todos()# 只保留未完成的任務todos = [todo for todo in todos if not todo["done"]]save_todos(todos)return redirect(url_for('index'))if __name__ == '__main__':app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>網頁版待辦事項</title><style>* {box-sizing: border-box;margin: 0;padding: 0;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}body {background-color: #f5f7fa;color: #333;line-height: 1.6;padding: 20px;}.container {max-width: 800px;margin: 0 auto;background-color: #fff;border-radius: 10px;box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);padding: 30px;}h1 {text-align: center;margin-bottom: 30px;color: #2c3e50;}.todo-form {display: flex;margin-bottom: 20px;}.todo-form input {flex: 1;padding: 12px;border: 2px solid #ddd;border-radius: 4px;font-size: 16px;transition: border-color 0.3s;}.todo-form input:focus {border-color: #3498db;outline: none;}.todo-form button {background-color: #3498db;color: white;border: none;padding: 12px 20px;margin-left: 10px;border-radius: 4px;cursor: pointer;font-size: 16px;transition: background-color 0.3s;}.todo-form button:hover {background-color: #2980b9;}.todo-stats {display: flex;justify-content: space-between;margin-bottom: 20px;padding: 10px;background-color: #f8f9fa;border-radius: 4px;font-size: 14px;}.todo-stats span {display: inline-block;padding: 4px 8px;border-radius: 4px;}.total-tasks {background-color: #e3f2fd;color: #1976d2;}.completed-tasks {background-color: #e8f5e9;color: #388e3c;}.pending-tasks {background-color: #fff3e0;color: #f57c00;}.todo-list {list-style-type: none;}.todo-item {display: flex;align-items: center;padding: 15px;border-bottom: 1px solid #eee;transition: background-color 0.3s;}.todo-item:hover {background-color: #f9f9f9;}.todo-item.completed .todo-text {text-decoration: line-through;color: #95a5a6;}.todo-checkbox {margin-right: 15px;width: 20px;height: 20px;cursor: pointer;}.todo-text {flex: 1;font-size: 16px;}.delete-btn {background: none;border: none;color: #e74c3c;cursor: pointer;font-size: 18px;opacity: 0.7;transition: opacity 0.3s;}.delete-btn:hover {opacity: 1;}.clear-btn {display: block;margin: 20px auto 0;padding: 10px 20px;background-color: #f5f5f5;color: #e74c3c;border: 1px solid #ddd;border-radius: 4px;cursor: pointer;transition: background-color 0.3s;}.clear-btn:hover {background-color: #ffeef0;}@media (max-width: 600px) {.container {padding: 15px;}.todo-form {flex-direction: column;}.todo-form input {margin-bottom: 10px;}.todo-form button {margin-left: 0;}}</style>
</head>
<body><div class="container"><h1>📋 待辦事項清單</h1><form class="todo-form" action="/add" method="POST"><input type="text" name="task" placeholder="添加新任務..." required><button type="submit">添加任務</button></form><div class="todo-stats"><span class="total-tasks">總任務: {{ todos|length }}</span><span class="completed-tasks">已完成: {{ completed }}</span><span class="pending-tasks">未完成: {{ not_completed }}</span></div><ul class="todo-list">{% for todo in todos %}<li class="todo-item {% if todo.done %}completed{% endif %}"><a href="{{ url_for('toggle_todo', index=loop.index0) }}"><input type="checkbox" class="todo-checkbox" {% if todo.done %}checked{% endif %}></a><span class="todo-text">{{ todo.task }}</span><a href="{{ url_for('delete_todo', index=loop.index0) }}" class="delete-btn">🗑?</a></li>{% else %}<li class="todo-item"><span class="todo-text" style="text-align: center; width: 100%;">暫無任務,添加一個吧!</span></li>{% endfor %}</ul>{% if completed > 0 %}<button class="clear-btn" onclick="location.href='{{ url_for('clear_completed') }}'">清除已完成任務</button>{% endif %}</div>
</body>
</html>

文件夾結構:

todo_web_app/
├── app.py          # Flask應用主文件
├── templates/      # HTML模板文件夾
│   └── index.html  # 主頁模板
└── todos.json      # 數據存儲文件(自動生成)

代碼詳解:

一、項目結構設計原理

1. 為什么需要這樣的文件結構?

  • Flask框架要求:Flask遵循MVC(模型-視圖-控制器)設計模式

    • app.py:控制器(Controller) - 處理業務邏輯

    • templates/index.html:視圖(View) - 展示用戶界面

    • todos.json:模型(Model) - 數據存儲

  • 模板文件夾命名:Flask默認在templates文件夾中查找HTML模板文件

  • 數據文件位置:JSON數據文件放在項目根目錄,便于讀寫

2. 為什么需要Web框架?

  • 處理HTTP協議:管理請求/響應生命周期

  • 路由管理:將URL映射到處理函數

  • 模板渲染:動態生成HTML內容

  • 會話管理:處理用戶狀態(本項目未使用)

二、app.py 代碼逐行詳解

# 導入必要的庫
from flask import Flask, render_template, request, redirect, url_for
import json
import os# 創建Flask應用實例
app = Flask(__name__)# 數據存儲文件
DATA_FILE = "todos.json"def load_todos():"""從文件加載待辦事項"""# 檢查文件是否存在if os.path.exists(DATA_FILE):try:# 打開文件并讀取JSON內容with open(DATA_FILE, "r") as f:return json.load(f)except:# 如果讀取失敗(如文件為空或格式錯誤),返回空列表return []# 文件不存在時返回空列表return []def save_todos(todos):"""保存待辦事項到文件"""# 將待辦事項列表寫入JSON文件with open(DATA_FILE, "w") as f:json.dump(todos, f)# 定義根路由,處理主頁請求
@app.route('/')
def index():"""顯示主頁"""# 加載待辦事項todos = load_todos()# 計算已完成任務數completed = sum(1 for todo in todos if todo["done"])# 計算未完成任務數not_completed = len(todos) - completed# 渲染index.html模板,并傳入數據return render_template('index.html', todos=todos,completed=completed,not_completed=not_completed)# 添加任務的路由,只接受POST請求
@app.route('/add', methods=['POST'])
def add_todo():"""添加新任務"""# 從表單獲取任務內容task = request.form.get('task')if task:# 加載現有任務todos = load_todos()# 添加新任務(默認為未完成)todos.append({"task": task, "done": False})# 保存更新后的任務列表save_todos(todos)# 重定向回主頁return redirect(url_for('index'))# 切換任務狀態的路由
@app.route('/toggle/<int:index>')
def toggle_todo(index):"""切換任務狀態"""todos = load_todos()# 檢查索引是否有效if 0 <= index < len(todos):# 切換完成狀態(True變False,False變True)todos[index]["done"] = not todos[index]["done"]save_todos(todos)return redirect(url_for('index'))# 刪除任務的路由
@app.route('/delete/<int:index>')
def delete_todo(index):"""刪除任務"""todos = load_todos()if 0 <= index < len(todos):# 刪除指定索引的任務todos.pop(index)save_todos(todos)return redirect(url_for('index'))# 清除已完成任務的路由
@app.route('/clear')
def clear_completed():"""清除已完成的任務"""todos = load_todos()# 創建新列表,只包含未完成的任務new_todos = [todo for todo in todos if not todo["done"]]save_todos(new_todos)return redirect(url_for('index'))# 程序入口
if __name__ == '__main__':# 確保templates文件夾存在if not os.path.exists('templates'):os.makedirs('templates')print("已創建templates文件夾")# 啟動Flask開發服務器# debug=True 表示開啟調試模式(自動重載代碼并顯示詳細錯誤)app.run(debug=True, port=5001)  # 指定端口5001,避免與其他應用沖突

關鍵點解析:

  1. 路由系統

    • @app.route('/'):裝飾器將URL路徑映射到處理函數

    • 動態路由@app.route('/toggle/<int:index>')<int:index>捕獲URL中的整數參數

  2. 請求方法

    • 默認只處理GET請求

    • methods=['POST']明確指定處理POST請求

  3. 重定向模式

    • 操作后重定向回主頁(redirect(url_for('index')))

    • 避免瀏覽器重復提交(POST/重定向/GET模式)

  4. 數據持久化

    • load_todos()save_todos()封裝數據讀寫

    • JSON格式簡單易讀,適合小型應用

  5. 調試模式

    • app.run(debug=True)啟用調試模式

    • 修改代碼后自動重啟服務器

    • 顯示詳細錯誤信息

三、index.html 代碼逐行詳解

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>網頁版待辦事項</title><style>/* 基礎樣式重置 */* {box-sizing: border-box;margin: 0;padding: 0;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}/* 頁面整體樣式 */body {background-color: #f5f7fa;color: #333;line-height: 1.6;padding: 20px;}/* 內容容器 */.container {max-width: 800px;margin: 0 auto;background-color: #fff;border-radius: 10px;box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);padding: 30px;}/* 標題樣式 */h1 {text-align: center;margin-bottom: 30px;color: #2c3e50;}/* 任務表單樣式 */.todo-form {display: flex;margin-bottom: 20px;}.todo-form input {flex: 1;padding: 12px;border: 2px solid #ddd;border-radius: 4px;font-size: 16px;transition: border-color 0.3s;}.todo-form input:focus {border-color: #3498db;outline: none;}.todo-form button {background-color: #3498db;color: white;border: none;padding: 12px 20px;margin-left: 10px;border-radius: 4px;cursor: pointer;font-size: 16px;transition: background-color 0.3s;}.todo-form button:hover {background-color: #2980b9;}/* 任務統計樣式 */.todo-stats {display: flex;justify-content: space-between;margin-bottom: 20px;padding: 10px;background-color: #f8f9fa;border-radius: 4px;font-size: 14px;}.todo-stats span {display: inline-block;padding: 4px 8px;border-radius: 4px;}.total-tasks {background-color: #e3f2fd;color: #1976d2;}.completed-tasks {background-color: #e8f5e9;color: #388e3c;}.pending-tasks {background-color: #fff3e0;color: #f57c00;}/* 任務列表樣式 */.todo-list {list-style-type: none;}.todo-item {display: flex;align-items: center;padding: 15px;border-bottom: 1px solid #eee;transition: background-color 0.3s;}.todo-item:hover {background-color: #f9f9f9;}/* 已完成任務樣式 */.todo-item.completed .todo-text {text-decoration: line-through;color: #95a5a6;}/* 復選框樣式 */.todo-checkbox {margin-right: 15px;width: 20px;height: 20px;cursor: pointer;}/* 任務文本樣式 */.todo-text {flex: 1;font-size: 16px;}/* 刪除按鈕樣式 */.delete-btn {background: none;border: none;color: #e74c3c;cursor: pointer;font-size: 18px;opacity: 0.7;transition: opacity 0.3s;}.delete-btn:hover {opacity: 1;}/* 清除按鈕樣式 */.clear-btn {display: block;margin: 20px auto 0;padding: 10px 20px;background-color: #f5f5f5;color: #e74c3c;border: 1px solid #ddd;border-radius: 4px;cursor: pointer;transition: background-color 0.3s;}.clear-btn:hover {background-color: #ffeef0;}/* 響應式設計 - 小屏幕適配 */@media (max-width: 600px) {.container {padding: 15px;}.todo-form {flex-direction: column;}.todo-form input {margin-bottom: 10px;}.todo-form button {margin-left: 0;}}</style>
</head>
<body><div class="container"><h1>📋 待辦事項清單</h1><!-- 添加任務的表單 --><!-- action="/add" 表示提交到/add路由 --><!-- method="POST" 使用POST方法提交 --><form class="todo-form" action="/add" method="POST"><input type="text" name="task" placeholder="添加新任務..." required><button type="submit">添加任務</button></form><!-- 任務統計信息 --><!-- 使用Jinja2模板變量顯示統計 --><div class="todo-stats"><span class="total-tasks">總任務: {{ todos|length }}</span><span class="completed-tasks">已完成: {{ completed }}</span><span class="pending-tasks">未完成: {{ not_completed }}</span></div><!-- 任務列表 --><ul class="todo-list"><!-- 遍歷待辦事項 -->{% for todo in todos %}<!-- 根據任務狀態添加completed類 --><li class="todo-item {% if todo.done %}completed{% endif %}"><!-- 切換狀態鏈接 --><a href="{{ url_for('toggle_todo', index=loop.index0) }}"><!-- 根據狀態顯示復選框 --><input type="checkbox" class="todo-checkbox" {% if todo.done %}checked{% endif %}></a><!-- 任務內容 --><span class="todo-text">{{ todo.task }}</span><!-- 刪除任務鏈接 --><a href="{{ url_for('delete_todo', index=loop.index0) }}" class="delete-btn">🗑?</a></li><!-- 如果沒有任務 -->{% else %}<li class="todo-item"><span class="todo-text" style="text-align: center; width: 100%;">暫無任務,添加一個吧!</span></li>{% endfor %}</ul><!-- 清除已完成任務按鈕(只在有完成的任務時顯示) -->{% if completed > 0 %}<button class="clear-btn" onclick="location.href='{{ url_for('clear_completed') }}'">清除已完成任務</button>{% endif %}</div>
</body>
</html>

關鍵點解析:

  1. Jinja2模板引擎

    • {{ variable }}:輸出變量值

    • {% for ... %}:循環結構

    • {% if ... %}:條件判斷

    • loop.index0:當前循環索引(從0開始)

  2. 動態內容生成

    • 后端傳入todoscompletednot_completed等變量

    • 模板根據這些數據動態生成HTML

  3. URL生成

    • url_for('函數名'):生成對應路由的URL

    • url_for('toggle_todo', index=loop.index0):生成帶參數的URL

  4. 響應式設計

    • 使用CSS媒體查詢適配不同屏幕尺寸

    • 移動端優化布局

  5. 用戶交互元素

    • 表單提交:添加新任務

    • 鏈接點擊:切換狀態、刪除任務

    • 按鈕點擊:清除已完成任務

四、工作流程解析

1. 用戶訪問主頁 (GET /)

用戶請求 -> Flask路由(index函數) -> 加載數據 -> 渲染模板 -> 返回HTML

2. 用戶添加任務 (POST /add)

表單提交 -> Flask路由(add_todo函數) -> 處理數據 -> 保存到文件 -> 重定向到主頁

3. 用戶切換任務狀態 (GET /toggle/<index>)

點擊鏈接 -> Flask路由(toggle_todo函數) -> 修改狀態 -> 保存數據 -> 重定向

4. 用戶刪除任務 (GET /delete/<index>)

點擊刪除圖標 -> Flask路由(delete_todo函數) -> 刪除任務 -> 保存數據 -> 重定向

5. 用戶清除已完成任務 (GET /clear)

點擊按鈕 -> Flask路由(clear_completed函數) -> 過濾任務 -> 保存數據 -> 重定向

運行結果:

打開網址網頁版待辦事項

注:該代碼是本人自己所寫,可能不夠好,不夠簡便,歡迎大家指出我的不足之處。如果遇見看不懂的地方,可以在評論區打出來,進行討論,或者聯系我。上述內容全是我自己理解的,如果你有別的想法,或者認為我的理解不對,歡迎指出!!!如果可以,可以點一個免費的贊支持一下嗎?謝謝各位彥祖亦菲!!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917806.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智慧養老破局:科技如何讓“老有所養”變成“老有優養”?

隨著人口老齡化加劇&#xff0c;“養老”成了社會關注的焦點。傳統養老往往停留在“有地方住、有人照顧”的基礎需求&#xff0c;而智慧養老則通過科技與人文的結合&#xff0c;讓老年人的生活從“老有所養”升級到“老有優養”。不僅活得安心&#xff0c;更能活得有尊嚴、有質…

自學嵌入式 day45 ARM體系架構

一、SOCRAM&#xff1a;隨機訪問存儲器&#xff0c;存放隨機變量&#xff0c;掉電數據丟失ROM&#xff1a;只讀存儲器&#xff0c;存放單片機的程序、指令&#xff0c;掉電數據不丟失注&#xff1a;1、馮諾依曼架構中將數據與指令存放在同一存儲器中2、哈佛架構是將數據與指令存…

HTML應用指南:利用GET請求獲取全國OPPO官方授權體驗店門店位置信息

本篇文章將利用GET請求從OPPO官方網站或公開接口中獲取官方授權體驗店的分布信息&#xff0c;并通過Python編程語言中的requests庫來實現HTTP請求&#xff0c;從而提取詳細的門店位置數據。隨著OPPO品牌的發展和市場布局的擴展&#xff0c;其官方授權體驗店已經遍布全國各大城市…

Self-RAG:基于自我反思的檢索增強生成框架技術解析

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 一、核心定義與原始論文 Self-RAG&#xff08;Self-Reflective Retri…

【YOLOv8改進 - C2f融合】C2f融合DBlock(Decoder Block):解碼器塊,去模糊和提升圖像清晰度

YOLOv8目標檢測創新改進與實戰案例專欄 專欄目錄: YOLOv8有效改進系列及項目實戰目錄 包含卷積,主干 注意力,檢測頭等創新機制 以及 各種目標檢測分割項目實戰案例 專欄鏈接: YOLOv8基礎解析+創新改進+實戰案例 文章目錄 YOLOv8目標檢測創新改進與實戰案例專欄 介紹 摘要 文…

LLamafactory是什么?

LLamaFactory是一個專注于大型語言模型&#xff08;LLM&#xff09;訓練、微調和部署的開源工具平臺&#xff0c;旨在簡化大模型的應用開發流程。?1.核心功能與特點?LlamaFactory&#xff08;全稱Large Language Model Factory&#xff09;作為一站式AI開發工具平臺&#xff…

Element Plus編輯表格時的頁面回顯(scope)

1、前提&#xff1a;自定義列模版(把id作為參數&#xff0c;傳遞到調用的edit函數里)<template #default"scope"><el-button type"primary" size"small" click"edit(scope.row.id)"><el-icon><EditPen /><…

河南萌新聯賽2025第四場-河南大學

今天又是坐牢的一次比賽&#xff0c;恭喜獲得本次比賽稱號&#xff1a;掛機王&#xff0c;一個簽到題能卡住兩個小時&#xff0c;這兩個小時簡直坐的我懷疑人生&#xff0c;實在是找不出哪里錯了&#xff0c;后來快結束的時候才發現少了一個等于號&#xff0c;也不至于連簽到題…

【Excel】通過Index函數向下拖動單元格并【重復引用/循環引用】數據源

文章目錄CASE1: 列數據源&#xff0c;向下拖動&#xff0c;每個單元重復N次步驟1&#xff1a;基本的INDEX函數步驟2&#xff1a;添加行號計算步驟3&#xff1a;添加絕對引用以便拖動CASE2:列數據源&#xff0c;向下拖動&#xff0c;每個單元重復1次&#xff0c;周而復始步驟1&a…

潛行者2:切爾諾貝利之心 全DLC 送修改器(S2HOC)免安裝中文版

網盤鏈接&#xff1a; 潛行者2&#xff1a;切爾諾貝利之心 免安裝中文版 名稱&#xff1a;潛行者2&#xff1a;切爾諾貝利之心 全DLC 送修改器&#xff08;S2HOC&#xff09;免安裝中文版 描述&#xff1a; 探索傳奇的《潛行者》世界&#xff0c;同時體驗&#xff1a; 融合…

系統運維之LiveCD詳解

基本概念LiveCD是一個包含完整可運行操作系統的光盤映像&#xff0c;能夠在不影響主機系統的情況下啟動計算機。工作原理系統從LiveCD介質啟動 將必要文件加載到內存中運行 通常使用RAM磁盤作為臨時文件系統 關機后所有更改默認不保存&#xff08;除非特別配置&#xff0…

達夢分布式集群DPC_分布式任務執行拆分流程_yxy

達夢分布式集群DPC_分布式執行計劃執行拆分流程 1 DPC任務拆分原理 1.1 分布式架構思想 1.2 DPC如何實現任務拆分? 2 DPC任務拆分完整示例 2.1 單表查詢 2.1.1 創建分區表,存儲在不同BP上 2.1.2 生成sql的最佳執行計劃 2.1.3 代碼生成并執行、拆分 2.1.3.1 任務拆分步驟 2.1.…

怎么免費建立自己的網站步驟

以下是免費建立個人網站的詳細步驟&#xff0c;結合多種方案和工具推薦&#xff1a; 一、零基礎快速建站方案 ?選擇免費建站平臺? PageAdmin CMS?&#xff1a; 1、提供開源模板&#xff0c;模板可以自定義界面和風格&#xff0c;同時支持原創設計和定制。 2、后臺支持自定義…

使用ASIWebPageRequest庫編寫Objective-C下載器程序

全文目錄&#xff1a;開篇語前言為什么選擇ASIWebPageRequest&#xff1f;安裝ASIWebPageRequest庫編寫下載器程序1. 導入必要的庫2. 創建下載任務3. 設置下載保存路徑4. 發起下載請求5. 更新下載進度6. 處理下載完成7. 處理下載失敗完整代碼示例8. 運行程序總結文末開篇語 哈嘍…

mathtype加載項搞崩了word(上)

一、Mathtype更新后word異常 在mathtype更新后&#xff0c;打開word文件時一直報宏的錯&#xff1a; 點擊“取消”&#xff1a; 點擊“確定”&#xff1a; 點擊“確定”&#xff1a; 點擊“確定”&#xff1a; 還有一堆小彈窗&#xff0c;最后還是能打開word文件&#xff1a; …

算法入門第一篇:算法核心:復雜度分析與數組基礎

引言&#xff1a;為什么需要學習算法&#xff1f; 你可能也發現&#xff0c;即使是社招&#xff0c;面試官也時不時會拋出幾道算法題&#xff0c;從簡單的反轉鏈表到復雜的動態規劃。這常常讓人感到困惑&#xff1a;我一個做游戲開發的&#xff0c;寫好 Unity 的 C# 代碼&…

從“聽指令”到“當參謀”,阿里云AnalyticDB GraphRAG如何讓AI開竅

01、背景 在智能客服與醫療問診領域&#xff0c;用戶模糊描述導致的多輪對話斷裂與語義關聯缺失&#xff0c;長期阻礙決策效率提升。傳統 RAG 技術面臨雙重困境&#xff1a; 單輪檢索局限&#xff1a;當用戶僅反饋“空調制冷效果差”、“持續發熱三天”等模糊信息時&#xff…

javascript常用實例

常見字符串操作字符串反轉const reversed hello.split().reverse().join(); console.log(reversed); // olleh檢查回文字符串function isPalindrome(str) {return str str.split().reverse().join(); }數組處理方法數組去重const unique [...new Set([1, 2, 2, 3])]; // [1,…

RK3568下用 Qt Charts 實現曲線數據展示

實際效果: 在工業監控、智能家居等場景中,實時數據可視化是核心需求之一。本文將介紹如何使用 Qt5 的 Charts 模塊,快速實現一個支持溫度、濕度、大氣壓和噪聲四個參數的實時監測系統,包含曲線動態繪制、坐標軸自適應、多窗口布局等實用功能。 項目背景與目標 環境參數監…