Skip to content

Commit a5d44ef

Browse files
committed
添加记住密码功能
1 parent 4a8d006 commit a5d44ef

File tree

6 files changed

+347
-111
lines changed

6 files changed

+347
-111
lines changed

dependencies.js

+31-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
const fs = require('fs')
22
const axios = require('axios')
33
const chalk = require('chalk')
4+
const http = require('http')
5+
const https = require('https')
6+
const registryUrl = require('registry-url')
7+
const registryAuthToken = require('registry-auth-token')
8+
9+
const httpAgent = new http.Agent({
10+
keepAlive: true,
11+
maxSockets: 50
12+
})
13+
const httpsAgent = new https.Agent({
14+
keepAlive: true,
15+
maxSockets: 50
16+
})
417

518
/**
619
* 把一个长的并发一步任务转换为
@@ -29,11 +42,25 @@ function parallelToSerial (tasks) {
2942
*/
3043
async function getPackageVersion (pkg, pkgInfo) {
3144
console.log(`get ${pkg} ...`)
45+
const scope = pkg.split('/')[0]
46+
const registry = registryUrl(scope)
47+
const authInfo = registryAuthToken(registry, { recursive: true })
48+
const headers = {
49+
accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
50+
}
51+
52+
if (authInfo) {
53+
headers.authorization = `${authInfo.type} ${authInfo.token}`
54+
}
55+
3256
const time = Date.now()
3357
try {
34-
// 同步最新的包
35-
// await axios.put(`http://npm.uyundev.cn/sync/${pkg}`)
36-
const { data } = await axios.get(`https://registry.npm.taobao.org/${pkg}`)
58+
const { data } = await axios.get(`${encodeURIComponent(pkg).replace(/^%40/, '@')}/latest`, {
59+
baseURL: registry,
60+
headers,
61+
httpAgent,
62+
httpsAgent
63+
})
3764
console.log(
3865
chalk.bgGreen.black(' DONE '),
3966
JSON.stringify(
@@ -47,7 +74,7 @@ async function getPackageVersion (pkg, pkgInfo) {
4774
2
4875
)
4976
)
50-
return data['dist-tags'].latest
77+
return data.version
5178
} catch (e) {
5279
const status = ((e || {}).response || {}).status
5380
console.log(

package.json

+9-6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"dependencies": {
3030
"@babel/runtime": "^7.4.5",
3131
"axios": "^0.18.0",
32+
"electron-store": "^3.2.0",
3233
"electron-updater": "^4.0.6",
3334
"lodash": "^4.17.11",
3435
"normalize.css": "^8.0.1",
@@ -45,17 +46,17 @@
4546
"babel-eslint": "^10.0.1",
4647
"babel-loader": "^8.0.6",
4748
"css-loader": "^2.1.1",
48-
"electron": "^5.0.1",
49-
"electron-builder": "^20.40.2",
49+
"electron": "^5.0.2",
50+
"electron-builder": "^20.41.0",
5051
"electron-debug": "^3.0.0",
5152
"electron-dev-webpack-plugin": "^1.0.4",
5253
"electron-devtools-installer": "^2.2.4",
5354
"eslint": "^5.16.0",
5455
"eslint-config-standard": "^12.0.0",
5556
"eslint-friendly-formatter": "^4.0.1",
5657
"eslint-loader": "^2.1.2",
57-
"eslint-plugin-import": "^2.17.2",
58-
"eslint-plugin-node": "^9.0.1",
58+
"eslint-plugin-import": "^2.17.3",
59+
"eslint-plugin-node": "^9.1.0",
5960
"eslint-plugin-promise": "^4.1.1",
6061
"eslint-plugin-standard": "^4.0.0",
6162
"eslint-plugin-vue": "^5.2.2",
@@ -64,14 +65,16 @@
6465
"html-webpack-plugin": "^3.2.0",
6566
"less": "^3.9.0",
6667
"less-loader": "^5.0.0",
67-
"mini-css-extract-plugin": "^0.6.0",
68+
"mini-css-extract-plugin": "^0.7.0",
6869
"postcss-loader": "^3.0.0",
6970
"pug": "^2.0.3",
7071
"pug-plain-loader": "^1.0.0",
72+
"registry-auth-token": "^3.4.0",
73+
"registry-url": "^5.1.0",
7174
"url-loader": "^1.1.2",
7275
"vue-loader": "^15.7.0",
7376
"vue-template-compiler": "^2.6.10",
74-
"webpack": "^4.32.1",
77+
"webpack": "^4.32.2",
7578
"webpack-cli": "^3.3.2",
7679
"webpack-dev-server": "^3.4.1",
7780
"webpack-merge": "^4.2.1"

src/preload/mainWin/css.less

+3-1
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ ul.dingtalk-window-operations {
8080
&.login-tab {
8181
height: 360px;
8282
}
83+
.password-login .offline-announcement {
84+
top: 310px;
85+
}
8386
}
84-
8587
.ding-modal {
8688
.login-form {
8789
height: 310px;

src/preload/mainWin/index.js

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import open from './open'
22
import download from './download'
33
import openEmail from './openEmail'
4+
import rememberMe from './rememberMe'
45
import winOperation from './winOperation'
56
import notifyMessage from './notifyMessage'
67
import { ipcRenderer, webFrame } from 'electron'
@@ -36,6 +37,10 @@ class MainWinInjector {
3637
* 关闭/最大化/最小化
3738
*/
3839
this.winOperation()
40+
/**
41+
* 检测是否需要插入记住我选项
42+
*/
43+
this.rememberMe()
3944

4045
/**
4146
* 劫持window.open
@@ -76,6 +81,11 @@ class MainWinInjector {
7681
winOperation(this)
7782
}
7883

84+
// 插入记住我选项
85+
rememberMe () {
86+
rememberMe(this)
87+
}
88+
7989
// 消息通知发送到主进程
8090
notifyMessage () {
8191
notifyMessage(this)

src/preload/mainWin/rememberMe.js

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import ElectronStore from 'electron-store'
2+
import debounce from 'lodash/debounce'
3+
const electronStore = new ElectronStore()
4+
5+
export default () => {
6+
const $tab = document.querySelector('.login-form.login-tab .tab-items')
7+
if (!$tab) return
8+
const $tabItems = $tab.querySelectorAll('.tab-item')
9+
$tabItems.forEach(item => {
10+
item.addEventListener('click', () => {
11+
const classList = [...item.classList]
12+
if (item.getAttribute('ui-sref') === '.passwordLogin' && classList.indexOf('current') === -1) {
13+
setTimeout(() => rememberMe(), 100)
14+
}
15+
})
16+
})
17+
rememberMe()
18+
}
19+
20+
const rememberMe = () => {
21+
const $form = document.querySelector('.login-form.login-tab form')
22+
if (!$form) return
23+
const $checkboxContainer = document.createElement('div')
24+
const $checkbox = document.createElement('input')
25+
const $text = document.createTextNode('记住我')
26+
$checkbox.setAttribute('type', 'checkbox')
27+
if (electronStore.get('remember')) {
28+
$checkbox.setAttribute('checked', true)
29+
}
30+
$checkboxContainer.appendChild($checkbox)
31+
$checkboxContainer.appendChild($text)
32+
const $submitBtn = $form.querySelector('button[type="submit"]')
33+
$form.insertBefore($checkboxContainer, $submitBtn)
34+
35+
const $phoneInput = $form.querySelector('phone-input>input')
36+
const $pwdInput = $form.querySelector('input.password')
37+
38+
const rememberMePhone = debounce(() => electronStore.set('phone', $phoneInput.value), 1500)
39+
const rememberMePwd = debounce(() => electronStore.set('pwd', $pwdInput.value), 1500)
40+
const remember = () => {
41+
$phoneInput.removeEventListener('input', rememberMePhone)
42+
$pwdInput.removeEventListener('input', rememberMePwd)
43+
$phoneInput.addEventListener('input', rememberMePhone)
44+
$pwdInput.addEventListener('input', rememberMePwd)
45+
}
46+
const phone = electronStore.get('phone')
47+
const pwd = electronStore.get('pwd')
48+
const $scopePhone = angular.element($phoneInput).scope()
49+
const $scopePwd = angular.element($pwdInput).scope()
50+
51+
if (phone) {
52+
$scopePhone.$apply(() => {
53+
$scopePhone.phoneInput.telephone = $scopePhone.phone = $phoneInput.value = phone
54+
$scopePhone.phoneInput.triggerChange()
55+
})
56+
$scopePwd.$apply(() => {
57+
$scopePwd.passwordLogin.telephone = phone
58+
})
59+
}
60+
61+
if (pwd) {
62+
$scopePwd.$apply(() => {
63+
$scopePwd.passwordLogin.password = $pwdInput.value = pwd
64+
$scopePwd.passwordLogin.submitable = true
65+
})
66+
}
67+
68+
// 保存密码
69+
if ($checkbox.checked) {
70+
remember()
71+
rememberMePhone()
72+
rememberMePwd()
73+
}
74+
75+
$checkbox.addEventListener('change', () => {
76+
if ($checkbox.checked) {
77+
remember()
78+
rememberMePhone()
79+
rememberMePwd()
80+
} else {
81+
electronStore.delete('phone')
82+
electronStore.delete('pwd')
83+
}
84+
electronStore.set('remember', !!$checkbox.checked)
85+
})
86+
}

0 commit comments

Comments
 (0)