更新模板
This commit is contained in:
128
cool/api.ts
Normal file
128
cool/api.ts
Normal file
@@ -0,0 +1,128 @@
|
||||
import { request } from "./service";
|
||||
|
||||
interface ParamId {
|
||||
id: number;
|
||||
}
|
||||
|
||||
|
||||
// 农创之翼 API 服务模块
|
||||
// 提供与 cool-admin-vue 类似的 service 调用方式
|
||||
|
||||
export const service = {
|
||||
base: {
|
||||
comm: {
|
||||
param: (params: any) => request({ url: "/app/base/comm/param", params }),
|
||||
upload: (data: any) => request({ url: "/app/base/comm/upload", method: "POST", data })
|
||||
}
|
||||
},
|
||||
nongchuang: {
|
||||
// 用户模块
|
||||
user: {
|
||||
info: () => request({ url: "/api/nongchuang/user/info" }),
|
||||
update: (data: any) => request({ url: "/api/nongchuang/user/info", method: "PUT", data })
|
||||
},
|
||||
|
||||
// 认证模块
|
||||
auth: {
|
||||
login: (data: any) => request({ url: "/api/nongchuang/auth/login", method: "POST", data }),
|
||||
wechatLogin: (data: any) => request({ url: "/api/nongchuang/auth/wechat-login", method: "POST", data }),
|
||||
register: (data: any) => request({ url: "/api/nongchuang/auth/register", method: "POST", data }),
|
||||
sendCode: (data: any) => request({ url: "/api/nongchuang/auth/sms-code", method: "POST", data }),
|
||||
logout: () => request({ url: "/api/nongchuang/auth/logout", method: "POST" })
|
||||
},
|
||||
|
||||
// 种子模块
|
||||
seed: {
|
||||
store: (params?: any) => request({ url: "/api/nongchuang/seed/store", params }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/seed/detail/${params.id}` }),
|
||||
purchase: (data: any) => request({ url: "/api/nongchuang/my-seed/purchase", method: "POST", data }),
|
||||
mySeeds: (params?: any) => request({ url: "/api/nongchuang/my-seed/list", params }),
|
||||
growth: (userSeedId: number) => request({ url: `/api/nongchuang/my-seed/growth/${userSeedId}` }),
|
||||
updateGrowth: (userSeedId: number) => request({ url: `/api/nongchuang/my-seed/growth/${userSeedId}/update`, method: "POST" })
|
||||
},
|
||||
|
||||
// 认养模块
|
||||
adoption: {
|
||||
list: (params?: any) => request({ url: "/api/nongchuang/adoption/projects", params }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/adoption/project/${params.id}` }),
|
||||
myProjects: (params?: any) => request({ url: "/api/nongchuang/adoption/my-projects", params }),
|
||||
redeemGiftCard: (data: any) => request({ url: "/api/nongchuang/adoption/gift-card/redeem", method: "POST", data }),
|
||||
current: () => request({ url: "/api/nongchuang/user-adoption/current" }),
|
||||
myList: () => request({ url: "/api/nongchuang/user-adoption/list" })
|
||||
},
|
||||
|
||||
// 用户认养模块
|
||||
userAdoption: {
|
||||
page: (data?: any) => request({ url: "/api/nongchuang/user-adoption/page", method: "POST", data }),
|
||||
list: () => request({ url: "/api/nongchuang/user-adoption/list" }),
|
||||
current: () => request({ url: "/api/nongchuang/user-adoption/current" }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/user-adoption/detail/${params.id}` })
|
||||
},
|
||||
|
||||
// 商品模块
|
||||
product: {
|
||||
list: (params?: any) => request({ url: "/api/nongchuang/product/list", params }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/product/detail/${params.id}` }),
|
||||
hot: () => request({ url: "/api/nongchuang/product/hot" }),
|
||||
structure: () => request({ url: "/api/nongchuang/product/category-structure" })
|
||||
},
|
||||
|
||||
// 分类模块
|
||||
category: {
|
||||
list: () => request({ url: "/api/nongchuang/category/list" })
|
||||
},
|
||||
|
||||
// 购物车模块
|
||||
cart: {
|
||||
list: () => request({ url: "/api/nongchuang/cart/list" }),
|
||||
add: (data: any) => request({ url: "/api/nongchuang/cart/add", method: "POST", data }),
|
||||
update: (data: any) => request({ url: "/api/nongchuang/cart/update", method: "PUT", data }),
|
||||
delete: (cartId: number) => request({ url: `/api/nongchuang/cart/delete/${cartId}`, method: "DELETE" }),
|
||||
clear: () => request({ url: "/api/nongchuang/cart/clear", method: "DELETE" })
|
||||
},
|
||||
|
||||
// 订单模块
|
||||
order: {
|
||||
list: (params?: any) => request({ url: "/api/nongchuang/order/list", params }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/order/detail/${params.id}` }),
|
||||
create: (data: any) => request({ url: "/api/nongchuang/order/create", method: "POST", data }),
|
||||
cancel: (orderId: number, data?: any) => request({ url: `/api/nongchuang/order/${orderId}/cancel`, method: "POST", data })
|
||||
},
|
||||
|
||||
// 设备模块
|
||||
device: {
|
||||
list: (params?: any) => request({ url: "/api/nongchuang/device/list", params }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/device/detail/${params.id}` }),
|
||||
control: (data: any) => request({ url: `/api/nongchuang/device/${data.deviceId}/control`, method: "POST", data })
|
||||
},
|
||||
|
||||
// 地址模块
|
||||
address: {
|
||||
list: () => request({ url: "/api/nongchuang/address/list" }),
|
||||
detail: (params: ParamId) => request({ url: `/api/nongchuang/address/detail/${params.id}` }),
|
||||
add: (data: any) => request({ url: "/api/nongchuang/address/create", method: "POST", data }),
|
||||
update: (data: any) => request({ url: "/api/nongchuang/address/update", method: "PUT", data }),
|
||||
delete: (id: number) => request({ url: `/api/nongchuang/address/delete/${id}`, method: "DELETE" }),
|
||||
setDefault: (data: any) => request({ url: "/api/nongchuang/address/setdefault", method: "POST", data })
|
||||
},
|
||||
|
||||
// 菜单模块
|
||||
appMenu: {
|
||||
listByType: (menuType: string) => request({ url: "/api/nongchuang/app-menu/list-by-type", params: { menuType } })
|
||||
},
|
||||
|
||||
// 配置模块
|
||||
config: {
|
||||
menus: (type?: string) => request({ url: "/api/nongchuang/config/menus", params: { type: type || 'home' } }),
|
||||
homeMenus: () => request({ url: "/api/nongchuang/config/home-menus" }),
|
||||
myMenus: () => request({ url: "/api/nongchuang/config/my-menus" }),
|
||||
model3d: (params?: any) => request({ url: "/api/nongchuang/config/model-3d", params }),
|
||||
models3d: (type?: string) => request({ url: "/api/nongchuang/config/models-3d", params: { type: type || 'seed' } })
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 提供与 cool-admin-vue 兼容的 useCool 钩子
|
||||
export function useCool() {
|
||||
return { service };
|
||||
}
|
||||
@@ -30,7 +30,6 @@ export function cool(app: VueApp) {
|
||||
initTheme();
|
||||
initLocale();
|
||||
|
||||
console.log(app);
|
||||
}
|
||||
|
||||
export * from "./animation";
|
||||
@@ -44,3 +43,5 @@ export * from "./theme";
|
||||
export * from "./upload";
|
||||
export * from "./utils";
|
||||
export * from "./types";
|
||||
export * from "./api";
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ export class Router {
|
||||
|
||||
// 获取页面元数据
|
||||
getMeta(path: string) {
|
||||
return PAGES.find((e) => path.includes(e.path))?.meta ?? ({} as UTSJSONObject);
|
||||
return PAGES.find((e) => path != null && typeof path === 'string' && path.includes(e.path))?.meta ?? ({} as UTSJSONObject);
|
||||
}
|
||||
|
||||
// 执行当前页面暴露的方法
|
||||
|
||||
@@ -42,7 +42,7 @@ const isIgnoreToken = (url: string) => {
|
||||
* @param options 请求参数
|
||||
* @returns Promise<T>
|
||||
*/
|
||||
export function request(options: RequestOptions): Promise<any | null> {
|
||||
export function request(options: RequestOptions): Promise<any> {
|
||||
let { url, method = "GET", data = {}, header = {}, timeout = 60000 } = options;
|
||||
|
||||
const { user } = useStore();
|
||||
@@ -80,17 +80,26 @@ export function request(options: RequestOptions): Promise<any | null> {
|
||||
timeout,
|
||||
|
||||
success(res) {
|
||||
// 401 无权限
|
||||
if (res.statusCode == 401) {
|
||||
if (isDev) console.log(`[Response] ${url} status: ${res.statusCode}`, JSON.stringify(res.data));
|
||||
// 401 无权限 或 业务码 1001 (未登录/失效)
|
||||
const resData = res.data;
|
||||
if (resData != null && isObject(resData)) {
|
||||
const dataObj = resData as UTSJSONObject;
|
||||
const bizCode = dataObj["code"];
|
||||
if (res.statusCode == 401 || bizCode == 1001) {
|
||||
user.logout();
|
||||
reject({ message: t("登录已失效"), code: 1001 } as Response);
|
||||
return;
|
||||
}
|
||||
} else if (res.statusCode == 401) {
|
||||
user.logout();
|
||||
reject({ message: t("无权限") } as Response);
|
||||
reject({ message: t("登录已失效"), code: 1001 } as Response);
|
||||
return;
|
||||
}
|
||||
|
||||
// 502 服务异常
|
||||
else if (res.statusCode == 502) {
|
||||
reject({
|
||||
message: t("服务异常")
|
||||
} as Response);
|
||||
reject({ message: t("服务异常") } as Response);
|
||||
}
|
||||
|
||||
// 404 未找到
|
||||
@@ -105,20 +114,30 @@ export function request(options: RequestOptions): Promise<any | null> {
|
||||
if (res.data == null) {
|
||||
resolve(null);
|
||||
} else if (!isObject(res.data as any)) {
|
||||
// 处理非对象格式的数据(如字符串)
|
||||
console.warn(`[Service] Received non-object data from ${url}:`, res.data);
|
||||
resolve(res.data);
|
||||
} else {
|
||||
// 解析响应数据
|
||||
const { code, message, data } = parse<Response>(
|
||||
res.data ?? { code: 0 }
|
||||
)!;
|
||||
try {
|
||||
const resDataObj = res.data as UTSJSONObject;
|
||||
const { code, message, data } = parse<Response>(
|
||||
resDataObj ?? { code: 0 }
|
||||
)!;
|
||||
|
||||
switch (code) {
|
||||
case 1000:
|
||||
resolve(data);
|
||||
break;
|
||||
default:
|
||||
reject({ message, code } as Response);
|
||||
break;
|
||||
switch (code) {
|
||||
case 1000:
|
||||
console.log(`[Service] Request success for ${url}, data:`, JSON.stringify(data));
|
||||
resolve(data);
|
||||
break;
|
||||
default:
|
||||
console.warn(`[Service] Business error from ${url}:`, code, message);
|
||||
reject({ message: message || t("请求失败"), code } as Response);
|
||||
break;
|
||||
}
|
||||
} catch (e : any) {
|
||||
console.error(`[Service] Parse error for ${url}:`, e);
|
||||
reject({ message: e.message || t("服务异常") } as Response);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -128,9 +147,11 @@ export function request(options: RequestOptions): Promise<any | null> {
|
||||
|
||||
// 网络请求失败
|
||||
fail(err) {
|
||||
console.error(`[Request Failed] ${url}`, err);
|
||||
reject({ message: err.errMsg } as Response);
|
||||
}
|
||||
});
|
||||
if (isDev) console.log(`[Request Sent] ${url}`);
|
||||
};
|
||||
|
||||
// 非刷新token接口才进行token有效性校验
|
||||
|
||||
@@ -44,16 +44,21 @@ export class User {
|
||||
*/
|
||||
async get() {
|
||||
if (this.token != null) {
|
||||
// 如果是模拟token,则跳过远程获取,防止由于后端校验失败导致的自动退出登录
|
||||
if (this.token.startsWith("fake-")) {
|
||||
return;
|
||||
}
|
||||
|
||||
await request({
|
||||
url: "/app/user/info/person"
|
||||
url: "/api/nongchuang/user/info"
|
||||
})
|
||||
.then((res) => {
|
||||
if (res != null) {
|
||||
this.set(res);
|
||||
this.set(res.userInfo || res); // Adapt to the map structure { userInfo: ..., stats: ... } or flat
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// this.logout();
|
||||
this.logout();
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -90,8 +95,8 @@ export class User {
|
||||
|
||||
// 同步到服务端
|
||||
await request({
|
||||
url: "/app/user/info/updatePerson",
|
||||
method: "POST",
|
||||
url: "/api/nongchuang/user/info",
|
||||
method: "PUT",
|
||||
data
|
||||
});
|
||||
}
|
||||
@@ -128,7 +133,8 @@ export class User {
|
||||
*/
|
||||
logout() {
|
||||
this.clear();
|
||||
router.login();
|
||||
// 移除自动跳转,仅清除已过期的登录态,由页面自行决定是否引导登录
|
||||
// router.login();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,9 +157,9 @@ export class User {
|
||||
refreshToken(): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
request({
|
||||
url: "/app/user/login/refreshToken",
|
||||
url: "/api/nongchuang/auth/refresh-token",
|
||||
method: "POST",
|
||||
data: {
|
||||
params: {
|
||||
refreshToken: storage.get("refreshToken")
|
||||
}
|
||||
})
|
||||
|
||||
@@ -81,7 +81,9 @@ const getTheme = () => {
|
||||
const appInfo = uni.getAppBaseInfo();
|
||||
// @ts-ignore
|
||||
const appTheme = appInfo.appTheme as string;
|
||||
const osTheme = uni.getSystemInfoSync().osTheme!;
|
||||
// Use fallback or specific API for osTheme if possible, otherwise getSystemInfoSync is the only way for osTheme currently
|
||||
const sysInfo = uni.getSystemInfoSync();
|
||||
const osTheme = sysInfo.osTheme!;
|
||||
|
||||
// 如果 appTheme 为 auto,则跟随系统主题,否则使用 appTheme
|
||||
value = appTheme == "auto" ? osTheme : appTheme;
|
||||
|
||||
Reference in New Issue
Block a user