sso.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. # -*- coding: utf-8 -*-
  2. from fastapi import APIRouter, Depends, Request, Header, Form, Body
  3. from fastapi.responses import FileResponse, StreamingResponse
  4. from sqlalchemy.orm import Session
  5. from fastapi.responses import JSONResponse
  6. from database import get_db
  7. from utils import *
  8. from utils.vcode import *
  9. from utils.redis_util import *
  10. import base64
  11. from common.const import *
  12. from io import BytesIO
  13. from utils.StripTagsHTMLParser import *
  14. from common import security
  15. from datetime import timedelta
  16. from common.security import valid_access_token
  17. from common.auth_user import *
  18. from common import YzyApi
  19. from models import *
  20. from urllib.parse import quote
  21. import requests
  22. import jwt
  23. import traceback
  24. from common.enc import mpfun
  25. from common.db import db_event_management, db_user, db_area, db_emergency_plan, db_msg_center, db_yzy, db_czrz
  26. router = APIRouter()
  27. # 提供给数科使用的单点登录token
  28. @router.get('/token/create')
  29. def sso_token(request: Request,
  30. user_id: int = Depends(valid_access_token),
  31. db: Session = Depends(get_db)):
  32. sso_token_expires = timedelta(seconds = 3600 * 24)
  33. sso_token = security.create_access_token(
  34. data={"sub": user_id}, expires_delta = sso_token_expires
  35. )
  36. print('sso_token:', sso_token)
  37. return {
  38. "code": 200,
  39. "msg": "操作成功",
  40. "data": {
  41. "sso_token": sso_token
  42. }
  43. }
  44. # token校验
  45. @router.get('/token/valid')
  46. def sso_token(request: Request,
  47. sso_token: str,
  48. db: Session = Depends(get_db)):
  49. try:
  50. payload = jwt.decode(sso_token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
  51. # print(payload,payload.get("sub"))
  52. user_id: str = payload.get("sub")
  53. row = db.query(SysUser).filter(SysUser.user_id == int(user_id)).first()
  54. if row is None:
  55. return {
  56. "code": 500,
  57. "msg": "token异常"
  58. }
  59. # 角色信息
  60. roles = []
  61. role_ids = db.query(SysUserRole).filter(SysUserRole.user_id == int(user_id)).all()
  62. for role in role_ids:
  63. role_info = db.query(SysRole).filter(SysRole.role_id == role.role_id).first()
  64. roles.append(
  65. {
  66. "roleId": role_info.role_id,
  67. "roleName": role_info.role_name,
  68. "roleKey": role_info.role_key
  69. }
  70. )
  71. role_keys = [
  72. n['roleKey']
  73. for n in roles
  74. ]
  75. data = {
  76. "userId": row.user_id,
  77. "userName": mpfun.dec_data(row.user_name),
  78. "nickName": row.nick_name,
  79. "roles": role_keys
  80. }
  81. return {
  82. "code": 200,
  83. "msg": "操作成功",
  84. "data": data
  85. }
  86. except Exception:
  87. traceback.print_exc()
  88. return {
  89. "code": 500,
  90. "msg": "token异常"
  91. }
  92. @router.post('/event/create')
  93. async def create_event(
  94. request: Request,
  95. sso_token: str,
  96. user_id: int = Depends(valid_access_token),
  97. db: Session = Depends(get_db),
  98. body = Depends(remove_xss_json)):
  99. user_id = 1
  100. try:
  101. payload = jwt.decode(sso_token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
  102. user_id: str = payload.get("sub")
  103. row = db.query(SysUser).filter(SysUser.user_id == int(user_id)).first()
  104. if row is None:
  105. return {
  106. "code": 500,
  107. "msg": "token异常"
  108. }
  109. eventId = db_event_management.get_next_event_id(db)
  110. region_code = db_area.get_region_code_by_gps(db, body['longitude'], body['latitude'])
  111. event_base = EventBase(
  112. event_title = body['event_title'],
  113. event_type = body['event_type'], # 0:自然灾害 1:事故灾害 2:公共卫生事件 3:社会安全事件
  114. event_time = body['event_time'],
  115. report_time = body['report_time'],
  116. address = body['address'],
  117. deaths = None,
  118. injuries = None,
  119. missing = None,
  120. casualties = 0,
  121. event_status = '0',
  122. event_code = eventId,
  123. recorded_by = user_id,
  124. region_code = region_code,
  125. create_time = datetime.now(),
  126. del_flag = '0',
  127. )
  128. db.add(event_base)
  129. db.commit()
  130. db.refresh(event_base)
  131. # 事件跟踪表
  132. event_tracking = EventTracking()
  133. event_tracking.event_id = event_base.id
  134. event_tracking.event_status = event_base.event_status
  135. event_tracking.event_level = event_base.event_level
  136. event_tracking.tracking_time = datetime.now()
  137. event_tracking.recorded_by = user_id
  138. event_tracking.del_flag = "0"
  139. db.add(event_tracking)
  140. db.commit()
  141. try:
  142. user_info = db_user.get_user_info(db, user_id)
  143. db_czrz.log_username(db, user_id, mpfun.dec_data(user_info.user_name), user_info.nick_name, "应急一张图", "创建事件", request.client.host)
  144. except:
  145. traceback.print_exc()
  146. return {
  147. "code": 0,
  148. "msg": "新建事件成功",
  149. "data": {
  150. "eventId": eventId,
  151. "url": f"https://yjdp.mmsyjj.cn:8086/yjdp/#/emergencyCommandMap?event_id={eventId}"
  152. }
  153. }
  154. except Exception as e:
  155. traceback.print_exc()
  156. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")