搭建部署BookStack查询书籍应用

114 次阅读

本文最后更新于 2026年5月11日。

html_columns渲染超链接导致空格后的部分丢失,把空格转换成%20就可以了。

把项目所有文件上传到如下位置:
/opt/1panel/docker/compose/search_mariadb

终端进入该目录并执行:
[root@iZ8vbajg9wo8iwynfb1lgeZ search_mariadb]# docker-compose up

设置网站反向代理即可访问。

核心功能完整代码:
“`
def run():
global limit, offset
keywords_str = input_file_UIinput.value
keywords = keywords_str.split(‘ ‘)

        # SQL查询语句
        query = "SELECT * FROM constant WHERE"
        # query += " OR".join([f" filepath LIKE '%{keyword}%'" for keyword in keywords])
        query += " AND".join([f" filepath LIKE '%{keyword}%'" for keyword in keywords])

        # query += " LIMIT 3 OFFSET 0;"
        query += f" LIMIT {limit} OFFSET {offset};"

        print(query)

        env = 'product' #product or develope
        ## 连接数据库

        if env == 'product':
            SQLALCHEMY_DATABASE_URI = 'mariadb+mariadbconnector://root:SQLroot77@mariadb:3306/books'
        else:
            SQLALCHEMY_DATABASE_URI = 'mariadb+mariadbconnector://root:SQLroot77@47.92.255.11:3306/books'
        # print('start connect database...')
        # engine = sqlalchemy.create_engine(SQLALCHEMY_DATABASE_URI, echo=True)
        engine = sqlalchemy.create_engine(SQLALCHEMY_DATABASE_URI, echo=False,
                                          connect_args={"connect_timeout": 10},
                                            pool_timeout=10,
                                            pool_recycle=315)


        # 执行查询并获取结果
        df = pd.read_sql_query(query, engine)


        # 使用/分割每一行并从中提取最后一个元素
        last_elements = [row.split('\\')[-1] for row in df['filepath']]

        # 创建一个空列表
        result_list = []

        # 将每一列的最后一个元素添加到结果列表中
        for index, row in df.iterrows():
            temp_dict = row.to_dict()
            temp_dict['filename'] = last_elements[index]
            file_link = 'https://drive.my-elibrary.com'+ temp_dict['filepath']
            # 使用replace()函数将空格替换为%20
            encoded_url = file_link.replace(" ", "%20") # 将空格转成%20防止链接内容丢失
            temp_li = encoded_url.split('\\')
            folder_link = '\\'.join(temp_li[0:-1])
            temp_dict['filelink'] = f'<a href={encoded_url} target="_new">download file</a>'
            temp_dict['folderlink'] = f'<a href={folder_link} target="_new">open folder</a>'
            result_list.append(temp_dict)

        grid.options['rowData'] = result_list ## 不知道为什么响应式无效,虽然数据已经改变,组件第二次的时候改变不了
        grid.update() # if data linked to grid changed, update aggrid   grid_mate要声明全局变量
        offset += limit

“`