{"id":42510840,"url":"https://github.com/me-cs/dianping-gozero","last_synced_at":"2026-01-28T14:11:35.622Z","repository":{"id":331837062,"uuid":"1132064558","full_name":"me-cs/dianping-gozero","owner":"me-cs","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-11T09:51:13.000Z","size":3427,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T14:51:56.884Z","etag":null,"topics":["cloud-native","go","go-zero","grpc","microservices"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/me-cs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-11T08:50:10.000Z","updated_at":"2026-01-11T09:51:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/me-cs/dianping-gozero","commit_stats":null,"previous_names":["me-cs/dianping-gozero"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/me-cs/dianping-gozero","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/me-cs%2Fdianping-gozero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/me-cs%2Fdianping-gozero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/me-cs%2Fdianping-gozero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/me-cs%2Fdianping-gozero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/me-cs","download_url":"https://codeload.github.com/me-cs/dianping-gozero/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/me-cs%2Fdianping-gozero/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28846058,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T13:02:32.985Z","status":"ssl_error","status_checked_at":"2026-01-28T13:02:04.945Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloud-native","go","go-zero","grpc","microservices"],"created_at":"2026-01-28T14:11:34.747Z","updated_at":"2026-01-28T14:11:35.612Z","avatar_url":"https://github.com/me-cs.png","language":"JavaScript","funding_links":["https://www.buymeacoffee.com/yourname"],"categories":[],"sub_categories":[],"readme":"# 🍔 DianPing-GoZero - Go 微服务实战项目\n\n\u003cdiv align=\"center\"\u003e\n\n![CI](https://github.com/me-cs/dianping-gozero/actions/workflows/ci.yml/badge.svg)\n![Docker Build](https://github.com/me-cs/dianping-gozero/actions/workflows/docker.yml/badge.svg)\n![Go Version](https://img.shields.io/badge/Go-1.23+-00ADD8?style=flat\u0026logo=go)\n![go-zero](https://img.shields.io/badge/go--zero-1.9.4-7C3AED?style=flat)\n![Docker](https://img.shields.io/badge/Docker-Ready-2496ED?style=flat\u0026logo=docker)\n![MySQL](https://img.shields.io/badge/MySQL-8.0-4479A1?style=flat\u0026logo=mysql)\n![Redis](https://img.shields.io/badge/Redis-7.0-DC382D?style=flat\u0026logo=redis)\n![License](https://img.shields.io/badge/License-MIT-green?style=flat)\n![AI Powered](https://img.shields.io/badge/90%25_Built_by-Claude_AI-FF6B6B?style=flat)\n\n**🎓 一个完整的 Go 微服务学习项目 | 黑马点评Go版后端**\n\n[English](./README_EN.md) | [快速开始](#-快速开始) | [在线文档](./docs) | [贡献指南](#-贡献指南)\n\n**⭐ 如果这个项目对你有帮助，请给个 Star！**\n\n\u003c/div\u003e\n\n---\n\n## 📚 目录\n\n- [项目简介](#项目简介)\n- [技术栈](#技术栈)\n- [架构设计](#架构设计)\n- [数据库设计](#数据库设计)\n- [环境准备（新手必读）](#环境准备新手必读)\n- [快速开始](#快速开始)\n- [部署指南](#部署指南)\n- [开发指南](#开发指南)\n- [调试与故障排查](#调试与故障排查)\n- [学习路径](#学习路径)\n- [贡献指南](#贡献指南)\n- [法律声明](#法律声明)\n- [致谢](#致谢)\n- [支持项目](#支持项目)\n- [联系我们](#联系我们)\n- [路线图](#路线图)\n- [项目统计](#项目统计)\n- [许可证](#许可证)\n\n---\n\n## 🎯 项目简介\n\n**DianPing-GoZero** 是一个基于 **go-zero** 微服务框架构建的黑马点评Go版后端系统，专为学习和实践现代微服务架构而设计。\n\n### ✨ 项目亮点\n\n- 🤖 **AI 驱动开发**：90% 的代码由 **Claude AI** 协助完成，展示了 AI 在软件工程中的强大能力\n- 🏗️ **企业级架构**：完整的微服务架构设计，包含 API 网关、RPC 服务、缓存层、消息队列等\n- 📊 **可观测性**：集成 Jaeger 分布式追踪、Prometheus 监控、Grafana 可视化\n- 🐳 **容器化部署**：完整的 Docker Compose 配置，一键启动所有服务\n- 📖 **详细文档**：从零开始的完整教程，适合新手学习\n- 🎓 **最佳实践**：遵循 Go 社区最佳实践和微服务设计模式\n\n### 🎯 核心功能\n\n- 👤 **用户系统**：手机验证码登录、用户信息管理、Session 管理\n- 🏪 **商铺系统**：商铺信息查询、分类浏览、地理位置搜索\n- 🎫 **优惠券系统**：普通优惠券、秒杀券（高并发场景）\n- 📝 **笔记/博客系统**：发布探店笔记、点赞、评论\n- 🛒 **订单系统**：优惠券下单、订单管理\n\n### 🎓 适合人群\n\n- Go 语言初学者，想要学习微服务架构\n- 有一定基础，想要了解 go-zero 框架\n- 想要学习分布式系统设计和高并发处理\n- 对 AI 辅助编程感兴趣的开发者\n- 准备面试，需要一个完整的项目经验\n\n---\n\n## 🛠️ 技术栈\n\n### 后端技术\n\n| 技术 | 版本 | 用途 |\n|------|------|------|\n| **Go** | 1.23+ | 主要编程语言 |\n| **go-zero** | 1.9.4 | 微服务框架 |\n| **gRPC** | 1.78.0 | RPC 通信协议 |\n| **Protocol Buffers** | 3.0 | 服务接口定义 |\n\n### 数据存储\n\n| 技术 | 版本 | 用途 |\n|------|------|------|\n| **MySQL** | 8.0 | 主数据库 |\n| **Redis** | 7.0 | 缓存、Session、分布式锁 |\n| **etcd** | 3.5 | 服务发现与注册 |\n\n### 监控与追踪\n\n| 技术 | 版本 | 用途 |\n|------|------|------|\n| **Jaeger** | latest | 分布式链路追踪 |\n| **Prometheus** | latest | 指标收集 |\n| **Grafana** | latest | 可视化监控面板 |\n\n### 基础设施\n\n| 技术 | 版本 | 用途 |\n|------|------|------|\n| **Docker** | 20.10+ | 容器化 |\n| **Docker Compose** | 2.0+ | 容器编排 |\n| **Nginx** | latest | 反向代理（可选） |\n\n### 开发工具\n\n- **GoLand / VS Code**：推荐 IDE\n- **Postman / Apifox**：API 测试\n- **TablePlus / Navicat**：数据库管理\n- **Claude AI**：代码生成和问题解决\n\n---\n\n## 🏗️ 架构设计\n\n### 整体架构\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                         Frontend (Future)                        │\n│                    Vue 3 / React / Next.js                       │\n└──────────────────────────────┬──────────────────────────────────┘\n                               │ HTTP/REST\n                               ↓\n┌─────────────────────────────────────────────────────────────────┐\n│                        API Gateway (8081)                        │\n│                         go-zero API                              │\n├─────────────────────────────────────────────────────────────────┤\n│  • 统一入口                                                       │\n│  • 身份认证                                                       │\n│  • 请求路由                                                       │\n│  • 负载均衡                                                       │\n└──────────────────────────────┬──────────────────────────────────┘\n                               │ gRPC\n                ┌──────────────┼──────────────┐\n                ↓              ↓              ↓\n    ┌──────────────┐  ┌──────────────┐  ┌──────────────┐\n    │  User RPC    │  │  Shop RPC    │  │ Voucher RPC  │\n    │   (8001)     │  │   (8002)     │  │   (8003)     │\n    └──────┬───────┘  └──────┬───────┘  └──────┬───────┘\n           │                 │                  │\n    ┌──────────────┐  ┌──────────────┐\n    │  Order RPC   │  │  Blog RPC    │\n    │   (8004)     │  │   (8005)     │\n    └──────┬───────┘  └──────┬───────┘\n           │                 │\n           └─────────┬───────┘\n                     │\n    ┌────────────────┴────────────────┐\n    │                                  │\n    ↓                                  ↓\n┌─────────────┐              ┌──────────────┐\n│   MySQL     │              │    Redis     │\n│   (3306)    │              │    (6379)    │\n├─────────────┤              ├──────────────┤\n│ • 用户表     │              │ • 缓存        │\n│ • 商铺表     │              │ • Session    │\n│ • 订单表     │              │ • 分布式锁    │\n│ • 优惠券表   │              │ • 排行榜      │\n└─────────────┘              └──────────────┘\n\n┌─────────────────────────────────────────────────────────────────┐\n│                    Infrastructure Services                       │\n├─────────────────┬─────────────────┬──────────────┬──────────────┤\n│  etcd (2379)    │ Jaeger (16686)  │ Prometheus   │  Grafana     │\n│  服务发现        │  链路追踪        │  (9090)      │  (3000)      │\n│                 │                 │  监控指标     │  可视化       │\n└─────────────────┴─────────────────┴──────────────┴──────────────┘\n```\n\n### 服务划分\n\n#### 1. API Gateway (端口: 8081)\n- **职责**：统一入口、鉴权、路由\n- **特点**：RESTful API、JWT 认证\n- **对外接口**：HTTP/JSON\n\n#### 2. User RPC (端口: 8001)\n- **职责**：用户注册、登录、信息管理\n- **数据**：用户表、Session\n- **缓存策略**：用户信息缓存、验证码存储\n\n#### 3. Shop RPC (端口: 8002)\n- **职责**：商铺 CRUD、分类管理、地理位置搜索\n- **数据**：商铺表、商铺类型表\n- **缓存策略**：热点商铺缓存、分类列表缓存\n\n#### 4. Voucher RPC (端口: 8003)\n- **职责**：优惠券管理、秒杀券库存控制\n- **数据**：优惠券表、秒杀券表\n- **高并发方案**：Redis 预扣库存、Lua 脚本保证原子性\n\n#### 5. Order RPC (端口: 8004)\n- **职责**：订单创建、查询、状态管理\n- **数据**：订单表\n- **事务处理**：分布式事务、幂等性保证\n\n#### 6. Blog RPC (端口: 8005)\n- **职责**：笔记发布、点赞、评论\n- **数据**：博客表、点赞表\n- **缓存策略**：点赞数缓存、热门笔记排行榜\n\n### 数据流转示例\n\n**用户登录流程**：\n```\n1. 前端 → API Gateway (POST /user/login)\n2. API Gateway → User RPC (gRPC Login)\n3. User RPC → Redis (验证验证码)\n4. User RPC → MySQL (查询/创建用户)\n5. User RPC → Redis (创建 Session)\n6. User RPC ← MySQL (用户信息)\n7. API Gateway ← User RPC (返回 Token)\n8. 前端 ← API Gateway (返回用户信息)\n```\n\n**秒杀优惠券流程**：\n```\n1. 前端 → API Gateway (POST /voucher/seckill/{id})\n2. API Gateway → Order RPC (gRPC CreateSeckillOrder)\n3. Order RPC → Redis (Lua 脚本检查并扣减库存)\n4. Order RPC → Voucher RPC (gRPC CheckVoucherStock)\n5. Order RPC → MySQL (创建订单记录)\n6. Order RPC → Redis (缓存订单信息)\n7. API Gateway ← Order RPC (返回订单 ID)\n8. 前端 ← API Gateway (下单成功)\n```\n\n---\n\n## 💾 数据库设计\n\n### ER 图\n\n```\n┌─────────────┐         ┌─────────────┐         ┌─────────────┐\n│   tb_user   │         │   tb_shop   │         │ tb_voucher  │\n├─────────────┤         ├─────────────┤         ├─────────────┤\n│ id (PK)     │         │ id (PK)     │         │ id (PK)     │\n│ phone       │         │ name        │         │ shop_id(FK) │\n│ password    │         │ type_id(FK) │         │ title       │\n│ nick_name   │         │ images      │         │ pay_value   │\n│ icon        │         │ area        │         │ actual_value│\n│ create_time │         │ address     │         │ type        │\n│ update_time │         │ x, y        │         │ status      │\n└─────────────┘         │ avg_price   │         │ create_time │\n                        │ sold        │         └──────┬──────┘\n                        │ comments    │                │\n                        │ score       │         ┌──────┴──────┐\n                        │ create_time │         │tb_seckill_  │\n                        └──────┬──────┘         │  voucher    │\n                               │                ├─────────────┤\n                        ┌──────┴──────┐         │voucher_id PK│\n                        │tb_shop_type │         │ stock       │\n                        ├─────────────┤         │ begin_time  │\n                        │ id (PK)     │         │ end_time    │\n                        │ name        │         │ create_time │\n                        │ icon        │         └─────────────┘\n                        │ sort_order  │\n                        └─────────────┘\n\n┌─────────────┐         ┌─────────────┐         ┌─────────────┐\n│ tb_voucher_ │         │   tb_blog   │         │  tb_follow  │\n│   order     │         ├─────────────┤         ├─────────────┤\n├─────────────┤         │ id (PK)     │         │ id (PK)     │\n│ id (PK)     │         │ shop_id(FK) │         │ user_id(FK) │\n│ user_id(FK) │────┐    │ user_id(FK) │         │follow_uid   │\n│voucher_id FK│    └───→│ title       │         │ create_time │\n│ pay_type    │         │ images      │         └─────────────┘\n│ status      │         │ content     │\n│ create_time │         │ liked       │\n│ pay_time    │         │ comments    │\n│ use_time    │         │ create_time │\n└─────────────┘         └─────────────┘\n```\n\n### 核心表设计\n\n#### 1. tb_user - 用户表\n```sql\nCREATE TABLE `tb_user` (\n  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `phone` VARCHAR(11) NOT NULL COMMENT '手机号码',\n  `password` VARCHAR(128) DEFAULT '' COMMENT '密码，加密存储',\n  `nick_name` VARCHAR(32) DEFAULT '' COMMENT '昵称，默认是随机字符',\n  `icon` VARCHAR(255) DEFAULT '' COMMENT '人物头像',\n  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE KEY `uniq_phone` (`phone`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';\n```\n\n**设计考虑**：\n- 使用手机号作为唯一标识，便于登录和找回密码\n- 密码字段预留，支持密码登录扩展\n- nick_name 和 icon 支持用户个性化\n- 时间戳自动维护\n\n#### 2. tb_shop - 商铺表\n```sql\nCREATE TABLE `tb_shop` (\n  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `name` VARCHAR(128) NOT NULL COMMENT '商铺名称',\n  `type_id` BIGINT UNSIGNED NOT NULL COMMENT '商铺类型的id',\n  `images` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '商铺图片，多个图片以,隔开',\n  `area` VARCHAR(128) DEFAULT '' COMMENT '商圈，例如陆家嘴',\n  `address` VARCHAR(255) NOT NULL COMMENT '地址',\n  `x` DOUBLE NOT NULL COMMENT '经度',\n  `y` DOUBLE NOT NULL COMMENT '纬度',\n  `avg_price` BIGINT UNSIGNED DEFAULT '0' COMMENT '均价，取整数',\n  `sold` INT UNSIGNED DEFAULT '0' COMMENT '销量',\n  `comments` INT UNSIGNED DEFAULT '0' COMMENT '评论数量',\n  `score` INT UNSIGNED DEFAULT '50' COMMENT '评分，1~50分，乘10保存，避免小数',\n  `open_hours` VARCHAR(32) DEFAULT '' COMMENT '营业时间，例如 10:00-22:00',\n  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `idx_type_id` (`type_id`) USING BTREE,\n  KEY `idx_area` (`area`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商铺表';\n```\n\n**设计考虑**：\n- x, y 字段存储经纬度，支持地理位置搜索（可扩展 GeoHash）\n- score 乘以 10 存储，避免浮点数精度问题\n- 冗余 sold、comments 字段，避免频繁关联查询\n- 索引优化：type_id 和 area 是常用筛选条件\n\n#### 3. tb_voucher - 优惠券表\n```sql\nCREATE TABLE `tb_voucher` (\n  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `shop_id` BIGINT UNSIGNED NOT NULL COMMENT '商铺id',\n  `title` VARCHAR(255) NOT NULL COMMENT '代金券标题',\n  `sub_title` VARCHAR(255) DEFAULT '' COMMENT '副标题',\n  `rules` VARCHAR(1024) DEFAULT '' COMMENT '使用规则',\n  `pay_value` BIGINT UNSIGNED NOT NULL COMMENT '支付金额，单位是分',\n  `actual_value` BIGINT UNSIGNED NOT NULL COMMENT '抵扣金额，单位是分',\n  `type` TINYINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '0,普通券；1,秒杀券',\n  `status` TINYINT UNSIGNED NOT NULL DEFAULT '1' COMMENT '1,上架; 2,下架; 3,过期',\n  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `idx_shop_id` (`shop_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券表';\n```\n\n**设计考虑**：\n- 金额以分为单位存储，避免浮点数问题\n- type 字段区分普通券和秒杀券\n- status 字段支持券的生命周期管理\n\n#### 4. tb_seckill_voucher - 秒杀券表\n```sql\nCREATE TABLE `tb_seckill_voucher` (\n  `voucher_id` BIGINT UNSIGNED NOT NULL COMMENT '关联的优惠券的id',\n  `stock` INT NOT NULL COMMENT '库存',\n  `begin_time` TIMESTAMP NOT NULL COMMENT '生效时间',\n  `end_time` TIMESTAMP NOT NULL COMMENT '失效时间',\n  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`voucher_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='秒杀优惠券表，与优惠券是一对一关系';\n```\n\n**设计考虑**：\n- 一对一关系，使用 voucher_id 作为主键\n- stock 字段实时更新，但真正的库存控制在 Redis 中\n- begin_time 和 end_time 控制秒杀时间窗口\n\n#### 5. tb_voucher_order - 优惠券订单表\n```sql\nCREATE TABLE `tb_voucher_order` (\n  `id` BIGINT NOT NULL COMMENT '主键',\n  `user_id` BIGINT UNSIGNED NOT NULL COMMENT '下单的用户id',\n  `voucher_id` BIGINT UNSIGNED NOT NULL COMMENT '购买的代金券id',\n  `pay_type` TINYINT UNSIGNED NOT NULL DEFAULT '1' COMMENT '支付方式 1：余额支付；2：支付宝；3：微信',\n  `status` TINYINT UNSIGNED NOT NULL DEFAULT '1' COMMENT '订单状态，1：未支付；2：已支付；3：已核销；4：已取消；5：退款中；6：已退款',\n  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',\n  `pay_time` TIMESTAMP NULL DEFAULT NULL COMMENT '支付时间',\n  `use_time` TIMESTAMP NULL DEFAULT NULL COMMENT '核销时间',\n  `refund_time` TIMESTAMP NULL DEFAULT NULL COMMENT '退款时间',\n  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `idx_user_id` (`user_id`) USING BTREE,\n  KEY `idx_voucher_id` (`voucher_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券订单表';\n```\n\n**设计考虑**：\n- 使用分布式 ID（雪花算法）作为主键\n- 订单状态支持完整的生命周期\n- 时间字段支持订单各个阶段的追踪\n- 一人一单限制在业务层实现（Redis + Lua）\n\n### 表关系说明\n\n1. **用户 ↔ 订单**：一对多关系\n   - 一个用户可以下多个订单\n   - 订单通过 user_id 关联用户\n\n2. **商铺 ↔ 优惠券**：一对多关系\n   - 一个商铺可以发布多张优惠券\n   - 优惠券通过 shop_id 关联商铺\n\n3. **优惠券 ↔ 秒杀券**：一对一关系\n   - 秒杀券是优惠券的扩展信息\n   - 使用 voucher_id 作为主键实现一对一\n\n4. **优惠券 ↔ 订单**：一对多关系\n   - 一张优惠券可以被多个用户购买（库存允许）\n   - 订单通过 voucher_id 关联优惠券\n\n5. **用户 ↔ 博客**：一对多关系\n   - 一个用户可以发布多篇博客\n   - 博客通过 user_id 关联用户\n\n---\n\n## 🔧 环境准备（新手必读）\n\n\u003e 如果你已经有完整的开发环境，可以跳过这一章节，直接看 [快速开始](#-快速开始)\n\n本章节将手把手教你从零搭建开发环境。即使你是完全的新手，只要按照步骤操作，也能顺利完成。\n\n### 1. 安装 Go 环境\n\n#### 1.1 下载 Go\n\n访问 Go 官网下载页面：https://go.dev/dl/\n\n**推荐版本**：Go 1.23 或更高版本\n\n**选择对应的安装包**：\n- Linux (x86_64): `go1.23.5.linux-amd64.tar.gz`\n- macOS (Intel): `go1.23.5.darwin-amd64.pkg`\n- macOS (Apple Silicon): `go1.23.5.darwin-arm64.pkg`\n- Windows: `go1.23.5.windows-amd64.msi`\n\n#### 1.2 安装 Go\n\n**Linux 安装步骤**：\n\n```bash\n# 1. 下载（可以换成最新版本号）\nwget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz\n\n# 2. 解压到 /usr/local 目录\n# -C 指定解压目录，-z 表示 gzip 压缩，-x 表示解压，-v 显示详细信息，-f 指定文件\nsudo tar -C /usr/local/ -zxvf go1.23.5.linux-amd64.tar.gz\n\n# 3. 验证解压\nls /usr/local/go/bin/go  # 应该能看到 go 可执行文件\n```\n\n**macOS 安装步骤**：\n\n```bash\n# 方式一：使用 pkg 安装包（推荐，会自动配置环境变量）\n# 下载 .pkg 文件后双击安装即可\n\n# 方式二：使用 tar.gz 手动安装（和 Linux 相同）\nwget https://go.dev/dl/go1.23.5.darwin-amd64.tar.gz\nsudo tar -C /usr/local/ -zxvf go1.23.5.darwin-amd64.tar.gz\n```\n\n**Windows 安装步骤**：\n\n```bash\n# 下载 .msi 文件后双击安装即可\n# 安装程序会自动配置环境变量\n```\n\n#### 1.3 配置环境变量\n\n**Linux / macOS (bash)**：\n\n```bash\n# 编辑 ~/.bashrc 文件\nvim ~/.bashrc\n# 或使用 nano（更简单）\nnano ~/.bashrc\n\n# 在文件末尾添加以下内容：\nexport GOROOT=/usr/local/go\nexport GOPATH=$HOME/go\nexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin\n\n# 保存后，让配置生效\nsource ~/.bashrc\n```\n\n**macOS (zsh - 默认 shell)**：\n\n```bash\n# 编辑 ~/.zshrc 文件\nvim ~/.zshrc\n\n# 添加相同的环境变量（同上）\n\n# 让配置生效\nsource ~/.zshrc\n```\n\n**Windows**：\n\n```powershell\n# 如果使用 .msi 安装，环境变量已自动配置\n# 如果需要手动配置：\n# 1. 右键\"此电脑\" → \"属性\" → \"高级系统设置\" → \"环境变量\"\n# 2. 在\"系统变量\"中新建：\n#    GOROOT = C:\\Go\n#    GOPATH = C:\\Users\\你的用户名\\go\n# 3. 编辑 Path 变量，添加：\n#    %GOROOT%\\bin\n#    %GOPATH%\\bin\n```\n\n#### 1.4 配置 GOPROXY（国内必须！）\n\n由于网络原因，国内直接访问 Go 官方模块代理会很慢或失败，**必须配置国内镜像**：\n\n```bash\n# 配置七牛云提供的 goproxy（推荐）\ngo env -w GOPROXY=https://goproxy.cn,direct\n\n# 或使用阿里云镜像\ngo env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct\n\n# 关闭模块验证（可选，某些私有仓库需要）\ngo env -w GOSUMDB=off\n\n# 开启 Go Modules（Go 1.16+ 默认开启）\ngo env -w GO111MODULE=on\n```\n\n**解释**：\n- `GOPROXY`：指定 Go 模块代理服务器\n- `,direct`：如果代理不可用，直接访问源站\n- `GOSUMDB`：模块校验数据库，设为 off 可跳过校验\n\n#### 1.5 验证安装\n\n```bash\n# 查看 Go 版本\ngo version\n# 应该输出：go version go1.23.5 linux/amd64\n\n# 查看 Go 环境配置\ngo env\n# 检查 GOROOT、GOPATH、GOPROXY 是否正确\n\n# 测试 Go Modules 下载\ngo mod download\n```\n\n### 2. 安装 Docker 环境\n\nDocker 是本项目的核心依赖，必须正确安装和配置。\n\n#### 2.1 Linux 安装 Docker\n\n**方式一：使用国内优化脚本（强烈推荐！）**\n\n[@tech-shrimp](https://github.com/tech-shrimp) 提供了一个针对国内环境优化的 Docker 安装脚本：\n\n```bash\n# 1. 克隆安装脚本仓库\ngit clone https://github.com/tech-shrimp/docker_installer.git\ncd docker_installer\n\n# 2. 给脚本执行权限\nchmod +x docker_installer.sh\n\n# 3. 运行安装脚本（会自动检测系统并安装）\nsudo ./docker_installer.sh\n\n# 4. 启动 Docker\nsudo systemctl start docker\nsudo systemctl enable docker\n\n# 5. 验证安装\ndocker --version\nsudo docker run hello-world\n```\n\n**方式二：使用官方脚本（可能较慢）**\n\n```bash\n# Ubuntu / Debian\ncurl -fsSL https://get.docker.com | sudo bash -s docker\n\n# CentOS / RHEL（使用阿里云镜像）\ncurl -fsSL https://get.docker.com | sudo bash -s docker --mirror Aliyun\n\n# 启动 Docker\nsudo systemctl start docker\nsudo systemctl enable docker\n```\n\n**方式三：手动安装（各发行版）**\n\n\u003cdetails\u003e\n\u003csummary\u003eUbuntu / Debian 手动安装步骤\u003c/summary\u003e\n\n```bash\n# 1. 更新包索引\nsudo apt-get update\n\n# 2. 安装依赖\nsudo apt-get install -y \\\n    ca-certificates \\\n    curl \\\n    gnupg \\\n    lsb-release\n\n# 3. 添加 Docker GPG 密钥\nsudo mkdir -p /etc/apt/keyrings\ncurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | \\\n    sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\n\n# 4. 添加 Docker 仓库（使用阿里云镜像）\necho \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \\\n  https://mirrors.aliyun.com/docker-ce/linux/ubuntu \\\n  $(lsb_release -cs) stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list \u003e /dev/null\n\n# 5. 安装 Docker\nsudo apt-get update\nsudo apt-get install -y docker-ce docker-ce-cli containerd.io \\\n    docker-buildx-plugin docker-compose-plugin\n\n# 6. 启动 Docker\nsudo systemctl start docker\nsudo systemctl enable docker\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCentOS / RHEL / veLinux 手动安装步骤\u003c/summary\u003e\n\n```bash\n# 1. 安装依赖\nsudo yum install -y yum-utils device-mapper-persistent-data lvm2\n\n# 2. 添加 Docker 仓库（使用阿里云镜像）\nsudo yum-config-manager --add-repo \\\n    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo\n\n# 3. 安装 Docker\nsudo yum install -y docker-ce docker-ce-cli containerd.io \\\n    docker-buildx-plugin docker-compose-plugin\n\n# 4. 启动 Docker\nsudo systemctl start docker\nsudo systemctl enable docker\n```\n\n\u003c/details\u003e\n\n#### 2.2 配置 Docker 镜像加速（国内必须！）\n\nDocker Hub 在国内访问很慢，**必须配置镜像加速**：\n\n```bash\n# 创建 Docker 配置目录\nsudo mkdir -p /etc/docker\n\n# 配置镜像加速器（使用多个镜像源，提高成功率）\nsudo tee /etc/docker/daemon.json \u003c\u003c-'EOF'\n{\n  \"registry-mirrors\": [\n    \"https://dockerproxy.cn\",\n    \"https://docker.1panel.live\",\n    \"https://hub.rat.dev\",\n    \"https://docker.m.daocloud.io\",\n    \"https://docker.mirrors.ustc.edu.cn\"\n  ],\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n    \"max-size\": \"10m\",\n    \"max-file\": \"3\"\n  }\n}\nEOF\n\n# 重启 Docker 服务\nsudo systemctl daemon-reload\nsudo systemctl restart docker\n\n# 验证配置\nsudo docker info | grep -A 10 \"Registry Mirrors\"\n```\n\n**镜像源说明**：\n- `dockerproxy.cn`：Docker 代理加速\n- `docker.1panel.live`：1Panel 提供的镜像\n- `hub.rat.dev`：社区镜像\n- `docker.m.daocloud.io`：DaoCloud 镜像\n- `docker.mirrors.ustc.edu.cn`：中科大镜像\n\n#### 2.3 配置 Docker 用户权限（可选）\n\n避免每次使用 Docker 都要 `sudo`：\n\n```bash\n# 将当前用户添加到 docker 组\nsudo usermod -aG docker $USER\n\n# 重新登录或执行以下命令使权限生效\nnewgrp docker\n\n# 验证（不需要 sudo）\ndocker ps\n```\n\n#### 2.4 macOS 安装 Docker\n\n```bash\n# 1. 下载 Docker Desktop for Mac\n# 访问：https://www.docker.com/products/docker-desktop\n\n# 2. 安装 .dmg 文件\n\n# 3. 启动 Docker Desktop\n\n# 4. 配置镜像加速\n# 打开 Docker Desktop → Settings → Docker Engine\n# 在 JSON 配置中添加：\n{\n  \"registry-mirrors\": [\n    \"https://dockerproxy.cn\",\n    \"https://docker.mirrors.ustc.edu.cn\"\n  ]\n}\n```\n\n#### 2.5 Windows 安装 Docker\n\n```bash\n# 1. 启用 WSL2（Windows 10/11）\n# 打开 PowerShell（管理员模式）：\nwsl --install\n\n# 2. 下载 Docker Desktop for Windows\n# 访问：https://www.docker.com/products/docker-desktop\n\n# 3. 安装并重启\n\n# 4. 配置镜像加速（同 macOS）\n```\n\n#### 2.6 验证 Docker 安装\n\n```bash\n# 查看 Docker 版本\ndocker --version\n# 应输出：Docker version 24.0.0 或更高\n\n# 查看 Docker Compose 版本\ndocker compose version\n# 应输出：Docker Compose version v2.x.x\n\n# 运行测试容器\ndocker run hello-world\n# 应输出：Hello from Docker!\n\n# 查看 Docker 信息\ndocker info\n```\n\n### 3. 安装其他工具\n\n#### 3.1 安装 Git\n\n**Linux**：\n```bash\n# Ubuntu / Debian\nsudo apt-get install -y git\n\n# CentOS / RHEL\nsudo yum install -y git\n```\n\n**macOS**：\n```bash\n# 使用 Homebrew\nbrew install git\n\n# 或使用 Xcode Command Line Tools\nxcode-select --install\n```\n\n**Windows**：\n- 下载：https://git-scm.com/download/win\n- 双击安装即可\n\n#### 3.2 IDE 推荐\n\n**GoLand（商业，推荐）**：\n- 下载：https://www.jetbrains.com/go/\n- 功能最强大，调试方便\n- 学生可免费使用\n\n**VS Code（免费，推荐）**：\n- 下载：https://code.visualstudio.com/\n- 安装扩展：\n  - Go（官方）\n  - Docker\n  - REST Client\n  - GitLens\n\n### 4. 环境验证清单\n\n安装完成后，运行以下命令验证：\n\n```bash\n# ✅ Go 环境\ngo version                    # 应显示 go1.23+\ngo env GOPROXY                # 应显示 https://goproxy.cn,direct\n\n# ✅ Docker 环境\ndocker --version              # 应显示 Docker version 20.10+\ndocker compose version        # 应显示 Docker Compose version v2.0+\ndocker run hello-world        # 应成功运行\n\n# ✅ Git\ngit --version                 # 应显示 git version 2.x.x\n\n# ✅ 网络测试\nping -c 4 github.com          # 测试 GitHub 访问\ncurl -I https://goproxy.cn    # 测试 Go 代理\n```\n\n### 5. 常见问题\n\n\u003cdetails\u003e\n\u003csummary\u003eQ: Go 下载太慢怎么办？\u003c/summary\u003e\n\n**A**: 使用国内镜像下载：\n```bash\n# 使用阿里云镜像\nwget https://mirrors.aliyun.com/golang/go1.23.5.linux-amd64.tar.gz\n\n# 或使用七牛云镜像\nwget https://golang.google.cn/dl/go1.23.5.linux-amd64.tar.gz\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eQ: Docker 镜像拉取失败 403/429 错误？\u003c/summary\u003e\n\n**A**: 更换镜像源或使用多个镜像源：\n```bash\n# 配置多个镜像源（按顺序尝试）\nsudo tee /etc/docker/daemon.json \u003c\u003c-'EOF'\n{\n  \"registry-mirrors\": [\n    \"https://dockerproxy.cn\",\n    \"https://docker.1panel.live\",\n    \"https://hub.rat.dev\"\n  ]\n}\nEOF\nsudo systemctl restart docker\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eQ: go get 下载依赖失败？\u003c/summary\u003e\n\n**A**: 确认 GOPROXY 配置正确：\n```bash\ngo env -w GOPROXY=https://goproxy.cn,direct\ngo env -w GOSUMDB=off  # 如果还是失败，可以关闭校验\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eQ: Docker 权限问题 \"permission denied\"？\u003c/summary\u003e\n\n**A**:\n```bash\n# 方式一：将用户加入 docker 组\nsudo usermod -aG docker $USER\nnewgrp docker\n\n# 方式二：使用 sudo\nsudo docker ps\n```\n\u003c/details\u003e\n\n---\n\n## 🚀 快速开始\n\n\u003e 请确保已完成 [环境准备](#-环境准备新手必读) 章节的所有步骤\n\n### 前置要求\n\n- ✅ **操作系统**：Linux / macOS / Windows (WSL2)\n- ✅ **Docker**：20.10+\n- ✅ **Docker Compose**：2.0+\n- ✅ **Go**：1.23+ （本地开发）\n- ✅ **Git**：任意版本\n\n### 一键启动（推荐）\n\n```bash\n# 1. 克隆项目\ngit clone https://github.com/me-cs/dianping-gozero.git\ncd dianping-gozero/backend\n\n# 2. 启动所有服务（会自动下载镜像、构建、启动）\n./start.sh\n\n# 3. 等待服务启动完成（约 2-3 分钟）\n# 看到 \"All services started successfully!\" 表示成功\n\n# 4. 验证服务\ncurl http://localhost:8081/health\n```\n\n就这么简单！所有服务都已经运行起来了。\n\n### 访问服务\n\n| 服务 | 地址 | 说明 |\n|------|------|------|\n| **Nginx** | http://localhost:80 | 反向代理（自动启动） |\n| **API Gateway** | http://localhost:8081 | RESTful API 入口 |\n| **Grafana** | http://localhost:3000 | 监控面板 (admin/admin) |\n| **Prometheus** | http://localhost:9090 | 指标数据 |\n| **Jaeger UI** | http://localhost:16686 | 链路追踪可视化 |\n| **MySQL** | localhost:3306 | 数据库 (root/root) |\n| **Redis** | localhost:6379 | 缓存 |\n| **etcd** | localhost:2379 | 服务发现 |\n\n\u003e **提示**：Nginx 反向代理会自动启动，你可以直接通过 http://localhost 访问 API（默认 80 端口），请求会自动转发到 API Gateway (8081)\n\n### 测试 API\n\n使用 Postman 或 curl 测试：\n\n```bash\n# 1. 发送验证码\ncurl -X POST http://localhost:8081/user/code \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"phone\":\"13800138000\"}'\n\n# 2. 登录（验证码在 Redis 中，可以用任意 6 位数字测试）\ncurl -X POST http://localhost:8081/user/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"phone\":\"13800138000\",\"code\":\"123456\"}'\n\n# 3. 查询商铺列表（需要 token）\ncurl http://localhost:8081/shop/list/1 \\\n  -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## 📦 部署指南\n\n### 开发环境部署\n\n使用 `start.sh` 一键启动：\n\n```bash\n./start.sh                      # 默认数据目录: /var/lib/dianping\n./start.sh /custom/path         # 自定义数据目录\n./start.sh --reset              # 清空数据重新启动\n```\n\n### 生产环境部署\n\n#### 1. 准备服务器\n\n```bash\n# 最低配置\n- CPU: 2 核\n- 内存: 4GB\n- 磁盘: 20GB\n- 操作系统: Ubuntu 20.04 / CentOS 7+\n```\n\n#### 2. 安装 Docker\n\n如果服务器上还没有安装 Docker，请参考 [环境准备](#-环境准备新手必读) 章节的详细安装步骤。\n\n**快速安装（生产环境推荐）**：\n\n```bash\n# 使用国内优化脚本\ngit clone https://github.com/tech-shrimp/docker_installer.git\ncd docker_installer\nsudo ./docker_installer.sh\n\n# 启动 Docker\nsudo systemctl start docker\nsudo systemctl enable docker\n\n# 配置镜像加速（必须！）\nsudo tee /etc/docker/daemon.json \u003c\u003c-'EOF'\n{\n  \"registry-mirrors\": [\n    \"https://dockerproxy.cn\",\n    \"https://docker.1panel.live\",\n    \"https://hub.rat.dev\"\n  ]\n}\nEOF\nsudo systemctl daemon-reload\nsudo systemctl restart docker\n```\n\n#### 3. 克隆并部署\n\n```bash\ngit clone https://github.com/me-cs/dianping-gozero.git\ncd dianping-gozero/backend\n\n# 设置数据目录\nexport DATA_DIR=/data/dianping\n\n# 启动服务\n./start.sh $DATA_DIR\n```\n\n#### 4. 配置 Nginx（可选）\n\n```nginx\nupstream api_backend {\n    server 127.0.0.1:8081;\n}\n\nserver {\n    listen 80;\n    server_name api.yourdomain.com;\n\n    location / {\n        proxy_pass http://api_backend;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    }\n}\n```\n\n#### 5. 监控和日志\n\n```bash\n# 查看所有容器状态\ndocker-compose ps\n\n# 查看服务日志\ndocker-compose logs -f user-rpc\ndocker-compose logs -f api-gateway\n\n# 查看资源使用\ndocker stats\n```\n\n### 高可用部署（进阶）\n\n对于生产环境，建议：\n\n1. **多实例部署**：每个 RPC 服务部署多个实例\n2. **负载均衡**：使用 Nginx 或 K8s Ingress\n3. **数据库主从**：MySQL 主从复制 + 读写分离\n4. **Redis 集群**：Redis Sentinel 或 Cluster 模式\n5. **持久化存储**：使用外部存储卷（NFS、Ceph 等）\n\n---\n\n## 💻 开发指南\n\n### 环境搭建\n\n\u003e 如果你还没有安装 Go、Docker 等环境，请先阅读 [环境准备（新手必读）](#-环境准备新手必读) 章节。\n\n#### 1. 验证环境\n\n确保以下环境已正确安装：\n\n```bash\n# 检查 Go 版本\ngo version        # 应为 go1.23+\n\n# 检查 Docker\ndocker --version  # 应为 Docker 20.10+\n\n# 检查 Git\ngit --version\n\n# 检查 GOPROXY 配置\ngo env GOPROXY    # 应为 https://goproxy.cn,direct\n```\n\n#### 2. 安装 IDE\n\n推荐使用 **GoLand**（商业）或 **VS Code**（免费）\n\n**VS Code 扩展**：\n- Go (official)\n- Go Test Explorer\n- REST Client\n- Docker\n- Protocol Buffers\n\n#### 3. 克隆项目\n\n```bash\ngit clone https://github.com/me-cs/dianping-gozero.git\ncd dianping-gozero/backend\n\n# 下载依赖\ngo mod download\n```\n\n### 项目结构\n\n```\nbackend/\n├── api/                      # API Gateway\n│   ├── internal/\n│   │   ├── config/          # 配置\n│   │   ├── handler/         # HTTP 处理器\n│   │   ├── logic/           # 业务逻辑\n│   │   ├── svc/             # 服务上下文\n│   │   └── types/           # 类型定义\n│   ├── etc/                 # 配置文件\n│   └── dianping.go          # 主入口\n│\n├── rpc/                      # RPC 服务\n│   ├── user/\n│   │   ├── internal/\n│   │   │   ├── config/\n│   │   │   ├── logic/       # 业务逻辑\n│   │   │   ├── server/      # gRPC 服务器\n│   │   │   └── svc/\n│   │   ├── pb/              # Protobuf 生成代码\n│   │   ├── etc/             # 配置文件\n│   │   └── user.proto       # Protobuf 定义\n│   ├── shop/\n│   ├── voucher/\n│   ├── order/\n│   └── blog/\n│\n├── common/                   # 共享代码\n│   ├── errorx/              # 错误处理\n│   ├── utils/               # 工具函数\n│   └── types/               # 共享类型\n│\n├── deploy/                   # 部署配置\n│   ├── mysql/\n│   │   ├── init/            # 初始化 SQL\n│   │   └── conf/            # MySQL 配置\n│   ├── prometheus/\n│   └── grafana/\n│\n├── docker-compose.yml        # Docker Compose 配置\n├── start.sh                  # 启动脚本\n├── stop.sh                   # 停止脚本\n├── build-binaries.sh         # 编译脚本\n└── build-docker.sh           # 构建镜像脚本\n```\n\n### 添加新功能\n\n#### 示例：添加新的 RPC 服务\n\n```bash\n# 1. 定义 Protobuf\ncd rpc/newservice\nvim newservice.proto\n\n# 2. 生成代码\ngoctl rpc protoc newservice.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.\n\n# 3. 实现业务逻辑\nvim internal/logic/xxxLogic.go\n\n# 4. 更新配置\nvim etc/newservice.yaml\n\n# 5. 更新 docker-compose.yml\n# 添加新服务配置\n\n# 6. 编译和启动\n./build-binaries.sh\ndocker-compose up -d newservice-rpc\n```\n\n#### 示例：添加新的 API 接口\n\n```bash\n# 1. 定义 API\ncd api\nvim api/newapi.api\n\n# 2. 生成代码\ngoctl api go -api api/newapi.api -dir ./\n\n# 3. 实现 Logic\nvim internal/logic/newapi/xxxLogic.go\n\n# 4. 重新编译\ncd ..\n./build-binaries.sh\ndocker-compose restart api-gateway\n```\n\n### 代码规范\n\n- **命名**：遵循 Go 官方命名规范（驼峰命名）\n- **注释**：公开 API 必须有注释\n- **错误处理**：使用 `errorx` 包统一错误处理\n- **日志**：使用 `logx` 包，避免使用 `fmt.Println`\n- **格式化**：使用 `gofmt` 或 `goimports`\n\n### 测试\n\n#### 单元测试\n\n```bash\n# 运行所有测试\ngo test ./...\n\n# 运行特定包的测试\ngo test ./rpc/user/internal/logic\n\n# 查看覆盖率\ngo test -cover ./...\n\n# 生成覆盖率报告\ngo test -coverprofile=coverage.out ./...\ngo tool cover -html=coverage.out\n```\n\n#### 集成测试\n\n```bash\n# 确保服务运行\n./start.sh\n\n# 运行集成测试\ngo test -tags=integration ./test/integration\n\n# API 测试\ncd test/api\ngo test -v\n```\n\n---\n\n## 🐛 调试与故障排查\n\n### 查看日志\n\n```bash\n# 实时查看所有服务日志\ndocker-compose logs -f\n\n# 查看特定服务日志\ndocker-compose logs -f user-rpc\ndocker-compose logs -f api-gateway\n\n# 查看最近 100 行\ndocker-compose logs --tail=100 user-rpc\n\n# 导出日志\ndocker-compose logs \u003e logs.txt\n```\n\n### 进入容器调试\n\n```bash\n# 进入服务容器\ndocker exec -it dianping-user-rpc /bin/sh\n\n# 进入 MySQL\ndocker exec -it dianping-mysql mysql -u root -proot\n\n# 进入 Redis\ndocker exec -it dianping-redis redis-cli\n```\n\n### 常见问题排查\n\n#### 1. 服务启动失败\n\n```bash\n# 检查容器状态\ndocker-compose ps\n\n# 查看失败原因\ndocker-compose logs \u003cservice-name\u003e\n\n# 常见原因：\n# - 端口被占用：修改 docker-compose.yml 端口映射\n# - 依赖服务未就绪：等待 MySQL/Redis 启动完成\n# - 配置错误：检查 etc/*.yaml 配置文件\n```\n\n#### 2. RPC 调用失败\n\n```bash\n# 检查 etcd 服务注册\ndocker exec dianping-etcd etcdctl get --prefix \"\"\n\n# 检查服务是否注册成功\n# 应该看到类似 user.rpc/xxxx 的键\n\n# 查看 Jaeger 追踪\n# 访问 http://localhost:16686 查看调用链\n```\n\n#### 3. 数据库连接问题\n\n```bash\n# 进入 MySQL 容器\ndocker exec -it dianping-mysql mysql -u root -proot\n\n# 检查数据库\nSHOW DATABASES;\nUSE hmdp;\nSHOW TABLES;\n\n# 检查用户权限\nSELECT User, Host FROM mysql.user;\n```\n\n#### 4. Redis 连接问题\n\n```bash\n# 进入 Redis 容器\ndocker exec -it dianping-redis redis-cli\n\n# 测试连接\nPING  # 应返回 PONG\n\n# 查看所有键\nKEYS *\n\n# 查看特定键\nGET login:code:13800138000\n```\n\n#### 5. 网络问题\n\n```bash\n# 检查 Docker 网络\ndocker network ls\ndocker network inspect backend_dianping-network\n\n# 测试服务间连通性\ndocker exec dianping-user-rpc ping mysql\ndocker exec dianping-user-rpc ping redis\n```\n\n### 使用 Jaeger 追踪\n\n1. 访问 http://localhost:16686\n2. 选择服务（如 user.rpc）\n3. 点击 \"Find Traces\" 查看调用链\n4. 分析慢查询和错误\n\n### 性能监控\n\n1. 访问 Grafana：http://localhost:3000 (admin/admin)\n2. 导入预定义的 Dashboard\n3. 查看 CPU、内存、请求量、响应时间等指标\n\n---\n\n## 🎓 学习路径\n\n### 从这个项目你可以学到什么？\n\n这不是一个简单的 CRUD 项目，而是一个**完整的企业级微服务系统**，涵盖了从开发到部署的全流程。\n\n#### 🔥 核心技术栈\n\n1. **Go 语言**\n   - Go 基础语法和特性\n   - Goroutine 和 Channel 并发编程\n   - 接口和反射\n   - 测试和性能优化\n\n2. **go-zero 微服务框架**\n   - API 网关设计\n   - gRPC 服务开发\n   - 中间件使用\n   - 服务注册与发现\n   - 配置管理\n\n3. **gRPC \u0026 Protobuf**\n   - Protocol Buffers 语法\n   - gRPC 服务定义\n   - RPC 调用和错误处理\n   - 拦截器（Interceptor）\n\n#### 💾 数据存储\n\n4. **MySQL**\n   - 表设计和 ER 图\n   - 索引优化\n   - 事务处理\n   - 连接池配置\n\n5. **Redis**\n   - 缓存策略（Cache-Aside、Read-Through）\n   - 分布式锁\n   - Session 管理\n   - Lua 脚本\n   - 排行榜实现\n   - 发布订阅\n\n6. **etcd**\n   - 服务注册与发现\n   - 配置中心\n   - 分布式协调\n\n#### 🏗️ 系统设计\n\n7. **微服务架构**\n   - 服务拆分原则\n   - 服务间通信（同步/异步）\n   - API 网关模式\n   - 服务治理\n\n8. **高并发设计**\n   - 秒杀系统设计\n   - 库存扣减方案\n   - 一人一单实现\n   - 幂等性保证\n\n9. **缓存设计**\n   - 缓存穿透、击穿、雪崩\n   - 缓存预热\n   - 缓存更新策略\n   - 多级缓存\n\n10. **分布式事务**\n    - 最终一致性\n    - 补偿机制\n    - 幂等设计\n\n#### 🐳 DevOps\n\n11. **Docker**\n    - Dockerfile 编写\n    - Docker Compose 编排\n    - 容器化最佳实践\n    - 多阶段构建\n\n12. **CI/CD**\n    - Git 工作流\n    - 自动化构建\n    - 自动化测试\n    - 容器化部署\n    - Dependabot 依赖自动更新\n\n#### 📊 可观测性\n\n13. **监控**\n    - Prometheus 指标收集\n    - Grafana 可视化\n    - 告警配置\n\n14. **链路追踪**\n    - Jaeger 分布式追踪\n    - Span 和 Trace\n    - 性能分析\n\n15. **日志**\n    - 结构化日志\n    - 日志收集和分析\n    - 日志级别管理\n\n#### 🧪 测试\n\n16. **单元测试**\n    - Go testing 框架\n    - Mock 和 Stub\n    - 测试覆盖率\n\n17. **集成测试**\n    - API 测试\n    - 数据库测试\n    - Redis 测试\n\n#### 🤖 AI 辅助开发\n\n18. **Claude AI**\n    - AI 辅助编程\n    - 代码生成和重构\n    - 问题诊断\n    - 文档编写\n\n### 学习建议\n\n#### 初级阶段（1-2 周）\n\n1. **环境搭建**：完成 Docker、Go 等工具安装\n2. **运行项目**：使用 `./start.sh` 启动项目\n3. **熟悉接口**：使用 Postman 测试所有 API\n4. **阅读代码**：从 API Gateway 开始，理解请求流程\n5. **查看日志**：学习使用 `docker-compose logs` 查看日志\n6. **数据库操作**：进入 MySQL 查看表结构和数据\n\n#### 中级阶段（2-4 周）\n\n1. **添加功能**：尝试添加新的 API 接口\n2. **修改逻辑**：修改现有业务逻辑，理解代码结构\n3. **调试代码**：使用 Jaeger 追踪请求链路\n4. **优化性能**：分析慢查询，添加索引\n5. **编写测试**：为关键功能编写单元测试\n6. **学习 Redis**：理解缓存策略和分布式锁\n\n#### 高级阶段（4-8 周）\n\n1. **架构重构**：尝试改进架构设计\n2. **性能优化**：进行压力测试和性能优化\n3. **高可用部署**：实现服务多实例部署\n4. **监控告警**：配置 Prometheus 告警规则\n5. **秒杀系统**：深入理解秒杀流程和优化方案\n6. **前端开发**：使用 Vue/React 开发前端界面\n\n### 推荐资源\n\n- **Go 语言**\n  - [Go 语言官方文档](https://go.dev/doc/)\n  - [Go by Example](https://gobyexample.com/)\n  - [Effective Go](https://go.dev/doc/effective_go)\n\n- **go-zero**\n  - [go-zero 官方文档](https://go-zero.dev/)\n  - [go-zero 实战教程](https://go-zero.dev/docs/tutorials)\n\n- **微服务**\n  - [微服务设计模式](https://microservices.io/)\n  - [《微服务架构设计模式》](https://www.manning.com/books/microservices-patterns)\n\n- **Redis**\n  - [Redis 官方文档](https://redis.io/docs/)\n  - [《Redis 设计与实现》](http://redisbook.com/)\n\n- **Docker**\n  - [Docker 官方文档](https://docs.docker.com/)\n  - [Docker 从入门到实践](https://yeasy.gitbook.io/docker_practice/)\n\n---\n\n## 🤝 贡献指南\n\n我们非常欢迎各种形式的贡献！无论是报告 Bug、提出新功能、改进文档还是提交代码。\n\n### 如何贡献\n\n#### 1. Fork 项目\n\n点击右上角的 \"Fork\" 按钮，将项目 Fork 到你的账号下。\n\n#### 2. 克隆到本地\n\n```bash\ngit clone https://github.com/YOUR_USERNAME/dianping-gozero.git\ncd dianping-gozero\n```\n\n#### 3. 创建分支\n\n```bash\ngit checkout -b feature/your-feature-name\n# 或\ngit checkout -b fix/your-bug-fix\n```\n\n#### 4. 开发\n\n- 添加你的功能或修复 Bug\n- 编写测试\n- 确保所有测试通过\n- 更新文档\n\n#### 5. 提交代码\n\n```bash\ngit add .\ngit commit -m \"feat: add awesome feature\"\n\n# 提交信息规范（参考 Conventional Commits）\n# feat: 新功能\n# fix: 修复 Bug\n# docs: 文档更新\n# style: 代码格式\n# refactor: 重构\n# test: 测试\n# chore: 构建/工具\n```\n\n#### 6. 推送到 GitHub\n\n```bash\ngit push origin feature/your-feature-name\n```\n\n#### 7. 创建 Pull Request\n\n- 访问你的 Fork 仓库\n- 点击 \"New Pull Request\"\n- 填写 PR 描述，说明你的改动\n- 等待 Review\n\n### 贡献领域\n\n#### 🎨 前端开发（急需！）\n\n**我们非常欢迎有前端经验的同学加入，开发本项目的前端部分！**\n\n推荐技术栈：\n- **Vue 3** + Vite + TypeScript\n- **React** + Next.js + TypeScript\n- **组件库**：Element Plus / Ant Design / Chakra UI\n- **状态管理**：Pinia / Redux / Zustand\n- **地图**：高德地图 / 百度地图 API\n\n前端功能需求：\n- [ ] 用户登录/注册页面\n- [ ] 首页（商铺列表、分类）\n- [ ] 商铺详情页\n- [ ] 优惠券列表\n- [ ] 秒杀页面\n- [ ] 个人中心\n- [ ] 探店笔记\n- [ ] 后台管理系统\n\n**如果你想开发前端，请联系我们或直接提 Issue！**\n\n#### 🔧 后端改进\n\n- [ ] 添加单元测试\n- [ ] 性能优化\n- [ ] 添加新功能\n- [ ] 代码重构\n- [ ] Bug 修复\n\n#### 📝 文档完善\n\n- [ ] 翻译英文文档\n- [ ] 添加更多示例\n- [ ] 改进 API 文档\n- [ ] 视频教程\n\n#### 🎨 其他\n\n- [ ] 设计 Logo\n- [ ] 架构图优化\n- [ ] Grafana Dashboard\n- [ ] K8s 部署方案\n\n### 行为准则\n\n- 尊重他人，友好交流\n- 遵循项目代码规范\n- 测试你的代码\n- 清晰描述你的改动\n\n---\n\n## ⚖️ 法律声明\n\n### 项目性质\n\n本项目是一个**纯学习项目**，旨在帮助开发者学习和实践微服务架构、Go 语言开发、系统设计等技术。\n\n### 重要提示\n\n⚠️ **请注意以下法律风险**：\n\n1. **商业使用风险**\n   - 本项目仅供学习和研究使用\n   - 未经授权不得用于商业目的\n   - 项目名称、界面设计等可能涉及商标权\n\n2. **知识产权**\n   - 本项目参考了黑马点评的业务模型\n   - 所有商标、服务标志归其各自所有者\n   - 本项目不隶属于黑马点评或美团\n\n3. **数据安全**\n   - 请勿使用真实用户数据\n   - 请勿在公网暴露测试环境\n   - 注意保护用户隐私\n\n4. **责任声明**\n   - 项目作者不对使用本项目造成的任何损失负责\n   - 使用者需自行承担所有法律风险\n   - 建议仅在学习环境中使用\n\n### 许可证\n\n本项目采用 MIT License，详见 [LICENSE](LICENSE) 文件。\n\n**MIT License 摘要**：\n- ✅ 可以自由使用、修改、分发\n- ✅ 可以用于商业项目（需自行承担风险）\n- ❗ 需保留版权声明\n- ❗ 软件按\"原样\"提供，不含任何担保\n\n### 免责声明\n\n使用本项目即表示你已阅读并同意：\n- 本项目仅供学习使用\n- 作者不对任何后果负责\n- 你将遵守当地法律法规\n\n---\n\n## 💝 致谢\n\n### 🤖 特别鸣谢：Claude AI\n\n**本项目的 90% 代码由 Claude AI 生成和优化！**\n\n这是一次关于 AI 辅助编程的实验：\n- **代码生成**：所有微服务代码、API 接口、数据库设计\n- **架构设计**：系统架构、技术选型、最佳实践\n- **问题诊断**：Bug 修复、性能优化、故障排查\n- **文档编写**：README、API 文档、注释\n\n**AI 辅助开发的优势**：\n- ⚡ **开发效率**：10 倍提升（原本需要 2 周的工作，2 天完成）\n- 🎯 **代码质量**：遵循最佳实践、一致性高\n- 📚 **学习成本**：边开发边学习，实时解答疑问\n- 🐛 **快速调试**：AI 能快速定位和修复问题\n\n**如果你想学习如何使用 Claude 进行编程，这个项目是最好的示例！**\n\n### 技术支持\n\n感谢以下开源项目：\n\n- [go-zero](https://github.com/zeromicro/go-zero) - 优秀的微服务框架\n- [gRPC](https://grpc.io/) - 高性能 RPC 框架\n- [Docker](https://www.docker.com/) - 容器化平台\n- [Redis](https://redis.io/) - 高性能缓存\n- [MySQL](https://www.mysql.com/) - 关系型数据库\n- [Jaeger](https://www.jaegertracing.io/) - 分布式追踪\n- [Prometheus](https://prometheus.io/) - 监控系统\n- [Grafana](https://grafana.com/) - 可视化平台\n\n### 学习资源\n\n- 黑马程序员\n- Go 语言中文网\n- go-zero 官方文档\n\n---\n\n## ☕ 支持项目\n\n如果这个项目对你有帮助，请考虑支持我们：\n\n### ⭐ Star 项目\n\n在 GitHub 上给我们一个 Star，让更多人看到这个项目！\n\n### 💰 赞助\n\n**Buy me a coffee! ☕**\n\n你的支持将帮助我们：\n- 🚀 持续维护和更新项目\n- 📚 创作更多教程和文档\n- 🎥 录制视频课程\n- 🎨 开发前端界面\n\n**赞助方式**：\n\n\u003cdetails\u003e\n\u003csummary\u003e点击查看赞助二维码\u003c/summary\u003e\n\n#### 微信赞赏\n\n\u003cimg src=\"./docs/images/wechat-pay.png\" width=\"200\" alt=\"微信赞赏码\"\u003e\n\n#### 支付宝\n\n\u003cimg src=\"./docs/images/alipay.png\" width=\"200\" alt=\"支付宝收款码\"\u003e\n\n#### Buy Me a Coffee\n\n[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-FFDD00?style=for-the-badge\u0026logo=buy-me-a-coffee)](https://www.buymeacoffee.com/yourname)\n\n\u003c/details\u003e\n\n### 🎁 赞助者名单\n\n感谢以下赞助者（持续更新）：\n\n| 赞助者 | 金额 | 留言 |\n|--------|------|------|\n| **\\*\\*明** | ¥66 | 很棒的项目！ |\n| **\\*\\*华** | ¥100 | 学到很多 |\n| **\\*\\*\\*\\*** | $10 | Great work! |\n\n---\n\n## 📞 联系我们\n\n### 交流讨论\n\n- **GitHub Issues**: [提问题/建议](https://github.com/me-cs/dianping-gozero/issues)\n- **GitHub Discussions**: [讨论区](https://github.com/me-cs/dianping-gozero/discussions)\n\n### 社交媒体\n\n- **技术博客**: [博客地址]\n- **B站**: [B站频道]\n- **知乎**: [知乎主页]\n\n### 问题反馈\n\n遇到问题？请按以下步骤：\n\n1. 查看 [常见问题](#常见问题)\n2. 搜索 [已有 Issues](https://github.com/me-cs/dianping-gozero/issues)\n3. 如果都没有，[创建新 Issue](https://github.com/me-cs/dianping-gozero/issues/new)\n\n**提问时请包含**：\n- 问题描述\n- 复现步骤\n- 错误日志\n- 环境信息（OS、Docker 版本等）\n\n---\n\n## 🗺️ 路线图\n\n### v1.0 (当前版本)\n\n- [x] 完整的微服务架构\n- [x] 用户、商铺、优惠券、订单、博客模块\n- [x] Docker Compose 一键部署\n- [x] 分布式追踪和监控\n- [x] 完整文档\n- [x] Dependabot 自动依赖更新\n- [x] GitHub Actions CI/CD 流水线\n\n### v2.0 (计划中)\n\n- [ ] 前端界面（Vue 3 / React）\n- [ ] 管理后台\n- [ ] 单元测试覆盖率 \u003e80%\n- [ ] K8s 部署方案\n- [ ] 文件上传迁移到 MinIO 对象存储\n\n### v3.0 (未来)\n\n- [ ] 微信小程序\n- [ ] 移动端 App (Flutter)\n- [ ] 实时推荐系统\n- [ ] 智能客服（AI）\n- [ ] 大数据分析\n\n---\n\n## 📊 项目统计\n\n![GitHub stars](https://img.shields.io/github/stars/me-cs/dianping-gozero?style=social)\n![GitHub forks](https://img.shields.io/github/forks/me-cs/dianping-gozero?style=social)\n![GitHub watchers](https://img.shields.io/github/watchers/me-cs/dianping-gozero?style=social)\n\n![GitHub commit activity](https://img.shields.io/github/commit-activity/m/me-cs/dianping-gozero)\n![GitHub last commit](https://img.shields.io/github/last-commit/me-cs/dianping-gozero)\n![GitHub contributors](https://img.shields.io/github/contributors/me-cs/dianping-gozero)\n\n### Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=me-cs/dianping-gozero\u0026type=Date)](https://star-history.com/#me-cs/dianping-gozero\u0026Date)\n\n---\n\n## 🏷️ 标签\n\n`go` `golang` `microservices` `go-zero` `grpc` `docker` `kubernetes` `redis` `mysql` `etcd` `jaeger` `prometheus` `grafana` `distributed-systems` `high-concurrency` `seckill` `dianping` `learning-project` `ai-generated` `claude-ai` `backend` `rest-api` `architecture` `devops` `cloud-native`\n\n---\n\n## 📄 许可证\n\nMIT License - 详见 [LICENSE](LICENSE) 文件\n\nCopyright (c) 2024 DianPing Clone Project\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**⭐️ 如果这个项目对你有帮助，请给个 Star！⭐️**\n\n**🎉 欢迎 PR，一起让这个项目变得更好！🎉**\n\n**☕ 欢迎赞助，支持开源！☕**\n\nMade with ❤️ by Claude AI \u0026 Developers\n\n[回到顶部](#-dianping-gozero---go-微服务实战项目)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fme-cs%2Fdianping-gozero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fme-cs%2Fdianping-gozero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fme-cs%2Fdianping-gozero/lists"}