Forráskód Böngészése

材料采集、教师发展文件预览

liurongli 1 hónapja
szülő
commit
2e519651ff
100 módosított fájl, 23718 hozzáadás és 167 törlés
  1. 1 1
      components/customPopupDialog.vue
  2. 19 38
      components/popupPreviewFile.vue
  3. 19 14
      components/wg-h5-preview-file/wg-h5-preview-file.vue
  4. 74 9
      pages/materialCollection/submitMaterial/submitDetail.vue
  5. 122 10
      pages/materialCollection/taskOverview/taskDetail.vue
  6. 91 1
      pages/teacherHonor/honorAudit/teacherDetail.vue
  7. 92 2
      pages/teacherHonor/honorTeacher/honorDetail.vue
  8. 167 92
      pages/teacherHonor/myHonor/uploadEditMyHonor.vue
  9. 6 0
      uni_modules/cjx-previewOffice/changelog.md
  10. 245 0
      uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue
  11. 28 0
      uni_modules/cjx-previewOffice/components/cjx-previewOffice/interface.ts
  12. 84 0
      uni_modules/cjx-previewOffice/package.json
  13. 116 0
      uni_modules/cjx-previewOffice/readme.md
  14. 147 0
      uni_modules/cjx-previewOffice/static/hybrid/excel.html
  15. 3 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/iconfont.css
  16. 22212 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/luckyexcel.umd.js
  17. 0 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/luckysheet.css
  18. 0 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/luckysheet.umd.js
  19. 0 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/plugin.js
  20. 3 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/plugins.css
  21. 0 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/pluginsCss.css
  22. 279 0
      uni_modules/cjx-previewOffice/static/hybrid/excel/viewer.properties
  23. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-EUC-H.bcmap
  24. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-EUC-V.bcmap
  25. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-H.bcmap
  26. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-RKSJ-H.bcmap
  27. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-RKSJ-V.bcmap
  28. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-V.bcmap
  29. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78ms-RKSJ-H.bcmap
  30. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78ms-RKSJ-V.bcmap
  31. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/83pv-RKSJ-H.bcmap
  32. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90ms-RKSJ-H.bcmap
  33. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90ms-RKSJ-V.bcmap
  34. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90msp-RKSJ-H.bcmap
  35. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90msp-RKSJ-V.bcmap
  36. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90pv-RKSJ-H.bcmap
  37. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90pv-RKSJ-V.bcmap
  38. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-H.bcmap
  39. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-RKSJ-H.bcmap
  40. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-RKSJ-V.bcmap
  41. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-V.bcmap
  42. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-0.bcmap
  43. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-1.bcmap
  44. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-2.bcmap
  45. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-3.bcmap
  46. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-4.bcmap
  47. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-5.bcmap
  48. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-6.bcmap
  49. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-UCS2.bcmap
  50. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-0.bcmap
  51. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-1.bcmap
  52. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-2.bcmap
  53. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-3.bcmap
  54. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-4.bcmap
  55. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-5.bcmap
  56. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-UCS2.bcmap
  57. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-0.bcmap
  58. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-1.bcmap
  59. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-2.bcmap
  60. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-3.bcmap
  61. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-4.bcmap
  62. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-5.bcmap
  63. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-6.bcmap
  64. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-UCS2.bcmap
  65. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-0.bcmap
  66. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-1.bcmap
  67. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-2.bcmap
  68. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-UCS2.bcmap
  69. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5-H.bcmap
  70. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5-V.bcmap
  71. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5pc-H.bcmap
  72. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5pc-V.bcmap
  73. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS-EUC-H.bcmap
  74. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS-EUC-V.bcmap
  75. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS1-H.bcmap
  76. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS1-V.bcmap
  77. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS2-H.bcmap
  78. 3 0
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS2-V.bcmap
  79. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETHK-B5-H.bcmap
  80. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETHK-B5-V.bcmap
  81. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETen-B5-H.bcmap
  82. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETen-B5-V.bcmap
  83. 3 0
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETenms-B5-H.bcmap
  84. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETenms-B5-V.bcmap
  85. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/EUC-H.bcmap
  86. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/EUC-V.bcmap
  87. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-H.bcmap
  88. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-RKSJ-H.bcmap
  89. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-RKSJ-V.bcmap
  90. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-V.bcmap
  91. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-EUC-H.bcmap
  92. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-EUC-V.bcmap
  93. 4 0
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-H.bcmap
  94. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-V.bcmap
  95. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK-EUC-H.bcmap
  96. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK-EUC-V.bcmap
  97. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK2K-H.bcmap
  98. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK2K-V.bcmap
  99. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBKp-EUC-H.bcmap
  100. BIN
      uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBKp-EUC-V.bcmap

+ 1 - 1
components/customPopupDialog.vue

@@ -1,6 +1,6 @@
 <template>
 	<!-- 自定义弹框组件 -->
-	<uni-popup ref="popupDialog" :is-mask-click="isMaskClick">
+	<uni-popup ref="popupDialog" :is-mask-click="isMaskClick" style="z-index: 99;">
 		<view :class="['dialog_wrap',popupType]" :style="{ width: popupType=='center'?`${dialogWidth}rpx`:'100%' }">
 			<view class="dialog_title" v-if="showTitle">
 				<view class="dialog_title_lt">

+ 19 - 38
components/popupPreviewFile.vue

@@ -2,24 +2,9 @@
 	<uni-popup ref="popupDialog" :animation="false" :is-mask-click="isMaskClick">
 		<uni-icons @click="CloseDialog" class="colse" type="closeempty" size="24"></uni-icons>
 		<!-- 图片 -->
-		<image v-if="fileTypeBySuffix=='image'" class="img_width" @click="CloseDialog" :src="filePath" mode="aspectFit"></image>
-		<video v-else-if="fileTypeBySuffix=='video'" id="fileVideo" :src="filePath" @error="videoErrorCallback"></video>
-		<audio v-else-if="fileTypeBySuffix=='audio'" :src="filePath"></audio>
-		<template v-else-if="['word','excel','pptx','pdf','txt'].includes(fileTypeBySuffix)">
-			<template v-if="uniPlatform=='web'">
-				<!-- 默认指H5端 此插件只支持h5 PDF、Word、Excel、PPTX、TXT预览-->
-				<wg-h5-preview-file ref="webPreviewFile" :value="filePath" :name="fileName" :type="fileTypeBySuffix" @CloseDialog="CloseDialog" />
-			</template>
-			<template v-else-if="uniPlatform=='app'">
-				<!-- App端 -->
-			</template>
-			<template v-else-if="uniPlatform=='mp-weixin'">
-				<!-- 微信小程序端 -->
-			</template>
-			<template v-else>
-				<view class="other_file"><text>不支持预览,请点击下载: </text><text style="color: #2e64fa;font-size: 28rpx;" @click="ToDownloadFile">{{fileName}}</text></view>
-			</template>
-		</template>
+		<image v-if="fileType=='image'" class="img_width" @click="CloseDialog" :src="filePath" mode="aspectFit"></image>
+		<video v-else-if="fileType=='video'" ref="fileVideo" id="fileVideo" :src="filePath" style="width: 100%; object-fit: contain;"></video>
+		<audio v-else-if="fileType=='audio'" :src="filePath"></audio>
 		<template v-else>
 			<view class="other_file"><text>不支持预览,请点击下载: </text><text style="color: #2e64fa;font-size: 28rpx;" @click="ToDownloadFile">{{fileName}}</text></view>
 		</template>
@@ -28,9 +13,9 @@
 
 <script setup>
 	import uniPopup from '@/uni_modules/uni-popup/components/uni-popup/uni-popup.vue';
-	import wgH5PreviewFile from '@/components/wg-h5-preview-file/wg-h5-preview-file.vue';
 	import { getFileTypeBySuffix } from '@/common/common.js';
-	import {computed, reactive,ref,nextTick} from 'vue';
+	import {computed, reactive,ref,nextTick,getCurrentInstance} from 'vue';
+	import {onLoad} from '@dcloudio/uni-app';
 	const props = defineProps({
 		isMaskClick:{//蒙版点击是否关闭弹窗
 			type: Boolean,
@@ -49,28 +34,20 @@
 			default: ''
 		},
 	})
+	const videoCtx = ref(null);//播放器
 	const emit = defineEmits(['ToDownloadFile']);//下载
-	const fileTypeBySuffix = computed(()=>{//获取文件类型
-		return getFileTypeBySuffix(props.fileType)
-	});
-	const uniPlatform = uni.getSystemInfoSync().uniPlatform;// 运行平台
 	const state = reactive({});
 	const popupDialog = ref(null);
-	const webPreviewFile = ref(null);//web端文件预览
+	onLoad(() => {
+		console.log(props.fileType,999)
+		if(props.fileType=='video'){
+			const instance = getCurrentInstance();
+			videoCtx.value = uni.createVideoContext('fileVideo', instance.proxy);
+		}
+	})
 	//打开弹窗
 	const OpenDialog = () => {
 		popupDialog.value?.open();
-		if(['word','excel','pptx','pdf','txt'].includes(fileTypeBySuffix.value)){
-			if(uniPlatform=='web'){
-				nextTick(()=>{
-					webPreviewFile.value && webPreviewFile.value.preview({
-						url: props.filePath,
-						type: fileTypeBySuffix.value
-					});
-				})
-			}
-			
-		}
 	}
 	//下载
 	const ToDownloadFile = () => {
@@ -79,10 +56,11 @@
 			filePath:props.filePath,
 			fileName:props.fileName
 		})
+		popupDialog.value?.close();
 	};
 	//关闭弹框
 	const CloseDialog = () => {
-		console.log(121212)
+		videoCtx?.value?.pause();//暂停播放
 		popupDialog.value?.close();
 	}
 	defineExpose({
@@ -94,8 +72,11 @@
 	:deep(.maskClass){
 		background-color: rgba(0, 0, 0, 0.8) !important;
 	}
+	:deep(.uni-popup__wrapper){
+		width: 100%;
+	}
 	.img_width{
-		width: 750rpx;
+		width: 100%;
 		height: 80vh;
 	}
 	.other_file{

+ 19 - 14
components/wg-h5-preview-file/wg-h5-preview-file.vue

@@ -26,19 +26,19 @@ const urlMap = {
 };
 export default {
     name: "WgH5PreviewFile",
-    props: {
-        value: {
-            type: String,
-            required: true,
-        },
-        type: {
-            type: String,
-            required: true,
-            validator(v) {
-                return ["excel", "pdf", "word", "txt", "pptx"].includes(v);
-            },
-        },
-    },
+    // props: {
+    //     value: {
+    //         type: String,
+    //         required: true,
+    //     },
+    //     type: {
+    //         type: String,
+    //         required: true,
+    //         validator(v) {
+    //             return ["excel", "pdf", "word", "txt", "pptx"].includes(v);
+    //         },
+    //     },
+    // },
     computed: {
         iframeUrl() {
             return (
@@ -71,10 +71,14 @@ export default {
             containerHeight: 0,
             // 是否支持 CSS 安全区变量
             cssSafeAreaSupported: false,
+			value:'',
+			type:''
         };
     },
     methods: {
         preview({ url, type }) {
+			this.value = url;
+			this.type = type;
             this.webviewUrl = this.buildPreviewUrl(type, url);
         },
         buildPreviewUrl(fileType, url = "") {
@@ -220,7 +224,7 @@ export default {
         },
         close() {
             this.webviewUrl = null;
-			this.$emit('CloseDialog');
+			this.value = null;
             // uni.navigateBack();
         },
     },
@@ -257,6 +261,7 @@ iframe {
 .wg-h5-preview-file-iframe {
     width: 100vw;
     height: 100% !important;
+	border: 0;
 }
 .wg-h5-preview-file-container {
     position: fixed;

+ 74 - 9
pages/materialCollection/submitMaterial/submitDetail.vue

@@ -117,6 +117,41 @@
 					</view>
 				</view>
 				<view class="list_item" @click="OpenPreviewFile(item)" v-for="item in (state?.targetFileList?.taskTargetFileVos || [])" :Key="item.id">
+					<!-- #ifdef APP-PLUS -->
+					<!-- app端处理 -->
+					<template v-if="['word','excel','pdf','txt'].includes(getFileTypeBySuffix(item.fileType))">
+						<cjx-previewOffice :value="item.filePath" :name="item.fileName" :type="getFileTypeBySuffix(item.fileType)">
+							<image class="file_icon" src="@/static/image/icon/file.png"></image>
+							<view class="file_info">
+								<view class="file_name">{{item.fileName}}</view>
+								<view class="file_size">
+									<text>{{getFileSize(item.fileSize)}}</text>
+									<text>{{ item.createTime }}</text>
+								</view>
+							</view>
+							<view class="file_btn">
+								<text @click.stop="HandleDeleteFileList(item)" :class="['del',{'disabled':state?.targetFileList?.targetStatus === 2 || state?.targetFileList?.targetStatus === 4}]">删除</text>
+								<text class="download" @click.stop="ToDownloadFile(item)">下载</text>
+							</view>
+						</cjx-previewOffice>
+					</template>
+					<template v-else>
+							<image class="file_icon" src="@/static/image/icon/file.png"></image>
+							<view class="file_info">
+								<view class="file_name">{{item.fileName}}</view>
+								<view class="file_size">
+									<text>{{getFileSize(item.fileSize)}}</text>
+									<text>{{ item.createTime }}</text>
+								</view>
+							</view>
+							<view class="file_btn">
+								<text @click.stop="HandleDeleteFileList(item)" :class="['del',{'disabled':state?.targetFileList?.targetStatus === 2 || state?.targetFileList?.targetStatus === 4}]">删除</text>
+								<text class="download" @click.stop="ToDownloadFile(item)">下载</text>
+							</view>
+						</template>
+					<!-- #endif -->
+					<!-- #ifndef APP-PLUS -->
+					<!-- 不包含app端 -->
 					<image class="file_icon" src="@/static/image/icon/file.png"></image>
 					<view class="file_info">
 						<view class="file_name">{{item.fileName}}</view>
@@ -129,6 +164,7 @@
 						<text @click.stop="HandleDeleteFileList(item)" :class="['del',{'disabled':state?.targetFileList?.targetStatus === 2 || state?.targetFileList?.targetStatus === 4}]">删除</text>
 						<text class="download" @click.stop="ToDownloadFile(item)">下载</text>
 					</view>
+					<!-- #endif -->
 				</view>
 			</view>
 		</view>
@@ -145,8 +181,12 @@
 		</view>
 		<!-- 删除确认框 -->
 		<popupDialog ref="popupConfirmDialogRef" :showFootBorder="true" :content="state.confirmDialog.content" @DialogConfirm="DialogConfirm" />
-		<!-- 文件预览 -->
-		<popupPreviewFile ref="popupDialogPreview" :fileType="state.previewPopup.fileType" :fileName="state.previewPopup.fileName" :filePath="state.previewPopup.filePath" @ToDownloadFile="ToDownloadFile"></popupPreviewFile>
+		<!-- 图片 视频预览 -->
+		<popupPreviewFile ref="imgVideoPreview" :fileType="state.previewPopup.fileType" :fileName="state.previewPopup.fileName" :filePath="state.previewPopup.filePath" @ToDownloadFile="ToDownloadFile"></popupPreviewFile>
+		<!-- 默认指H5端 此插件只支持h5 PDF、Word、Excel、PPTX、TXT预览-->
+		<!-- #ifdef H5 -->
+		<wg-h5-preview-file ref="webPreviewFile" />
+		<!-- #endif -->
 		<!-- 文件、图片下载 -->
 		<ss-download ref="ssdownload"></ss-download>
 	</view>
@@ -156,7 +196,13 @@
 	import uniIcons from '@/uni_modules/uni-icons/components/uni-icons/uni-icons.vue';
 	import ssDownload from '@/uni_modules/ss-download/components/ss-download/ss-download.vue';
 	import popupDialog from '@/components/popupDialog.vue';
-	import popupPreviewFile from '@/components/popupPreviewFile.vue';
+	import popupPreviewFile from '@/components/popupPreviewFile.vue';//图片 音视频 zip等预览
+	// #ifdef H5
+	import wgH5PreviewFile from '@/components/wg-h5-preview-file/wg-h5-preview-file.vue';//web端文件预览 'word','excel','pptx','pdf','txt'
+	// #endif
+	// #ifdef APP-PLUS
+	import cjxPreviewOffice from '@/uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue';//APP端文件预览 'word','excel','pdf','txt'
+	// #endif
 	import navBar from '@/components/navBar.vue';
 	import { remainingDays,getFileSize,getFileTypeBySuffix } from '@/common/common.js';
 	import {getTaskTargetFileList,DeleteFileList,DelTaskTargetFileList,updateTaskTarget,uploadTaskTargetFileList} from '@/reqApi/notification.js';
@@ -191,9 +237,11 @@
 		}
 	});
 	const popupConfirmDialogRef = ref(null);
-	const popupDialogPreview = ref(null);
+	const imgVideoPreview = ref(null);//图片 视频
+	const webPreviewFile = ref(null);//web端文件预览
+	const appPreviewOfficeRef = ref(null);//APP端文件预览
 	const fileUploader = ref(null);
-	const ssdownload = ref(null);
+	const ssdownload = ref(null);//下载
 	const files = ref([]);
 	const token = ref(uni.getStorageSync('token'));
 	const apiBaseUrl = ref('');
@@ -266,14 +314,31 @@
 	}
 	//预览
 	const OpenPreviewFile = (item) => {
-		state.previewPopup.fileType = item.fileType;
+		const fileType = getFileTypeBySuffix(item.fileType);
+		state.previewPopup.fileType = fileType?fileType:item.fileType;
 		state.previewPopup.filePath = item.filePath;
 		state.previewPopup.fileName = item.fileName;
-		popupDialogPreview.value.OpenDialog();
+		if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			// #ifdef H5
+			nextTick(()=>{//h5文件预览
+				webPreviewFile.value && webPreviewFile.value.preview({
+					url: item.filePath,
+					type: fileType
+				});
+			})
+			// #endif
+			// #ifdef APP-PLUS
+			if(fileType == 'pptx'){
+				imgVideoPreview.value.OpenDialog();
+			}
+			// #endif
+		}else{
+			imgVideoPreview.value.OpenDialog();
+		}
 		// const fileType = item.fileType;
 		// if(IsImageExts(fileType)){//图片预览
 		// 	state.previewPopup.filePath = item.filePath;
-		// 	popupDialogPreview.value.OpenDialog();
+		// 	imgVideoPreview.value.OpenDialog();
 		// }else{//文件预览
 		// 	// 1. 先下载文件到本地临时目录
 		// 	uni.downloadFile({
@@ -308,7 +373,7 @@
 		let type = '';
 		if(fileType == 'image'){
 			type = '1';//1:图片 2 文档
-		}else if(fileType == 'document'){
+		}else if(['word','excel','pptx','pdf','txt'].includes(fileType)){
 			type = '2';
 		}else{
 			type = '';

+ 122 - 10
pages/materialCollection/taskOverview/taskDetail.vue

@@ -98,7 +98,24 @@
 									<text class="name">{{item.targetName}}</text>
 									<text class="file_num" v-if="state?.[`${state.tabsSelected}Header`]?.includes('fileNum')">文件数量:{{item?.fileNum || 0}}</text>
 								</view>
-								<view class="btn" @click="OpenPreviewFileDialog(item.taskTargetFileVos)">查看</view>
+								<template v-if="state?.[`${state.tabsSelected}Header`]?.includes('fileNum') && item?.fileNum > 0 && state.tabsSelected!='notSubmit'">
+									<!-- #ifdef APP-PLUS -->
+									<!-- app端处理 -->
+									<template v-if="['word','excel','pdf','txt'].includes(getFileTypeBySuffix(item?.taskTargetFileVos?.[0].fileType || ''))">
+										<template v-if="item?.fileNum == 1">
+											<cjx-previewOffice :value="item?.taskTargetFileVos?.[0].filePath" :name="item?.taskTargetFileVos?.[0].fileName" :type="getFileTypeBySuffix(item?.taskTargetFileVos?.[0].fileType)">
+												<view class="btn">查看</view>
+											</cjx-previewOffice>
+										</template>
+										<view v-else class="btn" @click="OpenPreviewFileDialog(item.taskTargetFileVos)">查看</view>
+									</template>
+									<view v-else class="btn" @click="OpenPreviewFileDialog(item.taskTargetFileVos)">查看</view>
+									<!-- #endif -->
+									<!-- #ifndef APP-PLUS -->
+									<!-- 不包含app端 -->
+									<view class="btn" @click="OpenPreviewFileDialog(item.taskTargetFileVos)">查看</view>
+									<!-- #endif -->
+								</template>
 							</view>
 							<view class="item_info">
 								<template v-for="prop in state?.[`${state.tabsSelected}Header`]">
@@ -118,6 +135,7 @@
 				<uni-load-more v-if="state.tabListData.length > 0" :status="state.loadStatus" />
 			</scroll-view>	
 		</view>
+		<!-- 查看文件弹框 -->
 		<customPopupDialog class="file_preview" ref="popupFileDialogRef" title="查看文件" dialogWidth="670" :isMaskClick="false" :showDialogFooter="false">
 			<view class="dialog_content_file">
 				<view class="file_list_item" v-for="item in state.fileDialog.fileList" :Key="item.id">
@@ -130,11 +148,31 @@
 						</view>
 					</view>
 					<view class="file_btn">
-						<text class="preview">预览</text>
+						<!-- #ifdef APP-PLUS -->
+						<!-- app端处理 -->
+						<template v-if="['word','excel','pdf','txt'].includes(getFileTypeBySuffix(item?.fileType || ''))">
+							<cjx-previewOffice :value="item.filePath" :name="item.fileName" :type="getFileTypeBySuffix(item.fileType)">
+								<text class="preview">预览</text>
+							</cjx-previewOffice>
+						</template>
+						<text v-else class="preview" @click="ViewFile(item)">预览</text>
+						<!-- #endif -->
+						<!-- #ifndef APP-PLUS -->
+						<!-- 不包含app端 -->
+						<text class="preview" @click="ViewFile(item)">预览</text>
+						<!-- #endif -->
 					</view>
 				</view>
 			</view>
 		</customPopupDialog>
+		<!-- 图片 视频预览 -->
+		<popupPreviewFile ref="imgVideoPreview" :fileType="state.previewPopup.fileType" :fileName="state.previewPopup.fileName" :filePath="state.previewPopup.filePath" @ToDownloadFile="ToDownloadFile"></popupPreviewFile>
+		<!-- 默认指H5端 此插件只支持h5 PDF、Word、Excel、PPTX、TXT预览-->
+		<!-- #ifdef H5 -->
+		<wg-h5-preview-file ref="webPreviewFile" />
+		<!-- #endif -->
+		<!-- 文件、图片下载 -->
+		<ss-download ref="ssdownload"></ss-download>
 	</view>
 </template>
 
@@ -142,10 +180,18 @@
 	import uniEasyinput from '@/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue';
 	import uniDataSelect from '@/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue';
 	import customPopupDialog from '@/components/customPopupDialog.vue';
+	import ssDownload from '@/uni_modules/ss-download/components/ss-download/ss-download.vue';
+	import popupPreviewFile from '@/components/popupPreviewFile.vue';//图片 音视频 zip等预览
+	// #ifdef H5
+	import wgH5PreviewFile from '@/components/wg-h5-preview-file/wg-h5-preview-file.vue';//web端文件预览 'word','excel','pptx','pdf','txt'
+	// #endif
+	// #ifdef APP-PLUS
+	import cjxPreviewOffice from '@/uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue';//APP端文件预览 'word','excel','pdf','txt'
+	// #endif
 	import uniIcons from '@/uni_modules/uni-icons/components/uni-icons/uni-icons.vue';
 	import uvSticky from '@/uni_modules/uv-sticky/components/uv-sticky/uv-sticky.vue'; //吸顶
 	import navBar from '@/components/navBar.vue';
-	import { remainingDays,getFileSize } from '@/common/common.js';
+	import { remainingDays,getFileSize,getFileTypeBySuffix } from '@/common/common.js';
 	import {
 		GetCollectionTask,
 		getTaskTargetList,
@@ -222,6 +268,11 @@
 		isSticky:false,//是否吸顶
 		fileDialog:{//文件预览
 			fileList:[]
+		},
+		previewPopup:{//文件预览弹框
+			fileType:'',
+			filePath:'',
+			fileName:''
 		}
 	});
 	const statusClassMap = {
@@ -235,18 +286,22 @@
 		2: '已结束'
 	};
 	const popupFileDialogRef = ref(null)
+	const ssdownload = ref(null);//下载
+	const imgVideoPreview = ref(null);//图片 视频
+	const webPreviewFile = ref(null);//web端文件预览
+	const appPreviewOfficeRef = ref(null);//APP端文件预览
 	onLoad((option) => {
 		state.taskId = option.taskId;
 		state.taskStatus = option.taskStatus;
 	})
-	onMounted(() => {
-		QueryCollectionTask();//获取指定的采集任务详情
+	onMounted(async() => {
+		await QueryCollectionTask();//获取指定的采集任务详情
 		QueryTaskSelectCommon();//获取当前任务的筛选表头和数据表的表头
 		OnLoadData(true,true); // 数据加载完成后触发 checkTextOverflow
 	});
 	//获取指定的采集任务详情
-	const QueryCollectionTask = () => {
-		GetCollectionTask(state.taskId).then(res=>{
+	const QueryCollectionTask = async () => {
+		await GetCollectionTask(state.taskId).then(res=>{
 			if(res.code == 200){
 				state.details = res?.data || {};
 				// 审核机制 0-无需审核 1-需要审核
@@ -465,9 +520,60 @@
 	}
 	//打开预览弹框
 	const OpenPreviewFileDialog = (files) => {
-		console.log(files)
-		state.fileDialog.fileList = files || [];
-		popupFileDialogRef.value.OpenDialog();
+		const fileList = files || [];
+		state.fileDialog.fileList = fileList;
+		const len = fileList?.length;
+		if(len == 0){
+			uni.showToast({ title: '暂无文件可查看!', icon: 'none' });
+		}else if(len == 1){
+			OpenPreviewPopup(fileList[0]);
+		}else{
+			popupFileDialogRef.value.OpenDialog();
+		}
+	}
+	const ViewFile = (item) => {
+		OpenPreviewPopup(item);
+	}
+	//文件预览
+	const OpenPreviewPopup = (item) => {
+		const fileType = getFileTypeBySuffix(item.fileType);
+		state.previewPopup.fileType = fileType?fileType:item.fileType;
+		state.previewPopup.filePath = item.filePath;
+		state.previewPopup.fileName = item.fileName;
+		if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			// #ifdef H5
+			nextTick(()=>{//h5文件预览
+				webPreviewFile.value && webPreviewFile.value.preview({
+					url: item.filePath,
+					type: fileType
+				});
+			})
+			// #endif
+			// #ifdef APP-PLUS
+			if(fileType == 'pptx'){
+				imgVideoPreview.value.OpenDialog();
+			}
+			// #endif
+		}else{
+			imgVideoPreview.value.OpenDialog();
+		}
+	}
+	//下载
+	const ToDownloadFile = (item) => {
+		const fileType = getFileTypeBySuffix(item.fileType);//文件类型
+		let type = '';
+		if(fileType == 'image'){
+			type = '1';//1:图片 2 文档
+		}else if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			type = '2';
+		}else{
+			type = '';
+		}
+		ssdownload?.value?.toDownload({
+			type:type,
+			src:item.filePath,
+			fileName:item.fileName
+		});
 	}
 	//返回到顶部
 	const GoTop = () => {
@@ -755,6 +861,12 @@
 					color: #2E64FA;
 				}
 			}
+			:deep(.container){
+				width: auto;
+				.file_content{
+					width: auto;
+				}
+			}
 			.btn{
 				width: 104rpx;
 				height: 64rpx;

+ 91 - 1
pages/teacherHonor/honorAudit/teacherDetail.vue

@@ -33,7 +33,19 @@
 								<view class="file_date">{{item.createdAt}}</view>
 							</view>
 						</view>
-						<view class="preview_btn">预览</view>
+						<!-- #ifdef APP-PLUS -->
+						<!-- app端处理 -->
+						<template v-if="['word','excel','pdf','txt'].includes(getFileTypeBySuffix(item?.documentName?.split('.')?.[1] || ''))">
+							<cjx-previewOffice :value="item.documentUrl" :name="item.documentName" :type="getFileTypeBySuffix(item?.documentName?.split('.')?.[1] || '')">
+								<view class="preview_btn" @click="OpenPreviewFileDialog(item)">预览</view>
+							</cjx-previewOffice>
+						</template>
+						<view v-else class="preview_btn" @click="OpenPreviewFileDialog(item)">预览</view>
+						<!-- #endif -->
+						<!-- #ifndef APP-PLUS -->
+						<!-- 不包含app端 -->
+						<view class="preview_btn" @click="OpenPreviewFileDialog(item)">预览</view>
+						<!-- #endif -->
 					</view>
 				</view>
 			</view>
@@ -48,6 +60,14 @@
 				<uni-easyinput type="textarea" v-model="state.rejectReason" :style="state.easyinputStyle" placeholderStyle="font-weight: 400;font-size: 28rpx;color: #999999;" placeholder="请输入驳回原因…"></uni-easyinput>
 			</view>
 		</customPopupDialog>
+		<!-- 图片 视频预览 -->
+		<popupPreviewFile ref="imgVideoPreview" :fileType="state.previewPopup.fileType" :fileName="state.previewPopup.fileName" :filePath="state.previewPopup.filePath" @ToDownloadFile="ToDownloadFile"></popupPreviewFile>
+		<!-- 默认指H5端 此插件只支持h5 PDF、Word、Excel、PPTX、TXT预览-->
+		<!-- #ifdef H5 -->
+		<wg-h5-preview-file ref="webPreviewFile" />
+		<!-- #endif -->
+		<!-- 文件、图片下载 -->
+		<ss-download ref="ssdownload"></ss-download>
 	</view>
 </template>
 
@@ -56,12 +76,21 @@
 	import uvUpload from '@/uni_modules/uv-upload/components/uv-upload/uv-upload.vue';
 	import customPopupDialog from '@/components/customPopupDialog.vue';
 	import uniEasyinput from '@/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue';
+	import ssDownload from '@/uni_modules/ss-download/components/ss-download/ss-download.vue';
+	import popupPreviewFile from '@/components/popupPreviewFile.vue';//图片 音视频 zip等预览
+	// #ifdef H5
+	import wgH5PreviewFile from '@/components/wg-h5-preview-file/wg-h5-preview-file.vue';//web端文件预览 'word','excel','pptx','pdf','txt'
+	// #endif
+	// #ifdef APP-PLUS
+	import cjxPreviewOffice from '@/uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue';//APP端文件预览 'word','excel','pdf','txt'
+	// #endif
 	import {queryReviewDetail,audioHonorData} from '@/reqApi/teacherHonor.js';
 	import {
 		reactive,
 		ref,
 		nextTick
 	} from 'vue';
+	import { getFileTypeBySuffix } from '@/common/common.js';
 	import { onLoad } from '@dcloudio/uni-app';
 	const state = reactive({
 		id:'',//id
@@ -73,9 +102,18 @@
 		easyinputStyle:{
 			color: '#303133',
 			borderColor: '#E9E9E9'
+		},
+		previewPopup:{//文件预览弹框
+			fileType:'',
+			filePath:'',
+			fileName:''
 		}
 	})
 	const popupDelDialogRef = ref(null);
+	const ssdownload = ref(null);
+	const imgVideoPreview = ref(null);//图片 视频
+	const webPreviewFile = ref(null);//web端文件预览
+	const appPreviewOfficeRef = ref(null);//APP端文件预览
 	onLoad((option) => {
 		state.id = option.id;
 		state.pageTitle = option.pageTitle;
@@ -135,6 +173,51 @@
 			}
 		})
 	}
+	//预览
+	const OpenPreviewFileDialog = (item) => {
+		const fileNameSuffix = item?.documentName?.split('.')?.[1] || '';
+		const fileType = getFileTypeBySuffix(fileNameSuffix);
+		console.log(fileType,899)
+		state.previewPopup.fileType = fileType?fileType:fileNameSuffix;
+		state.previewPopup.filePath = item.documentUrl;
+		state.previewPopup.fileName = item.documentName;
+		if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			// #ifdef H5
+			nextTick(()=>{//h5文件预览
+				webPreviewFile.value && webPreviewFile.value.preview({
+					url: item.documentUrl,
+					type: fileType
+				});
+			})
+			// #endif
+			// #ifdef APP-PLUS
+			if(fileType == 'pptx'){
+				imgVideoPreview.value.OpenDialog();
+			}
+			// #endif
+		}else{
+			imgVideoPreview.value.OpenDialog();
+		}
+	}
+	//下载
+	const ToDownloadFile = (item) => {
+		const fileType = getFileTypeBySuffix(item.fileType);//文件类型
+		let type = '';
+		if(fileType == 'image'){
+			type = '1';//1:图片 2 文档
+		}else if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			type = '2';
+		}else if(fileType == 'video'){
+			type = '3';
+		}else {
+			type = '';
+		}
+		ssdownload?.value?.toDownload({
+			type:type,
+			src:item.filePath,
+			fileName:item.fileName
+		});
+	}
 	const GoBack = () => {
 		uni.navigateBack({
 			delta: 1
@@ -239,6 +322,7 @@
 							width: 80rpx;
 							height: 80rpx;
 							margin-right: 16rpx;
+							flex-shrink: 0;
 						}
 						.file_name{
 							flex: 1;
@@ -267,6 +351,12 @@
 								}
 							}
 						}
+						:deep(.container){
+							width: auto;
+							.file_content{
+								width: auto;
+							}
+						}
 						.preview_btn{
 							width: 96rpx;
 							box-sizing: border-box;

+ 92 - 2
pages/teacherHonor/honorTeacher/honorDetail.vue

@@ -33,18 +33,47 @@
 								<view class="file_date">{{item.createdAt}}</view>
 							</view>
 						</view>
-						<view class="preview_btn">预览</view>
+						<!-- #ifdef APP-PLUS -->
+						<!-- app端处理 -->
+						<template v-if="['word','excel','pdf','txt'].includes(getFileTypeBySuffix(item?.documentName?.split('.')?.[1] || ''))">
+							<cjx-previewOffice :value="item.documentUrl" :name="item.documentName" :type="getFileTypeBySuffix(item?.documentName?.split('.')?.[1] || '')">
+								<view class="preview_btn" @click="OpenPreviewFileDialog(item)">预览</view>
+							</cjx-previewOffice>
+						</template>
+						<view v-else class="preview_btn" @click="OpenPreviewFileDialog(item)">预览</view>
+						<!-- #endif -->
+						<!-- #ifndef APP-PLUS -->
+						<!-- 不包含app端 -->
+						<view class="preview_btn" @click="OpenPreviewFileDialog(item)">预览</view>
+						<!-- #endif -->
 					</view>
 				</view>
 			</view>
 		</view>
 	</view>
+	<!-- 图片 视频预览 -->
+	<popupPreviewFile ref="imgVideoPreview" :fileType="state.previewPopup.fileType" :fileName="state.previewPopup.fileName" :filePath="state.previewPopup.filePath" @ToDownloadFile="ToDownloadFile"></popupPreviewFile>
+	<!-- 默认指H5端 此插件只支持h5 PDF、Word、Excel、PPTX、TXT预览-->
+	<!-- #ifdef H5 -->
+	<wg-h5-preview-file ref="webPreviewFile" />
+	<!-- #endif -->
+	<!-- 文件、图片下载 -->
+	<ss-download ref="ssdownload"></ss-download>
 </template>
 
 <script setup>
 	import navBar from '@/components/navBar.vue';
 	import uvUpload from '@/uni_modules/uv-upload/components/uv-upload/uv-upload.vue';
+	import ssDownload from '@/uni_modules/ss-download/components/ss-download/ss-download.vue';
+	import popupPreviewFile from '@/components/popupPreviewFile.vue';//图片 音视频 zip等预览
+	// #ifdef H5
+	import wgH5PreviewFile from '@/components/wg-h5-preview-file/wg-h5-preview-file.vue';//web端文件预览 'word','excel','pptx','pdf','txt'
+	// #endif
+	// #ifdef APP-PLUS
+	import cjxPreviewOffice from '@/uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue';//APP端文件预览 'word','excel','pdf','txt'
+	// #endif
 	import {queryHonorTeacherDetail} from '@/reqApi/teacherHonor.js';
+	import { getFileTypeBySuffix } from '@/common/common.js';
 	import {
 		reactive,
 		ref,
@@ -55,9 +84,18 @@
 		id:'',//id
 		honorName:'',
 		loading:false,
-		detail:{}
+		detail:{},
+		previewPopup:{//文件预览弹框
+			fileType:'',
+			filePath:'',
+			fileName:''
+		}
 	})
 	const popupDelDialogRef = ref(null);
+	const ssdownload = ref(null);
+	const imgVideoPreview = ref(null);//图片 视频
+	const webPreviewFile = ref(null);//web端文件预览
+	const appPreviewOfficeRef = ref(null);//APP端文件预览
 	onLoad((option) => {
 		state.id = option.id;
 		state.honorName = decodeURIComponent(option.honorName);
@@ -77,6 +115,51 @@
 			}
 		})
 	}
+	//预览
+	const OpenPreviewFileDialog = (item) => {
+		const fileNameSuffix = item?.documentName?.split('.')?.[1] || '';
+		const fileType = getFileTypeBySuffix(fileNameSuffix);
+		console.log(fileType,899)
+		state.previewPopup.fileType = fileType?fileType:fileNameSuffix;
+		state.previewPopup.filePath = item.documentUrl;
+		state.previewPopup.fileName = item.documentName;
+		if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			// #ifdef H5
+			nextTick(()=>{//h5文件预览
+				webPreviewFile.value && webPreviewFile.value.preview({
+					url: item.documentUrl,
+					type: fileType
+				});
+			})
+			// #endif
+			// #ifdef APP-PLUS
+			if(fileType == 'pptx'){
+				imgVideoPreview.value.OpenDialog();
+			}
+			// #endif
+		}else{
+			imgVideoPreview.value.OpenDialog();
+		}
+	}
+	//下载
+	const ToDownloadFile = (item) => {
+		const fileType = getFileTypeBySuffix(item.fileType);//文件类型
+		let type = '';
+		if(fileType == 'image'){
+			type = '1';//1:图片 2 文档
+		}else if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			type = '2';
+		}else if(fileType == 'video'){
+			type = '3';
+		}else {
+			type = '';
+		}
+		ssdownload?.value?.toDownload({
+			type:type,
+			src:item.filePath,
+			fileName:item.fileName
+		});
+	}
 	const GoBack = () => {
 		uni.navigateBack({
 			delta: 1
@@ -146,6 +229,7 @@
 							width: 80rpx;
 							height: 80rpx;
 							margin-right: 16rpx;
+							flex-shrink: 0;
 						}
 						.file_name{
 							flex: 1;
@@ -174,6 +258,12 @@
 								}
 							}
 						}
+						:deep(.container){
+							width: auto;
+							.file_content{
+								width: auto;
+							}
+						}
 						.preview_btn{
 							width: 96rpx;
 							box-sizing: border-box;

+ 167 - 92
pages/teacherHonor/myHonor/uploadEditMyHonor.vue

@@ -40,17 +40,36 @@
 									<view class="time">{{item.createdAt}}</view>
 								</view>
 							</view>
-							<view class="list_item_preview" @click="PreviewFile(item)">预览</view>
+							<!-- #ifdef APP-PLUS -->
+							<!-- app端处理 -->
+							<template v-if="['word','excel','pdf','txt'].includes(getFileTypeBySuffix(item?.documentName?.split('.')?.[1] || ''))">
+								<cjx-previewOffice :value="item.documentUrl" :name="item.documentName" :type="getFileTypeBySuffix(item?.documentName?.split('.')?.[1] || '')">
+									<view class="list_item_preview" @click="OpenPreviewFileDialog(item)">预览</view>
+								</cjx-previewOffice>
+							</template>
+							<view v-else class="list_item_preview" @click="OpenPreviewFileDialog(item)">预览</view>
+							<!-- #endif -->
+							<!-- #ifndef APP-PLUS -->
+							<!-- 不包含app端 -->
+							<view class="list_item_preview" @click="OpenPreviewFileDialog(item)">预览</view>
+							<!-- #endif -->
 						</view>
 					</template>
 					<template v-else>
 						<!-- maxSize:单文件上限 MB;0 表示不限制 maxCount:列表最多文件数 -->
-						<kex-file-uploader ref="fileUploader" mode="headless" :max-count="20" :maxSize="100"></kex-file-uploader>
-						<view class="upload_file_btn" @click="ChooseUploadFile">
+						<kex-file-uploader ref="fileUploader" mode="headless" :multiple="false" :upload-url="`${apiBaseUrl}/api/v1/teach/oss/file/oss/upload_filesSele`" 
+						:upload-options="{
+							name: 'file',
+							header: {
+								Authorization: token
+							}
+						}"
+						:auto-upload="true" :max-count="20" :maxSize="100" @uploadSuccess="onUploadSuccess"></kex-file-uploader>
+						<view class="upload_file_btn" @click="FileChooseUploader">
 							<uni-icons class="upload_file_btn_icon" type="plusempty"></uni-icons>
 							<view class="upload_file_btn_text">上传佐证材料</view>
 						</view>
-						<view class="upload_file_list_item" v-for="(item,i) in state.formData.docDatas" :key="item.createdAt" @click="PreviewFile(item)">
+						<view class="upload_file_list_item" v-for="(item,i) in state.formData.docDatas" :key="item.createdAt">
 							<image class="list_item_icon" src="/static/image/icon/file.png"></image>
 							<view class="list_item_content">
 								<view class="item_content_title">{{item.documentName}}</view>
@@ -73,8 +92,12 @@
 		</view>
 		<view class="page_foot" v-if="state.type!='view'"><button class="btn_submit" type="primary" :loading="state.loading" @click="honorTypeConfirm">确认</button></view>
 	</view>
-	<!-- 提示框 -->
-	<popupPreviewFile ref="popupDialogRef" :filePath="state.previewPopup.filePath"></popupPreviewFile>
+	<!-- 图片 视频预览 -->
+	<popupPreviewFile ref="imgVideoPreview" :fileType="state.previewPopup.fileType" :fileName="state.previewPopup.fileName" :filePath="state.previewPopup.filePath" @ToDownloadFile="ToDownloadFile"></popupPreviewFile>
+	<!-- 默认指H5端 此插件只支持h5 PDF、Word、Excel、PPTX、TXT预览-->
+	<!-- #ifdef H5 -->
+	<wg-h5-preview-file ref="webPreviewFile" />
+	<!-- #endif -->
 	<!-- 文件、图片下载 -->
 	<ss-download ref="ssdownload"></ss-download>
 </template>
@@ -90,9 +113,15 @@
 	import uvUpload from '@/uni_modules/uv-upload/components/uv-upload/uv-upload.vue';
 	import uniIcons from '@/uni_modules/uni-icons/components/uni-icons/uni-icons.vue';
 	import ssDownload from '@/uni_modules/ss-download/components/ss-download/ss-download.vue';
-	import popupPreviewFile from '@/components/popupPreviewFile.vue';
+	import popupPreviewFile from '@/components/popupPreviewFile.vue';//图片 音视频 zip等预览
+	// #ifdef H5
+	import wgH5PreviewFile from '@/components/wg-h5-preview-file/wg-h5-preview-file.vue';//web端文件预览 'word','excel','pptx','pdf','txt'
+	// #endif
+	// #ifdef APP-PLUS
+	import cjxPreviewOffice from '@/uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue';//APP端文件预览 'word','excel','pdf','txt'
+	// #endif
 	import {queryHonorTypeDictList,queryHonorDataDetailById,addHonorCertData,updateHonorCertData} from '@/reqApi/teacherHonor.js';
-	import { unioformDateTransform,fileSizeConvert } from '@/common/common.js';
+	import { unioformDateTransform,fileSizeConvert,getFileTypeBySuffix } from '@/common/common.js';
 	import config from '@/config.js'; // 引入配置文件
 	import {
 		reactive,
@@ -116,8 +145,10 @@
 		dynamicFormData:[],//动态表单
 		dictDatas:[],//动态表单传参
 		loading:false,
-		previewPopup:{
-			filePath:''
+		previewPopup:{//文件预览弹框
+			fileType:'',
+			filePath:'',
+			fileName:''
 		}
 	})
 	const todayStr = ref(new Date().toISOString().split('T')[0]);
@@ -126,8 +157,10 @@
 		certPicDatas: { rules: [{ required: true, errorMessage: '请上传荣誉证书' }] },
 	});
 	const fileUploader = ref(null);
-	const popupDialogRef = ref(null);
 	const ssdownload = ref(null);
+	const imgVideoPreview = ref(null);//图片 视频
+	const webPreviewFile = ref(null);//web端文件预览
+	const appPreviewOfficeRef = ref(null);//APP端文件预览
 	const token = ref(uni.getStorageSync('token'));
 	const apiBaseUrl = ref('');
 	onLoad(async(option) => {
@@ -193,6 +226,15 @@
 	}
 	//设置动态表单的值
 	const SetDynamicFormData = (honorTypeDictData) => {
+		const defaultRules = ['honorTypeValue','certPicDatas'];
+		const defaultFormData = ['honorTypeValue','certPicDatas','docDatas','overruleContent','reviewTeacherName'];
+		for (let key in state.formData) {
+		  if (!defaultFormData.includes(key)) delete state.formData[key];
+		}
+		for (let key in rules.value) {
+		  if (!defaultRules.includes(key)) delete rules.value[key];
+		}
+		rules.value = {...state.defaultRules}
 		honorTypeDictData.forEach(item=>{
 			if(item.dictType == 2){//单选
 				state.formData[`${item.dictShowType}_${item.id}`] = '';
@@ -245,6 +287,7 @@
 	}
 	//提交
 	const honorTypeConfirm = () => {
+		console.log(state.formData,rules.value)
 		for (const key in rules.value) {
 			if (state.formData?.[key] === "" || state.formData?.[key] === null || state.formData?.[key]&&state.formData?.[key]?.length === 0) {
 				const errorMessage = rules.value[key].rules[0].errorMessage;
@@ -380,97 +423,122 @@
 		})
 	}
 	//上传 图片 视频 文档
-	const ChooseUploadFile = () => {
-		fileUploader.value.chooseFile({//选择上传文件
-			count: 1,
-			success: (files) => {
-				fileUploader.value.upload({//上传单个文件
-					url:`${apiBaseUrl.value}/api/v1/teach/oss/file/oss/upload_filesSele`,
-					file: files[0],
-					name: 'file',
-					header: {Authorization: token.value},
-					method: 'POST',
-					// withCredentials: true, // iOS 本地测远程且要带 cookie
-					success: (res) => {
-						const result = JSON.parse(res.result);
-						state.formData.docDatas.push({
-							documentName:result.data.fileName,
-							documentUrl:result.data.url,
-							fileSize:fileSizeConvert(files?.[0]?.size || 0),
-							createdAt:unioformDateTransform(new Date())
-						})
-					},
-					fail: (e) => console.log(e,`${apiBaseUrl.value}/api/v1/teach/oss/file/oss/upload_filesSele`,9999)
-				});
-				// const fileItem = files[0]
-				// // 不使用 fileUploader.value.upload,改用uni原生上传API
-				// uni.uploadFile({
-				// 	url: `${apiBaseUrl.value}/api/v1/teach/oss/file/oss/upload_filesSele`,
-				// 	filePath: fileItem.path,
-				// 	name: 'file', //后端接收文件字段名
-				// 	header: {
-				// 		Authorization: token.value
-				// 	},
-				// 	timeout: 120000, //上传超时时间,大文件2分钟
-				// 	success: (res) => {
-				// 		console.log('上传成功',res, res.statusCode, res.data)
-				// 		const result = JSON.parse(res.data);
-				// 		state.formData.docDatas.push({
-				// 			documentName: result.data.fileName,
-				// 			documentUrl: result.data.url,
-				// 			fileSize: fileSizeConvert(fileItem?.size || 0),
-				// 			createdAt: unioformDateTransform(new Date())
-				// 		})
-				// 	},
-				// 	fail: (err) => {
-				// 		//这里打印iOS原生真实错误,不再是组件包装后的“网络错误”
-				// 		console.error('uni.uploadFile原生失败', err)
-				// 	}
-				// })
-			}
-		})
+	const FileChooseUploader = () => {
+		fileUploader.value && fileUploader.value.choose();
+		// fileUploader.value.chooseFile({//选择上传文件
+		// 	count: 1,
+		// 	success: (files) => {
+		// 		fileUploader.value.upload({//上传单个文件
+		// 			url:`${apiBaseUrl.value}/api/v1/teach/oss/file/oss/upload_filesSele`,
+		// 			file: files[0],
+		// 			name: 'file',
+		// 			header: {Authorization: token.value},
+		// 			method: 'POST',
+		// 			// withCredentials: true, // iOS 本地测远程且要带 cookie
+		// 			success: (res) => {
+		// 				const result = JSON.parse(res.result);
+		// 				state.formData.docDatas.push({
+		// 					documentName:result.data.fileName,
+		// 					documentUrl:result.data.url,
+		// 					fileSize:fileSizeConvert(files?.[0]?.size || 0),
+		// 					createdAt:unioformDateTransform(new Date())
+		// 				})
+		// 			},
+		// 			fail: (e) => console.log(e,`${apiBaseUrl.value}/api/v1/teach/oss/file/oss/upload_filesSele`,9999)
+		// 		});
+		// 		// const fileItem = files[0]
+		// 		// // 不使用 fileUploader.value.upload,改用uni原生上传API
+		// 		// uni.uploadFile({
+		// 		// 	url: `${apiBaseUrl.value}/api/v1/teach/oss/file/oss/upload_filesSele`,
+		// 		// 	filePath: fileItem.path,
+		// 		// 	name: 'file', //后端接收文件字段名
+		// 		// 	header: {
+		// 		// 		Authorization: token.value
+		// 		// 	},
+		// 		// 	timeout: 120000, //上传超时时间,大文件2分钟
+		// 		// 	success: (res) => {
+		// 		// 		console.log('上传成功',res, res.statusCode, res.data)
+		// 		// 		const result = JSON.parse(res.data);
+		// 		// 		state.formData.docDatas.push({
+		// 		// 			documentName: result.data.fileName,
+		// 		// 			documentUrl: result.data.url,
+		// 		// 			fileSize: fileSizeConvert(fileItem?.size || 0),
+		// 		// 			createdAt: unioformDateTransform(new Date())
+		// 		// 		})
+		// 		// 	},
+		// 		// 	fail: (err) => {
+		// 		// 		//这里打印iOS原生真实错误,不再是组件包装后的“网络错误”
+		// 		// 		console.error('uni.uploadFile原生失败', err)
+		// 		// 	}
+		// 		// })
+		// 	}
+		// })
 	}
-	//预览
-	const PreviewFile = (item) => {
-		const fileType = item?.documentName?.split('.')?.[1] || '';
-		if(IsImageExts(fileType)){//图片预览
-			state.previewPopup.filePath = item.documentUrl;
-			popupDialogRef.value.OpenDialog();
-		}else{//文件预览
-			ToDownloadFile(item)
+	//上传成功
+	const onUploadSuccess = ({
+		index,
+		file,        // 当前文件
+		url,         // 优先为解析出的远程地址
+		statusCode,
+		data,        // 解析后的服务端 JSON(失败则为原始字符串)
+		res,         // 原始回调
+		fileList     // 当前全部
+	}) => {
+		const result = JSON.parse(res.data || res.result);
+		const fileObj = result?.data;
+		if(fileObj){
+			state.formData.docDatas.push({
+				documentName:fileObj.fileName,
+				documentUrl:fileObj.url,
+				fileSize:fileSizeConvert(file?.size || 0),
+				createdAt:unioformDateTransform(new Date())
+			})
 		}
+		
 	}
-	//判断是否是图片
-	const IsImageExts = (fileType) => {
-		const type = fileType?.toLowerCase();
-		const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp','svg', 'tiff', 'tif', 'ico', 'avif', 'heic', 'heif'];
-		return imageExts.includes(type)
-	}
-	//判断是不是视频
-	const IsVideoExts = (fileType) => {
-		const type = fileType?.toLowerCase();
-		const videoExts = [
-		    'mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv', 
-		    'webm', 'm4v', '3gp', 'mpeg', 'mpg', 'mts', 
-		    'm2ts', 'ts', 'vob', 'ogv', 'ogg', 'rm', 'rmvb'
-		];
-		return videoExts.includes(type)
+	//预览
+	const OpenPreviewFileDialog = (item) => {
+		const fileNameSuffix = item?.documentName?.split('.')?.[1] || '';
+		const fileType = getFileTypeBySuffix(fileNameSuffix);
+		console.log(fileType,899)
+		state.previewPopup.fileType = fileType?fileType:fileNameSuffix;
+		state.previewPopup.filePath = item.documentUrl;
+		state.previewPopup.fileName = item.documentName;
+		if(['word','excel','pptx','pdf','txt'].includes(fileType)){
+			// #ifdef H5
+			nextTick(()=>{//h5文件预览
+				webPreviewFile.value && webPreviewFile.value.preview({
+					url: item.documentUrl,
+					type: fileType
+				});
+			})
+			// #endif
+			// #ifdef APP-PLUS
+			if(fileType == 'pptx'){
+				imgVideoPreview.value.OpenDialog();
+			}
+			// #endif
+		}else{
+			imgVideoPreview.value.OpenDialog();
+		}
 	}
 	//下载
 	const ToDownloadFile = (item) => {
-		const fileType = item?.documentName?.split('.')?.[1] || '';
+		const fileType = getFileTypeBySuffix(item.fileType);//文件类型
 		let type = '';
-		if(IsImageExts(fileType)){
-			type = '1';//1:图片 2 文档 3 视频
-		}else if(IsVideoExts(fileType)){
-			type = '3';
-		}else{
+		if(fileType == 'image'){
+			type = '1';//1:图片 2 文档
+		}else if(['word','excel','pptx','pdf','txt'].includes(fileType)){
 			type = '2';
+		}else if(fileType == 'video'){
+			type = '3';
+		}else {
+			type = '';
 		}
 		ssdownload?.value?.toDownload({
-			type:fileType,
-			src:item.documentUrl,
-			fileName:item.documentName
+			type:type,
+			src:item.filePath,
+			fileName:item.fileName
 		});
 	}
 	const GoBack = () => {
@@ -618,6 +686,7 @@
 						font-size: 28rpx;
 						color: #333333;
 						word-break: break-all;
+						text-align: left;
 						// white-space: nowrap;
 						// overflow: hidden;
 						// text-overflow: ellipsis;
@@ -649,6 +718,12 @@
 					color: #999999 !important;
 					font-size: 48rpx !important;
 				}
+				.container{
+					width: auto;
+					.file_content{
+						width: auto;
+					}
+				}
 				.list_item_preview{
 					flex-shrink: 0;
 					font-weight: 400;

+ 6 - 0
uni_modules/cjx-previewOffice/changelog.md

@@ -0,0 +1,6 @@
+## 1.0.2(2025-05-19)
+清理无用文件
+## 1.0.1(2025-05-19)
+上传示例项目
+## 1.0.0(2025-05-19)
+发布插件

+ 245 - 0
uni_modules/cjx-previewOffice/components/cjx-previewOffice/cjx-previewOffice.vue

@@ -0,0 +1,245 @@
+<template>
+	<view class="container">
+		<view class="file_content" @click="open">
+			<slot></slot>
+		</view>
+		
+		<view class="cjx-previewOffice-container" :style="{ height: pagesHeight }">
+			<view class="cjx-previewOffice-header" v-if="!$slots.header">
+				<view class="icon" ></view>
+				<view class="name">
+					{{ name }}
+				</view>
+				<uni-icons class="icon" @click="close" type="close" size="40" style="color: #999999;font-size: 40rpx;"></uni-icons>
+				<!-- <icon class="icon" @click="close" type="cancel"></icon> -->
+			</view>
+			
+			<view class="cjx-previewOffice-header" v-else>
+				<slot name="header"></slot>
+			</view>
+			
+			<view class="webview">
+				<!-- #ifdef H5 -->
+					<iframe
+						class="cjx-previewOffice-iframe"
+						:webview-styles="webviewStyles"
+						:src="`${typeMapSrc[type]}${encodeURIComponent(props.value)}&safeBottom=${safeBottom}`"
+					/>
+				<!-- #endif -->
+				
+			</view>
+		</view>
+		
+		<view class="cjx-previewOffice-mask"
+			:style="{
+				zIndex: pagesHeight !== '0' ? zIndex : '-1',
+				opacity: pagesHeight !== '0' ? 1 : 0,
+			}"
+			@click="closeOnClickModalChange"
+			>
+			
+		</view>
+	</view>
+	
+</template>
+
+
+<script lang="ts" setup>
+import { onMounted, ref } from 'vue'
+import type { CSSProperties } from 'vue'
+import { previewOfficeProps, FileType } from './interface'
+// <!-- #ifdef H5 -->
+// <!-- #endif -->
+const props = defineProps(previewOfficeProps())
+
+const showWebviewArr: FileType[] = ['excel', 'pdf', 'word', 'txt']
+
+ 
+ const webviewStyles = ref<CSSProperties>({
+	 zIndex: '9999',
+ })
+ 
+const typeMapSrc = {
+	word: 'uni_modules/cjx-previewOffice/static/hybrid/word.html?file=',
+	pdf: 'uni_modules/cjx-previewOffice/static/hybrid/pdf/web/viewer.html?file=',
+	excel: 'uni_modules/cjx-previewOffice/static/hybrid/excel.html?file=',
+	txt: 'uni_modules/cjx-previewOffice/static/hybrid/txt.html?file=',
+}
+	
+const pagesHeight = ref<string>('0')
+
+
+const safeBottom = ref<number>(0)
+let webview: any = null
+
+
+const open = () => {
+	if (pagesHeight.value === '85vh') {
+		return
+	}
+	
+	// #ifdef H5
+	setTimeout(() => {
+		pagesHeight.value = '85vh'
+	})
+	// #endif
+	
+	// #ifdef APP-PLUS
+	// console.log(11, uni.getSystemInfoSync())
+	const { statusBarHeight, windowHeight, screenHeight } = uni.getSystemInfoSync()
+	pagesHeight.value = Number(windowHeight) - Number(statusBarHeight) + 'px'
+	console.log(windowHeight,windowHeight,windowHeight - statusBarHeight)
+	webview = plus.webview.create(
+		`${typeMapSrc[props.type]}${encodeURIComponent(props.value)}&safeBottom=${safeBottom.value}`,
+		'id', 
+		{ 
+			bottom: 0,
+			height: windowHeight - statusBarHeight - 44,
+		},
+
+	); 
+	const pages = getCurrentPages();
+	const page: any = pages[pages.length - 1];
+	const currentWebview = page.$getAppWebview();
+	
+	currentWebview.append(webview);
+	webview.show('id', 'slide-in-bottom')
+	// #endif
+}
+
+const close = () => {
+	
+	pagesHeight.value = '0'
+
+	// #ifdef APP-PLUS
+	webview.setStyle({
+		height: 0,
+	})
+	webview.close('slide-in-bottom')
+	// #endif
+}
+
+
+const closeOnClickModalChange = () => {
+	if (props.closeOnClickModal) {
+		pagesHeight.value = '0'
+		// #ifdef APP-PLUS
+		webview.setStyle({
+			height: 0,
+		})
+		webview.close('slide-in-bottom')
+		// #endif
+	}
+}
+
+defineExpose({
+	open,
+	close
+})
+
+onMounted(() => {
+	safeBottom.value = 0
+	// #ifdef H5
+	
+	// #endif
+	
+	// #ifdef APP-PLUS
+	uni.getSystemInfo({
+	  success: function (res) {
+	    console.log(res.safeArea); // 输出安全区域信息
+			safeBottom.value = res.screenHeight - res.safeArea.bottom; // 计算底部安全区域高度
+	    console.log('底部安全区域高度:', safeBottom.value);
+	  }
+	});
+	// #endif
+	// if (props.type === 'image') {
+	// 	uni.previewImage({
+	// 		urls: ['https://img2.baidu.com/it/u=412966049,488862975&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=800'],
+	// 	})
+	// }
+	
+})
+
+</script>
+
+<style lang="scss" >
+	iframe {
+		// position: absolute;
+	  // top: 44px !important;
+	  // height: calc(100vh - 44px) !important;
+		// position: absolute;
+		z-index: 9999 !important;
+		border:0;
+		top: calc(15vh + 44px) !important;
+		// height: calc(100% - 70rpx) !important;
+	}
+	.container{
+		display: flex;
+		width: 100%;
+	}
+	.file_content{
+		display: flex;
+		width: 100%;
+	}
+	.cjx-previewOffice-iframe {
+		// z-index: 9999 !important;
+		width: 100vw;
+		top: 44px !important;
+		height: calc(100% - 12px) !important;
+	}
+	.cjx-previewOffice-container {
+		position: fixed;
+		left: 0px;
+		overflow: hidden;
+		z-index: 998;
+		// height: 100vh;
+		width: 100vw;
+		bottom: 0;
+		transition: all ease 0.2s;
+		background-color: #fff;
+		// position: relative;
+		.cjx-previewOffice-header {
+			background-color: #fff;
+			// position: fixed;
+			// top: 0;
+			height: 44px;
+			z-index: 9999;
+			display: flex;
+			align-items: center;
+			width: 100%;
+			padding: 0 16rpx;
+			box-sizing: border-box;
+			.name {
+				width: calc(100% - 80rpx);
+				text-align: center;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
+				padding-right: 10rpx;
+				box-sizing: border-box;
+				
+			}
+			.icon {
+				width: 40rpx;
+				color:#333;
+			}
+		}
+	}
+	
+	.webview {
+		// height: calc(100vh - 44px) !important;
+		height: calc(100% - 70rpx) !important;
+	}
+	
+	.cjx-previewOffice-mask {
+		position: fixed;
+		z-index: 990;
+		background-color: rgba(0, 0, 0, 0.4);
+		top: 0;
+		left: 0;
+		width: 100vw;
+		height: 100vh;
+		opacity: 0;
+		transition: all ease 0.2s;
+	}
+</style>

+ 28 - 0
uni_modules/cjx-previewOffice/components/cjx-previewOffice/interface.ts

@@ -0,0 +1,28 @@
+import type { ExtractPropTypes, PropType } from 'vue'
+
+export function stringType<T extends string = string>(defaultVal?: T) {
+  return { type: String as unknown as PropType<T | string>, default: defaultVal as T }
+}
+
+export function booleanType(defaultVal?: boolean) {
+  return { type: Boolean, default: defaultVal as boolean }
+}
+
+
+export type FileType = 'word' | 'excel' | 'pdf' | 'txt'
+
+export const previewOfficeProps = () => {
+  return {
+    value: stringType(''),
+		name: stringType(''),
+		type: stringType<FileType>('word'),
+		zIndex: {
+			type: Number,
+			default: 990
+		},
+		/** 点击遮罩是否关闭 默认true */
+		closeOnClickModal: booleanType(true)
+  }
+}
+
+export type UploadFileProps = ExtractPropTypes<ReturnType<typeof previewOfficeProps>>

+ 84 - 0
uni_modules/cjx-previewOffice/package.json

@@ -0,0 +1,84 @@
+{
+  "id": "cjx-previewOffice",
+  "displayName": "cjx-previewOffice(h5-ios-安卓预览pdf-excel-word-txt文件)",
+  "version": "1.0.2",
+  "description": " a@ 支持h5-ios-安卓预览 pdf-excel-word-txt文件(纯前端实现)",
+  "keywords": [
+    "cjx-previewOffice"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "插件不采集任何数据",
+      "permissions": "无"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "y"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "n",
+          "vue3": "y"
+        },
+        "App": {
+            "app-vue": "y",
+            "app-nvue": "u",
+            "app-uvue": "u",
+            "app-harmony": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "u",
+          "阿里": "u",
+          "百度": "u",
+          "字节跳动": "u",
+          "QQ": "u",
+          "钉钉": "u",
+          "快手": "u",
+          "飞书": "u",
+          "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 116 - 0
uni_modules/cjx-previewOffice/readme.md

@@ -0,0 +1,116 @@
+# cjx-previewOffice
+
+## 说明
+
+因为在uniapp生态上找不到同时适合H5端,安卓,ios预览pdf-excel-word-txt文件的插件,所以开发了兼容多端的预览插件。该插件是纯前端开发;
+
+### 可以配合cjx-upload插件 进行任意文件的选择
+
+## 使用
+
+Attributes
+
+| 参数      | 说明 | 类型	 | 默认值 | 最低版本 |
+| ----------- | ----------- | ----------- | ----------- | ----------- |
+| value  |  文件地址(支持网络地址和base64数据) |string | - |  -  |
+| name |  文件名称 |  string  |  -  |  -  |
+|  type  |  接受的文件类型 |  FileType( 'word' \| 'excel' \| 'pdf' \| 'txt')  | - | - |
+| closeOnClickModal |  点击遮罩是否关闭 |  boolean  | true | - |
+
+
+
+Exposes
+
+| 事件名      | 说明 | 参数	 | 最低版本 |
+| ----------- | ----------- | ----------- | ----------- |
+| open | 打开预览弹窗 | - |  -  |
+| close | 关闭预览弹窗 | - | - |
+
+
+
+### vue:
+``` javascript
+<view class="content">
+	<view class="list" style="display: flex;margin-top: 40rpx;">
+		<view class="label">
+			pdf
+		</view>
+		 <CjxUpload :multiple="true" accept="pdf/*,.pdf"  v-model="pdfValue" @change="uploadChange" >
+			 <template #file="{ file }">
+				 <cjx-previewOffice
+					ref="previewOfficeRef"
+					:value="file.url || file.base64Url"
+					:name="file.name"
+					type="pdf"
+				>
+				 	{{ file.name }}
+				 </cjx-previewOffice>
+			 </template>
+
+		 </CjxUpload>
+	</view>
+	
+	<view class="list" style="display: flex;margin-top: 40rpx;">
+		<view class="label">
+			excel
+		</view>
+		 <CjxUpload :multiple="true" accept="xlsl/*,.xls,.xlsl" v-model="excelValue" @change="uploadChange" >
+			 <template #file="{ file }">
+				 <cjx-previewOffice
+					ref="previewOfficeRef"
+					:value="file.url || file.base64Url"
+					:name="file.name"
+					type="excel"
+				>
+				 	{{ file.name }}
+				 </cjx-previewOffice>
+			 </template>
+	
+		 </CjxUpload>
+	</view>
+	
+	<view class="list" style="display: flex;margin-top: 40rpx;">
+		<view class="label">
+			word
+		</view>
+		 <CjxUpload :multiple="true" accept="docx/*,.docx" v-model="wordValue" @change="uploadChange" >
+			 <template #file="{ file }">
+				 <cjx-previewOffice
+					ref="previewOfficeRef"
+					:value="file.url || file.base64Url"
+					:name="file.name"
+					type="word"
+				>
+				 	{{ file.name }}
+				 </cjx-previewOffice>
+			 </template>
+	
+		 </CjxUpload>
+	</view>
+	
+	
+	<view class="list" style="display: flex;margin-top: 40rpx;">
+		<view class="label">
+			txt
+		</view>
+		 <CjxUpload :multiple="true" accept="txt/*,.txt" v-model="txtValue" @change="uploadChange" >
+			 <template #file="{ file }">
+				 <cjx-previewOffice
+					ref="previewOfficeRef"
+					:value="file.url || file.base64Url"
+					:name="file.name"
+					type="txt"
+				>
+				 	{{ file.name }}
+				 </cjx-previewOffice>
+			 </template>
+	
+		 </CjxUpload>
+	</view>
+```
+
+## 温馨提示
+	
+* 文件上传
+1. 如说明表达还不够清楚,不清楚怎么使用可导入完整示例项目运行体验和查看	
+2. 如果想使组件支持更多功能请留言

+ 147 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel.html

@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html dir="ltr" mozdisallowselectionprint>
+	<head>
+		<meta charset="utf-8">
+		<title>预览excel</title>
+		
+		<link rel='stylesheet' href='./excel/pluginsCss.css' />
+		<link rel='stylesheet' href='./excel/plugins.css' />
+		<link rel='stylesheet' href='./excel/luckysheet.css' />
+		<link rel='stylesheet' href='./excel/iconfont.css' />
+		<script src="./utils/flexible.js"></script>
+		<script src="./utils/getQueryVariable.js"></script>
+		<script src="./excel/plugin.js"></script>
+		<script src="./excel/luckysheet.umd.js"></script>
+		<script src="./excel/luckyexcel.umd.js"></script>
+		<link rel="resource" type="application/l10n" href="./excel/viewer.properties" />
+	</head>
+	
+	<style type="text/css">
+		*{padding: 0;margin: 0;}
+		body {
+			height: 100vh;
+			width: 100vw;
+		}
+		#container {
+			width: 100%;
+			height: calc(100% - 10px);
+			font-size: 18px;
+		}
+		.luckysheet-sta-c {
+			/* display: flex; */
+		}
+		/* .luckysheet-sta-c {
+			height: 0.77rem;
+		}
+		.luckysheet-zoom-content {
+			width: 4rem;
+			height: 0.77rem;
+			line-height: 0.77rem;
+		}
+		.luckysheet-zoom-content .luckysheet-zoom-minus-icon {
+			width: 0.4rem;
+			height: 0.08rem;
+		}
+		.luckysheet-zoom-content .luckysheet-zoom-plus .luckysheet-zoom-plus-icon {
+			width: 0.4rem;
+			height: 0.4rem;
+		}
+		
+		.luckysheet-zoom-content .luckysheet-zoom-slider {
+			width: 1.8rem;
+			left: 0.5rem;
+		} */
+	</style>
+	
+	<script>
+	
+		(async function () {
+			const fileUrl = decodeURIComponent(getQueryVariable('file') || '')
+			console.log('excel', fileUrl)
+			LuckyExcel.transformExcelToLuckyByUrl(fileUrl, '测试.xlsl', (exportJson, luckysheetfile) => {
+					if (exportJson.sheets == null || exportJson.sheets.length === 0) {
+						console.warn('暂不支持该文件预览')
+						return
+					}
+					const safeBottom = getQueryVariable('safeBottom')
+					document.getElementById('container').style.height = `calc(100% - ${safeBottom}px)`
+					const firstData = []
+					const secondData = {}
+					for (let i = 0; i < exportJson.sheets.length; i++) {
+						firstData[i] = {
+								name: exportJson.sheets[i].name,
+								index: exportJson.sheets[i].index,
+								order: exportJson.sheets[i].order,
+								status: exportJson.sheets[i].status,
+								config: exportJson.sheets[i].config,
+						}
+						firstData[i].config.row = 10
+						parseInt(exportJson.sheets[i].status) === 1 ? (firstData[i].celldata = exportJson.sheets[i].celldata) : 0 == 0
+						secondData[exportJson.sheets[i].index] = exportJson.sheets[i].celldata
+					}
+					// luckysheet生成网页excel
+					window?.luckysheet.destroy()
+					window?.luckysheet.create({
+						lang: 'zh',
+						container: 'container', // 设定DOM容器的id
+						allowUpdate: true,
+						showtoolbar: false, // 是否显示工具栏
+						showinfobar: false, // 是否显示顶部信息栏
+						showstatisticBar: true, // 是否显示底部计数栏
+						sheetBottomConfig: false, // sheet页下方的添加行按钮和回到顶部按钮配置
+						allowEdit: false, // 是否允许前台编辑
+						enableAddRow: false, // 是否允许增加行
+						enableAddCol: false, // 是否允许增加列
+						sheetFormulaBar: false, // 是否显示公式栏
+						data: exportJson.sheets, //表格内容
+						enableAddBackTop: true, //返回顶部
+						title: exportJson.info.name, //表格标题
+						sheetRightClickConfig: {
+							delete: false, // 删除
+							copy: false, // 复制
+							rename: false, //重命名
+							color: false, //更改颜色
+							hide: false, //隐藏,取消隐藏
+							move: false, //向左移,向右移
+						},
+						showsheetbarConfig: {
+							add: false,
+						},
+						devicePixelRatio: window.devicePixelRatio, //分辨率
+						defaultFontSize: 20, //默认字体大小
+						cellRightClickConfig: {
+							copy: false, // 复制
+							copyAs: false, // 复制为
+							paste: false, // 粘贴
+							insertRow: false, // 插入行
+							insertColumn: false, // 插入列
+							deleteRow: false, // 删除选中行
+							deleteColumn: false, // 删除选中列
+							deleteCell: false, // 删除单元格
+							hideRow: false, // 隐藏选中行和显示选中行
+							hideColumn: false, // 隐藏选中列和显示选中列
+							rowHeight: false, // 行高
+							columnWidth: false, // 列宽
+							clear: false, // 清除内容
+							matrix: false, // 矩阵操作选区
+							sort: false, // 排序选区
+							filter: false, // 筛选选区
+							chart: false, // 图表生成
+							image: false, // 插入图片
+							link: false, // 插入链接
+							data: false, // 数据验证
+							cellFormat: false, // 设置单元格格式
+						},
+					})
+			})
+		}())
+	</script>
+	
+	<body id="body">
+		<div id="container"></div>
+	</body>
+	
+	
+	
+</html>
+

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 3 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/iconfont.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 22212 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/luckyexcel.umd.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/luckysheet.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/luckysheet.umd.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/plugin.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 3 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/plugins.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 0 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/pluginsCss.css


+ 279 - 0
uni_modules/cjx-previewOffice/static/hybrid/excel/viewer.properties

@@ -0,0 +1,279 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=上一页
+previous_label=上一页
+next.title=下一页
+next_label=下一页
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=页面
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=缩小
+zoom_out_label=缩小
+zoom_in.title=放大
+zoom_in_label=放大
+zoom.title=缩放
+presentation_mode.title=切换到演示模式
+presentation_mode_label=演示模式
+open_file.title=打开文件
+open_file_label=打开
+print.title=打印
+print_label=打印
+download.title=下载
+download_label=下载
+bookmark.title=当前在看的内容(复制或在新窗口中打开)
+bookmark_label=当前在看
+
+save.title=保存
+save_label=保存
+bookmark1.title=当前页面(在当前页面查看 URL)
+bookmark1_label=当前页面
+
+# Secondary toolbar and context menu
+tools.title=工具
+tools_label=工具
+first_page.title=转到第一页
+first_page_label=转到第一页
+last_page.title=转到最后一页
+last_page_label=转到最后一页
+page_rotate_cw.title=顺时针旋转
+page_rotate_cw_label=顺时针旋转
+page_rotate_ccw.title=逆时针旋转
+page_rotate_ccw_label=逆时针旋转
+
+cursor_text_select_tool.title=启用文本选择工具
+cursor_text_select_tool_label=文本选择工具
+cursor_hand_tool.title=启用手形工具
+cursor_hand_tool_label=手形工具
+
+scroll_page.title=使用页面滚动
+scroll_page_label=页面滚动
+scroll_vertical.title=使用垂直滚动
+scroll_vertical_label=垂直滚动
+scroll_horizontal.title=使用水平滚动
+scroll_horizontal_label=水平滚动
+scroll_wrapped.title=使用平铺滚动
+scroll_wrapped_label=平铺滚动
+
+spread_none.title=不加入衔接页
+spread_none_label=单页视图
+spread_odd.title=加入衔接页使奇数页作为起始页
+spread_odd_label=双页视图
+spread_even.title=加入衔接页使偶数页作为起始页
+spread_even_label=书籍视图
+
+# Document properties dialog box
+document_properties.title=文档属性…
+document_properties_label=文档属性…
+document_properties_file_name=文件名:
+document_properties_file_size=文件大小:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 字节)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 字节)
+document_properties_title=标题:
+document_properties_author=作者:
+document_properties_subject=主题:
+document_properties_keywords=关键词:
+document_properties_creation_date=创建日期:
+document_properties_modification_date=修改日期:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=创建者:
+document_properties_producer=PDF 生成器:
+document_properties_version=PDF 版本:
+document_properties_page_count=页数:
+document_properties_page_size=页面大小:
+document_properties_page_size_unit_inches=英寸
+document_properties_page_size_unit_millimeters=毫米
+document_properties_page_size_orientation_portrait=纵向
+document_properties_page_size_orientation_landscape=横向
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=文本
+document_properties_page_size_name_legal=法律
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} × {{height}} {{unit}}({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} × {{height}} {{unit}}({{name}},{{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=快速 Web 视图:
+document_properties_linearized_yes=是
+document_properties_linearized_no=否
+document_properties_close=关闭
+
+print_progress_message=正在准备打印文档…
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=取消
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=切换侧栏
+toggle_sidebar_notification2.title=切换侧栏(文档所含的大纲/附件/图层)
+toggle_sidebar_label=切换侧栏
+document_outline.title=显示文档大纲(双击展开/折叠所有项)
+document_outline_label=文档大纲
+attachments.title=显示附件
+attachments_label=附件
+layers.title=显示图层(双击即可将所有图层重置为默认状态)
+layers_label=图层
+thumbs.title=显示缩略图
+thumbs_label=缩略图
+current_outline_item.title=查找当前大纲项目
+current_outline_item_label=当前大纲项目
+findbar.title=在文档中查找
+findbar_label=查找
+
+additional_layers=其他图层
+# LOCALIZATION NOTE (page_landmark): "{{page}}" will be replaced by the page number.
+page_landmark=第 {{page}} 页
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=第 {{page}} 页
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=页面 {{page}} 的缩略图
+
+# Find panel button title and messages
+find_input.title=查找
+find_input.placeholder=在文档中查找…
+find_previous.title=查找词语上一次出现的位置
+find_previous_label=上一页
+find_next.title=查找词语后一次出现的位置
+find_next_label=下一页
+find_highlight=全部高亮显示
+find_match_case_label=区分大小写
+find_match_diacritics_label=匹配变音符号
+find_entire_word_label=全词匹配
+find_reached_top=到达文档开头,从末尾继续
+find_reached_bottom=到达文档末尾,从开头继续
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[two]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[few]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[many]=第 {{current}} 项,共匹配 {{total}} 项
+find_match_count[other]=第 {{current}} 项,共匹配 {{total}} 项
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=超过 {{limit}} 项匹配
+find_match_count_limit[one]=超过 {{limit}} 项匹配
+find_match_count_limit[two]=超过 {{limit}} 项匹配
+find_match_count_limit[few]=超过 {{limit}} 项匹配
+find_match_count_limit[many]=超过 {{limit}} 项匹配
+find_match_count_limit[other]=超过 {{limit}} 项匹配
+find_not_found=找不到指定词语
+
+# Error panel labels
+error_more_info=更多信息
+error_less_info=更少信息
+error_close=关闭
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=信息:{{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=堆栈:{{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=文件:{{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=行号:{{line}}
+
+# Predefined zoom values
+page_scale_width=适合页宽
+page_scale_fit=适合页面
+page_scale_auto=自动缩放
+page_scale_actual=实际大小
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading=正在加载…
+
+# Loading indicator messages
+loading_error=加载 PDF 时发生错误。
+invalid_file_error=无效或损坏的 PDF 文件。
+missing_file_error=缺少 PDF 文件。
+unexpected_response_error=意外的服务器响应。
+
+rendering_error=渲染页面时发生错误。
+
+# LOCALIZATION NOTE (annotation_date_string): "{{date}}" and "{{time}}" will be
+# replaced by the modification date, and time, of the annotation.
+annotation_date_string={{date}},{{time}}
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 – Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 注释]
+password_label=输入密码以打开此 PDF 文件。
+password_invalid=密码无效。请重试。
+password_ok=确定
+password_cancel=取消
+
+printing_not_supported=警告:此浏览器尚未完整支持打印功能。
+printing_not_ready=警告:此 PDF 未完成加载,无法打印。
+web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的 PDF 字体。
+
+# Editor
+editor_free_text2.title=文本
+editor_free_text2_label=文本
+editor_ink2.title=绘图
+editor_ink2_label=绘图
+
+free_text2_default_content=开始输入…
+
+# Editor Parameters
+editor_free_text_color=颜色
+editor_free_text_size=字号
+editor_ink_color=颜色
+editor_ink_thickness=粗细
+editor_ink_opacity=不透明度
+
+# Editor aria
+editor_free_text2_aria_label=文本编辑器
+editor_ink2_aria_label=绘图编辑器
+editor_ink_canvas_aria_label=用户创建图像

BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-EUC-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-EUC-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78ms-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/78ms-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/83pv-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90ms-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90ms-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90msp-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90msp-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90pv-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/90pv-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Add-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-0.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-1.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-3.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-4.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-5.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-6.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-CNS1-UCS2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-0.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-1.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-3.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-4.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-5.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-GB1-UCS2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-0.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-1.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-3.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-4.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-5.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-6.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Japan1-UCS2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-0.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-1.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Adobe-Korea1-UCS2.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5pc-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/B5pc-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS-EUC-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS-EUC-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS1-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS1-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS2-H.bcmap


+ 3 - 0
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/CNS2-V.bcmap

@@ -0,0 +1,3 @@
+àRCopyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSEáCNS2-H

BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETHK-B5-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETHK-B5-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETen-B5-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETen-B5-V.bcmap


+ 3 - 0
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETenms-B5-H.bcmap

@@ -0,0 +1,3 @@
+àRCopyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSEá	ETen-B5-H` ^

BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/ETenms-B5-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/EUC-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/EUC-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-RKSJ-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-RKSJ-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/Ext-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-EUC-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-EUC-V.bcmap


+ 4 - 0
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-H.bcmap

@@ -0,0 +1,4 @@
+àRCopyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE!!�º]aX!!]`�21�>	�p�z�$]‚�"R‚d�-Uƒ7�*„
4„%�+ „Z „{�/…%…<�9K…b�1]†.�"‡‰`]‡,�"]ˆ
+�"]ˆh�"]‰F�"]Š$�"]‹�"]‹`�"]Œ>�"]��"]�z�"]ŽX�"]�6�"]��"]�r�"]‘P�"]’.�"]“�"]“j�"]”H�"]•&�"]–�"]–b�"]—@�"]˜�"]˜|�"]™Z�"]š8�"]›�"]›t�"]œR�"]�0�"]ž�"]žl�"]ŸJ�"] (�"]¡�"]¡d�"]¢B�"]£ �"X£~�']¤W�"]¥5�"]¦�"]¦q�"]§O�"]¨-�"]©�"]©i�"]ªG�"]«%�"]¬�"]¬a�"]­?�"]®�"]®{�"]¯Y�"]°7�"]±�"]±s�"]²Q�"]³/�"]´
�"]´k�"]µI�"]¶'�"]·�"]·c�"]¸A�"]¹�"]¹}�"]º[�"]»9

BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GB-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK-EUC-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK-EUC-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK2K-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBK2K-V.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBKp-EUC-H.bcmap


BIN
uni_modules/cjx-previewOffice/static/hybrid/pdf/web/cmaps/GBKp-EUC-V.bcmap


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott