Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 136 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
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_here'

# 备忘录数据文件路径
DATA_FILE = 'memos.json'

# 初始化数据文件
if not os.path.exists(DATA_FILE):
with open(DATA_FILE, 'w') as f:
json.dump([], f)

# 加载备忘录数据
def load_memos():
with open(DATA_FILE, 'r') as f:
return json.load(f)

# 保存备忘录数据
def save_memos(memos):
with open(DATA_FILE, 'w') as f:
json.dump(memos, f, indent=4, default=str)

# 首页:显示备忘录列表
@app.route('/')
def index():
memos = load_memos()
# 按优先级排序,P0 > P1 > P2
priority_order = {'P0': 0, 'P1': 1, 'P2': 2}
memos.sort(key=lambda x: priority_order[x['priority']])

# 分组:未完成和已完成
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'].strip()
details = request.form['details'].strip()
due_date = request.form['due_date'].strip()
priority = request.form['priority'].strip()

if not title or not due_date:
flash('标题和预计完成时间不能为空')
return redirect(url_for('add_memo'))

# 创建新备忘录
new_memo = {
'id': len(load_memos()) + 1,
'title': title,
'details': details,
'created_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'due_date': due_date,
'priority': priority,
'completed': False
}

# 保存到文件
memos = load_memos()
memos.append(new_memo)
save_memos(memos)

flash('备忘录添加成功')
return redirect(url_for('index'))

return render_template('add.html')

# 查看备忘录详情
@app.route('/memo/<int:memo_id>')
def view_memo(memo_id):
memos = load_memos()
memo = next((m for m in memos if m['id'] == memo_id), None)
if not memo:
flash('备忘录不存在')
return redirect(url_for('index'))
return render_template('view.html', memo=memo)

# 编辑备忘录
@app.route('/edit/<int:memo_id>', methods=['GET', 'POST'])
def edit_memo(memo_id):
memos = load_memos()
memo = next((m for m in memos if m['id'] == memo_id), None)
if not memo:
flash('备忘录不存在')
return redirect(url_for('index'))

if request.method == 'POST':
title = request.form['title'].strip()
details = request.form['details'].strip()
due_date = request.form['due_date'].strip()
priority = request.form['priority'].strip()

if not title or not due_date:
flash('标题和预计完成时间不能为空')
return redirect(url_for('edit_memo', memo_id=memo_id))

# 更新备忘录
memo['title'] = title
memo['details'] = details
memo['due_date'] = due_date
memo['priority'] = priority

save_memos(memos)
flash('备忘录更新成功')
return redirect(url_for('view_memo', memo_id=memo_id))

return render_template('edit.html', memo=memo)

# 删除备忘录
@app.route('/delete/<int:memo_id>')
def delete_memo(memo_id):
memos = load_memos()
memos = [m for m in memos if m['id'] != memo_id]
save_memos(memos)
flash('备忘录删除成功')
return redirect(url_for('index'))

# 标记备忘录完成/未完成
@app.route('/toggle/<int:memo_id>')
def toggle_completed(memo_id):
memos = load_memos()
memo = next((m for m in memos if m['id'] == memo_id), None)
if memo:
memo['completed'] = not memo['completed']
save_memos(memos)
return redirect(url_for('index'))

if __name__ == '__main__':
app.run(debug=True)
29 changes: 29 additions & 0 deletions memos.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[
{
"id": 3,
"title": "see",
"details": "dsds",
"created_time": "2025-11-29 10:15:11",
"due_date": "2025-11-29T10:15",
"priority": "P1",
"completed": false
},
{
"id": 4,
"title": "dsdsd",
"details": "dsds",
"created_time": "2025-11-29 10:15:26",
"due_date": "2025-11-29T10:15",
"priority": "P1",
"completed": false
},
{
"id": 5,
"title": "dsdsds",
"details": "111121212",
"created_time": "2025-11-29 10:18:44",
"due_date": "2025-11-08T10:18",
"priority": "P0",
"completed": false
}
]
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Flask==2.3.3
33 changes: 33 additions & 0 deletions templates/add.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{% extends 'base.html' %}

{% block content %}
<div class="form-container">
<h2>添加新备忘录</h2>
<form method="POST">
<div class="form-group">
<label for="title">标题 *</label>
<input type="text" id="title" name="title" required>
</div>
<div class="form-group">
<label for="details">详情</label>
<textarea id="details" name="details"></textarea>
</div>
<div class="form-group">
<label for="due_date">预计完成时间 *</label>
<input type="datetime-local" id="due_date" name="due_date" required>
</div>
<div class="form-group">
<label for="priority">优先级</label>
<select id="priority" name="priority">
<option value="P0">P0 (最高)</option>
<option value="P1">P1 (中等)</option>
<option value="P2">P2 (最低)</option>
</select>
</div>
<div class="form-actions">
<button type="submit" class="btn">保存</button>
<a href="{{ url_for('index') }}" class="btn btn-secondary">取消</a>
</div>
</form>
</div>
{% endblock %}
Loading