# 速达荣耀Open **Repository Path**: phubing/speedy-glory---open ## Basic Information - **Project Name**: 速达荣耀Open - **Description**: 速达荣耀Open开源ERP+AI编程 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-04-10 - **Last Updated**: 2026-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 速达荣耀Open #### 介绍 速达荣耀Open开源ERP+AI编程 速达荣耀open ERP系统采用前后端分离架构,后端基于Java技术栈,前端基于Vue框架,实现高内聚、低耦合的企业资源管理解决方案,具体如下所示: # 一、整体架构概览 **架构模式**:B/S多层架构(前端分离 + 服务端分层) **核心特性:** - 基于Cookie的Session管理(Tomcat原生) - c3p0连接池动态多账套支持 - Struts 2.5拦截器链安全控制 - Vue + Element UI交互式前端 - PostgreSQL多数据库实例管理 # 二、关键技术栈配置
模块 技术实现 配置文件/代码定位
HTTP服务 Tomcat 8.5 server.xml配置HTTP/HTTPS端口
Session管理 Tomcat JDBCStore持久化 context.xml配置PersistentManager+JDBCStore
数据库连接池 c3p0-0.9.1.2动态多数据源 ConnectPools类管理多账套连接
安全控制 三重拦截器链(参数过滤/登录校验/连接监控) SafeParamInterceptor+CheckLoginIntercepter+ConnectionInterceptor
异步任务 ScheduledExecutorService线程池 ScheduleTaskService配置10线程任务池
前端框架 Vue 2.5 + Webpack 3.6 package.json定义ElementUI/ECharts等依赖
# 三、核心模块深度解析 ## 1. 动态多账套数据库连接池 **实现机制:** ``` java // ConnectPools类核心逻辑 public static ComboPooledDataSource getDataSource(String accsetName) throws Exception { String accsetDBName = doGetDBNameByAccName(accsetName); // 转换账套名为数据库名 if (!dataSourceList.containsKey(accsetDBName)) { // 动态创建新数据源 ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setJdbcUrl("jdbc:postgresql://"+serverName+":"+port+"/"+accsetDBName); ds.setMaxPoolSize(maxPoolSize); // 最大连接数100 ds.setMinPoolSize(minPoolSize); // 最小连接数3 ds.setTestConnectionOnCheckout(true); // 连接取出时校验 dataSourceList.put(accsetDBName, ds); } return dataSourceList.get(accsetDBName); } ``` **关键特性:** - 账套隔离:每个账套对应独立数据库实例(如sd31512_cwaccset) - 连接泄漏防护: ```java // c3p0连接池配置 ds.setUnreturnedConnectionTimeout(50); // 50秒未归还连接自动回收 ds.setDebugUnreturnedConnectionStackTraces(true); // 打印泄漏堆栈 ``` - 无序列表自动重连机制:acquireRetryAttempts=10(获取失败重试10次) ## 2. Session持久化管理 **Tomcat配置:** ```xml ``` **数据表结构:** ``` sql CREATE TABLE tomcat_sessions ( session_id VARCHAR(100) PRIMARY KEY, session_data BYTEA, max_inactive INT, last_access BIGINT ); ``` ## 3. 安全拦截器链 **执行流程:** **安全防护:** - XSS/SQL过滤:通过Requests.safeParam方法清洗参数 - 会话劫持防护:SessionID绑定IP地址(代码未展示,需在CheckLoginIntercepter中实现) # 四、数据库架构设计 ## 1. 多账套数据模型 **命名规范:** 系统库:sd[产品ID]_cwaccset(如sd31512_cwaccset) 业务库:sd[产品ID]_[账套名](如sd31512_company1) **数据隔离策略:** 通过ConnectPools类动态加载不同账套数据源 前端请求携带accsetName参数标识当前账套 ## 2. 连接池监控指标 |监控项|阈值|处理策略| |-|-|-| |活跃连接数|>80% maxPoolSize|触发扩容警告| |连接获取时间|>5000ms|记录慢连接日志| |未关闭连接数|>5|强制回收并告警| # 五、系统部署架构 **生产环境拓扑:** **关键配置:** **1. Tomcat智能分流服务** ```java // 分流服务核心逻辑(部署在独立Tomcat实例) @WebServlet("/redirect") public class LoadBalanceServlet extends HttpServlet { private static final Map nodeStats = new ConcurrentHashMap<>(); // 节点负载统计 protected void doGet(HttpServletRequest req, HttpServletResponse resp) { // 获取最空闲节点 String targetNode = selectIdleNode(); resp.sendRedirect("http://"+targetNode+req.getRequestURI()); } private String selectIdleNode() { return nodeStats.entrySet().stream() .min(Map.Entry.comparingByValue()) .orElseThrow().getKey(); } // 节点心跳上报接口(各业务节点定期调用) @WebServlet("/heartbeat") public static class HeartbeatServlet extends HttpServlet { protected void doPost(HttpServletRequest req) { String node = req.getParameter("node"); int load = Integer.parseInt(req.getParameter("load")); nodeStats.put(node, load); // 更新节点负载 } } } ``` **实现特性:** |特性|说明| |-|-| |动态负载检测|业务节点每30秒上报CPU/内存指标(通过/heartbeat接口)| |最小连接数策略|分流服务优先选择当前活跃请求最少的节点| |会话保持|首次分流后通过Cookie记录目标节点,后续请求直连| |故障自动剔除|超过60秒未收到心跳的节点自动从nodeStats移除| **2. 业务节点配置** ```xml ``` **流量分发流程:** **架构优势对比** |方案|传统Nginx负载均衡|Tomcat智能分流服务| |-|-|-| |会话保持|依赖ip_hash|Cookie绑定+服务端状态维护| |动态权重|需手动调整weight|实时负载自动计算| |故障恢复|依赖健康检查间隔|60秒自动剔除不可用节点| |Java生态集成|需维护额外Nginx配置|与业务系统统一技术栈| # 六、扩展性设计 ## 1. 横向扩展能力 - **无状态服务**:Session数据持久化到数据库,支持节点动态扩容 - **数据库分片**:按账套名称分库,通过ConnectPools.getConnectionByName()动态路由 - **分流服务集群化**:通过ZooKeeper选举主分流节点,避免单点故障 - **动态扩容协议**:新业务节点启动后自动向分流服务注册 ## 2. SaaS多租户改造路径 # 七、性能优化专项 ## 1. 连接池参数调优 ```java // ErpSDWebServerStart初始化参数 ConnectPools.maxPoolSize = Integer.parseInt(p.getProperty("MaxPoolSize", "100")); ConnectPools.minPoolSize = Integer.parseInt(p.getProperty("MinPoolSize", "3")); ``` ## 2. SQL执行优化 **批量操作**:在UnFrozenTask中使用UPDATE...WHERE IN语句 **索引策略**:为所有账套的accset表建立复合索引 ``` sql CREATE INDEX idx_accset_name ON accset USING BTREE (lower(name)); ``` # 八、运维监控体系 ## 1. 健康检查指标 |检查项|检测频率|报警阈值| |-|-|-| |数据库连接池使用率|60秒|>85%持续5分钟| |Tomcat活跃线程数|30秒|>200| |Session泄漏数量|300秒|>10个/分钟| ## 2. 日志管理策略 - **ELK日志收集**:通过Filebeat采集Tomcat日志 - **慢SQL记录**:在ConnectionInterceptor中记录执行时间>2秒的SQL # 九、灾备方案 **多级容灾设计:** 1. 实时热备:PostgreSQL流复制(主从同步) 2. 每日增量备份: ``` sql pg_basebackup -h 主库IP -D /backup/$(date +%Y%m%d) -P -v ``` 3. 异地容灾:通过DomainRefreshTask动态切换域名解析 **总结:** 本架构通过Tomcat原生Session管理实现高可用,c3p0动态连接池支撑多账套业务,Struts拦截器链提供纵深防御,配合PostgreSQL集群保障数据安全。前端Vue+Element UI实现高效交互,后端ScheduledExecutorService确保任务调度可靠性,为传统ERP系统向云原生演进提供平滑过渡方案。 #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)