# 纺织行业采购计划管理系统 - 设计说明书 ## 文档鉴别材料 - 设计说明书 **软件名称**:纺织行业采购计划管理系统 **软件简称**:昱森 **版本号**:V1.0.0 **编制日期**:2025年05月 --- ## 目录 1. 系统架构设计 2. 数据库设计 3. 接口设计 4. 安全设计 5. 部署架构 6. 技术选型说明 --- ## 第一章 系统架构设计 ### 1.1 整体架构 本系统采用前后端分离架构,基于云原生技术栈构建: ``` ┌─────────────────────────────────────────────────────────────┐ │ 客户端层 │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Web浏览器 │ │ 移动端 │ │ 平板 │ │ │ │ (React) │ │ (H5) │ │ (响应式) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 云服务层 (Meoo Cloud) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Supabase │ │ 认证服务 │ │ 实时订阅 │ │ │ │ (PostgreSQL)│ │ (Auth) │ │ (Realtime) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 1.2 前端架构 **技术栈**: - **框架**:React 18 + TypeScript - **路由**:React Router v6 (HashRouter) - **状态管理**:React Context + Zustand - **样式方案**:TailwindCSS - **动画库**:Framer Motion - **构建工具**:Webpack 5 **目录结构**: ``` src/ ├── components/ # 公共组件 ├── pages/ # 页面组件 │ ├── purchaser/ # 采购商页面 │ ├── textile/ # 纺织厂页面 │ └── washing/ # 水洗厂页面 ├── hooks/ # 自定义Hooks ├── contexts/ # React上下文 ├── stores/ # 状态管理 ├── utils/ # 工具函数 ├── types/ # 类型定义 └── supabase/ # Supabase客户端 ``` ### 1.3 后端架构 **云服务**:Meoo Cloud (基于Supabase) - **数据库**:PostgreSQL 15 - **认证**:Supabase Auth - **实时**:Supabase Realtime - **存储**:Supabase Storage --- ## 第二章 数据库设计 ### 2.1 ER关系图 ``` auth.users (Supabase内置) │ ├── 1:1 ── profiles (用户配置) │ │ │ ├── N:1 ── companies (公司) │ │ │ │ │ ├── 1:N ── company_members (公司成员) │ │ │ │ │ ├── 1:N ── factories (工厂) │ │ │ │ │ │ │ ├── N:M ── production_plans │ │ │ │ │ ├── 1:N ── warehouses (仓库) │ │ │ │ │ │ │ ├── 1:N ── inventory_records │ │ │ │ │ ├── 1:N ── yarn_stock (纱线库存) │ │ │ ├── 1:N ── production_plans (采购商创建的计划) │ │ │ │ │ ├── 1:N ── yarn_ratios (纱线配比) │ │ │ │ │ ├── 1:N ── plan_process_steps (流程节点) │ │ │ │ │ ├── N:M ── factories (通过plan_factories关联) │ │ │ ├── 1:N ── payments (结款记录) ``` ### 2.2 核心表结构 #### 2.2.1 companies - 公司表 | 字段 | 类型 | 说明 | |------|------|------| | id | UUID (PK) | 公司ID | | name | TEXT | 公司名称 | | role | app_role | 公司类型:purchaser/textile/washing | | address | TEXT | 公司地址 | | contact_phone | TEXT | 联系电话 | | created_at | TIMESTAMPTZ | 创建时间 | #### 2.2.2 profiles - 用户配置表 | 字段 | 类型 | 说明 | |------|------|------| | id | UUID (PK) | 关联auth.users.id | | username | TEXT (UNIQUE) | 用户名 | | display_name | TEXT | 显示名称 | | phone | TEXT | 手机号(加密存储) | | company_id | UUID (FK) | 所属公司 | | is_master | BOOLEAN | 是否主账号 | | master_id | UUID (FK) | 主账号ID(子账号使用) | | created_at | TIMESTAMPTZ | 创建时间 | #### 2.2.3 production_plans - 生产计划表 | 字段 | 类型 | 说明 | |------|------|------| | id | UUID (PK) | 计划ID | | plan_code | TEXT (UNIQUE) | 系统自动生成计划唯一识别码 | | product_name | TEXT | 成品名称 | | color | TEXT | 颜色 | | fabric_code | TEXT | 坯布唯一识别码(纯字母) | | color_code | TEXT | 色号(数字排序) | | remark | TEXT | 备注 | | purchaser_id | UUID (FK) | 采购商公司ID | | target_quantity | INTEGER | 计划产量(米) | | completed_quantity | INTEGER | 已完成产量(米) | | yarn_usage_per_meter | DECIMAL | 每米布纱用量(g/m) | | production_price | DECIMAL | 生产采购价(元/米) | | status | plan_status | 状态:pending/producing/completed | | start_time | TIMESTAMPTZ | 计划开始时间 | | created_by | UUID (FK) | 创建人 | | created_at | TIMESTAMPTZ | 创建时间 | | updated_at | TIMESTAMPTZ | 更新时间 | #### 2.2.4 plan_process_steps - 计划流程节点表 | 字段 | 类型 | 说明 | |------|------|------| | id | UUID (PK) | 节点ID | | plan_id | UUID (FK) | 计划ID | | step_type | step_type | 节点类型:confirm/yarn_purchase/dyeing/machine_start/fabric_warehouse | | status | step_status | 状态:pending/active/completed | | timestamp | TIMESTAMPTZ | 确认时间戳 | | operator_id | UUID (FK) | 操作人 | | notes | TEXT | 备注 | | created_at | TIMESTAMPTZ | 创建时间 | ### 2.3 自定义枚举类型 ```sql -- 应用角色(公司类型) CREATE TYPE app_role AS ENUM ('purchaser', 'textile', 'washing'); -- 工厂类型 CREATE TYPE factory_type AS ENUM ('textile', 'washing'); -- 计划状态 CREATE TYPE plan_status AS ENUM ('pending', 'producing', 'completed'); -- 流程节点类型 CREATE TYPE step_type AS ENUM ('confirm', 'yarn_purchase', 'dyeing', 'machine_start', 'fabric_warehouse'); -- 流程节点状态 CREATE TYPE step_status AS ENUM ('pending', 'active', 'completed'); -- 仓库类型 CREATE TYPE warehouse_type AS ENUM ('raw_fabric', 'fabric', 'finished', 'yarn'); -- 结款状态 CREATE TYPE payment_status AS ENUM ('pending', 'completed'); ``` ### 2.4 RLS安全策略 所有表启用Row Level Security (RLS),基于公司ID进行数据隔离: ```sql -- 示例:production_plans表RLS策略 CREATE POLICY company_select_plans ON production_plans FOR SELECT USING (purchaser_id = get_user_master_company_id()); CREATE POLICY company_insert_plans ON production_plans FOR INSERT WITH CHECK (purchaser_id = get_user_master_company_id()); CREATE POLICY company_update_plans ON production_plans FOR UPDATE USING (purchaser_id = get_user_master_company_id()); CREATE POLICY company_delete_plans ON production_plans FOR DELETE USING (purchaser_id = get_user_master_company_id()); ``` --- ## 第三章 接口设计 ### 3.1 认证接口 | 接口 | 方法 | 说明 | |------|------|------| | /auth/v1/token | POST | 用户登录 | | /auth/v1/signup | POST | 用户注册 | | /auth/v1/logout | POST | 用户退出 | | /auth/v1/refresh | POST | 刷新Token | ### 3.2 数据接口 基于Supabase自动生成的RESTful API: | 资源 | 操作 | 接口示例 | |------|------|----------| | production_plans | CRUD | /rest/v1/production_plans | | companies | CRUD | /rest/v1/companies | | profiles | CRUD | /rest/v1/profiles | | inventory_records | CRUD | /rest/v1/inventory_records | | plan_process_steps | CRUD | /rest/v1/plan_process_steps | ### 3.3 实时订阅 使用Supabase Realtime进行数据实时同步: ```typescript supabase .channel('inventory_changes') .on('postgres_changes', { event: '*', schema: 'public', table: 'inventory_records' }, callback) .subscribe(); ``` --- ## 第四章 安全设计 ### 4.1 数据安全 **加密存储**: - 手机号使用XOR加密存储 - 敏感数据加密传输(HTTPS) **访问控制**: - 基于角色的访问控制(RBAC) - 行级安全策略(RLS) - 公司数据隔离 ### 4.2 认证安全 - JWT Token认证 - Token自动刷新 - Session持久化 - 虚拟邮箱格式保护隐私 ### 4.3 分享安全 - 分享链接使用Base64 + 盐值混淆加密 - 链接不包含敏感信息 - 导入页面隐藏成品名称、颜色等敏感字段 --- ## 第五章 部署架构 ### 5.1 部署环境 **云服务**:Meoo Cloud (Supabase) - 托管数据库 - 托管认证服务 - 托管实时服务 **前端部署**: - 静态资源托管 - CDN加速 - HTTPS安全传输 ### 5.2 构建配置 **开发环境**: ```bash pnpm run dev # 启动开发服务器 pnpm run build # 构建生产版本 ``` **生产构建**: - Webpack 5优化打包 - 代码分割 - Tree Shaking - 资源压缩 --- ## 第六章 技术选型说明 ### 6.1 前端技术选型 | 技术 | 版本 | 选型理由 | |------|------|----------| | React | 18.2.0 | 组件化开发,生态丰富 | | TypeScript | 5.3.3 | 类型安全,提升开发效率 | | TailwindCSS | 3.3.5 | 原子化CSS,快速开发 | | Framer Motion | 11.16.1 | 流畅动画,用户体验好 | | React Router | 6.8.0 | 声明式路由,易于管理 | | Zustand | 4.4.7 | 轻量状态管理,简单易用 | ### 6.2 后端技术选型 | 技术 | 版本 | 选型理由 | |------|------|----------| | PostgreSQL | 15+ | 关系型数据库,支持复杂查询 | | Supabase | 2.98.0 | 开源Firebase替代,功能完整 | | Row Level Security | - | 行级安全,数据隔离 | ### 6.3 开发工具选型 | 工具 | 版本 | 用途 | |------|------|------| | Webpack | 5.89.0 | 模块打包 | | Babel | 7.23.5 | JavaScript编译 | | Jest | 29.7.0 | 单元测试 | | Playwright | 1.40.0 | E2E测试 | | pnpm | 8+ | 包管理 | --- ## 附录 ### A. 数据库迁移脚本 ```sql -- 创建公司表 CREATE TABLE companies ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, role app_role NOT NULL, address TEXT, contact_phone TEXT, created_at TIMESTAMPTZ DEFAULT NOW() ); -- 创建用户配置表 CREATE TABLE profiles ( id UUID PRIMARY KEY REFERENCES auth.users(id), username TEXT UNIQUE NOT NULL, display_name TEXT, phone TEXT, company_id UUID REFERENCES companies(id), is_master BOOLEAN DEFAULT false, master_id UUID REFERENCES auth.users(id), created_at TIMESTAMPTZ DEFAULT NOW() ); -- 启用RLS ALTER TABLE companies ENABLE ROW LEVEL SECURITY; ALTER TABLE profiles ENABLE ROW LEVEL SECURITY; ``` ### B. 技术架构图 ``` ┌────────────────────────────────────────────────────────────┐ │ 前端层 │ │ React 18 + TypeScript + TailwindCSS + Framer Motion │ └────────────────────────────────────────────────────────────┘ │ ▼ HTTP/HTTPS ┌────────────────────────────────────────────────────────────┐ │ API网关层 │ │ Supabase REST API / Realtime │ └────────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────────┐ │ 数据层 │ │ PostgreSQL + Row Level Security + Realtime Subscription │ └────────────────────────────────────────────────────────────┘ ``` --- **文档版本**:V1.0.0 **最后更新**:2025年05月 **编制单位**:[您的单位名称] --- *本说明书版权归软件著作权人所有,未经许可不得复制、传播。*