libushang 8 månader sedan
förälder
incheckning
89f50bd856
8 ändrade filer med 97 tillägg och 60 borttagningar
  1. 4 2
      common/security.py
  2. 10 2
      demo.py
  3. 5 1
      main.py
  4. 1 1
      routers/prod_api/__init__.py
  5. 4 3
      routers/prod_api/auth.py
  6. 70 51
      routers/prod_api/system/user/__init__.py
  7. BIN
      static/favicon.ico
  8. 3 0
      utils/__init__.py

+ 4 - 2
common/security.py

@@ -7,13 +7,14 @@ from sqlalchemy.orm import Session
 from models.base import AppInfo
 from exceptions import TokenException
 from config import settings
+from extensions import logger
 
 # https://fastapi.tiangolo.com/tutorial/request-forms/
 # https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/
 
 pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
 
-def valid_access_token(Authorization: str = Header(..., alias="Authorization")):
+def valid_access_token(Authorization: str = Header(..., alias="Authorization")) -> int:
     access_token = Authorization.removeprefix("Bearer ") 
     
     token_exception = TokenException()
@@ -21,10 +22,11 @@ def valid_access_token(Authorization: str = Header(..., alias="Authorization")):
     try:
         payload = jwt.decode(access_token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
         user_id: str = payload.get("sub")
+        logger.info('sub user_id: {}', user_id)
     except Exception:
         raise token_exception
     
-    return user_id
+    return int(user_id)
 
 def verify_secret(plain_secret, hashed_secret):
     return pwd_context.verify(plain_secret, hashed_secret)

+ 10 - 2
demo.py

@@ -1,4 +1,12 @@
-from common.security import get_secret_hash
+from common.security import *
+from datetime import timedelta
 
-print(get_secret_hash('byo'))
+# print(get_secret_hash('byo'))
 
+user_id = "1"
+access_token_expires = timedelta(days= 3650)
+access_token = create_access_token(
+    data={"sub": user_id}, expires_delta = access_token_expires
+)
+print(access_token)
+# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoyMDM5Njk2ODMzfQ.Rhd38oo_S1odjg0xnT4n31cCWCAAPXGb8y_V2XcgqzQ

+ 5 - 1
main.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 from fastapi import FastAPI, Request #, Response,HTTPException
-from fastapi.responses import PlainTextResponse, JSONResponse, RedirectResponse
+from fastapi.responses import PlainTextResponse, JSONResponse, RedirectResponse, FileResponse
 from fastapi.exceptions import RequestValidationError
 from fastapi.middleware.cors import CORSMiddleware
 from starlette.middleware.sessions import SessionMiddleware
@@ -21,6 +21,10 @@ app.include_router(prod_api.router, prefix="")
 async def main():
     return "应急后端接口9988"
 
+@app.get("/favicon.ico", response_class=FileResponse)
+async def favicon():
+    return FileResponse("./static/favicon.ico")
+
 app.add_middleware(SessionMiddleware, secret_key='MM-ZHCS-YJ-API', max_age=36000 * 24)
 app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_credentials=False,allow_methods=['*'],allow_headers=['*'])
 

+ 1 - 1
routers/prod_api/__init__.py

@@ -10,5 +10,5 @@ router = APIRouter()
 
 router.include_router(auth.router, prefix="/auth")
 
-router.include_router(system.router, prefix="/system")#, dependencies=[Depends(valid_access_token)])
+router.include_router(system.router, prefix="/system", dependencies=[Depends(valid_access_token)])
 

+ 4 - 3
routers/prod_api/auth.py

@@ -152,9 +152,10 @@ async def login(
     redis_set_with_time(redis_login_key, str(0), 1)
     
     '''
+    user_id = str(row.user_id)
 
     auth = {
-        "user_id": str(row.user_id),
+        "user_id": user_id,
         "user_name": row.user_name,  
         "nick_name": row.nick_name,
         "is_yzy_user": "0"
@@ -172,12 +173,12 @@ async def login(
 
     access_token_expires = timedelta(seconds = 7200)
     access_token = security.create_access_token(
-        data={"sub": clientId}, expires_delta = access_token_expires
+        data={"sub": user_id}, expires_delta = access_token_expires
     )
 
     refresh_token_expires = timedelta(seconds = 7200)
     refresh_token = security.create_access_token(
-        data={"sub": clientId}, expires_delta = refresh_token_expires
+        data={"sub": user_id}, expires_delta = refresh_token_expires
     )
 
     return {

+ 70 - 51
routers/prod_api/system/user/__init__.py

@@ -5,71 +5,90 @@ from fastapi import APIRouter, Request, Depends
 from database import get_db
 from sqlalchemy.orm import Session
 from models import *
-import json
-from common.auth_user import *
+from utils import *
+from common.security import valid_access_token
 
 router = APIRouter()
 
 @router.get('/getInfo')
-async def getInfo(request: Request,db: Session = Depends(get_db), user: AuthUser = Depends(get_auth_user)):
+async def getInfo(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
+    # 用户信息
+    info = db.query(SysUser).filter(SysUser.user_id == user_id).first()
+    
+    # 部门信息
+    dept_name = ""
+    dept_info = db.query(SysDept).filter(SysDept.dept_id == info.dept_id).first()
+    if dept_name is not None:
+        dept_name = dept_info.dept_name
+    
+    # 角色信息
+    roles = []
+    role_ids = db.query(SysUserRole).filter(SysUserRole.user_id == user_id).all()
+    for role in role_ids:
+        role_info = db.query(SysRole).filter(SysRole.role_id == role.role_id).first()
+        roles.append(
+            {
+                "roleId": role_info.role_id,
+                "roleName": role_info.role_name,
+                "roleKey": role_info.role_key,
+                "roleSort": role_info.role_sort,
+                "dataScope": role_info.data_scope,
+                "menuCheckStrictly": role_info.menu_check_strictly,
+                "deptCheckStrictly": role_info.dept_check_strictly,
+                "status": role_info.status,
+                "remark": role_info.remark,
+                "createTime": get_datetime_str(role_info.create_time),
+                "flag": False,
+                "superAdmin": True
+            }
+        )
+
+    role_keys = [
+        n['roleKey']
+        for n in roles
+    ]
+
     return {
-    "code": 200,
-    "msg": "操作成功",
-    "data": {
-        "user": {
-            "userId": 1,
-            "tenantId": "000000",
-            "deptId": 103,
-            "userName": "admin",
-            "nickName": "疯狂的狮子Li",
-            "userType": "sys_user",
-            "email": "crazyLionLi@163.com",
-            "phonenumber": "15888888888",
-            "sex": "1",
-            "avatar": "http://43.138.9.96:9000/ruoyi/2024/08/07/ecee69404ef2416c9505a4d8803096a1.jpeg",
-            "status": "0",
-            "loginIp": "223.74.44.187",
-            "loginDate": "2024-08-07 21:22:25",
-            "remark": "管理员",
-            "createTime": "2024-05-20 13:16:22",
-            "deptName": "研发部门",
-            "roles": [
-                {
-                    "roleId": 1,
-                    "roleName": "超级管理员",
-                    "roleKey": "superadmin",
-                    "roleSort": 1,
-                    "dataScope": "1",
-                    "menuCheckStrictly": None,
-                    "deptCheckStrictly": None,
-                    "status": "0",
-                    "remark": None,
-                    "createTime": None,
-                    "flag": False,
-                    "superAdmin": True
-                }
+        "code": 200,
+        "msg": "操作成功",
+        "data": {
+            "user": {
+                "userId": info.user_id,
+                "tenantId": info.tenant_id,
+                "deptId": info.dept_id,
+                "userName": info.user_name,
+                "nickName": info.nick_name,
+                "userType": info.user_type,
+                "email": info.email,
+                "phonenumber": info.phonenumber,
+                "sex": info.sex,
+                "avatar": info.avatar,
+                "status": info.status,
+                "loginIp": info.login_ip,
+                "loginDate": get_datetime_str(info.login_date),
+                "remark": info.remark,
+                "createTime": get_datetime_str(info.create_time),
+                "deptName": dept_name,
+                "roles": roles,
+                "roleIds": None,
+                "postIds": None,
+                "roleId": None
+            },
+            "permissions": [
+                "*:*:*"
             ],
-            "roleIds": None,
-            "postIds": None,
-            "roleId": None
-        },
-        "permissions": [
-            "*:*:*"
-        ],
-        "roles": [
-            "superadmin"
-        ]
-    }
+            "roles": role_keys
+        }
 }
 
 
 @router.get('/deptTree')
-async def deptTree(request: Request,db: Session = Depends(get_db), user: AuthUser = Depends(get_auth_user)):
+async def deptTree(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
     pass
 
 
 @router.get('/list')
-async def userlist(request: Request,db: Session = Depends(get_db), user: AuthUser = Depends(get_auth_user)):
+async def userlist(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
     pass
 
 

BIN
static/favicon.ico


+ 3 - 0
utils/__init__.py

@@ -54,6 +54,9 @@ def from_timestamp2(timestamp: int):
         dt = time.strftime("%Y-%m-%d %H:%M", time_local)
         return dt
 
+def get_datetime_str(val: datetime) -> str:
+    return val.strftime("%Y-%m-%d %H:%M:%S")
+    
 
 def null2int(val):
     if val is None: