From fcb335726de6e99d236520d99e8f733d427d5d5d Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sun, 30 Nov 2025 00:14:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jeesite/modules/utils/IpUtils.java | 63 +++++++- .../packages/biz/views/biz/cities/list.vue | 1 + .../packages/biz/views/biz/company/list.vue | 1 + .../packages/biz/views/biz/listItem/list.vue | 1 + .../biz/views/biz/municipalities/list.vue | 1 + .../biz/views/biz/projectInfo/list.vue | 1 + .../biz/views/biz/projectInfo/select.ts | 132 ---------------- .../biz/views/biz/projectReport/list.vue | 1 + .../views/biz/projectRequirements/list.vue | 1 + .../packages/biz/views/biz/province/list.vue | 1 + .../biz/views/biz/quickLogin/list.vue | 1 + .../biz/views/biz/quickLogin/select.ts | 143 ------------------ .../biz/views/biz/resumeEmployee/list.vue | 1 + .../biz/views/biz/websiteStorage/list.vue | 1 + .../packages/erp/views/erp/account/list.vue | 1 + .../packages/erp/views/erp/category/list.vue | 1 + .../packages/erp/views/erp/expense/list.vue | 1 + .../packages/erp/views/erp/income/list.vue | 1 + .../erp/views/erp/transactionFlow/list.vue | 1 + 19 files changed, 73 insertions(+), 281 deletions(-) delete mode 100644 web-vue/packages/biz/views/biz/projectInfo/select.ts delete mode 100644 web-vue/packages/biz/views/biz/quickLogin/select.ts diff --git a/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java b/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java index fc140ce4..58b4a142 100644 --- a/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java +++ b/web-api/src/main/java/com/jeesite/modules/utils/IpUtils.java @@ -17,23 +17,47 @@ public class IpUtils { * @return 本地IP地址,获取失败返回null */ public static String getLocalIp() { + // 1. 优先读取宿主机注入的环境变量 + String hostIp = System.getenv("HOST_MACHINE_IP"); + if (isValidIp(hostIp)) { + return hostIp; + } + + // 2. 尝试解析Docker网关(宿主机IP) + try { + InetAddress gatewayAddr = InetAddress.getByName("gateway"); + if (gatewayAddr.isReachable(1000)) { + String gatewayIp = gatewayAddr.getHostAddress(); + if (isValidIp(gatewayIp)) { + return gatewayIp; + } + } + } catch (Exception e) { + System.out.print(e.getMessage()); + } + + // 3. 过滤容器网卡,获取宿主机IP try { - // 遍历所有网络接口 Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); - // 跳过虚拟网卡、未启用的网卡 - if (ni.isLoopback() || ni.isVirtual() || !ni.isUp()) { + if (ni.isLoopback() || ni.isVirtual() || !ni.isUp() + || ni.getName().startsWith("docker") + || ni.getName().startsWith("veth") + || ni.getName().startsWith("cni0")) { continue; } - // 遍历该网卡下的所有IP地址 + Enumeration addresses = ni.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); - // 仅保留IPv4地址,且排除回环地址 if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) { String ip = addr.getHostAddress(); - if (!ip.startsWith("172.") && !ip.startsWith("192.168.31.")) { + // 过滤容器内网段 + if (!ip.startsWith("172.") + && !ip.startsWith("192.168.99.") + && !ip.startsWith("10.0.") + && isValidIp(ip)) { return ip; } } @@ -42,9 +66,36 @@ public class IpUtils { } catch (SocketException e) { e.printStackTrace(); } + + // 4. 兜底返回回环地址 return getLoopbackIp(); } + + /** + * 验证是否为合法IPv4地址 + */ + private static boolean isValidIp(String ip) { + if (ip == null || ip.isEmpty()) { + return false; + } + String[] parts = ip.split("\\."); + if (parts.length != 4) { + return false; + } + for (String part : parts) { + try { + int num = Integer.parseInt(part); + if (num < 0 || num > 255) { + return false; + } + } catch (NumberFormatException e) { + return false; + } + } + return true; + } + /** * 获取回环地址(127.0.0.1) * diff --git a/web-vue/packages/biz/views/biz/cities/list.vue b/web-vue/packages/biz/views/biz/cities/list.vue index a1cab642..bec2510d 100644 --- a/web-vue/packages/biz/views/biz/cities/list.vue +++ b/web-vue/packages/biz/views/biz/cities/list.vue @@ -126,6 +126,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('省份编码'), diff --git a/web-vue/packages/biz/views/biz/company/list.vue b/web-vue/packages/biz/views/biz/company/list.vue index 59da91c8..2375a40f 100644 --- a/web-vue/packages/biz/views/biz/company/list.vue +++ b/web-vue/packages/biz/views/biz/company/list.vue @@ -118,6 +118,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('公司名称'), diff --git a/web-vue/packages/biz/views/biz/listItem/list.vue b/web-vue/packages/biz/views/biz/listItem/list.vue index cde7250d..36cb87a8 100644 --- a/web-vue/packages/biz/views/biz/listItem/list.vue +++ b/web-vue/packages/biz/views/biz/listItem/list.vue @@ -129,6 +129,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('头像图标'), diff --git a/web-vue/packages/biz/views/biz/municipalities/list.vue b/web-vue/packages/biz/views/biz/municipalities/list.vue index b173b4df..67d76726 100644 --- a/web-vue/packages/biz/views/biz/municipalities/list.vue +++ b/web-vue/packages/biz/views/biz/municipalities/list.vue @@ -158,6 +158,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('省份名称'), diff --git a/web-vue/packages/biz/views/biz/projectInfo/list.vue b/web-vue/packages/biz/views/biz/projectInfo/list.vue index 26debe81..0b30f8b1 100644 --- a/web-vue/packages/biz/views/biz/projectInfo/list.vue +++ b/web-vue/packages/biz/views/biz/projectInfo/list.vue @@ -126,6 +126,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('项目编码'), diff --git a/web-vue/packages/biz/views/biz/projectInfo/select.ts b/web-vue/packages/biz/views/biz/projectInfo/select.ts deleted file mode 100644 index e7ab9e15..00000000 --- a/web-vue/packages/biz/views/biz/projectInfo/select.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { useI18n } from '@jeesite/core/hooks/web/useI18n'; -import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table'; -import { BizProjectInfo, bizProjectInfoListData } from '@jeesite/biz/api/biz/projectInfo'; - -const { t } = useI18n('biz.projectInfo'); - -const modalProps = { - title: t('项目信息选择'), -}; - -const searchForm: FormProps = { - baseColProps: { md: 8, lg: 6 }, - labelWidth: 90, - schemas: [ - { - label: t('项目编码'), - field: 'projectCode', - component: 'Input', - }, - { - label: t('项目名称'), - field: 'projectName', - component: 'Input', - }, - { - label: t('项目状态'), - field: 'projectStatus', - component: 'Select', - componentProps: { - dictType: 'project_status', - allowClear: true, - }, - }, - ], -}; - -const tableColumns: BasicColumn[] = [ - { - title: t('记录时间'), - dataIndex: 'createTime', - key: 'a.create_time', - sorter: true, - width: 180, - align: 'left', - slot: 'firstColumn', - }, - { - title: t('项目编码'), - dataIndex: 'projectCode', - key: 'a.project_code', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('项目名称'), - dataIndex: 'projectName', - key: 'a.project_name', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('项目描述'), - dataIndex: 'projectDesc', - key: 'a.project_desc', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('开始日期'), - dataIndex: 'startDate', - key: 'a.start_date', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('预计结束日期'), - dataIndex: 'endDate', - key: 'a.end_date', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('实际结束日期'), - dataIndex: 'actualEndDate', - key: 'a.actual_end_date', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('项目类型'), - dataIndex: 'projectType', - key: 'a.project_type', - sorter: true, - width: 130, - align: 'left', - dictType: 'project_type', - }, - { - title: t('项目状态'), - dataIndex: 'projectStatus', - key: 'a.project_status', - sorter: true, - width: 130, - align: 'left', - dictType: 'project_status', - }, -]; - -const tableProps: BasicTableProps = { - api: bizProjectInfoListData, - beforeFetch: (params) => { - params['isAll'] = true; - return params; - }, - columns: tableColumns, - formConfig: searchForm, - rowKey: 'projectId', -}; - -export default { - modalProps, - tableProps, - itemCode: 'projectId', - itemName: 'projectName', - isShowCode: true, -}; diff --git a/web-vue/packages/biz/views/biz/projectReport/list.vue b/web-vue/packages/biz/views/biz/projectReport/list.vue index 590e06bf..8cb32171 100644 --- a/web-vue/packages/biz/views/biz/projectReport/list.vue +++ b/web-vue/packages/biz/views/biz/projectReport/list.vue @@ -130,6 +130,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('汇报主题'), diff --git a/web-vue/packages/biz/views/biz/projectRequirements/list.vue b/web-vue/packages/biz/views/biz/projectRequirements/list.vue index 1a189b89..7090a88c 100644 --- a/web-vue/packages/biz/views/biz/projectRequirements/list.vue +++ b/web-vue/packages/biz/views/biz/projectRequirements/list.vue @@ -154,6 +154,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('需求名称'), diff --git a/web-vue/packages/biz/views/biz/province/list.vue b/web-vue/packages/biz/views/biz/province/list.vue index 9ee57ab2..f383603c 100644 --- a/web-vue/packages/biz/views/biz/province/list.vue +++ b/web-vue/packages/biz/views/biz/province/list.vue @@ -122,6 +122,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('省份名称'), diff --git a/web-vue/packages/biz/views/biz/quickLogin/list.vue b/web-vue/packages/biz/views/biz/quickLogin/list.vue index 2f96d817..f2705e1e 100644 --- a/web-vue/packages/biz/views/biz/quickLogin/list.vue +++ b/web-vue/packages/biz/views/biz/quickLogin/list.vue @@ -85,6 +85,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('系统名称'), diff --git a/web-vue/packages/biz/views/biz/quickLogin/select.ts b/web-vue/packages/biz/views/biz/quickLogin/select.ts deleted file mode 100644 index 1b189706..00000000 --- a/web-vue/packages/biz/views/biz/quickLogin/select.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { useI18n } from '@jeesite/core/hooks/web/useI18n'; -import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table'; -import { BizQuickLogin, bizQuickLoginListData } from '@jeesite/biz/api/biz/quickLogin'; - -const { t } = useI18n('biz.quickLogin'); - -const modalProps = { - title: t('系统信息选择'), -}; - -const searchForm: FormProps = { - baseColProps: { md: 8, lg: 6 }, - labelWidth: 90, - schemas: [ - { - label: t('创建时间起'), - field: 'createTime_gte', - component: 'DatePicker', - componentProps: { - format: 'YYYY-MM-DD HH:mm', - showTime: { format: 'HH:mm' }, - }, - }, - { - label: t('创建时间止'), - field: 'createTime_lte', - component: 'DatePicker', - componentProps: { - format: 'YYYY-MM-DD HH:mm', - showTime: { format: 'HH:mm' }, - }, - }, - { - label: t('系统名称'), - field: 'systemName', - component: 'Input', - }, - ], -}; - -const tableColumns: BasicColumn[] = [ - { - title: t('创建时间'), - dataIndex: 'createTime', - key: 'a.create_time', - sorter: true, - width: 230, - align: 'left', - slot: 'firstColumn', - }, - { - title: t('系统名称'), - dataIndex: 'systemName', - key: 'a.system_name', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('首页地址'), - dataIndex: 'homepageUrl', - key: 'a.homepage_url', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('图标类名'), - dataIndex: 'iconClass', - key: 'a.icon_class', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('图标颜色'), - dataIndex: 'iconColor', - key: 'a.icon_color', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('排序序号'), - dataIndex: 'sortOrder', - key: 'a.sort_order', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('图标背景色'), - dataIndex: 'bgColor', - key: 'a.bg_color', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('悬浮遮罩色'), - dataIndex: 'maskColor', - key: 'a.mask_color', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('是否启用'), - dataIndex: 'isEnabled', - key: 'a.is_enabled', - sorter: true, - width: 130, - align: 'center', - dictType: '', - }, - { - title: t('更新时间'), - dataIndex: 'updateTime', - key: 'a.update_time', - sorter: true, - width: 130, - align: 'center', - }, -]; - -const tableProps: BasicTableProps = { - api: bizQuickLoginListData, - beforeFetch: (params) => { - params['isAll'] = true; - return params; - }, - columns: tableColumns, - formConfig: searchForm, - rowKey: 'id', -}; - -export default { - modalProps, - tableProps, - itemCode: 'id', - itemName: 'id', - isShowCode: false, -}; diff --git a/web-vue/packages/biz/views/biz/resumeEmployee/list.vue b/web-vue/packages/biz/views/biz/resumeEmployee/list.vue index 36617976..c1b300ad 100644 --- a/web-vue/packages/biz/views/biz/resumeEmployee/list.vue +++ b/web-vue/packages/biz/views/biz/resumeEmployee/list.vue @@ -121,6 +121,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('员工姓名'), diff --git a/web-vue/packages/biz/views/biz/websiteStorage/list.vue b/web-vue/packages/biz/views/biz/websiteStorage/list.vue index dee3ccf1..2ee72b5a 100644 --- a/web-vue/packages/biz/views/biz/websiteStorage/list.vue +++ b/web-vue/packages/biz/views/biz/websiteStorage/list.vue @@ -126,6 +126,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('网站地址'), diff --git a/web-vue/packages/erp/views/erp/account/list.vue b/web-vue/packages/erp/views/erp/account/list.vue index a1c9b8c4..ec383a85 100644 --- a/web-vue/packages/erp/views/erp/account/list.vue +++ b/web-vue/packages/erp/views/erp/account/list.vue @@ -94,6 +94,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('账户名称'), diff --git a/web-vue/packages/erp/views/erp/category/list.vue b/web-vue/packages/erp/views/erp/category/list.vue index 24bd0325..95bf73e5 100644 --- a/web-vue/packages/erp/views/erp/category/list.vue +++ b/web-vue/packages/erp/views/erp/category/list.vue @@ -94,6 +94,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('分类名称'), diff --git a/web-vue/packages/erp/views/erp/expense/list.vue b/web-vue/packages/erp/views/erp/expense/list.vue index 51d5772c..495f4f6e 100644 --- a/web-vue/packages/erp/views/erp/expense/list.vue +++ b/web-vue/packages/erp/views/erp/expense/list.vue @@ -89,6 +89,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('交易账号'), diff --git a/web-vue/packages/erp/views/erp/income/list.vue b/web-vue/packages/erp/views/erp/income/list.vue index 3ee47707..d9975b03 100644 --- a/web-vue/packages/erp/views/erp/income/list.vue +++ b/web-vue/packages/erp/views/erp/income/list.vue @@ -89,6 +89,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('交易账号'), diff --git a/web-vue/packages/erp/views/erp/transactionFlow/list.vue b/web-vue/packages/erp/views/erp/transactionFlow/list.vue index 39a3e800..983e9b0f 100644 --- a/web-vue/packages/erp/views/erp/transactionFlow/list.vue +++ b/web-vue/packages/erp/views/erp/transactionFlow/list.vue @@ -125,6 +125,7 @@ sorter: true, width: 180, align: 'left', + fixed: 'left', }, { title: t('交易名称'),