
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的場景下仍然是性價比最高的選擇。