mini-rbac/backend/service/user.py
zy7y 547a4eeae6
Refactor backend MVC (#2)
* docs(requirements.txt):升级fastapi、uvicorn版本

* refactor(user):重构用户router、service

* ref: role list api

* doc: 1

* refactor(backend): mvc ref
2022-10-04 18:19:26 +08:00

91 lines
3.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi.encoders import jsonable_encoder
from core.dbhelper import RoleDao, UserDao, UserRoleDao, has_roles
from core.security import get_password_hash
from core.service import Service
class UserService(Service):
def __init__(self):
super(UserService, self).__init__(UserDao)
async def create_item(self, data):
"""创建用户"""
# 检查用户是否存在
if await self.dao.select({"username": data.username}) is not None:
return dict(code=400, msg="用户名已存在")
rids = data.roles
del data.roles
data.password = get_password_hash(data.password)
# 检查选中的角色是否存在
for role in rids:
if await RoleDao.select(dict(id=role.rid, status__not=9)) is None:
return dict(code=400, msg=f"角色{role.rid}不存在")
# 创建用户- 用户表写入数据
user_obj = await UserDao.insert(data.dict())
# 关联表写入数据
await UserRoleDao.inserts(
[dict(rid=role.rid, uid=user_obj.id, status=role.status) for role in rids]
)
return dict(data=user_obj)
async def get_item(self, pk):
"""获取用户信息"""
user_obj = await self.dao.select({"id": pk})
if user_obj is None:
return dict(code=400, msg="用户不存在")
roles = await has_roles(user_obj.id)
return dict(data=dict(**jsonable_encoder(user_obj), roles=roles))
async def update_item(self, pk, data):
"""用户编辑修改"""
if await self.dao.select({"id": pk}) is None:
return dict(code=400, msg="用户不存在")
rids = data.roles
del data.roles
for role in rids:
if await RoleDao.select({"id": role.rid, "status__not": 9}) is None:
return role.rid
# 更新用户
if data.password != "加密之后的密码":
data.password = get_password_hash(data.password)
else:
del data.password
await UserDao.update(dict(id=pk), data.dict())
# todo 1. 先前有的角色,这次更新成没有 2. 先前没有的角色 这次更新成有, 3. 只更新了状态
roles = await has_roles(pk)
# 2. 将先有的数据标记 删除
[
await UserRoleDao.update(dict(rid=role["id"], uid=pk), dict(status=9))
for role in roles
]
# 2. 新增次此更新的数据
await UserRoleDao.inserts(
[dict(role.dict(), uid=pk, status=role.status) for role in rids]
)
return dict()
@staticmethod
async def change_current_role(uid, rid):
"""用户切换角色"""
# 1.将用户id 未删除角色状态置为正常 1 除切换角色id
await UserRoleDao.update(
dict(uid=uid, rid__not=rid, status__not=9), dict(status=1)
)
# 2.将用户id 角色id 和当前角色匹配的数据置为选中
res = await UserRoleDao.update(
dict(uid=uid, rid=rid, status__not=9), dict(status=5)
)
if res == 0:
return dict(code=400, msg=f"角色不存在{res}")
return dict()
service = UserService()