Skip to content

Commit 15b5008

Browse files
committed
✨ feat: 完善自动登录
1 parent 9accf5d commit 15b5008

File tree

6 files changed

+145
-39
lines changed

6 files changed

+145
-39
lines changed

electron/main/loginWin.ts

Lines changed: 85 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
import { BrowserWindow, MenuItemConstructorOptions, Menu, session, dialog } from "electron";
1+
import {
2+
BrowserWindow,
3+
MenuItemConstructorOptions,
4+
Menu,
5+
session,
6+
dialog,
7+
ipcMain,
8+
} from "electron";
9+
import icon from "../../public/icons/favicon.png?asset";
210

311
const openLoginWin = (mainWin: BrowserWindow) => {
412
const loginSession = session.fromPartition("login-win");
513
const loginWin = new BrowserWindow({
614
parent: mainWin,
15+
title: "登录网易云音乐",
716
width: 1280,
817
height: 800,
918
center: true,
1019
modal: true,
20+
icon,
1121
// resizable: false,
1222
// movable: false,
1323
// minimizable: false,
@@ -20,35 +30,90 @@ const openLoginWin = (mainWin: BrowserWindow) => {
2030
});
2131

2232
// 打开网易云
23-
loginWin.loadURL("https://music.163.com/#/login");
33+
loginWin.loadURL("https://music.163.com/#/my/");
2434

2535
// 阻止新窗口创建
2636
loginWin.webContents.setWindowOpenHandler(() => {
2737
return { action: "deny" };
2838
});
2939

40+
// 登录完成
41+
const loginFinish = async () => {
42+
if (!loginWin) return;
43+
// 获取 Cookie
44+
const cookies = await loginWin.webContents.session.cookies.get({ name: "MUSIC_U" });
45+
if (!cookies?.[0]?.value) {
46+
dialog.showMessageBox({
47+
type: "info",
48+
title: "登录失败",
49+
message: "未查找到登录信息,请重试",
50+
});
51+
return;
52+
}
53+
const value = `MUSIC_U=${cookies[0].value};`;
54+
// 发送回主进程
55+
mainWin?.webContents.send("send-cookies", value);
56+
await loginSession?.clearStorageData();
57+
loginWin.close();
58+
};
59+
60+
// 页面注入
61+
// loginWin.webContents.once("did-finish-load", () => {
62+
// const script = `
63+
// const style = document.createElement('style');
64+
// style.innerHTML = \`
65+
// .login-btn {
66+
// position: fixed;
67+
// left: 0;
68+
// bottom: 0;
69+
// width: 100%;
70+
// height: 80px;
71+
// display: flex;
72+
// align-items: center;
73+
// justify-content: center;
74+
// background-color: #242424;
75+
// z-index: 99999;
76+
// }
77+
78+
// .login-btn span {
79+
// color: white;
80+
// margin-right: 20px;
81+
// }
82+
83+
// .login-btn button {
84+
// border: none;
85+
// outline: none;
86+
// background-color: #c20c0c;
87+
// border-radius: 25px;
88+
// color: white;
89+
// height: 40px;
90+
// padding: 0 20px;
91+
// cursor: pointer;
92+
// }
93+
// \`;
94+
// document.head.appendChild(style);
95+
// const div = document.createElement('div');
96+
// div.className = 'login-btn';
97+
// div.innerHTML = \`
98+
// <span>请在登录成功后点击</span>
99+
// <button>登录完成</button>
100+
// \`;
101+
// div.querySelector('button').addEventListener('click', () => {
102+
// window.electron.ipcRenderer.send("login-success");
103+
// });
104+
// document.body.appendChild(div);
105+
// `;
106+
// loginWin.webContents.executeJavaScript(script);
107+
// });
108+
109+
// 监听事件
110+
ipcMain.on("login-success", loginFinish);
111+
30112
// 菜单栏
31113
const menuTemplate: MenuItemConstructorOptions[] = [
32114
{
33115
label: "登录完成",
34-
click: async () => {
35-
if (!loginWin) return;
36-
// 获取 Cookie
37-
const cookies = await loginWin.webContents.session.cookies.get({ name: "MUSIC_U" });
38-
if (!cookies?.[0]?.value) {
39-
dialog.showMessageBox({
40-
type: "info",
41-
title: "登录失败",
42-
message: "未查找到登录信息,请重试",
43-
});
44-
return;
45-
}
46-
const value = `MUSIC_U=${cookies[0].value};`;
47-
// 发送回主进程
48-
mainWin?.webContents.send("send-cookies", value);
49-
await loginSession?.clearStorageData();
50-
loginWin.close();
51-
},
116+
click: loginFinish,
52117
},
53118
];
54119
const menu = Menu.buildFromTemplate(menuTemplate);

src/components/Modal/Login/LoginCookie.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,14 @@ const cookie = ref<string>();
3535
3636
// 开启窗口
3737
const openWeb = () => {
38-
window.electron.ipcRenderer.send("open-login-web");
38+
window.$dialog.info({
39+
title: "使用前告知",
40+
content:
41+
"请知悉,该功能仍旧无法确保账号的安全性!请自行决定是否使用!如遇打开窗口后页面出现白屏或者无法点击等情况,请关闭后再试。在登录完成后,请点击菜单栏中的 “登录完成” 按钮以完成登录( 通常位于窗口的左上角,macOS 位于顶部的全局菜单栏中 )",
42+
positiveText: "我已了解",
43+
negativeText: "取消",
44+
onPositiveClick: () => window.electron.ipcRenderer.send("open-login-web"),
45+
});
3946
};
4047
4148
// Cookie 登录
@@ -44,8 +51,11 @@ const login = async () => {
4451
window.$message.warning("请输入 Cookie");
4552
return;
4653
}
54+
cookie.value = cookie.value.trim();
55+
console.log(cookie.value.endsWith(";"));
56+
4757
// 是否为有效 Cookie
48-
if (!cookie.value.includes("MUSIC_U") || cookie.value.endsWith(";")) {
58+
if (!cookie.value.includes("MUSIC_U") || !cookie.value.endsWith(";")) {
4959
window.$message.warning("请输入有效的 Cookie");
5060
return;
5161
}

src/components/Setting/AboutSetting.vue

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@
1010
{{ packageJson.version }}
1111
</n-tag>
1212
</n-flex>
13-
<n-button type="primary" strong secondary @click="checkUpdate"> 检查更新 </n-button>
13+
<n-button
14+
:loading="statusStore.updateCheck"
15+
type="primary"
16+
strong
17+
secondary
18+
@click="checkUpdate"
19+
>
20+
{{ statusStore.updateCheck ? "检查更新中" : "检查更新" }}
21+
</n-button>
1422
</n-card>
1523
<n-collapse-transition :show="!!updateData">
1624
<n-card class="set-item update-data">
@@ -73,8 +81,11 @@
7381
import type { UpdateLogType } from "@/types/main";
7482
import { getUpdateLog, isElectron, openLink } from "@/utils/helper";
7583
import { debounce } from "lodash-es";
84+
import { useStatusStore } from "@/stores";
7685
import packageJson from "@/../package.json";
7786
87+
const statusStore = useStatusStore();
88+
7889
// 社区数据
7990
const communityData = [
8091
{
@@ -102,18 +113,18 @@ const oldVersion = computed<UpdateLogType[]>(() => {
102113
});
103114
104115
// 检查更新
105-
const checkUpdate = debounce(() => {
106-
if (!isElectron) {
107-
window.open(packageJson.github + "/releases", "_blank");
108-
return;
109-
}
110-
window.$notification.info({
111-
title: "检查更新",
112-
content: "正在检查更新,请稍后...",
113-
duration: 3000,
114-
});
115-
window.electron.ipcRenderer.send("check-update", true);
116-
}, 300);
116+
const checkUpdate = debounce(
117+
() => {
118+
if (!isElectron) {
119+
window.open(packageJson.github + "/releases", "_blank");
120+
return;
121+
}
122+
statusStore.updateCheck = true;
123+
window.electron.ipcRenderer.send("check-update", true);
124+
},
125+
300,
126+
{ leading: true, trailing: false },
127+
);
117128
118129
// 获取更新日志
119130
const getUpdateData = async () => (updateData.value = await getUpdateLog());

src/components/Setting/GeneralSetting.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,13 @@
142142
<n-text class="name">在线服务</n-text>
143143
<n-text class="tip" :depth="3">是否开启软件的在线服务</n-text>
144144
</div>
145-
<n-switch class="set" :value="useOnlineService" :round="false" @update:value="modeChange" />
145+
<n-switch
146+
class="set"
147+
:disabled="true"
148+
:value="useOnlineService"
149+
:round="false"
150+
@update:value="modeChange"
151+
/>
146152
</n-card>
147153
<n-card class="set-item">
148154
<div class="label">

src/stores/status.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ interface StatusState {
3838
showDesktopLyric: boolean;
3939
showPlayerComment: boolean;
4040
personalFmMode: boolean;
41+
updateCheck: boolean;
4142
}
4243

4344
export const useStatusStore = defineStore("status", {
@@ -99,6 +100,8 @@ export const useStatusStore = defineStore("status", {
99100
showDesktopLyric: false,
100101
// 播放器评论
101102
showPlayerComment: false,
103+
// 更新检查
104+
updateCheck: false,
102105
}),
103106
getters: {
104107
// 播放音量图标

src/utils/initIpc.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { isElectron } from "./helper";
22
import { openUpdateApp } from "./modal";
3-
import { useMusicStore, useDataStore } from "@/stores";
4-
import player from "./player";
3+
import { useMusicStore, useDataStore, useStatusStore } from "@/stores";
54
import { toLikeSong } from "./auth";
5+
import player from "./player";
6+
7+
// 关闭更新状态
8+
const closeUpdateStatus = () => {
9+
const statusStore = useStatusStore();
10+
statusStore.updateCheck = false;
11+
};
612

713
// 全局 IPC 事件
814
const initIpc = () => {
@@ -35,13 +41,18 @@ const initIpc = () => {
3541
window.electron.ipcRenderer.on("closeDesktopLyric", () => player.toggleDesktopLyric());
3642
// 无更新
3743
window.electron.ipcRenderer.on("update-not-available", () => {
44+
closeUpdateStatus();
3845
window.$message.success("当前已是最新版本");
3946
});
4047
// 有更新
41-
window.electron.ipcRenderer.on("update-available", (_, info) => openUpdateApp(info));
48+
window.electron.ipcRenderer.on("update-available", (_, info) => {
49+
closeUpdateStatus();
50+
openUpdateApp(info);
51+
});
4252
// 更新错误
4353
window.electron.ipcRenderer.on("update-error", (_, error) => {
4454
console.error("Error updating:", error);
55+
closeUpdateStatus();
4556
window.$message.error("更新过程出现错误");
4657
});
4758
} catch (error) {

0 commit comments

Comments
 (0)