Commit 32ab311b authored by xianyang's avatar xianyang

角色优化,充值报表接口

parent 52818038
from datetime import datetime from datetime import datetime
from fastapi import HTTPException, status
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.api.role import schemas from app.api.role import schemas
from libs.functions import wrapper_out
from models import roles as models from models import roles as models
...@@ -8,15 +10,30 @@ def get_role_by_name(db: Session, role_name: str): ...@@ -8,15 +10,30 @@ def get_role_by_name(db: Session, role_name: str):
return db.query(models.Role).filter(models.Role.role_name == role_name).first() return db.query(models.Role).filter(models.Role.role_name == role_name).first()
def get_id_to_authority(db: Session, role_id: int):
return db.query(models.Role).filter(models.Role.id == role_id).first()
@wrapper_out()
def get_roles(db: Session, param): def get_roles(db: Session, param):
page = param.page if param.page else 1 result_list = []
size = param.size if param.size else 10
name = param.role_name if param.role_name else "" name = param.role_name if param.role_name else ""
if name: if name:
return db.query(models.Role).filter(models.Role.role_name.like(f'%{name}%')).offset((int(page) - 1) * size).\ query_res = db.query(models.Role).filter(models.Role.role_name.like(f'%{name}%')).\
limit(page * size).all() offset((int(param.page) - 1) * param.size).limit(param.page * param.size).all()
else: else:
return db.query(models.Role).offset((int(page) - 1) * size).limit(page * size).all() query_res = db.query(models.Role).offset((int(param.page) - 1) * param.size).limit(param.page * param.size).all()
if not query_res:
return []
for i in query_res:
serializer_info = i.to_dict(only=('id', 'role_name', 'authority', 'remark', 'create_time'))
if i.authority:
auth_list = serializer_info.get('authority').split(',')
serializer_info['authority'] = [int(i) for i in auth_list]
else:
serializer_info['authority'] = []
result_list.append(serializer_info)
return result_list
def create_role(db: Session, user: schemas.RoleCreate): def create_role(db: Session, user: schemas.RoleCreate):
...@@ -47,6 +64,10 @@ def update_role(db: Session, role_info): ...@@ -47,6 +64,10 @@ def update_role(db: Session, role_info):
def delete_role(db: Session, role_id: int): def delete_role(db: Session, role_id: int):
from models import users as model
user_info = db.query(model.User).filter(model.User.role_id == role_id).first()
if user_info:
return False
db.query(models.Role).filter(models.Role.id == role_id).delete() db.query(models.Role).filter(models.Role.id == role_id).delete()
db.commit() db.commit()
return True
...@@ -29,7 +29,9 @@ def read_user(data: schemas.RoleUpdate, db: Session = Depends(get_db)): ...@@ -29,7 +29,9 @@ def read_user(data: schemas.RoleUpdate, db: Session = Depends(get_db)):
@router.delete("/delete/{role_id}") @router.delete("/delete/{role_id}")
def delete_user(role_id: int, db: Session = Depends(get_db)): def delete_user(role_id: int, db: Session = Depends(get_db)):
"""角色删除""" """角色删除"""
crud.delete_role(db, role_id) res_bool = crud.delete_role(db, role_id)
if not res_bool:
return HttpResultResponse(code=422, msg=HttpMessage.NO_DELETE_ROLE)
return HttpResultResponse() return HttpResultResponse()
...@@ -37,4 +39,4 @@ def delete_user(role_id: int, db: Session = Depends(get_db)): ...@@ -37,4 +39,4 @@ def delete_user(role_id: int, db: Session = Depends(get_db)):
def role_list(data: schemas.RoleList, db: Session = Depends(get_db)): def role_list(data: schemas.RoleList, db: Session = Depends(get_db)):
"""用户列表""" """用户列表"""
result = crud.get_roles(db, data) result = crud.get_roles(db, data)
return {"code": 200, "msg": "操作成功", "count": len(result), "data": result} return HttpResultResponse(count=len(result), data=result)
import math
import threading
import pandas as pd import pandas as pd
from app.api.statement import schemas
from core.config.env import env from core.config.env import env
from libs.db_link import LinkMysql from libs.db_link import LinkMysql
from starlette.responses import StreamingResponse from starlette.responses import StreamingResponse
# def get_statement(db: Session, user_id: int): # 写入文件
# return db.query(models.Statement).filter(models.Statement.id == user_id) def data_to_file(data, name):
bk = pd.DataFrame(data)
with pd.ExcelWriter(f'static/{name}.xlsx') as writer:
bk.to_excel(writer, sheet_name='Sheet1', index=False)
file = open(writer, 'rb')
return StreamingResponse(file, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
# def get_statement_by_name(db: Session, username: str): class RechargeStatement(object):
# return db.query(models.Statement).filter(models.Statement.username == username).first() """充值报表"""
def __init__(self):
self.derive_list = []
def check_out(self, ch_sql):
once_res = LinkMysql(env.MysqlDB).query_mysql(ch_sql)
self.derive_list += once_res
def get_statements(param): def derive_query_data(self, condition_list, old_sql):
page = param.page if param.page else 1 if not condition_list:
size = param.size if param.size else 10 der_sql = f"select count(*) as total from orders o INNER JOIN v2_user v on o.userid = v.user_id order by o.id desc"
query_list = [] elif len(condition_list) == 1:
if param.order_number: der_sql = f"select count(*) as total from orders o INNER JOIN v2_user v on o.userid = v.user_id where {condition_list[0]} order by o.id desc"
query_list.append(f"o.order_number LIKE '%{param.order_number}%'") else:
if param.user_id: der_sql = f"select count(*) as total from orders o INNER JOIN v2_user v on o.userid = v.user_id where {' and '.join(condition_list)} order by o.id desc"
query_list.append(f"o.userid={param.user_id}") total = LinkMysql(env.MysqlDB).query_mysql(der_sql)
if param.sid: if total:
query_list.append(f"o.sid LIKE '%{param.sid}%'") to = total[0].get('total')
if param.paychannel: num = math.ceil(to / 10000)
query_list.append(f"o.paychannel LIKE '%{param.paychannel}%'") # 多线程
if param.start_time: ths = []
query_list.append(f"o.current>='{param.start_time}'") # 创建线程
if param.end_time: for x in range(num):
query_list.append(f"o.current <= '{param.end_time}'") query_sql = old_sql + f" LIMIT {x*10000},{10000}"
if not query_list: ths.append(threading.Thread(target=self.check_out, args=[(query_sql)]))
sql = f"select order_number,userid,user_number,nick_name,cast(money as char) as money,paychannel,sid,lastupdate,cast(current as char) as current,payment_time from orders o INNER JOIN v2_user v on o.userid = v.user_id LIMIT {(int(page) - 1) * size},{page * size}" # 启动线程
elif len(query_list) == 1: for y in range(num):
sql = f"select order_number,userid,user_number,nick_name,cast(money as char) as money,paychannel,sid,lastupdate,cast(current as char) as current,payment_time from orders o INNER JOIN v2_user v on o.userid = v.user_id where {query_list[0]} LIMIT {(int(page)-1) * size},{page * size}" ths[y].start()
else: # 等待子进程结束
sql = f"select order_number,userid,user_number,nick_name,cast(money as char) as money,paychannel,sid,lastupdate,cast(current as char) as current,payment_time from orders o INNER JOIN v2_user v on o.userid = v.user_id where {' and '.join(query_list)} LIMIT {(int(page) - 1) * size},{page * size}" for z in range(num):
ths[z].join()
return self.derive_list
query_res = LinkMysql(env.MysqlDB).query_mysql(sql) def get_statements(self, param, sp=None):
return query_res query_list = []
if not sp:
param: schemas.StatementList
if param.order_number:
query_list.append(f"o.order_number LIKE '%{param.order_number}%'")
if param.user_id:
query_list.append(f"o.userid={int(param.user_id)}")
if param.sid:
query_list.append(f"o.sid LIKE '%{param.sid}%'")
if param.paychannel:
query_list.append(f"o.paychannel LIKE '%{param.paychannel}%'")
if param.start_time:
query_list.append(f"o.current>='{param.start_time}'")
if param.end_time:
query_list.append(f"o.current <= '{param.end_time}'")
fields = ["order_number", "userid", "user_number", "nick_name", "cast(money as char) as money", "paychannel",
"sid", "lastupdate", "cast(current as char) as current", "payment_time"]
if not query_list:
sql = f"select {','.join(fields)} from orders o INNER JOIN v2_user v on o.userid = v.user_id order by o.id desc"
elif len(query_list) == 1:
sql = f"select {','.join(fields)} from orders o INNER JOIN v2_user v on o.userid = v.user_id where {query_list[0]} order by o.id desc"
else:
sql = f"select {','.join(fields)} from orders o INNER JOIN v2_user v on o.userid = v.user_id where {' and '.join(query_list)} order by o.id desc"
if sp:
sql += f" LIMIT {(int(param.page) - 1) * param.size},{param.page * param.size}"
query_res = LinkMysql(env.MysqlDB).query_mysql(sql)
else:
query_res = self.derive_query_data(query_list, sql)
if query_res:
df = pd.DataFrame(query_res)
print(df)
count = df.groupby("money").sum()
# amount_list = list(count["money"].values)
else:
count = 0
return query_res, count
class WithdrawStatement(object):
"""提现报表"""
@staticmethod
def get_user_withdraw_cash(param, ty=None):
"""用户提现"""
user_list = []
if param.user_id:
user_list.append(f"o.userid={param.user_id}")
if param.status:
user_list.append(f"o.status={param.status}")
if param.start_time:
user_list.append(f"o.current>='{param.start_time}'")
if param.end_time:
user_list.append(f"o.current <= '{param.end_time}'")
fields = ["id", "bank_code", "usernumber", "nickname", "truename", "idcard", "account", "status", "money",
"platformServiceFee", "thirdServiceFee", "final_money", "cast(current as char) as current"]
if not user_list:
sql = f"select {','.join(fields)} from tixian_order order by id desc"
elif len(user_list) == 1:
sql = f"select {','.join(fields)} from tixian_order where {user_list[0]} order by id desc"
else:
sql = f"select {','.join(fields)} from tixian_order where {' and '.join(user_list)} order by id desc"
if ty:
sql += f" LIMIT {(int(param.page)-1) * param.size},{param.page * param.size}"
query_res = LinkMysql(env.MysqlDB).query_mysql(sql)
return query_res
@staticmethod
def get_guild_withdraw_cash(cond, co):
"""公会提现"""
guild_list = []
if cond.guild_id:
guild_list.append(f"o.guild_id={cond.guild_id}")
if cond.status:
guild_list.append(f"o.status LIKE '%{cond.status}%'")
if cond.start_time:
guild_list.append(f"o.current>='{cond.start_time}'")
if cond.end_time:
guild_list.append(f"o.current <= '{cond.end_time}'")
gui_fields = ["account", "finalMoney", "guild_name", "x.id", "money", "parentid", "taxRate", "thirdServiceFee",
"x.type", "x.update_time"]
if not guild_list:
sql = f"select {','.join(gui_fields)} from guild_ti_xian x INNER JOIN guild g on x.guild_id = g.id order by o.id desc"
elif len(guild_list) == 1:
sql = f"select {','.join(gui_fields)} from guild_ti_xian x INNER JOIN guild g on x.guild_id = g.id where {guild_list[0]} order by o.id desc"
else:
sql = f"select {','.join(gui_fields)} from guild_ti_xian x INNER JOIN guild g on x.guild_id = g.id where {' and '.join(guild_list)} order by o.id desc"
if co:
sql += f" LIMIT {(int(cond.page) - 1) * cond.size},{cond.page * cond.size}"
query_res = LinkMysql(env.MysqlDB).query_mysql(sql)
return query_res
# 写入文件
def data_to_file(data, name):
bk = pd.DataFrame(data)
with pd.ExcelWriter(f'static/{name}.xlsx') as writer:
bk.to_excel(writer, sheet_name='Sheet1', index=False)
file = open(writer, 'rb')
return StreamingResponse(file)
...@@ -22,7 +22,7 @@ class StatementList(BaseModel): ...@@ -22,7 +22,7 @@ class StatementList(BaseModel):
start_time: Optional[str] = "" start_time: Optional[str] = ""
end_time: Optional[str] = "" end_time: Optional[str] = ""
order_number: Optional[str] = "" order_number: Optional[str] = ""
user_id: Optional[int] = None user_id: Optional[str] = ""
sid: Optional[str] = "" sid: Optional[str] = ""
paychannel: Optional[str] = "" paychannel: Optional[str] = ""
...@@ -32,3 +32,12 @@ class Statement(StatementBase): ...@@ -32,3 +32,12 @@ class Statement(StatementBase):
class Config: class Config:
orm_mode = True orm_mode = True
class UserWithdrawalList(BaseModel):
page: Optional[int] = None
size: Optional[int] = None
start_time: Optional[str] = ""
end_time: Optional[str] = ""
status: Optional[int] = None
user_id: Optional[int] = None
from app.api.statement import crud, schemas from app.api.statement import crud, schemas
from fastapi import APIRouter from fastapi import APIRouter
from app.api.statement.crud import RechargeStatement, WithdrawStatement
from libs.result_format import HttpResultResponse from libs.result_format import HttpResultResponse
router = APIRouter() router = APIRouter()
...@@ -8,19 +10,26 @@ router = APIRouter() ...@@ -8,19 +10,26 @@ router = APIRouter()
@router.post("/recharge/list") @router.post("/recharge/list")
def statement_recharge_list(data: schemas.StatementList): def statement_recharge_list(data: schemas.StatementList):
"""充值报表列表""" """充值报表列表"""
statement_list = crud.get_statements(data) statement_list, money = RechargeStatement().get_statements(data, 1)
return HttpResultResponse(data=statement_list) return HttpResultResponse(count=len(statement_list), total=money, data=statement_list)
@router.post("/derive/excel") @router.post("/derive/excel")
def statement_recharge_list(data: schemas.StatementList): def statement_derive_excel(data: schemas.StatementList):
"""充值报表导出""" """充值报表导出"""
statement_list = crud.get_statements(data) statement_list = RechargeStatement().get_statements(data)
return crud.data_to_file(statement_list, "充值报表") return crud.data_to_file(statement_list, "充值报表")
@router.post("/userWithdrawal/list") @router.post("/userWithdrawal/list")
def statement_recharge_list(data: schemas.StatementList): def user_withdrawal_list(data: schemas.UserWithdrawalList):
"""用户提现列表""" """用户提现列表"""
statement_list = crud.get_statements(data) statement_list = WithdrawStatement().get_user_withdraw_cash(data, 1)
return HttpResultResponse(data=statement_list) return HttpResultResponse(data=statement_list)
@router.post("/userWithdrawal/excel")
def user_withdrawal_excel(data: schemas.UserWithdrawalList):
"""用户提现导出"""
user_list = WithdrawStatement().get_user_withdraw_cash(data)
return crud.data_to_file(user_list, "用户提现")
import random
from datetime import datetime from datetime import datetime
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.api.role.crud import get_id_to_authority
from app.api.users import schemas from app.api.users import schemas
from libs.functions import md5, uuid from libs.functions import md5, uuid, wrapper_out
from models import users as models from models import users as models
from core.config.env import env
def get_user_by_name(db: Session, username: str): def get_user_by_name(db: Session, username: str):
return db.query(models.User).filter(models.User.username == username).first() return db.query(models.User).filter(models.User.username == username).first()
@wrapper_out()
def get_users(db: Session, param): def get_users(db: Session, param):
page = param.page if param.page else 1 """
size = param.size if param.size else 10 分组统计求和 from sqlalchemy import func as fc
r = db.query(fc.sum(r_model.Rolesfsas.aority), fc.sum(r_model.Rolesfsas.remark)).having(r_model.Rolesfsas.goods >
10).group_by(r_model.Rolesfsas.goods).all()
"""
username = param.username if param.username else "" username = param.username if param.username else ""
if username: if username:
return db.query(models.User).filter(models.User.username.like(f'%{username}%')).offset((int(page) - 1) * size).\ res = db.query(models.User).filter(models.User.username.like(f'%{username}%')).order_by(models.User.id.desc()).offset((int(param.page) - 1) * param.size).limit(param.page * param.size)
limit(page * size).all()
else: else:
return db.query(models.User).offset((int(page) - 1) * size).limit(page * size).all() res = db.query(models.User).order_by(models.User.id.desc()).offset((int(param.page) - 1) * param.size).limit(param.page * param.size)
if not res:
return []
result_list = []
for i in res:
serializer_info = i.to_dict()
if i.role_id:
role_id = serializer_info.get('role_id')
role_info = get_id_to_authority(db, role_id)
if not role_info:
serializer_info['role_name'] = ''
continue
serializer_info['role_name'] = role_info.role_name
else:
serializer_info['role_name'] = ''
result_list.append(serializer_info)
return result_list
def generate_random_str():
random_str = ""
base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'
length = len(base_str) - 1
for i in range(10):
random_str += base_str[random.randint(0, length)]
return random_str
def create_user(db: Session, user: schemas.UserCreate): def create_user(db: Session, user: schemas.UserCreate):
try: try:
db_user = models.User(username=user.username, description=user.description, unique=user.unique, db_user = models.User(username=user.username, remark=user.remark, unique=uuid(),
config_key=user.config_key, uuid=uuid(), hashed_password=md5("123456"), config_key=generate_random_str(), uuid=uuid(), role_id=user.role_id,
create_time=datetime.now()) hashed_password=md5(env.PASSWORD), create_time=datetime.now())
db.add(db_user) db.add(db_user)
db.commit() db.commit()
db.refresh(db_user) db.refresh(db_user)
...@@ -34,8 +65,16 @@ def create_user(db: Session, user: schemas.UserCreate): ...@@ -34,8 +65,16 @@ def create_user(db: Session, user: schemas.UserCreate):
return db_user return db_user
def update_user(db: Session, user_id: int, permissions: list): def update_user(db: Session, data):
if data.role_id:
db.query(models.User).filter(models.User.id == data.id).update({models.User.role_id: data.role_id})
if data.remark:
db.query(models.User).filter(models.User.id == data.id).update({models.User.remark: data.remark})
db.commit()
def delete_user(db: Session, user_id: int):
db.query(models.User).filter(models.User.id == user_id).update({models.User.authority: ','.join(map(str, db.query(models.User).filter(models.User.id == user_id).delete()
permissions))})
db.commit() db.commit()
...@@ -7,9 +7,8 @@ class UserBase(BaseModel): ...@@ -7,9 +7,8 @@ class UserBase(BaseModel):
class UserCreate(UserBase): class UserCreate(UserBase):
unique: str remark: str
description: str role_id: int
config_key: str
class User(UserBase): class User(UserBase):
...@@ -39,7 +38,8 @@ class GoogleLogin(BaseModel): ...@@ -39,7 +38,8 @@ class GoogleLogin(BaseModel):
class PermissionCreate(BaseModel): class PermissionCreate(BaseModel):
id: int id: int
authority: list remark: str
role_id: int
class UserList(BaseModel): class UserList(BaseModel):
......
...@@ -73,8 +73,8 @@ def create_user(data: schemas.UserCreate, db: Session = Depends(get_db)): ...@@ -73,8 +73,8 @@ def create_user(data: schemas.UserCreate, db: Session = Depends(get_db)):
@router.post("/permission/allocation") @router.post("/permission/allocation")
def read_user(data: schemas.PermissionCreate, db: Session = Depends(get_db)): def read_user(data: schemas.PermissionCreate, db: Session = Depends(get_db)):
"""用户添加权限""" """用户修改"""
crud.update_user(db, data.id, data.authority) crud.update_user(db, data)
return HttpResultResponse() return HttpResultResponse()
...@@ -82,4 +82,11 @@ def read_user(data: schemas.PermissionCreate, db: Session = Depends(get_db)): ...@@ -82,4 +82,11 @@ def read_user(data: schemas.PermissionCreate, db: Session = Depends(get_db)):
def user_list(data: schemas.UserList, db: Session = Depends(get_db)): def user_list(data: schemas.UserList, db: Session = Depends(get_db)):
"""用户列表""" """用户列表"""
result = crud.get_users(db, data) result = crud.get_users(db, data)
return {"code": 200, "msg": "操作成功", "count": len(result), "data": result} return HttpResultResponse(count=len(result), data=result)
@router.delete("/delete/{user_id}")
def delete_user(user_id: int, db: Session = Depends(get_db)):
"""用户删除"""
crud.delete_user(db, user_id)
return HttpResultResponse()
...@@ -20,8 +20,9 @@ class Env(BaseSettings): ...@@ -20,8 +20,9 @@ class Env(BaseSettings):
"pwd": "c1ea602311a369f6", "pwd": "c1ea602311a369f6",
"user": "root" "user": "root"
} }
SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" SECRET_KEY: str = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
ALGORITHM = "HS256" ALGORITHM: str = "HS256"
PASSWORD: str = "fj123456"
class TestingEnv(Env): class TestingEnv(Env):
......
...@@ -12,3 +12,15 @@ def md5(s): ...@@ -12,3 +12,15 @@ def md5(s):
def uuid(): def uuid():
"""生成uuid""" """生成uuid"""
return str(u.uuid4()) return str(u.uuid4())
# 页数页码校验
def wrapper_out():
def wrapper(func):
def inner(db, param):
param.page = param.page if param.page else 1
param.size = param.size if param.size else 10
ret = func(db, param)
return ret
return inner
return wrapper
...@@ -10,6 +10,7 @@ class HttpMessage(object): ...@@ -10,6 +10,7 @@ class HttpMessage(object):
LOGIN_SUCCESS = "登录成功" LOGIN_SUCCESS = "登录成功"
ROLE_EXIST = "角色已存在" ROLE_EXIST = "角色已存在"
NO_DELETE_ROLE = "不能删除已绑定用户的角色!"
class HttpResultResponse(Response): class HttpResultResponse(Response):
......
...@@ -3,6 +3,8 @@ from sqlalchemy.orm import Session ...@@ -3,6 +3,8 @@ from sqlalchemy.orm import Session
from fastapi import Depends, APIRouter, HTTPException, status from fastapi import Depends, APIRouter, HTTPException, status
from fastapi.security import OAuth2PasswordBearer from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTError from jose import jwt, JWTError
from app.api.role.crud import get_id_to_authority
from app.api.users import crud from app.api.users import crud
from app.api.users.login_verification import get_user from app.api.users.login_verification import get_user
from core.config.env import env from core.config.env import env
...@@ -34,6 +36,7 @@ def get_current_user(db: Session, token: str = Depends(oauth2_scheme)): ...@@ -34,6 +36,7 @@ def get_current_user(db: Session, token: str = Depends(oauth2_scheme)):
:param token: 携带的token :param token: 携带的token
:return: :return:
""" """
try: try:
# 解密tokens # 解密tokens
payload = jwt.decode(token, env.SECRET_KEY, algorithms=[env.ALGORITHM]) payload = jwt.decode(token, env.SECRET_KEY, algorithms=[env.ALGORITHM])
...@@ -41,7 +44,8 @@ def get_current_user(db: Session, token: str = Depends(oauth2_scheme)): ...@@ -41,7 +44,8 @@ def get_current_user(db: Session, token: str = Depends(oauth2_scheme)):
username: str = payload.get('username') username: str = payload.get('username')
user_data = get_user(db=db, username=username) user_data = get_user(db=db, username=username)
user_info = crud.get_user_by_name(db, user_data.username) user_info = crud.get_user_by_name(db, user_data.username)
auth_list = user_info.authority.split(',') role_info = get_id_to_authority(db, user_info.role_id)
auth_list = role_info.authority.split(',')
json_data = { json_data = {
"username": user_data.username, "username": user_data.username,
"authority": [int(i) for i in auth_list], "authority": [int(i) for i in auth_list],
......
from sqlalchemy import Column, Integer, String, DateTime, Text from sqlalchemy import Column, Integer, String, DateTime, Text
from core.storage.db import Base from core.storage.db import Base
from sqlalchemy_serializer import SerializerMixin
class Role(Base): class Role(Base, SerializerMixin):
__tablename__ = "role" __tablename__ = "role"
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
......
from sqlalchemy import Column, Integer, String, DateTime, Float from sqlalchemy import Column, Integer, String, DateTime, Float
from core.storage.db import Base from core.storage.db import Base
from sqlalchemy_serializer import SerializerMixin
class User(Base): class User(Base, SerializerMixin):
__tablename__ = "users" __tablename__ = "users"
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
username = Column(String(100), unique=True, index=True, comment="用户名") username = Column(String(100), unique=True, index=True, comment="用户名")
description = Column(String(255), comment="描述") remark = Column(String(255), comment="描述")
unique = Column(String(50), unique=True, comment="唯一标识") unique = Column(String(50), unique=True, comment="唯一标识")
hashed_password = Column(String(50), comment="密码") hashed_password = Column(String(50), comment="密码")
config_key = Column(String(50)) config_key = Column(String(50))
uuid = Column(String(50)) uuid = Column(String(50))
authority = Column(String(50), comment="权限") role_id = Column(Integer, comment="角色id")
google_key = Column(String(255), comment="谷歌动态码secret标识") google_key = Column(String(255), comment="谷歌动态码secret标识")
remaining_sum = Column(Float, comment="账户余额") remaining_sum = Column(Float, comment="账户余额")
entry_account = Column(String(255), comment="入账类目") entry_account = Column(String(255), comment="入账类目")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment