Python web开发中的目录排序问题设计

如题:
该功能类似与有道云笔记的笔记管理,特殊的点在于排序功能

1.我需要可以对文件夹或笔记进行随意排序.
2.将笔记移动到另一个文件夹下(在移动到其他文件夹下后也需要排序)


但是,排序结构我同一个简单粗暴的’ [‘1’, ‘2’, ‘3’] ‘结构存储 id 来保证笔记的排序. 这样的结构造成了较为麻烦的问题:
1.我必须在每一层文件夹下储存一次 [] 作为排序依据.
2.在排序时, 前端方面在给予后端的也是 [‘1’, ‘2’] 这样的结构. 特别是跨文件夹移动排序,前端获取 [‘1’, ‘2’] 较为麻烦.
3.在删除笔记时,我必须重新构建 [’’, ‘’]

我觉得这样设计很不优雅, 大家有什么好的经验吗? 希望能得到一些指点,先谢谢大家.
Python web开发中的目录排序问题设计


5 回复

没做过,说个想法仅供参考
设计两个字段,sort,sort_uptime


我理解你在做Web开发时遇到了目录排序的需求。这个问题的核心在于如何设计一个既能按字母排序,又能让特殊目录(比如“常用工具”)置顶的系统。

给你一个实用的解决方案:

import os
from typing import List, Dict

class DirectorySorter:
    def __init__(self, priority_dirs: List[str] = None):
        """
        初始化目录排序器
        :param priority_dirs: 需要置顶的目录列表,如 ['常用工具', '重要文档']
        """
        self.priority_dirs = priority_dirs or []
    
    def sort_directories(self, base_path: str) -> List[Dict]:
        """
        获取并排序目录列表
        :param base_path: 基础路径
        :return: 排序后的目录信息列表,每个目录包含名称和路径
        """
        if not os.path.exists(base_path):
            return []
        
        # 获取所有目录
        all_dirs = []
        for item in os.listdir(base_path):
            item_path = os.path.join(base_path, item)
            if os.path.isdir(item_path):
                all_dirs.append({
                    'name': item,
                    'path': item_path
                })
        
        # 分离优先目录和普通目录
        priority_list = []
        normal_list = []
        
        for dir_info in all_dirs:
            if dir_info['name'] in self.priority_dirs:
                priority_list.append(dir_info)
            else:
                normal_list.append(dir_info)
        
        # 对普通目录按字母排序
        normal_list.sort(key=lambda x: x['name'].lower())
        
        # 合并列表:优先目录在前,普通目录在后
        return priority_list + normal_list
    
    def get_sorted_directories_with_metadata(self, base_path: str) -> List[Dict]:
        """
        获取带元数据的排序目录列表
        :param base_path: 基础路径
        :return: 包含更多信息的目录列表
        """
        sorted_dirs = self.sort_directories(base_path)
        
        for dir_info in sorted_dirs:
            dir_path = dir_info['path']
            # 添加额外信息
            dir_info.update({
                'is_priority': dir_info['name'] in self.priority_dirs,
                'file_count': len(os.listdir(dir_path)) if os.path.exists(dir_path) else 0,
                'last_modified': os.path.getmtime(dir_path) if os.path.exists(dir_path) else 0
            })
        
        return sorted_dirs

# 使用示例
if __name__ == "__main__":
    # 创建排序器,指定需要置顶的目录
    sorter = DirectorySorter(priority_dirs=['常用工具', '项目文档'])
    
    # 获取排序后的目录列表
    base_directory = "/path/to/your/directory"  # 替换为你的目录路径
    sorted_dirs = sorter.sort_directories(base_directory)
    
    # 输出结果
    print("排序后的目录列表:")
    for i, dir_info in enumerate(sorted_dirs, 1):
        print(f"{i}. {dir_info['name']} - {dir_info['path']}")

这个方案的关键点:

  1. 分离处理:先把优先目录和普通目录分开
  2. 灵活配置:通过priority_dirs参数可以动态指定哪些目录需要置顶
  3. 保持字母序:普通目录仍然按字母顺序排列
  4. 可扩展性get_sorted_directories_with_metadata方法展示了如何添加更多目录信息

在实际Web开发中,你可以把这个类集成到你的视图函数或API中。比如在Flask里:

@app.route('/api/directories')
def get_directories():
    sorter = DirectorySorter(priority_dirs=['常用工具'])
    sorted_dirs = sorter.get_sorted_directories_with_metadata('/your/base/path')
    return jsonify(sorted_dirs)

这样前端就能拿到一个已经按你规则排序好的目录列表了。

总结:用优先级列表加字母排序的组合方案最实用。


嗯,貌似这样也不行
可以考虑链表的思想
https://www.v2ex.com/t/387001

drag and drop 拖放方式,组件位置、属性交换

明白 lz 的意思……假如用的是关系型数据库,可以保存<article_id, folder_id, order_id>,每次顺序有改动,就调整该 folder_id 下的所有 article 的 article_id 即可…… insert into … on duplicate key update …order_id = VALUES(order_id)

回到顶部