关联user

This commit is contained in:
wuaho 2021-06-03 19:13:26 +08:00
parent 6f12cca6f9
commit 2a03a20ce7
6 changed files with 73 additions and 24 deletions

View File

@ -100,7 +100,8 @@ async def event_model(
for i in set(date_range) - set(df['date']):
concat_data.append((i, 0))
df = pd.concat([df, pd.DataFrame(concat_data, columns=df.columns)])
df.sort_values('values', inplace=True)
q['values'].append(df['values'].to_list())
q['date_range'] = [d.strftime('%Y-%m/%d %H:%M:%S') for d in q['date_range']]
q['date_range'] = [d.strftime('%Y-%m-%d %H:%M:%S') for d in q['date_range']]
res.append(q)
return schemas.Msg(code=0, msg='ok', data=res)

View File

@ -38,6 +38,7 @@ async def login(
'name': user.name,
'nickname': user.nickname,
'email': user.email,
'tel': user.tel,
'token': security.create_access_token(
expires_delta=access_token_expires, _id=str(user.id), email=user.email,
nickname=user.nickname,
@ -97,6 +98,20 @@ async def reset_password(request: Request,
return schemas.Msg(code=0, msg='ok')
@router.post("/edit_profile")
async def edit_profile(request: Request,
game: str,
data_in: schemas.UserProfileEdit,
db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.User = Depends(deps.get_current_user)
) -> Any:
"""
编辑用户资料
"""
await crud.user.edit_profile(db, data_in)
return schemas.Msg(code=0, msg='ok', data=data_in)
@router.get("/all_account")
async def all_account(page: int = 1, limit: int = 10, db: AsyncIOMotorDatabase = Depends(get_database),
current_user: schemas.User = Depends(deps.get_current_user)

View File

@ -18,6 +18,12 @@ class CRUDUser(CRUDBase):
res = await db[self.coll_name].find_one({'name': name})
return res
async def edit_profile(self, db: AsyncIOMotorDatabase, data_id: schemas.UserProfileEdit):
if data_id.nickname:
await self.update_one(db, {'_id': data_id.user_id}, {'$set': data_id.nickname})
if data_id.nickname:
await self.update_one(db, {'_id': data_id.user_id}, {'$set': data_id.tel})
async def update_login_time(self, db, name):
await self.update_one(db, {'name': name},
{'$set': {'last_login_ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}})

View File

@ -82,12 +82,12 @@ 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=400)
return Response(schemas.Msg(code='-4', msg='请求错误', data=str(exc)).json(), status_code=400)
@app.exception_handler(Exception)
async def http_exception_handler(request, exc):
return Response(schemas.Msg(code='-3', msg='服务器错误'), status_code=500)
return Response(schemas.Msg(code='-3', msg='服务器错误').json(), status_code=500)
@app.middleware("http")

View File

@ -1,7 +1,7 @@
from typing import List, Tuple
import sqlalchemy as sa
from sqlalchemy.sql import func
from sqlalchemy import create_engine, column, and_, desc, table, or_
from sqlalchemy import create_engine, column, and_, desc, table, or_, select
import pandas as pd
from core.config import settings
@ -58,16 +58,22 @@ class ToSql:
for event in self.events:
event_name = event['event_name']
where = [
base_where = [
func.addHours(self.event_columns['#event_time'], time_zone) >= start_data,
func.addHours(self.event_columns['#event_time'], time_zone) <= end_data,
self.event_columns['#event_name'] == event_name
]
analysis = event['analysis']
filters = event['filters'] + self.get_global_filters()
event_filter = []
user_filter = []
for item in filters:
if item['table_type'] == 'user':
is_join_user = True
where = user_filter
elif item['table_type'] == 'event':
where = event_filter
col = getattr(self, f'{item["table_type"]}_columns').get(item['column_id'])
@ -95,37 +101,48 @@ class ToSql:
elif comparator == '!=':
where.append(col != ftv[0])
# 查出用户过滤
subq = sa.select([self.user_columns.get('#account_id')])
subq = subq.where(and_(*user_filter))
if analysis == 'total_count':
qry = sa.select(select_exprs + [func.count().label('values')])
selectd = select_exprs + [func.count().label('values')]
elif analysis == 'touch_user_count':
qry = sa.select(
selectd = sa.select(
select_exprs + [func.count(sa.distinct(self.event_columns['#account_id'])).label('values')])
elif analysis == 'touch_user_avg':
qry = sa.select(select_exprs + [
selectd = select_exprs + [
func.round((func.count() / func.count(sa.distinct(self.event_columns['#account_id']))), 2).label(
'values')])
'values')]
elif analysis == 'distinct_count':
qry = sa.select(
select_exprs + [
func.count(sa.distinct(self.event_columns[event['event_attr_id']])).label('values')])
selectd = select_exprs + [
func.count(sa.distinct(self.event_columns[event['event_attr_id']])).label('values')]
else:
qry = sa.select(
select_exprs + [
func.round(getattr(func, analysis)(self.event_columns[event['event_attr_id']]), 2).label(
'values')])
selectd = select_exprs + [
func.round(getattr(func, analysis)(self.event_columns[event['event_attr_id']]), 2).label(
'values')]
account_id = column('#account_id')
if user_filter:
sa.table('user', account_id)
on_clause = [self.event_columns.get('#account_id') == account_id]
qry = self.event_table.join(subq.alias('user'), and_(*on_clause))
qry = sa.select(selectd).select_from(qry)
qry = qry.where(and_(*event_filter, *base_where))
else:
qry = sa.select(selectd)
qry = qry.where(and_(*event_filter, *base_where))
qry = qry.where(and_(*where))
qry = qry.group_by(*select_exprs)
qry = qry.order_by(column('date'))
qry = qry.limit(1000)
qry = qry.select_from(self.event_table)
if is_join_user:
qry = qry.join(self.user_table,
and_(self.event_columns.get('#account_id') == self.user_columns.get('#account_id')))
# self.event_table.join(self.user_table, and_(*on_clause))
# qry = qry.select_from(self.event_table)
sql = str(qry.compile(self.engine, compile_kwargs={"literal_binds": True}))
print(sql)
sqls.append({'sql': sql,

View File

@ -11,6 +11,13 @@ class UserBase(BaseModel):
name: Optional[str] = None
nickname: str = ''
last_login_ts: str = '尚未登录'
tel: str = ''
class UserProfileEdit(BaseModel):
user_id: str
nickname: str = None
tel: str = None
class User(UserBase):
@ -30,9 +37,11 @@ class UserRestPassword(BaseModel):
username: str = ...
password: str = ...
class UserRestMyPassword(BaseModel):
password: str = ...
class UserCreate(UserBase):
password: str
name: str
@ -46,7 +55,8 @@ class UserDB(DBBase):
email: EmailStr = None
is_superuser: bool = False
name: str
nickname: str
nickname: str = ''
tel: str = ''
last_login_ts: str = '尚未登录'