feat: 新增登录跳转逻辑
This commit is contained in:
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
10
src/main.ts
10
src/main.ts
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user