- Notifications
You must be signed in to change notification settings - Fork142
CocaineCong/gin-mall
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
基于 gin+gorm+mysql读写分离 的一个电子商场
本项目改自于作者Congz的电子商城去除了一些如第三方登录,极验,第三方支付等功能,新增了MySQL读写分离、ELK日志体系、AES对称加密进行数据脱敏等。在此也非常感谢作者开源!🫡
此项目比较全面,比较适合小白入门web开发
V2版本,结构较比V1版本有很大的改动全部转化成 controller、dao、service 模式,更加符合企业开发
考虑到部分同学的基础,所以V2版本的技术栈只有mysql,redis,docker。
而 ELK,MQ,Jaeger,Prometheus 这部分都集成在V3版本,并且V3版本的项目结构进行部分重构。
由于整合上传oss和上传到本地,需要在 conf 中进行配置UploadModel
字段,上传到 oss 则配置 oss,上传本地则配置 local
其中我个人用到的测试sql数据都放在了config/sql/
文件当中
项目前端地址:react-mall
前端采用react+antd+axios+redux
,还在coding,功能还不完善,也希望有意向的同学可以一起完善
本项目采用GOMODULE管理依赖,同时接入skywalking-go
普通运行
cd ./cmdgorunmain.go
以二进制文件运行
gomodtidycd ./cmdgobuild-o ../main./main
注意:手动运行方式不支持Skywalking,如果需要支持Skywalking,可以参考Makefile,按照文件内命令编译
项目根目录内置了 Dockerfile、Makefile、docker-compose.yml 等文件目的是快速构建项目环境,简易化项目运行难度
下面介绍 Makefile 中内置的几条指令,可根据需要在控制台当前项目根目录下进行相应操作的执行
make tools# 构建Skywalking-Agent二进制文件make# 构建二进制文件并自动运行make build# 构建二进制文件make env-up# 拉起项目环境make env-down# 停止并删除环境make docker-up# 以容器方式拉起项目make docker-down# 停止并删除容器
对于第一次运行本项目,可以按如下顺序执行
- 在Makefile中的前几行修改
ARCH
和OS
以对应自己的电脑系统,在注释中提供了可选项 - 运行如下代码
make env-up tools build# 拉起项目环境、编译Agent、构建项目二进制文件./main# 运行项目
欢迎大家把自己的想法 pr 到这个项目中。
- 大家可以根据自己的需要进行分支的合并,不要直接合main分支
⚠️ ,尽量合去最新的版本。现在最新版本是v3版本。 - CR 通过之后,就会到合并到 main 分支。
- 用户注册登录(jwt-go)
- 用户基本信息修改,解绑定邮箱,修改密码
- 商品的发布,浏览等
- 购物车的加入,删除,浏览等
- 订单的创建,删除,支付等
- 地址的增加,删除,修改等
- 各个商品的浏览次数,以及部分种类商品的排行
- 设置了支付密码,对用户的金额进行了对称加密
- 支持事务,支付过程发送错误进行回退处理
- 可以将图片上传到对象存储,也可以切换分支上传到本地static目录下
- 添加ELK体系,方便日志查看和管理
- 考虑加入kafka或是rabbitmq,新增一个秒杀专场,适配redis或是etcd的分布式锁
- 优化 service 返回的参数,加上返回值 error,因为go的函数返回都是要有error的,这才是go的代码风格(我也不懂go为啥要这样设置,很多优秀的开源项目都是这样写函数的返回值)
- 抽离 service 的结构体到 types,引入 sync.Once 模块,重构 service 层
- 优化鉴权模块,加上 refreshToken,将 token 改成 accessToken
- 抽离登陆,引入SSO
- 优化日志输出,统一用日志对象
- 考虑 cmd 和 loading 这两个文件夹是否合并
- 加入 Jaeger 进行链路追踪
- 加入 Skywalking 监控中间件
- 优化ToC应用的 SQL JOIN 语句
- MySQL到ES的数据同步,将搜索改成查找ES(注意一下,这里最好引入kafka,mysql推到kafka,kafka再推到es,确保一下ack 或者 flink CDC那套)
- makefile 适配 windows
- docker-compose的redis,mysql集群
- 支付密码支持6位
名称 | 版本 |
---|---|
golang | 1.18 |
gin | v1.9.0 |
gorm | v1.9.6 |
mysql | v1.5.0 |
redis | v9.0.4 |
jwt-go | v3.2.0 |
crypto | v0.8.0 |
logrus | v1.9.0 |
qiniu-go-sdk | v7.14.0 |
dbresolver | v1.4.1 |
gin-mall├── api # 用于定义接口函数,也就是controller的作用├── cmd # 程序入口├── conf # 配置文件├── doc # 文档├── middleware # 中间件├── model # 数据库模型├── pkg│ ├── e # 错误码│ └── util # 工具函数├── repository│ ├── cache # Redis缓存│ ├── db # 持久层的mysql│ │ ├── dao # dao层,对db进行操作│ │ └── model # 定义mysql的模型│ ├── es # ElasticSearch,形成elk体系│ └── mq # 放置各种mq,kafka,rabbitmq等等├── routes # 路由逻辑处理├── serializer # 将数据序列化为 json 的函数,便于返回给前端├── service # 接口函数的实现└── static # 存放静态文件
config/locales/config.yaml
文件配置,配置文件可以将config.yaml.example
重命名为config.yaml
。
如果还没接触相关应用,可以在cmd/main.go
文件中进行注释
#debug开发模式,release生产模式system:domain:mallversion:1.0env:"dev"HttpPort:":5001"Host:"localhost"UploadModel:"local"mysql:default:dialect:"mysql"dbHost:"127.0.0.1"dbPort:"3306"dbName:"mall_db"userName:"mall"password:"123456"charset:"utf8mb4"kafka:default:debug:trueaddress:localhost:9092requiredAck:-1# 发送完数据后是否需要拿多少个副本确认 -1 需要全部readTimeout:30# 默认30swriteTimeout:30# 默认30smaxOpenRequests:5# 在发送阻塞之前,允许有多少个未完成的请求,默认为5partition:2# 分区生成方案 0根据topic进行hash、1随机、2轮询redis:redisDbName:4redisHost:127.0.0.1redisPort:6379redisUsername:defaultredisPassword:123456redisNetwork:"tcp"cache:cacheType:rediscacheEmpires:600cacheWarmUp:cacheServer:email:address:http://localhost:8080/#/vaild/email/smtpHost:smtpEmail:smtpPass:encryptSecret:jwtSecret:"FanOne666Secret"emailSecret:"EmailSecret"phoneSecret:"PhoneSecret"oss:AccessKeyId:AccessKeySecret:BucketName:QiNiuServer:photoPath:photoHost:http://127.0.0.1ProductPath:/static/imgs/product/AvatarPath:/static/imgs/avatar/es:EsHost:127.0.0.1EsPort:9200EsIndex:mylograbbitMq:rabbitMQ:amqprabbitMQUser:guestrabbitMQPassWord:guestrabbitMQHost:localhostrabbitMQPort:5672
mysql
是存储主要的数据。redis
用来存储商品的浏览次数。- 由于使用的是AES对称加密算法,这个算法并不保存在数据库或是文件中,是第一次登录的时候需要给的值,因为第一次登录系统会送1w作为初始金额进行购物,所以对其的加密,后续支付必须要再次输入,否则无法进行购物。
- 本项目运用了gorm的读写分离,所以要保证mysql的数据一致性。
- 引入了ELK体系,可以通过docker-compose全部up起来,也可以本地跑(确保ES和Kibana都开启)
- 用户创建默认金额为1w ,默认头像为
static/imgs/avatar/avatar.jpg
打开postman,点击导入
效果
接下来点击Collection标题(gin-mall)在Variables
中新增一个名为url
的变量,Initial value和Current value均填入localhost:5001/api/v1/
,然后保存,就可以开始测试了
这里是用postman查询es,Kibana也可以查看es!
About
基于 gin+gorm+redis+mysql 读写分离的电子商城,包括 JWT 鉴权,CORS跨域,AES 对称加密,引入ELK体系方便日志查看,jaeger进行trace查看,skywalking进行检测,使用docker容器化部署