feat: 新增登录跳转逻辑

This commit is contained in:
duanshuwen
2025-11-17 20:52:45 +08:00
parent c990ad7bbc
commit 5e15a55596
6 changed files with 8173 additions and 17 deletions

View File

@@ -5,7 +5,7 @@
"description": "My Electron application description", "description": "My Electron application description",
"main": ".vite/build/main.js", "main": ".vite/build/main.js",
"scripts": { "scripts": {
"start": "electron-forge start", "start": "node node_modules/@electron-forge/cli/dist/electron-forge.js start",
"package": "electron-forge package", "package": "electron-forge package",
"make": "electron-forge make", "make": "electron-forge make",
"publish": "electron-forge publish", "publish": "electron-forge publish",
@@ -17,6 +17,10 @@
"email": "duanshuwen@gogpay.cn" "email": "duanshuwen@gogpay.cn"
}, },
"license": "MIT", "license": "MIT",
"resolutions": {
"node-gyp": "^10.2.0",
"@electron/node-gyp": "npm:node-gyp@^10.2.0"
},
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "^7.10.2", "@electron-forge/cli": "^7.10.2",
"@electron-forge/maker-deb": "^7.10.2", "@electron-forge/maker-deb": "^7.10.2",
@@ -48,5 +52,6 @@
"pinia": "^2.3.1", "pinia": "^2.3.1",
"vue": "^3.5.22", "vue": "^3.5.22",
"vue-router": "^4.5.1" "vue-router": "^4.5.1"
} },
"packageManager": "yarn@4.11.0+sha512.4e54aeace9141df2f0177c266b05ec50dc044638157dae128c471ba65994ac802122d7ab35bcd9e81641228b7dcf24867d28e750e0bcae8a05277d600008ad54"
} }

View File

@@ -17,8 +17,8 @@ const createWindow = () => {
width: 900, width: 900,
height: 670, height: 670,
autoHideMenuBar: true, autoHideMenuBar: true,
// frame: false, frame: false,
// windowButtonVisibility: false, windowButtonVisibility: false,
resizable: true, resizable: true,
maximizable: true, maximizable: true,
minimizable: true, minimizable: true,
@@ -61,9 +61,9 @@ const createWindow = () => {
mainWindow.webContents.openDevTools(); mainWindow.webContents.openDevTools();
} }
const tabs = new TabManager(mainWindow) // const tabs = new TabManager(mainWindow)
registerTabIpc(tabs) // registerTabIpc(tabs)
tabs.create('about:blank') // tabs.create('about:blank')
}; };
// This method will be called when Electron has finished // This method will be called when Electron has finished

View File

@@ -10,6 +10,7 @@ const routes = [
path: "/browser", path: "/browser",
name: "Browser", name: "Browser",
component: () => import("@/views/browser/BrowserLayout.vue"), component: () => import("@/views/browser/BrowserLayout.vue"),
meta: { requiresAuth: true },
}, },
{ {
path: "/about", path: "/about",
@@ -23,4 +24,17 @@ const router = createRouter({
routes, routes,
}); });
router.beforeEach((to, _from, next) => {
const token = localStorage.getItem("token");
if (to.meta && (to.meta as any).requiresAuth && !token) {
next({ path: "/" });
return;
}
if (to.path === "/" && token) {
next({ path: "/browser" });
return;
}
next();
});
export default router; export default router;

View File

@@ -8,6 +8,10 @@ const instance = axios.create({
// 添加拦截器 // 添加拦截器
instance.interceptors.request.use( instance.interceptors.request.use(
(config) => { (config) => {
const token = localStorage.getItem('token')
if (token) {
config.headers = { ...(config.headers || {}), Authorization: `Bearer ${token}` }
}
return config return config
}, },
(error) => { (error) => {
@@ -21,6 +25,10 @@ instance.interceptors.response.use(
return response.data return response.data
}, },
(error) => { (error) => {
if (error && error.response && error.response.status === 401) {
try { localStorage.removeItem('token') } catch {}
if (typeof window !== 'undefined') window.location.href = '/'
}
return Promise.reject(error) return Promise.reject(error)
} }
) )

View File

@@ -37,10 +37,6 @@
placeholder="请输入密码" placeholder="请输入密码"
@keyup.enter="onSubmit" @keyup.enter="onSubmit"
/> />
<button
class="px-3 py-2 text-sm border rounded bg-gray-100 hover:bg-gray-200"
@click="togglePassword"
>{{ showPwd ? '隐藏' : '显示' }}</button>
</div> </div>
<p v-if="errors.password" class="mt-1 text-xs text-red-500">{{ errors.password }}</p> <p v-if="errors.password" class="mt-1 text-xs text-red-500">{{ errors.password }}</p>
</div> </div>
@@ -58,6 +54,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from "vue"; import { ref, reactive } from "vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { login as apiLogin } from "@/api/login";
const router = useRouter(); const router = useRouter();
const form = reactive({ account: "", password: "" }); const form = reactive({ account: "", password: "" });
@@ -81,17 +78,16 @@ const recalc = () => {
valid.value = validate(); valid.value = validate();
}; };
const togglePassword = () => {
showPwd.value = !showPwd.value;
};
const onSubmit = async () => { const onSubmit = async () => {
recalc(); recalc();
if (!valid.value || loading.value) return; if (!valid.value || loading.value) return;
loading.value = true; loading.value = true;
try { try {
await new Promise((r) => setTimeout(r, 600)); const res: any = await apiLogin({ account: form.account, password: form.password });
router.push("/"); const token = res && (res.token || res.data?.token || res.access_token);
if (!token) throw new Error("登录失败");
localStorage.setItem("token", token);
router.replace("/browser");
} finally { } finally {
loading.value = false; loading.value = false;
} }

8133
yarn.lock Normal file

File diff suppressed because it is too large Load Diff