diff --git a/src/api/routes.ts b/src/api/routes.ts index b092c5d..2916c43 100644 --- a/src/api/routes.ts +++ b/src/api/routes.ts @@ -1,5 +1,6 @@ import { http } from "@/utils/http"; -import { baseUrlApi } from "./utils"; +// import { baseUrlApi } from "./utils"; +import { authApi } from "./utils"; type Result = { success: boolean; @@ -9,5 +10,6 @@ type Result = { export const getAsyncRoutes = () => { // return http.request("get", "/get-async-routes"); // 暂时返回空动态路由 - return http.request("get", baseUrlApi("auth/async-routes")); + // return http.request("get", baseUrlApi("auth/async-routes")); + return http.request("get", authApi("async-routes")); }; diff --git a/src/api/user.ts b/src/api/user.ts index f486c6f..2dedc27 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -1,5 +1,7 @@ import { http } from "@/utils/http"; -import { baseUrlApi } from "./utils"; +// import { baseUrlApi } from "./utils"; +// import { bizApi} from "./utils"; +import { authApi } from "./utils"; export type UserResult = { success: boolean; @@ -41,10 +43,17 @@ export const getLogin = (data?: object) => { // return http.request("post", "/login", { data }); // console.log(http.request("get", baseUrlApi("/user/roles"))); // console.log(data); - return http.request("post", baseUrlApi("login"), { data }); + // return http.request("post", baseUrlApi("login"), { data }); + return http.request("post", authApi("login"), { data }); }; /** 刷新`token` */ export const refreshTokenApi = (data?: object) => { - return http.request("post", "/refresh-token", { data }); + return http.request("post", authApi("/refresh-token"), { + data + }); +}; + +export const getCaptcha = () => { + return http.request("get", authApi("/captcha")); }; diff --git a/src/api/utils.ts b/src/api/utils.ts index a9793cb..ea1bc4c 100644 --- a/src/api/utils.ts +++ b/src/api/utils.ts @@ -1,4 +1,39 @@ -// 第一个代理后端地址 -export const baseUrlApi = (url: string) => `/base/${url}`; -// 第二个代理后端地址 -export const baseUrlAuthrApi = (url: string) => `/auth/${url}`; +import { getToken } from "@/utils/auth"; + +// 创建通用请求方法 +export const request = async (url: string, options: RequestInit = {}) => { + const defaultHeaders = { + "Content-Type": "application/json" + }; + + // 获取token + const token = getToken(); + + // 非登录接口才添加token + if (!url.includes("/login") && token) { + defaultHeaders["Authorization"] = `Bearer ${token}`; // 添加Bearer前缀 + } + + const config = { + ...options, + headers: { + ...defaultHeaders, + ...options.headers + } + }; + + const response = await fetch(url, config); + const data = await response.json(); + + if (data.code === 200 || data.status === 200) { + return data; + } else { + throw new Error(data.message || "请求失败"); + } +}; + +// API URL 生成器 +export const authApi = (path: string) => `/auth/${path}`; + +// 登录接口 +export const loginApi = (path: string) => `/auth/${path}`; diff --git a/src/router/modules/aircraft.ts b/src/router/modules/aircraft.ts index 79e2c94..46b3903 100644 --- a/src/router/modules/aircraft.ts +++ b/src/router/modules/aircraft.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "飞机管理", - rank: 5 + rank: 5, + showLink: false }, children: [ { diff --git a/src/router/modules/airtools.ts b/src/router/modules/airtools.ts index b96d914..aff014f 100644 --- a/src/router/modules/airtools.ts +++ b/src/router/modules/airtools.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "工具管理", - rank: 7 + rank: 7, + showLink: false }, children: [ { diff --git a/src/router/modules/airworthiness.ts b/src/router/modules/airworthiness.ts index 65dc7d6..b77f87e 100644 --- a/src/router/modules/airworthiness.ts +++ b/src/router/modules/airworthiness.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "适航资源", - rank: 2 + rank: 2, + showLink: false }, children: [ { diff --git a/src/router/modules/auth.ts b/src/router/modules/auth.ts new file mode 100644 index 0000000..92a09c3 --- /dev/null +++ b/src/router/modules/auth.ts @@ -0,0 +1,31 @@ +const Layout = () => import("@/layout/index.vue"); + +export default { + path: "/auth", + name: "res-auth", + component: Layout, + redirect: "/auth/company", + meta: { + icon: "ep:apple", + title: "auth管理", + rank: 1 + }, + children: [ + { + path: "/auth/company", + name: "company", + component: () => import("@/views/auth/company/index.vue"), + meta: { + title: "公司管理" + } + }, + { + path: "/auth/frontendUser", + name: "frontendUser", + component: () => import("@/views/auth/frontendUser/index.vue"), + meta: { + title: "用户管理" + } + } + ] +} satisfies RouteConfigsTable; diff --git a/src/router/modules/biz.ts b/src/router/modules/biz.ts new file mode 100644 index 0000000..4cca959 --- /dev/null +++ b/src/router/modules/biz.ts @@ -0,0 +1,65 @@ +const Layout = () => import("@/layout/index.vue"); + +export default { + path: "/biz", + name: "res-biz", + component: Layout, + redirect: "/biz/issuanceBid", + meta: { + icon: "ep:apple", + title: "biz管理", + rank: 2 + }, + children: [ + { + path: "/biz/issuanceBid", + name: "issuanceBid", + component: () => import("@/views/biz/issuanceBid/index.vue"), + meta: { + icon: "vscode-icons:file-type-biome", + title: "招标管理", + showParent: true + } + }, + { + path: "/biz/bid", + name: "bid", + component: () => import("@/views/biz/bid/index.vue"), + meta: { + title: "投标管理" + } + }, + { + path: "/biz/membershipPoint", + name: "membershipPoint", + component: () => import("@/views/biz/membershipPoint/index.vue"), + meta: { + title: "积分管理" + } + }, + { + path: "/biz/pointSpend", + name: "pointSpend", + component: () => import("@/views/biz/pointSpend/index.vue"), + meta: { + title: "积分消费记录" + } + }, + { + path: "/biz/purchase", + name: "purchase", + component: () => import("@/views/biz/purchase/index.vue"), + meta: { + title: "道具管理" + } + }, + { + path: "/biz/purchaseSpend", + name: "purchaseSpend", + component: () => import("@/views/biz/purchaseSpend/index.vue"), + meta: { + title: "道具消费记录" + } + } + ] +} satisfies RouteConfigsTable; diff --git a/src/router/modules/flightrecord.ts b/src/router/modules/flightrecord.ts index 6603f72..ec8d57b 100644 --- a/src/router/modules/flightrecord.ts +++ b/src/router/modules/flightrecord.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "飞行记录", - rank: 1 + rank: 1, + showLink: false }, children: [ { diff --git a/src/router/modules/material.ts b/src/router/modules/material.ts index 403ffa6..e5453ed 100644 --- a/src/router/modules/material.ts +++ b/src/router/modules/material.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "航材管理", - rank: 6 + rank: 6, + showLink: false }, children: [ { diff --git a/src/router/modules/sharing.ts b/src/router/modules/sharing.ts index 5c79e96..77681c7 100644 --- a/src/router/modules/sharing.ts +++ b/src/router/modules/sharing.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "资源共享", - rank: 3 + rank: 3, + showLink: false }, children: [ { diff --git a/src/router/modules/statistics.ts b/src/router/modules/statistics.ts index 279626e..400f45f 100644 --- a/src/router/modules/statistics.ts +++ b/src/router/modules/statistics.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "数据统计", - rank: 4 + rank: 4, + showLink: false }, children: [ { diff --git a/src/router/modules/syssettings.ts b/src/router/modules/syssettings.ts index c92844e..49b29a2 100644 --- a/src/router/modules/syssettings.ts +++ b/src/router/modules/syssettings.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "系统管理", - rank: 9 + rank: 9, + showLink: false }, children: [ { diff --git a/src/router/modules/user.ts b/src/router/modules/user.ts index 27f7472..d9eccd5 100644 --- a/src/router/modules/user.ts +++ b/src/router/modules/user.ts @@ -8,7 +8,8 @@ export default { meta: { icon: "ep:apple", title: "人员管理", - rank: 8 + rank: 8, + showLink: false }, children: [ { diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index f713277..fa65f96 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -88,7 +88,7 @@ export const useUserStore = defineStore({ }); }, /** 前端登出(不调用接口) */ - logOut() { + async logOut() { this.username = ""; this.roles = []; this.permissions = []; @@ -96,6 +96,7 @@ export const useUserStore = defineStore({ useMultiTagsStoreHook().handleTags("equal", [...routerArrays]); resetRouter(); router.push("/login"); + return Promise.resolve(); }, /** 刷新`token` */ async handRefreshToken(data) { @@ -111,6 +112,19 @@ export const useUserStore = defineStore({ reject(error); }); }); + }, + /** 设置用户信息 */ + async setUserInfo(data) { + this.username = data.username; + this.roles = data.roles || []; + // 设置其他用户信息... + return Promise.resolve(data); + }, + /** 重置token */ + resetToken() { + removeToken(); + this.roles = []; + return Promise.resolve(); } } }); diff --git a/src/utils/auth.ts b/src/utils/auth.ts index f2b28cb..285d880 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -124,6 +124,8 @@ export function removeToken() { /** 格式化token(jwt格式) */ export const formatToken = (token: string): string => { + console.log("token", token); + console.info("Bearer " + token); return "Bearer " + token; }; diff --git a/src/views/auth/backendUser/index.vue b/src/views/auth/backendUser/index.vue new file mode 100644 index 0000000..05c57bd --- /dev/null +++ b/src/views/auth/backendUser/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/auth/company/index.vue b/src/views/auth/company/index.vue new file mode 100644 index 0000000..cba40c9 --- /dev/null +++ b/src/views/auth/company/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/views/auth/frontendUser/index.vue b/src/views/auth/frontendUser/index.vue new file mode 100644 index 0000000..4ac1cde --- /dev/null +++ b/src/views/auth/frontendUser/index.vue @@ -0,0 +1,278 @@ + + + diff --git a/src/views/biz/bid/index.vue b/src/views/biz/bid/index.vue new file mode 100644 index 0000000..c595413 --- /dev/null +++ b/src/views/biz/bid/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/biz/issuanceBid/index.vue b/src/views/biz/issuanceBid/index.vue new file mode 100644 index 0000000..33e5f17 --- /dev/null +++ b/src/views/biz/issuanceBid/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/biz/membershipPoint/index.vue b/src/views/biz/membershipPoint/index.vue new file mode 100644 index 0000000..80c86a5 --- /dev/null +++ b/src/views/biz/membershipPoint/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/biz/pointSpend/index.vue b/src/views/biz/pointSpend/index.vue new file mode 100644 index 0000000..07e5f5a --- /dev/null +++ b/src/views/biz/pointSpend/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/biz/purchase/index.vue b/src/views/biz/purchase/index.vue new file mode 100644 index 0000000..444cb02 --- /dev/null +++ b/src/views/biz/purchase/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/biz/purchaseSpend/index.vue b/src/views/biz/purchaseSpend/index.vue new file mode 100644 index 0000000..363dcba --- /dev/null +++ b/src/views/biz/purchaseSpend/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/biz/settings/index.vue b/src/views/biz/settings/index.vue new file mode 100644 index 0000000..86f052a --- /dev/null +++ b/src/views/biz/settings/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 74616c3..7eff978 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -12,6 +12,9 @@ import { bg, avatar, illustration } from "./utils/static"; import { useRenderIcon } from "@/components/ReIcon/src/hooks"; import { ref, reactive, toRaw, onMounted, onBeforeUnmount } from "vue"; import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange"; +import { request, loginApi } from "@/api/utils"; +import { ElMessage } from "element-plus"; +import { setToken } from "@/utils/auth"; import dayIcon from "@/assets/svg/day.svg?component"; import darkIcon from "@/assets/svg/dark.svg?component"; @@ -39,39 +42,47 @@ const ruleForm = reactive({ const onLogin = async (formEl: FormInstance | undefined) => { if (!formEl) return; - await formEl.validate((valid, fields) => { + await formEl.validate(async (valid, fields) => { if (valid) { loading.value = true; - useUserStoreHook() - .loginByUsername({ - username: ruleForm.username, - password: ruleForm.password, - isBackendUser: 1 - }) - .then(res => { - console.log(res); - console.log("res.status = " + res.status); - console.log("res.success = " + res.success); - // if (res.success) { - console.info(typeof res.status); - if (res.status) { - console.log(res.status); - } else { - console.info(res); - console.error("res.status is undefined"); - } - if (res.status === 200) { - // 获取后端路由 - return initRouter().then(() => { - router.push(getTopMenu(true).path).then(() => { - message("登录成功", { type: "success" }); - }); - }); - } else { - message("登录失败", { type: "error" }); - } - }) - .finally(() => (loading.value = false)); + try { + const res = await request(loginApi("login"), { + method: "POST", + body: JSON.stringify({ + username: ruleForm.username, + password: ruleForm.password, + isBackendUser: 1 + }) + }); + + console.log("登录响应:", res); + + if (res.status === 200) { + console.log("登录成功,开始初始化路由"); + console.log("accessToken:", res.data.accessToken); + + // 存储token + setToken(res.data.accessToken); + + // 更新用户信息 + const userStore = useUserStoreHook(); + await userStore.setUserInfo(res.data); + + // 初始化路由 + await initRouter(); + + // 显示成功消息 + ElMessage.success("登录成功"); + + // 跳转到首页 + await router.push(getTopMenu(true).path); + } + } catch (error) { + console.error("登录错误详情:", error); + ElMessage.error(error.message || "登录失败"); + } finally { + loading.value = false; + } } }); }; diff --git a/vite.config.ts b/vite.config.ts index c5e2765..dcb286c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -29,7 +29,25 @@ export default ({ mode }: ConfigEnv): UserConfigExport => { "/base": { target: "http://127.0.0.1:9098", changeOrigin: true, - rewrite: path => path.replace(/^\/base/, ""), + rewrite: path => path.replace(/^\/base/, "") + }, + // 第二个代理后端地址 + "/otherApi": { + target: "http://127.0.0.1:3290", + changeOrigin: true, + rewrite: path => path.replace(/^\/otherApi/, "") + }, + // biz 接口 + "/biz": { + target: "http://127.0.0.1:8089", + changeOrigin: true, + rewrite: path => path.replace(/^\/biz/, "") + }, + // auth 接口 + "/auth": { + target: "http://127.0.0.1:9098", + changeOrigin: true, + rewrite: path => path.replace(/^\/auth/, "/auth/user/rd"), configure: (proxy, options) => { // 添加调试日志 proxy.on("proxyReq", (proxyReq, req, res) => { @@ -52,18 +70,6 @@ export default ({ mode }: ConfigEnv): UserConfigExport => { console.error("代理错误:", err); }); } - }, - // 第二个代理后端地址 - "/otherApi": { - target: "http://127.0.0.1:3290", - changeOrigin: true, - rewrite: path => path.replace(/^\/otherApi/, "") - }, - // 第三个代理后端地址 - "/biz": { - target: "http://127.0.0.1:8089", - changeOrigin: true, - rewrite: path => path.replace(/^\/biz/, "") } }, // 预热文件以提前转换和缓存结果,降低启动期间的初始页面加载时长并防止转换瀑布