准备把 Seafile 里面原本带有的 Elastic Search 系统给恢复出来。
功能对比
目前新版本的部署完以后,在资料库界面里面可以看到一个简单版的搜索框:
点击打开以后,只有一个非常简单的搜索框,搜索也仅支持按照名称进行搜索:
而在 Pro 版本中,搜索框是这样的:
点击后:
单击展开图标,还可以进行高级搜索:
实现思路
前端
要想恢复,首先就是解决前端问题。前端我们目前找到一些与搜索相关的文件:
这些看起来有点像 Pro 版本里面的页面,尤其是 advanced-search.js
,让我感觉非常像。难道也是像 Django 里面那样,用 isPro
作了限制?
我们来找到搜索框对应文件 frontend/src/components/toolbar/common-toolbar.js
,看到以下内容:
render() {
let searchPlaceholder = this.props.searchPlaceholder || gettext('Search Files');
return (
<div className="common-toolbar">
{isPro && (
<Search
repoID={this.props.repoID}
placeholder={searchPlaceholder}
onSearchedClick={this.props.onSearchedClick}
/>
)}
{this.props.isLibView && !isPro &&
<SearchByName
repoID={this.props.repoID}
repoName={this.props.repoName}
/>
}
<Notification />
<Account />
{showLogoutIcon && (<Logout />)}
</div>
);
}
芜湖!又是一个 isPro 限制内容,那么我们可以直接通过去除它来解除限制了。
那么,前端轻松秒杀,主要是后端。
后端
后端比较麻烦了,根据前面的开发经验,后端一定是要手动实现的。不过,我们还是先寻找一下对应的接口文件。
seahub 中大概率留有原来的搜索系统接口。分析起来,主要是两类接口,一类是用于前端和后端交互、交换搜索结果时候用的,另外就是 Elastic Search 系统收集数据用的。
去除前端的 isPro 限制
在 frontend/src/components/toolbar/common-toolbar.js
中,修改 render()
代码如下:
render() {
let searchPlaceholder = this.props.searchPlaceholder || gettext('Search Files');
return (
<div className="common-toolbar">
<Search
repoID={this.props.repoID}
placeholder={searchPlaceholder}
onSearchedClick={this.props.onSearchedClick}
/>
<Notification />
<Account />
{showLogoutIcon && (<Logout />)}
</div>
);
}
去除 isPro 限制后效果如图所示:
后面如果遇到问题以后再做小修改。
另:前端快速开发环境
按照文档中的指示,在运行环境的 /root/dev/conf/seahub_settings.py
中添加以下内容:
import os
PROJECT_ROOT = '/root/dev/source-code/seahub'
WEBPACK_LOADER = {
'DEFAULT': {
'BUNDLE_DIR_NAME': 'frontend/',
'STATS_FILE': os.path.join(PROJECT_ROOT,
'frontend/webpack-stats.dev.json'),
}
}
DEBUG = True
然后运行以下 shell 命令:
cd /root/dev/source-code/seahub/frontend
npm install
npm run dev
然后启动 Seafile-server 和 seahub。
启动这套东西以后,前端的修改可以被自动编译,改动可以立即体现在页面上。不过,完成前端开发以后,还是需要再生成一套 bundle。