From 104818dcc33a27af3c27746310e437567a467f9f Mon Sep 17 00:00:00 2001 From: goumiaoqiong Date: Sat, 29 Nov 2025 10:36:17 +0800 Subject: [PATCH] add ai code --- README.md | 76 ++++++++++++++++++++++- app.py | 138 ++++++++++++++++++++++++++++++++++++++++++ memos.json | 29 +++++++++ requirements.txt | 1 + templates/add.html | 29 +++++++++ templates/base.html | 38 ++++++++++++ templates/detail.html | 26 ++++++++ templates/edit.html | 31 ++++++++++ templates/index.html | 61 +++++++++++++++++++ 9 files changed, 428 insertions(+), 1 deletion(-) create mode 100644 app.py create mode 100644 memos.json create mode 100644 requirements.txt create mode 100644 templates/add.html create mode 100644 templates/base.html create mode 100644 templates/detail.html create mode 100644 templates/edit.html create mode 100644 templates/index.html diff --git a/README.md b/README.md index 17e0f0d..39b75c5 100644 --- a/README.md +++ b/README.md @@ -1 +1,75 @@ -# Notes +# 网页版备忘录 + +一个基于Python Flask框架的简单备忘录应用,支持添加、删除、修改备忘录,以及按优先级排序和完成状态分组显示。 + +## 功能特性 + +1. **备忘录管理**:添加、删除、修改备忘录 +2. **备忘录详情**:查看备忘录的详细信息 +3. **时间管理**:自动记录创建时间,支持设置预计完成时间 +4. **优先级管理**:支持设置P0、P1、P2三个优先级,并按优先级排序 +5. **完成状态**:支持标记备忘录为完成/未完成,并分组显示 + +## 技术栈 + +- **后端**:Python Flask +- **前端**:HTML、CSS、Bootstrap 5 +- **数据存储**:JSON文件 + +## 安装和运行 + +1. **安装依赖**: + ```bash + pip install -r requirements.txt + ``` + +2. **运行应用**: + ```bash + python app.py + ``` + +3. **访问应用**:在浏览器中打开 `http://localhost:5000` + +## 使用说明 + +### 添加备忘录 + +1. 点击首页的"添加备忘录"按钮 +2. 填写标题、详情、预计完成时间和优先级 +3. 点击"添加"按钮保存 + +### 查看备忘录详情 + +1. 在首页点击备忘录标题 +2. 即可查看备忘录的详细信息 + +### 编辑备忘录 + +1. 在首页或详情页点击"编辑"按钮 +2. 修改备忘录信息 +3. 点击"保存"按钮 + +### 删除备忘录 + +1. 在首页或详情页点击"删除"按钮 +2. 确认删除操作 + +### 标记完成/未完成 + +1. 在首页或详情页点击"标记完成"或"标记未完成"按钮 +2. 备忘录会自动分组显示 + +## 项目结构 + +``` +Notes/ +├── app.py # Flask应用主文件 +├── requirements.txt # 项目依赖 +├── memos.json # 备忘录数据文件(自动生成) +└── templates/ # HTML模板文件夹 + ├── base.html # 基础模板 + ├── index.html # 首页模板 + ├── add.html # 添加备忘录模板 + ├── detail.html # 备忘录详情模板 + └── edit.html # 编辑备忘录模板 +``` \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..efd07eb --- /dev/null +++ b/app.py @@ -0,0 +1,138 @@ +from flask import Flask, render_template, request, redirect, url_for, flash +from datetime import datetime +import json +import os + +app = Flask(__name__) +app.secret_key = 'your_secret_key' # 用于Flash消息 + +# 备忘录数据文件路径 +DATA_FILE = 'memos.json' + +# 确保数据文件存在 +if not os.path.exists(DATA_FILE): + with open(DATA_FILE, 'w') as f: + json.dump([], f) + +# 读取备忘录数据 +def read_memos(): + with open(DATA_FILE, 'r') as f: + return json.load(f) + +# 写入备忘录数据 +def write_memos(memos): + with open(DATA_FILE, 'w') as f: + json.dump(memos, f, indent=4, default=str) + +# 生成唯一ID +def generate_id(): + memos = read_memos() + if not memos: + return 1 + return max(memo['id'] for memo in memos) + 1 + +@app.route('/') +def index(): + memos = read_memos() + # 按优先级排序,P0 > P1 > P2 + priority_order = {'P0': 0, 'P1': 1, 'P2': 2} + memos.sort(key=lambda x: (priority_order[x['priority']], x['created_at']), reverse=False) + + # 分组:未完成和已完成 + unfinished_memos = [memo for memo in memos if not memo['completed']] + finished_memos = [memo for memo in memos if memo['completed']] + + return render_template('index.html', unfinished_memos=unfinished_memos, finished_memos=finished_memos) + +@app.route('/add', methods=['GET', 'POST']) +def add_memo(): + if request.method == 'POST': + title = request.form['title'] + details = request.form['details'] + due_date = request.form['due_date'] + priority = request.form['priority'] + + if not title or not due_date: + flash('标题和预计完成时间不能为空', 'error') + return redirect(url_for('add_memo')) + + # 创建新备忘录 + new_memo = { + 'id': generate_id(), + 'title': title, + 'details': details, + 'created_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + 'due_date': due_date, + 'priority': priority, + 'completed': False + } + + # 保存到文件 + memos = read_memos() + memos.append(new_memo) + write_memos(memos) + + flash('备忘录添加成功', 'success') + return redirect(url_for('index')) + + return render_template('add.html') + +@app.route('/detail/') +def detail(memo_id): + memos = read_memos() + memo = next((m for m in memos if m['id'] == memo_id), None) + if not memo: + flash('备忘录不存在', 'error') + return redirect(url_for('index')) + return render_template('detail.html', memo=memo) + +@app.route('/edit/', methods=['GET', 'POST']) +def edit(memo_id): + memos = read_memos() + memo = next((m for m in memos if m['id'] == memo_id), None) + if not memo: + flash('备忘录不存在', 'error') + return redirect(url_for('index')) + + if request.method == 'POST': + title = request.form['title'] + details = request.form['details'] + due_date = request.form['due_date'] + priority = request.form['priority'] + + if not title or not due_date: + flash('标题和预计完成时间不能为空', 'error') + return redirect(url_for('edit', memo_id=memo_id)) + + # 更新备忘录 + memo['title'] = title + memo['details'] = details + memo['due_date'] = due_date + memo['priority'] = priority + + write_memos(memos) + flash('备忘录更新成功', 'success') + return redirect(url_for('detail', memo_id=memo_id)) + + return render_template('edit.html', memo=memo) + +@app.route('/delete/') +def delete(memo_id): + memos = read_memos() + memos = [m for m in memos if m['id'] != memo_id] + write_memos(memos) + flash('备忘录删除成功', 'success') + return redirect(url_for('index')) + +@app.route('/toggle_completed/') +def toggle_completed(memo_id): + memos = read_memos() + memo = next((m for m in memos if m['id'] == memo_id), None) + if memo: + memo['completed'] = not memo['completed'] + write_memos(memos) + flash('备忘录状态更新成功', 'success') + return redirect(url_for('index')) + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/memos.json b/memos.json new file mode 100644 index 0000000..63ccd17 --- /dev/null +++ b/memos.json @@ -0,0 +1,29 @@ +[ + { + "id": 1, + "title": "1\u7b2c\u4e00\u4e2a\u8138ewke\u4eba\u812bewkekwwkkwkwkewkw\u6076\u5ba2wkwekwkewkewkekwkewekw\u6709\u5eb7\u6c83\u5c14\u6c83\u514b\u5c14\u6c83\u514b\u5c14\u4fdd\u80d1\u80d1\u80d7", + "details": "\u95ee\u95ee\u6709wkew\u5eb7\u6c83\u5c14", + "created_at": "2025-11-29 10:20:37", + "due_date": "2025-11-29T10:20", + "priority": "P1", + "completed": false + }, + { + "id": 2, + "title": "122123333", + "details": "\u5947\u5947\u5728\u5947\u5947", + "created_at": "2025-11-29 10:20:58", + "due_date": "2025-11-08T10:20", + "priority": "P1", + "completed": false + }, + { + "id": 4, + "title": "P0", + "details": "11111", + "created_at": "2025-11-29 10:22:36", + "due_date": "2025-10-31T10:22", + "priority": "P0", + "completed": true + } +] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5aad892 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Flask==2.3.2 diff --git a/templates/add.html b/templates/add.html new file mode 100644 index 0000000..fdfc755 --- /dev/null +++ b/templates/add.html @@ -0,0 +1,29 @@ +{% extends 'base.html' %} + +{% block content %} +

添加备忘录

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + 取消 +
+{% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..258e97a --- /dev/null +++ b/templates/base.html @@ -0,0 +1,38 @@ + + + + + + 备忘录 + + + + +
+

备忘录

+ + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + {% for category, message in messages %} + + {% endfor %} + {% endif %} + {% endwith %} + + {% block content %}{% endblock %} +
+ + + + \ No newline at end of file diff --git a/templates/detail.html b/templates/detail.html new file mode 100644 index 0000000..069c4a0 --- /dev/null +++ b/templates/detail.html @@ -0,0 +1,26 @@ +{% extends 'base.html' %} + +{% block content %} +

备忘录详情

+
+
+
{{ memo.title }}
+
+ 优先级: {{ memo.priority }} +
+

+ 创建时间: {{ memo.created_at }}
+ 预计完成时间: {{ memo.due_date }} +

+

{{ memo.details or '无详情' }}

+ +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/edit.html b/templates/edit.html new file mode 100644 index 0000000..8dbb61b --- /dev/null +++ b/templates/edit.html @@ -0,0 +1,31 @@ +{% extends 'base.html' %} + +{% block content %} +

编辑备忘录

+
+
+ + +
+
+ + +
+
+ + + +
+
+ + +
+ + 取消 +
+{% endblock %} \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..ea7ee63 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,61 @@ +{% extends 'base.html' %} + +{% block content %} + + + +

未完成备忘录

+ {% if unfinished_memos %} + {% for memo in unfinished_memos %} +
+
+
+
+ {{ memo.title }} +
+

预计完成时间: {{ memo.due_date }}

+

+ 优先级: {{ memo.priority }} +

+
+ +
+
+ {% endfor %} + {% else %} +

没有未完成的备忘录

+ {% endif %} + + +

已完成备忘录

+ {% if finished_memos %} + {% for memo in finished_memos %} +
+
+
+
+ {{ memo.title }} +
+

预计完成时间: {{ memo.due_date }}

+

+ 优先级: {{ memo.priority }} +

+
+ +
+
+ {% endfor %} + {% else %} +

没有已完成的备忘录

+ {% endif %} +{% endblock %} \ No newline at end of file