搜索结果列表页面开发

This commit is contained in:
付民康
2025-03-12 18:41:20 +08:00
commit 7cebe8fc00
739 changed files with 88149 additions and 0 deletions

218
src/api/issue/index.ts Normal file
View File

@@ -0,0 +1,218 @@
import request from '@/utils/request';
import * as types from '@/api/issue/types';
import { reqCatch, reqCatchV2, type catchRt } from '@/utils/catch';
export function createIssue(data: types.createIssueReqType): Promise<types.createIssueResType> {
return request({
url: `/api/v1/issue/${data.project_id}/issues`,
method: 'post',
data
});
}
export function deleteIssue(params: types.createIssueReqType): Promise<types.createIssueResType> {
return request({
url: `/api/v1/issue/${params.project_id}/issues/${params.issue_iid}`,
method: 'delete'
});
}
export function updateIssue(data: types.updateIssueReqType): Promise<types.updateIssueResType> {
const { project_id, issue_iid } = data;
delete data.project_id;
delete data.issue_iid;
return request({
url: `/api/v1/issue/${project_id}/issues/${issue_iid}`,
method: 'put',
data
});
}
// 关闭或打开issue
export function updateIssueStat(data: types.updateIssueStatReqType): Promise<types.updateIssueStatResType> {
const { project_id, issue_iid } = data;
delete data.project_id;
delete data.issue_iid;
return request({
url: `/api/v1/issue/${project_id}/issues/${issue_iid}/close`,
method: 'put',
data
});
}
export function fetchIssue(params: types.fetchIssueReqType): Promise<types.fetchIssueResType> {
return request({
url: `/api/v1/issue/${params.project_id}/issues/${params.issue_iid}`,
method: 'get'
});
}
// 项目issue列表
export function fetchIssueList(params: types.fetchIssueListReqType): Promise<types.fetchIssueListResType> {
return request({
url: `/api/v1/issue/${params.project_id}/issues`,
method: 'get',
params
});
}
export function createIssueDiscussions(data: types.createIssueDiscussionsReqType): Promise<types.createIssueDiscussionsResType> {
return request({
url: `/api/v1/issue/${data.project_id}/issues/${data.issue_iid}/discussions`,
method: 'post',
data
});
}
export function updateIssueDiscussions(data: types.updateIssueDiscussionsReqType): Promise<types.updateIssueDiscussionsResType> {
return request({
url: `/api/v1/projects/${data.project_id}/issues/${data.issue_iid}/notes/${data.note_id}`,
method: 'put',
data
});
}
export function deleteIssueDiscussions(params: types.deleteIssueDiscussionsReqType): Promise<types.deleteIssueDiscussionsResType> {
return request({
url: `/api/v1/projects/${params.project_id}/issues/${params.issue_iid}/notes/${params.note_id}`,
method: 'delete',
params
});
}
export function fetchIssueDiscussions(params: types.fetchIssueDiscussionsResType): Promise<types.fetchIssueDiscussionsResType> {
return request({
url: `/api/v1/issue/${params.project_id}/issues/${params.issue_iid}/discussions`,
method: 'get',
params
});
}
// 获取issue单条评论
export function fetchIssueNote(params: types.fetchIssueDiscussionsResType): Promise<types.fetchIssueDiscussionsResType> {
return request({
url: `/api/v1/projects/${params.project_id}/issues/${params.issue_iid}/notes/${params.note_id}`,
method: 'get'
});
}
// 回复issue评论
export function freplyIssueDiscussions(data: types.createIssueReqType): Promise<types.createIssueResType> {
return request({
url: `/api/v1/issue/api/v4/projects/${data.project_id}/issues/${data.issue_iid}/discussions/${data.discussion_id}/notes`,
method: 'post',
data
});
}
// issue参与者
export function issueParticipants(data: types.issueParticipantsResType): Promise<types.issueParticipantsReqType> {
return request({
url: `/api/v1/issue/${data.project_id}/issues/${data.issue_iid}/participants`,
method: 'get'
});
}
// issue 精选
export function pinIssue(params: types.pinIssueReqType): Promise<types.pinIssueResType> {
return request({
url: `/api/v1/featured/${params.type}`,
method: 'post',
params
});
}
export function deletePinIssue(params: types.deletePinIssueReqType): Promise<types.deletePinIssueResType> {
return request({
url: `/api/v1/featured/${params.type}`,
method: 'delete',
params
});
}
// 精选排序
export function sortPinIssue(data): Promise<types.pinIssueListResType> {
const { type, group_id, body } = data;
return request({
url: `/api/v1/featured/${type}/resort?group_id=${group_id}`,
method: 'put',
data: body
});
}
export function pinIssueList(params: types.pinIssueListReqType): Promise<types.pinIssueListResType> {
return request({
url: `/api/v1/featured/projects/${params.project_id}/issues`,
method: 'get'
});
}
// 我的issue列表
export function myIssueList(params: types.fetchIssueListReqType): Promise<types.fetchIssueListResType> {
return request({
url: `/api/v1/issues`,
method: 'get',
params
});
}
// 我的issue列表数量
export function myIssueListState(params: types.myIssueListStateReptype): Promise<types.myIssueListStateRestype> {
return request({
url: `/api/v1/issues/statistics`,
method: 'get',
params
});
}
// 组织的issue列表
export function groupIssueList(params: types.fetchIssueListResType): Promise<types.fetchIssueListResType> {
const { group_id } = params;
delete params.group_id;
return request({
url: `/api/v1/groups/${group_id}/issues`,
method: 'get',
params
});
}
// 获取issue关联的PR列表
export function getIssuePRList(params: types.fetchIssueListResType): Promise<types.fetchIssueListResType> {
const { project_id, issue_iid } = params;
delete params.project_id;
delete params.issue_iid;
return request({
url: `/api/v1/issue/${project_id}/issues/${issue_iid}/linked_merge_requests`,
method: 'get',
params
});
}
// issue关联PR
export function issueRelatePR(data: types.updateIssueReqType): Promise<types.fetchIssueListResType> {
return reqCatch(
() => request({
url: `/api/v1/issue/${data.project_id}/issues/${data.issue_id}/merge_request/${data.merge_request_id}/linked_merge_requests`,
method: 'post'
})
,
data
);
}
// issue取消关联PR
export function issueDeletePR(params: types.updateIssueReqType): Promise<types.fetchIssueListResType> {
return reqCatch(
() => request({
url: `/api/v1/issue/${params.project_id}/issues/${params.issue_id}/linked_merge_requests/${params.merge_request_id}`,
method: 'delete'
})
,
params
);
}
// 获取issue模版列表
export function fetchIssueTemplateList(project_id: string): Promise<Record<string, any>> {
return request({
url: `/api/v2/projects/${project_id}/repository/template/issue`,
method: 'get',
params: {}
}).catch((e) => {
return { data: [], error_code: e };
});
}

322
src/api/issue/types.ts Normal file
View File

@@ -0,0 +1,322 @@
export interface createIssueReqType {
project_id?: string;
issue_iid?: number;
title?: string;
description?: string;
updated_at?: string;
state_event?: 'reopen' | 'close';
assignee_id?: number;
assignee_ids?: string[];
milestone_id?: number;
labels?: ILabel[] | string[];
due_date?: string;
confidential?: boolean;
discussion_locked?: true;
created_at?: string;
issue_category?: string;
issue_stage?: string;
issue_severity?: string;
pbi_id?: number;
proposer_id?: string[];
[propName: string]: any;
}
export interface createIssueResType extends IIssue {
[propName: string]: any;
}
export interface deleteIssueReqType {
project_id: string;
issue_iid: number;
[propName: string]: any;
}
export interface deleteIssueResType {
[propName: string]: any;
}
export interface createIssueDiscussionsResType extends IIssue {
[propName: string]: any;
}
export interface createIssueDiscussionsReqType {
project_id: string;
issue_iid: number;
[propName: string]: any;
}
export interface fetchIssueResType {
project_id: string;
issue_iid: number;
[propName: string]: any;
}
export interface fetchIssueReqType extends IIssue {
[propName: string]: any;
}
export interface fetchIssueListReqType {
project_id: string;
state?: string;
sort?: string;
scope?: string;
search?: string;
page?: number;
per_page?: number;
[propName: string]: any;
}
export interface fetchIssueListResType extends IIssue {
[propName: string]: any;
}
export interface myIssueListStateReptype {
state: string;
[propName: string]: any;
}
export interface myIssueListStateRestype extends IIssue {
[propName: string]: any;
}
export interface issueParticipantsResType {
project_id: string;
issue_iid: number;
[propName: string]: any;
}
export interface issueParticipantsReqType extends IAuthor {
[propName: string]: any;
}
export interface fetchIssueDiscussionsResType {
project_id: string;
issue_iid: number;
type: 'user';
[propName: string]: any;
}
export interface fetchIssueDiscussionsReqType extends Idiscussions {
[propName: string]: any;
}
export interface updateIssueReqType extends createIssueReqType {
[propName: string]: any;
}
export interface updateIssueResType extends IIssue {
[propName: string]: any;
}
export interface updateIssueStatReqType extends createIssueReqType {
discussions?: string;
[propName: string]: any;
}
export interface updateIssueStatResType extends IIssue {
[propName: string]: any;
}
export interface updateIssueDiscussionsReqType {
project_id: string;
issue_iid: number;
note_id: string;
[propName: string]: any;
}
export interface updateIssueDiscussionsResType {
[propName: string]: any;
}
export interface deleteIssueDiscussionsReqType {
project_id: string;
issue_iid: number;
note_id: string;
[propName: string]: any;
}
export interface deleteIssueDiscussionsResType {
[propName: string]: any;
}
export interface pinIssueReqType {
type: 'project_issue';
resource_id: number | string;
[propName: string]: any;
}
export interface pinIssueResType {
[propName: string]: any;
}
export interface deletePinIssueReqType {
type: 'project_issue';
group_id: string;
resource_id: string;
[propName: string]: any;
}
export interface deletePinIssueResType {
[propName: string]: any;
}
export interface sortPinIssueReqType {
type: 'project_issue';
group_id: string;
body: string;
[propName: string]: any;
}
export interface sortPinIssueResType {
[propName: string]: any;
}
export interface pinIssueListReqType {
project_id: string;
[propName: string]: any;
}
export interface pinIssueListResType {
object_id: string,
type: string,
resource_id: string,
nextResource_id: string
[propName: string]: any;
}
// 用户
export interface IAuthor {
id: number;
name: string;
username: string;
state: 'active' | string;
avatar_url: string;
avatar_path?: string;
email?: string;
name_cn: string;
web_url: string;
nick_name?: string;
tenant_name?: string;
avatar?: string;
nickname?: string;
is_member?: string;
}
// 项目
export interface IProject {
id: number;
description?: string;
name: string;
name_with_namespace: string;
path: string;
path_with_namespace: string;
develop_mode?: 'normal' | string;
created_at: string;
updated_at?: string;
archived: false;
is_kia: false;
ssh_url_to_repo: string;
http_url_to_repo: string;
web_url: string;
readme_url?: string;
product_id?: string;
product_name?: string;
}
// issue
export interface IIssue {
id?: number;
iid?: number;
project_id?: number;
title?: string;
description?: string;
editIng?: boolean;
saveIng?: boolean;
editText?: string;
state?: 'opened' | 'closed' | 'all';
created_at?: string;
updated_at?: string;
closed_at?: string;
closed_by?: string;
labels?: ILabel[];
milestone?: string;
assignees?: [];
author?: IAuthor;
assignee?: string;
user_notes_count?: number;
merge_requests_count?: number;
confidential?: boolean;
discussion_locked?: boolean;
web_url?: string;
time_stats?: {
time_estimate?: string
total_time_spent?: string
human_time_estimate?: string
human_total_time_spent?: string
};
project_path_with_namespace?: string;
project?: IProject;
root_project_id?: string;
subscribed?: boolean;
related_merge_request?: string;
linked_merge_requests?: [];
related_note_params?: null;
[propName: string]: any;
}
// 评论
export interface INote {
id: number | string;
type: 'DiscussionNote' | string;
body: string;
attachment?: null;
author: IAuthor;
created_at: string;
updated_at: string;
system?: boolean;
noteable_id: number;
noteable_type: 'Issue' | string;
commit_id?: string;
resolvable?: boolean;
is_reply?: boolean;
resolved_by?: null;
noteable_iid: number;
discussion_id: string;
project: string;
diff_file?: null;
diff: string;
archived: boolean;
review_categories?: null;
review_categories_cn: string;
review_categories_en: string;
review_modules?: null;
severity: 'suggestion';
severity_cn: '建议' | string;
severity_en: 'Suggestion' | string;
file_path?: string;
line?: string;
assignee?: string;
proposer: IAuthor;
}
// 评论
export interface Idiscussions extends INote {
id: string | number,
individual_note?: boolean,
notes: INote[],
project_id: number,
project_full_path: string,
deleted_file?: null,
new_file?: null,
added_lines?: null,
removed_lines?: null,
issue?: null,
merge_request_version_params?: null,
amode?: null,
bmode?: null
}
// 标签
export interface ILabel {
color: string;
description: string;
expires_at?: string
id: number
is_expired: boolean;
name: string;
text_color: string;
}