This commit is contained in:
2025-09-30 17:16:11 +08:00
parent e650a7c7f3
commit 52ce0e1969
25 changed files with 689 additions and 989 deletions

View File

@@ -1,113 +1,39 @@
import { http } from './http';
// 统一响应处理函数 - 适配ERP客户端格式
function unwrap<T>(res: any): T {
if (res && typeof res.success === 'boolean') {
if (!res.success) {
const message: string = res.message || res.msg || '请求失败';
throw new Error(message);
}
return res as T;
}
// 兼容标准格式
if (res && typeof res.code === 'number') {
if (res.code !== 0) {
const message: string = res.msg || '请求失败';
throw new Error(message);
}
return (res.data as T) ?? ({} as T);
}
return res as T;
}
// 认证相关类型定义
interface LoginRequest {
username: string;
password: string;
}
interface RegisterRequest {
username: string;
password: string;
}
interface LoginResponse {
success: boolean;
token: string;
permissions: string[];
username: string;
message?: string;
}
interface RegisterResponse {
success: boolean;
message?: string;
}
import { http } from './http'
export const authApi = {
// 用户登录
login(params: LoginRequest) {
return http
.post('/api/login', params)
.then(res => unwrap<LoginResponse>(res));
login(params: { username: string; password: string }) {
return http.post('/api/login', params)
},
// 用户注册
register(params: RegisterRequest) {
return http
.post('/api/register', params)
.then(res => unwrap<RegisterResponse>(res));
register(params: { username: string; password: string }) {
return http.post('/api/register', params)
},
// 检查用户名可用性
checkUsername(username: string) {
return http
.get('/api/check-username', { username })
.then(res => {
if (res && res.code === 200) {
return { available: res.data };
}
throw new Error(res?.msg || '检查用户名失败');
});
return http.get('/api/check-username', { username })
},
// 验证token有效性
verifyToken(token: string) {
return http
.post('/api/verify', { token })
.then(res => unwrap<{ success: boolean }>(res));
return http.post('/api/verify', { token })
},
// 用户登出
logout(token: string) {
return http.postVoid('/api/logout', { token });
return http.postVoid('/api/logout', { token })
},
// 删除token缓存
deleteTokenCache() {
return http.postVoid('/api/cache/delete?key=token');
return http.postVoid('/api/cache/delete?key=token')
},
// 保存token到本地数据库
saveToken(token: string) {
return http.postVoid('/api/cache/save', { key: 'token', value: token });
return http.postVoid('/api/cache/save', { key: 'token', value: token })
},
// 从本地数据库获取token
getToken(): Promise<string | undefined> {
return http.get<any>('/api/cache/get?key=token').then((res: any) => {
if (typeof res === 'string') return res;
if (res && typeof res === 'object') {
if (typeof res.code === 'number') {
return res.code === 0 ? (res.data as string | undefined) : undefined;
}
if (typeof (res as any).data === 'string') return (res as any).data as string;
}
return undefined;
});
getToken() {
return http.get('/api/cache/get?key=token')
},
// 会话引导:检查并恢复会话(返回体各异,这里保持 any
sessionBootstrap() {
return http.get<any>('/api/session/bootstrap');
},
};
return http.get('/api/session/bootstrap')
}
}

View File

@@ -1,52 +1,27 @@
import { http } from './http'
// 与老版保持相同的接口路径与参数
const base = '/api/device'
export interface DeviceQuota {
limit: number
used: number
}
export interface DeviceItem {
deviceId: string
name?: string
status?: 'online' | 'offline'
lastActiveAt?: string
}
// 统一处理AjaxResult格式
function handleAjaxResult(res: any) {
if (res?.code !== 200) {
throw new Error(res?.msg || '操作失败')
}
return res.data
}
export const deviceApi = {
getQuota(username: string): Promise<DeviceQuota> {
return http.get(`${base}/quota`, { username }).then(handleAjaxResult)
getQuota(username: string) {
return http.get('/api/device/quota', { username })
},
list(username: string): Promise<DeviceItem[]> {
return http.get(`${base}/list`, { username }).then(handleAjaxResult)
list(username: string) {
return http.get('/api/device/list', { username })
},
register(payload: { username: string }) {
return http.post(`${base}/register`, payload).then(handleAjaxResult)
return http.post('/api/device/register', payload)
},
remove(payload: { deviceId: string }) {
return http.post(`${base}/remove`, payload).then(handleAjaxResult)
return http.post('/api/device/remove', payload)
},
heartbeat(payload: { username: string; deviceId: string; version?: string }) {
return http.post(`${base}/heartbeat`, payload).then(handleAjaxResult)
return http.post('/api/device/heartbeat', payload)
},
offline(payload: { deviceId: string }) {
return http.post(`${base}/offline`, payload).then(handleAjaxResult)
},
}
return http.post('/api/device/offline', payload)
}
}

View File

@@ -1,33 +1,21 @@
import { http } from './http';
function unwrap<T>(res: any): T {
if (res && typeof res.code === 'number') {
if (res.code !== 0) {
const message: string = res.msg || '请求失败';
throw new Error(message);
}
return (res.data as T) ?? ({} as T);
}
return res as T;
}
import { http } from './http'
export const rakutenApi = {
// 上传 Excel 或按店铺名查询
getProducts(params: { file?: File; shopName?: string; batchId?: string }) {
const formData = new FormData();
if (params.file) formData.append('file', params.file);
if (params.batchId) formData.append('batchId', params.batchId);
if (params.shopName) formData.append('shopName', params.shopName);
return http
.upload('/api/rakuten/products', formData)
.then(res => unwrap<{ products: any[]; total?: number; sessionId?: string }>(res));
const formData = new FormData()
if (params.file) formData.append('file', params.file)
if (params.batchId) formData.append('batchId', params.batchId)
if (params.shopName) formData.append('shopName', params.shopName)
return http.upload('/api/rakuten/products', formData)
},
search1688(imageUrl: string, sessionId?: string) {
const payload: Record<string, unknown> = { imageUrl };
if (sessionId) payload.sessionId = sessionId;
return http.post('/api/rakuten/search1688', payload).then(res => unwrap<any>(res));
const payload: Record<string, unknown> = { imageUrl }
if (sessionId) payload.sessionId = sessionId
return http.post('/api/rakuten/search1688', payload)
},
getLatestProducts() {
return http.get('/api/rakuten/products/latest').then(res => unwrap<{ products: any[] }>(res));
},
};
return http.get('/api/rakuten/products/latest')
}
}

View File

@@ -1,15 +0,0 @@
import { http } from './http';
export const shopeeApi = {
getAdHosting(params: Record<string, unknown> = {}) {
return http.get('/api/shopee/ad-hosting', params);
},
getReviews(params: Record<string, unknown> = {}) {
return http.get('/api/shopee/reviews', params);
},
exportData(exportParams: Record<string, unknown> = {}) {
return http.post('/api/shopee/export', exportParams);
},
};

View File

@@ -0,0 +1,11 @@
import { http } from './http'
export const updateApi = {
getVersion() {
return http.get('/api/update/version')
},
checkUpdate(currentVersion: string) {
return http.get(`/system/version/check?currentVersion=${currentVersion}`)
}
}

View File

@@ -1,79 +1,39 @@
// 斑马订单模型(根据页面所需字段精简定义)
export interface ZebraOrder {
orderedAt?: string;
productImage?: string;
productTitle?: string;
shopOrderNumber?: string;
timeSinceOrder?: string;
priceJpy?: number;
productQuantity?: number;
shippingFeeJpy?: number;
serviceFee?: string;
productNumber?: string;
poNumber?: string;
shippingFeeCny?: number;
internationalShippingFee?: number;
poLogisticsCompany?: string;
poTrackingNumber?: string;
internationalTrackingNumber?: string;
trackInfo?: string;
}
import { http } from './http'
export interface ZebraOrdersResp {
orders: ZebraOrder[];
total?: number;
totalPages?: number;
}
import { http } from './http';
export interface BanmaAccount {
id?: number;
name?: string;
username?: string;
password?: string;
token?: string;
tokenExpireAt?: string | number;
isDefault?: number;
status?: number;
remark?: string;
}
// 斑马 API与原 zebra-api.js 对齐的接口封装
export const zebraApi = {
// 账号管理ruoyi-admin
getAccounts() {
return http.get<{ code?: number; msg?: string; data: BanmaAccount[] }>('/tool/banma/accounts');
return http.get('/tool/banma/accounts')
},
saveAccount(body: BanmaAccount) {
return http.post<{ id: number }>('/tool/banma/accounts', body);
saveAccount(body: any) {
return http.post('/tool/banma/accounts', body)
},
removeAccount(id: number) {
// 用 postVoid 也可,但这里前端未用到,保留以备将来
return http.delete<void>(`/tool/banma/accounts/${id}`);
return http.delete(`/tool/banma/accounts/${id}`)
},
// 业务采集
getShops(params?: { accountId?: number }) {
return http.get<{ data?: { list?: Array<{ id: string; shopName: string }> } }>(
'/api/banma/shops', params as unknown as Record<string, unknown>
);
},
getOrders(params: { accountId?: number; startDate?: string; endDate?: string; page?: number; pageSize?: number; shopIds?: string; batchId: string }) {
return http.get<ZebraOrdersResp>('/api/banma/orders', params as unknown as Record<string, unknown>);
return http.get('/api/banma/shops', params as Record<string, unknown>)
},
getOrders(params: any) {
return http.get('/api/banma/orders', params as Record<string, unknown>)
},
// 其他功能(客户端微服务)
getOrdersByBatch(batchId: string) {
return http.get<ZebraOrdersResp>(`/api/banma/orders/batch/${batchId}`);
return http.get(`/api/banma/orders/batch/${batchId}`)
},
getLatestOrders() {
return http.get<ZebraOrdersResp>('/api/banma/orders/latest');
return http.get('/api/banma/orders/latest')
},
getOrderStats() {
return http.get('/api/banma/orders/stats');
return http.get('/api/banma/orders/stats')
},
searchOrders(searchParams: Record<string, unknown>) {
return http.get('/api/banma/orders/search', searchParams);
},
};
return http.get('/api/banma/orders/search', searchParams)
}
}