更新模板

This commit is contained in:
2026-01-21 01:37:34 +08:00
parent b7be8c51bf
commit c5c73828bd
83 changed files with 8687 additions and 1235 deletions

128
cool/api.ts Normal file
View 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 };
}

View File

@@ -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";

View File

@@ -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);
}
// 执行当前页面暴露的方法

View File

@@ -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有效性校验

View File

@@ -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")
}
})

View File

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