diff --git a/doc/部署说明/部署过程描述.md b/doc/部署说明/部署过程描述.md
index beb9c9b8..fce99065 100644
--- a/doc/部署说明/部署过程描述.md
+++ b/doc/部署说明/部署过程描述.md
@@ -89,7 +89,7 @@ Nginx 是源码编译安装的,安装在 `/usr/local/nginx/`,可执行文件
mysqldump -h 10.134.89.36 -P 15144 -u zfjd -p'szsf@zfjd' --default-character-set=utf8mb4 --single-transaction --triggers --events zfjd_ef20_1 sszt_jbxx110497_new > /efcode20/dbv2/zfjd_ef20_1_2026_06_20_utf8_sszt_jbxx110497_new.sql
```
* 压缩备份文件
- zip -e -P 'xj.sdeqwe.12345' /efcode20/dbv2/zfjd_ef20_1.zip /efcode20/dbv2/zfjd_ef20_1_2026_06_20_utf8.sql
+ zip -e -P 'xj.sdeweqwew222qwe.12345' /efcode20/dbv2/zfjd_ef20_1.zip /efcode20/dbv2/zfjd_ef20_1_2026_06_20_utf8.sql
* sql客户端
* mysql -h 10.134.89.36 -P 15144 -u zfjd -p'szsf@zfjd'
### DATAX
diff --git a/script/sql/zfjd-refactoring-v1/099-初始化测试账号密码.sql b/script/sql/zfjd-refactoring-v1/099-初始化测试账号密码.sql
index 04b70f3a..b7e2e21c 100644
--- a/script/sql/zfjd-refactoring-v1/099-初始化测试账号密码.sql
+++ b/script/sql/zfjd-refactoring-v1/099-初始化测试账号密码.sql
@@ -7,6 +7,10 @@ UPDATE enterprise_user SET tenant_id = '000000', dept_id = '405', user_name = '
UPDATE enterprise_user SET tenant_id = '000000', dept_id = '405', user_name = '周军', login_name = 'XP073215', nick_name = '', user_type = '00', email = '', phonenumber = '15012671807', sex = '0', avatar = '', password = '30522017a2b452a5fb3ac1b41b3400c6', status = '0', del_flag = '0', login_ip = '10.76.108.3', login_date = '2025-07-08 10:19:58', salt = 'c50b0b', create_dept = null, create_by = 0, create_time = '2025-06-19 12:09:02', update_by = 0, update_time = '2025-07-08 10:10:37', remark = null WHERE user_id = 17608601734;
UPDATE enterprise_user SET tenant_id = '000000', dept_id = '405', user_name = '测试用户', login_name = 'test859410', nick_name = '测试用户', user_type = 'app_user', email = '', phonenumber = '13800138000', sex = '0', avatar = null, password = 'e65c88662cd7f789d20eb43e0fe5a4db', status = '0', del_flag = '0', login_ip = '', login_date = '2026-06-09 17:11:59', salt = '584564', create_dept = '0', create_by = -1, create_time = '2026-06-09 17:11:59', update_by = -1, update_time = '2026-06-09 17:11:59', remark = '深i企同步用户' WHERE user_id = 2064274295779979265;
UPDATE enterprise_user SET tenant_id = '000000', dept_id = '405', user_name = '测试用户', login_name = 'test093590', nick_name = '测试用户', user_type = 'app_user', email = '', phonenumber = '13800138000', sex = '0', avatar = null, password = '600720af91e09f88ca73210ed1b39ad5', status = '0', del_flag = '0', login_ip = '', login_date = '2026-06-09 17:15:00', salt = '584564', create_dept = 'a8b21ab028964281bfa478b59ca4f5e8', create_by = 2064274295779979265, create_time = '2026-06-09 17:15:00', update_by = 2064274295779979265, update_time = '2026-06-09 17:15:00', remark = '深i企同步用户' WHERE user_id = 2064275054386966530;
+UPDATE enterprise_user SET tenant_id = '000000', dept_id = '405', user_name = '石磊', login_name = 'free_kylin', nick_name = '', user_type = '00', email = '', phonenumber = '18520089969', sex = '0', avatar = '', password = '0b4b9db2b73916f0c59e0d8e3d82d16f', status = '0', del_flag = '0', login_ip = '10.76.108.3', login_date = '2026-06-15 11:44:30', salt = '06411c', create_dept = null, create_by = 0, create_time = '2025-12-08 15:58:36', update_by = 0, update_time = '2026-06-15 11:44:30', remark = null WHERE user_id = 17608629742;
+
+INSERT INTO enterprise_user_ref (ref_id, user_id, user_name, enterprise_id, enterprise_name, enterprise_number, create_dept, create_by, create_time, update_by, update_time, remark)
+VALUES ('a9903a03-6caf-11f1-a343-fa163e541c39', 17608629742, '石磊', 'a8b21ab028964281bfa478b59ca4f5e8', '新粤云(深圳)信息技术有限公司', '91440300769156389U', null, 0, '2026-06-20 21:55:41', 0, '2026-06-20 21:55:41', null);
UPDATE sys_user SET tenant_id = '000000', dept_id = '20210922213334342-BAF2-EBD8EF897', user_name = '刘倩琳', login_name = 'liuqianlin', nick_name = '', user_type = '00', email = '1950712844@qq.com', phonenumber = '67tS8WoU19KGYv2t5wSudg==', sex = '0', avatar = '', password = '9e68af2e7fe0e0d37cfb88ff80855b4b', status = '0', del_flag = '0', login_ip = '127.0.0.1', login_date = '2026-06-09 22:08:12', salt = 'ea356d', create_dept = null, create_by = 0, create_time = '2024-05-31 14:09:10', update_by = -1, update_time = '2026-06-09 22:08:12', remark = '', type = '0', law_certificate_num = '19020011041', fullname = '刘倩琳', taskId = '97055dfb-c914-4dcc-8ee8-d2c0c98fe2c0', systemId = '20240527155602377-9C71-8284C0FB6', effectOn = 'UPDATE', isDeleted = 'false', isDisabled = 'false', createAt = '1717065211909', updateAt = '1754646883614', mobileNumber = '67tS8WoU19KGYv2t5wSudg==', certificateNumber = '31nylKvncOOOz4z0RNiEcQDv5OcXNQowwTb9vUh8RCo=', srzUserid = null, isMappingPerson = '0', units = '[{"unitleader":"","positionname":"深圳市司法局行政执法协调监督处三级主任科员","zwbscode":"","jbcc":"三级主任科员","priority":"","zwjc":"","gzgxcode":"00","gzgx":"主职","jbcccode":"160090","zwbs":"","positioncode":"","zgdw":"Y","unitid":"20210922213334342-BAF2-EBD8EF897","position":"","zwjccode":"","isMappingPerson":"0","order":"15231750"}]', organizationId = '20210922213334342-BAF2-EBD8EF897', certificateTypeId = '居民身份证', certificateTypeIdCode = '1', strUserId = '20210811170431003-2EFB-6B2217C70', user_source = 0, rylbCode = '0101', rylb = '公务员(含试用期)' WHERE user_id = 7897;
UPDATE sys_user SET tenant_id = '000000', dept_id = '20210922214042443-C1E6-E2489F594', user_name = '白宁', login_name = 'baining', nick_name = '', user_type = '00', email = '', phonenumber = '4p9mipP7ZxDshFDHaQOfYg==', sex = '0', avatar = '', password = '686b6725b894ac60fed4dd2c3eb64e26', status = '0', del_flag = '0', login_ip = '127.0.0.1', login_date = '2026-06-09 22:03:38', salt = 'bd202c', create_dept = null, create_by = 0, create_time = '2024-05-31 14:07:57', update_by = 17608416912, update_time = '2026-06-09 22:03:38', remark = null, type = null, law_certificate_num = '19020811001', fullname = '白宁', taskId = '00003e5e-41b0-43b0-9d06-4982e409d9f8', systemId = '20240527155602377-9C71-8284C0FB6', effectOn = 'CREATE', isDeleted = 'false', isDisabled = 'false', createAt = '1717065071662', updateAt = '1754646860325', mobileNumber = '4p9mipP7ZxDshFDHaQOfYg==', certificateNumber = 'c/+TMp+6HZ8AdcjUgZ8Q5wU/r/6xYA5YZvQlLfL/DAI=', srzUserid = null, isMappingPerson = '0', units = '[{"unitleader":"","positionname":"深圳市坪山区司法局党组书记、局长","zwbscode":"","jbcc":"一级调研员","priority":"","zwjc":"局长","gzgxcode":"00","gzgx":"主职","jbcccode":"160030","zwbs":"","positioncode":"010060","zgdw":"Y","unitid":"20210922214042443-C1E6-E2489F594","position":"正处级","zwjccode":"216A","isMappingPerson":"0","order":"166956000"}]', organizationId = '20210922214042443-C1E6-E2489F594', certificateTypeId = '居民身份证', certificateTypeIdCode = '1', strUserId = '20210922224417280-B03D-8791A1ED7', user_source = 0, rylbCode = '0101', rylb = '公务员(含试用期)' WHERE user_id = 17608416858;
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-bad-dis.png b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-bad-dis.png
new file mode 100644
index 00000000..47f5fdc5
Binary files /dev/null and b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-bad-dis.png differ
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-bad.png b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-bad.png
new file mode 100644
index 00000000..2d3bf620
Binary files /dev/null and b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-bad.png differ
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-good-dis.png b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-good-dis.png
new file mode 100644
index 00000000..4ee5bb6c
Binary files /dev/null and b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-good-dis.png differ
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-good.png b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-good.png
new file mode 100644
index 00000000..732e9dcf
Binary files /dev/null and b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-good.png differ
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-verygood-dis.png b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-verygood-dis.png
new file mode 100644
index 00000000..5f100225
Binary files /dev/null and b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-verygood-dis.png differ
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-verygood.png b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-verygood.png
new file mode 100644
index 00000000..2ede1bb6
Binary files /dev/null and b/zdxt-web-client/zdxt-admin-plus-ui/src/assets/images/eval-verygood.png differ
diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/nos/components/MobilePreview.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/nos/components/MobilePreview.vue
new file mode 100644
index 00000000..dc530186
--- /dev/null
+++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/nos/components/MobilePreview.vue
@@ -0,0 +1,11 @@
+
+
+
+ Mobile Preview
+
+
+
diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/images/nos/no-data.png b/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/images/nos/no-data.png
new file mode 100644
index 00000000..87bf8724
Binary files /dev/null and b/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/images/nos/no-data.png differ
diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/assets/images/nos/no-data.png b/zdxt-web-client/zdxt-efcode-enterprise-app/src/assets/images/nos/no-data.png
new file mode 100644
index 00000000..87bf8724
Binary files /dev/null and b/zdxt-web-client/zdxt-efcode-enterprise-app/src/assets/images/nos/no-data.png differ
diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/store/messageState.js b/zdxt-web-client/zdxt-efcode-enterprise-app/src/store/messageState.js
new file mode 100644
index 00000000..2883364c
--- /dev/null
+++ b/zdxt-web-client/zdxt-efcode-enterprise-app/src/store/messageState.js
@@ -0,0 +1,22 @@
+import { ref, computed } from 'vue';
+
+/**
+ * 消息未读数(跨 tabbar 页面共享)
+ * - 模块级单例,四个 tabbar 页面(首页/查询/消息/我的)共享同一份
+ * - 消息中心页面负责写入;其他页面仅读取用于 footer-bar 角标展示
+ */
+export const messageUnread = ref(0);
+
+/** 格式化为角标展示值(0 显示空) */
+export const messageUnreadBadge = computed(() => (messageUnread.value > 0 ? messageUnread.value : ''));
+
+/** 直接设置未读总数 */
+export const setMessageUnread = (count) => {
+ messageUnread.value = Number(count) || 0;
+};
+
+// 占位 default 导出:src/store 目录会被 globalStore.js 通过 import.meta.glob
+// 以 { import: 'default' } 的方式扫描,缺少 default 会触发
+// "does not provide an export named 'default'" 错误。
+// 此处导出一个不带 $id 的对象,globalStore 会自动跳过注册,不影响 Pinia。
+export default {};
diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/fileUrl.js b/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/fileUrl.js
new file mode 100644
index 00000000..9a9714f9
--- /dev/null
+++ b/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/fileUrl.js
@@ -0,0 +1,42 @@
+import { baseUrl } from "@/config/env"
+
+const ABSOLUTE_URL_RE = /^https?:\/\//i
+
+const isAbsoluteUrl = (path) =>
+ ABSOLUTE_URL_RE.test(path) || path.startsWith("blob:") || path.startsWith("data:")
+
+const getApiBase = () => (baseUrl || "").replace(/\/+$/, "")
+
+/**
+ * ȥ�� VITE_BASE_URL ����ǰ��֧���ظ�ǰ�����õ�������·������ /profile/2026/...
+ */
+export const toRelativeFilePath = (path) => {
+ if (!path) return ""
+ if (isAbsoluteUrl(path)) return path
+
+ const prefix = getApiBase()
+ let p = path.startsWith("/") ? path : `/${path}`
+
+ if (prefix) {
+ const normalizedPrefix = prefix.startsWith("/") ? prefix : `/${prefix}`
+ while (p === normalizedPrefix || p.startsWith(`${normalizedPrefix}/`)) {
+ p = p.slice(normalizedPrefix.length) || "/"
+ if (!p.startsWith("/")) p = `/${p}`
+ }
+ }
+
+ return p
+}
+
+/**
+ * ƴ��Ϊǰ�˿ɷ���·�����ݵȣ����ظ����ã����� uploader ���ԣ�
+ */
+export const toFullFileUrl = (path) => {
+ if (!path) return ""
+ if (isAbsoluteUrl(path)) return path
+
+ const prefix = getApiBase()
+ const relative = toRelativeFilePath(path)
+ if (!prefix) return relative
+ return prefix + relative
+}
diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/auth/loginByPassword.vue b/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/auth/loginByPassword.vue
index bb3e5827..b5ffaa9a 100644
--- a/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/auth/loginByPassword.vue
+++ b/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/auth/loginByPassword.vue
@@ -52,14 +52,14 @@
const showTestPicker = ref(false);
const testEnterprises = [
+ { account: 'free_kylin', name: '新粤云(深圳)信息技术有限公司', password: 'szsf@zfjd' },
{ account: 'weil45', name: '深圳农牧美益肉业有限公司', password: 'szsf@zfjd' },
{ account: 'DGD440881199506180622', name: '深圳市深水龙岗污水处理有限公司', password: 'szsf@zfjd' },
{ account: 'smiledzb1982', name: '深圳康泰生物制品股份有限公司', password: 'szsf@zfjd' },
{ account: 'A7271888', name: '深圳市里程食品有限公司', password: 'szsf@zfjd' },
{ account: 'qintongzhen138', name: '欧姆龙电子部件(深圳)有限公司', password: 'szsf@zfjd' },
{ account: 'XP073215', name: '深圳市强达电路股份有限公司', password: 'szsf@zfjd' },
- { account: '33ef1970fd449676fa4bc197', name: '吉田拉链(深圳)有限公司公明工厂', password: 'szsf@zfjd' },
- { account: 'test093590', name: '新粤云(深圳)信息技术有限公司', password: 'szsf@zfjd' }
+ { account: '33ef1970fd449676fa4bc197', name: '吉田拉链(深圳)有限公司公明工厂', password: 'szsf@zfjd' }
];
const selectTestEnterprise = (item) => {
diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/nos/message/index.vue b/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/nos/message/index.vue
index 2795f98b..1bbbf5b4 100644
--- a/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/nos/message/index.vue
+++ b/zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/nos/message/index.vue
@@ -15,14 +15,13 @@
-
+