浏览代码

Merge remote-tracking branch 'origin/master'

zooey 2 年之前
父节点
当前提交
afd5495e5c
共有 4 个文件被更改,包括 227 次插入53 次删除
  1. 3 1
      app/api/__init__.py
  2. 131 49
      app/api/classes.py
  3. 54 0
      app/api/news.py
  4. 39 3
      app/models/models.py

+ 3 - 1
app/api/__init__.py

@@ -2,9 +2,11 @@ from fastapi import APIRouter
 
 from app.api.users import users
 from app.api.classes import classes
+from app.api.news import news
 
 routers = APIRouter()
 
 
 routers.include_router(users, prefix="/api", tags=["登入/註冊"])
-routers.include_router(classes, prefix="/api", tags=["課程列表"])
+routers.include_router(classes, prefix="/api", tags=["課程列表"])
+routers.include_router(classes, prefix="/api", tags=["最新消息"])

+ 131 - 49
app/api/classes.py

@@ -1,11 +1,10 @@
 from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
+from typing import List
 from fastapi.responses import FileResponse
-import os
 from random import randint
-import uuid
 from fastapi.security import OAuth2PasswordRequestForm
-from app.models.models import User
-from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,School_group
+from app.models.models import User,Favorite_course
+from app.models.models import Class_list,Schools,Class_detail,Class_name,Registration,Group_name
 from app.api import deps
 from sqlalchemy.orm import Session
 from typing import Any, Dict
@@ -16,16 +15,22 @@ from datetime import timedelta,datetime
 from app.config import settings
 from pathlib import Path
 from jose import jwt
-import emails
 from emails.template import JinjaTemplate
-import logging
 from tortoise.queryset import Q
+from fastapi.responses import HTMLResponse
 
 classes = APIRouter()
 
 IMAGEDIR = "/var/www/html/ntcri/assets/"
 IMAGEDIR_short = "assets/"
 
+async def update_location_time(location_id: int):
+    if location_id:
+        school = await Schools.get(id=location_id)
+        school.update_time = datetime.now()
+        await school.save()
+        return {"msg": "success", "code": 200}
+
 @classes.post("/insert_school")
 async def insert_school(
     location_name: str = Form(default=''),
@@ -50,7 +55,7 @@ async def insert_school(
 @classes.post("/insert_class_name")
 async def insert_class_name(
     name: str = Form(default=''),
-    school_id: int = Form(default=1),
+    location_id: int = Form(default=1),
     category: str = Form(default=''),
     introduction: str = Form(default=''),
     organizer: str = Form(default=''),
@@ -69,20 +74,20 @@ async def insert_class_name(
 
         new_class_name = await Class_name.create(
             name=name,
-            school_id=school_id,
+            school_id=location_id,
             category=category,
             introduction=introduction,
             organizer=organizer,
             cover_img=cover_img
         )
-
+        update_location_time(location_id= location_id)
         return {"msg": "success", "code": 200, "new_class_name_id": new_class_name.id}
     except Exception as e:
         return {"msg": str(e), "code": 500}
 
 @classes.post("/insert_event")
 async def insert_event(
-    name_id: int = Form(default=''),
+    name_id: int = Form(default=0),
     event: str = Form(default=''),
     start_time: datetime = Form(default=datetime.now()),
     end_time: datetime = Form(default=datetime.now()),
@@ -97,6 +102,12 @@ async def insert_event(
     remark : str = Form(default='')
 ):    
     try:
+
+        # 檢查是否有該課程
+        class_name_list = await Class_name.filter(id=name_id).all()
+        if class_name_list == []:
+            return {"msg": "沒有此課程", "code": 200}
+        
         new_class = await Class_list.create(
             name_id=name_id,
             event =event,
@@ -112,6 +123,7 @@ async def insert_event(
             registration_way=registration_way,
             remark=remark
         )
+
         return {"msg": "success", "code": 200, "class_id": new_class.id}
     except Exception as e:
         return {"msg": str(e), "code": 500}
@@ -165,6 +177,8 @@ async def update_school(
             school.address =  address
 
         await school.save()
+
+        update_location_time(location_id= location_id)
         return {"msg": "success", "code": 200}
     except Exception as e:
         return {"msg": str(e), "code": 500}
@@ -173,7 +187,7 @@ async def update_school(
 async def update_class_name(
     class_name_id: int = Form(default=0),
     name: str = Form(default=''),
-    school_id: int = Form(default=''),
+    location_id: int = Form(default=''),
     category: str = Form(default=''),
     introduction: str = Form(default=''),
     organizer: str = Form(default=''),
@@ -185,8 +199,8 @@ async def update_class_name(
         if name.strip() != '':
             class_name.name = name
 
-        if school_id != '':
-            class_name.school_id = school_id
+        if location_id != '':
+            class_name.school_id = location_id
         
         if category.strip() != '':
             class_name.category = category
@@ -207,6 +221,8 @@ async def update_class_name(
 
 
         await class_name.save()
+
+        update_location_time(location_id= location_id)
         return {"msg": "success", "code": 200}
     except Exception as e:
         return {"msg": str(e), "code": 500}
@@ -303,15 +319,32 @@ async def update_session(
     except Exception as e:
         return {"msg": str(e), "code": 500}
 
-@classes.post("/delete_class")
+@classes.post("/delete_school")
+async def delete_school(location_id: int):
+    if location_id:
+        await Schools.filter(id=location_id).delete()
+        return {"msg": "success", "code": 200}
+
+@classes.post("/delete_session")
+async def delete_session(id: int):
+    if id:
+        await Class_detail.filter(id=id).delete()
+        return {"msg": "success", "code": 200}
+
+@classes.post("/delete_event")
 async def delete(id: int):
     if id:
+        await Class_detail.filter(class_list_id=id).delete()
         await Class_list.filter(id=id).delete()
         return {"msg": "success", "code": 200}
     
 @classes.post("/delete_class_name")
 async def delete(id: int):
     if id:
+        class_event_list = await Class_list.filter(name_id=id).all()
+        for class_event_obj in class_event_list:
+            await Class_detail.filter(class_list_id=class_event_obj.id).delete()
+
         await Class_list.filter(name_id=id).delete()
         await Class_name.filter(id=id).delete()
         return {"msg": "success", "code": 200}
@@ -359,7 +392,8 @@ async def get_school():
                 "Lng": school_obj.longitude,
                 "Lat": school_obj.latitude,
                 "group_id": school_obj.group_id,
-                "address": school_obj.address
+                "address": school_obj.address,
+                "update_time":school_obj.update_time
             }
             schools.append(school_data)
 
@@ -367,10 +401,10 @@ async def get_school():
     except Exception as e:
         return {"msg": str(e), "code": 500}
     
-@classes.get("/get_school_group")
+@classes.get("/get_group_name")
 async def get_school_group():
     try:
-        school_group_list = await School_group.all()
+        school_group_list = await Group_name.all()
         school_groups = []
         for school_obj in school_group_list:
             school_data = {
@@ -385,43 +419,40 @@ async def get_school_group():
 
 @classes.get("/get_class_name")
 async def get_class_name(
-    school_id : int = 0
+    location_id : int = 0 ,
+    class_name_id : int = 0
 ):
     try:
-        if school_id == 0:
-            class_name_list = await Class_name.all()
-            classes_name = []
-            for class_name_obj in class_name_list:
-                school_obj = await Schools.get(id=class_name_obj.school_id)
-                class_data = {
-                    "class_name_id": class_name_obj.id,
-                    "name": class_name_obj.name,
-                    "school":school_obj.name,
-                    "category": class_name_obj.category,
-                    "introduction": class_name_obj.introduction,
-                    "organizer": class_name_obj.organizer,
-                    "cover_img": class_name_obj.cover_img
-                }
-                classes_name.append(class_data)
+        if location_id == 0:
+            if class_name_id == 0 :
+                class_name_list = await Class_name.all()
+            else :
+                class_name_list = await Class_name.filter(id = class_name_id).all()
         else:
-            class_name_list = await Class_name.filter(school_id = school_id).all()
-            classes_name = []
-            for class_name_obj in class_name_list:
+            class_name_list = await Class_name.filter(school_id = location_id).all()
+
+        classes_name = []
+        for class_name_obj in class_name_list:
+            school_obj = await Schools.filter(id=class_name_obj.school_id).all()
+            school_name = ""
+            if school_obj == []:
+                school_name = "未設定據點"
+            else :
                 school_obj = await Schools.get(id=class_name_obj.school_id)
-                class_data = {
-                    "msg": "success",
-                    "code": 200,
-                    "class_name_id": class_name_obj.id,
-                    "name": class_name_obj.name,
-                    "school":school_obj.name,
-                    "category": class_name_obj.category,
-                    "introduction": class_name_obj.introduction,
-                    "organizer": class_name_obj.organizer,
-                    "cover_img": class_name_obj.cover_img
-                }
-                classes_name.append(class_data)
+                school_name = school_obj.name
+            class_data = {
+                "class_name_id": class_name_obj.id,
+                "name": class_name_obj.name,
+                "school":school_name,
+                "category": class_name_obj.category,
+                "introduction": class_name_obj.introduction,
+                "organizer": class_name_obj.organizer,
+                "cover_img": class_name_obj.cover_img
+            }
+            classes_name.append(class_data)
 
         return {"msg": "success", "code": 200, "classes": classes_name}
+    
     except Exception as e:
         return {"msg": str(e), "code": 500}    
     
@@ -517,4 +548,55 @@ async def search_class_like(keyword: str):
 
         return {"msg": "success", "code": 200, "classes": classes}
     except Exception as e:
-        return {"msg": str(e), "code": 500}
+        return {"msg": str(e), "code": 500}
+
+@classes.post("/add_favorite_class")
+async def add_favorite_class(
+        class_event_id: int, 
+        user_id : int,
+        time_stemp: datetime = datetime.now()
+):
+    try:
+        new_favorite_class = await Favorite_course.get_or_create(
+            class_event_id=class_event_id,
+            user_id=user_id,
+            defaults={'time_stemp': time_stemp}
+        )
+        return {"msg": "success", "code": 200,"is exist": not new_favorite_class[1],"id":new_favorite_class[0].id}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@classes.get("get_favorite_class")
+async def get_favorite_class( 
+        user_id : int
+):
+    try:
+        class_list = await Favorite_course.filter(user_id = user_id).all()
+        favorite_courses = []
+        for class_obj in class_list:
+            class_data = {
+                "id": class_obj.id,
+                "user_id": class_obj.user_id,
+                "class_event_id":class_obj.class_event_id,
+                "time_stemp":class_obj.time_stemp
+            }
+            favorite_courses.append(class_data)
+
+        return {"msg": "success", "code": 200, "school_groups": favorite_courses}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@classes.post("/delete_favorite_class")
+async def delete_favorite_class(
+        class_event_id: int, 
+        user_id : int
+):
+    try:
+        await Favorite_course.filter(class_event_id=class_event_id,user_id=user_id).delete()
+        return {"msg": "success", "code": 200}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+
+@classes.post("/uploadfiles/")
+async def create_upload_files(files: List[UploadFile]):
+    return {"filenames": [file.filename for file in files]}

+ 54 - 0
app/api/news.py

@@ -0,0 +1,54 @@
+from fastapi import APIRouter, Form, Depends, HTTPException, File, UploadFile
+from typing import List
+from fastapi.responses import FileResponse
+from random import randint
+from fastapi.security import OAuth2PasswordRequestForm
+from app.models.models import User,Favorite_course,News,Article_list
+from app.api import deps
+from sqlalchemy.orm import Session
+from typing import Any, Dict
+import secrets
+from fastapi_login.exceptions import InvalidCredentialsException
+from fastapi_login import LoginManager
+from datetime import timedelta,datetime
+from jose import jwt
+from emails.template import JinjaTemplate
+from tortoise.queryset import Q
+from fastapi.responses import HTMLResponse
+
+news = APIRouter()
+
+@news.get("/get_news")
+async def search_news(
+    news_id : int = None
+):
+    try:
+        if news_id :
+            news_list = await News.filter(id=news_id).all()
+        else:    
+            news_list = await News.all()
+
+        news_objs = []
+        for news_obj in news_list:
+            news_tmp = {
+            "news_id": news_obj.id,
+            "title": news_obj.title,
+            "category": news_obj.category,
+            "create_time" : news_obj.create_time,
+            "click_time" : news_obj.click_time,
+            "content" : news_obj.content,
+            "files" : news_obj.files,
+            "URL" : news_obj.URL,
+            "tags" : news_obj.tags
+        }
+            news_objs.append(news_tmp)
+
+        return {"msg": "success", "code": 200, "news": news_objs}
+    except Exception as e:
+        return {"msg": str(e), "code": 500}
+    
+# @news.post("/insert_news")
+# async def insert_news(
+
+# ):
+    

+ 39 - 3
app/models/models.py

@@ -19,8 +19,9 @@ class Schools(Model):
     latitude = fields.CharField(max_length=100, description="緯度")
     group_id = fields.IntField(description="學群")
     address = fields.CharField(max_length=128,description="地址")
+    update_time = fields.DatetimeField(description="更新時間")
 
-class School_group(Model):
+class Group_name(Model):
     id =  fields.IntField(pk=True)
     group_name = fields.CharField(max_length=45, description="學群名稱")
 
@@ -53,7 +54,7 @@ class Class_list(Model):
 
 class Class_detail(Model):
     id = fields.IntField(pk=True)
-    class_list_id = fields.IntField(description="課程ID")
+    class_list_id = fields.IntField(description="課程場次ID")
     start_time = fields.DatetimeField(description="開始時間")
     end_time = fields.DatetimeField(description="結束時間")
     sessions = fields.IntField(description="堂數")
@@ -65,4 +66,39 @@ class Registration(Model):
     user_id = fields.IntField(description="使用者ID")
     reg_confirm = fields.CharField(max_length=255, description="報名確認(1:報名成功 0:單純報名)")
     is_del = fields.CharField(max_length=255, description="是否取消(1:yes ,0:no)")
-    create_time = fields.DatetimeField(description="創建時間")
+    create_time = fields.DatetimeField(description="創建時間")
+
+class News(Model):
+    id = fields.IntField(pk=True)
+    title = fields.CharField(max_length=200, description="標題")
+    category = fields.CharField(max_length=45, description="類別")
+    create_time = fields.DatetimeField(description="發布時間")
+    click_time = fields.IntField(description="點擊次數")
+    content = fields.TextField(description="內容")
+    files = fields.TextField(description="附加檔案")
+    URL = fields.TextField(description="外部連結")
+    tags = fields.TextField(description="標籤")
+
+class Favorite_course(Model):
+    id = fields.IntField(pk=True)
+    user_id = fields.IntField(description="使用者ID")
+    class_event_id = fields.IntField(description="課程場次ID")
+    time_stemp = fields.DatetimeField(description="時間")
+
+class Article_list(Model):
+    id = fields.IntField(pk=True)
+    title = fields.CharField(max_length=45, description="標題")
+    school_id = fields.IntField(description="學校ID")
+    group_id = fields.IntField(description="學群")
+    create_user_id = fields.IntField(description="創建使用者ID")
+    create_time = fields.DatetimeField(description="創建時間")
+    latest_update_user_id = fields.IntField(description="最新更新使用者ID")
+    latest_update_time = fields.DatetimeField(description="最新更新時間")
+    tags = fields.TextField(description="標籤")
+    category = fields.CharField(max_length=45, description="類別")
+    depiction = fields.TextField(description="文章描述")
+    cover_img = fields.TextField( description="封面圖片")
+    vedio_url = fields.TextField( description="影片連結")
+    click_time = fields.IntField(description="點擊次數")
+    content = fields.TextField(description="內容")
+    is_del = fields.IntField(description="是否刪除")