feat: 第一次上传
This commit is contained in:
38
routers/auth.py
Normal file
38
routers/auth.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from fastapi import APIRouter, Request, Response
|
||||
from fastapi.responses import JSONResponse, RedirectResponse
|
||||
from models import User
|
||||
from services.services import XBXS
|
||||
from starlette.templating import Jinja2Templates
|
||||
|
||||
router = APIRouter()
|
||||
templates = Jinja2Templates(directory="templates")
|
||||
|
||||
|
||||
@router.get("/")
|
||||
async def index(request: Request):
|
||||
token = request.cookies.get("xbxs_token")
|
||||
if token:
|
||||
return RedirectResponse("/home")
|
||||
return templates.TemplateResponse("login.html", {"request": request})
|
||||
|
||||
|
||||
@router.post("/login")
|
||||
async def login(user: User, response: Response):
|
||||
xbxs = XBXS()
|
||||
result = await xbxs.login(username=user.username, password=user.password)
|
||||
|
||||
token = result.get("token")
|
||||
if not token:
|
||||
return JSONResponse({"msg": "登录失败"}, status_code=401)
|
||||
|
||||
resp = JSONResponse({"msg": "ok"})
|
||||
|
||||
resp.set_cookie(
|
||||
key="xbxs_token",
|
||||
value=token,
|
||||
max_age=60 * 60 * 24 * 7, # 7 天
|
||||
httponly=False,
|
||||
samesite="lax",
|
||||
)
|
||||
|
||||
return resp
|
||||
117
routers/home.py
Normal file
117
routers/home.py
Normal file
@@ -0,0 +1,117 @@
|
||||
from datetime import datetime
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
||||
from fastapi.responses import HTMLResponse
|
||||
from starlette.templating import Jinja2Templates
|
||||
from services.services import XBXS
|
||||
|
||||
router = APIRouter()
|
||||
templates = Jinja2Templates(directory="templates")
|
||||
|
||||
|
||||
def get_xbxs(request: Request) -> XBXS:
|
||||
token = request.cookies.get("xbxs_token")
|
||||
if not token:
|
||||
# 没有 token 跳转到登录页面
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_303_SEE_OTHER,
|
||||
detail="Redirect to login",
|
||||
headers={"Location": "/login"},
|
||||
)
|
||||
return XBXS(token=token)
|
||||
|
||||
|
||||
@router.get("/home")
|
||||
async def home(
|
||||
request: Request,
|
||||
xbxs: XBXS = Depends(get_xbxs),
|
||||
):
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"home.html",
|
||||
{
|
||||
"request": request,
|
||||
"active": "home",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get("/profile")
|
||||
async def profile(
|
||||
request: Request,
|
||||
xbxs: XBXS = Depends(get_xbxs),
|
||||
):
|
||||
student = await xbxs.get_student_info_cached()
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"profile.html",
|
||||
{
|
||||
"request": request,
|
||||
"student": student,
|
||||
"active": "profile",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get("/sign")
|
||||
async def sign_list(
|
||||
request: Request,
|
||||
xbxs: XBXS = Depends(get_xbxs),
|
||||
):
|
||||
result = await xbxs.get_know_list()
|
||||
|
||||
rows = result.get("rows", [])
|
||||
|
||||
now = datetime.now()
|
||||
|
||||
for item in rows:
|
||||
# 1️⃣ 计算是否结束(核心)
|
||||
end_str = f"{item['endDate']} {item['endTime']}"
|
||||
end_time = datetime.strptime(end_str, "%Y-%m-%d %H:%M")
|
||||
item["isEnded"] = now > end_time
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"sign_list.html",
|
||||
{
|
||||
"request": request,
|
||||
"list": rows,
|
||||
"total": result.get("total", 0),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.get("/sign/{knowing_id}", response_class=HTMLResponse)
|
||||
async def sign_detail(
|
||||
knowing_id: int,
|
||||
request: Request,
|
||||
xbxs: XBXS = Depends(get_xbxs),
|
||||
):
|
||||
know_detail = await xbxs.get_know(str(knowing_id))
|
||||
|
||||
data = know_detail.get("data", {})
|
||||
|
||||
# 获取具体的数据
|
||||
knowing_name = data.get("knowingName", "未知签到")
|
||||
start_date = data.get("startDate", "未知")
|
||||
start_time = data.get("startTime", "未知")
|
||||
end_time = data.get("endTime", "未知")
|
||||
send_name = data.get("sendName", "未知")
|
||||
send_role = data.get("sendRole", "未知")
|
||||
is_check = data.get("isCheck", 0)
|
||||
is_picture = data.get("isPicture", 0)
|
||||
is_finish_know = data.get("isFinishKnowing", 0)
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"sign_detail.html",
|
||||
{
|
||||
"request": request,
|
||||
"knowing_name": knowing_name,
|
||||
"start_date": start_date,
|
||||
"start_time": start_time,
|
||||
"end_time": end_time,
|
||||
"send_name": send_name,
|
||||
"send_role": send_role,
|
||||
"is_check": is_check,
|
||||
"is_picture": is_picture,
|
||||
"is_finish_know": is_finish_know,
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user