feat: 初始提交

This commit is contained in:
siujamo
2025-12-25 16:12:01 +08:00
commit faff32475f
77 changed files with 6123 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
import webClient from "@/service/web-client"
import { HttpStatus } from "@/constant"
import type { CaptchaResponse, UserAuthResponse } from "@/types/web/response"
import type { UsernamePasswordLoginRequest } from "@/types/web/request"
/**
* 获取验证码图片及验证码 UUID
*/
async function getCaptcha(): Promise<CaptchaResponse | null> {
const { data, status } = await webClient.get<CaptchaResponse | null>("/captcha")
if (status == HttpStatus.OK) {
return data as CaptchaResponse
} else {
return null
}
}
/**
* 使用用户名密码登录
* @param request 用户名密码
*/
async function usernamePasswordLogin(
request: UsernamePasswordLoginRequest
): Promise<UserAuthResponse | null> {
const { data } = await webClient.post<UserAuthResponse>("/auth/login", request)
return data
}
/**
* 使用企业微信登录
* @param code 由企业微信提供的身份验证 code
*/
async function wecomLogin(code: string): Promise<UserAuthResponse> {
const urlSearchParams = new URLSearchParams()
urlSearchParams.append("code", code)
const { data } = await webClient.get<UserAuthResponse>(`/auth/wecom/login?${urlSearchParams.toString()}`)
return data
}
/**
* 使用 Microsoft Entra 登录
* @param msalToken 由 Microsoft Entra 提供的用户身份令牌
*/
async function msalLogin(msalToken: string): Promise<UserAuthResponse> {
const { data, headers } = await webClient.post<UserAuthResponse>(`/auth/msal/login`, {
msalToken,
})
const token = (headers as Record<string, string>).authorization ?? ""
if (!token) {
return Promise.reject(new Error("未获取到身份令牌,登录失败"))
}
return data
}
/**
* 获取注册功能是否启用
*/
async function fetchRegisterEnabled() {
const { data } = await webClient.get<boolean>("/auth/register-enabled")
return data
}
export { usernamePasswordLogin, wecomLogin, msalLogin, getCaptcha, fetchRegisterEnabled }
+13
View File
@@ -0,0 +1,13 @@
import webClient from "@/service/web-client"
import type { TreeNode } from "@/types/tree"
import type { Department } from "@/types/entity"
export async function fetchDepartmentTree(): Promise<TreeNode<Department>> {
const { data } = await webClient.get<TreeNode<Department>>("/departments/tree")
return data
}
export async function fetchDepartments(): Promise<Department[]> {
const { data } = await webClient.get<Department[]>("/departments")
return data
}
+6
View File
@@ -0,0 +1,6 @@
export * as AuthApi from "./auth"
export * as MenuApi from "./menu"
export * as DeptApi from "./department"
export * as UserApi from "./user"
export * as PositionApi from "./position"
export * as RoleApi from "./role"
+8
View File
@@ -0,0 +1,8 @@
import webClient from "@/service/web-client"
import type { TreeNode } from "@/types/tree"
import type { MenuItem } from "@/types/entity"
export async function fetchMenuTree() {
const { data } = await webClient.get<TreeNode<MenuItem>[]>("/menus")
return data
}
+9
View File
@@ -0,0 +1,9 @@
import webClient from "@/service/web-client"
import type { QueryPositionRequest } from "@/types/web/request"
import type { PageResponse } from "@/types/web/response"
import type { Position } from "@/types/entity"
export async function fetchPositions(request: QueryPositionRequest): Promise<PageResponse<Position>> {
const { data } = await webClient.get<PageResponse<Position>>("/positions")
return data
}
+26
View File
@@ -0,0 +1,26 @@
import type { QueryRoleRequest } from "@/types/web/request"
import webClient from "@/service/web-client"
import type { PageResponse, RoleResponse } from "@/types/web/response"
export async function fetchRoles(
request: QueryRoleRequest | null
): Promise<RoleResponse> {
const params = new URLSearchParams()
params.append("pageNum", `${request?.pageNum ?? 1}`)
params.append("pageSize", `${request?.pageSize ?? 1}`)
if (request?.name) {
params.append("name", request.name)
}
if (request?.code) {
params.append("code", request.code)
}
if (request?.status) {
params.append("status", request.status)
}
const { data } = await webClient.get<RoleResponse>(`/roles?${params.toString()}`)
return data
}
+88
View File
@@ -0,0 +1,88 @@
import webClient from "@/service/web-client"
import { getCountryCallingCode } from "libphonenumber-js"
import { getDefaultCountryCode } from "@/utils/phone-number-utils"
import type { AddUserRequest, EditUserRequest, QueryUserRequest } from "@/types/web/request"
import type { PageResponse, UserDetailResponse } from "@/types/web/response"
import type { UserFormValues } from "@/types/form"
export async function fetchUsers(
request?: QueryUserRequest
): Promise<PageResponse<UserDetailResponse>> {
const urlSearchParam = new URLSearchParams()
urlSearchParam.append("pageNum", `${request?.pageNum ?? 1}`)
urlSearchParam.append("pageSize", `${request?.pageSize ?? 10}`)
if (request?.departmentId) {
urlSearchParam.append("departmentId", `${request.departmentId}`)
}
if (request?.username) {
urlSearchParam.append("username", request.username)
}
if (request?.regionAbbreviation) {
urlSearchParam.append("regionAbbreviation", request.regionAbbreviation)
}
if (request?.phoneNumber) {
urlSearchParam.append("phoneNumber", request.phoneNumber)
}
if (request?.status) {
urlSearchParam.append("status", request.status)
}
if (request?.createdAtStart) {
urlSearchParam.append("createdAtStart", request.createdAtStart)
}
if (request?.createdAtEnd) {
urlSearchParam.append("createdAtEnd", request.createdAtEnd)
}
const { data } = await webClient.get<PageResponse<UserDetailResponse>>(
`/users?${urlSearchParam.toString()}`
)
return data
}
export async function fetchUserById(userId: number): Promise<UserDetailResponse> {
const { data } = await webClient.get<UserDetailResponse>(`/users/${userId}`)
return data
}
export async function addUser(values: UserFormValues) {
await webClient.post("/users", {
username: values.username,
password: values.password,
fullName: values.fullName,
email: values.email,
regionAbbreviation: values.regionAbbreviation ?? getDefaultCountryCode(),
phoneNumber: values.phoneNumber,
avatarUrl: values.avatarUrl,
status: values.status,
departmentId: values.departmentId,
positionId: values.positionId,
roleIds: [],
} as AddUserRequest)
}
export async function editUser(values: UserFormValues) {
await webClient.put("/users", {
id: values.id,
username: values.username,
fullName: values.fullName,
email: values.email,
regionAbbreviation: values.regionAbbreviation ?? getDefaultCountryCode(),
phoneNumber: values.phoneNumber,
avatarUrl: values.avatarUrl,
status: values.status,
departmentId: values.departmentId,
positionId: values.positionId,
roleIds: [],
} as EditUserRequest)
}
export async function deleteUser(userId: number | string) {
await webClient.delete(`/users/${userId}`)
}