Compare commits

..

4 Commits

6 changed files with 274 additions and 221 deletions

File diff suppressed because one or more lines are too long

View File

@ -13097,15 +13097,16 @@ const PDFViewerApplication = {
}
if (isValidSpreadMode(spread)) {
//默认双页
// this.pdfViewer.spreadMode = spread;
this.pdfViewer.spreadMode = 1;
this.pdfViewer.spreadMode = spread;
//默认双页
// this.pdfViewer.spreadMode = 1;
}
};
this.isInitialViewSet = true;
this.pdfSidebar?.setInitialView(sidebarView);
//默认双页
// setViewerModes(scrollMode, spreadMode);
setViewerModes(scrollMode, 1);
setViewerModes(scrollMode, spreadMode);
// setViewerModes(scrollMode, 1);
if (this.initialBookmark) {
setRotation(this.initialRotation);
delete this.initialRotation;

View File

@ -0,0 +1,27 @@
import request from '@/utils/request'
// 查询分析列表
export function getEvaluationclueList(params) {
return request({
url: '/education/evaluationclue/list',
method: 'get',
params
})
}
//修改分析内容
export function updateEvaluationclue(data) {
return request({
url: '/education/evaluationclue',
method: 'put',
data
})
}
// 新增分析
export function addEvaluationclue(data) {
return request({
url: '/education/evaluationclue',
method: 'post',
data
})
}

View File

@ -0,0 +1,224 @@
import request from '@/utils/request'
import axios from 'axios';
import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
import qs from 'qs';
import { uploadServer, getJSONFile } from '@/utils/common';
import { getEvaluationclueList, updateEvaluationclue, addEvaluationclue } from '@/api/pdf';
export const pdfCallBack = (pdfInfo) => {
if(pdfInfo.toString() !== '{}' || pdfInfo !== null){
if(pdfInfo.storageInfo){
//圈点勾画操作返回
// saveJSON(pdfInfo.storageInfo)
saveAnnotationStorage(pdfInfo.storageInfo)
return 'draw'
}else if(pdfInfo.quoteInfo){
//引用文本操作返回
quoteWords(pdfInfo.quoteInfo)
return 'quote'
}else if(pdfInfo.imgInfo){
//OCR截图返回
ocrCallBack(pdfInfo.imgInfo)
return 'ocr'
}
}else{
return ''
}
}
//百度OCR识别配置
const baidubceConfig = {
// Header
'Content-Type': "application/x-www-form-urlencoded",
// 格式
'Accept' : 'application/json',
// id(临时测试)
'client_id': "U0DrGBE6X92IXgV6cJMNON8F",
// 密钥(临时测试)
'client_secret': 'oWb0M0YWMmZPMQIhIUkJX99ddr7h61qf',
};
//获取百度token
const getBaiduToken = async () => {
let config = {
headers: {
'Content-Type': `${baidubceConfig['Content-Type']}`
},
url: `/baidubce/oauth/2.0/token?grant_type=client_credentials&client_id=${baidubceConfig['client_id']}&client_secret=${baidubceConfig['client_secret']}`,
method: 'POST'
}
return await axios(config)
}
//图片识别方法
const getBaiduOCR = async (token,params) => {
let config = {
headers: {
'Content-Type': `${baidubceConfig['Content-Type']}`,
'Accept': `${baidubceConfig['Accept']}`,
},
method: 'POST',
url: `/baidubce/rest/2.0/ocr/v1/doc_analysis?access_token=${token}`,
data: qs.stringify(params),
}
try{
return await axios(config)
}catch{
return null
}
}
const ocrCallBack = async (ocrInfo) => {
ElMessage({
type: 'info',
message: '正在识别请稍后',
grouping: true,
duration: 3000
})
const baseUrl = ocrInfo.base64;
const imgurl = baseUrl.split(",")[1];
//获取百度智能云token
const tokenData = await getBaiduToken();
console.log('----tokenData',tokenData);
if(tokenData.status !== 200){
ElMessage({
type: 'error',
message: '文字识别获取用户标识失败',
grouping: true,
showClose: true,
duration: 5000
})
return;
}
//获取到的token
const token = tokenData.data?.access_token;
const query = {
image: imgurl, //图片地址(base64)
line_probability: false, //是否返回每行识别结果的置信度。默认为false
disp_line_poly: false, //是否返回每行的四角点坐标。默认为false
words_type: 'handprint_mix', //文字类型。 默认:印刷文字识别 = handwring_only手写文字识别 = handprint_mix 手写印刷混排识别
layout_analysis: false, //是否分析文档版面包括layout图、表、标题、段落、目录attribute栏、页眉、页脚、页码、脚注的分析输出
recg_long_division: false, //是否检测并识别手写竖式
recg_formula: true, //控制是否检测并识别公式默认为false
}
const ocrData = await getBaiduOCR(token,query);
if(ocrData && ocrData.status === 200){
const ocrList = ocrData.data?.words_result;
let words = '';
ocrList.map(item => {
words += item.words
})
ElMessageBox.alert(words, '识别结果', {
confirmButtonText: '引用文本',
type: 'info',
cancelButtonText: '取消'
}).then(() => {
window.navigator.clipboard.writeText(words).then(() => {
ElMessage({
type: 'success',
message: '已复制到粘贴板',
grouping: true,
duration: 3000
})
}).catch(() => {
ElMessage({
type: 'error',
message: '复制信息出错',
grouping: true,
duration: 3000
})
})
})
}else{
ElMessage({
type: 'error',
message: '识别信息出错',
grouping: true,
duration: 3000
})
}
}
const saveAnnotationStorage = (storage) => {
localStorage.setItem('PDFJS_Annotation', JSON.stringify(storage));
}
//保存json文件
export const saveJSON = (data) => {
let filename = ''
if (!data) {
console.log('传入的data数据为null');
return;
}
if (!filename) {
filename = `json${Date.now()}.json`
console.log('未传入文件名,采用默认文件名' + filename);
}
let newdata = null;
if (typeof data === 'object') {
newdata = JSON.stringify(data, undefined, 4)
}
// 创建json文件blob流
const blob = new Blob([newdata], { type: 'text/json' });
// 创建file文件
const file = new File([blob],filename, {type: blob.type})
// 创建上传文件流
const formdata = new FormData();
formdata.append('file', file);
//其他参数待添加
//上传
uploadServer(formdata).then(res => {
console.log('+++++++++++++');
console.log(res.data);
})
//下载json文件
// let e = document.createEvent('MouseEvents');
// let a = document.createElement('a');
// a.download = filename;
// a.href = window.URL.createObjectURL(blob);
// a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
// e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
// a.dispatchEvent(e);
}
//引用文本
const quoteWords = (quoteInfo) => {
const { textStr, StartStr, EndStr } = quoteInfo;
if(textStr === StartStr || textStr === EndStr){
ElNotification({
title: '引用内容',
message: textStr,
duration: 0,
type: 'info',
offset: 120
})
//如果开头和结尾的文字跟内容相同,那么它要么是开头,要么是整段,不需要替换操作
console.log('无需替换------',textStr);
return
}
let midStr = ''
if(StartStr === '' && EndStr === '' && textStr === '') return
if(StartStr === '' && EndStr !== '') {
midStr = textStr.replace(EndStr,'eeeeee').split('eeeeee')[0]
}else if(StartStr !== '' && EndStr === ''){
midStr = textStr.replace(StartStr,'ssssss').split('ssssss')[1]
}else{
midStr = textStr.replace(StartStr, 'ssssss').replace(EndStr,'eeeeee').split('ssssss')[1].split('eeeeee')[0];
}
ElNotification({
title: '引用内容',
message: StartStr + midStr + EndStr,
duration: 0,
type: 'info',
offset: 120
})
console.log('中间文字------',midStr);
console.log('转换后整体文字------',StartStr + midStr + EndStr);
}
//获取分析列表
export const getAnalysisList = async (params) => {
return await getEvaluationclueList(params)
}
//新增分析数据
export const addAnalysis = async (params) => {
return await addEvaluationclue(params);
}
//修改分析数据
export const updateAnalusis = async (params) => {
return await updateEvaluationclue(params);
}

View File

@ -84,11 +84,11 @@ import PDF from '@/components/PdfJs/index.vue'
import { useRoute } from 'vue-router';
import useResoureStore from '../../resource/store'
import { listEvaluationclue } from '@/api/teaching/classwork'
import { uploadServer, getJSONFile } from '@/utils/common'
import { ElNotification } from 'element-plus'
import ChooseTextbook from "@/components/choose-textbook/index.vue";
import { listEvaluation } from '@/api/classManage/index'
import useUserStore from '@/store/modules/user'
import { pdfCallBack } from '@/utils/pdftools'
const userStore = useUserStore()
const sourceStore = useResoureStore()
// import { getStaticUrl } from '@/utils/tool'
@ -171,52 +171,6 @@ const selectHandel = (value) => {
const filterData = searchInp.value !== '' ? showData.value : standList.value
showData.value = filterList(filterData);
}
//json
const saveJSON = (data) => {
let filename = ''
// const data = {
// name: 'txt',
// class: '2',
// school: '',
// time: '2024-08-09'
// }
// saveJSON(jsonStr);
if (!data) {
console.log('传入的data数据为null');
return;
}
if (!filename) {
filename = `json${Date.now()}.json`
console.log('未传入文件名,采用默认文件名' + filename);
}
let newdata = null;
if (typeof data === 'object') {
newdata = JSON.stringify(data, undefined, 4)
}
// jsonblob
const blob = new Blob([newdata], { type: 'text/json' });
// file
// const file = new File([blob],filename, {type: blob.type})
//
// const formdata = new FormData();
// formdata.append('file', file);
//
//
// uploadServer(formdata).then(res => {
// console.log('+++++++++++++');
// console.log(res.data);
// })
let e = document.createEvent('MouseEvents');
let a = document.createElement('a');
a.download = filename;
a.href = window.URL.createObjectURL(blob);
a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
}
//
const getData = (data) => {
const { textBook, node } = data
@ -295,53 +249,9 @@ onMounted(async () => {
window.addEventListener('message',(event) => {
// console.log('------------');
const iframeMes = event.data;
if(iframeMes.storageInfo){
// saveJSON(iframeMes.storageInfo);
// console.log(JSON.stringify(iframeMes.storageInfo));
}
if(iframeMes.quoteInfo){
console.log(iframeMes.quoteInfo);
const { textStr, StartStr, EndStr } = iframeMes.quoteInfo;
if(textStr === StartStr || textStr === EndStr){
ElNotification({
title: '引用内容',
message: textStr,
duration: 0,
type: 'info',
offset: 120
//pdfpdf
pdfCallBack(iframeMes)
})
//
console.log('无需替换------',textStr);
return
}
let midStr = ''
if(StartStr === '' && EndStr === '' && textStr === '') return
if(StartStr === '' && EndStr !== '') {
midStr = textStr.replace(EndStr,'eeeeee').split('eeeeee')[0]
}else if(StartStr !== '' && EndStr === ''){
midStr = textStr.replace(StartStr,'ssssss').split('ssssss')[1]
}else{
midStr = textStr.replace(StartStr, 'ssssss').replace(EndStr,'eeeeee').split('ssssss')[1].split('eeeeee')[0];
}
ElNotification({
title: '引用内容',
message: StartStr + midStr + EndStr,
duration: 0,
type: 'info',
offset: 120
})
console.log('中间文字------',midStr);
console.log('转换后整体文字------',StartStr + midStr + EndStr);
}
})
// const isDev = process.env.NODE_ENV == 'development'
// if (isDev)
// pdfUrl.value = '/'+getStaticUrl('aaa.pdf', 'user', 'selfFile', true)
// else
// pdfUrl.value = getStaticUrl(route.query.path, 'user', 'selfFile', true)
// console.log('',pdfUrl.value);
})
</script>
<style scoped lang="scss">

View File

@ -83,17 +83,15 @@ import { onMounted, ref } from 'vue'
import PDF from '@/components/PdfJs/index.vue'
import { useRoute } from 'vue-router';
import useResoureStore from '../resource/store'
import { listEvaluationclue } from '@/api/teaching/classwork'
// import { uploadServer, getJSONFile } from '@/utils/common'
import { ElNotification } from 'element-plus'
import ChooseTextbook from "@/components/choose-textbook/index.vue";
import { listEvaluation } from '@/api/classManage/index'
import useUserStore from '@/store/modules/user'
import { sessionStore } from '@/utils/store'
import { useGetSubject } from '@/hooks/useGetSubject'
import { pdfCallBack, getAnalysisList, addAnalysis, updateAnalusis } from '@/utils/pdftools'
const userStore = useUserStore()
const sourceStore = useResoureStore()
// import { getStaticUrl } from '@/utils/tool'
const route = useRoute();
const pdfUrl = ref('');
@ -111,7 +109,6 @@ const bookInfo = ref(null);
const booksel = ref(0);
const bookList = ref([])
const searchOptions = [{
value: '0',
label: '按时间',
@ -122,17 +119,6 @@ const searchOptions = [{
const standList = ref([]);
const showData = ref([]);
//
const getlistEvaluationclue = (firstid, levelid) => {
const newid = firstid ? firstid : levelid;
listEvaluationclue({evalid: newid, parentid: 0, cluegroup: 'teachresource', orderby: "timestamp desc", pageSize: 100}).then((res) => {
if(res.code === 200){
const newData = formaterTime(res.rows)
standList.value = newData
showData.value = filterList(newData)
}
})
}
const formaterTime = (data) => {
return data.map(item => {
return {
@ -173,75 +159,7 @@ const selectHandel = (value) => {
const filterData = searchInp.value !== '' ? showData.value : standList.value
showData.value = filterList(filterData);
}
//json
const saveJSON = (data) => {
let filename = ''
// const data = {
// name: 'txt',
// class: '2',
// school: '',
// time: '2024-08-09'
// }
// saveJSON(jsonStr);
if (!data) {
console.log('传入的data数据为null');
return;
}
if (!filename) {
filename = `json${Date.now()}.json`
console.log('未传入文件名,采用默认文件名' + filename);
}
let newdata = null;
if (typeof data === 'object') {
newdata = JSON.stringify(data, undefined, 4)
}
// jsonblob
const blob = new Blob([newdata], { type: 'text/json' });
// file
// const file = new File([blob],filename, {type: blob.type})
//
// const formdata = new FormData();
// formdata.append('file', file);
//
//
// uploadServer(formdata).then(res => {
// console.log('+++++++++++++');
// console.log(res.data);
// })
let e = document.createEvent('MouseEvents');
let a = document.createElement('a');
a.download = filename;
a.href = window.URL.createObjectURL(blob);
a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
}
//
const getData = (data) => {
const { textBook, node } = data
let textbookId = textBook.curBookId
let levelSecondId = node.id
let levelFirstId
if (node.parentNode) {
levelFirstId = node.parentNode.id
} else {
levelFirstId = node.id
levelSecondId = ''
}
sourceStore.query.levelFirstId = levelFirstId
sourceStore.query.levelSecondId = levelSecondId
sourceStore.query.textbookId = textbookId
sourceStore.nodeData = {
textbookId, //
levelFirstId, //
levelSecondId //
}
sourceStore.handleQuery()
getlistEvaluationclue(levelFirstId, levelSecondId)
}
//
const getAllSubject = async () => {
const { edustage, edusubject } = userStore.user;
@ -259,6 +177,7 @@ const getAllSubject = async () => {
bookList.value = dataList
const session = sessionStore.get('subject.curNode')
console.log('session',session);
console.log('datalist',dataList[0]);
let filePath = import.meta.env.VITE_APP_RES_FILE_PATH;
if(session.rootid){
const idx = dataList.findIndex(item => item.id === session.rootid)
@ -269,11 +188,11 @@ const getAllSubject = async () => {
bookInfo.value = {...dataList[0]}
filePath += dataList[0].fileurl.replace('.txt','.pdf')
}
await loadPdfAnimation(filePath)
}else{
bookInfo.value = {...dataList[0]}
filePath += dataList[0].fileurl.replace('.txt','.pdf')
}
await loadPdfAnimation(filePath)
}
const bookChange = async (item, idx) => {
booksel.value = idx
@ -293,6 +212,14 @@ const loadPdfAnimation = (path) => {
onMounted(async () => {
await useGetSubject();
await getAllSubject();
await getAnalysisList({evalid: bookInfo.value.id, parentid: 0, cluegroup: 'textbookAnalysis', orderby: "timestamp desc", pageSize: 100}).then((res) => {
if(res.code === 200){
const newData = formaterTime(res.rows)
standList.value = newData
// showData.value = filterList(newData)
showData.value = newData
}
})
if(cardref.value && headref.value){
const cardH = cardref.value.offsetHeight;
const headh = headref.value.offsetHeight;
@ -309,46 +236,10 @@ onMounted(async () => {
}
})
window.addEventListener('message',(event) => {
// console.log('------------');
console.log('------------');
const iframeMes = event.data;
if(iframeMes.storageInfo){
// saveJSON(iframeMes.storageInfo);
// console.log(JSON.stringify(iframeMes.storageInfo));
}
if(iframeMes.quoteInfo){
console.log(iframeMes.quoteInfo);
const { textStr, StartStr, EndStr } = iframeMes.quoteInfo;
if(textStr === StartStr || textStr === EndStr){
ElNotification({
title: '引用内容',
message: textStr,
duration: 0,
type: 'info',
offset: 120
})
//
console.log('无需替换------',textStr);
return
}
let midStr = ''
if(StartStr === '' && EndStr === '' && textStr === '') return
if(StartStr === '' && EndStr !== '') {
midStr = textStr.replace(EndStr,'eeeeee').split('eeeeee')[0]
}else if(StartStr !== '' && EndStr === ''){
midStr = textStr.replace(StartStr,'ssssss').split('ssssss')[1]
}else{
midStr = textStr.replace(StartStr, 'ssssss').replace(EndStr,'eeeeee').split('ssssss')[1].split('eeeeee')[0];
}
ElNotification({
title: '引用内容',
message: StartStr + midStr + EndStr,
duration: 0,
type: 'info',
offset: 120
})
console.log('中间文字------',midStr);
console.log('转换后整体文字------',StartStr + midStr + EndStr);
}
console.log('------------',iframeMes);
pdfCallBack(iframeMes)
})
// const isDev = process.env.NODE_ENV == 'development'