From 269bdd023cfd9ba3eefd27a4791e42c9403bbabf Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Sun, 29 Sep 2024 11:01:12 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=89=93=E5=BC=80?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=98=AF=E5=90=A6=E8=87=AA=E5=8A=A8=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=88=A4=E6=96=AD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index 3c752f3..8203424 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -35,7 +35,7 @@ const App: React.FC = () => { useEffect(() => { let userInfo = JSON.parse(storage.getItem('user') as string) let loginInfo = JSON.parse(storage.getItem('login') as string) - if (userInfo && Number(userInfo.perms)) { + if (userInfo && !userInfo.isAnonymous) { if (loginInfo && loginInfo.isAutoLogin) { PostLogin({ account: loginInfo.account, -- 2.40.1 From 39968c3a7038f1b573032b4eaedcbddb98425e10 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Mon, 30 Sep 2024 11:04:53 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A0=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E6=97=B6=E4=B8=8D=E8=B0=83=E7=94=A8=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/package/agora.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/utils/package/agora.ts b/src/utils/package/agora.ts index 9926355..7819346 100644 --- a/src/utils/package/agora.ts +++ b/src/utils/package/agora.ts @@ -115,15 +115,15 @@ export const agora = { rtcEngine.registerEventHandler({ // 监听本地用户加入频道事件 onJoinChannelSuccess: async (connection: RtcConnection, elapsed: number) => { - await onJoinChannelSuccess(connection, elapsed) + await onJoinChannelSuccess?.(connection, elapsed) }, // 监听远端用户加入频道事件 onUserJoined: async (connection: RtcConnection, remoteUid: number, elapsed: number) => { - await onUserJoined(connection, remoteUid, elapsed) + await onUserJoined?.(connection, remoteUid, elapsed) }, // 监听用户离开频道事件 onUserOffline: async (connection: RtcConnection, remoteUid: number, reason: UserOfflineReasonType) => { - await onUserOffline(connection, remoteUid, reason) + await onUserOffline?.(connection, remoteUid, reason) }, // // 视频发布状态改变回调 // onVideoPublishStateChanged: (source: any, channel: any, oldState: any, newState: any, elapseSinceLastState: any) => { @@ -139,19 +139,19 @@ export const agora = { // }, // // 用户音量提示回调。 onAudioVolumeIndication: async (_connection: RtcConnection, speakers: AudioVolumeInfo[], _speakerNumber: number, _totalVolume: number) => { - await onAudioVolumeIndication(speakers) + await onAudioVolumeIndication?.(speakers) }, //通话中每个用户的网络上下行 last mile 质量报告回调。 onNetworkQuality: async (connection: RtcConnection, remoteUid: number, txQuality: QualityType, rxQuality: QualityType) => { - await onNetworkQuality(connection, remoteUid, txQuality, rxQuality) + await onNetworkQuality?.(connection, remoteUid, txQuality, rxQuality) }, //当前通话相关的统计信息回调。 onRtcStats: async (_connection: RtcConnection, stats: RtcStats) => { - await onRtcStats(stats) + await onRtcStats?.(stats) }, // 网络连接状态已改变回调。 onConnectionStateChanged: async (connection: RtcConnection, state: ConnectionStateType, reason: ConnectionChangedReasonType) => { - await onConnectionStateChanged(connection, state, reason) + await onConnectionStateChanged?.(connection, state, reason) }, }); }, -- 2.40.1 From 55e0bbec3984dffb99e347b964e8bf532570a0ee Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 14:47:20 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=9D=83=E9=99=90=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/Meeting/index.tsx | 83 ++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 16 deletions(-) diff --git a/src/page/Meeting/index.tsx b/src/page/Meeting/index.tsx index 622275d..b064c9b 100644 --- a/src/page/Meeting/index.tsx +++ b/src/page/Meeting/index.tsx @@ -160,6 +160,7 @@ const Meeting: React.FC = () => { const [noViewChatList, setNoViewChatList] = useState(0) const [currentLookUserAccount, setCurrentLookUserAccount] = useState('') const [recorder, setRecorder] = useState('') + const [_currentRequestSpeakType, setCurrentRequestSpeakType] = useState<'video' | 'audio' | ''>('') const [_mediaStream, setMediaStream] = useState('') const [isShare, setIsShare] = useState(null) const [isSharePopConfirm, setIsSharePopConfirm] = useState(false) @@ -413,13 +414,23 @@ const Meeting: React.FC = () => { } } else { if (item.user.uid === userInfo.uid) { - if (!item.user.isRoomManage) { + if (!item.user.isRoomManager) { await agora.allLeaveChannelEx() } message.success(`管理员${item.user.isRoomManager ? '设置' : '取消'}您为发言人`) await agora.updateChannelMediaOptions(item.user.isRoomManager) - await postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) - await postOpenCameraApi(item.user.isRoomManager, userInfo.uid) + setCurrentRequestSpeakType(res => { + if (res === 'video') { + postOpenCameraApi(item.user.isRoomManager, userInfo.uid) + } else if (res === 'audio') { + postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) + } else { + postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) + postOpenCameraApi(item.user.isRoomManager, userInfo.uid) + } + return '' + }) + await stopScreenCapture() } else { message.success(`管理员${item.user.isRoomManager ? '设置' : '取消'}${item.user.userName}为发言人`) @@ -602,6 +613,7 @@ const Meeting: React.FC = () => { if (isClicked) { timer = setTimeout(() => { setIsClicked(false); + setCurrentRequestSpeakType('') }, 10000); } @@ -999,6 +1011,25 @@ const Meeting: React.FC = () => { } // 操作按钮 const changeStatusList = async (row: any, itemIndex: number, rowIndex: number): Promise => { + function requestSpeak() { + confirm({ + title: '提示', + icon: , + content: `该操作需向管理员申请权限`, + centered: true, + okText: '申请', + cancelText: '取消', + async onOk() { + GetApplySpeak(state.channelId).then(res => { + if (res.code === 200) { + message.success('申请发言成功') + } + }) + }, + onCancel() { + } + }) + } const footerListTemplate = [...footerList] setFooterListIndex({ itemIndex, @@ -1046,13 +1077,37 @@ const Meeting: React.FC = () => { await postOpenMicr(false, user.uid) break; case '解除静音': - await postOpenMicr(true, user.uid) + await getUserRoomInfo().then(async (res) => { + if (res) { + await postOpenMicr(true, user.uid) + } else { + if (!isClicked) { + setCurrentRequestSpeakType('audio') + setIsClicked(true); + requestSpeak() + } else { + message.error('申请太频繁了,请稍后重试!'); + } + } + }) break; case '关闭视频': await postOpenCamera(false, user.uid) break; case '开启视频': - await postOpenCamera(true, user.uid) + await getUserRoomInfo().then(async (res) => { + if (res) { + await postOpenCamera(true, user.uid) + } else { + if (!isClicked) { + setCurrentRequestSpeakType('video') + setIsClicked(true); + requestSpeak() + } else { + message.error('申请太频繁了,请稍后重试!'); + } + } + }) break; case '设置': stupWizardRef.current.changeModal() @@ -1141,11 +1196,7 @@ const Meeting: React.FC = () => { case '申请发言': if (!isClicked) { setIsClicked(true); - GetApplySpeak(state.channelId).then(res => { - if (res.code === 200) { - message.success('申请发言成功') - } - }) + requestSpeak() } else { message.error('申请太频繁了,请稍后重试!'); } @@ -2200,12 +2251,12 @@ const Meeting: React.FC = () => { case '申请发言': - if (!role.ID.includes(user.roleId)) { - return
changeStatusList(row, itemIndex, rowIndex)} key={rowIndex}> - - {row.title} -
- } + // if (!role.ID.includes(user.roleId)) { + // return
changeStatusList(row, itemIndex, rowIndex)} key={rowIndex}> + // + // {row.title} + //
+ // } return null case '结束发言': if (!role.ID.includes(user.roleId)) { -- 2.40.1 From 8ce430ac4d64e873fa704c34b434c3ed907afcb1 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 15:20:09 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=A6=81=E6=AD=A2=E6=8B=96=E6=8B=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/styles/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/styles/main.css b/src/utils/styles/main.css index f59645d..7af6dc3 100644 --- a/src/utils/styles/main.css +++ b/src/utils/styles/main.css @@ -14,6 +14,7 @@ body { img { display: block; + -webkit-user-drag: none; } -- 2.40.1 From 6e85e5e3e7837f250e75ea751187c22e1ffc6c11 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 16:11:27 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E5=A4=9A=E7=AA=97=E5=8F=A3=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E5=B9=B6=E6=9C=AA=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 26 ++++++++++++++++++++ preload.js | 4 +++ src/page/ShareScreenWindow/index.module.scss | 5 ++++ src/page/ShareScreenWindow/index.tsx | 19 ++++++++++++++ src/render.d.ts | 1 + 5 files changed, 55 insertions(+) create mode 100644 src/page/ShareScreenWindow/index.module.scss create mode 100644 src/page/ShareScreenWindow/index.tsx diff --git a/main.js b/main.js index 4609203..c192ae1 100644 --- a/main.js +++ b/main.js @@ -17,6 +17,7 @@ const { autoUpdater, CancellationToken } = require('electron-updater'); const cancellationToken = new CancellationToken() app.allowRendererProcessReuse = false; let mainWindow = null; +let childWindow = [] let isMaximized = false; let env; let regKey; @@ -299,6 +300,31 @@ app.on('ready', () => { }) }); }); + // 创建子窗口 + ipcMain.handle('createChildWindow', (event, config) => { + const child = new BrowserWindow({ + parent: mainWindow, + webPreferences: { + contextIsolation: false, + nodeIntegration: true, + enableRemoteModule: true, + nodeIntegrationInWorker: true, + allowMediaDevices: true, + // preload: path.join(__dirname, 'preload.js') + }, + // show: false, + // frame: false, + // backgroundColor: '#00000000', + // transparent: true, + }) + child.loadURL(config.url) + childWindow.push(child) + child.once('ready-to-show', () => { + child.show() + console.log(config); + child.setSize(config.width, config.height) + }) + }); } }); // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 diff --git a/preload.js b/preload.js index 51c897d..adecf8a 100644 --- a/preload.js +++ b/preload.js @@ -73,4 +73,8 @@ window.electron = { setRegistry: (uuid) => { ipcRenderer.invoke('setRegistry', uuid) }, + // 创建子窗口 + createChildWindow: (config) => { + ipcRenderer.invoke('createChildWindow', config) + }, } diff --git a/src/page/ShareScreenWindow/index.module.scss b/src/page/ShareScreenWindow/index.module.scss new file mode 100644 index 0000000..ce5388d --- /dev/null +++ b/src/page/ShareScreenWindow/index.module.scss @@ -0,0 +1,5 @@ +.shareScreenWindow { + background-color: red; + color: red; + font-size: 30px; +} \ No newline at end of file diff --git a/src/page/ShareScreenWindow/index.tsx b/src/page/ShareScreenWindow/index.tsx new file mode 100644 index 0000000..9782e4c --- /dev/null +++ b/src/page/ShareScreenWindow/index.tsx @@ -0,0 +1,19 @@ +import styles from '@/page/Meeting/ShareScreenWindow/index.module.scss' +import { useEffect } from "react"; +const ShareScreenWindow: React.FC = () => { + + useEffect(() => { + + }, []); + + + return ( + <> +
+ 2222 +
+ + ) +} + +export default ShareScreenWindow diff --git a/src/render.d.ts b/src/render.d.ts index 46fb8cb..2a0cc6d 100644 --- a/src/render.d.ts +++ b/src/render.d.ts @@ -18,6 +18,7 @@ export interface IElectronAPI { getVersion: () => Promise; setRegistry: (uuid: string) => any; getRegistry: () => any; + createChildWindow: (config: any) => void; } declare global { -- 2.40.1 From e96528870cda2c8cdadb416283bdf78ac5b29caf Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 16:37:07 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=88=86=E9=A1=B5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.tsx | 2 +- src/page/Home/User/index.tsx | 9 +++++---- src/utils/styles/App.scss | 5 ----- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 2931b2a..9d1d257 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,7 +3,7 @@ import App from './App.tsx' import '@/utils/styles/main.css' import { HashRouter } from 'react-router-dom'; import { ConfigProvider } from 'antd'; -import zhCN from 'antd/locale/zh_CN'; +import zhCN from 'antd/es/locale/zh_CN'; import 'animate.css'; ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/page/Home/User/index.tsx b/src/page/Home/User/index.tsx index 81e3bca..ffc774d 100644 --- a/src/page/Home/User/index.tsx +++ b/src/page/Home/User/index.tsx @@ -42,7 +42,7 @@ const User: React.FC = () => { useEffect(() => { getUserList() - }, [list.pageIndex]); + }, [list.pageIndex, list.pageSize]); const getUserList = async (): Promise => { await GetUserList({ @@ -258,12 +258,13 @@ const User: React.FC = () => {
共{list.total}项数据 - { + { setList({ ...list, - pageIndex: e + pageIndex: page, + pageSize: pageSize }) - }} pageSize={list.pageSize} current={list.pageIndex} hideOnSinglePage={true} /> + }} showSizeChanger pageSize={list.pageSize} current={list.pageIndex} />
diff --git a/src/utils/styles/App.scss b/src/utils/styles/App.scss index eeef848..3b5551f 100644 --- a/src/utils/styles/App.scss +++ b/src/utils/styles/App.scss @@ -189,8 +189,6 @@ $pagination-hover-background-color: #5575F2; .ant-pagination-prev, .ant-pagination-next { - width: 30px !important; - height: 30px !important; border-radius: 50%; background: $pagination-background-color; @@ -200,9 +198,6 @@ $pagination-hover-background-color: #5575F2; } .ant-pagination-item { - width: 30px !important; - height: 30px !important; - line-height: 30px !important; border-radius: 50%; background: $pagination-background-color !important; margin-right: 10px !important; -- 2.40.1 From 61558b0d90f81e057d1617a13d9ed714fd1c927c Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 16:42:05 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/page/Home/User/index.tsx | 2 +- src/page/ShareScreenWindow/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/page/Home/User/index.tsx b/src/page/Home/User/index.tsx index ffc774d..5219e01 100644 --- a/src/page/Home/User/index.tsx +++ b/src/page/Home/User/index.tsx @@ -264,7 +264,7 @@ const User: React.FC = () => { pageIndex: page, pageSize: pageSize }) - }} showSizeChanger pageSize={list.pageSize} current={list.pageIndex} /> + }} showSizeChanger pageSizeOptions={[10, 14, 20, 30, 40, 50, 100]} pageSize={list.pageSize} current={list.pageIndex} /> diff --git a/src/page/ShareScreenWindow/index.tsx b/src/page/ShareScreenWindow/index.tsx index 9782e4c..356d927 100644 --- a/src/page/ShareScreenWindow/index.tsx +++ b/src/page/ShareScreenWindow/index.tsx @@ -1,4 +1,4 @@ -import styles from '@/page/Meeting/ShareScreenWindow/index.module.scss' +import styles from '@/page/ShareScreenWindow/index.module.scss' import { useEffect } from "react"; const ShareScreenWindow: React.FC = () => { @@ -10,7 +10,7 @@ const ShareScreenWindow: React.FC = () => { return ( <>
- 2222 + 2222
) -- 2.40.1 From 4026b79debc1d56c614d139fd5a4badfaa6081c3 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 17:21:35 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=AA=97=E5=8F=A3(?= =?UTF-8?q?=E6=97=A0=E5=BD=B1=E5=93=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 15 +- src/App.tsx | 226 ++++++++++--------- src/page/ShareScreenWindow/index.module.scss | 4 +- src/page/ShareScreenWindow/index.tsx | 7 +- 4 files changed, 131 insertions(+), 121 deletions(-) diff --git a/main.js b/main.js index c192ae1..2dee41b 100644 --- a/main.js +++ b/main.js @@ -17,7 +17,7 @@ const { autoUpdater, CancellationToken } = require('electron-updater'); const cancellationToken = new CancellationToken() app.allowRendererProcessReuse = false; let mainWindow = null; -let childWindow = [] +let childWindow = {} let isMaximized = false; let env; let regKey; @@ -310,18 +310,17 @@ app.on('ready', () => { enableRemoteModule: true, nodeIntegrationInWorker: true, allowMediaDevices: true, - // preload: path.join(__dirname, 'preload.js') + preload: path.join(__dirname, 'preload.js') }, - // show: false, - // frame: false, - // backgroundColor: '#00000000', - // transparent: true, + show: false, + frame: false, + backgroundColor: '#00000000', + transparent: true, }) child.loadURL(config.url) - childWindow.push(child) + childWindow[key] = child child.once('ready-to-show', () => { child.show() - console.log(config); child.setSize(config.width, config.height) }) }); diff --git a/src/App.tsx b/src/App.tsx index 8203424..c6d6195 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -18,6 +18,7 @@ import { agora } from "@/utils/package/agora"; import QuitTips from "@/components/QuitTips"; import { GetLeave } from "@/api/Meeting"; import path from "path"; +import ShareScreenWindow from "./page/ShareScreenWindow"; const fs = require('fs').promises; const { exec } = require('child_process'); const App: React.FC = () => { @@ -32,122 +33,124 @@ const App: React.FC = () => { }); const [spinning, setSpinning] = useState(false); const [isState, setIsState] = useState(true); - useEffect(() => { - let userInfo = JSON.parse(storage.getItem('user') as string) - let loginInfo = JSON.parse(storage.getItem('login') as string) - 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 startSignalr() - } else { - toSrc('/login') - } - }) + if (location.hash.indexOf('shareScreenWindow') == -1) { + useEffect(() => { + let userInfo = JSON.parse(storage.getItem('user') as string) + let loginInfo = JSON.parse(storage.getItem('login') as string) + 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 startSignalr() + } else { + toSrc('/login') + } + }) + } else { + toSrc('/login') + } } else { toSrc('/login') } - } else { - toSrc('/login') - } - window.addEventListener('resize', handleResize); - const originalSetItem = window.localStorage.setItem; - window.localStorage.setItem = function (key, value) { - originalSetItem.call(this, key, value); - const event = new Event('customStorageChange') as any; - event.key = key - event.value = value - window.dispatchEvent(event); - }; - window.addEventListener('customStorageChange', handleCustomStorageChange); - return () => { - window.removeEventListener('resize', handleResize); - window.removeEventListener('customStorageChange', handleCustomStorageChange); - }; - }, []); - useEffect(() => { - window.electron.downFile(async (_e: any, data: any) => { - const response = await fetch(data.filePath); - const arrayBuffer = await response.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - fs.writeFile(`${data.downFilePaths}${data.fileName}`, buffer, {}); - message.success(`下载成功!文件已保存至:${data.downFilePaths}`) - await fs.access(data.downFilePaths, fs.constants.F_OK); - if (process.platform === 'win32') { - exec(`explorer "${data.downFilePaths}"`); - } else if (process.platform === 'darwin') { - exec(`open "${data.downFilePaths}"`); - } - }) - window.electron.onFilePath(async (_e: any, filePath: string, key: string) => { - const setting = await JSON.parse(storage.getItem('setting') as string) - if (key === 'recordingFilesPath') { - setting.recordingFilesPath = filePath - } else { - setting.shareFilesPath = filePath - } - storage.setItem('setting', JSON.stringify(setting)) - }) - window.electron.quitAndInstall(async (_e: any) => { - leaveChannel() - }) - }, []) - useEffect(() => { - window.electron.onUpdate((_e: any, data: any) => { - if (location.hash.indexOf('/meeting') === -1) { - updateModalRef.current.changeModal(data) - } - }) - if (!storage.getItem('setting')) { - storage.setItem('setting', JSON.stringify({ - videoDeviceId: '', //摄像头id - ecordingDeviceId: "", //输入设备id - playBackDeviceId: "", //输出设备id - ecordingVolume: '', //输入音量 - playBackVolume: '', //输出音量 - autoEcordingVolume: true, //是否自动调整麦克风音量 - recordingFilesPath: path.resolve(__dirname, '../../Downloads') + '\\', //本地录制保存路径 - shareFilesPath: path.resolve(__dirname, '../../Downloads/') + '\\', //共享文件保存路径 - isShareSavePath: true, //是否下载钱询问每个文件保存的位置 - closeSetting: 'hide', //关闭按钮设置 - isAINoiseReduction: true, //是否开启ai降噪 - aINoiseReduction: 1, // 降噪模式 - })) - } - }, []) - useEffect(() => { - if (isState) { - setIsState(false) - window.electron.onQuit(async () => { - if (location.hash.indexOf('/login') === 1) { - window.electron.quit() - } else { - if (storage.getItem('isTips') === 'true') { - const setting = JSON.parse(storage.getItem('setting') as string) - if (setting.closeSetting === 'hide') { - window.electron.setViewStatus(setting.closeSetting) - } else { - window.electron.quit() - } - } else { - quitTipsRef.current.changeModal() - } + window.addEventListener('resize', handleResize); + const originalSetItem = window.localStorage.setItem; + window.localStorage.setItem = function (key, value) { + originalSetItem.call(this, key, value); + const event = new Event('customStorageChange') as any; + event.key = key + event.value = value + window.dispatchEvent(event); + }; + window.addEventListener('customStorageChange', handleCustomStorageChange); + return () => { + window.removeEventListener('resize', handleResize); + window.removeEventListener('customStorageChange', handleCustomStorageChange); + }; + }, []); + useEffect(() => { + window.electron.downFile(async (_e: any, data: any) => { + const response = await fetch(data.filePath); + const arrayBuffer = await response.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + fs.writeFile(`${data.downFilePaths}${data.fileName}`, buffer, {}); + message.success(`下载成功!文件已保存至:${data.downFilePaths}`) + await fs.access(data.downFilePaths, fs.constants.F_OK); + if (process.platform === 'win32') { + exec(`explorer "${data.downFilePaths}"`); + } else if (process.platform === 'darwin') { + exec(`open "${data.downFilePaths}"`); } }) - } - storage.setItem('stateInfo', JSON.stringify(state)) - }, [state]) - useEffect(() => { - if (location.href.indexOf('/login') !== -1) { - onStop() - } - }, [navigate]) + window.electron.onFilePath(async (_e: any, filePath: string, key: string) => { + const setting = await JSON.parse(storage.getItem('setting') as string) + if (key === 'recordingFilesPath') { + setting.recordingFilesPath = filePath + } else { + setting.shareFilesPath = filePath + } + storage.setItem('setting', JSON.stringify(setting)) + }) + window.electron.quitAndInstall(async (_e: any) => { + leaveChannel() + }) + }, []) + useEffect(() => { + window.electron.onUpdate((_e: any, data: any) => { + if (location.hash.indexOf('/meeting') === -1) { + updateModalRef.current.changeModal(data) + } + }) + if (!storage.getItem('setting')) { + storage.setItem('setting', JSON.stringify({ + videoDeviceId: '', //摄像头id + ecordingDeviceId: "", //输入设备id + playBackDeviceId: "", //输出设备id + ecordingVolume: '', //输入音量 + playBackVolume: '', //输出音量 + autoEcordingVolume: true, //是否自动调整麦克风音量 + recordingFilesPath: path.resolve(__dirname, '../../Downloads') + '\\', //本地录制保存路径 + shareFilesPath: path.resolve(__dirname, '../../Downloads/') + '\\', //共享文件保存路径 + isShareSavePath: true, //是否下载钱询问每个文件保存的位置 + closeSetting: 'hide', //关闭按钮设置 + isAINoiseReduction: true, //是否开启ai降噪 + aINoiseReduction: 1, // 降噪模式 + })) + } + }, []) + useEffect(() => { + if (isState) { + setIsState(false) + window.electron.onQuit(async () => { + if (location.hash.indexOf('/login') === 1) { + window.electron.quit() + } else { + if (storage.getItem('isTips') === 'true') { + const setting = JSON.parse(storage.getItem('setting') as string) + if (setting.closeSetting === 'hide') { + window.electron.setViewStatus(setting.closeSetting) + } else { + window.electron.quit() + } + } else { + quitTipsRef.current.changeModal() + } + } + }) + } + storage.setItem('stateInfo', JSON.stringify(state)) + }, [state]) + useEffect(() => { + if (location.href.indexOf('/login') !== -1) { + onStop() + } + }, [navigate]) + } useEffect(() => { document.addEventListener('keydown', (event) => { if (event.key === 'F11') { @@ -239,6 +242,7 @@ const App: React.FC = () => { } /> } /> + } /> } /> diff --git a/src/page/ShareScreenWindow/index.module.scss b/src/page/ShareScreenWindow/index.module.scss index ce5388d..5ffb0a4 100644 --- a/src/page/ShareScreenWindow/index.module.scss +++ b/src/page/ShareScreenWindow/index.module.scss @@ -1,5 +1,7 @@ .shareScreenWindow { background-color: red; - color: red; + color: black; + height: 100%; + width: 100%; font-size: 30px; } \ No newline at end of file diff --git a/src/page/ShareScreenWindow/index.tsx b/src/page/ShareScreenWindow/index.tsx index 356d927..17ac999 100644 --- a/src/page/ShareScreenWindow/index.tsx +++ b/src/page/ShareScreenWindow/index.tsx @@ -6,7 +6,12 @@ const ShareScreenWindow: React.FC = () => { }, []); - + // window.electron.createChildWindow({ + // url: location.origin + `/#/shareScreenWindow`, + // width: 600, + // height: 40, + // key: 'shareScreenWindow', + // }) return ( <>
-- 2.40.1 From d3420c98ce33eb74c86e82578970313c644045c5 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 17:26:44 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E4=B8=BA=E4=B8=8D=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InvitingPersonnelModal/index.tsx | 2 +- src/components/SharedFilesModel/index.tsx | 2 +- src/page/Home/Index/index.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/InvitingPersonnelModal/index.tsx b/src/components/InvitingPersonnelModal/index.tsx index 8e55c81..ee8b83f 100644 --- a/src/components/InvitingPersonnelModal/index.tsx +++ b/src/components/InvitingPersonnelModal/index.tsx @@ -158,7 +158,7 @@ const InvitingPersonnelModal = forwardRef((props: any, ref: any) => {
) : 暂无数据} - { + { setList({ ...list, pageIndex: e diff --git a/src/components/SharedFilesModel/index.tsx b/src/components/SharedFilesModel/index.tsx index 7288ff1..4ce71d2 100644 --- a/src/components/SharedFilesModel/index.tsx +++ b/src/components/SharedFilesModel/index.tsx @@ -341,7 +341,7 @@ const SharedFilesModel = forwardRef((props: any, ref: any) => { ...fileList, pageIndex: e }) - }} pageSize={fileList.pageSize} current={fileList.pageIndex} hideOnSinglePage={true} /> + }} pageSize={fileList.pageSize} current={fileList.pageIndex} hideOnSinglePage={true} showSizeChanger={false}/> diff --git a/src/page/Home/Index/index.tsx b/src/page/Home/Index/index.tsx index 349390b..20d95cf 100644 --- a/src/page/Home/Index/index.tsx +++ b/src/page/Home/Index/index.tsx @@ -303,7 +303,7 @@ const Index: React.FC = () => { ...list, pageIndex: e }) - }} pageSize={list.pageSize} /> + }} pageSize={list.pageSize} showSizeChanger={false}/> -- 2.40.1 From ffe669d9015050128deb423901cbfc09f709aeb1 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Thu, 10 Oct 2024 17:32:49 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 2 +- src/page/ShareScreenWindow/index.tsx | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/main.js b/main.js index 2dee41b..0f04457 100644 --- a/main.js +++ b/main.js @@ -318,7 +318,7 @@ app.on('ready', () => { transparent: true, }) child.loadURL(config.url) - childWindow[key] = child + childWindow[config.key] = child child.once('ready-to-show', () => { child.show() child.setSize(config.width, config.height) diff --git a/src/page/ShareScreenWindow/index.tsx b/src/page/ShareScreenWindow/index.tsx index 17ac999..55666e3 100644 --- a/src/page/ShareScreenWindow/index.tsx +++ b/src/page/ShareScreenWindow/index.tsx @@ -5,12 +5,11 @@ const ShareScreenWindow: React.FC = () => { useEffect(() => { }, []); - // window.electron.createChildWindow({ - // url: location.origin + `/#/shareScreenWindow`, - // width: 600, - // height: 40, - // key: 'shareScreenWindow', + // url: location.origin + `/#/shareScreenWindow`, + // width: 600, + // height: 40, + // key: 'shareScreenWindow', // }) return ( <> -- 2.40.1 From c7d6f90174d106d7b034ea6baf9e5c2fe4456a58 Mon Sep 17 00:00:00 2001 From: yj <1336058017@qq.com> Date: Fri, 11 Oct 2024 10:18:40 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E5=AE=A4=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BC=98=E5=8C=96&=E6=96=B0=E5=A2=9E=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=BC=9A=E8=AE=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/Home/Index/index.ts | 6 ++ src/api/Home/User/index.ts | 6 ++ src/page/Home/Index/index.tsx | 132 +++++++++++++++++++++++------ src/page/Meeting/index.module.scss | 6 +- src/page/Meeting/index.tsx | 6 +- 5 files changed, 122 insertions(+), 34 deletions(-) diff --git a/src/api/Home/Index/index.ts b/src/api/Home/Index/index.ts index 4316481..bcb47e7 100644 --- a/src/api/Home/Index/index.ts +++ b/src/api/Home/Index/index.ts @@ -11,6 +11,12 @@ export const PostRoom = (data: any) => method: 'post', data, }) +export const PostRoomInfo = (data: any) => + request({ + url: `/home/room-info`, + method: 'put', + data, + }) export const DeleteRoom = (roomId: string) => request({ url: `/home/room?roomId=${roomId}`, diff --git a/src/api/Home/User/index.ts b/src/api/Home/User/index.ts index a2d9028..2664037 100644 --- a/src/api/Home/User/index.ts +++ b/src/api/Home/User/index.ts @@ -33,6 +33,12 @@ export const PutUserPwd = (data: { id: string, pwd: string }) => data }) +export const GetSubDpList = () => + request({ + url: `/pub/sub-dp-list`, + method: 'get', + }) + export const GetRoleDpList = () => request({ url: `/pub/role-dp-list`, diff --git a/src/page/Home/Index/index.tsx b/src/page/Home/Index/index.tsx index 20d95cf..c50fd46 100644 --- a/src/page/Home/Index/index.tsx +++ b/src/page/Home/Index/index.tsx @@ -1,8 +1,8 @@ import styles from '@/page/Home/Index/index.module.scss' import { useEffect, useState, useRef } from "react"; import Operation from '@/components/Operation'; -import { Button, Input, Modal, Pagination, Empty, message, Popover, Popconfirm, DatePicker } from "antd"; -import { GetRoom, PostRoom, GetCheckoutRoomNum, GetRoomRtcToken, DeleteRoom, GetRecord } from '@/api/Home/Index'; +import { Button, Input, Modal, Pagination, Empty, message, Popover, Popconfirm, DatePicker, Select } from "antd"; +import { GetRoom, PostRoom, GetCheckoutRoomNum, GetRoomRtcToken, DeleteRoom, GetRecord, PostRoomInfo } from '@/api/Home/Index'; import ImageUrl from '@/utils/package/imageUrl' import { ExclamationCircleFilled, ReloadOutlined } from '@ant-design/icons'; import JoinSetting from '@/components/JoinSetting'; @@ -12,6 +12,7 @@ import { useNavigate } from 'react-router-dom'; import { role } from '@/config/role'; import dayjs from 'dayjs'; import StupWizard from '@/components/StupWizard'; +import { GetSubDpList } from '@/api/Home/User'; const fs = require('fs').promises; const { exec } = require('child_process'); const { RangePicker } = DatePicker; @@ -26,15 +27,20 @@ const Index: React.FC = () => { }) const [createRoomModal, setCreateRoomModal] = useState(false) const [timeSelectModal, setTimeSelectModal] = useState(false) - const [createRoomFrom, setCreateRoomFrom] = useState<{ roomName: string, roomNum: string }>({ + const [createRoomFrom, setCreateRoomFrom] = useState<{ id: string, roomName: string, roomNum: string, subject: string, year: string }>({ + id: "", roomName: "", - roomNum: "" + roomNum: "", + subject: "", + year: "" }) const joinSettingRef = useRef(); const stupWizardRef = useRef(); const [user, setUser] = useState({}); const [currentRoomInfo, setCurrentRoomInfo] = useState({}); + const [subjectList, setSubjectList] = useState([]); const [timeData, setTimeData] = useState([]); + const [isCreateRoom, setIsCreateRoom] = useState(false); const userInfo = JSON.parse(storage.getItem('user') as string) useEffect(() => { setUser(userInfo) @@ -62,7 +68,12 @@ const Index: React.FC = () => { setList({ ...list, total: res.data.total, - data: res.data.items, + data: res.data.items.map((item: any) => { + return { + ...item, + open: false + } + }), }) } }) @@ -80,6 +91,13 @@ const Index: React.FC = () => { } }) } + const getSubDpList = async (): Promise => { + await GetSubDpList().then(res => { + if (res.code === 200) { + setSubjectList(res.data.map((item: any) => { return { value: item.value, label: item.name } })) + } + }) + } const getRoomRtcToken = async (roomNum: string, callBack: Function): Promise => { Promise.all([GetRoomRtcToken(roomNum), GetRoomRtcToken(roomNum + 'a')]).then(res => { if (res[0].code === 200 && res[1].code === 200) { @@ -166,8 +184,13 @@ const Index: React.FC = () => { onClick={() => { setCreateRoomFrom({ roomName: "", - roomNum: "" + roomNum: "", + subject: "", + year: "", + id: "", }) + getSubDpList() + setIsCreateRoom(true) setCreateRoomModal(true) }} style={{ marginRight: '22px' }} @@ -234,13 +257,26 @@ const Index: React.FC = () => { okText="确定" cancelText="取消" > -
删除会议室
+
删除会议室
: null} -
{ +
{ changeOpen(index, false) setTimeSelectModal(true) }}>导出参会记录
-
{ +
{ + changeOpen(index, false) + setCreateRoomFrom({ + roomName: item.roomName, + roomNum: item.roomNum, + subject: item.subject, + year: item.year, + id: item.id, + }) + getSubDpList() + setIsCreateRoom(false) + setCreateRoomModal(true) + }}>更新会议信息
+
{ changeOpen(index, false) }}>取消
@@ -298,19 +334,19 @@ const Index: React.FC = () => {
}
- { + { setList({ ...list, pageIndex: e }) - }} pageSize={list.pageSize} showSizeChanger={false}/> + }} pageSize={list.pageSize} showSizeChanger={false} />
- +
- { >获取随机房间号 } - /> + /> : null} { }) }} autoSize /> + { + const regex = /^[0-9]*$/; + if (regex.test(e.target.value)) { + setCreateRoomFrom({ + ...createRoomFrom, + year: e.target.value + }) + } + }} + /> + { }); }} /> -
+
: null}
角色: { }); }} /> +
: null} +
+ 届: + { + const regex = /^[0-9]*$/; + if (regex.test(e.target.value)) { + setAddUserFrom({ + ...addUserFrom, + year: e.target.value + }); + } + }} + /> +
+
+ 学科: +