diff --git a/package.json b/package.json index 0f36618..fabd39f 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "build:unpack": "npm run build && electron-builder --dir", "build:dev": "npm run build && electron-builder --win --config ./electron-builder-test.yml", "build:test": "node updatePackageJsonName.js && electron-vite build --mode test && electron-builder --win --config ./electron-builder.yml", - "build:prod": "node updatePackageJsonName.js && electron-vite build --mode production && electron-builder --win --config ./electron-builder-prod.yml", + "build:prod": "node updatePackageJsonName.js && electron-vite build --mode production && electron-builder --win --config ./electron-builder-prod.yml --win", + "build:prod32": "node updatePackageJsonName.js && electron-vite build --mode production && electron-builder --win --config ./electron-builder-prod.yml --win --ia32", "build:yc": "node updatePackageJsonName.js && electron-vite build --mode yc && electron-builder --win --config ./electron-builder-yc.yml", "build:yc2": "node updatePackageJsonName.js && electron-vite build --mode yc2 && electron-builder --win --config ./electron-builder-yc2.yml", "build:lt": "electron-vite build --mode lt && electron-builder --win --config ./electron-builder-lt.yml", @@ -139,4 +140,4 @@ "vue-tsc": "^1.8.25", "windicss": "^3.5.6" } -} \ No newline at end of file +} diff --git a/src/renderer/index.html b/src/renderer/index.html index 579916d..aefa0c5 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -8,13 +8,13 @@ http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:" /> --> - +
- + diff --git a/src/renderer/src/AixPPTist/src/hooks/useImport.ts b/src/renderer/src/AixPPTist/src/hooks/useImport.ts index b990686..3b8825e 100644 --- a/src/renderer/src/AixPPTist/src/hooks/useImport.ts +++ b/src/renderer/src/AixPPTist/src/hooks/useImport.ts @@ -101,7 +101,7 @@ export default () => { reader.readAsText(file) } - + // 导入PPTX文件 const importPPTXFile = (files: FileList) => { @@ -114,7 +114,7 @@ export default () => { for (const item of SHAPE_LIST) { shapeList.push(...item.children) } - + const reader = new FileReader() reader.onload = async e => { const json = await parse(e.target!.result as ArrayBuffer) @@ -174,7 +174,7 @@ export default () => { el.height = el.height * ratio el.left = el.left * ratio el.top = el.top * ratio - + if (el.type === 'text') { const textEl: PPTTextElement = { type: 'text', @@ -263,7 +263,7 @@ export default () => { 'down': 'bottom', 'up': 'top', } - + const element: PPTShapeElement = { type: 'shape', id: nanoid(10), @@ -298,15 +298,15 @@ export default () => { color: el.shadow.color, } } - + if (shape) { element.path = shape.path element.viewBox = shape.viewBox - + if (shape.pathFormula) { element.pathFormula = shape.pathFormula element.viewBox = [el.width, el.height] - + const pathFormula = SHAPE_PATH_FORMULAS[shape.pathFormula] if ('editable' in pathFormula && pathFormula.editable) { element.path = pathFormula.formula(el.width, el.height, pathFormula.defaultValue) @@ -320,19 +320,19 @@ export default () => { else { element.special = true element.path = el.path! - + const { maxX, maxY } = getSvgPathRange(element.path) element.viewBox = [maxX || originWidth, maxY || originHeight] } } - + if (element.path) slide.elements.push(element) } } else if (el.type === 'table') { const row = el.data.length const col = el.data[0].length - + const style: TableCellStyle = { fontname: theme.value.fontName, color: theme.value.fontColor, @@ -372,9 +372,9 @@ export default () => { } data.push(rowCells) } - + const colWidths: number[] = new Array(col).fill(1 / col) - + slide.elements.push({ type: 'table', id: nanoid(10), @@ -397,7 +397,7 @@ export default () => { let labels: string[] let legends: string[] let series: number[][] - + if (el.chartType === 'scatterChart' || el.chartType === 'bubbleChart') { labels = el.data[0].map((item, index) => `坐标${index + 1}`) legends = ['X', 'Y'] @@ -411,7 +411,7 @@ export default () => { } const options: ChartOptions = {} - + let chartType: ChartType = 'bar' switch (el.chartType) { @@ -447,7 +447,7 @@ export default () => { break default: } - + slide.elements.push({ type: 'chart', id: nanoid(10), @@ -487,7 +487,7 @@ export default () => { reader.readAsArrayBuffer(file) } - + return { importSpecificFile, @@ -529,11 +529,13 @@ export const PPTXFileToJson = (data: File|ArrayBuffer) => { } // 开始解析 - const json = await parse(fileArrayBuffer) + const json = await parse(fileArrayBuffer).catch((err) => { + reject(err) + }) const ratio = 96 / 72 const width = json.size.width - + resData.def = json // 保留原始数据 resData.width = width * ratio resData.ratio = slidesStore.viewportRatio @@ -678,7 +680,7 @@ export const PPTXFileToJson = (data: File|ArrayBuffer) => { 'down': 'bottom', 'up': 'top', } - + const element: PPTShapeElement = { type: 'shape', id: nanoid(10), @@ -713,15 +715,15 @@ export const PPTXFileToJson = (data: File|ArrayBuffer) => { color: el.shadow.color, } } - + if (shape) { element.path = shape.path element.viewBox = shape.viewBox - + if (shape.pathFormula) { element.pathFormula = shape.pathFormula element.viewBox = [el.width, el.height] - + const pathFormula = SHAPE_PATH_FORMULAS[shape.pathFormula] if ('editable' in pathFormula && pathFormula.editable) { element.path = pathFormula.formula(el.width, el.height, pathFormula.defaultValue) @@ -740,7 +742,7 @@ export const PPTXFileToJson = (data: File|ArrayBuffer) => { element.viewBox = [maxX || originWidth, maxY || originHeight] } } - + if (element.path) slide.elements.push(element) } } @@ -898,4 +900,4 @@ export const PPTXFileToJson = (data: File|ArrayBuffer) => { resData.slides = slides resolve(resData) }) -} \ No newline at end of file +} diff --git a/src/renderer/src/views/prepare/container/kj-list-item.vue b/src/renderer/src/views/prepare/container/kj-list-item.vue index 0ec8498..b3521fd 100644 --- a/src/renderer/src/views/prepare/container/kj-list-item.vue +++ b/src/renderer/src/views/prepare/container/kj-list-item.vue @@ -18,7 +18,9 @@ {{ item.fileShowName.substring(0, item.fileShowName.lastIndexOf('.')) }} {{item.fileShowName.substring(item.fileShowName.lastIndexOf('.')+1)}} @@ -282,6 +284,71 @@ export default { }) // this.$emit('on-start-class', item) }, + editTagMsg(type, item, value, index) { + let fileTagList = [] + if (!item.fileTag) { + item.fileTag=""; + fileTagList = []; + }else { + fileTagList = item.fileTag.split(','); + } + let message = ''; + switch (type) { + case 'add': + fileTagList.push(value); + message = '添加成功!'; + break; + case 'delete': + fileTagList.splice(index, 1); + message = '删除成功!'; + break; + case 'edit': + fileTagList[index] = value; + message = '修改成功!'; + break; + default: + break; + } + item.fileTagList = fileTagList; + item.fileTag = fileTagList.join(",") + updateSmarttalk({ id: item.id, fileTag: item.fileTag, fileShowName: item.fileShowName }).then((res) => { + if (res.data === true) { + ElMessage({ + type: 'success', + message: message + }) + } + }) + }, + deleteTag(item, item1, index) { + ElMessageBox.confirm( + '是否确认删除这个标签?', + '提示', + { + confirmButtonText: '确认', + cancelButtonText: '取消', + type: 'warning', + } + ) + .then(() => { + this.editTagMsg('delete', item, "", index) + }) + .catch(() => { + }) + }, + editTag(item, item1, index) { + console.log(item, item1, index) + ElMessageBox.prompt('请输入新的标签', '修改标签', { + confirmButtonText: '确认', + cancelButtonText: '取消', + inputValue: item1, + inputPattern: /^[a-zA-Z0-9\u4e00-\u9fa5]{1,5}$/, + inputErrorMessage: '请输入最多五个字的标签,不能携带标点符号' + }) + .then(({ value }) => { + this.editTagMsg('edit', item, value, index) + }).catch(() => {}) + }, editTalk(item) { ElMessageBox.prompt('请输入新的标签', '添加标签', { confirmButtonText: '确认', @@ -291,24 +358,7 @@ export default { inputErrorMessage: '请输入最多五个字的标签,不能携带标点符号' }) .then(({ value }) => { - let fileTagList = [] - if (!item.fileTag) { - item.fileTag=""; - fileTagList = []; - }else { - fileTagList = item.fileTag.split(','); - } - fileTagList.push(value); - item.fileTagList = fileTagList; - item.fileTag = fileTagList.join(",") - updateSmarttalk({ id: item.id, fileTag: item.fileTag, fileShowName: item.fileShowName }).then((res) => { - if (res.data === true) { - ElMessage({ - type: 'success', - message: `添加成功!` - }) - } - }) + this.editTagMsg('add', item, value, 0) }) .catch(() => {}) }, diff --git a/src/renderer/src/views/prepare/index.vue b/src/renderer/src/views/prepare/index.vue index 66ba273..6d69db6 100644 --- a/src/renderer/src/views/prepare/index.vue +++ b/src/renderer/src/views/prepare/index.vue @@ -561,6 +561,7 @@ export default { }, importPPT(item) { let _this = this; + // item.fileFullPath = "https://wzyzoss.eos-chongqing-3.cmecloud.cn/2025/1/14/c4d8ae796fc74417aefe017a49388962.ppt" fetch(item.fileFullPath) .then(res => res.arrayBuffer()) .then(buffer => { @@ -636,7 +637,11 @@ export default { async createAIPPTByFile(file,fileShowName) { this.pgDialog.visible = true this.pgDialog.pg.percentage = 0 - const resPptJson = await PPTXFileToJson(file) + const resPptJson = await PPTXFileToJson(file).catch(() => { + ElMessageBox.alert('PPT文件转换失败!请点击素材右侧...下载文件后打开另存为PPTX文件格式再进行导入!') + this.pgDialog.visible = false + }) + if (!resPptJson) return const { def, slides, ...content } = resPptJson // 生成缩略图 const thumbnails = await slidesToImg(slides, content.width)