电商设计文档
电商后台管理系统架构设计与数据库表设计
系统架构设计
1. 整体架构图
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 前端展示层 │ │ 网关层 │ │ 应用层 │
│ │ │ │ │ │
│ Vue2 + Element │◄──►│ Nginx反向代理 │◄──►│ Node.js API │
│ UI │ │ 负载均衡 │ │ Express │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 数据存储层 │ │ 缓存层 │ │ 搜索层 │
│ │ │ │ │ │
│ MySQL │◄──►│ Redis │◄──►│ Elasticsearch │
│ 主从复制 │ │ 集群缓存 │ │ 商品搜索 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
2. 技术栈说明
前端技术栈:
Vue 2.6 + Vue Router + Vuex
Element UI 2.x
Axios + 拦截器
ECharts 数据可视化
后端技术栈:
Node.js + Express
JWT 身份认证
Sequelize ORM
Redis 缓存 + Session存储
Elasticsearch 商品搜索
Joi 参数验证
数据库:
MySQL 8.4 (主从复制)
Redis 7.2.4
ELK 8 冷热数据架构
==========================================
数据库表设计
1. 用户权限相关表
用户表 (users)
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(255) NOT NULL COMMENT '密码',
`name` varchar(50) NOT NULL COMMENT '姓名',
`email` varchar(100) NOT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`last_login` datetime DEFAULT NULL COMMENT '最后登录时间',
`department_id` int(11) DEFAULT NULL COMMENT '部门ID',
`role_id` int(11) NOT NULL COMMENT '角色ID',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_department` (`department_id`),
KEY `idx_role` (`role_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
部门表 (departments)
CREATE TABLE `departments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '部门名称',
`code` varchar(50) NOT NULL COMMENT '部门编码',
`parent_id` int(11) DEFAULT '0' COMMENT '父部门ID',
`leader_id` int(11) DEFAULT NULL COMMENT '部门负责人ID',
`sort` int(11) DEFAULT '0' COMMENT '排序',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_parent` (`parent_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
角色表 (roles)
CREATE TABLE `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '角色名称',
`code` varchar(50) NOT NULL COMMENT '角色编码',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`data_scope` tinyint(1) DEFAULT '1' COMMENT '数据权限范围:1-全部,2-本部门,3-本部门及子部门,4-仅自己',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
权限表 (permissions)
CREATE TABLE `permissions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '权限名称',
`code` varchar(100) NOT NULL COMMENT '权限编码',
`type` tinyint(1) NOT NULL COMMENT '权限类型:1-菜单,2-按钮,3-接口',
`parent_id` int(11) DEFAULT '0' COMMENT '父权限ID',
`path` varchar(200) DEFAULT NULL COMMENT '路由路径',
`component` varchar(200) DEFAULT NULL COMMENT '组件路径',
`icon` varchar(100) DEFAULT NULL COMMENT '图标',
`sort` int(11) DEFAULT '0' COMMENT '排序',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_parent` (`parent_id`),
KEY `idx_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表';
角色权限关联表 (role_permissions)
CREATE TABLE `role_permissions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL COMMENT '角色ID',
`permission_id` int(11) NOT NULL COMMENT '权限ID',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_permission` (`role_id`,`permission_id`),
KEY `idx_permission` (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限关联表';
2. 商品相关表
商品分类表 (categories)
CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '分类名称',
`code` varchar(50) NOT NULL COMMENT '分类编码',
`parent_id` int(11) DEFAULT '0' COMMENT '父分类ID',
`level` tinyint(1) DEFAULT '1' COMMENT '分类层级',
`image` varchar(255) DEFAULT NULL COMMENT '分类图片',
`sort` int(11) DEFAULT '0' COMMENT '排序',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`description` text COMMENT '描述',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_parent` (`parent_id`),
KEY `idx_level` (`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';
品牌表 (brands)
CREATE TABLE `brands` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '品牌名称',
`logo` varchar(255) DEFAULT NULL COMMENT '品牌Logo',
`description` text COMMENT '品牌描述',
`first_letter` char(1) DEFAULT NULL COMMENT '品牌首字母',
`sort` int(11) DEFAULT '0' COMMENT '排序',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_first_letter` (`first_letter`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='品牌表';
商品表 (products)
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL COMMENT '商品名称',
`sub_title` varchar(500) DEFAULT NULL COMMENT '商品副标题',
`product_sn` varchar(100) NOT NULL COMMENT '商品编号',
`category_id` int(11) NOT NULL COMMENT '分类ID',
`brand_id` int(11) DEFAULT NULL COMMENT '品牌ID',
`main_image` varchar(255) DEFAULT NULL COMMENT '主图',
`gallery` json DEFAULT NULL COMMENT '商品相册',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`original_price` decimal(10,2) DEFAULT NULL COMMENT '原价',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`unit` varchar(20) DEFAULT NULL COMMENT '单位',
`weight` decimal(8,2) DEFAULT NULL COMMENT '重量',
`keywords` varchar(200) DEFAULT NULL COMMENT '关键词',
`description` text COMMENT '商品描述',
`detail` text COMMENT '商品详情',
`specifications` json DEFAULT NULL COMMENT '规格参数',
`sales` int(11) DEFAULT '0' COMMENT '销量',
`reviews` int(11) DEFAULT '0' COMMENT '评价数',
`rating` decimal(3,2) DEFAULT '0.00' COMMENT '评分',
`sort` int(11) DEFAULT '0' COMMENT '排序',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-下架,1-上架,2-审核中',
`is_hot` tinyint(1) DEFAULT '0' COMMENT '是否热销',
`is_new` tinyint(1) DEFAULT '0' COMMENT '是否新品',
`is_recommend` tinyint(1) DEFAULT '0' COMMENT '是否推荐',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product_sn` (`product_sn`),
KEY `idx_category` (`category_id`),
KEY `idx_brand` (`brand_id`),
KEY `idx_status` (`status`),
KEY `idx_hot` (`is_hot`),
KEY `idx_new` (`is_new`),
KEY `idx_recommend` (`is_recommend`),
KEY `idx_sales` (`sales`),
FULLTEXT KEY `ft_name_desc` (`name`,`sub_title`,`keywords`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
商品SKU表 (product_skus)
CREATE TABLE `product_skus` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL COMMENT '商品ID',
`sku_code` varchar(100) NOT NULL COMMENT 'SKU编码',
`specifications` json NOT NULL COMMENT '规格属性',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`original_price` decimal(10,2) DEFAULT NULL COMMENT '原价',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`low_stock` int(11) DEFAULT '0' COMMENT '预警库存',
`image` varchar(255) DEFAULT NULL COMMENT 'SKU图片',
`sales` int(11) DEFAULT '0' COMMENT '销量',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_sku_code` (`sku_code`),
KEY `idx_product` (`product_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品SKU表';
订单相关表
订单表 (orders)
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_sn` varchar(100) NOT NULL COMMENT '订单号',
`user_id` int(11) NOT NULL COMMENT '用户ID',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
`discount_amount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
`shipping_amount` decimal(10,2) DEFAULT '0.00' COMMENT '运费',
`pay_amount` decimal(10,2) NOT NULL COMMENT '应付金额',
`payment_method` tinyint(1) DEFAULT NULL COMMENT '支付方式:1-支付宝,2-微信,3-银行卡',
`payment_time` datetime DEFAULT NULL COMMENT '支付时间',
`status` tinyint(1) NOT NULL COMMENT '订单状态:0-待付款,1-待发货,2-已发货,3-已完成,4-已取消,5-退款中,6-已退款',
`shipping_name` varchar(100) DEFAULT NULL COMMENT '收货人姓名',
`shipping_phone` varchar(20) DEFAULT NULL COMMENT '收货人电话',
`shipping_address` varchar(500) DEFAULT NULL COMMENT '收货地址',
`remark` varchar(500) DEFAULT NULL COMMENT '订单备注',
`confirmed` tinyint(1) DEFAULT '0' COMMENT '用户确认收货',
`confirm_time` datetime DEFAULT NULL COMMENT '确认收货时间',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_sn` (`order_sn`),
KEY `idx_user` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_payment_time` (`payment_time`),
KEY `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
订单商品表 (order_items)
CREATE TABLE `order_items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '订单ID',
`product_id` int(11) NOT NULL COMMENT '商品ID',
`product_sku_id` int(11) NOT NULL COMMENT '商品SKU ID',
`product_name` varchar(200) NOT NULL COMMENT '商品名称',
`product_image` varchar(255) DEFAULT NULL COMMENT '商品图片',
`specifications` json DEFAULT NULL COMMENT '规格属性',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`quantity` int(11) NOT NULL COMMENT '数量',
`total_amount` decimal(10,2) NOT NULL COMMENT '总金额',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_order` (`order_id`),
KEY `idx_product` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品表';
系统相关表
操作日志表 (operation_logs)
CREATE TABLE `operation_logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`operation` varchar(100) NOT NULL COMMENT '操作内容',
`method` varchar(10) NOT NULL COMMENT '请求方法',
`url` varchar(500) NOT NULL COMMENT '请求URL',
`params` text COMMENT '请求参数',
`ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
`execution_time` int(11) DEFAULT NULL COMMENT '执行时间(ms)',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:0-失败,1-成功',
`error_message` text COMMENT '错误信息',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_operation` (`operation`),
KEY `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
文件表 (files)
CREATE TABLE `files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`original_name` varchar(255) NOT NULL COMMENT '原始文件名',
`filename` varchar(255) NOT NULL COMMENT '存储文件名',
`path` varchar(500) NOT NULL COMMENT '文件路径',
`size` int(11) NOT NULL COMMENT '文件大小',
`mime_type` varchar(100) NOT NULL COMMENT '文件类型',
`bucket` varchar(100) DEFAULT NULL COMMENT '存储桶',
`uploader_id` int(11) NOT NULL COMMENT '上传者ID',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_uploader` (`uploader_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件表';
===============================================================
系统配置
Redis键设计
// 用户相关
USER_TOKEN: 'user:token:{userId}', // 用户token
USER_PERMISSIONS: 'user:permissions:{userId}', // 用户权限缓存
USER_INFO: 'user:info:{userId}', // 用户信息缓存
// 商品相关
PRODUCT_DETAIL: 'product:detail:{productId}', // 商品详情缓存
PRODUCT_CATEGORIES: 'product:categories', // 商品分类缓存
HOT_PRODUCTS: 'product:hot', // 热销商品缓存
// 订单相关
ORDER_DETAIL: 'order:detail:{orderId}', // 订单详情缓存
CART: 'cart:{userId}', // 购物车数据
// 系统配置
SYSTEM_CONFIG: 'system:config', // 系统配置缓存
VERIFICATION_CODE: 'verification:code:{phone}', // 验证码
接口设计规范
// 统一响应格式
{
code: 200, // 状态码
message: '成功', // 消息
data: {}, // 数据
timestamp: 1630000000000 // 时间戳
}
// 分页响应格式
{
code: 200,
message: '成功',
data: {
records: [], // 数据列表
total: 100, // 总记录数
page: 1, // 当前页
size: 10 // 每页大小
}
}
//todo 。。。。。。。。。。。。。。。。
