【新增】私有证书

This commit is contained in:
cai
2025-09-03 15:15:59 +08:00
parent efd052a297
commit 954cd1638d
442 changed files with 76787 additions and 7483 deletions

View 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;

View 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;