branchzero/discuz-flarum-adapter

用于快速生成基于 Laravel/Lumen 的后端骨架

dev-master 2018-12-03 20:17 UTC

This package is auto-updated.

Last update: 2024-09-29 04:37:13 UTC


README

本项目参考了以下项目,对此表示感谢

该项目的目的是为了将 Discuz 迁移到 Flarum 中

前言

  • 代码写的很糟糕,只是为了达到转换数据的目的
  • 大数据量用户请谨慎使用此工具
  • 工具不接受任何问题报告,也没有精力修复其中的一些问题,有问题请直接提交 Pull Request
  • 不建议没有任何代码基础的兄弟使用这个工具,可能你转换的时候还需要自己动手修改一部分代码才能正常运行。
  • 建议基于 FlarumChina 的版本来动手,原版有些地方的中文化还不完全到位。
  • 在执行 migrate.php 之前,请确保 discussions 和 flagrow_files 表为空(使用 truncate 无效,因为有外键约束)
  • 使用命令行运行 migrate.php,以避免超时问题,运行完成后请删除 migrate.php 和 migrate_config.php 文件,避免留下安全隐患
  • 在运行之前,请记得将 posts 表的 content 字段改为 mediumtext,否则转换成 HTML 后可能存不下,然后报错
  • 对于 mysql 5.7,请给 discussions 的 title 字段添加 FULLTEXT 索引,然后将 posts 表转换为 innodb(官方 dev-master 版最近已经修改,在发布之前请先手动修改!),否则数据量增大后搜索将非常缓慢,尽管添加索引后搜索依然很慢,最终的解决方案可能还需要使用 ElasticSearch

Step 0(前期准备)

  • composer require branchzero/discuz-flarum-adapter
  • composer require flagrow/upload(以兼容 Discuz 附件迁移)
  • composer require jellybool/flarum-ext-slug(板块生成 slug)

Step 1(迁移数据)

  • 将 migrate.php 和 migrate_config.php 移动到站点根目录,配置 migrate_config.php 并执行

Step 2(支持中文用户名和中文提及)

  • 加密算法兼容性修正(以后每次更新都要做)
    • 找到 vendor/flarum/core/src/Foundation/AbstractServer.php
    • 搜索 $app->register('Illuminate\Hashing\HashServiceProvider');
    • 替换成 $app->register('Branchzero\DiscuzFlarumAdapter\Hashing\HashServiceProvider');

执行以下命令

sed -i "s#a-z0-9_-#-_a-z0-9\\x7f-\\xff#" \
    vendor/flarum/core/src/Core/Validator/UserValidator.php

sed -i "s#a-z0-9_-#-_a-zA-Z0-9\\x7f-\\xff#" \
    vendor/flarum/flarum-ext-mentions/src/Listener/FormatPostMentions.php \
    vendor/flarum/flarum-ext-mentions/src/Listener/FormatUserMentions.php

sed -i "s#getIdForUsername(#getIdForUsername(rawurlencode(#; /getIdForUsername/s/'))/')))/" \
    vendor/flarum/flarum-ext-mentions/src/Listener/FormatUserMentions.php

支持中文搜索

找到 vendor/flarum/core/src/Core/Search/Discussion/Fulltext/MySqlFulltextDriver.php

修改 match 方法为

    public function match($string)
    {
        $discussionIds = Discussion::whereRaw("is_approved = 1")
            ->where('title', 'like', '%'.$string.'%')
            ->orderBy('id', 'desc')
            ->limit(50)
            ->lists('id','start_post_id');
        $relevantPostIds = [];
        foreach ($discussionIds as $postId => $discussionId) {
            $relevantPostIds[$discussionId][] = $postId;
        }
        $discussionIds = Post::whereRaw("is_approved = 1")
            ->where('content', 'like', '%'.$string.'%')
            ->orderBy('id', 'desc')
            ->limit(50)
            ->lists('discussion_id', 'id');
        foreach ($discussionIds as $postId => $discussionId) {
            $relevantPostIds[$discussionId][] = $postId;
        }
        return $relevantPostIds;
    }