From 37bab39059d10ec3c92cb5c91aa7cdbc632c46ec Mon Sep 17 00:00:00 2001 From: heshunme Date: Fri, 29 Nov 2024 16:09:42 +0800 Subject: [PATCH] =?UTF-8?q?=E7=88=AC=E8=99=AB=E6=90=9E=E5=AE=9A=EF=BC=8C10?= =?UTF-8?q?0=E7=AF=87=E6=96=87=E7=AB=A0=E6=9C=89=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 +++ .idea/PsycologyAPI.iml | 8 +++ .idea/inspectionProfiles/Project_Default.xml | 54 ++++++++++++++++++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 32 +++++++++++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 6 ++ db.sqlite3 | Bin 0 -> 45056 bytes main.py | 13 +++++ models/__init__.py | 10 ++++ models/category.py | 16 ++++++ models/processed_data.py | 15 +++++ models/raw_data.py | 18 ++++++ models/source.py | 13 +++++ test_main.http | 11 ++++ 15 files changed, 218 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/PsycologyAPI.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 db.sqlite3 create mode 100644 main.py create mode 100644 models/__init__.py create mode 100644 models/category.py create mode 100644 models/processed_data.py create mode 100644 models/raw_data.py create mode 100644 models/source.py create mode 100644 test_main.http diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..3a86cee --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/PsycologyAPI.iml b/.idea/PsycologyAPI.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/PsycologyAPI.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..067e287 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,54 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..63337c1 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,32 @@ + + + + + + + + + + EditorConfig + + + GitHub 操作 + + + 正则表达式 + + + 版本控制 + + + + + 用户定义 + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..6b96f60 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..f9ae210dcc7e811ed5f3601cb4bb8120cc95c2bf GIT binary patch literal 45056 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 pQX4bF!%-QPf{3r^{{>p*pkh{{f&gnXLc- literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..6d7c6d9 --- /dev/null +++ b/main.py @@ -0,0 +1,13 @@ +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def root(): + return {"message": "Hello World"} + + +@app.get("/hello/{name}") +async def say_hello(name: str): + return {"message": f"Hello {name}"} diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..d57dc0a --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# @Time : 2024/11/13 下午3:10 +# @Author : 河瞬 +# @FileName: __init__.py.py +# @Software: PyCharm + +from .source import Source +from .category import Category +from .raw_data import RawData +from .processed_data import ProcessedData diff --git a/models/category.py b/models/category.py new file mode 100644 index 0000000..886b408 --- /dev/null +++ b/models/category.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# @Time : 2024/11/14 下午4:04 +# @Author : 河瞬 +# @FileName: category.py +# @Software: PyCharm +from tortoise.models import Model +from tortoise import fields + + +class Category(Model): + id = fields.IntField(primary_key=True) + name = fields.TextField() + description = fields.TextField() + # 这个类别是有分层类似树状结构的,所以需要一个field来表示父类和子类 + parent = fields.ForeignKeyField("models.Category", related_name="children", null=True) + children = fields.ReverseRelation["Category"] diff --git a/models/processed_data.py b/models/processed_data.py new file mode 100644 index 0000000..351817c --- /dev/null +++ b/models/processed_data.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# @Time : 2024/11/14 下午4:02 +# @Author : 河瞬 +# @FileName: processed_data.py +# @Software: PyCharm +from tortoise.models import Model +from tortoise import fields + + +class ProcessedData(Model): + id = fields.IntField(primary_key=True) + raw_data = fields.ForeignKeyField("models.RawData", related_name="processed_data") + category = fields.ForeignKeyField("models.Category", related_name="processed_data") + summary = fields.TextField() + processed_at = fields.DatetimeField(auto_now_add=True) diff --git a/models/raw_data.py b/models/raw_data.py new file mode 100644 index 0000000..49d071e --- /dev/null +++ b/models/raw_data.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# @Time : 2024/11/13 下午3:38 +# @Author : 河瞬 +# @FileName: raw_data.py +# @Software: PyCharm +from tortoise.models import Model +from tortoise import fields + + +class RawData(Model): + id = fields.IntField(primary_key=True) + url = fields.TextField() + title = fields.TextField() + content = fields.TextField(null=True) + source = fields.ForeignKeyField("models.Source", related_name="raw_data") + detected_at = fields.DatetimeField(auto_now_add=True) + fetched_at = fields.DatetimeField(auto_now=True) + is_processed = fields.BooleanField(default=False) diff --git a/models/source.py b/models/source.py new file mode 100644 index 0000000..0a1f500 --- /dev/null +++ b/models/source.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# @Time : 2024/11/14 下午3:54 +# @Author : 河瞬 +# @FileName: source.py +# @Software: PyCharm +from tortoise.models import Model +from tortoise import fields + + +class Source(Model): + id = fields.IntField(primary_key=True) + name = fields.TextField() + index_url = fields.TextField() diff --git a/test_main.http b/test_main.http new file mode 100644 index 0000000..a2d81a9 --- /dev/null +++ b/test_main.http @@ -0,0 +1,11 @@ +# Test your FastAPI endpoints + +GET http://127.0.0.1:8000/ +Accept: application/json + +### + +GET http://127.0.0.1:8000/hello/User +Accept: application/json + +###