zdg #391

Merged
zhengdegang merged 2 commits from zdg into main 2024-11-04 16:30:27 +08:00
8 changed files with 101 additions and 22 deletions
Showing only changes of commit 7e18f2e9d9 - Show all commits

View File

@ -23,7 +23,9 @@ const defaultData = {
curNode: null, // 当前选中的节点
defaultExpandedKeys: [], //展开的节点
subjectTree: [] // "树结构" 章节
}
},
env: {}, // 不走同步 Pinia - 变量
curr: {} // 不走同步 Pinia - 当前信息
},
local: { // 本地(永久localStorage)
},

View File

@ -213,7 +213,7 @@ const delStudent = (index) => {
const onSubmit = (formEl) => {
if (!formEl) return
// id
const classRoomId = sessionStore.get('curClassRoom.id')
const classRoomId = sessionStore.get('curr.curClassRoom.id')
formEl.validate((valid) => {
if (valid) {
/**

View File

@ -10,7 +10,7 @@ import _ from 'lodash'
// import { diff } from 'jsondiffpatch'
// const Remote = isNode?require('@electron/remote'):{} // 远程模块
const exArrs = ['subject'] // 不需要同步key-排除
const exArrs = ['subject','env','curr'] // 不需要同步key-排除
export function shareStorePlugin({store}) {
store.$subscribe((mutation, state) => { // 自动同步
@ -60,7 +60,7 @@ function stateSyncWatch(storeName, newState) {
const diffData = findDifferences(oldState, newState)
if(!_.keys(diffData).length) return // 没有变化就终止执行
// 数据处理: 找出差异
// console.log('state-change-diffData', diffData)
console.log('state-change-diffData', diffData, newState)
try {
let pinaValue = {} // store pina状态管理需要的数据格式
// 数据转换处理
@ -83,7 +83,7 @@ function stateSyncWatch(storeName, newState) {
// 没变化也终止执行
if (_.isEqual(oldValAll, newValAll)) return
// 更新本地数据-session
sessionStore.set(key, newValAll)
sessionStore.set(key, newValAll || null)
// 数据处理: pina-store
const jsonStr = JSON.stringify(pinaValue) // 从新组装-json数据

View File

@ -6,7 +6,7 @@ import { sessionStore } from '@/utils/store'
// 默认数据
const defData = sessionStore.store || {}
const exArrs = ['subject']
const exArrs = ['subject','env','curr']
exArrs.forEach(k => Object.keys(defData).includes(k) && (delete defData[k]))
// 延时

View File

@ -18,7 +18,9 @@ const loadPdfAnimation = (path) => {
},2000)
}
onMounted(() => {
const bookpath = localStorage.getItem('PDF-LOCAL-PATH')
console.log('路由参数====',route);
const { pdfUrl } = route.query
const bookpath = !!pdfUrl ? pdfUrl : localStorage.getItem('PDF-LOCAL-PATH')
// const filepath = import.meta.env.VITE_APP_RES_FILE_PATH + bookpath
// const isDev = process.env.NODE_ENV == 'development'
// if (isDev)
@ -28,7 +30,7 @@ onMounted(() => {
// const newpath = getStaticUrl(bookpath, 'user', 'selfFile', true)
loadPdfAnimation(bookpath)
// pdfUrl.value = filepath
// console.log('',newpath);
// console.log('',bookpath);
})
</script>
<style>

View File

@ -636,6 +636,10 @@ export default {
const path = await this.getBookPathFromServer(data.textBook.curBookPath)
const localpath = getAppInstallUrl('pdfjs-dist/web/viewer.html', 'user', '\\out\\renderer', true) + "?file="
localStorage.setItem('PDF-LOCAL-PATH',localpath + encodeURIComponent(import.meta.env.VITE_APP_RES_FILE_PATH + path))
// session
sessionStore.set('curr.textBook', data.textBook)
sessionStore.set('env.pdfBasePath', localpath)
sessionStore.set('env.fileBasePath', import.meta.env.VITE_APP_RES_FILE_PATH)
this.checkFileList = []
this.currentWorkList = []
let cata = parseCataByNode(data.node)

View File

@ -26,6 +26,23 @@
<div class="content" v-if="isVisible">
<slot name="content">
<homework v-if="activeObj?.prop === 'resource'" :curNode="curNode" @closeActive="closeActive" />
<template v-else-if="activeObj?.prop === 'book'">
<div class="item">
<div class="item-title">
<h3>{{ curNode.label }}</h3>
<span class="sub">{{ curNode.edusubject }}</span>
</div>
<div class="item-content" v-loading="loading">
<el-scrollbar height="300px">
<div class="item-content-item" v-for="item in cData">
<el-tag effect="dark">{{ item.tag }}</el-tag>
<span>{{ curNode.bookName }}</span>
<el-button :color="item.color||'#349d44'" size="small" @click="openFile(item)">打开</el-button>
</div>
</el-scrollbar>
</div>
</div>
</template>
<span v-else style="color:red;">{{activeObj}}</span>
</slot>
</div>
@ -37,6 +54,8 @@
import { computed, defineProps, ref, reactive, watchEffect, onMounted} from 'vue'
import { sessionStore } from '@/utils/store'
import homework from './homework.vue';
import { ElMessage } from 'element-plus';
import { toRoter } from '@/utils/tool' //
// -
const colors = ['#409EFF','#00f389', '#ff7f00', '#ffff00', '#00baff', '#13b189', '#F56C6C']
@ -49,7 +68,7 @@ const props = defineProps({
data: { //
type: Array,
default: () => [
{ label: '资源', prop: 'book', isExtra: true, icon: 'icon--kejian' },
{ label: '资源', prop: 'book', icon: 'icon--kejian' },
{ label: '活动', prop: 'resource', icon: 'icon-kechengziyuan1' },
// { label: '', prop: 'interact', icon: 'icon-hudong' },
// { label: '', prop: 'win', icon: 'icon-tubiaozhizuomobanyihuifu-' },
@ -61,10 +80,11 @@ const isVisible = ref(false) // 是否显示内容
const activeObj = ref(null) //
const btnRef = ref(null) // -ref
const topPos = ref(30) // -
const hPost = ref(0) // -
const isFold = ref(false) //
const hPost = ref(0) // -
const isFold = ref(false) //
const cData = ref(null) //
const loading = ref(false) //
let posBtnAll = {} //
let curNode = null //
// === ===
const list = computed(() => props.data.map((o,i) => {
@ -89,7 +109,16 @@ const getStyle = (style,index) => {
return `${style}${style.endsWith(';')?'':';'}color:${color};`
}
}
//
//
const getContent = o => {
loading.value = true
const { bookName } = curNode
const textbook = { type: 'book', tag: '教材', name: bookName }
const course = { type: 'course', tag: '课标', name: bookName }
cData.value = [textbook, course]
loading.value = false
}
// :
const clickHandel = (o, e) => {
if (!o.isExtra) { // :
const node = e.target.parentNode.getBoundingClientRect()
@ -98,15 +127,36 @@ const clickHandel = (o, e) => {
activeObj.value = o
const nodeH = parseInt(node.height / 2) //
topPos.value = Math.round(parseInt(node.top) - posBtnAll.top + nodeH)
//
if (['book'].includes(o.prop)) getContent(o)
}
emit('change', o)
}
// :
const openFile = item => {
if (['book', 'course'].includes(item.type)) {
const isBool = sessionStore.has('curr.textBook')
if (!isBool) return ElMessage.error('打开失败,请重试!')
const textBook = sessionStore.get('curr.textBook')
const pdfBasePath = sessionStore.get('env.pdfBasePath')
const fileBasePath = sessionStore.get('env.fileBasePath')
let path = ''
if (item.type == 'book') path = (textBook.curBookPath||'').replace('.txt', '.pdf')
else path = textBook.curBookPath.replace(/([^-]*)$/, '课标.pdf')
const url = pdfBasePath + encodeURIComponent(`${fileBasePath}${path}`)
//
toRoter(`${process.env['ELECTRON_RENDERER_URL']}/#/fullscreenpdf?pdfUrl=${url}`)
}
}
// :
const closeActive = () =>{
if (isVisible.value) { //
isVisible.value = false
emit('change', { prop: 'close' })
}
}
defineExpose({closeActive})
</script>
<style lang="scss" scoped>
@ -177,5 +227,33 @@ defineExpose({closeActive})
top: var(--top);
transform: rotate(45deg);
}
.content{
//
.item{
margin: 0 15px;
&-title{
margin-bottom: 20px;
h3{
font-size: 20px;
font-weight: bold;
color: #fff;
}
.sub{
color: #cecece;
font-size: 15px;
}
}
&-content-item{
display: flex;
background-color: #384342;
padding: 15px 10px;
margin-bottom: 10px;
justify-content: space-between;
align-items: center;
color: #fff;
border-radius: 5px;
}
}
}
}
</style>

View File

@ -103,7 +103,7 @@ onMounted(async() => {
const getClassInfo = async () => {
const { data } = await classManageApi.getClassInfo(classObj.id)
classObj.data = data
sessionStore.set('curClassRoom', classObj) // -
sessionStore.set('curr.curClassRoom', classObj) // -
// id
let timGroupId = data?.ex3 || ''
console.log('获取群ID:', timGroupId)
@ -208,14 +208,7 @@ const sideChange = async o => {
// console.log(o)
switch(o.prop) {
case 'book':
if(isOpenBook.value) {
isOpenBook.value = false
ElMessage.info('已经打开课本了哦')
}else {
// createWindow('fullScreen-PDF',{url: '/fullscreenpdf'})
toRoter(`${process.env['ELECTRON_RENDERER_URL']}/#/fullscreenpdf`)
isOpenBook.value = true
}
isMask.value = !isMask.value
break
case 'close': //
maskChange(false)