瀏覽代碼

工作台样式、校内通知功能

吴朋磊 3 周之前
父節點
當前提交
d854e1c57d
共有 100 個文件被更改,包括 1503 次插入144 次删除
  1. 1 2
      components/notice-header.vue
  2. 1 1
      manifest.json
  3. 715 2
      package-lock.json
  4. 3 1
      package.json
  5. 22 0
      pages.json
  6. 14 2
      pages/message/index.vue
  7. 305 0
      pages/notice/mine/detail.vue
  8. 33 15
      pages/notice/mine/index.vue
  9. 145 0
      pages/notice/mine/preview.vue
  10. 28 27
      pages/notice/overview/index.vue
  11. 2 30
      pages/notice/publish/index.vue
  12. 33 24
      pages/todo/index.vue
  13. 195 40
      pages/workspace/index.vue
  14. 二進制
      static/image/workspace/icon/icon1.png
  15. 二進制
      static/image/workspace/icon/icon10.png
  16. 二進制
      static/image/workspace/icon/icon2.png
  17. 二進制
      static/image/workspace/icon/icon3.png
  18. 二進制
      static/image/workspace/icon/icon4.png
  19. 二進制
      static/image/workspace/icon/icon5.png
  20. 二進制
      static/image/workspace/icon/icon6.png
  21. 二進制
      static/image/workspace/icon/icon7.png
  22. 二進制
      static/image/workspace/icon/icon8.png
  23. 二進制
      static/image/workspace/icon/icon9.png
  24. 二進制
      static/image/workspace/icon1.png
  25. 二進制
      static/image/workspace/icon10.png
  26. 二進制
      static/image/workspace/icon11.png
  27. 二進制
      static/image/workspace/icon12.png
  28. 二進制
      static/image/workspace/icon2.png
  29. 二進制
      static/image/workspace/icon3.png
  30. 二進制
      static/image/workspace/icon4.png
  31. 二進制
      static/image/workspace/icon5.png
  32. 二進制
      static/image/workspace/icon6.png
  33. 二進制
      static/image/workspace/icon7.png
  34. 二進制
      static/image/workspace/icon8.png
  35. 二進制
      static/image/workspace/icon9.png
  36. 二進制
      static/image/workspace/iconLeft.png
  37. 二進制
      static/pdfh5/cmaps/78-EUC-H.bcmap
  38. 二進制
      static/pdfh5/cmaps/78-EUC-V.bcmap
  39. 二進制
      static/pdfh5/cmaps/78-H.bcmap
  40. 二進制
      static/pdfh5/cmaps/78-RKSJ-H.bcmap
  41. 二進制
      static/pdfh5/cmaps/78-RKSJ-V.bcmap
  42. 二進制
      static/pdfh5/cmaps/78-V.bcmap
  43. 二進制
      static/pdfh5/cmaps/78ms-RKSJ-H.bcmap
  44. 二進制
      static/pdfh5/cmaps/78ms-RKSJ-V.bcmap
  45. 二進制
      static/pdfh5/cmaps/83pv-RKSJ-H.bcmap
  46. 二進制
      static/pdfh5/cmaps/90ms-RKSJ-H.bcmap
  47. 二進制
      static/pdfh5/cmaps/90ms-RKSJ-V.bcmap
  48. 二進制
      static/pdfh5/cmaps/90msp-RKSJ-H.bcmap
  49. 二進制
      static/pdfh5/cmaps/90msp-RKSJ-V.bcmap
  50. 二進制
      static/pdfh5/cmaps/90pv-RKSJ-H.bcmap
  51. 二進制
      static/pdfh5/cmaps/90pv-RKSJ-V.bcmap
  52. 二進制
      static/pdfh5/cmaps/Add-H.bcmap
  53. 二進制
      static/pdfh5/cmaps/Add-RKSJ-H.bcmap
  54. 二進制
      static/pdfh5/cmaps/Add-RKSJ-V.bcmap
  55. 二進制
      static/pdfh5/cmaps/Add-V.bcmap
  56. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-0.bcmap
  57. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-1.bcmap
  58. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-2.bcmap
  59. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-3.bcmap
  60. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-4.bcmap
  61. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-5.bcmap
  62. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-6.bcmap
  63. 二進制
      static/pdfh5/cmaps/Adobe-CNS1-UCS2.bcmap
  64. 二進制
      static/pdfh5/cmaps/Adobe-GB1-0.bcmap
  65. 二進制
      static/pdfh5/cmaps/Adobe-GB1-1.bcmap
  66. 二進制
      static/pdfh5/cmaps/Adobe-GB1-2.bcmap
  67. 二進制
      static/pdfh5/cmaps/Adobe-GB1-3.bcmap
  68. 二進制
      static/pdfh5/cmaps/Adobe-GB1-4.bcmap
  69. 二進制
      static/pdfh5/cmaps/Adobe-GB1-5.bcmap
  70. 二進制
      static/pdfh5/cmaps/Adobe-GB1-UCS2.bcmap
  71. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-0.bcmap
  72. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-1.bcmap
  73. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-2.bcmap
  74. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-3.bcmap
  75. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-4.bcmap
  76. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-5.bcmap
  77. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-6.bcmap
  78. 二進制
      static/pdfh5/cmaps/Adobe-Japan1-UCS2.bcmap
  79. 二進制
      static/pdfh5/cmaps/Adobe-Korea1-0.bcmap
  80. 二進制
      static/pdfh5/cmaps/Adobe-Korea1-1.bcmap
  81. 二進制
      static/pdfh5/cmaps/Adobe-Korea1-2.bcmap
  82. 二進制
      static/pdfh5/cmaps/Adobe-Korea1-UCS2.bcmap
  83. 二進制
      static/pdfh5/cmaps/B5-H.bcmap
  84. 二進制
      static/pdfh5/cmaps/B5-V.bcmap
  85. 二進制
      static/pdfh5/cmaps/B5pc-H.bcmap
  86. 二進制
      static/pdfh5/cmaps/B5pc-V.bcmap
  87. 二進制
      static/pdfh5/cmaps/CNS-EUC-H.bcmap
  88. 二進制
      static/pdfh5/cmaps/CNS-EUC-V.bcmap
  89. 二進制
      static/pdfh5/cmaps/CNS1-H.bcmap
  90. 二進制
      static/pdfh5/cmaps/CNS1-V.bcmap
  91. 二進制
      static/pdfh5/cmaps/CNS2-H.bcmap
  92. 3 0
      static/pdfh5/cmaps/CNS2-V.bcmap
  93. 二進制
      static/pdfh5/cmaps/ETHK-B5-H.bcmap
  94. 二進制
      static/pdfh5/cmaps/ETHK-B5-V.bcmap
  95. 二進制
      static/pdfh5/cmaps/ETen-B5-H.bcmap
  96. 二進制
      static/pdfh5/cmaps/ETen-B5-V.bcmap
  97. 3 0
      static/pdfh5/cmaps/ETenms-B5-H.bcmap
  98. 二進制
      static/pdfh5/cmaps/ETenms-B5-V.bcmap
  99. 二進制
      static/pdfh5/cmaps/EUC-H.bcmap
  100. 二進制
      static/pdfh5/cmaps/EUC-V.bcmap

+ 1 - 2
components/notice-header.vue

@@ -244,9 +244,8 @@ const handleSearchInput = () => {
 
 	.tabs_bar {
 		display: flex;
-		padding-top: 4rpx;
 		height: 56rpx;
-		padding-left: 24rpx;
+		padding:4rpx 24rpx 24rpx 24rpx;
 		.tab_item {
 			font-size: 32rpx;
 			color: #999999;

+ 1 - 1
manifest.json

@@ -1,6 +1,6 @@
 {
     "name" : "教师端",
-    "appid" : "__UNI__C45CD76",
+    "appid" : "__UNI__07352BD",
     "description" : "",
     "versionName" : "1.2.0",
     "versionCode" : 20260602,

File diff suppressed because it is too large
+ 715 - 2
package-lock.json


+ 3 - 1
package.json

@@ -15,7 +15,9 @@
     "@vueup/vue-quill": "^1.5.5",
     "echarts": "^5.6.0",
     "jsencrypt": "^3.3.2",
-    "lodash-es": "^4.17.21"
+    "lodash-es": "^4.17.21",
+    "pdfh5": "^3.0.0",
+    "pdfjs-dist": "^3.8.162"
   },
   "devDependencies": {
     "@dcloudio/uni-cli-i18n": "^2.0.2-4060620250520001",

+ 22 - 0
pages.json

@@ -105,6 +105,28 @@
 				"navigationStyle": "custom"
 			}
 		},
+		{
+			"path": "pages/notice/mine/detail",
+			"style": {
+				"navigationBarTitleText": "消息通知",
+				"navigationStyle": "custom",
+				"tabBar": {
+					"custom": true,
+					"hidden": true
+				}
+			}
+		},
+		{
+			"path": "pages/notice/mine/preview",
+			"style": {
+				"navigationBarTitleText": "文件预览",
+				"navigationStyle": "custom",
+				"tabBar": {
+					"custom": true,
+					"hidden": true
+				}
+			}
+		},
 		{
 			"path": "pages/teacherStudy/index",
 			"style": {

+ 14 - 2
pages/message/index.vue

@@ -109,10 +109,18 @@
 
 <style lang="scss">
 .page_message {
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+	background-color: #FFFFFF;
 }
 
 .message_content {
-	padding: 140rpx 24rpx 24rpx 24rpx;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	padding: 140rpx 0rpx 160rpx 0rpx;
 }
 
 .message_header {
@@ -120,7 +128,8 @@
 	align-items: center;
 	justify-content: space-between;
 	margin-bottom: 24rpx;
-
+	flex-shrink: 0;
+	padding:0 24rpx;
 	.message_title {
 		font-weight: 500;
 		font-size: 32rpx;
@@ -143,6 +152,9 @@
 }
 
 .message_list {
+	flex: 1;
+	overflow-y: auto;
+	padding:0 24rpx;
 	.message_item {
 		display: flex;
 		align-items: center;

+ 305 - 0
pages/notice/mine/detail.vue

@@ -0,0 +1,305 @@
+<template>
+	<view class="page_detail">
+		<common-header title="消息通知" @back="goBack"></common-header>
+
+		<view class="detail_content">
+			<view class="detail_header">
+				<text class="detail_title">{{ noticeDetail.noticeName }}</text>
+				<view class="detail_meta">
+					<view class="meta_left">
+						<text class="meta_text">{{ noticeDetail.typeName }}</text>
+						<text class="meta_text">{{ noticeDetail.createTeacherName }}</text>
+						<text class="meta_text">{{ noticeDetail.releaseTime }}</text>
+					</view>
+					<view class="attachment_tag" v-if="noticeDetail.noticeFiles.length > 0" @click="showAttachmentModal = true">
+						<text>附件: {{ noticeDetail.noticeFiles.length }}</text>
+					</view>
+				</view>
+			</view>
+
+			<view class="detail_section">
+				<text class="section_title">通知内容</text>
+				<view class="section_scroll_wrapper">
+					<scroll-view scroll-y class="section_content">
+						<rich-text :nodes="noticeDetail.noticeContent"></rich-text>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+
+		<view class="attachment_modal" v-if="showAttachmentModal" @click="showAttachmentModal = false">
+			<view class="modal_content" @click.stop>
+				<view class="modal_header">
+					<text class="modal_title">查看附件</text>
+					<view class="modal_close" @click="showAttachmentModal = false">
+						<text>×</text>
+					</view>
+				</view>
+				<view class="modal_list_wrapper">
+					<scroll-view scroll-y class="modal_list">
+						<view class="attachment_item" v-for="(file, index) in noticeDetail.noticeFiles" :key="index">
+							<image class="file_icon" src="/static/image/icon/file.png" mode="aspectFit"></image>
+							<view class="file_info">
+								<text class="file_name">{{ file.attachmentName }}</text>
+							</view>
+							<text class="preview_btn" @click="previewFile(file)">预览</text>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+import { onLoad } from '@dcloudio/uni-app';
+import CommonHeader from '@/components/common-header.vue';
+import overviewApi from '@/reqApi/overview.js';
+
+const noticeDetail = ref({
+	noticeName: '',
+	typeName: '',
+	createTeacherName: '',
+	releaseTime: '',
+	noticeFiles: [],
+	noticeContent: ''
+});
+
+const showAttachmentModal = ref(false);
+
+const previewFile = (file) => {
+	if (file.attachmentUrl) {
+		uni.navigateTo({
+			url: `/pages/notice/mine/preview?url=${encodeURIComponent(file.attachmentUrl)}&name=${encodeURIComponent(file.attachmentName || '文件预览')}`
+		});
+	} else {
+		uni.showToast({
+			title: '附件链接为空',
+			icon: 'none'
+		});
+	}
+};
+
+const fetchDetail = async (id) => {
+	try {
+		const res = await overviewApi.notices_detail({ id });
+		if (res.data) {
+			noticeDetail.value = {
+				...res.data,
+				noticeFiles: Array.isArray(res.data.noticeFiles) ? res.data.noticeFiles : []
+			};
+		}
+	} catch (error) {
+		console.error('获取通知详情失败:', error);
+	}
+};
+
+onLoad((options) => {
+	if (options && options.id) {
+		fetchDetail(options.id);
+	}
+});
+
+const goBack = () => {
+	uni.navigateBack();
+};
+</script>
+
+<style lang="scss">
+.page_detail {
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+	background-color: #FFFFFF;
+}
+
+.detail_content {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	padding-top: 140rpx;
+}
+
+.detail_header {
+	padding: 24rpx;
+	border-bottom: 2rpx solid #F3F3F3;
+	flex-shrink: 0;
+
+	.detail_title {
+		font-weight: 500;
+		font-size: 32rpx;
+		color: #333333;
+		line-height: 1.5;
+		margin-bottom: 24rpx;
+		display: block;
+		word-wrap: break-word;
+		white-space: normal;
+	}
+
+	.detail_meta {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+
+		.meta_left {
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+			gap: 16rpx;
+		}
+
+		.meta_text {
+			font-size: 24rpx;
+			color: #999999;
+		}
+
+		.attachment_tag {
+			font-size: 24rpx;
+			color: #2E64FA;
+			padding: 8rpx 16rpx;
+			background-color: rgba(46, 100, 250, 0.1);
+			border-radius: 8rpx;
+			flex-shrink: 0;
+		}
+	}
+}
+
+.detail_section {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+
+	.section_title {
+		font-weight: 500;
+		font-size: 28rpx;
+		color: #333333;
+		padding: 24rpx;
+		display: block;
+		flex-shrink: 0;
+	}
+
+	.section_scroll_wrapper {
+		flex: 1;
+		overflow: hidden;
+		padding: 0 24rpx 90rpx 24rpx;
+		box-sizing: border-box;
+
+		.section_content {
+			height: 100%;
+			font-size: 28rpx;
+			color: #333333;
+			line-height: 1.8;
+
+			:deep(p) {
+				margin-bottom: 16rpx;
+			}
+
+			:deep(ol),
+			:deep(ul) {
+				padding-left: 32rpx;
+				margin-bottom: 16rpx;
+			}
+
+			:deep(li) {
+				margin-bottom: 8rpx;
+			}
+		}
+	}
+}
+
+.attachment_modal {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background-color: rgba(0, 0, 0, 0.5);
+	display: flex;
+	align-items: flex-end;
+	z-index: 1000;
+
+	.modal_content {
+		width: 100%;
+		background-color: #FFFFFF;
+		border-radius: 24rpx 24rpx 0 0;
+		max-height: 70vh;
+		display: flex;
+		flex-direction: column;
+
+		.modal_header {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 32rpx;
+			border-bottom: 2rpx solid #F3F3F3;
+
+			.modal_title {
+				font-weight: 500;
+				font-size: 32rpx;
+				color: #333333;
+			}
+
+			.modal_close {
+				width: 64rpx;
+				height: 64rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 48rpx;
+				color: #999999;
+			}
+		}
+
+		.modal_list_wrapper {
+			flex: 1;
+			overflow: hidden;
+			padding: 24rpx;
+			box-sizing: border-box;
+
+			.modal_list {
+				height: 100%;
+
+				.attachment_item {
+					display: flex;
+					align-items: center;
+					padding: 24rpx;
+					background-color: #F5F7FA;
+					border-radius: 12rpx;
+					margin-bottom: 16rpx;
+
+					.file_icon {
+						width: 80rpx;
+						height: 80rpx;
+						margin-right: 20rpx;
+						flex-shrink: 0;
+					}
+
+					.file_info {
+						flex: 1;
+						overflow: hidden;
+
+						.file_name {
+							font-size: 28rpx;
+							color: #333333;
+							display: block;
+							white-space: nowrap;
+							overflow: hidden;
+							text-overflow: ellipsis;
+						}
+					}
+
+					.preview_btn {
+						font-size: 28rpx;
+						color: #2E64FA;
+						margin-left: 20rpx;
+						flex-shrink: 0;
+					}
+				}
+			}
+		}
+	}
+}
+</style>

+ 33 - 15
pages/notice/mine/index.vue

@@ -6,10 +6,11 @@
 		<view class="notice_content">
 			<view class="notice_list">
 				<scroll-view scroll-y v-for="item in noticeList" :key="item.id" class="notice_item">
-					<view class="item_content">
+					<view class="item_content" @click="handleDetail(item.id)">
 						<view class="notice_title_row">
 							<image class="notice_icon" :src="item.icon" mode="aspectFit"></image>
 							<text class="notice_title">{{ item.title }}</text>
+							<image src="/static/image/icon/xiala.png" class="arrow_icon"></image>
 						</view>
 						<view class="notice_meta">
 							<view class="meta_left">
@@ -28,22 +29,24 @@
 			</view>
 		</view>
 
-		<common-tabbar></common-tabbar>
+		<common-tabbar v-if="showTabbar"></common-tabbar>
 	</view>
 </template>
 
 <script setup>
 import { ref } from 'vue';
-import { onShow } from '@dcloudio/uni-app';
+import { onShow, onLoad } from '@dcloudio/uni-app';
 import NoticeHeader from '@/components/notice-header.vue';
 import NoData from '@/components/no-data.vue';
 import overviewApi from '@/reqApi/overview.js';
 
-const tabs = ['未读', '已读', '全部'];
+const tabs = ['全部', '未读', '已读'];
 const activeTab = ref(0);
+const readStatusMap = [-1, 0, 1];
 const typeId = ref('0');
 const timeType = ref(0);
 const word = ref('');
+const showTabbar = ref(true);
 
 const noticeList = ref([]);
 
@@ -57,7 +60,7 @@ const getDeleteClass = (item) => {
 const fetchNoticeList = async () => {
 	try {
 		const params = {
-			noticeStatus: activeTab.value,
+			readStatus: readStatusMap[activeTab.value],
 			pageParam: {
 				pageNum: 1,
 				pageSize: 9999
@@ -89,6 +92,12 @@ const fetchNoticeList = async () => {
 	}
 };
 
+onLoad((options) => {
+	if (options && options.hideTabbar === 'true') {
+		showTabbar.value = false;
+	}
+});
+
 onShow(() => {
 	fetchNoticeList();
 });
@@ -135,27 +144,31 @@ const handleEdit = (id) => {
 };
 
 const handleDetail = (id) => {
-	const item = noticeList.value.find(item => item.id === id);
-	if (item && item.status === '待发布') {
-		uni.showToast({ title: '待发布通知暂无法查看详情', icon: 'none' });
-		return;
-	}
-	uni.showToast({ title: `查看详情: ${id}`, icon: 'none' });
+	uni.navigateTo({ url: `/pages/notice/mine/detail?id=${id}` });
 };
 </script>
 
 <style lang="scss">
 .page_mine {
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+	background-color: #FFFFFF;
 }
 
 .notice_content {
-	padding-top: 325rpx;
-	padding-bottom: 104px;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	padding: 325rpx 0rpx 104px 0rpx;
 }
 
 .notice_list {
-	padding: 0rpx 24rpx;
-	box-sizing: border-box;
+	flex: 1;
+	overflow-y: auto;
+	overflow-x: hidden;
+	padding: 0 24rpx;
 }
 
 .notice_item {
@@ -177,6 +190,11 @@ const handleDetail = (id) => {
 				height: 32rpx;
 				margin-right: 16rpx;
 			}
+			.arrow_icon {
+				width: 24rpx;
+				height: 24rpx;
+				transform: rotate(-90deg);
+			}
 
 			.notice_title {
 				flex: 1;

+ 145 - 0
pages/notice/mine/preview.vue

@@ -0,0 +1,145 @@
+<template>
+	<view class="page_preview">
+		<common-header :title="fileName" @back="goBack"></common-header>
+		
+		<web-view 
+			v-if="previewUrl" 
+			:src="previewUrl" 
+			class="preview_webview"
+			@error="handleWebViewError"
+			@load="handleWebViewLoad"
+		></web-view>
+		
+		<view v-if="showRetry" class="retry_container">
+			<text class="retry_text">预览加载失败,正在尝试其他服务...</text>
+		</view>
+		
+		<view v-if="showLoading" class="loading_container">
+			<text class="loading_text">加载中...</text>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from 'vue';
+import { onLoad } from '@dcloudio/uni-app';
+import CommonHeader from '@/components/common-header.vue';
+
+const fileUrl = ref('');
+const fileName = ref('文件预览');
+const currentServiceIndex = ref(0);
+const showRetry = ref(false);
+const showLoading = ref(true);
+
+const isPdf = computed(() => {
+	const ext = fileUrl.value.split('.').pop()?.toLowerCase();
+	return ext === 'pdf';
+});
+
+const previewServices = [
+	(fileUrl) => `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`,
+	(fileUrl) => `http://api.idocv.com/view/url?url=${encodeURIComponent(fileUrl)}&name=${encodeURIComponent(fileName.value)}`,
+	(fileUrl) => fileUrl
+];
+
+const previewUrl = computed(() => {
+	const ext = fileUrl.value.split('.').pop()?.toLowerCase();
+	if (!ext) return fileUrl.value;
+	
+	if (ext === 'pdf') {
+		return `/static/pdfh5/index.html?url=${encodeURIComponent(fileUrl.value)}`;
+	}
+	
+	if (['docx', 'doc', 'xlsx', 'xls', 'ppt', 'pptx', 'txt', 'csv', 'wps', 'dps', 'et'].includes(ext)) {
+		return previewServices[currentServiceIndex.value](fileUrl.value);
+	}
+	
+	return fileUrl.value;
+});
+
+const handleWebViewError = () => {
+	if (!isPdf.value && currentServiceIndex.value < previewServices.length - 1) {
+		showRetry.value = true;
+		currentServiceIndex.value++;
+		setTimeout(() => {
+			showRetry.value = false;
+		}, 2000);
+	} else {
+		showLoading.value = false;
+		uni.showToast({
+			title: '预览失败,请重试',
+			icon: 'none'
+		});
+	}
+};
+
+const handleWebViewLoad = () => {
+	showLoading.value = false;
+	showRetry.value = false;
+};
+
+onLoad((options) => {
+	if (options && options.url) {
+		fileUrl.value = decodeURIComponent(options.url);
+	}
+	if (options && options.name) {
+		fileName.value = decodeURIComponent(options.name);
+	}
+});
+
+onMounted(() => {
+	if (!previewUrl.value) {
+		showLoading.value = false;
+	}
+});
+
+const goBack = () => {
+	uni.navigateBack();
+};
+</script>
+
+<style lang="scss">
+.page_preview {
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+	background-color: #FFFFFF;
+}
+
+.preview_webview {
+	flex: 1;
+	margin-top: 96rpx;
+}
+
+.retry_container {
+	position: fixed;
+	top: 120rpx;
+	left: 50%;
+	transform: translateX(-50%);
+	background-color: rgba(0, 0, 0, 0.7);
+	padding: 20rpx 40rpx;
+	border-radius: 12rpx;
+	z-index: 100;
+	
+	.retry_text {
+		font-size: 26rpx;
+		color: #FFFFFF;
+	}
+}
+
+.loading_container {
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+	background-color: rgba(0, 0, 0, 0.5);
+	padding: 40rpx 60rpx;
+	border-radius: 12rpx;
+	z-index: 1000;
+	
+	.loading_text {
+		font-size: 28rpx;
+		color: #FFFFFF;
+	}
+}
+</style>

+ 28 - 27
pages/notice/overview/index.vue

@@ -1,10 +1,11 @@
 <template>
 	<view class="page_notice">
 		<notice-header title="校内通知" :showSearch="true" :showFilter="true" :showTabs="true" :tabs="tabs"
-			:activeTab="activeTab" @tabChange="handleTabChange" @typeChange="handleTypeChange" @timeChange="handleTimeChange" @searchChange="handleSearchChange"></notice-header>
+			:activeTab="activeTab" @tabChange="handleTabChange" @typeChange="handleTypeChange"
+			@timeChange="handleTimeChange" @searchChange="handleSearchChange"></notice-header>
 
 		<view class="notice_content">
-			<view  class="notice_list">
+			<view class="notice_list">
 				<scroll-view scroll-y v-for="item in noticeList" :key="item.id" class="notice_item">
 					<!-- 通知内容 -->
 					<view class="item_content">
@@ -31,12 +32,10 @@
 							<view class="action_btn " :class="getDeleteClass(item)" @click="handleDelete(item.id)">
 								<text>删除</text>
 							</view>
-							<view class="action_btn edit" 
-								@click="handleEdit(item.id)">
+							<view class="action_btn edit" @click="handleEdit(item.id)">
 								<text>编辑</text>
 							</view>
-							<view class="action_btn detail" 
-								@click="handleDetail(item.id)">
+							<view class="action_btn detail" @click="handleDetail(item.id)">
 								<text>详情</text>
 							</view>
 						</view>
@@ -50,15 +49,8 @@
 
 		<common-tabbar></common-tabbar>
 
-		<ConfirmModal
-			:visible="showDeleteModal"
-			title="提示"
-			content="确定要删除该通知吗?"
-			cancelText="取消"
-			confirmText="确定"
-			@cancel="closeDeleteModal"
-			@confirm="confirmDelete"
-		></ConfirmModal>
+		<ConfirmModal :visible="showDeleteModal" title="提示" content="确定要删除该通知吗?" cancelText="取消" confirmText="确定"
+			@cancel="closeDeleteModal" @confirm="confirmDelete"></ConfirmModal>
 
 	</view>
 </template>
@@ -120,7 +112,7 @@ const fetchNoticeList = async () => {
 				unreadCount: item.unReadNum,
 				icon: '/static/image/todo/xiaoxi.png'
 			}));
-		}else{
+		} else {
 			noticeList.value = [];
 		}
 	} catch (error) {
@@ -206,30 +198,35 @@ const handleDetail = (id) => {
 
 <style lang="scss">
 .page_notice {
-	// min-height: 100vh;
-	// background-color: #F5F5F5;
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+	background-color: #FFFFFF;
 }
 
 .notice_content {
-	padding-top: 325rpx;
-	// background-color: #000;
-	padding-bottom: 104px;
+
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	padding: 325rpx 0rpx 104px 0rpx;
+
 }
 
 .notice_list {
-	padding: 0rpx 24rpx;
-	box-sizing: border-box;
-	// flex: 1;
-	// 		overflow-y: auto;
+	flex: 1;
+	overflow-y: auto;
+	overflow-x: hidden;
+	padding: 0 24rpx;
 }
 
 .notice_item {
 	background-color: #F9FAFF;
 	border-radius: 20rpx;
-	// padding: 24rpx;
 	margin-bottom: 24rpx;
 	border: 2rpx solid #E4E7ED;
-	
+
 	.item_content {
 		padding: 24rpx;
 
@@ -302,8 +299,10 @@ const handleDetail = (id) => {
 		justify-content: space-between;
 		align-items: center;
 		padding: 24rpx 16rpx;
+
 		.notice_stats {
 			display: flex;
+
 			.stats_text {
 				font-size: 24rpx;
 				color: #999999;
@@ -318,6 +317,7 @@ const handleDetail = (id) => {
 			display: flex;
 			justify-content: flex-end;
 			gap: 16rpx;
+
 			.action_btn {
 				font-size: 24rpx;
 				padding: 12rpx 24rpx;
@@ -361,6 +361,7 @@ const handleDetail = (id) => {
 			}
 		}
 	}
+
 	&:last-child {
 		margin-bottom: 0;
 	}

+ 2 - 30
pages/notice/publish/index.vue

@@ -1,10 +1,6 @@
 <template>
 	<view class="page_publish">
-		<view class="publish_header">
-			<uni-icons type="back" size="24" color="#333333" @click="goBack"></uni-icons>
-			<text class="header_title">发布通知</text>
-			<text class="header_placeholder"></text>
-		</view>
+		<common-header :title="isEdit ? '编辑通知' : '发布通知'" @back="goBack"></common-header>
 
 		<scroll-view scroll-y class="publish_content">
 			<view class="form_item">
@@ -118,6 +114,7 @@ import uniIcons from '@/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
 import uniDatetimePicker from '@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue';
 import overviewApi from '@/reqApi/overview.js';
 import CustomRadio from '@/components/customRadio.vue';
+import CommonHeader from '@/components/common-header.vue';
 
 const showTypePicker = ref(false);
 const publishType = ref(0);
@@ -466,31 +463,6 @@ const handleSave = async () => {
 	flex-direction: column;
 }
 
-.publish_header {
-	position: fixed;
-	top: 0;
-	left: 0;
-	right: 0;
-	z-index: 100;
-	display: flex;
-	align-items: center;
-	justify-content: space-between;
-	height: 96rpx;
-	padding: 0 24rpx;
-	background-color: #FFFFFF;
-	border-bottom: 2rpx solid #F3F3F3;
-
-	.header_title {
-		font-weight: 500;
-		font-size: 32rpx;
-		color: #333333;
-	}
-
-	.header_placeholder {
-		width: 48rpx;
-	}
-}
-
 .publish_content {
 	flex: 1;
 	box-sizing: border-box;

+ 33 - 24
pages/todo/index.vue

@@ -12,14 +12,26 @@
 					<view class="todo_left">
 						<view class="todo_info">
 							<view class="todo_title_row">
-								<image src="/static/image/todo/xiaoxi.png" class="todo_icon" mode="aspectFit"></image>
+								<image :src="item.source === 1 ? '/static/image/todo/xiaoxi.png' : (item.source === 2 ? '/static/image/todo/daiban.png' : '/static/image/todo/shipin.png')" class="todo_icon" mode="aspectFit"></image>
 								<text class="todo_name">{{ item.title }}</text>
 								<uni-icons type="right" size="18" color="#999999"></uni-icons>
 							</view>
-							<view class="todo_meta">
-								<text class="meta_tag" :class="getTagStyle(item.status)">{{ item.status }}</text>
-								<text v-for="(tag, idx) in item.categoryTags" :key="idx" class="meta_type">{{ tag }}</text>
-								<text class="meta_time">{{ item.time }}</text>
+							<view class="todo_meta" v-if="item.source === 1">
+								<text class="meta_tag" >未读</text>
+								<text class="meta_type" >{{ item.noticeType }}</text>
+								<text class="meta_type" >{{ item.createdBy }}</text>
+								<text class="meta_type" >{{ item.releaseTime }}</text>
+							</view>
+							<view class="todo_meta" v-if="item.source === 2">
+								<text class="meta_tag" :class="getTagStyle('进行中')" >{{ '进行中' }}</text>
+								<text class="meta_type" >{{ item.departmentName }}</text>
+								<text class="meta_type" >{{ item.materialCategoryName }}</text>
+								<text class="meta_type" >{{"剩余" + item.daysRemaining + "天"}}</text>
+							</view>
+							<view class="todo_meta" v-if="item.source === 3">
+								<text class="meta_tag" >{{ item.taskTyp }}</text>
+								<text class="meta_type" >{{ item.workspaceTheme }}</text>
+								<text class="meta_type" >{{ item.contentDomain }}</text>
 							</view>
 						</view>
 					</view>
@@ -56,21 +68,9 @@
 	const fetchTodoList = async () => {
 		try {
 			const res = await workspace.getTodoList();
+			todoList.value = []
 			if (res && res.data) {
-				todoList.value = res.data.map(item => {
-					const categoryTags = [];
-					if (item.departmentName) categoryTags.push(item.departmentName);
-					if (item.materialCategoryName) categoryTags.push(item.materialCategoryName);
-					return {
-						id: item.id,
-						title: item.title,
-						status: item.source === 2 ? '进行中' : (item.notSubmitNum > 0 ? `待提交:${item.notSubmitNum}` : (item.rejectNum > 0 ? `已驳回:${item.rejectNum}` : '')),
-        				btnText: item.source === 1 ? '查看通知' : '查看任务',
-						categoryTags,
-						time: item.daysRemaining !== undefined ? `剩余${item.daysRemaining}天` : '',
-						tag: '',
-					};
-				});
+				todoList.value = res.data
 			}
 			} catch (error) {
 			console.error('获取待办事项列表失败:', error);
@@ -84,20 +84,26 @@
 
 <style lang="scss">
 .page_todo {
-	// min-height: 100vh;
-	// background-color: #F5F7FA;
-	// padding-bottom: 120rpx;
+	height: 100vh;
+	display: flex;
+	flex-direction: column;
+	background-color: #FFFFFF;
 }
 
 .todo_content {
-	padding: 140rpx 24rpx 24rpx 24rpx;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	padding: 140rpx 0rpx 160rpx 0rpx;
 }
 // 待办事项标题
 .todo_header {
 	display: flex;
 	align-items: baseline;
 	margin-bottom: 24rpx;
-
+	padding:0 24rpx;
+	
 	.todo_title {
 		font-weight: 500;
 		font-size: 32rpx;
@@ -112,6 +118,9 @@
 }
 
 .todo_list {
+	flex: 1;
+	overflow-y: auto;
+	padding:0 24rpx;
 	.todo_item {
 		display: flex;
 		align-items: center;

+ 195 - 40
pages/workspace/index.vue

@@ -1,21 +1,57 @@
 <template>
 	<view class="page_workspace">
 		<page-header></page-header>
-		<view class="workspace_content">
+		<scroll-view scroll-y class="workspace_content">
 			<!-- 系统列表 -->
 			<view class="system_list">
 				<view class="section_title">系统列表</view>
-				<view class="system_grid">
-					<view 
-						v-for="(item, index) in systemItems" 
-						:key="index" 
-						class="system_item"
-						@click="handleSystemClick(item)"
-					>
-						<image :src="item.image" class="system_icon" mode="aspectFit"></image>
-						<text class="system_name">{{ item.name }}</text>
+				
+				<template v-if="largeCard?.visible">
+					<view class="system_grid_with_large">
+						<view class="large_card" @click="handleSystemClick(largeCard)">
+							<image :src="largeCard.image" class="large_icon" mode="aspectFit"></image>
+							<text class="large_name">{{ largeCard.name }}</text>
+						</view>
+						
+						<view class="right_top_grid">
+							<view 
+								v-for="(item, index) in rightTopCards" 
+								:key="index" 
+								class="small_item"
+								@click="handleSystemClick(item)"
+							>
+								<image :src="item.image" class="small_icon" mode="aspectFit"></image>
+								<text class="small_name">{{ item.name }}</text>
+							</view>
+						</view>
 					</view>
-				</view>
+					
+					<view class="bottom_grid">
+						<view 
+							v-for="(item, index) in bottomCards" 
+							:key="index" 
+							class="small_item"
+							@click="handleSystemClick(item)"
+						>
+							<image :src="item.image" class="small_icon" mode="aspectFit"></image>
+							<text class="small_name">{{ item.name }}</text>
+						</view>
+					</view>
+				</template>
+				
+				<template v-else>
+					<view class="system_grid_full">
+						<view 
+							v-for="(item, index) in allSmallCards" 
+							:key="index" 
+							class="small_item"
+							@click="handleSystemClick(item)"
+						>
+							<image :src="item.image" class="small_icon" mode="aspectFit"></image>
+							<text class="small_name">{{ item.name }}</text>
+						</view>
+					</view>
+				</template>
 			</view>
 			<!-- 校历安排 -->
 			<view class="calendar_section">
@@ -91,7 +127,7 @@
 					<text class="btn_text">新增日程</text>
 				</view>
 			</view>
-		</view>
+		</scroll-view>
 
 		<view v-if="showAddScheduleModal" class="modal-overlay" @click="handleCloseModal">
 			<view class="modal-content" @click.stop>
@@ -136,18 +172,27 @@ const store = useStore();
 const schoolName = ref('');
 
 const systemItems = ref([
-	{ name: '精准教学', key:'', image: '/static/image/workspace/icon1.png' },
-	{ name: '教师研修', key:'teacherStudy', image: '/static/image/workspace/icon2.png' },
-	{ name: '协同备课', key:'', image: '/static/image/workspace/icon3.png' },
-	{ name: '材料采集', key:'', image: '/static/image/workspace/icon4.png' },
-	{ name: '教师发展', key:'', image: '/static/image/workspace/icon5.png' },
-	{ name: '校内通知', key:'notice', image: '/static/image/workspace/icon6.png' },
-	{ name: '选择题判分', key:'', image: '/static/image/workspace/icon7.png' },
-	{ name: '智能选课', key:'', image: '/static/image/workspace/icon8.png' },
-	{ name: '学生学习', key:'', image: '/static/image/workspace/icon9.png' },
-	{ name: '基础数据', key:'', image: '/static/image/workspace/icon10.png' }
+	{ name: '大数据精准教学诊断平台', key:'', image: '/static/image/workspace/iconLeft.png', isLarge: true, visible: true },
+	{ name: '选择题判分', key:'', image: '/static/image/workspace/icon1.png', isLarge: false, visible: true },
+	{ name: '材料采集', key:'', image: '/static/image/workspace/icon2.png', isLarge: false, visible: true },
+	{ name: '教师研修', key:'teacherStudy', image: '/static/image/workspace/icon3.png', isLarge: false, visible: true },
+	{ name: '学生学习', key:'', image: '/static/image/workspace/icon4.png', isLarge: false, visible: true },
+	{ name: '智能选课', key:'', image: '/static/image/workspace/icon5.png', isLarge: false, visible: true },
+	{ name: '教师发展', key:'', image: '/static/image/workspace/icon6.png', isLarge: false, visible: true },
+	{ name: '协同备课', key:'', image: '/static/image/workspace/icon7.png', isLarge: false, visible: true },
+	{ name: '校内通知', key:'notice', image: '/static/image/workspace/icon8.png', isLarge: false, visible: true },
+	{ name: '评教评学', key:'', image: '/static/image/workspace/icon9.png', isLarge: false, visible: true },
+	{ name: '考场编排', key:'', image: '/static/image/workspace/icon10.png', isLarge: false, visible: true },
+	{ name: '听课评课', key:'', image: '/static/image/workspace/icon11.png', isLarge: false, visible: true },
+	{ name: '基础数据', key:'', image: '/static/image/workspace/icon12.png', isLarge: false, visible: true }
 ]);
 
+const largeCard = computed(() => systemItems.value.find(item => item.isLarge));
+const smallCards = computed(() => systemItems.value.filter(item => !item.isLarge));
+const rightTopCards = computed(() => smallCards.value.slice(0, 4));
+const bottomCards = computed(() => smallCards.value.slice(4));
+const allSmallCards = computed(() => smallCards.value);
+
 const weekdays = ['日', '一', '二', '三', '四', '五', '六'];
 
 const calendarDays = ref([]);
@@ -292,9 +337,19 @@ onShow(() => {
 
 const handleSystemClick = (item) => {
 	if (item.key === 'notice') {
-		uni.navigateTo({
-			url: '/pages/notice/overview/index'
-		});
+		const userInfo = store.state.userStore.userInfo || uni.getStorageSync('userInfo') || {};
+		const roleCodes = userInfo.roleCodes || [];
+		const isSchoolManager = Array.isArray(roleCodes) && roleCodes.includes('SCHOOL_MANAGER');
+		
+		if (isSchoolManager) {
+			uni.navigateTo({
+				url: '/pages/notice/overview/index'
+			});
+		} else {
+			uni.navigateTo({
+				url: '/pages/notice/mine/index?hideTabbar=true'
+			});
+		}
 	}else if(item.key == 'teacherStudy'){
 		uni.navigateTo({
 			url: '/pages/teacherStudy/index'
@@ -458,7 +513,10 @@ $shadow-sm: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
 }
 
 .workspace_content {
-	padding: 140rpx 24rpx 30rpx 24rpx;
+	padding: 140rpx 24rpx 140rpx 24rpx;
+	height: 100vh;
+	box-sizing: border-box;
+	overflow: hidden;
 }
 
 // 系统列表
@@ -473,25 +531,122 @@ $shadow-sm: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
 		margin-bottom: $spacing-sm;
 	}
 
-	.system_grid {
-		display: grid;
-		grid-template-columns: repeat(4, 130rpx);
-		justify-content: space-between;
+	.system_grid_with_large {
+		display: flex;
+		gap: 20rpx;
+		margin-bottom: 20rpx;
+
+		.large_card {
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			background-color: #EAF0FF;
+			border-radius: 20rpx;
+			width: 324rpx;
+			height: 352rpx;
+			// padding: 30rpx 0;
+
+			.large_icon {
+				width: 160rpx;
+				height: 160rpx;
+				margin-bottom: 32rpx;
+			}
+
+			.large_name {
+				font-size: 32rpx;
+				color: #333333;
+				font-weight: 500;
+				text-align: center;
+				line-height: 48rpx;
+				width: 276rpx;
+			}
+		}
+
+		.right_top_grid {
+			flex: 1;
+			display: grid;
+			grid-template-columns: repeat(2, 1fr);
+			gap: 16rpx;
+
+			.small_item {
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				background-color: #FFFFFF;
+				// border-radius: 12rpx;
+				// padding: 20rpx 0;
+
+				.small_icon {
+					width: 96rpx;
+					height: 96rpx;
+					margin-bottom: 20rpx;
+				}
+
+				.small_name {
+					font-size: 28rpx;
+					color: $text-secondary;
+					text-align: center;
+				}
+			}
+		}
 	}
 
-	.system_item {
-		@include flex-column;
-		padding: 20rpx 0;
+	.bottom_grid {
+		display: grid;
+		grid-template-columns: repeat(4, 1fr);
+		gap: 16rpx;
+
+		.small_item {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			background-color: #FFFFFF;
+			border-radius: 12rpx;
+			padding: 20rpx 0;
+
+			.small_icon {
+				width: 96rpx;
+				height: 96rpx;
+				margin-bottom: 20rpx;
+			}
 
-		.system_icon {
-			width: 96rpx;
-			height: 96rpx;
-			margin-bottom: 20rpx;
+			.small_name {
+				font-size: 28rpx;
+				color: $text-secondary;
+				text-align: center;
+			}
 		}
+	}
 
-		.system_name {
-			font-size: $font-xxs;
-			color: $text-secondary;
+	.system_grid_full {
+		display: grid;
+		grid-template-columns: repeat(4, 1fr);
+		gap: 16rpx;
+
+		.small_item {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			background-color: #FFFFFF;
+			border-radius: 12rpx;
+			padding: 20rpx 0;
+
+			.small_icon {
+				width: 64rpx;
+				height: 64rpx;
+				margin-bottom: 12rpx;
+			}
+
+			.small_name {
+				font-size: 22rpx;
+				color: $text-secondary;
+				text-align: center;
+			}
 		}
 	}
 }

二進制
static/image/workspace/icon/icon1.png


二進制
static/image/workspace/icon/icon10.png


二進制
static/image/workspace/icon/icon2.png


二進制
static/image/workspace/icon/icon3.png


二進制
static/image/workspace/icon/icon4.png


二進制
static/image/workspace/icon/icon5.png


二進制
static/image/workspace/icon/icon6.png


二進制
static/image/workspace/icon/icon7.png


二進制
static/image/workspace/icon/icon8.png


二進制
static/image/workspace/icon/icon9.png


二進制
static/image/workspace/icon1.png


二進制
static/image/workspace/icon10.png


二進制
static/image/workspace/icon11.png


二進制
static/image/workspace/icon12.png


二進制
static/image/workspace/icon2.png


二進制
static/image/workspace/icon3.png


二進制
static/image/workspace/icon4.png


二進制
static/image/workspace/icon5.png


二進制
static/image/workspace/icon6.png


二進制
static/image/workspace/icon7.png


二進制
static/image/workspace/icon8.png


二進制
static/image/workspace/icon9.png


二進制
static/image/workspace/iconLeft.png


二進制
static/pdfh5/cmaps/78-EUC-H.bcmap


二進制
static/pdfh5/cmaps/78-EUC-V.bcmap


二進制
static/pdfh5/cmaps/78-H.bcmap


二進制
static/pdfh5/cmaps/78-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/78-RKSJ-V.bcmap


二進制
static/pdfh5/cmaps/78-V.bcmap


二進制
static/pdfh5/cmaps/78ms-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/78ms-RKSJ-V.bcmap


二進制
static/pdfh5/cmaps/83pv-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/90ms-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/90ms-RKSJ-V.bcmap


二進制
static/pdfh5/cmaps/90msp-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/90msp-RKSJ-V.bcmap


二進制
static/pdfh5/cmaps/90pv-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/90pv-RKSJ-V.bcmap


二進制
static/pdfh5/cmaps/Add-H.bcmap


二進制
static/pdfh5/cmaps/Add-RKSJ-H.bcmap


二進制
static/pdfh5/cmaps/Add-RKSJ-V.bcmap


二進制
static/pdfh5/cmaps/Add-V.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-0.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-1.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-2.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-3.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-4.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-5.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-6.bcmap


二進制
static/pdfh5/cmaps/Adobe-CNS1-UCS2.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-0.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-1.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-2.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-3.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-4.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-5.bcmap


二進制
static/pdfh5/cmaps/Adobe-GB1-UCS2.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-0.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-1.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-2.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-3.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-4.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-5.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-6.bcmap


二進制
static/pdfh5/cmaps/Adobe-Japan1-UCS2.bcmap


二進制
static/pdfh5/cmaps/Adobe-Korea1-0.bcmap


二進制
static/pdfh5/cmaps/Adobe-Korea1-1.bcmap


二進制
static/pdfh5/cmaps/Adobe-Korea1-2.bcmap


二進制
static/pdfh5/cmaps/Adobe-Korea1-UCS2.bcmap


二進制
static/pdfh5/cmaps/B5-H.bcmap


二進制
static/pdfh5/cmaps/B5-V.bcmap


二進制
static/pdfh5/cmaps/B5pc-H.bcmap


二進制
static/pdfh5/cmaps/B5pc-V.bcmap


二進制
static/pdfh5/cmaps/CNS-EUC-H.bcmap


二進制
static/pdfh5/cmaps/CNS-EUC-V.bcmap


二進制
static/pdfh5/cmaps/CNS1-H.bcmap


二進制
static/pdfh5/cmaps/CNS1-V.bcmap


二進制
static/pdfh5/cmaps/CNS2-H.bcmap


+ 3 - 0
static/pdfh5/cmaps/CNS2-V.bcmap

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

二進制
static/pdfh5/cmaps/ETHK-B5-H.bcmap


二進制
static/pdfh5/cmaps/ETHK-B5-V.bcmap


二進制
static/pdfh5/cmaps/ETen-B5-H.bcmap


二進制
static/pdfh5/cmaps/ETen-B5-V.bcmap


+ 3 - 0
static/pdfh5/cmaps/ETenms-B5-H.bcmap

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

二進制
static/pdfh5/cmaps/ETenms-B5-V.bcmap


二進制
static/pdfh5/cmaps/EUC-H.bcmap


二進制
static/pdfh5/cmaps/EUC-V.bcmap


Some files were not shown because too many files changed in this diff