diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/components/FooterBar.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/components/FooterBar.vue
index 602c4a91..dc69f70f 100644
--- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/components/FooterBar.vue
+++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/components/FooterBar.vue
@@ -20,6 +20,7 @@ import { onMounted } from 'vue';
import { getMessageUnreadCount } from '@/api/enforcement/index';
import nosIcon from '@/assets/images/nos/off_site_bottom_icon.png';
import tabBarBg from '@/assets/images/nos/tab_bar_bg.png';
+import { messageUnread, setMessageStats } from '@/store/messageState';
const props = defineProps({
active: {
@@ -30,8 +31,6 @@ const props = defineProps({
const router = useRouter();
-const messageUnread = ref(0);
-
const tabs = [
{
key: 'home', label: '首页', route: '/enforcement/enforcementHome',
@@ -64,16 +63,16 @@ const onTabClick = (item) => {
if (item.key === props.active) return;
if (router.currentRoute.value.path !== item.route) {
router.replace(item.route);
- }
- fetchMessageUnreadCount();
+ }
+ // console.log('获取消息未读数量2222');
+ // fetchMessageUnreadCount();
};
// ========== 获取消息未读数量 ==========
const fetchMessageUnreadCount = () => {
getMessageUnreadCount({}, (res) => {
if (res && res.code === 200 && res.data) {
- const totalCount = Number(res.data.totalCount) || 0;
- messageUnread.value = totalCount;
+ setMessageStats(res.data);
}
}, () => {
// 接口调用失败不处理
diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/store/messageState.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/store/messageState.js
index 2883364c..d1423237 100644
--- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/store/messageState.js
+++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/store/messageState.js
@@ -6,6 +6,12 @@ import { ref, computed } from 'vue';
* - 消息中心页面负责写入;其他页面仅读取用于 footer-bar 角标展示
*/
export const messageUnread = ref(0);
+export const pffwCount = ref(0); // 普法服务未读数量
+export const zfpjcount = ref(0); // 执法评价未读数量
+export const zfygCount = ref(0); // 执法预告未读数量
+export const jhtzcount = ref(0); // 计划通知未读数量
+export const zfywCount = ref(0); // 执法任务未读数量
+export const zfyyCount = ref(0); // 执法预约未读数量
/** 格式化为角标展示值(0 显示空) */
export const messageUnreadBadge = computed(() => (messageUnread.value > 0 ? messageUnread.value : ''));
@@ -15,6 +21,17 @@ export const setMessageUnread = (count) => {
messageUnread.value = Number(count) || 0;
};
+/** 设置所有消息数量 */
+export const setMessageStats = (data) => {
+ pffwCount.value = Number(data.pffwCount) || 0;
+ zfpjcount.value = Number(data.zfpjcount) || 0;
+ zfygCount.value = Number(data.zfygCount) || 0;
+ jhtzcount.value = Number(data.jhtzcount) || 0;
+ zfywCount.value = Number(data.zfywCount) || 0;
+ zfyyCount.value = Number(data.zfyyCount) || 0;
+ messageUnread.value = Number(data.totalCount) || 0;
+};
+
// 占位 default 导出:src/store 目录会被 globalStore.js 通过 import.meta.glob
// 以 { import: 'default' } 的方式扫描,缺少 default 会触发
// "does not provide an export named 'default'" 错误。
diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/law/lawServiceDetail.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/law/lawServiceDetail.vue
index a12b9512..1230aa6f 100644
--- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/law/lawServiceDetail.vue
+++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/law/lawServiceDetail.vue
@@ -24,8 +24,8 @@
{{ detail.time }}
-
-
+
+
@@ -41,15 +41,21 @@
-
+
@@ -62,7 +68,8 @@ import { useRouter, useRoute } from 'vue-router';
import { showToast, showImagePreview } from 'vant';
import 'vant/es/toast/style';
import 'vant/es/image-preview/style';
-import { getEducationServicesDetail } from '@/api/enforcement';
+import { getEducationServicesDetail, getMessageUnreadCount } from '@/api/enforcement';
+import { setMessageStats } from '@/store/messageState';
const router = useRouter();
const route = useRoute();
@@ -76,6 +83,7 @@ const detail = ref({
contentType: 1, // 1: 文本详情, 2: 超链接
content: [],
images: [],
+ forwardUrl: '',
});
const loading = ref(false);
@@ -101,9 +109,12 @@ const fetchDetail = () => {
source: res.data.source || '',
time: res.data.time || '',
contentType: res.data.contentType || 1, // 1: 文本详情, 2: 超链接
+ sourceType: res.data.sourceType || 1,
content: res.data.content || '',
images: res.data.images || [],
+ forwardUrl: res.data.forwardUrl || res.data.content || '',
};
+ fetchMessageUnreadCount();
} else {
showToast(res.message || '获取详情失败');
}
@@ -135,6 +146,48 @@ const onSearchClick = () => {
showToast('搜索功能开发中');
};
+// ========== 获取消息未读数量 ==========
+const fetchMessageUnreadCount = () => {
+ getMessageUnreadCount({}, (res) => {
+ if (res && res.code === 200 && res.data) {
+ setMessageStats(res.data);
+ }
+ }, () => {
+ // 接口调用失败不处理
+ });
+};
+
+// ========== iframe加载成功 ==========
+const onIframeLoad = () => {
+ console.log('iframe加载成功');
+};
+
+// ========== iframe加载失败 ==========
+const onIframeError = () => {
+ showToast('页面加载失败,可复制链接到浏览器打开');
+};
+
+// ========== 复制链接 ==========
+const copyLink = async () => {
+ const url = detail.value.forwardUrl || '';
+ if (!url) {
+ showToast('暂无链接');
+ return;
+ }
+ try {
+ await navigator.clipboard.writeText(url);
+ showToast('复制成功');
+ } catch (err) {
+ const textarea = document.createElement('textarea');
+ textarea.value = url;
+ document.body.appendChild(textarea);
+ textarea.select();
+ document.execCommand('copy');
+ document.body.removeChild(textarea);
+ showToast('复制成功');
+ }
+};
+
// ========== 预览图片 ==========
const previewImage = (index) => {
showImagePreview({
@@ -274,6 +327,7 @@ const previewImage = (index) => {
border-radius: 0.15rem;
overflow: hidden;
background: #f5f5f5;
+ position: relative;
}
.detail-iframe {
@@ -281,4 +335,28 @@ const previewImage = (index) => {
height: 500px;
background: #fff;
}
+
+.copy-link-btn {
+ position: absolute;
+ bottom: 0.3rem;
+ right: 0.3rem;
+ display: flex;
+ align-items: center;
+ gap: 0.1rem;
+ padding: 0.15rem 0.3rem;
+ background: rgba(0, 0, 0, 0.6);
+ color: #fff;
+ font-size: 0.28rem;
+ border-radius: 0.2rem;
+ cursor: pointer;
+ z-index: 10;
+
+ :deep(.van-icon) {
+ color: #fff;
+ }
+
+ &:active {
+ background: rgba(0, 0, 0, 0.8);
+ }
+}
\ No newline at end of file
diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/messageCenter.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/messageCenter.vue
index e1bcb7c7..5cff2845 100644
--- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/messageCenter.vue
+++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/message/messageCenter.vue
@@ -71,12 +71,13 @@