资源文件管理功能

功能:

1:添加

  1.1:同一目录下支持单文件上传和多文件上传,每次上传会生成一个精确到秒的时间戳作为操作批次号保存在修改记录表中,并备份数据

  1.2:上传压缩文件并后台执行解压上传,实现批量不同目录文件批量上传

2:查看文件内容(支持txt和png)

3:修改文件内容

  3.1:查看txt文件后可以进行修改,修改后提交文件同时会生成一个精确到秒的时间戳作为操作批次号保存在修改记录表中,并备份数据

4:删除文件

5:下载文件/压缩包

6:继承上一版本资源文件

  6.1:资源文件继承和版本线继承规则不一样,第三位到最后一位保持一致,对比前两位倒序排序,且版本线位数一致。 例如添加4.2.0版本线配置时会提示是否继承4.1.0的资源文件

7:将开发文件发布

  7.1:通过文件标识区分dev和release文件。

8:压缩发布文件

  8.1:将执行压缩的文件仅包含release文件。

9:查看修改记录

  9.1:通过修改记录可以查看用户操作信息,且用户的每个动作都会有一个唯一批次号,通过批次号可以触发回滚

10:回滚

11:数据备份

问题:

1:windows(GBK)和linux(UTF-8)系统压缩文件中文件名的编码方式不同需要转码
解决方案1:使用7z压缩工具进行解压,工具自己

解决方案2:使用代码手动转码

    def zip_encode(file_path, zip_file_dir, sys):
        """
        转码压缩
        encoding支持GB2312和utf-8
        windows 下转为gb2312 linux下转为utf-8
        sys: Windows/Linux
        """
        logger.info("file_path:%s, zip_file_dir:%s, sys:%s" % (file_path, zip_file_dir, sys))
        if zipfile.is_zipfile(file_path):
            logger.info("is_zip")
            with zipfile.ZipFile(file_path, 'r') as z:
                logger.info("start unzip")
                for name in z.namelist():
                    name_encoding = chardet.detect(name)["encoding"].lower()
                    if (sys == "Windows" and name_encoding != "utf-8") or (sys == "Linux" and name_encoding == "utf-8"):
                        # 不需要转码(windows解压非utf-8,linux解压utf-8)
                        z.extractall(path=zip_file_dir.encode("UTF-8"))
                        return
                    else:
                        # 需要转码
                        logger.info("start encoding")
                        # windows下解压utf-8/linux下解压非utf-8
                        if name_encoding != "utf-8":
                            file_name = name.decode("gb2312").encode("utf-8")
                        else:
                            file_name = name
                        absolute_path = os.path.normpath(os.path.join(zip_file_dir, file_name))
                        logger.info("file_name: %s, absolute_path:%s" % (file_name, absolute_path))
                        if file_name.endswith('/'):
                            os.makedirs(absolute_path)
                        else:
                            dir_path = os.path.dirname(absolute_path)
                            if not os.path.exists(dir_path):
                                os.makedirs(dir_path)
                            data = z.read(name)
                            with open(absolute_path, "wb") as f:
                                f.write(data)

2:如何实现实现备份

  解决方案:新增或修改后备份文件
3:资源文件回滚
  解决方案:回滚分为两种情况,向前回滚和向后回滚两种情况。

  场景:现有A批次号和B批次号,且B批次号是在A批次号之后生成的。

  向前回滚指:由B节点回滚到A节点状态

  向后回滚指:由A节点回滚到B节点

  注意:回滚操作仅支持支持一条主线如果出现新分支会自动删除旧分支的修改记录,例如由B节点回退到A节点,由A节点又生成了C节点,在生成C节点的同时会自动删除B节点的修改记录保证一条主线。

  向前回滚实现方式

  1:获取A、B节点中修改的文件记录list,并去重
  2:获取B节点之前在list中的最新修改记录list2,通过select max group by file_path实现。

  3:通过计算list和list2差集得到list中新增文件集合list3

  4:删除list3中的文件

  5:恢复list2中的文件

  6:回滚完成

  向后回滚实现方式

  1:获取A、B节点中修改的文件记录list,去重获取最新修改记录。

  2:恢复list中中文件

  3:回滚完成

4:并发问题解决

  在每个执行操作前都会添加事务锁

原文地址:https://www.cnblogs.com/fuchenjie/p/14187872.html