# shop **Repository Path**: X666TV/team ## Basic Information - **Project Name**: shop - **Description**: 二手市场 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-26 - **Last Updated**: 2025-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 接口文档 ## 说明 - 所有的请求的**token参数加在请求头**里面(临时token除外) - 持续更新,**错误码定义和接口路径**由后端补充 - 商品id由后端生成,转译成string返回给前端 - 价格用浮点数 __用户注册流程__: 1. 输入手机号与密码,传送到后端 2. 发送验证码,验证码送到后端 3. 后端进行比较验证以后返回结果,创建新用户 - 初始用户模型:电话号、密码 - 默认:头像、昵称 4. (可跳过)进行实人验证:学号、姓名、qq(可选)、微信(可选) 5. 用户详细信息补充与更改(用户自行完成):昵称、头像 __商品发布__: 1. 用户提交:商品价格、描述(文字和图片两部分)、分类、联系方式 2. 后端接收信息,将图片上传到图片服务器生成url存储,将转译完成的商品信息存储,确认商品地址 __商品概览__: 标题、略缩图**(压缩)**、价格 __商品详情__: 返回商品所有信息、用户概览信息(昵称、头像) __用户详细信息__: 1. 别人看自己: 发布的所有商品(概览:包括商品售出状态)、头像、昵称 2. 自己看自己: 所有信息 __修改用户信息__: 标准用户模型:头像、昵称、qq、微信 __修改、忘记密码__: 1. 用户提交申请,服务器重复一遍注册流程(电话号码已经定好) 2. 重设密码 ## 用户 * 用户方面的接口除登录注册以外全部附带token请求 ### 用户的存储 _注:层级关系仅供前端参考,后端可以无视_ ```yaml user: # 昵称 name: 张三 # 密码存后端,前端不存 password: abc123 # 用电话号码做为用户唯一标识符 phone:12345678901 # id,学号 id: 111111111 # 头像url avatar: https://www.baidu.com # 不那么重要的信息放在这里面 detail: # 真实姓名 fullname: 张三 # 学号,可为空 student_id: s6666666 # 简介 introduce: 法外狂徒 # 个人资料背景图,正在考虑删去这一项 profile_picture: https://pic3.zhimg.com # 微信号? wechat: zhangsan # qq号 qq: x229292929 # 发布的商品 published: [] # 收藏的商品 liked: [] ``` ### 用户注册 用户注册流程: 1. 输入手机号与密码,传送到后端,后端发短信 2. 用户收到短信输入验证码,验证码送到后端 3. 后端进行比较验证以后返回结果,成功则创建新用户,返回结果 - 初始用户模型:电话号、密码 - 默认:头像、昵称 4. (可跳过)进行实人验证:学号、姓名、qq(可选)、微信(可选) 5. 用户详细信息补充与更改(用户自行完成):昵称、头像 #### 第一次请求 路径:暂缺 方法:Post/Json | 参数 | 类型 | 备注 | | ----- | ---- | ------- | | telephone |String| 接收验证码的手机号码 | 返回:Json 这里可考虑加一个标志,便于后端判断请求者 ```json { "code":0, "msg":"received", "token":"2dhjd829dhnwe" } ``` #### 第二次请求 路径:暂缺 方法:Post/Json 后端验证成功则创建用户,返回新用户token,否则在规定时间内前端可多次尝试,超时后验证码失效,需要重新进行第一步请求 | 参数 | 类型 | 备注 | | -------- | ------ | -------------- | | chptcha | String | 验证码 | | token | String | 临时token | | password | String | 用户设置的密码 | 返回:Json ```json { "code":0, "msg":"succeed", "token":"shuii32893929" } ``` ### 实名认证 路径:暂缺 方法:Post/Json | 参数 | 类型 | 备注 | | ---------- | ------- | -------- | | student_id | String | 学号 | | name | String | 真实姓名 | | qq | String? | | | wechat | String? | | 返回:json ```json { "code":0, "msg":"succeed" } ``` ### 修改用户资料 路径:暂缺 方法:Post/json 用户id,密码,真实姓名,学号,收藏和发布的商品不能通过该接口更改 ```json { "username":"李四", "avatar": "https://photos-1313896513.cos.ap-nanjing.myqcloud.com/img/head.png", "detail":{ "liked":[], "intro":"", "dormitory":"6", "qq":"1234554321", "wechat":"1234554321" } } ``` 返回 ```json { "code":0, "msg":"changed" } ``` ### 查看本用户资料 路径:暂缺 方法:Get 返回除用户密码以外的所有用户信息,有关商品的两个列表(published,liked)里不再是商品id,而是把商品的基本信息也包含进来,省的再次请求获取了,一个完整的用户信息示例如下: ```json ``` ### 用户登录 路径:暂缺 方法:Post/json 此处请求内容后期可考虑加密 | 参数 | 类型 | 备注 | | -------- | ------ | ---------- | | id | String | 就是手机号 | | password | String | | 返回:json ```json { "code":0, "msg":"received", "data":{ "token":"2dhjd829dhnwe", "user":{ "id":1, "phone":"12345678901", "username": "用户BpLnfgD", "avatar": "https://photos-1313896513.cos.ap-nanjing.myqcloud.com/img/head.png", "detail":{ "fullname":"某某某", "published":[], "liked":[], "intro":"", "dormitory":"6", "qq":"1234554321", "wechat":"1234554321" } } } } ``` ### **用户信息获取** 路径路径:暂缺 方法:Get/json 此处请求内容后期可考虑加密 ```json { "name":"yyezhi", "phone":110, "avatar":"", "detail":"" } ``` ### 登出 token自动失效,token失效则登出 ### 修改密码 路径:暂缺 方法:Post/json 此处请求内容后期可考虑加密 | 参数 | 类型 | 备注 | | --------- | ------ | ---------- | | telephone | String | 就是手机号 | | old | String | 原密码 | | new | String | 新密码 | 返回:Json,成功则销毁原token,生成新token ```json { "code":0, "msg":"changed", "token":"sjakaasaw23ee43e2" } ``` ### 查看其他用户资料 路径:暂缺 请求:Get/QueryParams 参数:所查用户id 返回:json 有关商品的一个列表(published)里不再是商品id,而是把商品的基本信息也包含进来,省的再次请求获取了 ```json { "username":"守法好公民", "introduce":"张三他弟", "avatar":"https://www.bing.com", "profile_picture": "https://pic3.zhimg.com", "name":"李四", "student_id":"123456", "published":[] } ``` ### 忘记密码 过程与注册新账号过程几乎一样 第一次请求路径:暂缺; 第二次请求路径:暂缺; ## 商品 ### 商品的储存 以以下形式在前后端之间传递 ```json { "product_created_time": "2023-04-16T21:17:13+08:00", "product_id": 3, "product_name": "wsdsajkd", "product_price": 12.3, "seller_info": { "username":"abc", "avatar":"url", "seller_id":1, //还是返回seller_id吧,以备不时之需 }, "product_intro": "sffreteweq", "product_zone": "其他", "product_cover_imgs": [ { "product_cover_img": "https://ghtt-shop-image-1317511778.cos.ap-beijing.myqcloud.com/测试用图片名1.jpg", } ], "sell_status": 0, "connection": { "wechat": "", "qq": "", "tel": "" } } ``` ### 商品概览页信息的获取 请求:Get 参数:List 需要token:否 ```json { "product_id": "1233", "product_price": 122.32, "product_name": "商品名", "seller_id": "发布者的用户名", "product_zone":"数码产品", "product_coverimg":"http://www.hao123.com" //该项为数组的第一张图片 } ``` **备注:只返回SellState为0的商品** product_coverimg默认返回第一项 ### 商品信息的上传 请求:Post 参数:json 需要token:是 备注:商品id由后端生成,上传成功后返回商品id ```json { "product_name": "商品名", "product_price": 122.32, "seller_id": "发布者的用户名", "product_created_time":"(时间戳格式,是个string)", "product_intro":"商品的详细信息", "product_zone":"数码产品", "sell_status":"0", "connection":{"wechat":0,"qq":0,"tel":1}, //图片另外上传 } ``` ### 商品图片的上传 请求:Post 参数:Formdata 需要token:是 ```json { "product_id": 1, "images":[await MultipartFile.fromFile(file1.path),await MultipartFile.fromFile(file2.path)] } ``` ### 商品信息的修改 与商品信息的上传 请求:Post 参数:json 需要token:是 ```json { "product_id": 1, "product_name": "商品名", "product_price": 122.32, "seller_telephone": "发布者的手机号", "produt_created_time":"(时间戳格式,是个string)", "product_intro":"商品的详细信息", "product_zone":"数码产品", "sell_status":"0", "connection":{"wechat":0,"qq":0,"tel":1}, "product_coverimg":["http://www.hao123.com","http://www.2345.com"] } ``` ### 商品信息的查询 请求:Post 参数:json 需要token:是 ```json { "product_id": 123 } ``` 响应:json ```json { "code":200, "msg":"查询成功", "data":{ "product_id": "1233", "product_name": "商品名", "product_price": 122.32, "seller_id": "发布者的用户名", "product_created_time":"(时间戳格式,是个string)", "product_intro":"商品的详细信息", "product_zone":"数码产品", "sell_status":"0", "connection":{"wechat":0,"qq":0,"tel":1}, "product_coverimg":["http://www.hao123.com","http://www.2345.com"] } } ``` ## 其他 ### 图片上传 __图片上传过程较为复杂,对前后端都要做很多工作,有待进一步研究__ 后端服务器的出方向流量带宽很小,前端下载图片流量肯定不能走后端服务器,而应该直接走对象储存服务器(cos)。 图片的上传本来想经手一下后端服务器,但仔细想想也不行,因为后端拿到图片后还要上传至cos,这也是出流量。 所以只能前端直接与cos交互,那么必须涉及cos的身份验证问题,可能的方案有: - 使用永久密钥访问 - 使用临时密钥访问 - 使用临时url访问(预签名url) - 匿名访问 如果cos开启公有读,就可以直接通过url下载图片无需验证,所以下载图片没什么问题。主要问题是上传图片,必须要验证身份(匿名访问只能读)。 用永久密钥的方式不可行,因为每个账号只能生成两个永久密钥,但临时密钥数数量无限制,这个方案可行,但过于复杂(需要有自己的一套用户系统,适用于企业),临时密钥的生成也很麻烦。所以只能用临时url。 那么上传图片的过程如下: 1. 前端发送上传请求,附带身份信息 2. 后端验证身份无误,生成临时url返回 3. 前端拿到临时url上传图片,拿到图片url 4. 前端把图片url和其他图片信息发给后端 ### 仍待引入的外部技术 1.图床服务器/对象存储/文件存储/带宽更好的服务器 2.短信验证码服务 3.AI审核图片 4.实名认证/ip验证/身份认证 > 参考资料 > https://cloud.tencent.com/document/product/436/68279 > https://cloud.tencent.com/document/product/436/31315 > [对象存储 操作列表-API 文档-文档中心-腾讯云 (tencent.com)](https://cloud.tencent.com/document/product/436/10111) ### 附: #### 状态码表 | 状态码 | 备注 | | ------ | -------------------------------- | | 0 | 成功 | | 1 | 数据库或服务器处于泵机状态 | | 2 | Token已过期 | | 3 | 没有访问权限 | | 4 | 请求的资源不存在(用于Post请求) | | 5 | 提交的资源已存在(用户已存在etc.) | | 6 | 未能通过验证 | | 7 | 其他 |