基于 Go 语言开发的企业级多门店供应链管理系统,支持供应商管理、采购订单、门店管理和完整的 RBAC 权限控制。
系统采用分层架构设计,从上到下分为:
- 桌面客户端层:Flutter + Fluent UI 实现的跨平台桌面应用
- 后端服务层:Go + Gin 实现的RESTful API服务,包含性能优化层
- 基础设施层:MySQL、Redis、MinIO/RustFS 提供数据存储和缓存服务
- 查询优化器 - 自动分析SQL查询,检测性能问题并提供优化建议
- 索引分析 - 智能识别缺失索引,提供索引策略建议
- JOIN去重 - 自动检测和防止重复JOIN操作
- 热路径优化 - 类型断言、并发map等高频操作优化
- 缓存策略 - 多级缓存、分布式锁、延迟双删等缓存优化
- 多门店管理 - 支持多门店独立管理和数据隔离
- 供应商管理 - 供应商信息、商品分类、商品管理
- 采购管理 - 采购订单创建、审核、跟踪
- 库存管理 - 实时库存监控、库存调整、库存流水记录
- 电子记账 - 支持一单多商品,灵活的明细管理
- 图片通知 - 自动生成美观的记账通知图片(电子回单风格)
- 渠道管理 - 支持多种销售渠道(微信、堂食、外卖等)
- 标签系统 - 自定义标签分类管理
- 数据仪表板 - 实时查看库存和销售数据(当日/本周/当月/当季/当年)
- 门店统计 - 多维度门店数据分析
- 趋势分析 - 销售趋势和库存变化追踪
- RBAC 权限 - 基于角色的访问控制(超级管理员/总部管理员/门店管理员/普通员工)
- 门店级权限 - 支持门店级别的菜单权限定制
- JWT 认证 - 安全的 Token 认证机制
- 密码加密 - bcrypt 密码加密存储
- 钉钉集成 - 机器人消息推送、Stream API 实时通信
- 消息模板 - 可配置的钉钉消息模板系统
- 自动通知 - 记账、库存预警等自动消息推送
- 图片消息 - 支持发送图文混合的通知消息
- 对象存储 - 集成 RustFS/MinIO 对象存储服务
- 图库管理 - 图片上传、分类、管理
- 文件管理 - 支持多种文件类型的存储和管理
- 字典管理 - 通用的数据字典管理系统
- 用户管理 - 完整的用户生命周期管理
- 角色管理 - 角色创建、权限分配
- 菜单管理 - 动态菜单配置
tower-go/
├── cmd/main.go # 程序入口
├── bootstrap/ # 应用初始化
├── config/ # 配置管理
├── controller/ # 控制器层
│ ├── user.go # 用户管理
│ ├── store.go # 门店管理
│ ├── supplier.go # 供应商管理
│ ├── supplier_product.go # 供应商商品
│ ├── store_supplier.go # 门店供应商关联
│ ├── purchase_order.go # 采购订单
│ ├── menu.go # 菜单权限
│ ├── role.go # 角色管理
│ ├── dingtalk_bot.go # 钉钉机器人
│ ├── inventory.go # 库存管理
│ ├── statistics.go # 统计分析
│ ├── store_account.go # 门店记账
│ ├── message_template.go # 消息模板
│ ├── file.go # 文件管理
│ └── gallery.go # 图库管理
├── service/ # 服务层(业务逻辑)
│ ├── rustfs.go # RustFS/MinIO 文件服务
│ ├── image_generator.go # 图片自动生成
│ └── dingtalk.go # 钉钉集成服务
├── module/ # 数据访问层(DAO)
├── model/ # 数据模型
├── middleware/ # 中间件
│ ├── auth.go # 认证中间件
│ ├── rbac.go # 权限中间件
│ └── logger.go # 日志中间件
├── router/ # 路由配置
│ ├── api/ # API 路由模块
│ └── router.go # 路由注册
├── utils/ # 工具函数
├── pkg/ # 性能优化包
│ └── performance/ # 性能优化组件
│ ├── query_optimizer.go # 查询优化器
│ ├── hotpath.go # 热路径优化
│ └── README.md # 性能优化文档
├── migrations/ # 数据库迁移脚本
└── docs/ # Swagger 文档
├── docs.go
├── swagger.json
└── swagger.yaml
| 技术 | 版本 | 说明 |
|---|---|---|
| Go | 1.20+ | 编程语言 |
| Gin | v1.11.0 | Web 框架 |
| GORM | v1.31.0 | ORM 框架 |
| MySQL | 8.0+ | 数据库 |
| Redis | - | 缓存 |
| JWT | golang-jwt/jwt/v5 | 认证 |
| Zap | - | 日志库 |
| Swagger | swaggo | API 文档 |
| gg | fogleman/gg | 图片生成库 |
| MinIO/RustFS | - | 对象存储服务 |
| WebSocket | gorilla/websocket | 实时通信 |
| gopter | leanovate/gopter | 属性测试库 |
- Go 1.20+
- MySQL 8.0+
- Redis
- 克隆项目
git clone https://github.com/Kevin-Jii/tower-go.git
cd tower-go- 安装依赖
go mod tidy- 配置环境变量
copy .env.example .env
# 编辑 .env 文件,填写数据库和 Redis 配置- 创建数据库
CREATE DATABASE tower CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;- 初始化种子数据
mysql -u用户名 -p密码 数据库名 < migrations/init_seed_data.sql- 启动应用
go run cmd/main.go- 访问应用
- API 地址:
http://localhost:10024 - Swagger 文档:
http://localhost:10024/api/v1/swagger/index.html
# 登录获取 Token
curl -X POST http://localhost:10024/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"phone": "130xxxxxxxx", "password": "Admin@123456"}'
# 使用 Token 访问接口
curl -X GET http://localhost:10024/api/v1/users/profile \
-H "Authorization: Bearer <token>"| 角色代码 | 角色名称 | 权限说明 |
|---|---|---|
super_admin |
超级管理员 | 系统最高权限,管理所有门店 |
admin |
总部管理员 | 管理所有门店、查看汇总数据 |
store_admin |
门店管理员 | 管理本门店数据 |
staff |
普通员工 | 查看和操作本门店数据 |
1 = 0001 = 仅删除
2 = 0010 = 仅修改
4 = 0100 = 仅新增
8 = 1000 = 仅查看
15 = 1111 = 全部权限
- users - 用户表(6位工号自动生成)
- roles - 角色表(超级管理员/总部管理员/门店管理员/普通员工)
- menus - 菜单表
- role_menus - 角色菜单关联(权限控制)
- store_role_menus - 门店角色菜单(门店级权限定制)
- stores - 门店表(JW+4位编码)
- suppliers - 供应商表
- supplier_categories - 供应商商品分类
- supplier_products - 供应商商品
- store_supplier_products - 门店供应商商品关联
- purchase_orders - 采购订单
- purchase_order_items - 采购订单明细
- store_accounts - 门店记账主表(支持一单多商品)
- store_account_items - 记账明细表
- inventories - 库存表
- inventory_transactions - 库存流水记录
- dict_types - 字典类型表
- dict_datas - 字典数据表
- message_templates - 消息模板表
- dingtalk_bots - 钉钉机器人配置
- galleries - 图库管理表
- files - 文件管理表
# 应用配置
APP_NAME=tower-go
APP_PORT=10024
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=your_password
DB_NAME=tower
# Redis配置
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_ENABLED=true
# JWT配置
JWT_SECRET=your_jwt_secret_at_least_32_characters
# 钉钉配置
DINGTALK_CLIENT_ID=your_client_id
DINGTALK_CLIENT_SECRET=your_client_secret
DINGTALK_ROBOT_CODE=your_robot_code
DINGTALK_ROBOT_WEBHOOK=https://oapi.dingtalk.com/robot/send
# RustFS/MinIO 配置(可选)
RUSTFS_ENABLED=true
RUSTFS_ENDPOINT=your.rustfs.server:9000
RUSTFS_ACCESS_KEY=your_access_key
RUSTFS_SECRET_KEY=your_secret_key
RUSTFS_BUCKET=tower
RUSTFS_NOTIFY_BUCKET=tower-notify
RUSTFS_USE_SSL=false# 构建镜像
docker build -t tower-go:latest .
# 启动服务
docker-compose up -d系统初始化后的默认账号:
| 账号 | 密码 | 角色 |
|---|---|---|
| 138 xxxx xxxx | Admin@123456 | 超级管理员 |
⚠️ 请在首次登录后立即修改默认密码!
提交规范:
fix:Bug 修复feat:新功能docs:文档更新refactor:代码重构
系统集成了全面的性能优化组件,从数据库查询到内存管理,提供企业级的性能保障。
自动分析SQL查询,检测性能问题并提供优化建议:
import "github.com/Kevin-Jii/tower-go/pkg/performance"
optimizer := performance.NewQueryOptimizer(db)
result, _ := optimizer.Analyze("SELECT * FROM store_accounts WHERE store_id = ?")
// 检查性能问题
for _, issue := range result.Issues {
fmt.Printf("[%s] %s\n", issue.Severity, issue.Message)
}
// 获取优化建议
for _, rec := range result.Recommendations {
fmt.Println("建议:", rec)
}检测的问题类型:
- 缺失索引
- OFFSET分页性能问题
- 全表扫描
- LIKE前缀优化
- 重复JOIN
- SELECT * 使用
智能分析表的索引使用情况:
analyzer := performance.NewIndexAnalyzer(db)
usage := analyzer.AnalyzeIndexUsage("store_accounts", []string{"store_id", "account_date"})
fmt.Printf("潜在索引: %v\n", usage.PotentialIndexes)
fmt.Printf("全表扫描: %v\n", usage.TableScan)针对高频操作的性能优化:
// 类型转换优化(使用类型开关替代反射)
converter := performance.GetTypeConverter()
val, _ := converter.ToUint(someInterface)
// 并发缓存优化(使用sync.Map)
cache := performance.NewConcurrentCache()
cache.Set("key", value)
val, _ := cache.Get("key")
// 正则表达式缓存
regexCache := performance.GetRegexCache()
regex, _ := regexCache.Get(`^\d{3}-\d{4}$`)系统使用属性测试(Property-Based Testing)验证性能优化的正确性:
# 运行性能测试
go test -v ./pkg/performance/... -run TestProperty
# 运行基准测试
go test -bench=. -benchmem ./pkg/performance/...详细文档请参考:pkg/performance/README.md
系统支持自动生成美观的记账通知图片,以电子回单的形式发送给门店管理人员。
- 自动生成 - 记账完成后自动生成图片,无需人工干预
- 现代设计 - 采用电子回单风格设计,包含:
- 门店信息和记账编号
- 商品明细列表(支持多商品)
- 合计金额和笔数统计
- 渠道、操作人和日期信息
- "已入账"电子印章
- 生成时间戳
- 对象存储 - 生成的图片自动上传到 RustFS/MinIO
- 钉钉推送 - 优先发送图片+文字的通知消息
- 使用 gg 图形库进行图片绘制
- 支持中文字体渲染(Windows/Unix 系统自动适配)
- 高质量 PNG 输出(2倍分辨率)
- 自动适配商品数量,动态计算图片高度
最后更新: 2025-12-12
