Web: Display the icon of the currently used storage. (#2504)
Browse fileshttps://github.com/infiniflow/ragflow/issues/2503
### What problem does this PR solve?
_Briefly describe what this PR aims to solve. Include background context
that will help reviewers understand the purpose of the PR._
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
Before:
<img width="611" alt="image"
src="https://github.com/user-attachments/assets/02a3a1ee-7bfb-4fe0-9b15-11ced69cc8a3">
After:
<img width="796" alt="image"
src="https://github.com/user-attachments/assets/371136af-8d16-47aa-909b-26609d3ad60e">
<img width="557" alt="image"
src="https://github.com/user-attachments/assets/9268362f-2b6a-4ea1-9fe7-659f7292e5e1">
    	
        api/apps/system_app.py
    CHANGED
    
    | @@ -18,11 +18,12 @@ import json | |
| 18 | 
             
            from flask_login import login_required
         | 
| 19 |  | 
| 20 | 
             
            from api.db.services.knowledgebase_service import KnowledgebaseService
         | 
|  | |
| 21 | 
             
            from api.utils.api_utils import get_json_result
         | 
| 22 | 
             
            from api.versions import get_rag_version
         | 
| 23 | 
             
            from rag.settings import SVR_QUEUE_NAME
         | 
| 24 | 
             
            from rag.utils.es_conn import ELASTICSEARCH
         | 
| 25 | 
            -
            from rag.utils.storage_factory import STORAGE_IMPL
         | 
| 26 | 
             
            from timeit import default_timer as timer
         | 
| 27 |  | 
| 28 | 
             
            from rag.utils.redis_conn import REDIS_CONN
         | 
| @@ -48,16 +49,16 @@ def status(): | |
| 48 | 
             
                st = timer()
         | 
| 49 | 
             
                try:
         | 
| 50 | 
             
                    STORAGE_IMPL.health()
         | 
| 51 | 
            -
                    res[" | 
| 52 | 
             
                except Exception as e:
         | 
| 53 | 
            -
                    res[" | 
| 54 |  | 
| 55 | 
             
                st = timer()
         | 
| 56 | 
             
                try:
         | 
| 57 | 
             
                    KnowledgebaseService.get_by_id("x")
         | 
| 58 | 
            -
                    res[" | 
| 59 | 
             
                except Exception as e:
         | 
| 60 | 
            -
                    res[" | 
| 61 |  | 
| 62 | 
             
                st = timer()
         | 
| 63 | 
             
                try:
         | 
|  | |
| 18 | 
             
            from flask_login import login_required
         | 
| 19 |  | 
| 20 | 
             
            from api.db.services.knowledgebase_service import KnowledgebaseService
         | 
| 21 | 
            +
            from api.settings import DATABASE_TYPE
         | 
| 22 | 
             
            from api.utils.api_utils import get_json_result
         | 
| 23 | 
             
            from api.versions import get_rag_version
         | 
| 24 | 
             
            from rag.settings import SVR_QUEUE_NAME
         | 
| 25 | 
             
            from rag.utils.es_conn import ELASTICSEARCH
         | 
| 26 | 
            +
            from rag.utils.storage_factory import STORAGE_IMPL, STORAGE_IMPL_TYPE
         | 
| 27 | 
             
            from timeit import default_timer as timer
         | 
| 28 |  | 
| 29 | 
             
            from rag.utils.redis_conn import REDIS_CONN
         | 
|  | |
| 49 | 
             
                st = timer()
         | 
| 50 | 
             
                try:
         | 
| 51 | 
             
                    STORAGE_IMPL.health()
         | 
| 52 | 
            +
                    res["storage"] = {"storage": STORAGE_IMPL_TYPE.lower(), "status": "green", "elapsed": "{:.1f}".format((timer() - st)*1000.)}
         | 
| 53 | 
             
                except Exception as e:
         | 
| 54 | 
            +
                    res["storage"] = {"storage": STORAGE_IMPL_TYPE.lower(), "status": "red", "elapsed": "{:.1f}".format((timer() - st)*1000.), "error": str(e)}
         | 
| 55 |  | 
| 56 | 
             
                st = timer()
         | 
| 57 | 
             
                try:
         | 
| 58 | 
             
                    KnowledgebaseService.get_by_id("x")
         | 
| 59 | 
            +
                    res["database"] = {"database": DATABASE_TYPE.lower(), "status": "green", "elapsed": "{:.1f}".format((timer() - st)*1000.)}
         | 
| 60 | 
             
                except Exception as e:
         | 
| 61 | 
            +
                    res["database"] = {"database": DATABASE_TYPE.lower(), "status": "red", "elapsed": "{:.1f}".format((timer() - st)*1000.), "error": str(e)}
         | 
| 62 |  | 
| 63 | 
             
                st = timer()
         | 
| 64 | 
             
                try:
         | 
    	
        rag/utils/storage_factory.py
    CHANGED
    
    | @@ -27,4 +27,5 @@ class StorageFactory: | |
| 27 | 
             
                    return cls.storage_mapping[storage]()
         | 
| 28 |  | 
| 29 |  | 
| 30 | 
            -
             | 
|  | 
|  | |
| 27 | 
             
                    return cls.storage_mapping[storage]()
         | 
| 28 |  | 
| 29 |  | 
| 30 | 
            +
            STORAGE_IMPL_TYPE = os.getenv('STORAGE_IMPL', 'MINIO')
         | 
| 31 | 
            +
            STORAGE_IMPL = StorageFactory.create(Storage[STORAGE_IMPL_TYPE])
         | 
    	
        web/src/assets/svg/database.svg
    ADDED
    
    |  | 
    	
        web/src/assets/svg/storage.svg
    ADDED
    
    |  | 
    	
        web/src/interfaces/database/user-setting.ts
    CHANGED
    
    | @@ -24,8 +24,8 @@ export type TaskExecutorElapsed = Record<string, number[]>; | |
| 24 |  | 
| 25 | 
             
            export interface ISystemStatus {
         | 
| 26 | 
             
              es: Es;
         | 
| 27 | 
            -
               | 
| 28 | 
            -
               | 
| 29 | 
             
              redis: Redis;
         | 
| 30 | 
             
              task_executor: {
         | 
| 31 | 
             
                error?: string;
         | 
| @@ -41,7 +41,13 @@ interface Redis { | |
| 41 | 
             
              pending: number;
         | 
| 42 | 
             
            }
         | 
| 43 |  | 
| 44 | 
            -
            export interface  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 45 | 
             
              status: string;
         | 
| 46 | 
             
              elapsed: number;
         | 
| 47 | 
             
              error: string;
         | 
|  | |
| 24 |  | 
| 25 | 
             
            export interface ISystemStatus {
         | 
| 26 | 
             
              es: Es;
         | 
| 27 | 
            +
              storage: Storage;
         | 
| 28 | 
            +
              database: Database;
         | 
| 29 | 
             
              redis: Redis;
         | 
| 30 | 
             
              task_executor: {
         | 
| 31 | 
             
                error?: string;
         | 
|  | |
| 41 | 
             
              pending: number;
         | 
| 42 | 
             
            }
         | 
| 43 |  | 
| 44 | 
            +
            export interface Storage {
         | 
| 45 | 
            +
              status: string;
         | 
| 46 | 
            +
              elapsed: number;
         | 
| 47 | 
            +
              error: string;
         | 
| 48 | 
            +
            }
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            export interface Database {
         | 
| 51 | 
             
              status: string;
         | 
| 52 | 
             
              elapsed: number;
         | 
| 53 | 
             
              error: string;
         | 
    	
        web/src/pages/user-setting/setting-system/index.tsx
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 | 
             
            import SvgIcon from '@/components/svg-icon';
         | 
| 2 | 
             
            import { useFetchSystemStatus } from '@/hooks/user-setting-hooks';
         | 
|  | |
| 3 | 
             
            import {
         | 
| 4 | 
             
              ISystemStatus,
         | 
| 5 | 
             
              TaskExecutorElapsed,
         | 
| @@ -24,12 +25,19 @@ enum Status { | |
| 24 |  | 
| 25 | 
             
            const TitleMap = {
         | 
| 26 | 
             
              es: 'Elasticsearch',
         | 
| 27 | 
            -
               | 
| 28 | 
             
              redis: 'Redis',
         | 
| 29 | 
            -
               | 
| 30 | 
             
              task_executor: 'Task Executor',
         | 
| 31 | 
             
            };
         | 
| 32 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 33 | 
             
            const SystemInfo = () => {
         | 
| 34 | 
             
              const {
         | 
| 35 | 
             
                systemStatus,
         | 
| @@ -56,7 +64,7 @@ const SystemInfo = () => { | |
| 56 | 
             
                                {key === 'task_executor' ? (
         | 
| 57 | 
             
                                  <img src="/logo.svg" alt="" width={26} />
         | 
| 58 | 
             
                                ) : (
         | 
| 59 | 
            -
                                  <SvgIcon name={key} width={26}></SvgIcon>
         | 
| 60 | 
             
                                )}
         | 
| 61 | 
             
                                <span className={styles.title}>
         | 
| 62 | 
             
                                  {TitleMap[key as keyof typeof TitleMap]}
         | 
|  | |
| 1 | 
             
            import SvgIcon from '@/components/svg-icon';
         | 
| 2 | 
             
            import { useFetchSystemStatus } from '@/hooks/user-setting-hooks';
         | 
| 3 | 
            +
            import { ISystemStatus, Storage } from '@/interfaces/database/userSetting';
         | 
| 4 | 
             
            import {
         | 
| 5 | 
             
              ISystemStatus,
         | 
| 6 | 
             
              TaskExecutorElapsed,
         | 
|  | |
| 25 |  | 
| 26 | 
             
            const TitleMap = {
         | 
| 27 | 
             
              es: 'Elasticsearch',
         | 
| 28 | 
            +
              storage: 'Object Storage',
         | 
| 29 | 
             
              redis: 'Redis',
         | 
| 30 | 
            +
              database: 'Database',
         | 
| 31 | 
             
              task_executor: 'Task Executor',
         | 
| 32 | 
             
            };
         | 
| 33 |  | 
| 34 | 
            +
            const IconMap = {
         | 
| 35 | 
            +
              es: 'es',
         | 
| 36 | 
            +
              storage: 'storage',
         | 
| 37 | 
            +
              redis: 'redis',
         | 
| 38 | 
            +
              database: 'database',
         | 
| 39 | 
            +
            };
         | 
| 40 | 
            +
             | 
| 41 | 
             
            const SystemInfo = () => {
         | 
| 42 | 
             
              const {
         | 
| 43 | 
             
                systemStatus,
         | 
|  | |
| 64 | 
             
                                {key === 'task_executor' ? (
         | 
| 65 | 
             
                                  <img src="/logo.svg" alt="" width={26} />
         | 
| 66 | 
             
                                ) : (
         | 
| 67 | 
            +
                                  <SvgIcon name={IconMap[key as keyof typeof IconMap]} width={26}></SvgIcon>
         | 
| 68 | 
             
                                )}
         | 
| 69 | 
             
                                <span className={styles.title}>
         | 
| 70 | 
             
                                  {TitleMap[key as keyof typeof TitleMap]}
         |