14 KiB
14 KiB
纺织行业采购计划管理系统 - 设计说明书
文档鉴别材料 - 设计说明书
软件名称:纺织行业采购计划管理系统
软件简称:昱森
版本号:V1.0.0
编制日期:2025年05月
目录
- 系统架构设计
- 数据库设计
- 接口设计
- 安全设计
- 部署架构
- 技术选型说明
第一章 系统架构设计
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 自定义枚举类型
-- 应用角色(公司类型)
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进行数据隔离:
-- 示例: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进行数据实时同步:
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 构建配置
开发环境:
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. 数据库迁移脚本
-- 创建公司表
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月
编制单位:[您的单位名称]
本说明书版权归软件著作权人所有,未经许可不得复制、传播。