xy 2 years ago
parent 88a03710eb
commit bb241a6375

@ -0,0 +1,17 @@
arm64:
firstOrDefaultFilePatterns:
- '!**/node_modules'
- '!build{,/**/*}'
- '!build{,/**/*}'
- dist/electron/**/*
- package.json
- '!**/*.{iml,hprof,orig,pyc,pyo,rbc,swp,csproj,sln,suo,xproj,cc,d.ts,mk,a,o,forge-meta,pdb}'
- '!**/._*'
- '!**/electron-builder.{yaml,yml,json,json5,toml,ts}'
- '!**/{.git,.hg,.svn,CVS,RCS,SCCS,__pycache__,.DS_Store,thumbs.db,.gitignore,.gitkeep,.gitattributes,.npmignore,.idea,.vs,.flowconfig,.jshintrc,.eslintrc,.circleci,.yarn-integrity,.yarn-metadata.json,yarn-error.log,yarn.lock,package-lock.json,npm-debug.log,appveyor.yml,.travis.yml,circle.yml,.nyc_output,.husky,.github}'
- '!.yarn{,/**/*}'
- '!.editorconfig'
- '!.yarnrc.yml'
nodeModuleFilePatterns:
- '**/*'
- dist/electron/**/*

@ -0,0 +1,21 @@
import fs from "fs";
import path from "path";
export function readSettingFile () {
try {
const res = fs.readFileSync(path.resolve(__static, "./setting.json"), "utf-8")
global._DefaultSetting = JSON.parse(res)
return JSON.parse(res)
} catch (err) {
throw new Error(err)
}
}
export function writeSettingFile (data) {
try {
fs.writeFileSync(path.resolve(__static, "./setting.json"), data)
return true
} catch (err) {
console.error(err)
return false
}
}

@ -16,4 +16,4 @@ export const loadingURL = process.env.NODE_ENV === 'development' ? `http://local
export const libPath = process.env.libPath
export const remindURL = 'development' ? `http://localhost:${process.env.PORT}/#/remind` : `file://${__dirname}/index.html/#/remind`
//export const adminWebUri = process.env.NODE_ENV === 'development' ? "http://contract-sqhj-test.ali251.langye.net/admin_test/#/" : "http://contract-sqhj.ali251.langye.net/admin/#/"
export const adminWebUri = "http://contract-sqhj-test.ali251.langye.net/admin_test/#/"
export let adminWebUri = "http://contract-sqhj-test.ali251.langye.net/admin_test/#/"

@ -1,5 +1,5 @@
// 这里是定义菜单的地方,详情请查看 https://electronjs.org/docs/api/menu
const { dialog } = require('electron')
const { dialog,app } = require('electron')
const os = require('os')
const version = require('../../../package.json').version
const menu = [
@ -9,6 +9,12 @@ const menu = [
label: '快速重启',
accelerator: 'F5',
role: 'reload'
},{
label: '退出',
accelerator: 'CmdOrCtrl+F4',
click(){
app.quit()
}
}]
},
{
@ -53,11 +59,6 @@ const menu = [
},
{
type: "separator"
},
{
label: '退出',
accelerator: 'CmdOrCtrl+F4',
role: 'close'
}]
function info() {
dialog.showMessageBox({

@ -5,7 +5,9 @@ import { initWindow, initTrayIcon, tray } from './services/windowManager'
import DisableButton from './config/DisableButton'
import electronDevtoolsInstaller, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
import { init } from "./services/notices"
import { readSettingFile } from "./config/SettingFile"
function onAppReady () {
readSettingFile()
initWindow()
initTrayIcon()
init()
@ -30,7 +32,7 @@ app.on('window-all-closed', () => {
tray.destroy();
}
// 所有平台均为所有窗口关闭就退出软件
app.quit()
//app.quit()
})
app.on('browser-window-created', () => {
console.log('window-created')

@ -5,6 +5,7 @@ import downloadFile from './downloadFile'
import Update from './checkupdate'
import { updater } from './HotUpdater'
import { createNotification } from "./notices"
import { writeSettingFile } from "../config/SettingFile"
import {
createAdminWindow,
toggleMainWindowResizable,
@ -22,6 +23,12 @@ import {
export default {
Mainfunc(IsUseSysTitle) {
const allUpdater = new Update();
ipcMain.handle('write-default-setting', async (event, str) => {
return writeSettingFile(str)
})
ipcMain.handle('get-default-setting',async _ => {
return global._DefaultSetting
})
ipcMain.handle('create-notice', async (event, args) => {
const { title,body } = args
createNotification(title,body)

@ -5,6 +5,9 @@ export function init () {
notification = new Notification()
}
export function createNotification(title,body) {
if (!global._DefaultSetting?.isNotice) {
return
}
if (Notification.isSupported()) {
notification.title = title;
notification.body = body;

@ -44,11 +44,11 @@ function createAdminView () {
mainWindow.setBrowserView(adminView)
mainWindow?.webContents.executeJavaScript("window.localStorage.getItem('token')",true).then((token) => {
session.defaultSession.cookies.set({
url: adminWebUri,
url: global._DefaultSetting.adminWebUri,
name: "sqhj_workerbench_web_token",
value: token
}).then(_ => {
adminView.webContents.loadURL(adminWebUri)
adminView.webContents.loadURL(global._DefaultSetting.adminWebUri)
})
})
adminView.webContents.on('dom-ready', () => {
@ -71,7 +71,7 @@ function createAdminView () {
export function setAdminCookie () {
mainWindow?.webContents.executeJavaScript("window.localStorage.getItem('token')",true).then((token) => {
session.defaultSession.cookies.set({
url: adminWebUri,
url: global._DefaultSetting.adminWebUri,
name: "sqhj_workerbench_web_token",
value: token
}).then(_ => {
@ -102,11 +102,11 @@ function createAdminWindow() {
mainWindow?.webContents.executeJavaScript("window.localStorage.getItem('token')",true).then((token) => {
session.defaultSession.cookies.set({
url: adminWebUri,
url: global._DefaultSetting.adminWebUri,
name: "sqhj_workerbench_web_token",
value: token
}).then(_ => {
adminWindow.loadURL(adminWebUri)
adminWindow.loadURL(global._DefaultSetting.adminWebUri)
})
})
@ -127,8 +127,9 @@ function createAdminWindow() {
adminWindow = null
})
}
const iconPath = path.join(__static,"./ico.png")
function initTrayIcon () {
tray = new Tray(path.join(__static,"./ico.png"))
tray = new Tray(iconPath)
tray.setToolTip("江苏省宿迁环境监测中心")
const menu = Menu.buildFromTemplate(menuconfig)
tray.setContextMenu(menu)
@ -136,7 +137,6 @@ function initTrayIcon () {
if (!mainWindow.isVisible()) {
mainWindow.show()
}
mainWindow.webContents.send("to-notice")
})
}
let trayTimer = null;
@ -158,7 +158,11 @@ function setTrayTitle (title) {
if (process.platform === "darwin") {
tray.setTitle(title.toString())
} else {
noticeFlash()
if (Number(title) && Number(title) > 0) {
noticeFlash()
} else {
tray.setImage(iconPath)
}
}
}
function createMainWindow() {
@ -218,10 +222,10 @@ function createMainWindow() {
mainWindow.webContents.send("w-max", false)
})
mainWindow.on('closed', () => {
mainWindow = null
adminView = null
remindWindow = null
app.quit();
// mainWindow = null
// adminView = null
// remindWindow = null
// app.quit();
})
}
function createRemindWindow () {

@ -12,17 +12,14 @@ import CHeader from "./components/title";
import { useNoticeStore } from "@/store/notice";
import { onUnmounted } from "vue";
import { ipcRenderer } from "electron"
import { useRouter } from "@/hooks/use-router"
import { useRouter, useRoute } from "@/hooks/use-router"
const $route = useRoute()
const $router = useRouter()
const noticeStore = useNoticeStore()
noticeStore.startNoticeTimer()
ipcRenderer.on("to-notice",_ => {
$router.push("/notice/index")
})
onUnmounted(() => {
noticeStore.destroyNoticeTimer()
ipcRenderer.removeListener("to-notice")
})
</script>

@ -0,0 +1,2 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1716456836524" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2629" width="200" height="200"><path d="M1017.6 440c-6.4-22.4-25.6-44.8-48-51.2l-16-3.2c-38.4-12.8-72-38.4-94.4-72-22.4-38.4-25.6-78.4-19.2-123.2l6.4-16c6.4-22.4-3.2-51.2-19.2-65.6 0 0-16-12.8-59.2-38.4-41.6-25.6-62.4-32-62.4-32-22.4-6.4-51.2 0-65.6 16l-14.4 12.8C598.4 92.8 556.8 112 512 112c-41.6 0-81.6-19.2-113.6-44.8l-12.8-12.8c-16-16-44.8-25.6-65.6-16 0 0-19.2 6.4-62.4 32-41.6 25.6-59.2 38.4-59.2 38.4C177.6 128 171.2 155.2 177.6 180.8l6.4 16c9.6 38.4 6.4 81.6-19.2 123.2-22.4 38.4-56 62.4-94.4 72l-19.2 3.2c-22.4 6.4-41.6 25.6-48 51.2 0 0-3.2 22.4-3.2 72 0 51.2 3.2 72 3.2 72 6.4 22.4 25.6 44.8 48 51.2l16 3.2c38.4 12.8 72 38.4 94.4 72 22.4 38.4 25.6 78.4 19.2 123.2l-3.2 9.6c-6.4 22.4 3.2 51.2 19.2 65.6 0 0 16 12.8 59.2 38.4 41.6 25.6 62.4 32 62.4 32 22.4 6.4 51.2 0 65.6-16l12.8-12.8c28.8-25.6 68.8-44.8 113.6-44.8 41.6 0 81.6 19.2 113.6 44.8l12.8 12.8c16 16 44.8 25.6 65.6 16 0 0 19.2-6.4 62.4-32 41.6-25.6 59.2-38.4 59.2-38.4 19.2-16 25.6-44.8 19.2-65.6l-6.4-22.4c-9.6-38.4-6.4-81.6 19.2-120 22.4-38.4 56-62.4 94.4-72l16-3.2c22.4-6.4 41.6-25.6 48-51.2 0 0 3.2-22.4 3.2-72 6.4-48 0-68.8 0-68.8zM515.2 678.4c-91.2 0-166.4-72-166.4-166.4s72-166.4 166.4-166.4c91.2 0 166.4 72 166.4 166.4s-75.2 166.4-166.4 166.4z" p-id="2630"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -7,6 +7,7 @@
:collapse="isCollapse"></sidebar-item>
</el-menu>
</scroll-bar>
<SvgIcon class="setting" icon-class="setting" @click.native="toSetting"></SvgIcon>
<svg-icon class="logout" icon-class="logout" @click.native="logout"></svg-icon>
</div>
</template>
@ -21,7 +22,7 @@ import { useAppStore } from "@/store/app"
import { usePermissionStore } from "@/store/permission"
import { constantRouterMap } from "@/router"
import SvgIcon from "@/components/SvgIcon";
import { useRouter } from "@/hooks/use-router";
import { useRouter, useRoute } from "@/hooks/use-router";
import { useUserStore } from "@/store/user"
defineComponent({
name: 'Sidebar'
@ -36,12 +37,17 @@ const isCollapse = computed(() => !sidebarStatus.opened)
const { logOut } = useUserStore()
const router = useRouter()
const route = useRoute()
const logout = async () => {
await ipcRenderer.invoke("hide-admin-view")
logOut().then(() => {
router.push('/login')
})
}
const toSetting = () => {
if (route.path === '/setting' || route.path === '/setting/index') return
router.push('/setting/index')
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.title {
@ -66,6 +72,17 @@ const logout = async () => {
overflow: hidden;
width: 180px;
}
.setting {
color: #fff;
cursor: pointer;
width: 22px;
height: 22px;
transform: translateX(-50%);
position: absolute;
bottom: 94px;
left: 50%;
margin-left: 0!important;
}
.logout {
color: #fff;
cursor: pointer;

@ -6,6 +6,7 @@ import Router from 'vue-router'
import App from './App'
import router from './router'
import { usePermission } from './permission'
// 引用element
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

@ -14,7 +14,20 @@ export const constantRouterMap = [{
component: () => import('@/views/admin/index'),
meta: { title: '总览', icon: 'dashboard', toUrl: '/worker' }
}]
},{
},
// {
// path: '/landing',
// component: Layout,
// children: [
// {
// path: 'index',
// name: 'landing',
// component: () => import('@/components/LandingPage.vue'),
// meta: { title: 'landing', icon: 'addressBook' }
// }
// ]
// },
{
path: '/addressBook',
component: Layout,
children: [
@ -69,7 +82,19 @@ export const constantRouterMap = [{
meta: { title: '图书管理', icon: 'book', toUrl: '/asset' }
}
]
}, {
},{
path: '/setting',
component: Layout,
redirect: '/setting/index',
hidden: true,
children: [
{
path: 'index',
name: 'setting',
component: () => import('@/views/setting')
}
]
}, {
path: '/login',
component: () => import('@/views/login'),
hidden: true

@ -32,10 +32,10 @@ export const useNoticeStore = defineStore({
},
setNewNotices(data) {
if (data instanceof Array) {
this.newNotices = data.filter(item => !(this.notice['notice'].find(old => (old.id === item.id && old.data === item.data))))
this.newNotices = data.filter(item => !(this.notice['notice'].find(old => (old.id === item.id))))
let body = ""
this.newNotices.forEach((item,index) => {
const splitText = getHtmlPlainText(item.remark)
const splitText = item.hasOwnProperty("remark") ? getHtmlPlainText(item.remark) : item.title;
body += (++index).toString() + ". " + splitText
})
if (this.newNotices.length > 0) {
@ -44,13 +44,16 @@ export const useNoticeStore = defineStore({
body
})
}
console.log(body)
}
},
startNoticeTimer () {
if (this.token) {
getNewNotice().then(res => {
this.setNotice('notice', res.list)
ipcRenderer.invoke("set-tray-title", res.list?.length ?? 0)
let totalRes = [...res.contract_list,...res.oa_list]
this.setNewNotices(totalRes)
this.setNotice('notice', totalRes)
ipcRenderer.invoke("set-tray-title", totalRes?.length ?? 0)
})
}
timer = setInterval(() => {
@ -62,9 +65,9 @@ export const useNoticeStore = defineStore({
return
}
let totalRes = [...res.contract_list,...res.oa_list]
this.setNewNotices(totalRes)
this.setNotice('notice', totalRes)
ipcRenderer.invoke("set-tray-title", res.list?.length ?? 0)
this.setNewNotices(res.list)
ipcRenderer.invoke("set-tray-title", totalRes?.length ?? 0)
})
}, 1000 * 5)
},

@ -0,0 +1,8 @@
import { ipcRenderer } from "electron"
export function getDefaultSetting () {
return new Promise((resolve,reject) => {
ipcRenderer.invoke("get-default-setting").then(res => {
resolve(res)
}).catch(err => reject(err))
})
}

@ -3,9 +3,14 @@ import { Message } from 'element-ui'
import { useUserStore } from "@/store/user"
import { useRouter } from "@/hooks/use-router"
let userStore = null;
console.log(process.env.userConfig)
//获取配置文件信息
import { getDefaultSetting } from "@/utils";
const res = await getDefaultSetting()
window.DEFAULTSETTING = res;
const serves = axios.create({
baseURL: process.env.userConfig.VUE_APP_DOMIAN,
baseURL: window.DEFAULTSETTING?.api || process.env.userConfig.VUE_APP_DOMIAN,
timeout: 5000
})
@ -28,9 +33,9 @@ serves.interceptors.response.use(res => {
}
// 设置接受数据之后,做什么处理
if (res.data?.errcode === 40001) {
localStorage.setItem("token", "");
localStorage.setItem("roles", JSON.stringify([]));
localStorage.setItem("name", "");
userStore.logOut()
useRouter().replace('/login')
return Promise.reject("登录失效")
}
// if (res.data.hasOwnProperty('errcode')) {
// Message.error(res.data.errmsg)

@ -81,7 +81,7 @@ import { useRouter } from "@/hooks/use-router";
const userStore = useUserStore()
const validateUsername = (rule, value, callback) => {
if (!isvalidUsername(value)) {
if (!value) {
callback(new Error("请输入正确的用户名"));
} else {
callback();

@ -0,0 +1,64 @@
<template>
<div style="padding: 40px;">
<el-form ref="settingForm" :model="form" label-width="80px">
<el-form-item label="后台访问地址" required prop="adminWebUri">
<el-input v-model="form.adminWebUri"></el-input>
</el-form-item>
<el-form-item label="后台api" required prop="api">
<el-input v-model="form.api" @change="apiChange"></el-input>
</el-form-item>
<el-form-item label="文件上传地址" required prop="uploadApi">
<el-input v-model="form.uploadApi"></el-input>
</el-form-item>
<el-form-item label="通知开启">
<el-switch v-model="form.isNotice"></el-switch>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="saving"></el-button>
<el-button @click="reset"></el-button>
</el-form-item>
</el-form>
</div>
</template>
<script setup>
import { Notification } from "element-ui"
import { ipcRenderer } from 'electron';
import { ref } from 'vue'
import { useRouter } from "@/hooks/use-router"
const settingForm = ref()
const form = ref({
adminWebUri: '',
api: '',
uploadApi: '',
isNotice: ''
})
form.value = JSON.parse(JSON.stringify(window.DEFAULTSETTING))
console.log(form.value)
const reset = () => {
form.value = JSON.parse(JSON.stringify(window.DEFAULTSETTING))
}
const apiChange = e => {
if (e) {
form.value.uploadApi = e + 'api/admin/upload-file'
}
}
const saving = () => {
settingForm.value.validate(valid => {
if (valid) {
ipcRenderer.invoke("write-default-setting",JSON.stringify(form.value)).then(res => {
Notification({
title: "提示",
message: "配置生效需重启应用!",
duration: 3000
})
})
}
})
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1 @@
{"adminWebUri":"http://contract-sqhj-test.ali251.langye.net/admin_test/#/","api":"http://contract-sqhj-test.ali251.langye.net/","uploadApi":"http://contract-sqhj-test.ali251.langye.net/api/admin/upload-file","isNotice":true}
Loading…
Cancel
Save