拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SpringBoot+Vue装饰公司管理系统架构设计与实践

1. 项目背景与核心需求天盛装潢公司作为一家快速发展的室内装饰企业面临着业务规模扩大带来的管理挑战。传统Excel表格和纸质文档已经无法满足客户管理、项目跟踪、材料采购等核心业务需求。这套基于SpringBoot的管理系统正是为解决以下痛点而生客户信息分散在业务员个人电脑中存在数据丢失风险项目进度依赖人工汇报管理层难以及时掌握实际情况材料库存与采购缺乏系统联动经常出现缺料或积压财务结算流程繁琐对账周期长且易出错系统采用B/S架构设计前端使用Vue.jsElementUI后端基于SpringBoot 2.7 MyBatis-Plus技术栈数据库选用MySQL 8.0。这种技术组合既保证了开发效率又能支撑日均500并发请求的业务场景。2. 系统架构设计解析2.1 技术选型决策依据选择SpringBoot作为基础框架主要基于三点考虑快速启动特性内嵌Tomcat容器和自动配置机制让团队能聚焦业务逻辑开发而非环境搭建生态完整性Spring Data JPA MyBatis-Plus的组合既保留JPA的便捷又能通过MyBatis处理复杂SQL可观测性支持通过Actuator端点轻松集成Prometheus监控满足生产环境运维需求// 典型的多数据源配置示例 Configuration MapperScan(basePackages com.tiansheng.mapper.project, sqlSessionFactoryRef projectSqlSessionFactory) public class ProjectDataSourceConfig { Bean(name projectDataSource) ConfigurationProperties(prefix spring.datasource.project) public DataSource projectDataSource() { return DataSourceBuilder.create().build(); } }2.2 模块化设计方案系统采用领域驱动设计DDD思想划分六大核心模块模块名称主要功能技术实现要点客户中心客户信息管理、跟进记录Redis缓存客户画像数据项目管理进度跟踪、工时统计Elasticsearch实现全文检索材料管理库存预警、供应商比价分布式锁控制库存扣减财务管理收支记录、发票管理EasyExcel处理批量导入导出人力资源员工考勤、绩效评估基于AOP的操作日志记录系统管理权限控制、数据字典RBAC模型JWT认证3. 关键业务实现细节3.1 项目进度可视化看板采用WebSocketECharts实现实时数据推送核心在于解决高并发下的连接管理问题// WebSocket配置类关键代码 Configuration EnableWebSocket public class ProgressWebSocketConfig implements WebSocketConfigurer { Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(progressHandler(), /ws/progress) .setAllowedOrigins(*) .addInterceptors(new HttpSessionHandshakeInterceptor()) .setHandshakeHandler(new CustomHandshakeHandler()); } Bean public WebSocketHandler progressHandler() { return new ProgressWebSocketHandler(); } }注意事项生产环境需要配合Nginx的proxy_read_timeout调整避免长连接被意外断开3.2 材料库存的分布式控制采用Redisson实现的分布式锁方案解决集群环境下的超卖问题public boolean deductMaterialStock(Long materialId, int quantity) { RLock lock redissonClient.getLock(material_lock: materialId); try { if (lock.tryLock(3, 5, TimeUnit.SECONDS)) { Material material materialMapper.selectById(materialId); if (material.getStock() quantity) { material.setStock(material.getStock() - quantity); return materialMapper.updateById(material) 0; } return false; } } finally { lock.unlock(); } return false; }实测中遇到的坑锁等待时间不宜超过5秒否则会阻塞正常业务流程必须使用try-finally保证锁释放需要配合数据库乐观锁做双重校验4. 性能优化实战记录4.1 SQL查询优化案例项目列表页原查询耗时1200ms通过以下措施降至200ms内添加复合索引ALTER TABLE t_project ADD INDEX idx_status_creator (project_status, creator_id);改写分页查询-- 原写法性能差 SELECT * FROM t_project LIMIT 10000, 20; -- 优化后先定位ID SELECT * FROM t_project WHERE id (SELECT id FROM t_project ORDER BY id LIMIT 10000, 1) LIMIT 20;4.2 缓存策略设计采用多级缓存架构提升系统响应速度本地缓存Caffeine存储高频访问的基础数据如数据字典Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000)); return cacheManager; }Redis缓存存储会话数据和计算结果缓存数据库缓存MySQL查询缓存针对静态配置表5. 安全防护实施方案5.1 权限控制体系基于Shiro改造的权限方案包含以下关键设计动态权限加载机制public class CustomRealm extends AuthorizingRealm { Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username (String) principals.getPrimaryPrincipal(); // 从数据库动态加载权限 SetString permissions permissionService.getUserPermissions(username); SimpleAuthorizationInfo info new SimpleAuthorizationInfo(); info.setStringPermissions(permissions); return info; } }接口级权限注解Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) public interface RequiresPermission { String value(); Logical logical() default Logical.AND; }5.2 敏感数据保护数据库字段加密Column(name bank_account) Convert(converter CryptoConverter.class) private String bankAccount;日志脱敏处理Around(execution(* com.tiansheng..*.*(..))) public Object around(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args joinPoint.getArgs(); // 对参数进行脱敏处理 desensitizeArgs(args); return joinPoint.proceed(args); }6. 部署与运维实践6.1 容器化部署方案Docker Compose编排文件关键配置version: 3 services: app: image: tiansheng-system:1.0 ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod depends_on: - redis - mysql mysql: image: mysql:8.0 volumes: - ./mysql/data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORDyourpassword redis: image: redis:6 ports: - 6379:63796.2 监控告警配置Prometheus监控指标采集示例# application.yml配置 management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: tags: application: ${spring.application.name}告警规则示例当API错误率1%时触发groups: - name: api-alert rules: - alert: HighErrorRate expr: sum(rate(http_server_requests_seconds_count{status~5..}[1m])) by (uri) / sum(rate(http_server_requests_seconds_count[1m])) by (uri) 0.01 for: 5m labels: severity: warning annotations: summary: High error rate on {{ $labels.uri }} description: Error rate is {{ $value }}7. 典型问题排查实录7.1 内存泄漏排查案例现象服务运行48小时后出现OOM异常排查步骤使用jmap生成堆转储文件jmap -dump:live,formatb,fileheap.hprof pid通过MAT分析发现是缓存未设置上限导致修正方案// 原配置 // Bean // public CacheManager cacheManager() { // return new ConcurrentMapCacheManager(); // } // 修正后 Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES)); return cacheManager; }7.2 慢SQL优化过程问题SQLSELECT * FROM t_order WHERE create_time 2023-01-01 ORDER BY update_time DESC LIMIT 100;优化方案添加组合索引(create_time, update_time)使用覆盖索引优化SELECT id FROM t_order WHERE create_time 2023-01-01 ORDER BY update_time DESC LIMIT 100; -- 二次查询获取完整数据 SELECT * FROM t_order WHERE id IN (...);8. 项目演进方向当前系统已在生产环境稳定运行6个月日均处理业务请求3000次。后续计划从三个方向进行迭代智能化升级引入机器学习算法分析客户偏好自动生成装修方案推荐移动端扩展开发微信小程序版本支持现场施工进度拍照上传供应链整合对接建材供应商API实现实时价格比对和自动采购在技术架构层面我们正在评估SpringCloud Alibaba套件为可能的微服务化改造做准备。不过根据我们的实践经验单体架构在QPS5000的场景下仍然是性价比最高的选择。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门