"""API服务""" from flask import Flask, request, jsonify, render_template_string from flask_cors import CORS import os from .db import db from .config import API_HOST, API_PORT, ITEM_TYPES, TODO_STATUS, PRIORITY_LEVELS app = Flask(__name__, template_folder=os.path.join(os.path.dirname(__file__), '../web/templates'), static_folder=os.path.join(os.path.dirname(__file__), '../web/static')) CORS(app) # ============ API 路由 ============ @app.route('/api/items', methods=['GET']) def list_items(): """列出条目""" items = db.list_items( type=request.args.get('type'), status=request.args.get('status'), tag=request.args.get('tag'), keyword=request.args.get('keyword'), limit=int(request.args.get('limit', 50)), offset=int(request.args.get('offset', 0)) ) return jsonify({'success': True, 'data': items}) @app.route('/api/items', methods=['POST']) def create_item(): """创建条目""" data = request.get_json() if not data: return jsonify({'success': False, 'error': '无数据'}), 400 item_type = data.get('type', 'text') if item_type not in ITEM_TYPES: return jsonify({'success': False, 'error': f'无效类型: {item_type}'}), 400 try: item_id = db.create_item( type=item_type, title=data.get('title'), content=data.get('content'), url=data.get('url'), source=data.get('source'), status=data.get('status', 'pending'), priority=data.get('priority', 'medium'), due_date=data.get('due_date'), note=data.get('note'), tags=data.get('tags', []) ) item = db.get_item(item_id) return jsonify({'success': True, 'data': item}), 201 except Exception as e: return jsonify({'success': False, 'error': str(e)}), 500 @app.route('/api/items/', methods=['GET']) def get_item(item_id): """获取条目""" item = db.get_item(item_id) if not item: return jsonify({'success': False, 'error': '条目不存在'}), 404 return jsonify({'success': True, 'data': item}) @app.route('/api/items/', methods=['PUT']) def update_item(item_id): """更新条目""" data = request.get_json() if not data: return jsonify({'success': False, 'error': '无数据'}), 400 try: if db.update_item(item_id, **data): item = db.get_item(item_id) return jsonify({'success': True, 'data': item}) else: return jsonify({'success': False, 'error': '条目不存在或无变化'}), 404 except Exception as e: return jsonify({'success': False, 'error': str(e)}), 500 @app.route('/api/items/', methods=['DELETE']) def delete_item(item_id): """删除条目""" if db.delete_item(item_id): return jsonify({'success': True}) return jsonify({'success': False, 'error': '条目不存在'}), 404 @app.route('/api/items//done', methods=['POST']) def complete_item(item_id): """完成待办""" item = db.get_item(item_id) if not item: return jsonify({'success': False, 'error': '条目不存在'}), 404 if item['type'] != 'todo': return jsonify({'success': False, 'error': '不是待办事项'}), 400 db.update_item(item_id, status='completed') item = db.get_item(item_id) return jsonify({'success': True, 'data': item}) @app.route('/api/tags', methods=['GET']) def list_tags(): """列出标签""" tags = db.list_tags() return jsonify({'success': True, 'data': tags}) @app.route('/api/tags', methods=['POST']) def create_tag(): """创建标签""" data = request.get_json() name = data.get('name', '').strip() if not name: return jsonify({'success': False, 'error': '标签名不能为空'}), 400 try: tag_id = db.create_tag(name, data.get('color', '#3498db')) return jsonify({'success': True, 'data': {'id': tag_id, 'name': name}}), 201 except Exception as e: return jsonify({'success': False, 'error': str(e)}), 500 @app.route('/api/tags/', methods=['DELETE']) def delete_tag(tag_id): """删除标签""" if db.delete_tag(tag_id=tag_id): return jsonify({'success': True}) return jsonify({'success': False, 'error': '标签不存在'}), 404 @app.route('/api/stats', methods=['GET']) def get_stats(): """获取统计""" stats = db.stats() return jsonify({'success': True, 'data': stats}) @app.route('/api/search', methods=['GET']) def search_items(): """搜索条目""" keyword = request.args.get('q', '') if not keyword: return jsonify({'success': False, 'error': '请提供搜索关键词'}), 400 items = db.list_items( keyword=keyword, type=request.args.get('type'), limit=int(request.args.get('limit', 50)) ) return jsonify({'success': True, 'data': items}) # ============ Web 页面 ============ @app.route('/') def index(): """主页""" return render_template_string(INDEX_TEMPLATE) # ============ Web 模板 ============ INDEX_TEMPLATE = ''' Xian Favor - 收藏系统
总条目

0

待处理

0

进行中

0

已完成

0

''' def start_server(host: str = API_HOST, port: int = API_PORT): """启动服务""" app.run(host=host, port=port, debug=False)