云计算百科
云计算领域专业知识百科平台

智纺云ERP开发实战

基于Spring Boot + React的纺织品ERP管理系统全栈开发实战

本文详细介绍了一个企业级纺织品ERP管理系统的完整开发过程,涵盖需求分析、技术选型、架构设计、核心功能实现等方面。该系统采用前后端分离架构,后端使用Spring Boot + MyBatis + MySQL,前端使用React + Tailwind CSS,实现了用户管理、库存管理、采购管理、销售管理、质检管理等核心功能,特别针对纺织行业的卷级库存追踪需求进行了深度定制。

标签: Spring Boot, React, ERP系统, 前后端分离, 纺织行业


目录

文章目录

  • 基于Spring Boot + React的纺织品ERP管理系统全栈开发实战
    • 目录
    • @[toc]
    • 一、项目背景与需求分析
      • 1.1 项目背景
      • 1.2 核心需求
      • 1.3 技术挑战
    • 二、技术选型与架构���计
      • 2.1 技术栈选型
        • 后端技术栈
        • 前端技术栈
      • 2.2 系统架构设计
      • 2.3 项目目录结构
    • 三、核心功能实现
      • 3.1 用户认证与JWT实现
        • 3.1.1 JWT工具类
        • 3.1.2 登录控制器实现
      • 3.2 密码加密与安全
      • 3.3 卷级库存管理(纺织行业特色)
        • 3.3.1 卷级库存实体
    • 四、数据库设计
      • 4.1 核心表结构
        • 4.1.1 用户表(sys_user)
        • 4.1.2 卷级库存表(inventory_roll)
      • 4.2 数据库设计亮点
    • 五、前端实现
      • 5.1 React组件设计
      • 5.2 Tailwind CSS样式设计
    • 六、系统配置与部署
      • 6.1 后端配置文件
      • 6.2 部署步骤
        • 环境要求
        • 后端部署
        • 前端部署
    • 七、性能优化与最佳实践
      • 7.1 数据库优化
      • 7.2 安全最佳实践
    • 八、项目总结与展望
      • 8.1 项目成果
      • 8.2 技术收获
      • 8.3 后续优化方向

一、项目背景与需求分析

1.1 项目背景

纺织行业作为传统制造业的重要组成部分,在库存管理、采购管理、质检管理等方面有着独特的业务需求。传统的ERP系统往往无法满足纺织品行业的特殊需求,例如:

  • 卷级库存管理: 纺织品通常以卷为单位进行管理,每卷都有独特的批次号、缸号、幅宽、克重等属性
  • 质检等级评定: 需要对每卷面料进行质检评分,记录质检等级
  • 花色款式管理: 需要管理复杂的颜色、花色、款式编号体系
  • 高利润率追踪: 纺织品行业利润率较高,需要精确的成本和利润分析

基于以上背景,我们开发了这套智纺云ERP管理系统,旨在为纺织品企业提供一套完整的信息化解决方案。

1.2 核心需求

根据业务调研,系统需要实现以下核心功能:

功能模块核心需求优先级
用户管理 用户增删改查、角色权限控制、账号启用/停用
库存管理 卷级库存追踪、库位管理、库存统计、低库存预警
采购管理 采购订单管理、供应商管理、订单状态跟踪
销售管理 销售订单管理、客户管理、销售统计
质检管理 质检等级评定、质检得分记录、不良品追踪
仪表板 销售额、采购额、库存价值、利润率等关键指标
权限控制 基于角色的访问控制(RBAC)、菜单权限管理

1.3 技术挑战

在开发过程中,我们面临以下技术挑战:

  • 数据安全性: 如何保证用户密码安全、防止SQL注入和XSS攻击
  • 性能优化: 大量库存数据的分页查询和统计分析
  • 前后端分离: 如何设计清晰的API接口和统一的响应格式
  • 权限控制: 如何实现灵活的RBAC权限体系
  • 业务复杂度: 纺织品行业特有的业务逻辑如何抽象和实现

  • 二、技术选型与架构���计

    2.1 技术栈选型

    经过充分的技术调研和对比,我们最终选择了以下技术栈:

    后端技术栈
    技术版本选型理由
    Spring Boot 2.7.18 成熟稳定的企业级框架,开箱即用,生态完善
    Spring Security 5.7.x 强大的安全框架,支持多种认证方式
    MyBatis 2.3.1 灵活的SQL映射框架,适合复杂查询场景
    MySQL 8.0+ 开源关系型数据库,性能优秀,社区活跃
    JWT 0.9.1 无状态Token认证,适合前后端分离架构
    PageHelper 1.4.7 MyBatis分页插件,简化分页查询
    FastJSON 2.0.43 高性能JSON处理库
    Lombok 简化Java代码,减少样板代码
    前端技术栈
    技术版本选型理由
    React 18.2.0 主流前端框架,组件化开发,生态丰富
    Tailwind CSS 3.4.1 原子化CSS框架,快速构建现代UI
    Lucide React 0.263.1 轻量级图标库,图标丰富美观
    Axios HTTP客户端,支持Promise,易于使用

    2.2 系统架构设计

    系统采用经典的前后端分离架构,具体分层如下:

    ┌─────────────────────────────────────────┐
    │ 前端层 (React) │
    │ 登录页面 | 仪表板 | 库存管理 | 用户管理 │
    └─────────────────────────────────────────┘
    ↓ HTTP/HTTPS (JWT Token)
    ┌─────────────────────────────────────────┐
    │ 后端层 (Spring Boot) │
    │ ┌─────────────────────────────────┐ │
    │ │ Controller 层 (控制器) │ │
    │ └─────────────────────────────────┘ │
    │ ↓ │
    │ ┌─────────────────────────────────┐ │
    │ │ Service 层 (业务逻辑) │ │
    │ └─────────────────────────────────┘ │
    │ ↓ │
    │ ┌─────────────────────────────────┐ │
    │ │ Mapper 层 (数据访问) │ │
    │ └─────────────────────────────────┘ │
    └─────────────────────────────────────────┘
    ↓ JDBC
    ┌─────────────────────────────────────────┐
    │ 数据库层 (MySQL) │
    │ sys_user | goods | inventory_roll │
    └─────────────────────────────────────────┘

    架构特点:

  • 前后端分离: 前端和后端独立开发、独立部署
  • RESTful API: 统一的API接口规范
  • JWT认证: 无状态Token认证,支持分布式部署
  • 分层架构: Controller-Service-Mapper三层架构,职责清晰
  • 2.3 项目目录结构

    智纺云ERP/
    ├── backend/ # 后端项目
    │ ├── src/main/java/
    │ │ ├── controller/ # 控制器层
    │ │ ├── service/ # 业务逻辑层
    │ │ ├── mapper/ # 数据访问层
    │ │ ├── entity/ # 实体类
    │ │ ├── config/ # 配置类
    │ │ └── util/ # 工具类
    │ ├── src/main/resources/
    │ │ ├── application.yml # 配置文件
    │ │ └── mapper/ # MyBatis XML
    │ └── pom.xml # Maven配置
    ├── frontend-react/ # 前端项目
    │ ├── src/
    │ │ ├── App.js # 主应用
    │ │ ├── components/ # 组件
    │ │ └── index.js # 入口文件
    │ └── package.json # NPM配置
    └── database/ # 数据库脚本
    └── init.sql # 初始化脚本


    三、核心功能实现

    3.1 用户认证与JWT实现

    3.1.1 JWT工具类

    JWT(JSON Web Token)是一种无状态的认证方案,非常适合前后端分离架构。

    @Component
    public class JwtUtil {

    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expiration}")
    private Long expiration;

    // 生成Token
    public String generateToken(String username) {
    Map<String, Object> claims = new HashMap<>();
    claims.put("sub", username);
    claims.put("created", new Date());

    return Jwts.builder()
    .setClaims(claims)
    .setExpiration(new Date(System.currentTimeMillis() + expiration))
    .signWith(SignatureAlgorithm.HS512, secret)
    .compact();
    }

    // 从Token中获取用户名
    public String getUsernameFromToken(String token) {
    Claims claims = Jwts.parser()
    .setSigningKey(secret)
    .parseClaimsJws(token)
    .getBody();
    return claims.getSubject();
    }

    // 验证Token是否有效
    public boolean validateToken(String token) {
    try {
    Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
    return true;
    } catch (Exception e) {
    return false;
    }
    }
    }

    关键点说明:

    • 使用HS512算法进行签名,保证Token不被篡改
    • Token有效期设置为7天(604800000毫秒)
    • 密钥存储在配置文件中,不硬编码在代码里
    3.1.2 登录控制器实现

    @RestController
    @RequestMapping("/auth")
    public class LoginController {

    @Autowired
    private ISysUserService userService;

    @Autowired
    private JwtUtil jwtUtil;

    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginRequest request) {
    // 查询用户
    SysUser user = userService.selectUserByLoginName(request.getUsername());
    if (user == null) {
    return AjaxResult.error("用户不存在");
    }

    // 检查用户状态
    if ("1".equals(user.getStatus())) {
    return AjaxResult.error("账号已被停用");
    }

    // 验证密码
    if (!PasswordUtil.matches(request.getPassword(), user.getPassword())) {
    return AjaxResult.error("密码错误");
    }

    // 生成token
    String token = jwtUtil.generateToken(request.getUsername());

    Map<String, Object> result = new HashMap<>();
    result.put("token", token);
    result.put("user", user);

    return AjaxResult.success("登录成功", result);
    }
    }

    **【图片位置2 - 登录流程图】**
*建议添加一张展示登录认证流程的时序图*

    3.2 密码加密与安全

    系统使用BCrypt算法对用户密码进行加密,这是一种单向哈希算法,即使数据库泄露也无法反推出原始密码。

    public class PasswordUtil {

    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    // 加密密码
    public static String encode(String rawPassword) {
    return encoder.encode(rawPassword);
    }

    // 验证密码
    public static boolean matches(String rawPassword, String encodedPassword) {
    return encoder.matches(rawPassword, encodedPassword);
    }
    }

    3.3 卷级库存管理(纺织行业特色)

    这是系统最具特色的功能,专门针对纺织品行业的库存管理需求设计。

    3.3.1 卷级库存实体

    @Data
    public class InventoryRoll {
    private Long rollId; // 卷ID
    private String rollBarcode; // 卷条码
    private String productCode; // 商品编码
    private String color; // 颜色
    private String pattern; // 花色
    private String lotNo; // 批次号/缸号
    private Integer rollNo; // 卷号
    private BigDecimal width; // 幅宽(cm)
    private BigDecimal gsm; // 克重(gsm)
    private BigDecimal quantity; // 数量
    private String unit; // 单位
    private String qcGrade; // 质检等级
    private BigDecimal qcScore; // 质检得分
    private String location; // 库位
    private String status; // 状态
    }

    核心特点:

  • 唯一标识: 每卷面料都有唯一的卷条码
  • 详细属性: 记录幅宽、克重、批次号等纺织品特有属性
  • 质检信息: 支持质检等级和得分记录
  • 状态管理: 区分可用、预留、已售等状态
  • **【图片位置3 - 库存管理界面截图】**
*建议添加库存管理页面的实际运行截图*


    四、数据库设计

    4.1 核心表结构

    系统共设计了9张核心数据表,采用RuoYi架构的标准设计规范。

    4.1.1 用户表(sys_user)

    CREATE TABLE sys_user (
    user_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    login_name VARCHAR(30) NOT NULL COMMENT '登录账号',
    user_name VARCHAR(30) NOT NULL COMMENT '用户昵称',
    email VARCHAR(50) DEFAULT '' COMMENT '用户邮箱',
    phonenumber VARCHAR(11) DEFAULT '' COMMENT '手机号码',
    password VARCHAR(100) DEFAULT '' COMMENT '密码',
    status CHAR(1) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
    del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (user_id),
    UNIQUE KEY uk_login_name (login_name)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';

    4.1.2 卷级库存表(inventory_roll)

    CREATE TABLE inventory_roll (
    roll_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '卷ID',
    roll_barcode VARCHAR(50) NOT NULL COMMENT '卷条码',
    product_code VARCHAR(50) NOT NULL COMMENT '商品编码',
    color VARCHAR(50) COMMENT '颜色',
    lot_no VARCHAR(50) COMMENT '批次号/缸号',
    width DECIMAL(10,2) COMMENT '幅宽(cm)',
    gsm DECIMAL(10,2) COMMENT '克重(gsm)',
    quantity DECIMAL(10,2) NOT NULL COMMENT '数量',
    qc_grade VARCHAR(10) COMMENT '质检等级',
    location VARCHAR(50) COMMENT '库位',
    status VARCHAR(20) DEFAULT 'Available',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (roll_id),
    UNIQUE KEY uk_roll_barcode (roll_barcode),
    KEY idx_product_code (product_code)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='卷级库存表';

    4.2 数据库设计亮点

  • 字符集选择: 使用utf8mb4字符集,支持存储emoji等特殊字符
  • 索引优化: 在常用查询字段上建立索引,提升查询性能
  • 时间戳: 使用CURRENT_TIMESTAMP自动记录创建和更新时间
  • 逻辑删除: 使用del_flag字段实现逻辑删除,保留数据历史
  • 唯一约束: 在登录名、卷条码等字段上设置唯一约束

  • 五、前端实现

    5.1 React组件设计

    前端采用React 18.2.0 + Tailwind CSS构建,实现了现代化的响应式UI。

    // 主应用组件
    export default function App() {
    const [isLoggedIn, setIsLoggedIn] = useState(false);
    const [token, setToken] = useState('');

    const handleLogin = async (username, password) => {
    const response = await fetch('http://localhost:8080/api/auth/login', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username, password })
    });

    const data = await response.json();
    if (data.code === 200) {
    setToken(data.data.token);
    setIsLoggedIn(true);
    localStorage.setItem('token', data.data.token);
    }
    };

    return (
    <div className="min-h-screen bg-gray-50">
    {!isLoggedIn ? (
    <LoginPage onLogin={handleLogin} />
    ) : (
    <Dashboard token={token} />
    )}
    </div>
    );
    }

    5.2 Tailwind CSS样式设计

    // 卡片组件示例
    const Card = ({ title, value, icon: Icon }) => (
    <div className="bg-white p-6 rounded-xl shadow-sm hover:shadow-md transition-shadow">
    <div className="flex justify-between items-start">
    <div>
    <p className="text-sm font-medium text-slate-500">{title}</p>
    <h3 className="text-2xl font-bold text-slate-800">{value}</h3>
    </div>
    <Icon className="w-6 h-6 text-blue-500" />
    </div>
    </div>
    );

    **【图片位置5 - 系统界面截图】**
*建议添加系统仪表板、库存管理等主要界面的截图*


    六、系统配置与部署

    6.1 后端配置文件

    # application.yml
    server:
    port: 8080

    spring:
    datasource:
    url: jdbc:mysql://localhost:3306/textile_erp
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

    mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.erp.entity

    jwt:
    secret: yoursecretkeyhere
    expiration: 604800000 # 7天

    6.2 部署步骤

    环境要求
    软件版本要求
    JDK 11+
    Maven 3.6+
    MySQL 8.0+
    Node.js 14+
    后端部署

    # 1. 进入后端目录
    cd backend

    # 2. 编译打包
    mvn clean package

    # 3. 运行项目
    java -jar target/textile-erp-1.0.0.jar

    前端部署

    # 1. 进入前端目录
    cd frontend-react

    # 2. 安装依赖
    npm install

    # 3. 启动开发服务器
    npm start

    # 4. 生产环境构建
    npm run build


    七、性能优化与最佳实践

    7.1 数据库优化

  • 索引优化: 在高频查询字段上建立索引
  • 分页查询: 使用PageHelper插件避免全表扫描
  • 连接池配置: 合理配置HikariCP连接池参数
  • 7.2 安全最佳实践

  • 密码加密: 使用BCrypt算法
  • SQL注入防护: 使用MyBatis的#{}参数绑定
  • XSS防护: 前端对用户输入进行转义
  • CORS配置: 限制允许的跨域来源
  • 安全提示: 生产环境中务必修改JWT密钥,使用强密码策略,定期更新依赖库版本。


    八、项目总结与展望

    8.1 项目成果

    通过本项目的开发,我们成功实现了一个功能完整的纺织品ERP管理系统:

  • 技术架构: 采用前后端分离架构,技术栈成熟稳定
  • 核心功能: 实现了用户管理、库存管理、采购管理等核心模块
  • 行业特色: 针对纺织行业的卷级库存管理进行了深度定制
  • 安全性: 实现了JWT认证、BCrypt密码加密等安全机制
  • 可扩展性: 采用分层架构,易于扩展新功能
  • 8.2 技术收获

    • Spring Boot快速开发企业级应用的最佳实践
    • MyBatis复杂SQL查询和动态SQL的使用技巧
    • React Hooks的使用和状态管理
    • JWT无状态认证的实现原理
    • 前后端分离架构的API设计规范

    8.3 后续优化方向

  • 功能扩展: 完善角色权限管理、添加操作日志、实现数据导入导出
  • 性能优化: 引入Redis缓存、实现数据库读写分离
  • 用户体验: 优化移动端适配、添加数据可视化图表
  • 运维部署: Docker容器化部署、CI/CD自动化流水线

  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 智纺云ERP开发实战
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!