diff --git a/api/api_v1/api.py b/api/api_v1/api.py index 4401f3a..2c1a470 100644 --- a/api/api_v1/api.py +++ b/api/api_v1/api.py @@ -9,6 +9,7 @@ from .endpoints import authority from .endpoints import data_mana from .endpoints import query from .endpoints import data_auth +from .endpoints import event_mana api_router = APIRouter() @@ -23,5 +24,6 @@ api_router.include_router(authority.router, tags=["权限管理接口"], prefix= api_router.include_router(data_auth.router, tags=["数据权限"], prefix='/data_auth') api_router.include_router(data_mana.router, tags=["数据管理"], prefix='/data_mana') +api_router.include_router(event_mana.router, tags=["数据管理"], prefix='/data_mana') api_router.include_router(query.router, tags=["ck"], prefix='/ck') diff --git a/api/api_v1/endpoints/data_mana.py b/api/api_v1/endpoints/data_mana.py index 7f08d66..0280222 100644 --- a/api/api_v1/endpoints/data_mana.py +++ b/api/api_v1/endpoints/data_mana.py @@ -17,7 +17,7 @@ router = APIRouter() __all__ = 'router', -@router.get("/event_attr_list") +@router.get("/attr_list") async def read_data_attr( request: Request, game: str, @@ -47,7 +47,7 @@ async def read_data_attr( return schemas.Msg(code=0, msg='ok', data=res) -@router.post("/event_attr_edit") +@router.post("/attr_edit") async def edit_data_attr( request: Request, game: str, @@ -61,38 +61,3 @@ async def edit_data_attr( return schemas.Msg(code=0, msg='ok', data=data_in) -@router.get("/event_list") -async def event_list( - request: Request, - game: str, - cat: str, - db: AsyncIOMotorDatabase = Depends(get_database), - ckdb: CKDrive = Depends(get_ck_db), - rdb: Redis = Depends(get_redis_pool), - current_user: schemas.UserDB = Depends(deps.get_current_user) -) -> schemas.Msg: - """事件列表""" - - event_list = await ckdb.distinct(game, 'event', '#event_name') - pass - # make_event_list = await crud.event_map - res = [] - for name in event_list(): - res.append( - - ) - return schemas.Msg(code=0, msg='ok', data=res) - - -@router.post("/event_edit") -async def event_edit( - request: Request, - game: str, - data_in: schemas.DataAttrEdit, - db: AsyncIOMotorDatabase = Depends(get_database), - rdb: Redis = Depends(get_redis_pool), - current_user: schemas.UserDB = Depends(deps.get_current_user) -) -> schemas.Msg: - """编辑事件""" - await crud.data_attr.edit_data_attr(db, game, data_in) - return schemas.Msg(code=0, msg='ok', data=data_in) diff --git a/api/api_v1/endpoints/event_mana.py b/api/api_v1/endpoints/event_mana.py new file mode 100644 index 0000000..ad18128 --- /dev/null +++ b/api/api_v1/endpoints/event_mana.py @@ -0,0 +1,59 @@ +import json + +from aioredis import Redis +from fastapi import APIRouter, Depends, Request +from motor.motor_asyncio import AsyncIOMotorDatabase +import pandas as pd + +import crud, schemas + +from api import deps +from core.config import settings +from db import get_database +from db.ckdb import CKDrive, get_ck_db +from db.redisdb import get_redis_pool + +router = APIRouter() + +__all__ = 'router', + + +@router.get("/event_list") +async def event_list( + request: Request, + game: str, + db: AsyncIOMotorDatabase = Depends(get_database), + ckdb: CKDrive = Depends(get_ck_db), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """事件列表""" + event_list = await ckdb.distinct(game, 'event', '#event_name') + event_count = await ckdb.yesterday_event_count(game) + event_meta = await crud.event_mana.find_many(db, game=game) or {} + if event_meta: + event_meta = pd.DataFrame(event_meta).set_index('event_name').fillna('').T.to_dict() + + res = [] + for name in event_list: + res.append({ + 'name': name, + 'show_name': event_meta.get(name, {}).get('show_name', ''), + 'is_show': event_meta.get(name, {}).get('is_show', True), + 'desc': event_meta.get(name, {}).get('desc', ''), + 'event_count': event_count.get(name, {}).get('v') + } + ) + return schemas.Msg(code=0, msg='ok', data=res) + + +@router.post("/event_edit") +async def event_edit( + request: Request, + game: str, + data_in: schemas.EventMateEdit, + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """编辑事件""" + await crud.event_mana.edit_event_mate(db, game, data_in) + return schemas.Msg(code=0, msg='ok', data=data_in) diff --git a/crud/__init__.py b/crud/__init__.py index 35fa7ca..98a83d7 100644 --- a/crud/__init__.py +++ b/crud/__init__.py @@ -8,3 +8,4 @@ from .crud_authority import authority from .crud_data_auth import data_auth from .crud_data_attr import data_attr from .crud_api_log import api_log +from .crud_event_mana import event_mana diff --git a/crud/crud_event_mana.py b/crud/crud_event_mana.py new file mode 100644 index 0000000..6f762d6 --- /dev/null +++ b/crud/crud_event_mana.py @@ -0,0 +1,24 @@ +import pymongo +from bson import ObjectId +from motor.motor_asyncio import AsyncIOMotorDatabase + +import schemas +from crud.base import CRUDBase +from schemas import * + +__all__ = 'event_mana', + + +class CRUDEventMap(CRUDBase): + + async def edit_event_mate(self, db: AsyncIOMotorDatabase, game: str, data_id: schemas.EventMateEdit): + await self.update_one(db, {'game': game, 'event_name': data_id.show_name}, {'$set': data_id.dict()}, + upsert=True) + + async def create_index(self, db: AsyncIOMotorDatabase): + await db[self.coll_name].create_index( + [('game', pymongo.DESCENDING), ('event_name', pymongo.DESCENDING)], + unique=True) + + +event_mana = CRUDEventMap('event_mana') diff --git a/crud/crud_event_map.py b/crud/crud_event_map.py deleted file mode 100644 index df08df6..0000000 --- a/crud/crud_event_map.py +++ /dev/null @@ -1,24 +0,0 @@ -import pymongo -from bson import ObjectId -from motor.motor_asyncio import AsyncIOMotorDatabase - -import schemas -from crud.base import CRUDBase -from schemas import * - -__all__ = 'event_map', - - -class CRUDEventMap(CRUDBase): - - async def edit_data_attr(self, db: AsyncIOMotorDatabase, game: str, data_id: schemas.EventMapEdit): - await self.update_one(db, {'game': game, 'cat': data_id.cat, 'name': data_id.name}, {'$set': data_id.dict()}, - upsert=True) - - async def create_index(self, db: AsyncIOMotorDatabase): - await db[self.coll_name].create_index( - [('game', pymongo.DESCENDING), ('cat', pymongo.DESCENDING), ('name', pymongo.DESCENDING)], - unique=True) - - -event_map = CRUDEventMap('event_map') diff --git a/db/ckdb.py b/db/ckdb.py index e001885..d627b24 100644 --- a/db/ckdb.py +++ b/db/ckdb.py @@ -1,3 +1,5 @@ +import datetime + from aioch import Client import pandas as pd @@ -35,6 +37,15 @@ class CKDrive: res = await self.query_dataframe(sql) return res['v'].to_list() + async def yesterday_event_count(self, db: str): + today = datetime.date.today() + yesterday = today - datetime.timedelta(days=1) + today_str = today.strftime('%Y-%m-%d %H:%M:%S') + yesterday_str = yesterday.strftime('%Y-%m-%d %H:%M:%S') + sql = f"select `#event_name` as event_name, count() as v from {db}.event where `#event_time`>='{yesterday_str}' and `#event_time`<'{today_str}' group by `#event_name`" + df = await self.query_dataframe(sql) + return df.set_index('event_name').T.to_dict() + ckdb = CKDrive() diff --git a/db/init_db.py b/db/init_db.py deleted file mode 100644 index dcd66bf..0000000 --- a/db/init_db.py +++ /dev/null @@ -1,71 +0,0 @@ -import crud -import schemas -from core.config import settings - -# 创建一个超级用户、、 -from db import connect_to_mongo, get_database -import asyncio - -connect_to_mongo() -db = get_database() - - -async def create_superuser(): - user = await crud.user.get_by_user(db=db, name=settings.SUPERUSER_NAME) - if not user: - user_in = schemas.UserCreate( - name=settings.SUPERUSER_NAME, - email=settings.SUPERUSER_EMAIL, - password=settings.SUPERUSER_PASSWORD, - nickname=settings.SUPERUSER_NICKNAME, - is_superuser=True, - ) - await crud.user.create(db, user_in) - await crud.user.create_index(db) - - -async def project_index(): - await crud.project.create_index(db) - - -async def folder_index(): - await crud.folder.create_index(db) - - -async def space_index(): - await crud.space.create_index(db) - - -async def dashboard_index(): - await crud.dashboard.create_index(db) - - -async def report_index(): - await crud.report.create_index(db) - - -async def data_attr_index(): - await crud.data_attr.create_index(db) - - -async def authority_init(): - await crud.authority.create_index(db) - await crud.authority.create(db, 'p', '*', '*', '/docs', '*') - await crud.authority.create(db, 'p', '*', '*', '/openapi.json', '*') - await crud.authority.create(db, 'p', '*', '*', '/api/v1/user/login', '*') - await crud.authority.create(db, 'p', '*', '*', '/docs', '*') - await crud.authority.create(db, 'p', '*', '*', '/api/v1/project/', '*') - - -async def main(): - await create_superuser() - await project_index() - await folder_index() - await space_index() - await dashboard_index() - await report_index() - await authority_init() - await data_attr_index() - -loop = asyncio.get_event_loop() -loop.run_until_complete(main()) diff --git a/db/init_menu.py b/db/init_menu.py deleted file mode 100644 index 43aaaa8..0000000 --- a/db/init_menu.py +++ /dev/null @@ -1,13 +0,0 @@ -data = [ - {'title': '用户接口', 'powerarr': [ - {'title': '获取所有用户', 'path': '/api/v1/all_user'}, - ] - }, - {'title': '项目接口', 'powerarr': [ - {'title': '创建项目', 'path': '/api/v1/project/create'}, - ] - }, - {'title': '文件夹接口', 'powerarr': [ - {'title': '创建项目', 'path': '/api/v1/project/create'}, - ]}, -] diff --git a/init_db.py b/init_db.py index dcd66bf..7660f67 100644 --- a/init_db.py +++ b/init_db.py @@ -48,6 +48,10 @@ async def data_attr_index(): await crud.data_attr.create_index(db) +async def event_mana(): + await crud.event_mana.create_index(db) + + async def authority_init(): await crud.authority.create_index(db) await crud.authority.create(db, 'p', '*', '*', '/docs', '*') @@ -66,6 +70,8 @@ async def main(): await report_index() await authority_init() await data_attr_index() + await event_mana() + loop = asyncio.get_event_loop() loop.run_until_complete(main()) diff --git a/main.py b/main.py index 6d90c60..abc68f6 100644 --- a/main.py +++ b/main.py @@ -80,14 +80,14 @@ app.add_middleware( ) -# @app.exception_handler(RequestValidationError) -# async def validation_exception_handler(request, exc): -# return Response(schemas.Msg(code='-4', msg='服务器错误', data=str(exc)), status_code=200) +@app.exception_handler(RequestValidationError) +async def validation_exception_handler(request, exc): + return Response(schemas.Msg(code='-4', msg='服务器错误', data=str(exc)), status_code=400) -# @app.exception_handler(Exception) -# async def http_exception_handler(request, exc): -# return Response(schemas.Msg(code='-3', msg='服务器错误'), status_code=200) +@app.exception_handler(Exception) +async def http_exception_handler(request, exc): + return Response(schemas.Msg(code='-3', msg='服务器错误'), status_code=500) @app.middleware("http") @@ -96,10 +96,15 @@ async def add_process_time_header(request: Request, call_next): response = await call_next(request) process_time = int(time.time() * 1000) - start_time response.headers["X-Process-Time"] = str(process_time) + user_id = 'anonymous' + try: + user_id = request.user.id + except: + pass await crud.api_log.insert_log(get_database(), schemas.ApiLogInsert( api=str(request.url), ms=process_time, - user_id=request.user.id + user_id=user_id )) return response diff --git a/schemas/__init__.py b/schemas/__init__.py index 11ba086..ab25a2e 100644 --- a/schemas/__init__.py +++ b/schemas/__init__.py @@ -11,3 +11,4 @@ from .data_auth import * from .data_attr import * from .sql import * from .api_log import * +from .event_mana import * diff --git a/schemas/event_mana.py b/schemas/event_mana.py new file mode 100644 index 0000000..806c2d8 --- /dev/null +++ b/schemas/event_mana.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + + +class EventMateEdit(BaseModel): + event_name: str + show_name: str + is_show: bool + desc: str