| | |
| | | if (BrowserWindow.getAllWindows().length === 0) |
| | | createWindow(); |
| | | }); |
| | | ipcMain.on("open-new-window", () => { |
| | | ipcMain.on("open-new-window", (event, meet) => { |
| | | const { meetName, id } = JSON.parse(meet); |
| | | const childWin = new BrowserWindow({ |
| | | width, |
| | | height, |
| | |
| | | }); |
| | | childWin.maximize(); |
| | | if (process.env.VITE_DEV_SERVER_URL) { |
| | | childWin.loadURL(process.env.VITE_DEV_SERVER_URL + "#/meet"); |
| | | childWin.loadURL(process.env.VITE_DEV_SERVER_URL + `#/meet?meetName=${meetName}&id=${id}`); |
| | | } else { |
| | | childWin.loadFile(join(__dirname, "../dist/index.html"), { |
| | | hash: "/meet" |
| | | hash: "/meet", |
| | | query: { |
| | | meetName, |
| | | id |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | |
| | | "version": "0.0.0", |
| | | "main": "./src/background.js", |
| | | "scripts": { |
| | | "dev": "vite", |
| | | "dev": "chcp 65001 && vite", |
| | | "build": "vite build", |
| | | "preview": "vite preview", |
| | | "electron:dev": "vite && electron" |
| | |
| | | // response拦截器 |
| | | service.interceptors.response.use( |
| | | (response) => { |
| | | if (response.status === 200 && response.data.code === 200) return Promise.resolve(response.data); |
| | | if (response.status === 200 && response.data.code === 1) return Promise.resolve(response.data); |
| | | else return Promise.reject(response.data); |
| | | }, |
| | | (error) => { |
| | |
| | | |
| | | export const getExamInfo = () => { |
| | | return service.get('/api/v1/getExamInfo'); |
| | | } |
| | | |
| | | export const getExamListV2 = (postData = {examName: ''}) => { |
| | | return service.post('/api/student/exam/page',postData); |
| | | } |
New file |
| | |
| | | import service from "@/api"; |
| | | |
| | | |
| | | export const getMeetList = (getData = {meetName: '', status: ''}) => { |
| | | return service.get('/api/student/meet/page', {params: getData}); |
| | | }; |
| | |
| | | |
| | | |
| | | export const login = (postData = {}) => { |
| | | console.log(postData); |
| | | return service.post('/api/user/login', postData); |
| | | } |
| | |
| | | // src-electron/main.js |
| | | const { app, BrowserWindow, screen, globalShortcut, ipcMain } = require('electron'); |
| | | const { join } = require('path'); |
| | | |
| | |
| | | }); |
| | | |
| | | // 监听打开新窗口 |
| | | ipcMain.on('open-new-window', () => { |
| | | ipcMain.on('open-new-window', (event, meet) => { |
| | | const { meetName, id } = JSON.parse(meet); |
| | | const childWin = new BrowserWindow({ |
| | | width: width, |
| | | height: height, |
| | |
| | | childWin.maximize(); |
| | | // development模式 |
| | | if (process.env.VITE_DEV_SERVER_URL) { |
| | | childWin.loadURL(process.env.VITE_DEV_SERVER_URL + '#/meet'); |
| | | childWin.loadURL(process.env.VITE_DEV_SERVER_URL + '#/meet?' + `meetName=${meetName}&id=${id}`); |
| | | } else { |
| | | childWin.loadFile(join(__dirname, '../dist/index.html'), { |
| | | hash: '/meet' |
| | | hash: '/meet', |
| | | query: { |
| | | meetName, |
| | | id |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | |
| | | |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | |
| | | import { getExamList } from '@/api/modules/exam.js'; |
| | | import { getExamList,getExamListV2 } from '@/api/modules/exam.js'; |
| | | |
| | | |
| | | const activeName = ref('1'); |
| | |
| | | |
| | | const getData = () => { |
| | | loading.value = true; |
| | | getExamList().then(res => { |
| | | dataList.value = res.data; |
| | | getExamListV2().then(res => { |
| | | // dataList.value = res.data; |
| | | loading.value = false; |
| | | }).catch(err => { |
| | | loading.value = false; |
| | |
| | | const handleLogin = () => { |
| | | loginFormRef.value.validate((valid) => { |
| | | if (valid) { |
| | | router.push('/index'); |
| | | return; |
| | | loading.value = true; |
| | | login({}).then(res => { |
| | | console.log(res); |
| | | login(loginForm).then(res => { |
| | | loading.value = false; |
| | | router.push('/index'); |
| | | }).catch(err => { |
| | | console.log(err); |
| | | loading.value = false; |
| | |
| | | <template> |
| | | <div class="meet-container w-screen h-screen"> |
| | | <div>{{ JSON.stringify(route) }}</div> |
| | | <div id="meet" ref="meet"></div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from 'vue'; |
| | | import {useRoute} from 'vue-router'; |
| | | const route = useRoute(); |
| | | const meet = ref(null); |
| | | |
| | | const {meetName, id} = route.query; |
| | | |
| | | let jitsiApi = null; |
| | | onMounted(() => { |
| | | const width = window.innerWidth; |
| | | const height = window.innerHeight; |
| | | const domain = 'ycl.easyblog.vip:8443'; |
| | | const domain = 'ycl.easyblog.vip:8443/' + id; |
| | | const options = { |
| | | roomName: 'test', |
| | | roomName: meetName, |
| | | width: width, |
| | | height: height, |
| | | parentNode: meet.value, |
| | |
| | | enabled: true |
| | | } |
| | | }, |
| | | toolbarButtons: ['whiteboard'] |
| | | userInfo: { |
| | | displayName: '测试测试' |
| | | } |
| | | }; |
| | | jitsiApi = new JitsiMeetExternalAPI(domain, options); |
| | | jitsiInit(); |
| | |
| | | <el-scrollbar> |
| | | <div class="list-content w-full overflow-x-hidden"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6" v-for="item in dataList" class="mb-5"> |
| | | <el-col :span="6" v-for="item in props.dataList" class="mb-5"> |
| | | <el-card shadow="hover" class="list-card cursor-pointer" :body-style="{ padding: 0 }" |
| | | @click="itemClick(item)"> |
| | | <div class="img-container w-full"> |
| | | <img src="@/assets/image/list-card-bg.jpg" class="w-full"> |
| | | </div> |
| | | <div class="item-info p-3"> |
| | | <div class="info-title font-bold">{{ item.title }}</div> |
| | | <div class="info-title font-bold">{{ item.meetName }}</div> |
| | | <div class="info-teacher flex text-sm text-gray-500"> |
| | | <div class="info-label">主讲:</div> |
| | | <div class="info-text">{{ item.teacher }}</div> |
| | | <div class="info-text">{{ item.teacherName }}</div> |
| | | </div> |
| | | <div class="info-time flex text-sm text-gray-500"> |
| | | <div class="info-label">开始时间:</div> |
| | |
| | | import { Timer } from '@element-plus/icons-vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | const router = useRouter(); |
| | | |
| | | const dataList = ref([ |
| | | { |
| | | title: '测试1', |
| | | startTime: '2024-6-13 8:00', |
| | | endTime: '2024-6-13 8:00', |
| | | teacher: '测试测试', |
| | | roomName: 'test' |
| | | }, |
| | | { |
| | | title: '测试1', |
| | | startTime: '2024-6-13 8:00', |
| | | endTime: '2024-6-13 8:00', |
| | | teacher: '测试测试', |
| | | roomName: 'test' |
| | | }, |
| | | { |
| | | title: '测试1', |
| | | startTime: '2024-6-13 8:00', |
| | | endTime: '2024-6-13 8:00', |
| | | teacher: '测试测试', |
| | | roomName: 'test' |
| | | }, |
| | | { |
| | | title: '测试1', |
| | | startTime: '2024-6-13 8:00', |
| | | endTime: '2024-6-13 8:00', |
| | | teacher: '测试测试', |
| | | roomName: 'test' |
| | | }, |
| | | { |
| | | title: '测试1', |
| | | startTime: '2024-6-13 8:00', |
| | | endTime: '2024-6-13 8:00', |
| | | teacher: '测试测试', |
| | | roomName: 'test' |
| | | const props = defineProps({ |
| | | dataList: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | ]); |
| | | }); |
| | | |
| | | |
| | | const itemClick = (item) => { |
| | | if (window.electron) { |
| | | window.electron.openNewWindow(); |
| | | window.electron.openNewWindow(JSON.stringify(item)); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | <div class="card-main flex-1 my-5 relative"> |
| | | <div class="main-content absolute top-0 bottom-0 left-0 right-0"> |
| | | <DataList></DataList> |
| | | <DataList :dataList="dataList"></DataList> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | import NormalHeader from '@/components/NormalHeader/index.vue'; |
| | | import DataList from './data-list/index.vue'; |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | import {getMeetList} from '@/api/modules/meet.js'; |
| | | const activeName = ref('1'); |
| | | const searchText = ref(''); |
| | | const dataList = ref([]); |
| | | |
| | | const loading = ref(false); |
| | | |
| | | const getData = () => { |
| | | loading.value = true; |
| | | getMeetList().then(res => { |
| | | dataList.value = res.data; |
| | | loading.value = false; |
| | | }).catch(err => { |
| | | loading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | getData(); |
| | | |
| | | const handleClick = (tab, event) => { |
| | | }; |
| | |
| | | server: { |
| | | // 端口 |
| | | port: 3000, |
| | | proxy: { |
| | | '/api': { |
| | | // target: 'http://192.168.3.88:8000', |
| | | target: 'http://192.168.3.64:8000', |
| | | changeOrigin: true, |
| | | } |
| | | } |
| | | }, |
| | | |
| | | resolve: { |
| | | alias: { |
| | | '@': resolve(__dirname, './src') |