Skip to content

Commit 5ce6150

Browse files
committed
[feat]: 组织管理基本功能
1 parent 7c8a3b4 commit 5ce6150

File tree

3 files changed

+81
-5
lines changed

3 files changed

+81
-5
lines changed

app/api/v1/endpoints/group.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
from app.utils.get_db import get_db
77
from app.utils.auth import get_current_user
8-
from app.curd.group import crud_create, crud_apply_to_enter, crud_get_applications, crud_reply_to_enter, crud_modify_basic_info, crud_modify_admin_list, crud_remove_member, crud_leave_group
9-
from app.schemas.group import ApplyToEnter, LeaveGroup
8+
from app.curd.group import crud_create, crud_apply_to_enter, crud_get_applications, crud_reply_to_enter, crud_modify_basic_info, crud_modify_admin_list, crud_remove_member, crud_leave_group, crud_get_basic_info, crud_get_people_info, crud_get_my_level
9+
from app.schemas.group import ApplyToEnter, LeaveGroup, GetBasicInfo
1010

1111
router = APIRouter()
1212

@@ -55,7 +55,7 @@ async def modify_basic_info(group_id: int = Query(...), group_name: str | None =
5555
if group_avatar:
5656
os.makedirs("/lhcos-data/group-avatar", exist_ok=True)
5757
# 若之前存储了旧头像,则将其删除;若之前就没头像,则不做处理
58-
old_avatar = glob.glob(os.path.join("/lhcos-data/group-avatar", group_id + ".*")) # 基本名为group_id的文件列表,最多有一个元素
58+
old_avatar = glob.glob(os.path.join("/lhcos-data/group-avatar", f"{group_id}.*")) # 基本名为group_id的文件列表,最多有一个元素
5959
if old_avatar:
6060
os.remove(old_avatar[0])
6161
# 存储新头像,文件名为 {group_id}.上传文件的扩展名
@@ -83,4 +83,22 @@ async def leave_group(model: LeaveGroup, db: AsyncSession = Depends(get_db), use
8383
await crud_leave_group(group_id, user_id, db)
8484
return {"msg": "You successfully left the group"}
8585

86-
# 写返回个人文件树的后端时记得加 visible = True
86+
@router.get("/getBasicInfo", response_model=dict)
87+
async def get_basic_info(model: GetBasicInfo, db: AsyncSession = Depends(get_db)):
88+
group_id = model.group_id
89+
name, desc = crud_get_basic_info(group_id, db)
90+
find = glob.glob(os.path.join("/lhcos-data/group-avatar", f"{group_id}.*"))
91+
avatar = 'default.png' if not find else find[0].removeprefix("/lhcos-data/group-avatar\\\\")
92+
avatar = '/lhcos-data/group-avatar/' + avatar
93+
return {"avatar": avatar, "name": name, "desc": desc}
94+
95+
@router.get("/getPeopleInfo", response_model=dict)
96+
async def get_people_info(group_id: int = Query(...), db: AsyncSession = Depends(get_db)):
97+
leader, admins, members = await crud_get_people_info(group_id, db)
98+
return {"leader": leader, "admins": admins, "members": members}
99+
100+
@router.get("/getMyLevel", response_model=dict)
101+
async def get_my_level(group_id: int = Query(...), db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
102+
user_id = user.get("id")
103+
level = await crud_get_my_level(user_id, group_id, db)
104+
return {"level": level}

app/curd/group.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,59 @@ async def crud_leave_group(group_id: int, user_id: int, db: AsyncSession):
9292
# 不必先检查组织中是否有该成员,若没有则再执行一次delete也不会报错
9393
query = delete(user_group).where(user_group.c.group_id == group_id, user_group.c.user_id == user_id)
9494
await db.execute(query)
95-
await db.commit()
95+
await db.commit()
96+
97+
async def crud_get_basic_info(group_id: int, db: AsyncSession):
98+
query = select(Group.name, Group.description).where(Group.id == group_id)
99+
result = await db.execute(query)
100+
group = result.first()
101+
return group.name, group.description
102+
103+
async def crud_get_people_info(group_id: int, db: AsyncSession):
104+
# 创建者信息
105+
query = select(Group.leader).where(Group.id == group_id)
106+
result = await db.execute(query)
107+
leader_id = result.scalar_one_or_none()
108+
query = select(User).where(User.id == leader_id)
109+
result = await db.execute(query)
110+
user = result.scalar_one_or_none()
111+
leader = {"id": user.id, "name": user.username, "avatar": user.avatar}
112+
113+
# 管理者信息
114+
query = select(user_group.c.user_id).where(user_group.c.group_id == group_id, user_group.c.is_admin == True)
115+
result = await db.execute(query)
116+
admin_ids = result.scalars().all()
117+
query = select(User).where(User.id.in_(admin_ids))
118+
result = await db.execute(query)
119+
users = result.all()
120+
admins = [{"id": user.id, "name": user.username, "avatar": user.avatar} for user in users]
121+
122+
# 普通成员信息
123+
query = select(user_group.c.user_id).where(user_group.c.group_id == group_id, user_group.c.is_admin == False)
124+
result = await db.execute(query)
125+
member_ids = result.scalars.all()
126+
query = select(User).where(User.id.in_(member_ids))
127+
result = await db.execute(query)
128+
users = result.all()
129+
members = [{"id": user.id, "name": user.username, "avatar": user.avatar} for user in users]
130+
131+
return leader, admins, members
132+
133+
async def crud_get_my_level(user_id: int, group_id: int, db: AsyncSession):
134+
# 是否是创建者
135+
query = select(Group.leader).where(Group.id == group_id)
136+
result = await db.execute(query)
137+
leader_id = result.scalar_one_or_none()
138+
if user_id == leader_id:
139+
return 1
140+
query = select(user_group).where(user_group.c.user_id == user_id, user_group.c.group_id == group_id)
141+
result = await db.execute(query)
142+
relation = result.first()
143+
# 是否是管理员
144+
if relation and relation["is_admin"]:
145+
return 2
146+
# 是否是普通成员
147+
if relation: # and not relation["is_admin"]:
148+
return 3
149+
# 未加入组织
150+
return 4

app/schemas/group.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ class ApplyToEnter(BaseModel):
44
group_id: int
55

66
class LeaveGroup(BaseModel):
7+
group_id: int
8+
9+
class GetBasicInfo(BaseModel):
710
group_id: int

0 commit comments

Comments
 (0)