从源代码中分析GitLab的类似问题(Similar issues)功能
首先
在使用GitLab时,您是否有过这样的情况:本以为成功登记了一个问题,结果却收到了“该问题已被登记”的提示,让您感到失望呢?
为了防止类似问题的重复登记,GitLab已经提供了Similar issues功能。通过这个功能,您可以减少相似主题的多次登记,并且减轻管理员的负担。
我看了一下源代码,以了解类似的问题显示功能是如何实现的。
在此之前,”Similar issues”功能是指
在 GitLab 的新建问题页面上,如果在标题中输入关键词(例如,性能),将会显示与性能相关的现有问题列表。例如,
-
- パフォーマンスチューニング
-
- 画面表示が遅い原因の調査 (※ このイシューは、説明にパフォーマンスが含まれています)
- パフォーマンスの計測手順を作成
类似的问题。
有关相似的问题,GitLab官方文档给出了定义。
-
- 同じトピックのイシューが重複登録されないように、類似イシューを検索し表示する
-
- 新規イシューページでタイトルを入力すると、カレントプロジェクトのすべてのIssueのタイトルと説明に対して、検索が行われる
-
- 類似イシューとして、ユーザがアクセス権限を持つイシューを最大5件まで、更新日の新しい順に表示してくれる
- 前提として、GraphQLを有効にしておく必要あり
因为似乎正在使用GraphQL,所以需要复习一下。
-
- GraphQL(グラフQL)はAPI向けに作られたクエリ言語およびランタイム
-
- ウェブAPI開発に使用するRESTやその他Webサービスと比較し、効率的、堅牢、フレキシブルなアプローチを提供
-
- クライアントが必要なデータ構造を定義可能で、サーバーからは定義された同じ構造のデータが返される
したがって、必要以上に大きいデータが返されるのを防げる、クエリの効率が良い
GraphQLは、型システム、クエリ言語、実行セマンティクス、静的な検証、型イントロスペクションから構成される
GraphQLは、データの問い合わせ(query)、書き換え(mutation)、購読(subscription)をサポートする
关于GitLab的源代码
GitLab采用了Ruby on Rails进行开发。
GitLab继续选择使用Ruby on Rails的原因是:
-
- 構造化されている
- 使いやすい
在下面的文章中,提到了两个要点。
请确认源代码中的”Similar issues”实现
首先,可以使用Chrome开发者工具等工具来验证相关的相似问题元素。
<div class="d-flex align-items-center"><!---->
<a href="https://gitlab.com/xxxxx/performance-test/-/issues/1"
rel="noopener" target="_blank" class="gl-link suggestion bold str-truncated-100 gl-text-gray-900!">
パフォーマンスの計測手順を作成
</a></div>
接下来,请确认处理以上要素的Vue文件。
- title_suggestions_item.vue
... ...
<div class="d-flex align-items-center">
<gl-icon
v-if="suggestion.confidential"
v-gl-tooltip.bottom
:title="__('Confidential')"
name="eye-slash"
class="gl-cursor-help gl-mr-2 gl-text-orange-500"
/>
<gl-link
:href="suggestion.webUrl"
target="_blank"
class="suggestion bold str-truncated-100 gl-text-gray-900!"
>
{{ suggestion.title }}
</gl-link>
</div>
... ...
在画面上,类似问题的标题被表示在suggestion.title字段中。
- title_suggestions.vue
import query from '../queries/issues.query.graphql';
import TitleSuggestionsItem from './title_suggestions_item.vue';
... ...
apollo: {
issues: {
query,
debounce: 1000,
skip() {
return this.isSearchEmpty;
},
update: (data) => data.project.issues.edges.map(({ node }) => node),
variables() {
return {
fullPath: this.projectPath,
search: this.search,
};
},
},
},
... ...
<ul class="gl-list-style-none gl-m-0 gl-p-0">
<li
v-for="(suggestion, index) in issues"
:key="suggestion.id"
:class="{
'gl-mb-3': index !== issues.length - 1,
}"
>
<title-suggestions-item :suggestion="suggestion" />
</li>
</ul>
被用于类似问题搜索的GraphQL查询。
- issues.query.graphql
query issueSuggestion($fullPath: ID!, $search: String) {
project(fullPath: $fullPath) {
id
issues(search: $search, sort: updated_desc, first: 5) {
edges {
node {
id
iid
title
confidential
userNotesCount
upvotes
webUrl
state
closedAt
createdAt
updatedAt
author {
id
name
username
avatarUrl
webUrl
}
}
}
}
}
}
正在使用指定的搜索关键词,按照更新日期的降序,搜索最多5个问题。
结束时
我对GitLab类似问题(Similar issues)功能进行了思考。
除了方便性之外,它的思维方式也引发了许多不同的想法。