From 67682defa85f54596d49d7fbc85919827edacd2d Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Mon, 24 Feb 2025 15:47:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E8=B4=A6=E5=8F=B7=E5=B7=B2?= =?UTF-8?q?=E5=9C=A8=E5=85=B6=E4=BB=96=E5=9C=B0=E6=96=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E5=BC=B9=E7=AA=97=E6=98=AF=E5=90=A6=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E7=99=BB=E5=BD=95&=E5=85=A8=E5=91=98=E8=A7=82=E7=9C=8B-?= =?UTF-8?q?=E6=B4=BB=E8=B7=83=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 52 +++++++++++++++++++++-------- src/api/Login/index.ts | 6 ++++ src/components/StupWizard/index.tsx | 29 ++++++++++++++++ src/page/Login/index.tsx | 31 +++++++++++++++-- src/utils/package/agora.ts | 5 ++- src/utils/package/public.ts | 1 + 6 files changed, 108 insertions(+), 16 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 3426a4f..412caa1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,11 +8,11 @@ import Login from '@/page/Login/index' import Meeting from '@/page/Meeting/index' import NotFound from '@/page/NotFound/index' import { storage } from '@/utils' -import { message, Spin } from "antd"; +import { message, Modal, Spin } from "antd"; import JoinMeetingModal from "@/components/JoinMeetingModal"; import UpdateModal from "@/components/UpdateModal"; import * as CryptoJS from 'crypto-js'; -import { PostLogin } from "@/api/Login"; +import { GetCheckOnline, PostLogin } from "@/api/Login"; import { agora } from "@/utils/package/agora"; import QuitTips from "@/components/QuitTips"; import { GetLeave } from "@/api/Meeting"; @@ -22,6 +22,8 @@ import ChatSmallWindow from "@/page/Meeting/ChatSmallWindow"; import ChatBigWindow from "@/page/Meeting/ChatBigWindow"; import NoticeWindow from "@/page/Meeting/NoticeWindow"; import { getKeyOpenChildWindow, getTitle, setKeyOpenChildWindow, storageSeeting } from "./utils/package/public"; +import { ExclamationCircleFilled } from "@ant-design/icons"; +const { confirm } = Modal; const fs = require('fs').promises; const { exec } = require('child_process'); const App: React.FC = () => { @@ -41,20 +43,44 @@ const App: React.FC = () => { useEffect(() => { let userInfo = JSON.parse(storage.getItem('user') as string) let loginInfo = JSON.parse(storage.getItem('login') as string) + const login = () => { + PostLogin({ + account: loginInfo.account, + pwd: CryptoJS.MD5(loginInfo.password).toString(CryptoJS.enc.Hex) + }).then(async (res) => { + if (res.code === 200) { + storage.setItem('user', JSON.stringify(res.data)) + storage.setItem('userLogin', true) + toSrc('/home') + await window.electron.startSignalr(res.data) + } else { + toSrc('/login') + } + }) + } window.electron.setEnv(import.meta.env.VITE_ENV); if (userInfo && !userInfo.isAnonymous) { if (loginInfo && loginInfo.isAutoLogin) { - PostLogin({ - account: loginInfo.account, - pwd: CryptoJS.MD5(loginInfo.password).toString(CryptoJS.enc.Hex) - }).then(async (res) => { - if (res.code === 200) { - storage.setItem('user', JSON.stringify(res.data)) - storage.setItem('userLogin', true) - toSrc('/home') - await window.electron.startSignalr(res.data) - } else { - toSrc('/login') + GetCheckOnline(loginInfo.account).then(req => { + if (req.code === 200) { + if (req.data) { + confirm({ + title: '提示', + icon: , + content: `账号已在其他地方登录,是否强制登陆?`, + centered: true, + okText: '确定', + cancelText: '取消', + async onOk() { + login() + }, + onCancel() { + + } + }) + } else { + login() + } } }) } else { diff --git a/src/api/Login/index.ts b/src/api/Login/index.ts index ce1a034..b7356c1 100644 --- a/src/api/Login/index.ts +++ b/src/api/Login/index.ts @@ -22,4 +22,10 @@ export const PostAnonLogin = (data: any) => url: `/auth/anon-login`, method: 'post', data, + }) + +export const GetCheckOnline = (account: string) => + request({ + url: `/auth/check-online?account=${account}`, + method: 'get' }) \ No newline at end of file diff --git a/src/components/StupWizard/index.tsx b/src/components/StupWizard/index.tsx index 203d87a..63d8d81 100644 --- a/src/components/StupWizard/index.tsx +++ b/src/components/StupWizard/index.tsx @@ -133,9 +133,11 @@ const StupWizard = forwardRef((_props: any, ref: any) => { }) const CurrencyComponents = () => { const [optionsValue, setOperationValue] = useState<'hide' | 'quit'>('hide'); + const [voiceStimulation, setVoiceStimulation] = useState(true); const setting = JSON.parse(storage.getItem('setting') as string) useEffect(() => { setOperationValue(setting.closeSetting) + setVoiceStimulation(setting.voiceStimulation) }, []); return ( <> @@ -154,6 +156,33 @@ const CurrencyComponents = () => { 不退出程序,最小化到托盘 +
+ 语音激励 + 开启语音激励后,会优先显示正在说话的与会成员。 + + } + title="" + > + + + { + setting.voiceStimulation = e.target.value; + storage.setItem('setting', JSON.stringify(setting)) + setVoiceStimulation(e.target.value) + }} style={{ flexShrink: 0, margin: '10px 0' }} value={voiceStimulation}> + 开启 + 关闭 + +
diff --git a/src/page/Login/index.tsx b/src/page/Login/index.tsx index 2fb463b..17511fa 100644 --- a/src/page/Login/index.tsx +++ b/src/page/Login/index.tsx @@ -4,11 +4,13 @@ import { useEffect, useState } from "react"; import { useNavigate } from 'react-router-dom'; import { Input, Button, Checkbox, message, Modal } from "antd" import { storage } from '@/utils' -import { GetCheckUser, PostAnonLogin, PostLogin } from '@/api/Login' +import { GetCheckOnline, GetCheckUser, PostAnonLogin, PostLogin } from '@/api/Login' import * as CryptoJS from 'crypto-js'; import ImageUrl from '@/utils/package/imageUrl' import { v4 as uuidv4 } from 'uuid'; import { GetCheckoutRoomNum, GetRoomInfo, GetRoomRtcToken } from '@/api/Home/Index'; +import { ExclamationCircleFilled } from '@ant-design/icons'; +const { confirm } = Modal; const Login: React.FC = () => { const navigate = useNavigate(); const [accountPasswordStatus, setAccountPasswordStatus] = useState(false); @@ -100,7 +102,32 @@ const Login: React.FC = () => { } GetCheckUser(operation.account).then(res => { if (res.code === 200) { - res.data ? setAccountPasswordStatus(true) : message.error('账号不存在!') + if (res.data) { + GetCheckOnline(operation.account).then(req => { + if (req.code === 200) { + if (req.data) { + confirm({ + title: '提示', + icon: , + content: `账号已在其他地方登录,是否强制登陆?`, + centered: true, + okText: '确定', + cancelText: '取消', + async onOk() { + setAccountPasswordStatus(true) + }, + onCancel() { + + } + }) + } else { + setAccountPasswordStatus(true) + } + } + }) + } else { + message.error('账号不存在!') + } } }) } diff --git a/src/utils/package/agora.ts b/src/utils/package/agora.ts index 2ade1f3..c2f33a5 100644 --- a/src/utils/package/agora.ts +++ b/src/utils/package/agora.ts @@ -200,7 +200,10 @@ export const agora = { }, // 监测到远端最活跃用户回调。 onActiveSpeaker: (connection: RtcConnection, uid: number) => { - onActiveSpeaker?.(connection, uid) + const setting = JSON.parse(storage.getItem('setting') as string); + if (setting.voiceStimulation) { + onActiveSpeaker?.(connection, uid) + } } }); }, diff --git a/src/utils/package/public.ts b/src/utils/package/public.ts index 2e49f9d..35e1e85 100644 --- a/src/utils/package/public.ts +++ b/src/utils/package/public.ts @@ -27,6 +27,7 @@ export const storageSeeting: any = { shareFilesPath: path.resolve(__dirname, '../../Downloads/') + '\\', //共享文件保存路径 isShareSavePath: true, //是否下载钱询问每个文件保存的位置 closeSetting: 'hide', //关闭按钮设置 + voiceStimulation: true, //语音激励 isAINoiseReduction: true, //是否开启ai降噪 aINoiseReduction: 1, // 降噪模式 isRecordingTips: true, //是否开启录制提示