{"id":26066169,"url":"https://github.com/VLSMB/ecommerce","last_synced_at":"2026-01-17T16:34:16.194Z","repository":{"id":280851154,"uuid":"929544741","full_name":"VLSMB/Easy-Douyin-Ecommerce","owner":"VLSMB","description":"简易版抖音电商","archived":false,"fork":false,"pushed_at":"2025-03-06T01:06:04.000Z","size":3269,"stargazers_count":13,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-25T11:49:13.724Z","etag":null,"topics":["backend","java","mybatis","redis","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VLSMB.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2025-02-08T19:44:33.000Z","updated_at":"2025-03-24T12:00:14.000Z","dependencies_parsed_at":"2025-03-05T17:38:12.211Z","dependency_job_id":"211258e5-38c8-4565-ac2d-d62f4a63134c","html_url":"https://github.com/VLSMB/Easy-Douyin-Ecommerce","commit_stats":null,"previous_names":["vlsmb/easy-douyin-ecommerce"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLSMB%2FEasy-Douyin-Ecommerce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLSMB%2FEasy-Douyin-Ecommerce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLSMB%2FEasy-Douyin-Ecommerce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VLSMB%2FEasy-Douyin-Ecommerce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VLSMB","download_url":"https://codeload.github.com/VLSMB/Easy-Douyin-Ecommerce/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248431811,"owners_count":21102273,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["backend","java","mybatis","redis","springboot"],"created_at":"2025-03-08T20:08:17.041Z","updated_at":"2026-01-17T16:34:16.154Z","avatar_url":"https://github.com/VLSMB.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 字节跳动青训营抖音商城项目\n\n“简易版”抖音商城\n\n本项目涉及到的技术框架为：SpringBoot、SpringAI、SpringCloudGateway、SpringCloud、SpringCloudAlibaba、MySQL、MyBatisPlus、Redis、Nacos、OpenFeign、Seata、RabbitMQ、Elasticsearch、Sentinel。\n\n可以参考[docker-compose](project-description/docker-compose.yaml)文件的配置来快速搭建第三方技术框架\n\n本项目的接口文档定义可以参考[接口文档.md](project-description/interface-documentation.md)\n\n## 项目结构\n\n```\neasy-douyin-ecommerce-project\n├── ecommerce-ai-service        # AI微服务\n├── ecommerce-auth-util         # 权限认证工具\n├── ecommerce-cart-service      # 购物车微服务\n├── ecommerce-checkout-service  # 结算微服务\n├── ecommerce-common            # 微服务共用模块（如异常拦截、公共配置等）\n├── ecommerce-feign-api         # 微服务远程调用接口定义\n├── ecommerce-gateway           # 网关\n├── ecommerce-order-service     # 订单微服务\n├── ecommerce-payment-service   # 支付微服务\n├── ecommerce-product-service   # 商品微服务\n├── ecommerce-user-service      # 用户微服务\n├── pom.xml                     # 整体项目Maven配置\n├── project-description         # 项目说明文件夹\n└── README.md\n```\n\n本项目的RabbitMQ支付消息队列模型为：\n\n![img.png](project-description/images/img.png)\n\n定时取消订单和定时取消支付都是使用的RabbitMQ延迟队列机制，即为：`交换机-\u003e队列-\u003e死信交换机-\u003e死信队列`的结构\n\n本项目的elasticsearch索引结构的定义为：\n\n`PUT /products`\n```json\n{\n  \"mappings\": {\n    \"properties\": {\n      \"id\": { \"type\": \"keyword\" },\n      \"name\": { \"type\": \"text\", \"analyzer\": \"ik_max_word\" },\n      \"description\": { \"type\": \"text\", \"analyzer\": \"ik_max_word\" },\n      \"price\": { \"type\": \"float\" },\n      \"sold\": { \"type\": \"integer\" },\n      \"stock\": { \"type\": \"integer\" },\n      \"merchantName\": { \"type\": \"keyword\" },\n      \"categories\": { \"type\": \"keyword\" },\n      \"status\": { \"type\": \"integer\" },\n      \"createTime\": { \n        \"type\": \"date\",\n        \"format\": \"yyyy-MM-dd'T'HH:mm:ss\"\n      },\n      \"updateTime\": { \n        \"type\": \"date\",\n        \"format\": \"yyyy-MM-dd'T'HH:mm:ss\" \n      }\n    }\n  }\n}\n```\n\n## 项目启动方式\n\n可以通过修改父项目的`pom.xml`文件的配置来定义所有第三方框架的相关信息，配置的格式示例：\n\n```xml\n\u003cproperties\u003e\n    \u003cenv\u003edev1\u003c/env\u003e\n    \u003cdatabase.host\u003evlsmb-kotori.local\u003c/database.host\u003e\n    \u003cdatabase.port\u003e3306\u003c/database.port\u003e\n    \u003cdatabase.user\u003eroot\u003c/database.user\u003e\n    \u003cdatabase.pwd\u003eroot\u003c/database.pwd\u003e\n    \u003csentinel.dashboard\u003evlsmb-kotori.local:8090\u003c/sentinel.dashboard\u003e\n    \u003cnacos.dashboard\u003evlsmb-kotori.local:8848\u003c/nacos.dashboard\u003e\n    \u003credis.cluster-addr\u003evlsmb-kotori.local:7001,vlsmb-kotori.local:7002,vlsmb-kotori.local:7003,vlsmb-kotori.local:7004,vlsmb-kotori.local:7005,vlsmb-kotori.local:7006\u003c/redis.cluster-addr\u003e\n    \u003crabbitmq.host\u003evlsmb-kotori.local\u003c/rabbitmq.host\u003e\n    \u003crabbitmq.port\u003e5672\u003c/rabbitmq.port\u003e\n    \u003crabbitmq.user\u003eguest\u003c/rabbitmq.user\u003e\n    \u003crabbitmq.pwd\u003eguest\u003c/rabbitmq.pwd\u003e\n    \u003celasticsearch.host\u003evlsmb-kotori.local\u003c/elasticsearch.host\u003e\n    \u003celasticsearch.port\u003e9200\u003c/elasticsearch.port\u003e\n\u003c/properties\u003e\n```\n\n所有的微服务都会继承父项目中的框架配置信息，不需要额外改动微服务的配置文件。\n\n项目所使用的第三方框架可以使用[docker-compose](project-description/docker-compose.yaml)搭建。`docker-compose`文件里有一个环境变量`HOST_IP`，在运行`docker compose`前需要对这个环境变量进行赋值，或者直接换成当前主机IP：`export $HOST_IP=your_ip`。\n\nsentinel构建的是它的发行版jar包，对应的DockerFile为：\n\n```dockerfile\nFROM openjdk:11-jre-slim\n\nWORKDIR /app\nCOPY sentinel-dashboard-1.8.6.jar sentinel-dashboard.jar\nEXPOSE 8090\nENTRYPOINT [\"java\", \"-Dserver.port=8090\", \"-Dcsp.sentinel.dashboard.server=localhost:8090\", \"-Dproject.name=sentinel-dashboard\", \"-jar\", \"sentinel-dashboard.jar\"]\n```\n\n准备好以上信息就可以进行打包了：\n\n```bash\ndocker compose up -d\n```\n\n可能存在redis集群未正常搭建的情况，这时候先运行\n\n```bash\ndocker exec -it redis-node-1 redis-cli -p 6379 cluster nodes\n```\n\n查看集群信息，如果只有一个节点，或者六个节点里有fail、not connected情况，需要手动重新创建集群\n\n```bash\ndocker exec -it redis-node-1 redis-cli --cluster create \\\n  ${HOST_IP}:7001 \\\n  ${HOST_IP}:7002 \\\n  ${HOST_IP}:7003 \\\n  ${HOST_IP}:7004 \\\n  ${HOST_IP}:7005 \\\n  ${HOST_IP}:7006 \\\n  --cluster-replicas 1 --cluster-yes\n```\n\n启动之后需要将本项目使用的[nacos配置信息](project-description/nacos/configs)添加到nacos的`DEFAULT_GROUP`中，以及将[数据库表](project-description/sqls)导入到容器内的mysql中。\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- 创建订单\n- 修改订单信息\n- 订单定时取消\n\n结算\n- 订单结算\n\n支付\n- 取消支付\n- 定时取消支付\n- 支付\n\nAI大模型\n- 订单查询\n- 模拟自动下单\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FVLSMB%2Fecommerce","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FVLSMB%2Fecommerce","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FVLSMB%2Fecommerce/lists"}