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

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

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


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

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


5 回复

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


这个问题我遇到过。在Web开发里,目录排序的核心是把文件系统结构映射成前端能用的数据,同时处理好排序逻辑。

关键点在于用os.walkscandir遍历目录后,不能直接返回列表,得先区分文件和文件夹。通常的做法是分别收集,各自排序后再合并。比如文件夹按字母排前面,文件按修改时间排后面。

这里有个简单的实现示例:

import os
from pathlib import Path
from datetime import datetime

def get_sorted_directory_contents(path='.'):
    """获取排序后的目录内容"""
    dirs, files = [], []
    
    try:
        with os.scandir(path) as entries:
            for entry in entries:
                if entry.is_dir():
                    dirs.append({
                        'name': entry.name,
                        'type': 'directory',
                        'modified': datetime.fromtimestamp(entry.stat().st_mtime)
                    })
                else:
                    files.append({
                        'name': entry.name,
                        'type': 'file',
                        'modified': datetime.fromtimestamp(entry.stat().st_mtime),
                        'size': entry.stat().st_size
                    })
    except (PermissionError, FileNotFoundError):
        return []
    
    # 排序:文件夹优先按名称,文件按修改时间倒序
    dirs.sort(key=lambda x: x['name'].lower())
    files.sort(key=lambda x: x['modified'], reverse=True)
    
    return dirs + files

# 使用示例
if __name__ == '__main__':
    current_dir = Path.cwd()
    sorted_contents = get_sorted_directory_contents(current_dir)
    
    for item in sorted_contents:
        print(f"{'[DIR]' if item['type'] == 'directory' else '[FILE]'} {item['name']}")

实际项目中,我会把排序逻辑抽象成可配置的,比如支持按名称、大小、时间排序,还能切换升降序。前端传个sort_byorder参数过来就行。

如果要做成API,返回JSON格式的数据,前端用起来更方便。记得处理异常情况,比如没权限的目录直接跳过。

简单说就是先分类再排序,按需返回。


嗯,貌似这样也不行
可以考虑链表的思想
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)

回到顶部