mirror of
https://gitee.com/mirrors/AllinSSL.git
synced 2026-03-11 17:20:10 +08:00
【新增】私有证书
This commit is contained in:
192
frontend/apps/domain-official/src/api/index.ts
Normal file
192
frontend/apps/domain-official/src/api/index.ts
Normal file
@@ -0,0 +1,192 @@
|
||||
/**
|
||||
* @module @api
|
||||
* jQuery Ajax 封装
|
||||
*
|
||||
* - 统一 baseURL、认证头(X-API-Key、X-UID)
|
||||
* - JSON 请求/响应,错误码语义化
|
||||
* - 请求/响应拦截(简单版)
|
||||
* - API 形态参考 apps/official/doc/api.md
|
||||
*/
|
||||
|
||||
import type {
|
||||
ApiSuccess,
|
||||
ApiError,
|
||||
ApiResponse,
|
||||
RequestConfig,
|
||||
ApiClientOptions,
|
||||
} from "../types/api";
|
||||
|
||||
const isDev = (): boolean => process.env.NODE_ENV === "development";
|
||||
|
||||
export class ApiClient {
|
||||
private baseURL: string;
|
||||
private apiKey: string | undefined;
|
||||
private uid: string | undefined;
|
||||
private timeout: number;
|
||||
private withCredentials: boolean;
|
||||
private onRequest?: ApiClientOptions["onRequest"];
|
||||
private onResponse?: ApiClientOptions["onResponse"];
|
||||
private onError?: ApiClientOptions["onError"];
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
* @param options 客户端选项:`baseURL`/`apiKey`/`uid`/`timeout`/`withCredentials` 以及请求/响应钩子
|
||||
*/
|
||||
constructor(options: ApiClientOptions = {}) {
|
||||
this.baseURL = options.baseURL || isDev() ? "/proxy/api" : "/api";
|
||||
// this.baseURL = "/proxy/api"; //77150
|
||||
this.apiKey = options.apiKey;
|
||||
this.uid = options.uid || "1112";
|
||||
this.timeout = options.timeout ?? 15000;
|
||||
this.withCredentials = !!options.withCredentials;
|
||||
this.onRequest = options.onRequest;
|
||||
this.onResponse = options.onResponse;
|
||||
this.onError = options.onError;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置鉴权信息
|
||||
*/
|
||||
setAuth({ apiKey, uid }: { apiKey?: string; uid?: string }) {
|
||||
if (apiKey !== undefined) this.apiKey = apiKey;
|
||||
if (uid !== undefined) this.uid = uid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 组装请求头,自动附加鉴权信息
|
||||
*/
|
||||
/**
|
||||
* 组装请求头,自动附加鉴权信息
|
||||
*/
|
||||
private buildHeaders(extra?: Record<string, string>) {
|
||||
const headers: Record<string, string> = {
|
||||
...(extra || {}),
|
||||
};
|
||||
if (isDev() && this.uid) headers["X-UID"] = this.uid;
|
||||
|
||||
return headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起请求
|
||||
* - GET: 使用表单编码序列化查询参数
|
||||
* - POST: 使用 JSON 请求体
|
||||
* - 成功:status=true 且 code=0 才 resolve
|
||||
* - 失败:统一规范化为 ApiError 并 reject
|
||||
*/
|
||||
private request<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {
|
||||
const cfg: RequestConfig = {
|
||||
method: "POST",
|
||||
timeout: this.timeout,
|
||||
...config,
|
||||
};
|
||||
const finalCfg = this.onRequest ? this.onRequest({ ...cfg }) || cfg : cfg;
|
||||
const url = `${this.baseURL}${finalCfg.url.startsWith("/") ? "" : "/"}${
|
||||
finalCfg.url
|
||||
}`;
|
||||
const whileList = ["/v1/order/cart/list", "/v1/contact/get_user_detail"];
|
||||
// 白名单不进行登录状态判定
|
||||
const isSkip = whileList.includes(finalCfg.url);
|
||||
return new Promise((resolve, reject) => {
|
||||
const method = (finalCfg.method || "POST").toUpperCase();
|
||||
const isGet = method === "GET";
|
||||
const payload = isGet
|
||||
? finalCfg.data
|
||||
: finalCfg.data
|
||||
? JSON.stringify(finalCfg.data)
|
||||
: undefined;
|
||||
const contentType = isGet
|
||||
? "application/x-www-form-urlencoded; charset=UTF-8"
|
||||
: "application/json";
|
||||
|
||||
(window as any).$.ajax({
|
||||
url,
|
||||
method,
|
||||
data: payload,
|
||||
contentType,
|
||||
dataType: "json",
|
||||
headers: this.buildHeaders(finalCfg.headers),
|
||||
xhrFields: { withCredentials: this.withCredentials },
|
||||
timeout: finalCfg.timeout ?? this.timeout,
|
||||
success: (res: any) => {
|
||||
const processedRes = (
|
||||
this.onResponse ? this.onResponse(res, finalCfg) || res : res
|
||||
) as ApiResponse<T>;
|
||||
const isLoginInvalid =
|
||||
(processedRes as any)?.code === 1002 &&
|
||||
(processedRes as any)?.msg === "身份失效";
|
||||
const ok =
|
||||
(processedRes as any)?.status === true &&
|
||||
(processedRes as any)?.code === 0;
|
||||
if (isLoginInvalid && !isSkip) {
|
||||
setTimeout(() => {
|
||||
location.href = "/login";
|
||||
}, 2000);
|
||||
return reject({
|
||||
status: false,
|
||||
code: 1002,
|
||||
message: "登录状态已失效,页面将在2秒后自动跳转至登录页面",
|
||||
});
|
||||
}
|
||||
if (ok) {
|
||||
resolve(processedRes as ApiSuccess<T>);
|
||||
return;
|
||||
}
|
||||
const apiError: ApiError = {
|
||||
status: false,
|
||||
code: (processedRes as any)?.code ?? -1,
|
||||
message:
|
||||
(processedRes as any)?.message ||
|
||||
(processedRes as any)?.msg ||
|
||||
"请求失败",
|
||||
data: (processedRes as any)?.data,
|
||||
timestamp: (processedRes as any)?.timestamp ?? Date.now(),
|
||||
};
|
||||
const handled = this.onError
|
||||
? this.onError(apiError, finalCfg) || apiError
|
||||
: apiError;
|
||||
reject(handled);
|
||||
},
|
||||
error: (xhr: any, _textStatus: any, errorThrown: any) => {
|
||||
const resp = xhr?.responseJSON;
|
||||
|
||||
const fallback: ApiError = {
|
||||
status: false,
|
||||
code: resp?.code ?? xhr?.status ?? -1,
|
||||
message: resp?.message || resp?.msg || errorThrown || "网络错误",
|
||||
data: resp?.data,
|
||||
timestamp: resp?.timestamp ?? Date.now(),
|
||||
};
|
||||
const processed = this.onError
|
||||
? this.onError(fallback, finalCfg) || fallback
|
||||
: fallback;
|
||||
reject(processed);
|
||||
},
|
||||
} as any);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送 POST 请求
|
||||
* @param url 接口路径(相对 baseURL)
|
||||
* @param data 请求体
|
||||
* @param headers 额外请求头
|
||||
*/
|
||||
post<T = any>(url: string, data?: any, headers?: Record<string, string>) {
|
||||
return this.request<T>({ url, method: "POST", data, headers });
|
||||
}
|
||||
/**
|
||||
* 发送 GET 请求
|
||||
* @param url 接口路径(相对 baseURL)
|
||||
* @param data 查询参数
|
||||
* @param headers 额外请求头
|
||||
*/
|
||||
get<T = any>(url: string, data?: any, headers?: Record<string, string>) {
|
||||
return this.request<T>({ url, method: "GET", data, headers });
|
||||
}
|
||||
}
|
||||
|
||||
// 默认导出单例(可按需)
|
||||
const api = new ApiClient();
|
||||
|
||||
export default api;
|
||||
180
frontend/apps/domain-official/src/api/landing.ts
Normal file
180
frontend/apps/domain-official/src/api/landing.ts
Normal file
@@ -0,0 +1,180 @@
|
||||
import api from "./index";
|
||||
import type { ApiResponse } from "../types/api";
|
||||
|
||||
import type {
|
||||
DomainQueryCheckRequest,
|
||||
DomainQueryCheckResponseData,
|
||||
} from "../types/api-types/domain-query-check";
|
||||
import type {
|
||||
ContactGetUserDetailRequest,
|
||||
ContactGetUserDetailResponseData,
|
||||
} from "../types/api-types/contact-get-user-detail";
|
||||
import type {
|
||||
OrderCartListRequest,
|
||||
OrderCartListResponseData,
|
||||
} from "../types/api-types/order-cart-list";
|
||||
import type {
|
||||
OrderCartAddRequest,
|
||||
OrderCartAddResponseData,
|
||||
} from "../types/api-types/order-cart-add";
|
||||
import type {
|
||||
OrderCartUpdateRequest,
|
||||
OrderCartUpdateResponseData,
|
||||
} from "../types/api-types/order-cart-update";
|
||||
import type {
|
||||
OrderCartRemoveRequest,
|
||||
OrderCartRemoveResponseData,
|
||||
} from "../types/api-types/order-cart-remove";
|
||||
import type {
|
||||
OrderCartClearRequest,
|
||||
OrderCartClearResponseData,
|
||||
} from "../types/api-types/order-cart-clear";
|
||||
import type {
|
||||
OrderCreateRequest,
|
||||
OrderCreateResponseData,
|
||||
} from "../types/api-types/order-create";
|
||||
import type {
|
||||
OrderPaymentStatusRequest,
|
||||
OrderPaymentStatusResponseData,
|
||||
} from "../types/api-types/order-payment-status";
|
||||
import type {
|
||||
OrderDetailRequest,
|
||||
OrderDetailResponseData,
|
||||
} from "../types/api-types/order-detail";
|
||||
|
||||
// 落地页-域名查询
|
||||
export function domainQueryCheck(
|
||||
data: DomainQueryCheckRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<DomainQueryCheckResponseData>> {
|
||||
return api.post<DomainQueryCheckResponseData>(
|
||||
"/v1/domain/query/check",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 获取实名信息模板列表
|
||||
export function getContactUserDetail(
|
||||
data: ContactGetUserDetailRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<ContactGetUserDetailResponseData>> {
|
||||
return api.post<ContactGetUserDetailResponseData>(
|
||||
"/v1/contact/get_user_detail",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 购物车:获取列表
|
||||
export function getOrderCartList(
|
||||
data: OrderCartListRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderCartListResponseData>> {
|
||||
return api.post<OrderCartListResponseData>(
|
||||
"/v1/order/cart/list",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 购物车:添加
|
||||
export function addToCart(
|
||||
data: OrderCartAddRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderCartAddResponseData>> {
|
||||
return api.post<OrderCartAddResponseData>(
|
||||
"/v1/order/cart/add",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 购物车:更新
|
||||
export function updateCart(
|
||||
data: OrderCartUpdateRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderCartUpdateResponseData>> {
|
||||
return api.post<OrderCartUpdateResponseData>(
|
||||
"/v1/order/cart/update",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 购物车:移除
|
||||
export function removeFromCart(
|
||||
data: OrderCartRemoveRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderCartRemoveResponseData>> {
|
||||
return api.post<OrderCartRemoveResponseData>(
|
||||
"/v1/order/cart/remove",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 购物车:清空
|
||||
export function clearCart(
|
||||
data: OrderCartClearRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderCartClearResponseData>> {
|
||||
return api.post<OrderCartClearResponseData>(
|
||||
"/v1/order/cart/clear",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 创建订单
|
||||
export function createOrder(
|
||||
data: OrderCreateRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderCreateResponseData>> {
|
||||
return api.post<OrderCreateResponseData>("/v1/order/create", data, headers);
|
||||
}
|
||||
|
||||
// 查询支付状态
|
||||
export function queryPaymentStatus(
|
||||
data: OrderPaymentStatusRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderPaymentStatusResponseData>> {
|
||||
return api.post<OrderPaymentStatusResponseData>(
|
||||
"/v1/order/payment/status",
|
||||
data,
|
||||
headers
|
||||
);
|
||||
}
|
||||
|
||||
// 获取指定订单的详细信息
|
||||
export function getOrderDetail(
|
||||
data: OrderDetailRequest,
|
||||
headers?: Record<string, string>
|
||||
): Promise<ApiResponse<OrderDetailResponseData>> {
|
||||
return api.post<OrderDetailResponseData>("/v1/order/detail", data, headers);
|
||||
}
|
||||
|
||||
/**
|
||||
* WHOIS查询API
|
||||
* @param domain 域名
|
||||
* @returns Promise<ApiResponse<WhoisData>>
|
||||
*/
|
||||
export const queryWhois = (domain: string) => {
|
||||
return api.get(`/whois/query`, { domain });
|
||||
};
|
||||
|
||||
export const landingApi = {
|
||||
domainQueryCheck,
|
||||
getContactUserDetail,
|
||||
getOrderCartList,
|
||||
addToCart,
|
||||
updateCart,
|
||||
removeFromCart,
|
||||
clearCart,
|
||||
createOrder,
|
||||
queryPaymentStatus,
|
||||
getOrderDetail,
|
||||
queryWhois,
|
||||
};
|
||||
|
||||
export default landingApi;
|
||||
Reference in New Issue
Block a user