liuyuqi-dellpc 1 year ago
parent
commit
5d81827854

+ 15 - 0
.env

@@ -56,6 +56,21 @@ POSTGRES_PASSWORD=123456
 
 SENTRY_DSN=http://localhost
 
+# Flower
+FLOWER_BASIC_AUTH=admin:qwe123
+
+# Postgres
+POSTGRES_SERVER=49.235.242.224
+POSTGRES_USER=root
+POSTGRES_PASSWORD=wzx@940516
+POSTGRES_DB=DWDB
+
+# PgAdmin
+PGADMIN_LISTEN_PORT=5050
+PGADMIN_DEFAULT_EMAIL=admin
+PGADMIN_DEFAULT_PASSWORD=qwe123
+
+
 # Configure these with your own Docker registry images
 DOCKER_IMAGE_BACKEND=backend
 DOCKER_IMAGE_FRONTEND=frontend

+ 1 - 1
backend/apps/__init__.py

@@ -37,5 +37,5 @@ def create_app(config_name="dev") -> FastAPI:
     register_routes(app=fastapp)
     
     fastapp.mount("/static", StaticFiles(directory="./static"), name="static")
-    
+    fastapp.mount('/', socket_app)
     return fastapp

+ 9 - 0
backend/apps/schemas/__init__.py

@@ -0,0 +1,9 @@
+# from .msg import Msg,Email
+# from .token import Token, TokenPayload
+# from .user import *
+# from .reponse import Response
+# from .role import *
+# from .system.menu import *
+# from .system.dict import *
+# from .system.department import *
+

+ 40 - 0
backend/apps/schemas/user.py

@@ -0,0 +1,40 @@
+import datetime
+
+from typing import Optional, List
+from pydantic import BaseModel
+
+# Shared properties
+class UserBase(BaseModel):
+    username: str
+    nickname: str
+    sex: str
+    identity_card: str
+    phone: Optional[str] = None
+    # address: Optional[str] = None
+    work_start: Optional[str] = datetime.datetime.today()
+    status: Optional[str] = None
+    hashed_password: str = get_password_hash(settings.INIT_PASSWORD)
+    # avatar: Optional[str] = None
+    introduction: Optional[str] = None
+    is_active: Optional[bool] = True
+
+
+# Properties to receive via API on creation
+class UserCreate(UserBase):
+    deptId: Optional[int] = None
+    postIds: List[int] = []
+    roleIds: List[int] = []
+
+
+# Properties to receive via API on update
+class UserUpdate(UserBase):
+    id: Optional[int] = None
+    deptId: Optional[int] = None
+    postIds: List[int] = []
+    roleIds: List[int] = []
+
+
+# reset password
+class UserPWReset(BaseModel):
+    user_id: int
+    password: str

+ 9 - 0
backend/apps/websocket/__init__.py

@@ -0,0 +1,9 @@
+import socketio
+
+from .server import ServerNamespace
+
+sio = socketio.AsyncServer(async_mode='asgi',cors_allowed_origins='*')
+sio.register_namespace(ServerNamespace('/server',))
+
+socket_app = socketio.ASGIApp(sio)
+

+ 89 - 0
backend/apps/websocket/server.py

@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+import socketio
+import psutil
+import threading
+from app.extensions.utils import round_float
+
+lock = threading.Lock()
+
+background_task_started = False
+client_connecting = 0
+
+
+class ServerNamespace(socketio.AsyncNamespace):
+
+    async def on_connect(self, sid, environ):
+        print(f"{sid} is connected !")
+        global background_task_started, client_connecting
+        lock.acquire()
+        client_connecting = client_connecting + 1
+        lock.release()
+        if not background_task_started:
+            self.server.start_background_task(self.background_task)
+            background_task_started = True
+        # self.emit('my_response', {'data': 'Connected', 'count': 0}, room=sid)
+
+    async def on_disconnect(self, sid):
+        print(f"{sid} is disconnected !")
+        global background_task_started,client_connecting
+        lock.acquire()
+        client_connecting = client_connecting - 1
+        lock.release()
+        if client_connecting == 0:
+            background_task_started = False
+
+
+    async def on_disconnect_request(self, sid):
+        await self.on_disconnect(sid)
+
+    async def on_client_message(self, sid, data):
+        print(data)
+
+    async def on_my_event(self, sid, data):
+        await self.emit('my_response', data)
+
+    async def on_my_room_event(self, sid, message):
+        await self.emit('my_response', {'data': message['data']}, room=message['room'])
+
+    async def on_my_broadcast_event(self, sid, message):
+        await self.emit('my_response', {'data': message['data']})
+
+    async def on_join(self, sid, message):
+        await self.enter_room(sid, message['room'])
+        await self.emit('my_response', {'data': 'Entered room: ' + message['room']}, room=sid)
+
+    async def on_leave(self, sid, message):
+        await self.leave_room(sid, message['room'])
+        await self.emit('my_response', {'data': 'Left room: ' + message['room']}, room=sid)
+
+    async def on_close(self, sid, message):
+        await self.emit('my_response', {'data': 'Room ' + message['room'] + ' is closing.'}, room=message['room'])
+        await self.close_room(message['room'])
+
+    async def background_task(self):
+        global background_task_started
+        while background_task_started:
+            sys_info = await self.get_sys_info()
+            await self.emit('monitor_server', sys_info)
+            await self.server.sleep(1.5)
+
+    async def get_sys_info(self) -> dict:
+        """ 获取系统信息 """
+        sys_info = {}
+        cpu_info = {
+            'cpuNum': psutil.cpu_count(logical=False),  # 物理核数
+            'used': psutil.cpu_percent(interval=0.1),  # cpu使用率
+            'pids': len(psutil.pids()),  # 进程数
+            'cpu_freq': psutil.cpu_freq().current,  # CPU频率
+            'boot_time': round_float(psutil.boot_time() / (60 * 60 * 60 * 24)),  # 系统启动时间
+        }
+        sys_info["cpu_info"] = cpu_info
+        memory_info = psutil.virtual_memory()
+        memory_info = {
+            "total": round_float(memory_info.total / (1024 * 1024 * 1024)),
+            "used": round_float(memory_info.used / (1024 * 1024 * 1024)),
+            "free": round_float(memory_info.free / (1024 * 1024 * 1024)),
+            "percent": memory_info.percent,
+        }
+        sys_info["memory_info"] = memory_info
+        return sys_info