项目地址
https://github.com/LoveLosita/OnlineMall
到上传此文为止已经有21个commit,代码行数达到3200行。
下面是readme文件,水字数(后续不会在这里更新,最新的请移步github)。
1.项目功能(目前版本1.4.0Beta
)
本项目类似⼀个商品网站,可以实现以下功能:
- [X] 用户的注册与登录
- [X] 加密存储用户密码
- [X] 添加商品分类
- [X] 修改用户的信息
- [X] 查询商品
- [X] 查看商品详情
- [X] 查看分类下的商品
- [X] 给商品进行评论(评论的增删查)
- [X] 商品加入购物车
- [X] 获取购物车所有商品
- [X] 搜索购物车中的商品
- [X] 初级下单(向前端返回⼀个订单order)
- [ ] 进阶下单(真正影响商品库存并且处理并发)
- [ ] 终极下单(在进阶下单的基础上模拟微信/支付宝的支付回调等)
- [X] 嵌套评论
- [X] 匿名评论
- [X] 浏览的商品的历史记录
- [X] 商家和管理员的出现(可以自由增删商品)
- [ ] 与AI助手的聊天(使用ChatAI接口)
- [ ] 加入验证码登录的操作(成本有限,可能会研究如何实现2FA)
- [ ] 使用缓存(Redis缓存)
- [ ] 设计⼀套热度算法,使得能让该用户常看的商品分类下的商品出现在首页
- [ ] 用户可以与客服进行聊天(可能会用Python实现商家、管理员和用户的客户端,如果有时间的话)
- [ ] 部署到自己的服务器上,并且可以访问
- [ ] 考虑安全性(xxs,sql注入,csrf等。sql注入目前是已经可以防御了,因为sql语句中使用的是占位符)
- [ ] 你任何想加的功能(咕咕咕)
2.项目结构
2.1.文件结构图
OnlineMall
│
├── api // 存放所有的 API 接口定义
│ ├── auth.go // 用户认证相关接口
│ ├── cart.go // 购物车相关接口
│ ├── categories.go // 商品分类相关接口
│ ├── order.go // 订单管理相关接口
│ ├── product.go // 商品管理相关接口
│ ├── review.go // 商品评论相关接口
│ └── user.go // 用户管理相关接口
│
├── auth // 负责身份认证的功能
│ ├── check_permission.go // 检查用户权限
│ └── jwt_generator.go // 生成和解析 JWT
│
├── cmd // 存放应用启动和初始化的逻辑
│ └── start.go // 启动应用并初始化服务
│
├── dao // 数据库交互层
│ ├── db_connection.go // 负责连接数据库事宜
│ ├── cart.go // 购物车数据操作
│ ├── categories.go // 商品分类数据操作
│ ├── order.go // 订单数据操作
│ ├── product.go // 商品数据操作
│ ├── review.go // 商品评论数据操作
│ └── user.go // 用户数据操作
│
├── middleware // 存放中间件,如 token 校验
│ └── token_handler.go // 处理 token 校验逻辑
│
├── model // 存放数据模型
│ ├── auth.go // 用户认证模型
│ ├── cart.go // 购物车模型
│ ├── order.go // 订单模型
│ ├── products.go // 商品模型
│ ├── review.go // 商品评论模型
│ └── user.go // 用户模型
│
├── respond // 返回响应的处理
│ └── responses.go // 定义统一的响应格式
│
├── routers // 存放路由配置
│ └── router.go // 配置所有 API 路由
│
├── service // 业务逻辑层
│ ├── auth.go // 用户认证相关业务逻辑
│ ├── cart.go // 购物车相关业务逻辑
│ ├── categories.go // 商品分类相关业务逻辑
│ ├── order.go // 订单相关业务逻辑
│ ├── product.go // 商品相关业务逻辑
│ ├── review.go // 商品评论相关业务逻辑
│ └── user.go // 用户相关业务逻辑
│
├── utils // 工具函数
│ ├── if_in.go // 判断元素是否在序列中的工具函数集
│ └── pwd_encryption.go // 密码加密工具
│
├── go.mod // Go Modules 配置文件
├── main.go // 项目的入口文件,在此启动项目
└── readme.md // 项目的 README 文件,即本文件
2.2.目录详细说明:
- api:该文件夹包含了与 API 相关的接口定义,分别涉及到用户认证、购物车管理、商品分类、商品管理、订单处理和评论功能。每个文件对应一个功能模块的 API。
- auth:处理用户认证相关的逻辑,主要负责 JWT 的生成与验证,确保用户身份的合法性。
- cmd:包含应用的启动逻辑,
start.go
是应用启动和初始化的入口,负责加载配置并启动服务。 - dao:数据访问层,包含与数据库的交互操作,处理数据的增删改查。例如,
cart.go
文件负责与购物车相关的数据交互,order.go
文件负责订单相关的数据操作等。 - middleware:中间件层,通常用于处理请求前后需要的操作,如验证 token。
- model:数据模型定义文件,通常与数据库中的表结构相关联。每个文件对应一个模块的数据模型,如
cart.go
定义了购物车的结构和属性,products.go
定义了商品的结构等。 - respond:统一的响应格式处理模块,确保 API 返回的数据结构一致,便于前端处理。
- routers:定义各个 API 路由及其对应的处理函数,管理请求路径和处理逻辑。
- service:业务逻辑层,封装各个功能模块的具体业务操作,提供更高层次的功能接口。例如,
cart.go
文件在服务层进行购物车相关的操作。 - utils:存放工具类函数,如判断条件和密码加密等。
- go.mod:Go Modules 配置文件,指定项目依赖的外部包和版本。
- main.go:项目的入口文件,启动应用并进行初始化配置。
- readme.md:项目的
README
文件,提供项目的基本信息、使用说明和技术栈等。
3.状态码的定义
状态码 | HTTP状态码 | 描述 | 原因 | 解决方案 |
---|---|---|---|---|
20000 | 200 | 成功 | - | - |
40001 | 401 | 用户名错误 | 登录时,传入的用户名参数错误,在数据库中找不到匹配的用户 | 传入正确的用户名 |
40002 | 401 | 密码错误 | 登录时,传入的密码参数错误,无法和数据库中现存的匹配 | 传入正确的密码 |
40003 | 400 | 用户名无效 | 注册时,传入的用户名在数据库中已经存在了 | 传入唯一的用户名 |
40004 | 400 | 缺少参数 | 传入的参数数量小于所要求的数量 | 传入足够参数 |
40005 | 400 | 参数类型错误 | 传入的参数类型错误,导致无法和结构体绑定 | 传入正确参数 |
40006 | 400 | 参数过长 | 传入的某个参数长度过于长 | 缩短过长参数的长度 |
40007 | 400 | 用户名或密码错误 | 传入的用户名或者密码错误 | 传入正确的用户名或密码 |
40008 | 400 | 性别错误 | 传入的性别不属于("male","female","other")中的一种 | 传入其中的一种 |
40009 | 401 | 缺少token | Header中未填写JWT key | 在Header中填写 |
40010 | 401 | jwt token签名方法无效 | JWT key格式错误 | 传入正确的JWT token |
40011 | 401 | 无效token | JWT token无效 | 传入正确的JWT token |
40012 | 401 | 无效声明 | JWT token的声明无效 | 传入正确的JWT token |
40013 | 400 | 传入的用户id无效 | 在执行通过id查找用户信息时没找到用户 | 传入正确的用户id |
40014 | 401 | 权限不够 | 用户不是管理员或者店主 | 让管理员或者店主来执行此操作 |
40015 | 404 | 分类不存在 | 在添加商品的时候,没有找到分类id所对应的分类 | 传入正确的分类id |
40016 | 400 | 分类名称已经存在 | 在添加分类时,填写了一个重复的分类名称 | 传入不和现有分类重复的分类名称 |
40017 | 404 | 商品不存在 | 尝试通过ID找商品,但是不存在该商品 | 传入存在商品的ID |
40018 | 404 | 找不到商品 | 通过关键字搜索无法找到商品 | 传入存在商品的关键字 |
40019 | 404 | 商品列表为空 | 在显示全部商品/显示某个分类的商品时,商品列表为空 | 前者,请先添加商品再进行其他操作;后者,请传入正确的分类id |
40020 | 401 | Refresh Token无效 | 在尝试通过刷新令牌接口刷新Access Token时,传入了无效的Refresh Token | 传入有效的Refresh Token。如果Refresh Token也过期了,就重新登录 |
40021 | 400 | 商品已经在购物车中 | 在尝试将一定数量的某商品加入购物车时,购物车里面已经有相同数量的同一个商品 | 如果是想更新数量,请传入数量不同的该商品;否则就换个商品 |
40022 | 400 | 数量太大 | 在尝试下单或者将商品加入购物车时,传入的数量超过了999 | 请传入小于999的数量 |
50001 | 500 | 订单不存在 | 在检查该用户是否购买了此商品时,订单表单和商品表单不匹配,属于内部错误 | - |
40024 | 400 | 用户没有购买过此商品 | 在用户尝试评论该商品时,发现用户没购买过此商品 | 请购买此商品后再评论 |
40025 | 400 | 用户已经评论过了 | 在用户尝试评论该商品时,系统发现用户已经评论过了 | 请勿重复评论 |
40026 | 400 | 用户打分超出范围 | 用户的打分超出了1-5分的范围 | 请将对商品的分数打在此范围内 |
40027 | 400 | 用户评论字数过长 | 用户在评论商品时,评论字数过长 | 请用户缩短评论字数 |
40028 | 400 | 父评论不存在 | 在用户尝试回复评论时,传入的父评论id不存在 | 请传入存在的父评论id |
40029 | 404 | 购物车为空 | 在用户请求展示购物车全部商品时,购物车中无商品 | 请先添加商品再展示 |
40030 | 404 | 商品评论为空 | 在用户尝试查看某商品下评论时,评论为空 | 请先评论再获取评论 |
40031 | 404 | 找不到评论 | 在商家通过关键词搜索某商品下的评论时,没有找到符合要求的评论 | 请更换关键词 |
40032 | 404 | 评论不存在 | 在传入评论id需要进行查询/删除操作时,没有找到该id的评论 | 请传入正确的评论id |
4.通用错误的返回示例
项目返回的一些错误是通用性的,所以我仅仅在项目初期的apifox
接口文档编写中保存了其示例,在后期便没有再保存示例。在此,我将这些错误的示例列出,原因请自行查阅上方表格:
4.1.未登录
{
"status": "40009",
"info": "missing token"
}
4.2.jwt token签名方法无效
{
"status": "40010",
"info": "invalid signing method"
}
4.3.无效Token/Token过期
{
"status": "40011",
"info": "invalid token"
}
4.4.Token的声明(claim)无效
{
"status": "40012",
"info": "invalid claims"
}
4.5.权限不足
{
"status": "40014",
"info": "unauthorized"
}
4.6.缺少参数
{
"status": "40004",
"info": "missing param"
}
4.7.参数类型错误
{
"status": "40005",
"info": "wrong param type"
}
4.8.参数过长
{
"status": "40006",
"info": "param too long"
}
5.启动项目
确保本地有最新版本的go环境,并且项目已经被完整的下载到了本地。
首先,在OnlineMall
项目主文件夹下的终端里执行:go mod tidy
来下载和整理依赖。
然后再执行go run main.go
来启动项目。