Merge pull request 'zhuhao_dev' (#324) from zhuhao_dev into main

Reviewed-on: #324
This commit is contained in:
朱浩 2024-10-16 14:32:50 +08:00
commit ae433b7520
10 changed files with 192 additions and 61 deletions

View File

@ -16,7 +16,7 @@ win:
nsis: nsis:
oneClick: false oneClick: false
allowToChangeInstallationDirectory: true allowToChangeInstallationDirectory: true
artifactName: ${name}-${version}-setup.${ext} artifactName: ${name}-${version}-test.${ext}
shortcutName: ${productName} shortcutName: ${productName}
uninstallDisplayName: ${productName} uninstallDisplayName: ${productName}
createDesktopShortcut: always createDesktopShortcut: always

View File

@ -1,6 +1,6 @@
{ {
"name": "aix-win", "name": "aix-win",
"version": "2.1.5", "version": "2.1.9",
"description": "", "description": "",
"main": "./out/main/index.js", "main": "./out/main/index.js",
"author": "example.com", "author": "example.com",

View File

@ -243,6 +243,78 @@ export default async function ({ app, shell, BrowserWindow, ipcMain }) {
}) })
}) })
/*创建新的ppt文件*/
ipcMain.on('creat-ai-file-default', (e, { name, url, uploadData, cookie }) => {
createFolder('tempFile').then(async () => {
let path = appTempFilePath + name.replace(/[\\/:*?"<>|]/, '')
let {type,item} = await downloadFile(url,name)
if (type==="成功") {
let fileType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
let formData = new FormData()
for (let key in uploadData) {
if (Object.prototype.hasOwnProperty.call(uploadData, key)) {
// 检查是否是对象自身的属性
formData.append(key, uploadData[key])
}
}
formData.append('fileFlag', '课件')
uploadFileByFS({
url: uploadUrl,
path,
name,
cookie,
fileType,
formData,
success: (response) => {
e.reply('creat-ai-file-default-reply', response.data)
console.log('File uploaded successfully:', response.data)
},
error: (err) => {
console.error('Error uploading file:', err)
}
})
}else {
e.reply('creat-ai-file-default-reply', type)
}
})
})
function downloadFile(url,fileName) {
return new Promise((resolve, reject)=>{
const browserWindow = BrowserWindow.getFocusedWindow()
const id = manager.download({
window: browserWindow,
url: url,
saveAsFilename: fileName,
directory: appTempFilePath,
callbacks: {
onDownloadStarted: async ({ id, item, webContents }) => {
// Do something with the download id
},
onDownloadProgress: async ({ id, item, percentCompleted }) => {
// console.log(percentCompleted)
},
onDownloadCompleted: async ({ id, item }) => {
console.log('完成')
resolve({type:"成功",item})
},
onDownloadCancelled: async () => {
console.log("取消")
reject({type:"取消了下载"})
},
onDownloadInterrupted: async () => {
console.log('中断')
reject({type:"下载被中断"})
},
onError: (err, data) => {
console.log(err.toString())
reject({type:"下载出错",err})
}
}
})
})
}
//获取应用文件目录 //获取应用文件目录
ipcMain.on('get-root-file-path', (e) => { ipcMain.on('get-root-file-path', (e) => {
e.reply('get-root-file-path-reply', appRootFilePath) e.reply('get-root-file-path-reply', appRootFilePath)

View File

@ -96,3 +96,19 @@ export const creatPPT = (name, uploadData) => {
}) })
}) })
} }
export const creatAIPPT = (name, url, uploadData) => {
JSON.parse(JSON.stringify(uploadData))
return new Promise((resolve, reject) => {
let cookie = localStorage.getItem('Admin-Token')
ipcRenderer.send('creat-ai-file-default', {
name,
url,
uploadData: JSON.parse(JSON.stringify(uploadData)),
cookie
})
ipcRenderer.once('creat-ai-file-default-reply', (e, res) => {
resolve(res)
})
})
}

View File

@ -27,11 +27,8 @@
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import { useToolState } from '@/store/modules/tool' import { useToolState } from '@/store/modules/tool'
import useUserStore from '@/store/modules/user' import { deleteSmartReserv } from '@/api/classManage'
import { createWindow } from '@/utils/tool'
import { deleteSmartReserv, startClass, endClass } from '@/api/classManage'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { listEntpcourse } from '@/api/teaching/classwork'
const emit = defineEmits(['openEdit', 'deleteReserv', 'change']) const emit = defineEmits(['openEdit', 'deleteReserv', 'change'])
const props = defineProps({ const props = defineProps({
item: { item: {

View File

@ -47,7 +47,7 @@
<el-card class="card2" v-if="activeStep == 1"> <el-card class="card2" v-if="activeStep == 1">
<div class="paragraphs"> <div class="paragraphs">
{{ outputText }} {{ outputText }}
</div> </div>
</el-card> </el-card>
<el-card class="card3" v-if="activeStep == 2"> <el-card class="card3" v-if="activeStep == 2">
<div class="outline"> <div class="outline">
@ -130,6 +130,7 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { creatAIPPT } from '@/utils/talkFile'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { import {
getBackGround, getBackGround,
@ -195,6 +196,18 @@ const outlineData = ref({
} }
) )
const emit = defineEmits(['addSuccess'])
const props = defineProps({
currentNode: {
type: Object,
default: () => {}
},
uploadData: {
type: Object,
default: () => {}
}
})
// //
function updateStagingData(role, newData) { function updateStagingData(role, newData) {
stagingData.value.push({ role: role, content: newData }); stagingData.value.push({ role: role, content: newData });
@ -213,7 +226,12 @@ const outlineCreatePPT = () => {
percentage.value = response.data.process; percentage.value = response.data.process;
if (response.data && response.data.pptUrl && response.data.pptUrl.length > 4) { if (response.data && response.data.pptUrl && response.data.pptUrl.length > 4) {
console.log('PPT',response) console.log('PPT',response)
//TODO window.location.href = response.data.pptUrl; // window.location.href = response.data.pptUrl;
//URLURL
// let url = "https://bjcdn.openstorage.cn/xinghuo-privatedata/%2Ftmp/apiTempFiledf28bf990a4c40ffb7477ed4b65392c27232357022409613439/%E3%80%8A%E9%9D%99%E5%A5%B3%E3%80%8B%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BB%E4%B8%8E%E7%A0%94%E7%A9%B6.pptx"
creatAIPPT(props.currentNode.itemtitle + '.pptx',response.data.pptUrl, props.uploadData).then((res) => {
emit('addSuccess',res)
})
ElMessage.success("生成成功"); ElMessage.success("生成成功");
} else { } else {
const sleepTime = 2000; const sleepTime = 2000;
@ -602,6 +620,10 @@ const changeCursor = (cursorStyle) => {
}; };
onMounted(() => { onMounted(() => {
// let url = "https://bjcdn.openstorage.cn/xinghuo-privatedata/%2Ftmp/apiTempFiledf28bf990a4c40ffb7477ed4b65392c27232357022409613439/%E3%80%8A%E9%9D%99%E5%A5%B3%E3%80%8B%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BB%E4%B8%8E%E7%A0%94%E7%A9%B6.pptx"
// creatAIPPT(props.currentNode.itemtitle + '.pptx',url, props.uploadData).then((res) => {
// emit('addSuccess',res)
// })
connectWebSocket(""); connectWebSocket("");
getBackground(); getBackground();
}); });

View File

@ -148,8 +148,26 @@ export default {
this.userInfo = useUserStore().user this.userInfo = useUserStore().user
}, },
methods: { methods: {
getOpenCourse() {
return Promise.all([listClasscourseNew({teacherid: this.userInfo.userId,status:"open",evalid: this.curNode.id,pageSize:1000}), getSelfReserv({ex2:this.curNode.id})]).then(([res1,res2])=>{
let list2 = res1.rows || []
let list = res2.data || []
let one = list.find(item1 => {
if (item1.status === "上课中") {
return true
}
})
if (one) {
return one
}
if (list2.length>0) {
one = list2[0]
}
return one
})
},
// //
getOpenCourse(isApt) { /*getOpenCourse(isApt) {
const curNodeId = this.curNode.id const curNodeId = this.curNode.id
if (isApt) { // APT if (isApt) { // APT
const params = {teacherid: this.userInfo.userId,status:"open",evalid: curNodeId,pageSize:1000} const params = {teacherid: this.userInfo.userId,status:"open",evalid: curNodeId,pageSize:1000}
@ -161,11 +179,12 @@ export default {
return (res.data || []).filter(o => o.status === "上课中") return (res.data || []).filter(o => o.status === "上课中")
}) })
} }
}, },*/
clickStartClass(item) { clickStartClass(item) {
const isApt = item.fileFlag === 'apt' const isApt = item.fileFlag === 'apt'
this.getOpenCourse(isApt).then(res => { this.getOpenCourse(isApt).then(res => {
if(!res || res.length === 0){ console.log(res)
if(!res){
this.$emit('on-start-class', item) this.$emit('on-start-class', item)
}else{ }else{
ElMessageBox.alert('<strong>上次课程尚未结束,是否继续上课?</strong>', '', { ElMessageBox.alert('<strong>上次课程尚未结束,是否继续上课?</strong>', '', {
@ -182,33 +201,14 @@ export default {
confirmButtonClass: "el-button--danger", confirmButtonClass: "el-button--danger",
center: true, center: true,
beforeClose: (action, instance, done) => { beforeClose: (action, instance, done) => {
const obj = res[0] const obj = res
// console.log(action, obj, item)
if (action === 'confirm'){ if (action === 'confirm'){
// //
this.$emit('change', 'close', obj, { type: 1, instance, done }) this.$emit('change', 'close', obj, { type: 1, instance, done })
// if (obj.bookImg) {
// // //PPT
// // endClass(obj.id).then((res1) => {
// // if (res1.data === true) {
// // ElMessage({
// // message: '',
// // type: 'success'
// // })
// // obj.status = ''
// // done()
// // }
// // })
// }else {
// //APT -
// // this.$emit('change', 'close', obj, { type: 1, instance, done })
// // this.closeCourse(obj, instance, done)
// }
} }
if (action === 'cancel'){ if (action === 'cancel'){
// //
if (obj.bookImg) { if (obj.bookImg) {
console.log('PPT')
//PPT //PPT
listEntpcourse({ listEntpcourse({
evalid: obj.ex2, evalid: obj.ex2,
@ -217,6 +217,26 @@ export default {
}).then(async res1=>{ }).then(async res1=>{
if (res1.rows[0].id) { if (res1.rows[0].id) {
createWindow('tool-sphere', { url: '/tool/sphere?entpcourseid=' + res1.rows[0].id + "&reservId=" + obj.id }) createWindow('tool-sphere', { url: '/tool/sphere?entpcourseid=' + res1.rows[0].id + "&reservId=" + obj.id })
if (obj.ex4) {
getPrepareById(obj.ex4).then(res2=>{
console.log(res2)
this.openFileWin(res2);
})
}else {
ElMessageBox.confirm(
'抱歉版本V2.1.9前创建的课程无法直接打开PPT请自行打开PPT',
'Warning',
{
confirmButtonText: 'OK',
type: 'warning',
center: true,
}
)
.then(() => {
})
.catch(() => {
})
}
done() done()
} }
}) })
@ -235,27 +255,6 @@ export default {
}) })
// this.$emit('on-start-class', item) // this.$emit('on-start-class', item)
}, },
// ()
// async closeCourse(row, instance, done) {
// instance.confirmButtonLoading = true
// instance.confirmButtonText = '...'
// // -
// if (!!row.timgroupid) {
// const msg = { msgKey: 'closed', actor: 'teacher', classcourseid: row.id }
// Chat.sendMsg(row.timgroupid, msg)
// }
// // -
// const params = { id: row.id, status: 'closed', timgroupid: '' }
// await updateClasscourse(params)
// //
// setTimeout(async() => {
// if (!!row.timgroupid) await Chat.dismissGroup(row.timgroupid)
// instance.confirmButtonLoading = false
// instance.confirmButtonText = ''
// done()
// ElMessage({ type: 'success', message: `` })
// }, 1000)
// },
editTalk(item) { editTalk(item) {
ElMessageBox.prompt('请输入新的标签', '添加标签', { ElMessageBox.prompt('请输入新的标签', '添加标签', {
confirmButtonText: '确认', confirmButtonText: '确认',

View File

@ -7,14 +7,28 @@
<i class="iconfont icon-guanbi" @click="close"></i> <i class="iconfont icon-guanbi" @click="close"></i>
</div> </div>
</template> </template>
<AiPpt/> <AiPpt @add-success="addAiPPT" :currentNode="currentNode" :uploadData="uploadData"/>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import AiPpt from './ai-ppt.vue'; import AiPpt from './ai-ppt.vue';
const model = defineModel() const model = defineModel()
const emit = defineEmits(['addSuccess'])
const props = defineProps({
currentNode: {
type: Object,
default: () => {}
},
uploadData: {
type: Object,
default: () => {}
}
})
const addAiPPT = (data) => {
emit('addSuccess', data)
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -30,4 +44,4 @@
cursor: pointer; cursor: pointer;
} }
} }
</style> </style>

View File

@ -101,6 +101,12 @@ const props = defineProps({
default: () => { default: () => {
return {} return {}
} }
},
curFile: {
type: Object,
default: () => {
return {}
}
} }
}) })
const ruleFormDialog = ref(null) const ruleFormDialog = ref(null)
@ -292,7 +298,8 @@ const addClassReserv = (formData) => {
classRoom: formData.classRoom, classRoom: formData.classRoom,
classSubject: props.currentNode.edusubject, classSubject: props.currentNode.edusubject,
ex1: props.bookId, ex1: props.bookId,
ex2: props.currentNode.id ex2: props.currentNode.id,
ex4: props.curFile.id
} }
addSmartClassReserv(param).then((res) => { addSmartClassReserv(param).then((res) => {
if (res.msg) { if (res.msg) {

View File

@ -34,7 +34,7 @@
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="教学实录" name="教学实录" class="prepare-center-jxsl"> <el-tab-pane label="教学实录" name="教学实录" class="prepare-center-jxsl">
<class-reserv v-if="activeAptTab==='教学实录'" :curNode="currentNode" <class-reserv v-if="activeAptTab==='教学实录'" :curNode="currentNode"
@change="changeClass"></class-reserv> @change="changeClass"></class-reserv>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
@ -132,19 +132,20 @@
ref="reservDialog" ref="reservDialog"
:current-node="currentNode" :current-node="currentNode"
:book-id="uploadData.textbookId" :book-id="uploadData.textbookId"
:cur-file="activeClass"
@add-success="initReserv" @add-success="initReserv"
@close="closeChange" @close="closeChange"
></reserv> ></reserv>
<!-- 上课配置 --> <!-- 上课配置 -->
<class-start ref="calssRef" @close="closeChange"/> <class-start ref="calssRef" @close="closeChange"/>
<PptDialog v-model="pptDialog"/> <PptDialog @add-success="addAiPPT" :currentNode="currentNode" :uploadData="uploadData" v-model="pptDialog"/>
<!-- <button @click="test">test</button> --> <!-- <button @click="test">test</button> -->
</template> </template>
<script setup> <script setup>
import { Check,Plus } from '@element-plus/icons-vue' import { Check,Plus } from '@element-plus/icons-vue'
import Reserv from '@/views/prepare/container/reserv.vue' import Reserv from '@/views/prepare/container/reserv.vue'
import { ArrowDown } from '@element-plus/icons-vue' import { ArrowDown } from '@element-plus/icons-vue'
import PptDialog from '@/views/prepare/container/ppt-dialog.vue'
</script> </script>
<script> <script>
const Remote = require('@electron/remote') const Remote = require('@electron/remote')
@ -157,7 +158,6 @@ import { useToolState } from '@/store/modules/tool'
import MoveFile from '@/components/move-file/index.vue' import MoveFile from '@/components/move-file/index.vue'
import FileListItem from '@/views/prepare/container/file-list-item.vue' import FileListItem from '@/views/prepare/container/file-list-item.vue'
import KjListItem from '@/views/prepare/container/kj-list-item.vue' import KjListItem from '@/views/prepare/container/kj-list-item.vue'
import PptDialog from './container/ppt-dialog.vue'
import { getSmarttalkPage, moveSmarttalk, creatAPT } from '@/api/file' import { getSmarttalkPage, moveSmarttalk, creatAPT } from '@/api/file'
import { toTimeText } from '@/utils/date' import { toTimeText } from '@/utils/date'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
@ -287,6 +287,10 @@ export default {
// } // }
// }, // },
methods: { methods: {
addAiPPT(item) {
this.currentFileList.unshift(item.resData)
this.pptDialog = false
},
// test() { // test() {
// toolStore.resetDef() // // toolStore.resetDef() //
// ipcMsgSend('tool-sphere:close') // // ipcMsgSend('tool-sphere:close') //
@ -359,7 +363,7 @@ export default {
}, 1000) }, 1000)
break break
} }
default: default:
break break
} }
}, },