This commit is contained in:
zdg 2024-07-30 10:05:35 +08:00
commit f35c6a97b7
6 changed files with 94 additions and 40 deletions

View File

@ -24,8 +24,8 @@ export default defineConfig({
server: { server: {
proxy: { proxy: {
'/dev-api': { '/dev-api': {
target: 'http://27.128.240.72:7865', // target: 'http://27.128.240.72:7865',
// target: 'http://192.168.2.52:7863', target: 'http://192.168.2.52:7863',
changeOrigin: true, changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '') rewrite: (p) => p.replace(/^\/dev-api/, '')
} }

BIN
resources/logo3.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -23,12 +23,15 @@ function createLoginWindow() {
show: false, show: false,
frame: false, frame: false,
autoHideMenuBar: true, autoHideMenuBar: true,
maximizable: false,
resizable: false,
icon: join(__dirname, '../../resources/logo2.ico'), icon: join(__dirname, '../../resources/logo2.ico'),
...(process.platform === 'linux' ? { icon } : {}), ...(process.platform === 'linux' ? { icon } : {}),
webPreferences: { webPreferences: {
preload: join(__dirname, '../preload/index.js'), preload: join(__dirname, '../preload/index.js'),
sandbox: false, sandbox: false,
nodeIntegration: true nodeIntegration: true,
contextIsolation: false, // 沙箱取消
} }
}) })
loginWindow.type = 'login' // 唯一标识 loginWindow.type = 'login' // 唯一标识
@ -50,6 +53,8 @@ function createLoginWindow() {
loginWindow.on('closed', () => { loginWindow.on('closed', () => {
loginWindow = null loginWindow = null
}) })
remote.enable(loginWindow.webContents)
} }
//主窗口 //主窗口
function createMainWindow() { function createMainWindow() {

View File

@ -9,6 +9,10 @@
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import { ElMessageBox } from 'element-plus'
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const { ipcRenderer } = window.electron || {} const { ipcRenderer } = window.electron || {}
const props = defineProps({ const props = defineProps({
@ -30,7 +34,18 @@ const maximizeWindow = () => {
} }
// //
const closeWindow = () => { const closeWindow = () => {
ipcRenderer?.send('close-window') ElMessageBox.confirm('确认退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
userStore.logOut().then(() => {
ipcRenderer && ipcRenderer.send('close-window')
}).catch(()=>{
ipcRenderer && ipcRenderer.send('close-window')
})
}).catch(() => { });
} }
</script> </script>

View File

@ -95,7 +95,7 @@ function handleCommand(command) {
} }
function logout() { function logout() {
ElMessageBox.confirm('确认退出系统', '提示', { ElMessageBox.confirm('确认退出系统吗?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'

View File

@ -14,18 +14,11 @@
<el-input v-model.trim="loginForm.username" placeholder="请输入用户名" /> <el-input v-model.trim="loginForm.username" placeholder="请输入用户名" />
</el-form-item> </el-form-item>
<el-form-item prop="password" style="margin-bottom: 15px"> <el-form-item prop="password" style="margin-bottom: 15px">
<el-input <el-input v-model="loginForm.password" autocomplete="on" type="password" placeholder="请输入密码" />
v-model="loginForm.password"
autocomplete="on"
type="password"
placeholder="请输入密码"
/>
</el-form-item> </el-form-item>
<el-checkbox class="flex mb-5" v-model="loginForm.rememberMe">记住密码</el-checkbox> <el-checkbox class="flex mb-5" v-model="loginForm.rememberMe">记住密码</el-checkbox>
<el-form-item> <el-form-item>
<el-button :loading="btnLoading" class="btn" type="primary" @click="submitForm(formRef)" <el-button :loading="btnLoading" class="btn" type="primary" @click="submitForm(formRef)">登录</el-button>
>登录</el-button
>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -42,6 +35,8 @@ import leftBg2 from '@/assets/images/login/left-bg2.png'
import WindowTools from '@/components/window-tools/index.vue' import WindowTools from '@/components/window-tools/index.vue'
import SelectSubject from '@/components/select-subject/index.vue' import SelectSubject from '@/components/select-subject/index.vue'
const { BrowserWindow, session } = require('@electron/remote')
const { ipcRenderer } = window.electron || {} const { ipcRenderer } = window.electron || {}
const formRef = ref() const formRef = ref()
const userStore = useUserStore() const userStore = useUserStore()
@ -59,24 +54,28 @@ const rules = reactive({
password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }] password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }]
}) })
let curWinUrl;
// //
const submitForm = async (formEl) => { const submitForm = async (formEl) => {
if (!formEl) return if (!formEl) return
await formEl.validate(async (valid) => { await formEl.validate(async (valid) => {
if (valid) { if (valid) {
btnLoading.value = true btnLoading.value = true
// cookie // cookie
if (loginForm.rememberMe) { if (loginForm.rememberMe) {
localStorage.setItem('username', loginForm.username) await setCookie('username', loginForm.username)
localStorage.setItem('password', encrypt(loginForm.password)) await setCookie('password', encrypt(loginForm.password))
localStorage.setItem('rememberMe', loginForm.rememberMe) await setCookie('rememberMe', loginForm.rememberMe.toString())
} else { } else {
// //
localStorage.removeItem('username') await session.defaultSession.clearStorageData({
localStorage.removeItem('password') origin: curWinUrl,
localStorage.removeItem('rememberMe') storages: ['cookies']
})
} }
try { try {
await userStore.login(loginForm) await userStore.login(loginForm)
await userStore.getInfo() await userStore.getInfo()
@ -101,16 +100,40 @@ const successEditSubject = ()=>{
ipcRenderer && ipcRenderer.send('openMainWindow') ipcRenderer && ipcRenderer.send('openMainWindow')
} }
const getCookie = () => { const getCookie = async () => {
const username = localStorage.getItem('username') const username = (await getCookieDetail('username'))[0]
const password = localStorage.getItem('password') const password = (await getCookieDetail('password'))[0]
const rememberMe = localStorage.getItem('rememberMe') const rememberMe = (await getCookieDetail('rememberMe'))[0]
loginForm.username = username ? username : loginForm.username loginForm.username = username ? username.value : loginForm.username
loginForm.password = password ? decrypt(password) : loginForm.password loginForm.password = password ? decrypt(password.value) : loginForm.password
loginForm.rememberMe = rememberMe ? Boolean(rememberMe) : false loginForm.rememberMe = rememberMe ? Boolean(rememberMe.value) : false
} }
// cookie
const getCookieDetail = (name) => {
return session.defaultSession.cookies.get({ url: curWinUrl, name })
}
// cookie
const setCookie = (name, value) => {
// 30
let Days = 30;
let times = Math.round(Date.now() / 1000) + Days * 24 * 60 * 60
const cookie = {
url: curWinUrl,
name,
value,
expirationDate: times
}
return session.defaultSession.cookies.set(cookie)
}
onMounted(() => { onMounted(() => {
// URL
curWinUrl = BrowserWindow.getFocusedWindow().webContents.getURL()
getCookie() getCookie()
}) })
</script> </script>
@ -122,9 +145,11 @@ onMounted(()=>{
align-items: center; align-items: center;
justify-content: center; justify-content: center;
-webkit-app-region: drag; -webkit-app-region: drag;
.box-item { .box-item {
width: 444px; width: 444px;
height: 520px; height: 520px;
&.desc { &.desc {
background: #ffffff; background: #ffffff;
border-radius: 12px 0px 0px 12px; border-radius: 12px 0px 0px 12px;
@ -136,14 +161,17 @@ onMounted(()=>{
justify-content: flex-start; justify-content: flex-start;
background-color: #003b94; background-color: #003b94;
} }
&.login { &.login {
background: #ffffff; background: #ffffff;
border-radius: 0px 12px 12px 0px; border-radius: 0px 12px 12px 0px;
padding: 34px 42px; padding: 34px 42px;
position: relative; position: relative;
} }
.welcome { .welcome {
padding-top: 35px; padding-top: 35px;
p { p {
color: #ffffff; color: #ffffff;
line-height: 25px; line-height: 25px;
@ -153,11 +181,13 @@ onMounted(()=>{
font-size: 26px; font-size: 26px;
} }
} }
.welcome-img { .welcome-img {
margin-top: 20px; margin-top: 20px;
width: 350px; width: 350px;
height: 350px; height: 350px;
} }
.login-title { .login-title {
font-size: 20px; font-size: 20px;
text-align: center; text-align: center;
@ -165,8 +195,10 @@ onMounted(()=>{
margin-bottom: 35px; margin-bottom: 35px;
margin-top: 50px; margin-top: 50px;
} }
.login-form { .login-form {
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
.captcha-input { .captcha-input {
width: 60%; width: 60%;
} }
@ -189,18 +221,20 @@ onMounted(()=>{
} }
} }
} }
.header-tool { .header-tool {
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
span { span {
padding: 5px 10px; padding: 5px 10px;
cursor: pointer; cursor: pointer;
} }
} }
.el-form-item { .el-form-item {
margin-bottom: 40px; margin-bottom: 40px;
} }
</style> </style>