zdg #101
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "electron-app",
|
||||
"version": "1.0.1",
|
||||
"name": "aix-win",
|
||||
"version": "1.0.2",
|
||||
"description": "An Electron application with Vue",
|
||||
"main": "./out/main/index.js",
|
||||
"author": "example.com",
|
||||
|
|
|
@ -103,11 +103,12 @@ function createMainWindow() {
|
|||
remote.enable(mainWindow.webContents)
|
||||
}
|
||||
|
||||
// 作业窗口相关-开发中
|
||||
let linkWindow
|
||||
// 打开外部链接窗口
|
||||
let linkWin = {}
|
||||
async function createLinkWin(data) {
|
||||
if (linkWindow) return
|
||||
linkWindow = new BrowserWindow({
|
||||
if (linkWin[data.key]) return
|
||||
|
||||
linkWin[data.key] = new BrowserWindow({
|
||||
show: false,
|
||||
frame: true,
|
||||
maximizable: true,
|
||||
|
@ -120,9 +121,10 @@ async function createLinkWin(data) {
|
|||
contextIsolation: true
|
||||
}
|
||||
})
|
||||
linkWindow.type = 'link' // 唯一标识
|
||||
linkWin[data.key].type = 'link' // 唯一标识
|
||||
|
||||
let cookieDetails = { ...data.cookieData }
|
||||
await linkWindow.webContents.session.cookies
|
||||
await linkWin[data.key].webContents.session.cookies
|
||||
.set(cookieDetails)
|
||||
.then(() => {
|
||||
console.log('Cookie is successful')
|
||||
|
@ -131,14 +133,15 @@ async function createLinkWin(data) {
|
|||
console.error('Cookie is error', error)
|
||||
})
|
||||
data.fullPath = data.fullPath.replaceAll('//', '/')
|
||||
linkWindow.loadURL(data.fullPath)
|
||||
linkWin[data.key].loadURL(data.fullPath)
|
||||
|
||||
linkWindow.once('ready-to-show', () => {
|
||||
linkWindow.show()
|
||||
linkWindow.maximize()
|
||||
linkWin[data.key].once('ready-to-show', () => {
|
||||
linkWin[data.key].show()
|
||||
linkWin[data.key].maximize()
|
||||
})
|
||||
linkWindow.on('closed', () => {
|
||||
linkWindow = null
|
||||
linkWin[data.key].on('closed', () => {
|
||||
linkWin[data.key] = null
|
||||
delete linkWin[data.key]
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Electron</title>
|
||||
<title>AIx智慧教育</title>
|
||||
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
|
||||
<!-- <meta
|
||||
http-equiv="Content-Security-Policy"
|
||||
|
|
|
@ -18,6 +18,15 @@ export function listEntpcourse(query) {
|
|||
})
|
||||
}
|
||||
|
||||
// 新增entpcourse
|
||||
export function addEntpcourse(data) {
|
||||
return request({
|
||||
url: '/education/entpcourse',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 布置作业
|
||||
export function saveByClassWorkArray(data) {
|
||||
return request({
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
<span>{{ curBookName }}</span>
|
||||
<i class="iconfont icon-xiangyou"></i>
|
||||
</div>
|
||||
<div class="book-list">
|
||||
<div class="book-list" v-loading="treeLoading">
|
||||
<el-tree ref="refTree" :data="treeData" :props="defaultProps" node-key="id"
|
||||
:default-expanded-keys="defaultExpandedKeys" :current-node-key="currentNode" highlight-current
|
||||
:default-expanded-keys="defaultExpandedKeys" :current-node-key="currentNodeId" highlight-current
|
||||
@node-click="handleNodeClick">
|
||||
<template #default="{ node }">
|
||||
<span :title="node.label" class="tree-label">{{ node.label }}</span>
|
||||
|
@ -30,7 +30,10 @@
|
|||
<el-scrollbar height="450px">
|
||||
<div class="textbook-item flex" v-for="item in subjectList" :class="curBookId == item.id ? 'active-item' : ''"
|
||||
:key="item.id" @click="changeBook(item)">
|
||||
<img :src="BaseUrl + item.avartar" class="textbook-img" alt="">
|
||||
<img v-if="item.avartar" :src="BaseUrl + item.avartar" class="textbook-img" alt="">
|
||||
<div v-else class="textbook-img">
|
||||
<i class="iconfont icon-jiaocaixuanze" style="font-size: 40px;"></i>
|
||||
</div>
|
||||
<span class="book-name">{{ item.itemtitle }}</span>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
|
@ -39,7 +42,7 @@
|
|||
</template>
|
||||
|
||||
<script setup>
|
||||
import { onMounted, ref, nextTick, toRaw } from 'vue';
|
||||
import { onMounted, ref, nextTick, toRaw, reactive } from 'vue';
|
||||
import useUserStore from '@/store/modules/user'
|
||||
import { listEvaluation } from '@/api/subject'
|
||||
|
||||
|
@ -60,6 +63,8 @@ const defaultProps = {
|
|||
label: 'label',
|
||||
class: 'textbook-tree'
|
||||
}
|
||||
|
||||
const treeLoading = ref(false)
|
||||
//当前教材ID
|
||||
const curBookId = ref(-1)
|
||||
//当前教材名称
|
||||
|
@ -70,8 +75,12 @@ const curBookImg = ref('')
|
|||
const volumeOne = ref([])
|
||||
// 下册
|
||||
const volumeTwo = ref([])
|
||||
// 当前节点
|
||||
const currentNode = reactive({
|
||||
data:{}
|
||||
})
|
||||
// 当前选中的节点ID
|
||||
const currentNode = ref(0)
|
||||
const currentNodeId = ref(0)
|
||||
// 当前选中的节点名称
|
||||
const currentNodeName = ref('')
|
||||
// 默认展开的节点
|
||||
|
@ -82,6 +91,7 @@ const refTree = ref(null)
|
|||
|
||||
//获取教材下面的单元内容
|
||||
const getSubjectContent = async () => {
|
||||
treeLoading.value = true
|
||||
const params = {
|
||||
edusubject,
|
||||
edustage,
|
||||
|
@ -93,12 +103,17 @@ const getSubjectContent = async () => {
|
|||
if (localStorage.getItem('evaluationList')) {
|
||||
evaluationList.value = JSON.parse(localStorage.getItem('evaluationList'))
|
||||
data = evaluationList.value
|
||||
treeLoading.value = false
|
||||
}
|
||||
else {
|
||||
const { rows } = await listEvaluation(params)
|
||||
localStorage.setItem('evaluationList', JSON.stringify(rows))
|
||||
evaluationList.value = rows
|
||||
data = rows
|
||||
try {
|
||||
const { rows } = await listEvaluation(params)
|
||||
localStorage.setItem('evaluationList', JSON.stringify(rows))
|
||||
evaluationList.value = rows
|
||||
data = rows
|
||||
} finally {
|
||||
treeLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
//获取教材版本
|
||||
|
@ -107,7 +122,6 @@ const getSubjectContent = async () => {
|
|||
volumeOne.value = data.filter(item => item.level == 1 && item.semester == '上册')
|
||||
//下册
|
||||
volumeTwo.value = data.filter(item => item.level == 1 && item.semester == '下册')
|
||||
|
||||
getTreeData()
|
||||
}
|
||||
|
||||
|
@ -126,10 +140,20 @@ const getTreeData = () => {
|
|||
//数据过滤
|
||||
let upData = transData(volumeOne.value)
|
||||
let downData = transData(volumeTwo.value)
|
||||
treeData.value = upData.length ? upData : downData
|
||||
defaultExpandedKeys.value = [treeData.value[0].id]
|
||||
if(upData.length && downData.length){
|
||||
treeData.value = [...upData,...downData]
|
||||
}
|
||||
else if(upData.length || downData.length){
|
||||
treeData.value = upData.length ? upData : downData
|
||||
}
|
||||
else{
|
||||
treeData.value = []
|
||||
return
|
||||
}
|
||||
nextTick(() => {
|
||||
currentNode.value = getLastLevelData(treeData.value)[0].id
|
||||
defaultExpandedKeys.value = [treeData.value[0].id]
|
||||
currentNode.data = getLastLevelData(treeData.value)[0]
|
||||
currentNodeId.value = getLastLevelData(treeData.value)[0].id
|
||||
currentNodeName.value = getLastLevelData(treeData.value)[0].label
|
||||
emitChangeBook()
|
||||
})
|
||||
|
@ -138,10 +162,14 @@ const getTreeData = () => {
|
|||
|
||||
const emitChangeBook = () => {
|
||||
let curNode = {
|
||||
id: currentNode.value,
|
||||
label: currentNodeName.value
|
||||
id: currentNodeId.value,
|
||||
label: currentNodeName.value,
|
||||
itemtitle: currentNode.data.itemtitle,
|
||||
edudegree: currentNode.data.edudegree,
|
||||
edustage: currentNode.data.edustage,
|
||||
edusubject: currentNode.data.edusubject,
|
||||
}
|
||||
let parentNode = findParentByChildId(treeData.value, currentNode.value)
|
||||
let parentNode = findParentByChildId(treeData.value, currentNodeId.value)
|
||||
curNode.parentNode = toRaw(parentNode)
|
||||
|
||||
const data = {
|
||||
|
@ -201,20 +229,26 @@ const findParentByChildId = (treeData, targetNodeId) => {
|
|||
|
||||
const transData = (data) => {
|
||||
let ary = []
|
||||
|
||||
data.forEach(item => {
|
||||
let obj = {}
|
||||
|
||||
if (item.rootid == curBookId.value) {
|
||||
obj.label = item.itemtitle
|
||||
obj.id = item.id
|
||||
obj.itemtitle = item.itemtitle
|
||||
obj.edudegree = item.edudegree
|
||||
obj.edustage = item.edustage
|
||||
obj.edusubject = item.edusubject
|
||||
let ary2 = []
|
||||
evaluationList.value.forEach(el => {
|
||||
let obj2 = {}
|
||||
if (item.id == el.parentid) {
|
||||
obj2 = {
|
||||
label: el.itemtitle,
|
||||
id: el.id
|
||||
id: el.id,
|
||||
itemtitle : el.itemtitle,
|
||||
edudegree : el.edudegree,
|
||||
edustage : el.edustage,
|
||||
edusubject : el.edusubject,
|
||||
}
|
||||
ary2.push(obj2)
|
||||
}
|
||||
|
@ -236,8 +270,9 @@ const getSubject = async () => {
|
|||
subjectList.value = rows.filter(item => item.edustage == edustage && item.edusubject == edusubject && isHaveUnit(item.id))
|
||||
localStorage.setItem('subjectList', JSON.stringify(subjectList.value))
|
||||
}
|
||||
|
||||
|
||||
// 默认第一个
|
||||
if(!subjectList.value.length) return
|
||||
curBookName.value = subjectList.value[0].itemtitle
|
||||
curBookId.value = subjectList.value[0].id
|
||||
curBookImg.value = BaseUrl + subjectList.value[0].avartar
|
||||
|
@ -256,14 +291,15 @@ const handleNodeClick = (data, node) => {
|
|||
* data : 当前节点数据
|
||||
* node : 当前节点对象 包含当前节点所有数据 parent属性 指向父节点Node对象
|
||||
*/
|
||||
const currentNode = data;
|
||||
|
||||
const nodeData = data;
|
||||
const parentNode = node.parent.data;
|
||||
|
||||
if (Array.isArray(parentNode)) {
|
||||
currentNode.parentNode = null
|
||||
nodeData.parentNode = null
|
||||
}
|
||||
else {
|
||||
currentNode.parentNode = parentNode
|
||||
nodeData.parentNode = parentNode
|
||||
}
|
||||
|
||||
let curData = {
|
||||
|
@ -272,9 +308,9 @@ const handleNodeClick = (data, node) => {
|
|||
curBookName: curBookName.value,
|
||||
curBookImg: curBookImg.value
|
||||
},
|
||||
node: toRaw(currentNode)
|
||||
node: toRaw(nodeData)
|
||||
}
|
||||
|
||||
currentNode.data = curData
|
||||
emit('nodeClick', curData)
|
||||
}
|
||||
|
||||
|
@ -365,6 +401,9 @@ onMounted(() => {
|
|||
.textbook-img {
|
||||
width: 55px;
|
||||
height: 70px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -137,7 +137,6 @@ const getSubjectContent = async () => {
|
|||
volumeOne.value = data.filter(item => item.level == 1 && item.semester == '上册')
|
||||
//下册
|
||||
volumeTwo.value = data.filter(item => item.level == 1 && item.semester == '下册')
|
||||
|
||||
getTreeData()
|
||||
}
|
||||
|
||||
|
@ -154,6 +153,7 @@ const getSubject = async () => {
|
|||
}
|
||||
|
||||
// 默认第一个
|
||||
if(!subjectList.value.length) return
|
||||
curBookName.value = subjectList.value[0].itemtitle
|
||||
curBookId.value = subjectList.value[0].id
|
||||
}
|
||||
|
@ -168,7 +168,17 @@ const getTreeData = () => {
|
|||
//数据过滤
|
||||
let upData = transData(volumeOne.value)
|
||||
let downData = transData(volumeTwo.value)
|
||||
treeData.value = upData.length ? upData : downData
|
||||
|
||||
if(upData.length && downData.length){
|
||||
treeData.value = [...upData,...downData]
|
||||
}
|
||||
else if(upData.length || downData.length){
|
||||
treeData.value = upData.length ? upData : downData
|
||||
}
|
||||
else{
|
||||
treeData.value = []
|
||||
return
|
||||
}
|
||||
nextTick(() => {
|
||||
defaultExpandedKeys.value = [treeData.value[0].id]
|
||||
currentNodeId.value = getLastLevelData(treeData.value)[0].id
|
||||
|
|
|
@ -54,7 +54,7 @@ const rules = reactive({
|
|||
password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }]
|
||||
})
|
||||
|
||||
let curWinUrl;
|
||||
let curWinUrl = import.meta.env.VITE_APP_BUILD_BASE_PATH;
|
||||
|
||||
//登录
|
||||
const submitForm = async (formEl) => {
|
||||
|
@ -131,9 +131,7 @@ const setCookie = (name, value) => {
|
|||
|
||||
|
||||
onMounted(() => {
|
||||
// 当前窗口URL
|
||||
curWinUrl = BrowserWindow.getFocusedWindow().webContents.getURL()
|
||||
|
||||
localStorage.clear()
|
||||
getCookie()
|
||||
})
|
||||
</script>
|
||||
|
|
|
@ -13,8 +13,7 @@
|
|||
<el-button class="btn" @click="handleOutLink('aiModel')">教学大模型</el-button>
|
||||
</div>
|
||||
<el-button type="primary" class="to-class-btn" @click="openLesson">
|
||||
<i class="iconfont icon-lingdang"></i>上课</el-button
|
||||
>
|
||||
<i class="iconfont icon-lingdang"></i>上课</el-button>
|
||||
<div class="top-zoom-style"></div>
|
||||
</div>
|
||||
<div class="prepare-body-header">
|
||||
|
@ -23,13 +22,7 @@
|
|||
<el-popover placement="top-start" :width="250" trigger="hover">
|
||||
<template #default>
|
||||
<div>
|
||||
<el-button
|
||||
v-if="lastAsyncAllTime"
|
||||
type="success"
|
||||
size="small"
|
||||
:icon="Check"
|
||||
circle
|
||||
/>
|
||||
<el-button v-if="lastAsyncAllTime" type="success" size="small" :icon="Check" circle />
|
||||
{{ lastAsyncAllTime ? toTimeText(lastAsyncAllTime) + '同步成功' : '' }}
|
||||
</div>
|
||||
</template>
|
||||
|
@ -47,39 +40,20 @@
|
|||
<el-button @click="handleOutLink('feedback')">作业反馈</el-button>
|
||||
<el-button @click="handleOutLink('homeWork')">布置作业</el-button>
|
||||
<el-button @click="isDialogOpen = true">上传资料</el-button>
|
||||
<el-button type="primary" style="margin-left: 10px" @click="createFile"
|
||||
>新建课件</el-button
|
||||
>
|
||||
<el-button type="primary" style="margin-left: 10px" @click="createFile">新建课件</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-checkbox-group
|
||||
v-model="checkFileList"
|
||||
class="prepare-body-main"
|
||||
:style="{ 'margin-bottom': checkFileList.length > 0 ? '40px' : '0' }"
|
||||
>
|
||||
<file-list-item
|
||||
v-for="(item, index) in currentFileList"
|
||||
:key="index"
|
||||
:item="item"
|
||||
:index="index"
|
||||
@on-move="onMoveSingleFile"
|
||||
@on-delete="deleteTalk"
|
||||
@on-set="openSet"
|
||||
@on-delhomework="delhomework"
|
||||
>
|
||||
<el-checkbox label="" :value="item" v-if="!item.uniquekey"/>
|
||||
<el-checkbox-group v-model="checkFileList" class="prepare-body-main"
|
||||
:style="{ 'margin-bottom': checkFileList.length > 0 ? '40px' : '0' }">
|
||||
<file-list-item v-for="(item, index) in currentFileList" :key="index" :item="item" :index="index"
|
||||
@on-move="onMoveSingleFile" @on-delete="deleteTalk" @on-set="openSet" @on-delhomework="delhomework">
|
||||
<el-checkbox label="" :value="item" v-if="!item.uniquekey" />
|
||||
</file-list-item>
|
||||
</el-checkbox-group>
|
||||
<file-oper-batch
|
||||
v-show="checkFileList.length > 0"
|
||||
<file-oper-batch v-show="checkFileList.length > 0"
|
||||
:indeterminate="checkFileList.length > 0 && checkFileList.length < currentFileList.length"
|
||||
:choose="checkFileList"
|
||||
:check-all="isCheckAll"
|
||||
@click-delete="clickDelete"
|
||||
@click-move="clickMove"
|
||||
@cancel="checkFileList = []"
|
||||
@click-choose="clickChoose"
|
||||
></file-oper-batch>
|
||||
:choose="checkFileList" :check-all="isCheckAll" @click-delete="clickDelete" @click-move="clickMove"
|
||||
@cancel="checkFileList = []" @click-choose="clickChoose"></file-oper-batch>
|
||||
</div>
|
||||
<MoveFile v-model="isMoveDialogOpen" @on-submit="chooseMoveCata" />
|
||||
<uploadDialog v-model="isDialogOpen" @submit-file="submitFile" />
|
||||
|
@ -107,7 +81,7 @@ import SetHomework from './container/set-homework.vue'
|
|||
import outLink from '@/utils/linkConfig'
|
||||
import { createWindow } from '@/utils/tool'
|
||||
import { uniqBy, cloneDeep } from 'lodash'
|
||||
import { delClasswork } from '@/api/teaching/classwork'
|
||||
import { delClasswork, addEntpcourse } from '@/api/teaching/classwork'
|
||||
|
||||
const { ipcRenderer } = window.electron || {}
|
||||
|
||||
|
@ -170,15 +144,17 @@ export default {
|
|||
created() {
|
||||
this.userStore = useUserStore().user
|
||||
ipcRenderer.removeAllListeners('copy-file-default-reply')
|
||||
|
||||
ipcRenderer.on('copy-file-default-reply', (e, param) => {
|
||||
this.callback(param)
|
||||
})
|
||||
this.lastAsyncAllTime = localStorage.getItem('lastAsyncAllTime')
|
||||
},
|
||||
mounted() {},
|
||||
mounted() { },
|
||||
activated() {
|
||||
if (this.uploadData.textbookId !== null) {
|
||||
this.asyncAllFile()
|
||||
this.initHomeWork()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
@ -310,17 +286,51 @@ export default {
|
|||
this.uploadData.levelSecondId = cata[1]
|
||||
this.uploadData.levelThirdId = cata[2]
|
||||
this.uploadData.textbookId = data.textBook.curBookId
|
||||
this.initHomeWork()
|
||||
await this.asyncAllFile()
|
||||
|
||||
},
|
||||
async initHomeWork() {
|
||||
if (this.timerId) {
|
||||
clearInterval(this.timerId)
|
||||
}
|
||||
if (this.uploadData.levelSecondId) {
|
||||
// 获取作业列表所需ID 可能存在没有
|
||||
const { rows } = await this.getChapterId()
|
||||
if(!rows.length) return
|
||||
this.entpcourseid = rows[0].id
|
||||
let { rows } = await this.getChapterId()
|
||||
if (rows.length > 0) {
|
||||
this.entpcourseid = rows[0].id
|
||||
}
|
||||
else{
|
||||
await this.createEntpcourse()
|
||||
let { rows } = await this.getChapterId()
|
||||
this.entpcourseid = rows[0].id
|
||||
}
|
||||
|
||||
// 查询作业
|
||||
this.getHomeWorkList()
|
||||
}
|
||||
},
|
||||
|
||||
// 创建新的entpcourse
|
||||
createEntpcourse() {
|
||||
var cform = {};
|
||||
cform.entpid = this.userStore.deptId;
|
||||
cform.level = 1;
|
||||
cform.parentid = 0;
|
||||
cform.dictid = 0;
|
||||
cform.evalid = this.currentNode.id;
|
||||
cform.evalparentid = 0;
|
||||
cform.edusubject = this.currentNode.edusubject;
|
||||
cform.edudegree = this.currentNode.edudegree;
|
||||
cform.edustage = this.currentNode.edustage;
|
||||
cform.coursetype = '课标学科';
|
||||
cform.coursetitle = this.currentNode.itemtitle;
|
||||
cform.coursedesc = '';
|
||||
cform.status = '';
|
||||
cform.dflag = 0;
|
||||
cform.edituserid = this.userStore.userId;
|
||||
cform.createblankfile = 'yes';
|
||||
return addEntpcourse(cform)
|
||||
},
|
||||
// 打开外部链接
|
||||
handleOutLink(key) {
|
||||
if (key == 'homeWork') {
|
||||
|
@ -331,6 +341,7 @@ export default {
|
|||
let configObj = outLink()[key]
|
||||
// 通知主进程
|
||||
ipcRenderer.send('openWindow', {
|
||||
key,
|
||||
fullPath: configObj.fullPath,
|
||||
cookieData: { ...configObj.data }
|
||||
})
|
||||
|
@ -343,7 +354,7 @@ export default {
|
|||
pageSize: 500
|
||||
})
|
||||
},
|
||||
// 清除查询作业列表定时器
|
||||
// 查询作业列表定时器
|
||||
createTimer() {
|
||||
this.timerId = setInterval(() => {
|
||||
this.getHomeWorkList()
|
||||
|
@ -421,20 +432,21 @@ export default {
|
|||
this.setDialog = true
|
||||
},
|
||||
// 删除作业
|
||||
delhomework(item){
|
||||
delhomework(item) {
|
||||
this.isLoading = true
|
||||
delClasswork(item.id).then( async res =>{
|
||||
delClasswork(item.id).then(async res => {
|
||||
ElMessage.success('操作成功')
|
||||
this.isLoading = false
|
||||
await this.asyncAllFile()
|
||||
this.getHomeWorkList()
|
||||
}).catch(()=>{
|
||||
}).catch(() => {
|
||||
this.isLoading = false
|
||||
})
|
||||
},
|
||||
closeHomework() {
|
||||
this.setDialog = false
|
||||
},
|
||||
|
||||
// 打开PDF-课件
|
||||
navtoPdf() {
|
||||
createWindow('open-PDF', { url: '/classBegins/index' })
|
||||
|
|
Loading…
Reference in New Issue