From e5e2be29cfc033c976558a4d0b5fa73426818b90 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期三, 26 二月 2025 11:30:48 +0800 Subject: [PATCH] 增加系统信息修改 --- app/models/__init__.py | 1 app/init_config/init_run_data.py | 3 app/api/system.py | 35 ++++++++ app/service/system.py | 54 +++++++++++++ app/static/logo.png | 0 app/config/const.py | 7 + app/models/system.py | 34 ++++++++ main.py | 2 app/api/v2/chat.py | 2 app/service/v2/initialize_data.py | 39 +++++++++ app/config/env_conf/system.yaml | 3 app/service/v2/app_driver/chat_data.py | 6 12 files changed, 179 insertions(+), 7 deletions(-) diff --git a/app/api/system.py b/app/api/system.py new file mode 100644 index 0000000..c9f237b --- /dev/null +++ b/app/api/system.py @@ -0,0 +1,35 @@ +# coding:utf-8 + +from fastapi import APIRouter, Depends, UploadFile, File +from app.api import Response, get_current_user +from app.models.base_model import get_db +from app.models.role_model import RoleData, RoleModel +from app.models.system import SystemData +from app.models.user_model import UserModel +from app.service.system import services_get_system_data, services_update_system_data, service_upload_logo_image + +system_router = APIRouter() + + +@system_router.get("/info", response_model=Response) +async def api_get_system_data(current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): + + data = await services_get_system_data(db) + return Response(code=200, msg="successfully", data=data) + + +@system_router.put("/info", response_model=Response) +async def api_update_system_data(system: SystemData, u: UserModel = Depends(get_current_user), db=Depends(get_db)): + + data = await services_update_system_data(db, system.title, system.desc, system.logo) + if not data: + return Response(code=500, msg="failed", data=data) + return Response(code=200, msg="successfully", data=data) + + +@system_router.post("/upload", response_model=Response) +async def api_upload_logo_image(file: UploadFile = File(...)): + file_name = await service_upload_logo_image(file) + if not file_name: + return Response(code=500, msg="failed", data={"logo": ""}) + return Response(code=200, msg="successfully", data={"logo": file_name}) diff --git a/app/api/v2/chat.py b/app/api/v2/chat.py index 79bbe9c..a09ab43 100644 --- a/app/api/v2/chat.py +++ b/app/api/v2/chat.py @@ -99,7 +99,7 @@ data = await service_chat_parameters(db, chatId, current_user.id) if not data: status_code = http_400 - data = "{}" + data = json.dumps({"code": http_400}) return Response(data, media_type="application/json", status_code=status_code) diff --git a/app/config/const.py b/app/config/const.py index 8a588e7..a5d31c5 100644 --- a/app/config/const.py +++ b/app/config/const.py @@ -14,6 +14,9 @@ ### --------- file path------------------ ENV_CONF_PATH = "app/config/env_conf" APP_SERVICE_PATH = "app/service/" +APP_STATIC_PATH = "app/static" + + ### -----------app register -------------- RAGFLOW = "ragflow_app" @@ -106,3 +109,7 @@ TMP_DICT = {chat_server: RAGFLOW, workflow_server: DIFY} + + +###-------------------------------system------------------------------------------------- +SYSTEM_ID = 1 diff --git a/app/config/env_conf/system.yaml b/app/config/env_conf/system.yaml new file mode 100644 index 0000000..4b2d6da --- /dev/null +++ b/app/config/env_conf/system.yaml @@ -0,0 +1,3 @@ +smart_system: + title: SmartAI澶фā鍨嬪钩鍙� + desc: SmartAI澶фā鍨嬪钩鍙� diff --git a/app/init_config/init_run_data.py b/app/init_config/init_run_data.py index 92d942e..208433f 100644 --- a/app/init_config/init_run_data.py +++ b/app/init_config/init_run_data.py @@ -1,6 +1,6 @@ from app.models.base_model import SessionLocal from app.service.v2.initialize_data import dialog_menu_sync, default_group_sync, default_role_sync, \ - basic_agent_sync, admin_account_sync + basic_agent_sync, admin_account_sync, sync_rg_api_token async def sync_default_data(): @@ -12,6 +12,7 @@ # await app_register_sync(db) # 娉ㄥ唽鐨勫簲鐢� await basic_agent_sync(db) # 寮�鍙戠殑agent await admin_account_sync(db) # + await sync_rg_api_token(db) # except Exception as e: print(e) diff --git a/app/models/__init__.py b/app/models/__init__.py index 9f8a749..2f90c68 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -17,6 +17,7 @@ from .menu_model import * from .label_model import * from .v2.session_model import * +from .system import * # 鑾峰彇褰撳墠鏃跺尯鐨勬椂闂� diff --git a/app/models/system.py b/app/models/system.py new file mode 100644 index 0000000..28dca04 --- /dev/null +++ b/app/models/system.py @@ -0,0 +1,34 @@ +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel +from sqlalchemy import Column, Integer, String, DateTime, Table, ForeignKey, UniqueConstraint +from app.models.base_model import Base + + + +class SystemDataModel(Base): + __tablename__ = 'system_data' + id = Column(Integer, primary_key=True, index=True) + title = Column(String(255)) + desc = Column(String(1000)) + created_at = Column(DateTime, default=datetime.now()) + updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now()) + + + def to_dict(self): + return { + # 'id': self.id, + 'title': self.title, + 'desc': self.desc, + } + + def __repr__(self): + return '<Role name:%r description:%r iconCls:%r seq:%r>\n' \ + % (self.NAME, self.DESCRIPTION, self.ICONCLS, self.SEQ) + + +class SystemData(BaseModel): + title: str + desc: str + logo: str diff --git a/app/service/system.py b/app/service/system.py new file mode 100644 index 0000000..23309f9 --- /dev/null +++ b/app/service/system.py @@ -0,0 +1,54 @@ +import os +import shutil +import uuid +from datetime import datetime + +import yaml +from fastapi import UploadFile + +from Log import logger +from app.api import pwd_context +from app.config.const import SYSTEM_ID, ENV_CONF_PATH, APP_STATIC_PATH +from app.models.system import SystemDataModel + + +async def services_get_system_data(db): + system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first() + if not system: + with open(os.path.join(ENV_CONF_PATH, "system.yaml"), 'r', encoding='utf-8') as file: + # 鍔犺浇JSON鏁版嵁 + config = yaml.safe_load(file) + system = SystemDataModel(id=SYSTEM_ID, title=config["smart_system"]["title"], desc=config["smart_system"]["desc"]) + db.add(system) + db.commit() + db.refresh(system) + return system.to_dict() + + +async def services_update_system_data(db, title, desc, logo): + try: + shutil.move(os.path.join(APP_STATIC_PATH, logo), os.path.join(APP_STATIC_PATH, "logo.png")) + system = db.query(SystemDataModel).filter_by(id=SYSTEM_ID).first() + system.title = title + system.desc = desc + system.updated_at = datetime.now() + db.commit() + db.refresh(system) + return system.to_dict() + except Exception as e: + logger.error(e) + return {} + + +async def service_upload_logo_image(file: UploadFile): + file_name = str(uuid.uuid4()) + try: + save_path = os.path.join(APP_STATIC_PATH, file_name) + # 灏嗕笂浼犵殑鏂囦欢淇濆瓨鍒版湰鍦� + with open(save_path, "wb") as buffer: + shutil.copyfileobj(file.file, buffer) + file.file.close() + return file_name + except Exception as e: + logger.error(f"淇濆瓨澶辫触: {str(e)}") + return "" diff --git a/app/service/v2/app_driver/chat_data.py b/app/service/v2/app_driver/chat_data.py index 56c1785..d642748 100644 --- a/app/service/v2/app_driver/chat_data.py +++ b/app/service/v2/app_driver/chat_data.py @@ -90,11 +90,11 @@ # ans = await chat.chat_parameters(url, params, headers) # print(ans) - ping_url = "http://192.168.20.116:11080/v1/system/version" - ping_url = "http://smartai.com:8294/v1/llm/list" + ping_url = "http://192.168.20.116:11080/v1/user/info" + # ping_url = "http://smartai.com:8294/v1/llm/list" # ping_url = "http://192.168.20.119:13002/console/api/workspaces" user_token = "eyJhbG|ciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNjEzNzdiYzctZTViYy00YjhiLTgxYTYtNWZkOTVhODVlMmE4IiwiZXhwIjoxNzM5MjU3Njk1LCJpc3MiOiJTRUxGX0hPU1RFRCIsInN1YiI6IkNvbnNvbGUgQVBJIFBhc3Nwb3J0In0.w7xQrepd1dYR4iPXcbuthIZjdm45bTJFbolOM_SE9aQ" - user_token = "IjNmZTA4NmM2ZjJjMjExZWY4ZTc2MDI0MmFjMTIwMDA2Ig.Z7yNLg.XooARY7YHv-Zo1qLoXwCuDe8J0k" + user_token = "IjU4OTM5M2UyZjMyNzExZWZhZmVjMDI0MmFjMTIwMDA2Ig.Z702yg.Pmyy58wg-YBU5t50mHuqvwTDyjc" # token = "Bearer {}" token = "{}" res = await chat.chat_ping(ping_url, {}, await chat.get_chat_headers(token.format(user_token))) diff --git a/app/service/v2/initialize_data.py b/app/service/v2/initialize_data.py index d9e643b..1f05cab 100644 --- a/app/service/v2/initialize_data.py +++ b/app/service/v2/initialize_data.py @@ -7,15 +7,18 @@ from Log import logger +from app.config.agent_base_url import RG_APP_TOKEN_LIST, RG_APP_NEW_TOKEN # from app.api import pwd_context -from app.config.const import DIFY, ENV_CONF_PATH, RAGFLOW, smart_server, chat_server, workflow_server, TMP_DICT +from app.config.const import DIFY, ENV_CONF_PATH, RAGFLOW, smart_server, chat_server, workflow_server, TMP_DICT, \ + rg_api_token from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel, DialogModel, UserModel, UserAppModel, \ - cipher_suite, UserTokenModel + cipher_suite, UserTokenModel, ApiTokenModel from app.service.auth import UserAppDao from app.service.bisheng import BishengService from app.service.difyService import DifyService from app.service.ragflow import RagflowService from app.service.service_token import get_new_token +from app.service.v2.app_driver.chat_data import ChatBaseApply from app.service.v2.app_register import AppRegisterDao from app.config.config import settings from app.utils.password_handle import generate_password, password_encrypted, password_decrypted @@ -318,4 +321,36 @@ # await user_app_dao.update_and_insert_data(v.get("name"), user_model.encrypted_password(v.get("pwd")), v.get("email"), u_id, str(v.get("id")), k) except Exception as e: print(e) + db.rollback() + + +async def sync_rg_api_token(db): + token = "" + try: + app_token = db.query(ApiTokenModel).filter_by(app_id=rg_api_token).first() + if app_token: + print("rg_api_token: 宸茬粡瀛樺湪锛�") + return + user_token = db.query(UserTokenModel).filter(UserTokenModel.id == chat_server).first() + chat = ChatBaseApply() + token_list_url = f"{settings.fwr_base_url}{RG_APP_TOKEN_LIST}" + token_list = await chat.chat_get(token_list_url, {}, await chat.get_chat_headers(user_token.access_token)) + if token_list and token_list.get("code") == 0: + if len(token_list.get("data", [])) == 0: + print("rg_api_token: 鍒涘缓鎴愬姛锛�") + new_token_url = f"{settings.fwr_base_url}{RG_APP_NEW_TOKEN}" + new_token = await chat.chat_post(new_token_url, {}, await chat.get_chat_headers(user_token.access_token)) + if new_token and new_token.get("code") == 0: + token = new_token.get("data", {}).get("token") + else: + token = token_list.get("data")[0].get("token") + print("rg_api_token: 宸叉湁token锛�") + if token: + + db.add(ApiTokenModel(id=rg_api_token, app_id=rg_api_token, type="platform", token=token)) + db.commit() + print("rg_api_token: 鏇存柊鎴愬姛锛�") + + except Exception as e: + print(e) db.rollback() \ No newline at end of file diff --git a/app/static/logo.png b/app/static/logo.png new file mode 100644 index 0000000..ba66192 --- /dev/null +++ b/app/static/logo.png Binary files differ diff --git a/main.py b/main.py index 339fb25..20cd8fe 100644 --- a/main.py +++ b/main.py @@ -15,6 +15,7 @@ from app.api.label import label_router from app.api.llm import llm_router from app.api.organization import dept_router +from app.api.system import system_router from app.api.v2.chat import chat_router_v2 from app.api.v2.public_api import public_api from app.api.report import router as report_router @@ -93,6 +94,7 @@ app.include_router(label_router, prefix='/api/label', tags=["label"]) app.include_router(public_api, prefix='/v1/api', tags=["public_api"]) app.include_router(chat_router_v2, prefix='/api/v1', tags=["chat1"]) +app.include_router(system_router, prefix='/api/system', tags=["system"]) app.mount("/static", StaticFiles(directory="app/images"), name="static") if __name__ == "__main__": -- Gitblit v1.8.0