萌芽小店 · Mengyastore
一个前后端分离的轻量级数字商品商城,支持卡密 / 固定内容两种发货、扫码收款演示流程、邮件通知(直发或 RabbitMQ 队列)、聊天客服、收藏夹、管理端系统状态面板与 PWA 安装。
技术栈
前端 mengyastore-frontend/
| 分类 | 技术 | 说明 |
|---|---|---|
| 框架 | Vue 3 | Composition API + <script setup> |
| 构建 | Vite 5 + @tailwindcss/vite |
开发与生产打包 |
| 路由 | Vue Router 4 | History 模式 |
| 状态 | Pinia、本地 reactive | 收藏与认证等 |
| HTTP | Axios | modules/shared/api.js |
| Markdown | markdown-it | 商品描述 |
| PWA | vite-plugin-pwa | Service Worker、Manifest、更新提示 |
| 认证 | SproutGate OAuth | 回调 AuthCallback.vue |
主要模块
src/
modules/
admin/ # 管理后台(商品/订单/聊天/站点设置/系统状态)
auth/ # OAuth 回调
chat/ # 用户悬浮聊天
maintenance/ # 维护页
shared/ # api.js、auth、fulfillment.js、useWishlist、SplashScreen
store/ # 商店、详情、结算(含真实收款码展示)
user/ # 我的订单
wishlist/ # 收藏夹
assets/
payment/ # 支付宝/微信收款图(打包进产物,供结算页演示)
styles.css
App.vue # 顶栏;窄屏为汉堡菜单 + 下拉导航
router/index.js # 路由与维护模式守卫
后端 mengyastore-backend-go/
| 分类 | 技术 | 说明 |
|---|---|---|
| 语言 | Go 1.21+ | 单二进制部署 |
| Web | Gin | REST、CORS |
| ORM | GORM | MySQL,Open 时 AutoMigrate |
| 消息 | RabbitMQ(可选) | internal/mq,订单邮件可走队列;连接异常自动重连 |
| 缓存 | Redis(可选) | 配置项齐全,可用于扩展;管理端状态可探测 |
| 邮件 | internal/email |
SMTP;与 MQ 二选一或降级 |
| 配置 | 环境变量 + .env |
internal/config,见下文 |
主要模块
internal/
auth/ # SproutGate 校验
cache/ # Redis 等(按项目演进)
config/ # Load():APP_ENV、DB、Redis、RabbitMQ、HTTP 监听等
database/ # db.go、models.go
email/
handlers/ # public、order、stats、wishlist、chat、admin_*、admin_status
mq/ # AMQP 发布/消费、拓扑、重连
models/
storage/ # product、order、site、wishlist、chat(productstore 含 fulfillment)
cmd/migrate/ # 历史 JSON → MySQL 迁移
main.go # 依赖注入、路由
数据库表(要点)
| 表 | 说明 |
|---|---|
products |
含 fulfillment_type(card/fixed)、fixed_content、delivery_mode(订单侧自动/手动)等 |
product_codes |
卡密行表;fixed 商品可不使用 |
orders |
delivered_codes、notify_email、delivery_mode、status |
site_settings |
维护、SMTP、访问量等 KV |
wishlists / chat_messages |
收藏与聊天 |
功能列表(摘要)
| 能力 | 前端 | 后端 |
|---|---|---|
| 商品浏览、详情、Markdown | ✅ | ✅ |
| 发货方式:卡密(逐条库存)/ 固定内容(不限库存) | ✅ | ✅ |
| 结算页:应付金额、本地上传收款码、订单号一键复制 | ✅ | 订单仍返回 qrCodeUrl 作凭证 |
| 订单确认、我的订单 | ✅ | ✅ |
| SMTP 邮件;可选 RabbitMQ 排队发信 | — | ✅ |
| 管理端 系统状态(API/ MySQL/ Redis/ RabbitMQ) | ✅ | ✅ |
| 收藏夹、聊天、维护模式 | ✅ | ✅ |
| SproutGate 登录 | ✅ | ✅ |
| PWA | ✅ | — |
| 窄屏顶栏(汉堡菜单) | ✅ | — |
快速开始
1. MySQL
创建库与用户后,无需手写表结构,后端首次连接会 AutoMigrate。
可参考 mengyastore-backend-go/init.sql 中的建库语句。
2. 后端配置
在 mengyastore-backend-go/ 使用 .env(或环境变量)。常用项:
APP_ENV:development/production(影响默认 DSN、RabbitMQ/Redis 默认地址等)DATABASE_DSN:MySQL 连接串ADMIN_TOKEN:管理端令牌AUTH_API_URL:SproutGate 网关RABBITMQ_ENABLED、RABBITMQ_URL(或密码拼装变量)REDIS_ENABLED、REDIS_ADDR等(可选)HTTP_LISTEN_ADDR、PUBLIC_API_BASE_URL(系统状态展示用,可选)
cd mengyastore-backend-go
go run . # 默认 :8080,见配置
3. 前端
cd mengyastore-frontend
npm install
npm run dev # 默认 :5173
.env.development 中设置 VITE_API_BASE_URL 指向后端。
4. 管理后台
在站点 Logo 上连续点击 5 次,输入 ADMIN_TOKEN;或使用带 ?token= 的 /admin 链接。
生产部署(Docker)
见 mengyastore-backend-go/docker-compose.yml:通过环境变量注入 DATABASE_DSN、ADMIN_TOKEN、REDIS_*、RABBITMQ_* 等,不要将真实密钥提交到 Git。
项目结构
mengyastore/
mengyastore-frontend/ # Vue 3 + Vite 前端
mengyastore-backend-go/ # Go + Gin 后端
README.md # 本文件
工程亮点
- 两种发货:卡密扣
product_codes;固定内容不扣库存,每笔订单复制fixed_content至delivered_codes。 - 管理员鉴权:
X-Admin-Token(推荐)/Authorization/?token=;POST /api/admin/verify仅返回valid。 - MQ 韧性:AMQP 504/断线后客户端会尝试重连并重启消费协程。
- 公开接口:列表/详情不返回卡密与
fixedContent。 - PWA:离线缓存、启动屏、新版本 Toast。
© 2025 – 2026 萌芽小店 · Vue 3 + Go + MySQL
Description
Languages
Python
40%
Vue
22.5%
Go
20.6%
Java
13%
JavaScript
2.4%
Other
1.4%