feat(team): add page
This commit is contained in:
65
components/label/api/sync/index.ts
Normal file
65
components/label/api/sync/index.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import httpFetch from "@/api/fetch"
|
||||
import { BASE_LABEL_API } from "../const"
|
||||
import { Params, Response } from "./typing"
|
||||
|
||||
// 获取同步服务列表
|
||||
export const getDataSyncServerList = (params: Params.ServerRequest) => {
|
||||
return httpFetch<Response.SyncServerRes>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/data_sync/list",
|
||||
method: "GET",
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
||||
// 更新同步服务所在地
|
||||
export const updateSyncServerLocation = (location: string, id: number) => {
|
||||
return httpFetch({
|
||||
url: BASE_LABEL_API + `/api/v1/label_server/data_sync/update/${id}`,
|
||||
method: "PUT",
|
||||
body: JSON.stringify({ location }),
|
||||
})
|
||||
}
|
||||
|
||||
// 获取所有同步服务
|
||||
export const getAllSyncServerList = () => {
|
||||
return httpFetch<
|
||||
{
|
||||
id: number
|
||||
ip: string
|
||||
is_online: 0 | 1
|
||||
}[]
|
||||
>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/data_sync/all",
|
||||
method: "GET",
|
||||
})
|
||||
}
|
||||
|
||||
// 获取同步任务列表
|
||||
export const getDataSyncTaskList = (params: Params.TaskRequest) => {
|
||||
return httpFetch<Response.SyncTaskRes>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/data_sync/sync_task_list",
|
||||
method: "GET",
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
||||
// 新增同步任务
|
||||
export const newSyncTask = (data: {
|
||||
project_id: number
|
||||
sync_server_id: number
|
||||
}) => {
|
||||
return httpFetch<any>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/data_sync/add_sync_task",
|
||||
method: "POST",
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
}
|
||||
|
||||
// 更新同步任务状态
|
||||
export const updateSyncTaskStatus = (id: number, status: number) => {
|
||||
return httpFetch({
|
||||
url: BASE_LABEL_API + `/api/v1/label_server/data_sync/update_sync_task/${id}`,
|
||||
method: "PUT",
|
||||
body: JSON.stringify({ status }),
|
||||
})
|
||||
}
|
||||
64
components/label/api/sync/typing.ts
Normal file
64
components/label/api/sync/typing.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
export interface TimeFilter {
|
||||
start_date: string
|
||||
end_date: string
|
||||
}
|
||||
|
||||
export namespace Params {
|
||||
export interface ServerRequest {
|
||||
is_online?: boolean
|
||||
location?: string
|
||||
page_number: number
|
||||
page_size: number
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface TaskRequest {
|
||||
location?: string
|
||||
page_number: number
|
||||
page_size: number
|
||||
project_id?: number
|
||||
status?: number
|
||||
sync_server_id?: number
|
||||
[property: string]: any
|
||||
}
|
||||
}
|
||||
|
||||
export namespace Response {
|
||||
export interface SyncServerRes {
|
||||
sync_servers: SyncServer[]
|
||||
total_items: number
|
||||
total_pages: number
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface SyncServer {
|
||||
create_at?: string
|
||||
id?: number
|
||||
ip?: string
|
||||
is_online?: boolean
|
||||
location?: string
|
||||
update_at?: string
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface SyncTaskRes {
|
||||
sync_tasks: SyncTask[]
|
||||
total_items: number
|
||||
total_pages: number
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface SyncTask {
|
||||
create_at?: string
|
||||
id?: number
|
||||
ip?: string
|
||||
location?: string
|
||||
project_id?: number
|
||||
project_name?: string
|
||||
status?: number
|
||||
sync_server_id?: number
|
||||
update_at?: string
|
||||
uuid?: string
|
||||
[property: string]: any
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,72 @@
|
||||
import httpFetch from "@/api/fetch"
|
||||
import { BASE_LABEL_API } from "../const"
|
||||
import { Organization } from "./typing"
|
||||
import { Organization, User } from "./typing"
|
||||
|
||||
// 获取用户列表
|
||||
export const getUserList = (params: User.ListRequest) => {
|
||||
return httpFetch<User.ListResponse>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/user/list",
|
||||
method: "GET",
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
||||
// 新增用户
|
||||
export const userAdd = (data: User.CreateProps) => {
|
||||
return httpFetch({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/user/add",
|
||||
method: "POST",
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
}
|
||||
|
||||
// 批量导入用户
|
||||
export const userImport = (data: { user_infos: any[] }) => {
|
||||
return httpFetch<string[]>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/user/batch_add",
|
||||
method: "POST",
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
}
|
||||
|
||||
// 编辑用户
|
||||
export const userEditById = (data: User.EditProps, id: number) => {
|
||||
return httpFetch({
|
||||
url: BASE_LABEL_API + `/api/v1/label_server/user/edit/${id}`,
|
||||
method: "PUT",
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
}
|
||||
|
||||
// 获取用户组织树
|
||||
export const getUserGroupTree = () => {
|
||||
return httpFetch<Organization.Response[]>({
|
||||
url: "/api/v1/label_server/user/group/tree",
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/user/group/tree",
|
||||
method: "GET",
|
||||
})
|
||||
}
|
||||
|
||||
// 新增用户组
|
||||
export const userGroupAdd = (data: Organization.CreateProps) => {
|
||||
return httpFetch({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/user/group/add",
|
||||
method: "POST",
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
}
|
||||
|
||||
// 修改用户密码
|
||||
export const modifyUserPassword = (data: {
|
||||
old_password: string
|
||||
new_password: string
|
||||
}) => {
|
||||
return httpFetch({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/user/modify_password",
|
||||
method: "PUT",
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
}
|
||||
|
||||
/* ****************************** Options ****************************** */
|
||||
interface Option {
|
||||
label: string
|
||||
|
||||
@@ -1,4 +1,53 @@
|
||||
export namespace User {
|
||||
export interface UserInfo {
|
||||
uid: number
|
||||
name: string
|
||||
all_projects: { [x: number]: number[] }
|
||||
collect_projects: number[]
|
||||
group_name: string
|
||||
work_status: number
|
||||
base_city: string
|
||||
}
|
||||
|
||||
export interface LoginInfo extends UserInfo {
|
||||
token: string
|
||||
refresh_token: string
|
||||
}
|
||||
|
||||
export interface ListRequest {
|
||||
name?: string
|
||||
page_number?: number
|
||||
page_size?: number
|
||||
}
|
||||
|
||||
export interface ListResponse {
|
||||
user_list: UserInfo[]
|
||||
total_pages: number
|
||||
total_items: number
|
||||
}
|
||||
|
||||
export interface CreateProps {
|
||||
user_name: string
|
||||
group_uuid: string
|
||||
base_city: string
|
||||
}
|
||||
|
||||
export interface EditProps {
|
||||
user_name?: string
|
||||
password?: string
|
||||
group_uuid?: string
|
||||
base_city?: string
|
||||
work_status?: number
|
||||
}
|
||||
}
|
||||
|
||||
export namespace Organization {
|
||||
export interface CreateProps {
|
||||
group_name: string
|
||||
leader_uid: number
|
||||
parent_group_uuid: string
|
||||
}
|
||||
|
||||
interface Member {
|
||||
base_city: string
|
||||
id: number
|
||||
|
||||
65
components/label/api/workload/index.ts
Normal file
65
components/label/api/workload/index.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import httpFetch from "@/api/fetch"
|
||||
import { BASE_LABEL_API } from "../const"
|
||||
import { TimeFilter, WorkLoad } from "./typing"
|
||||
|
||||
// 标注工作量统计
|
||||
export const getLabelStatisticsList = (params: TimeFilter) => {
|
||||
return httpFetch<WorkLoad.LabelResponse>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/workload/label_statistics/list",
|
||||
method: "GET",
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
||||
// 审核1工作量统计
|
||||
export const getReview1StatisticsList = (params: TimeFilter) => {
|
||||
return httpFetch<WorkLoad.Review1Response>({
|
||||
url:
|
||||
BASE_LABEL_API + "/api/v1/label_server/workload/review1_statistics/list",
|
||||
method: "GET",
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
||||
// 审核2工作量统计
|
||||
export const getReview2StatisticsList = (params: TimeFilter) => {
|
||||
return httpFetch<WorkLoad.Review2Response>({
|
||||
url:
|
||||
BASE_LABEL_API + "/api/v1/label_server/workload/review2_statistics/list",
|
||||
method: "GET",
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
|
||||
// 结算表格列表
|
||||
export const getDownloadLog = () => {
|
||||
return httpFetch<any[]>({
|
||||
url: BASE_LABEL_API + "/api/v1/label_server/workload/settlement_form/list",
|
||||
method: "GET",
|
||||
})
|
||||
}
|
||||
|
||||
// 导出结算表格
|
||||
export const exportSettlementForm = (params: {
|
||||
year: number
|
||||
month: number
|
||||
}) => {
|
||||
return httpFetch<Blob>({
|
||||
url:
|
||||
BASE_LABEL_API + "/api/v1/label_server/workload/settlement_form/export",
|
||||
method: "GET",
|
||||
data: params,
|
||||
isDownload: true,
|
||||
})
|
||||
}
|
||||
|
||||
// 下载结算表格
|
||||
export const downloadSettlementForm = (params: { id: number }) => {
|
||||
return httpFetch<Blob>({
|
||||
url:
|
||||
BASE_LABEL_API + "/api/v1/label_server/workload/settlement_form/download",
|
||||
method: "GET",
|
||||
data: params,
|
||||
isDownload: true,
|
||||
})
|
||||
}
|
||||
107
components/label/api/workload/typing.ts
Normal file
107
components/label/api/workload/typing.ts
Normal file
@@ -0,0 +1,107 @@
|
||||
export interface TimeFilter {
|
||||
start_date: string
|
||||
end_date: string
|
||||
}
|
||||
|
||||
export namespace WorkLoad {
|
||||
export interface LabelData {
|
||||
commented_question_size: number
|
||||
commented_size: number
|
||||
commit_label_1: number
|
||||
commit_reviewed_1: number
|
||||
confirmed_prelabel_size: number
|
||||
dynamic_size: number
|
||||
group_name?: string
|
||||
key_frame_size: number
|
||||
object_size: number
|
||||
prelabel_object_size: number
|
||||
project_id: number
|
||||
project_name: string
|
||||
project_type: string
|
||||
question_size: number
|
||||
rejected_label_1: number
|
||||
reviewed_question_size: number
|
||||
reviewed_size: number
|
||||
static_size: number
|
||||
total_reviewed_size: number
|
||||
uid: number
|
||||
user_name: string
|
||||
work_time: number
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface LabelResponse {
|
||||
all: LabelData[]
|
||||
order_by_group_name: any[]
|
||||
order_by_project_name: any[]
|
||||
order_by_project_type: any[]
|
||||
order_by_user_name: any[]
|
||||
}
|
||||
|
||||
export interface Review1Data {
|
||||
comment_size: number
|
||||
commented_size: number
|
||||
commit_review_1: number
|
||||
commit_reviewed_2: number
|
||||
confirmed_prelabel_size: number
|
||||
group_name?: string
|
||||
object_size: number
|
||||
prelabel_object_size: number
|
||||
project_id: number
|
||||
project_name: string
|
||||
project_type: string
|
||||
reject_review_1: number
|
||||
rejected_review_1: number
|
||||
review_dynamic_size: number
|
||||
review_key_frame_size: number
|
||||
review_question_size: number
|
||||
review_size: number
|
||||
review_static_size: number
|
||||
reviewed_size: number
|
||||
total_review_size: number
|
||||
total_reviewed_size: number
|
||||
uid: number
|
||||
user_name: string
|
||||
work_time: number
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface Review1Response {
|
||||
all: Review1Data[]
|
||||
order_by_group_name: any[]
|
||||
order_by_project_name: any[]
|
||||
order_by_project_type: any[]
|
||||
order_by_user_name: any[]
|
||||
}
|
||||
|
||||
export interface Review2Data {
|
||||
comment_size: number
|
||||
commit_review_2: number
|
||||
confirmed_prelabel_size: number
|
||||
group_name?: string
|
||||
object_size: number
|
||||
prelabel_object_size: number
|
||||
project_id: number
|
||||
project_name: string
|
||||
project_type: string
|
||||
reject_review_2: number
|
||||
review_dynamic_size: number
|
||||
review_key_frame_size: number
|
||||
review_question_size: number
|
||||
review_size: number
|
||||
review_static_size: number
|
||||
total_review_size: number
|
||||
uid: number
|
||||
user_name: string
|
||||
work_time: number
|
||||
[property: string]: any
|
||||
}
|
||||
|
||||
export interface Review2Response {
|
||||
all: Review2Data[]
|
||||
order_by_group_name: any[]
|
||||
order_by_project_name: any[]
|
||||
order_by_project_type: any[]
|
||||
order_by_user_name: any[]
|
||||
}
|
||||
}
|
||||
120
components/label/hooks/useAuth.ts
Normal file
120
components/label/hooks/useAuth.ts
Normal file
@@ -0,0 +1,120 @@
|
||||
"use client"
|
||||
|
||||
import { usePermissionStore } from "@/components/label/store/auth"
|
||||
import { usePathname } from "next/navigation"
|
||||
|
||||
interface PermissionItem {
|
||||
[x: string]: [boolean, null, string]
|
||||
}
|
||||
|
||||
type PermissionMap = {
|
||||
[x: string]: PermissionItem
|
||||
}
|
||||
|
||||
const mappingList: { [x: string]: [string, string] } = {
|
||||
"/management/team/employee": ["user", "view"],
|
||||
"/management/team/organization": ["user", "group_view"],
|
||||
"/management/team/dailypaper": ["daily_work", "team_view"],
|
||||
"/management/team/cost": ["settlement_form", "view"],
|
||||
"/management/team/workload": ["workload", "view"],
|
||||
"/management/team/sync_server": ["data_sync", "server_view"],
|
||||
"/management/team/sync_task": ["data_sync", "task_view"],
|
||||
"/management/team/board": ["user", "view"],
|
||||
}
|
||||
|
||||
export const headerBarCheckItems = (data: PermissionMap) => {
|
||||
const projectTitle = [
|
||||
["daily_work", "self_view"],
|
||||
["label_schema", "view"],
|
||||
["project", "view"],
|
||||
["task", "view"],
|
||||
] as const
|
||||
|
||||
let projectVisible = false
|
||||
projectTitle.forEach(([prop, subProp]) => {
|
||||
if (data[prop] && data[prop][subProp] && data[prop][subProp][0]) {
|
||||
projectVisible = true
|
||||
}
|
||||
})
|
||||
|
||||
const staffTitle = [
|
||||
["daily_work", "team_view"],
|
||||
["user", "view"],
|
||||
["user", "group_view"],
|
||||
] as const
|
||||
|
||||
let staffVisible = false
|
||||
staffTitle.forEach(([prop, subProp]) => {
|
||||
if (data[prop] && data[prop][subProp] && data[prop][subProp][0]) {
|
||||
staffVisible = true
|
||||
}
|
||||
})
|
||||
|
||||
return [projectVisible, staffVisible]
|
||||
}
|
||||
|
||||
const useAuth = () => {
|
||||
const pathname = usePathname()
|
||||
const detailInfo = usePermissionStore((s) => s.detailInfo)
|
||||
const permission = detailInfo?.permissions as PermissionMap | undefined
|
||||
const roleName: string[] = detailInfo?.role_name ?? []
|
||||
|
||||
return {
|
||||
hasPermission: () => {
|
||||
if (
|
||||
[
|
||||
"/",
|
||||
"/login",
|
||||
"/management",
|
||||
"/management/person/dashboard",
|
||||
"/management/team",
|
||||
].includes(pathname)
|
||||
) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (!permission) return false
|
||||
if (mappingList[pathname]) {
|
||||
const [prop, subProp] = mappingList[pathname]
|
||||
return (
|
||||
!!permission[prop] &&
|
||||
!!permission[prop][subProp] &&
|
||||
!!permission[prop][subProp][0]
|
||||
)
|
||||
}
|
||||
return false
|
||||
},
|
||||
// path 跳转是否可见
|
||||
canNv: (path: string, type = "view") => {
|
||||
if (!permission) return false
|
||||
if (mappingList[path]) {
|
||||
const [prop] = mappingList[path]
|
||||
return (
|
||||
!!permission[prop] &&
|
||||
!!permission[prop][type] &&
|
||||
!!permission[prop][type][0]
|
||||
)
|
||||
}
|
||||
return false
|
||||
},
|
||||
// 当前页面是否可见某个操作
|
||||
isShow: (type = "view") => {
|
||||
if (!permission) return false
|
||||
if (mappingList[pathname]) {
|
||||
const [prop] = mappingList[pathname]
|
||||
return (
|
||||
!!permission[prop] &&
|
||||
!!permission[prop][type] &&
|
||||
!!permission[prop][type][0]
|
||||
)
|
||||
}
|
||||
return false
|
||||
},
|
||||
checkRole: (name: string) => {
|
||||
if (!name) return false
|
||||
return roleName.includes(name)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
export default useAuth
|
||||
Reference in New Issue
Block a user