Skip to content

Commit

Permalink
代码优化和fix serverList
Browse files Browse the repository at this point in the history
  • Loading branch information
xianyunleo committed Nov 26, 2024
1 parent 3a82ccf commit 1297757
Show file tree
Hide file tree
Showing 11 changed files with 249 additions and 205 deletions.
14 changes: 8 additions & 6 deletions src/renderer/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { isDev, isMacOS, isWindows } from '@/main/utils/utils'
import TitleBar from './components/TitleBar.vue'
import SideBar from './components/SideBar.vue'
import App from '@/main/App'
import { onMounted, provide, reactive, ref, watch } from 'vue'
import { onMounted, ref, watch } from 'vue'
import MessageBox from '@/renderer/utils/MessageBox'
import UserPwdModal from '@/renderer/components/UserPwdModal.vue'
import Software from '@/main/core/software/Software'
Expand All @@ -41,13 +41,15 @@ import { changeLanguageWrapper } from '@/renderer/utils/language'
import SystemExtend from '@/main/utils/SystemExtend'
const store = useMainStore()
store.init()
//操作softwareList和serverList等JS代码,都要等待init完成。
store.init().then(async () => {
const AppService = await import('@/renderer/services/AppService')
AppService.default.storeInitThen()
})
const userPwdModalShow = ref(false)
const setLanguageShow = ref(false)
const serverReactive = reactive({ restartFn: undefined, isRunningFn: undefined })
const call = window.api.call
provide('GlobalProvide', { serverReactive })
const settings = Settings.getAll()
store.changeTheme(settings.ThemeMode, settings.ThemeColor)
Expand All @@ -59,8 +61,8 @@ onMounted(async () => {
await App.checkInstall()
await initOrUpdate()
}
await window.api.callStatic('TrayManage', 'init')
await changeLanguageWrapper(store.settings.Language)
window.api.callStatic('TrayManage', 'init')
changeLanguageWrapper(store.settings.Language)
} catch (error) {
await MessageBox.error(error.message ?? error, t('errorOccurredDuring', [t('initializing')]))
await call('appExit')
Expand Down
44 changes: 7 additions & 37 deletions src/renderer/components/Settings/Timer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@
</template>

<script setup>
import { setInterval } from 'timers'
import { computed, watch, inject, onMounted } from 'vue'
import { computed, watch } from 'vue'
import { useMainStore } from '@/renderer/store'
import { storeToRefs } from 'pinia'
import { mt, t } from '@/renderer/utils/i18n'
import { createAsyncComponent } from '@/renderer/utils/utils'
import Settings from '@/main/Settings'
import TimerService from '@/renderer/services/TimerService'
import { isDev } from '@/main/utils/utils'
function formatUnitLabel(seconds) {
const timeUnits = [
Expand All @@ -52,6 +52,7 @@ function formatUnitLabel(seconds) {
const intervalOptions = computed(() => {
const intervals = [600, 1800, 3600, 7200, 10800, 43200, 86400, 172800, 259200, 604800]
if (isDev) intervals.unshift(10)
return intervals.map((value) => ({
value,
label: formatUnitLabel(value)
Expand All @@ -61,7 +62,6 @@ const intervalOptions = computed(() => {
const ACard = createAsyncComponent(import('ant-design-vue'), 'Card')
const store = useMainStore()
const { serverList } = storeToRefs(store)
const { serverReactive } = inject('GlobalProvide')
const timerServerOptions = computed(() => {
const options = serverList.value.map((item) => {
const name = item.Name
Expand All @@ -71,40 +71,10 @@ const timerServerOptions = computed(() => {
return options
})
onMounted(async () => {
if (serverList?.value?.length > 0 && Settings.get('AutoTimerRestartServer') && Settings.get('AutoTimerServerList')) {
setRestartTimer()
}
})
const restartServer = async () => {
const initServerStatus = async (item) => {
const processList = Settings.get('AutoTimerServerList')
if (processList.length > 0 && processList.includes(item.Name)) serverReactive.restartFn(item.Name)
}
const promiseArray = serverList.value.map((item) => initServerStatus(item))
await Promise.all(promiseArray)
}
// 定时器管理
let restartTimer = null
const setRestartTimer = () => {
if (restartTimer) {
clearInterval(restartTimer)
}
if (store.settings.AutoTimerRestartServer && store.settings.AutoTimerInterval) {
restartTimer = setInterval(() => {
restartServer()
}, store.settings.AutoTimerInterval * 1000)
}
}
// 重设定重启间隔时自动更新定时器
watch(() => store.settings.AutoTimerInterval, setRestartTimer)
watch(() => store.settings.AutoTimerInterval, TimerService.setRestartTimer)
watch(() => store.settings.AutoTimerRestartServer, setRestartTimer)
watch(() => store.settings.AutoTimerRestartServer, TimerService.setRestartTimer)
const AutoTimerServerChange = () => {
store.setSettings('AutoTimerServerList')
Expand All @@ -116,7 +86,7 @@ const changeAutoTimerInterval = () => {
const changeAutoTimerRestartServer = () => {
store.setSettings('AutoTimerRestartServer')
setRestartTimer()
TimerService.setRestartTimer()
}
const disabledTextClass = () => !store.settings.AutoTimerRestartServer ? 'disabled-text' : ''
Expand Down
6 changes: 3 additions & 3 deletions src/renderer/components/Software/PhpExtManager.vue
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,10 @@ import { throttle } from 'throttle-debounce'
import SystemExtend from '@/main/utils/SystemExtend'
import Settings from '@/main/Settings'
import SoftwareExtend from '@/main/core/software/SoftwareExtend'
import ServerService from '@/renderer/services/ServerService'
const AButton = createAsyncComponent(import('ant-design-vue'), 'Button')
const props = defineProps({ show: Boolean, phpVersion: String })
const { serverReactive } = inject('GlobalProvide')
const emit = defineEmits(['update:show'])
const visible = computed({
Expand Down Expand Up @@ -159,8 +159,8 @@ const install = async (item) => {
const extension = Path.GetFileNameWithoutExt(item.fileName)
await Php.addExtension(props.phpVersion, extension, item.isZend)
const phpName = SoftwareExtend.getPhpName(props.phpVersion)
if (Settings.get('AutoStartAndRestartServer') && serverReactive.isRunningFn(phpName)) {
serverReactive.restartFn(phpName)
if (Settings.get('AutoStartAndRestartServer') && ServerService.isRunning(phpName)) {
ServerService.restart(phpName)
}
} else {
result.value = '安装失败😣'
Expand Down
8 changes: 4 additions & 4 deletions src/renderer/components/WebSite/AddWebSiteModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ import Hosts from '@/main/utils/Hosts'
import Settings from '@/main/Settings'
import { mt, t } from '@/renderer/utils/i18n'
import { useMainStore } from '@/renderer/store'
import ServerService from '@/renderer/services/ServerService'
const { search, addModalVisible: visible } = inject('WebsiteProvide')
const wwwPath = GetPath.getWebsiteDir().replaceSlash()
const formRef = ref()
const { serverReactive } = inject('GlobalProvide')
const store = useMainStore()
const phpVersionList = ref([])
const formData = reactive({
Expand Down Expand Up @@ -97,9 +97,9 @@ const addWeb = async (websiteInfo) => {
}
}
if (Settings.get('AutoStartAndRestartServer') && serverReactive.isRunningFn('Nginx')) {
serverReactive.restartFn('Nginx')
if (phpVersion) serverReactive.restartFn(SoftwareExtend.getPhpName(phpVersion))
if (Settings.get('AutoStartAndRestartServer') && ServerService.isRunning('Nginx')) {
ServerService.restart('Nginx')
if (phpVersion) ServerService.restart(SoftwareExtend.getPhpName(phpVersion))
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/renderer/components/WebSite/EditWebSiteModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,16 @@ import SslSetting from '@/renderer/components/WebSite/EditWebSite/SslSetting.vue
import Settings from '@/main/Settings'
import { mt, t } from '@/renderer/utils/i18n'
import SoftwareExtend from '@/main/core/software/SoftwareExtend'
import ServerService from '@/renderer/services/ServerService'
const { serverName, port, editModalVisible: visible } = inject('WebsiteProvide')
const defaultKey = 'basicSetting'
const activeKey = ref(defaultKey)
const { serverReactive } = inject('GlobalProvide')
const editAfter = (phpVersion = '') => {
if (Settings.get('AutoStartAndRestartServer') && serverReactive.isRunningFn('Nginx')) {
serverReactive.restartFn('Nginx')
if (phpVersion) serverReactive.restartFn(SoftwareExtend.getPhpName(phpVersion))
if (Settings.get('AutoStartAndRestartServer') && ServerService.isRunning('Nginx')) {
ServerService.restart('Nginx')
if (phpVersion) ServerService.restart(SoftwareExtend.getPhpName(phpVersion))
}
}
</script>
Expand Down
19 changes: 19 additions & 0 deletions src/renderer/services/AppService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import HomeService from '@/renderer/services/HomeService'
import Settings from '@/main/Settings'
import TimerService from '@/renderer/services/TimerService'
import { StoreInitializedEventName } from '@/renderer/utils/constant'

export default class AppService {
static storeInitThen() {
console.log('Call storeInitThen')
const storeInitializedEvent = new Event(StoreInitializedEventName)
window.dispatchEvent(storeInitializedEvent)

if (Settings.get('AfterOpenAppStartServer')) {
HomeService.oneClickStart()
}
if (Settings.get('AutoTimerRestartServer') && Settings.get('AutoTimerServerList')) {
TimerService.setRestartTimer()
}
}
}
134 changes: 134 additions & 0 deletions src/renderer/services/HomeService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import ServerControl from '@/main/core/ServerControl'
import { sleep } from '@/shared/utils/utils'
import TcpProcess from '@/main/utils/TcpProcess'
import ProcessExtend from '@/main/utils/ProcessExtend'
import { t } from '@/renderer/utils/i18n'
import MessageBox from '@/renderer/utils/MessageBox'
import Settings from '@/main/Settings'
import { watch } from 'vue'
import { useMainStore } from '@/renderer/store'
import { storeToRefs } from 'pinia'
import SoftwareExtend from '@/main/core/software/SoftwareExtend'

const store = useMainStore()
const { serverList } = storeToRefs(store)

export default class HomeService {
static async startServerClick(item) {
if (item.isRunning || item.btnLoading) {
return
}
item.btnLoading = true
try {
if (item.ServerPort) {
if (item.ServerPort == 80) {
await ProcessExtend.killWebServer()
} else {
const pid = await TcpProcess.getPidByPort(item.ServerPort)
if (pid) await ProcessExtend.kill(pid)
}
}

await ServerControl.start(item)
if (!item.unwatch) {
item.unwatch = watch(
() => item.errMsg,
(errMsg) => {
if (errMsg) {
MessageBox.error(errMsg, t('Error starting service!'))
}
}
)
}
} catch (error) {
MessageBox.error(error.message ?? error, t('Error starting service!'))
}
item.btnLoading = false
}

static async stopServerClick(item) {
if (!item.isRunning) {
return
}
item.btnLoading = true
try {
await ServerControl.stop(item)

for (let i = 0; i < 10; i++) {
if (item.isRunning === false) {
break
}
await sleep(500)
item.isRunning = ProcessExtend.pidIsRunning(item.pid)
}
} catch (error) {
MessageBox.error(error.message ?? error, t('Error stopping service!'))
}
item.btnLoading = false
}

static async restartServerClick(item) {
item.btnLoading = true
try {
await ServerControl.stop(item)

for (let i = 0; i < 10; i++) {
if (item.isRunning === false) {
break
}
await sleep(500)
item.isRunning = ProcessExtend.pidIsRunning(item.pid)
}

if (item.isRunning) {
throw new Error(t('The service was not stopped successfully!'))
}

await ServerControl.start(item)
} catch (error) {
MessageBox.error(error.message ?? error, t('Error starting service!'))
}
item.btnLoading = false
}

static async oneClickStart() {
const oneClickServerList = Settings.get('OneClickServerList')
const websitePhpFpmSwitch = oneClickServerList.includes('PHP-FPM')
const requirePhpList = await HomeService.getNginxRequirePhpList()
const doStartServerClick = async (item) => {
if (oneClickServerList.includes(item.Name)) {
HomeService.startServerClick(item)
} else if (item.Name.match(/^PHP-[.\d]+$/) && requirePhpList.includes(item.Name) && websitePhpFpmSwitch) {
//自动判断网站列表的PHP-FPM
HomeService.startServerClick(item)
}
}

for (const item of serverList.value) {
doStartServerClick(item)
}
}

static async oneClickStop() {
const oneClickServerList = Settings.get('OneClickServerList')
const websitePhpFpmSwitch = oneClickServerList.includes('PHP-FPM')
const requirePhpList = await HomeService.getNginxRequirePhpList()
const doStopServerClick = async (item) => {
if (oneClickServerList.includes(item.Name)) {
HomeService.stopServerClick(item)
} else if (item.Name.match(/^PHP-[.\d]+$/) && requirePhpList.includes(item.Name) && websitePhpFpmSwitch) {
//自动判断网站列表的PHP-FPM
HomeService.stopServerClick(item)
}
}

for (const item of serverList.value) {
doStopServerClick(item)
}
}

static async getNginxRequirePhpList() {
const list = await SoftwareExtend.getNginxRequirePhpList()
return list.map((item) => `PHP-${item}`)
}
}
18 changes: 18 additions & 0 deletions src/renderer/services/ServerService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { useMainStore } from '@/renderer/store'
import { storeToRefs } from 'pinia'
import HomeService from '@/renderer/services/HomeService'

const store = useMainStore()
const { serverList } = storeToRefs(store)

export default class ServerService {
static async restart(name) {
const item = serverList.value.find((item) => item.Name === name)
if (item) await HomeService.restartServerClick(item)
}

static isRunning(name) {
const item = serverList.value.find((item) => item.Name === name)
return item && item.isRunning
}
}
Loading

0 comments on commit 1297757

Please sign in to comment.