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;
}