# axf_shop **Repository Path**: uid_random/axf_shop ## Basic Information - **Project Name**: axf_shop - **Description**: 这是一个仿爱鲜蜂商城的前后端分离项目,前端vue,后端python的Django框架。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-31 - **Last Updated**: 2022-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 本文件包含项目说明和接口文档。 # 说明 ## 前言 这是一个仿爱鲜蜂商城的前后端分离项目,只实现了部分功能,具体有哪些功能看后面的接口文档。未实现的功能的原因看"一些前端代码的说明"。这里额外说一下付款功能,可能需要以**商家**的身份去支付宝申请,即可能需要营业执照,所以后端没实现,刚好前端也没实现。如果想实现,可以去支付宝官网查看相关文档,这里也有一些其他人的参考代码。 - https://gitee.com/linyiting99/project_axf/blob/master/mainproject/app_01/views.py - https://gitee.com/xdrr/Full_Axf/blob/master/OrderApp/views.py - https://gitee.com/XZj287516/axf/blob/master/user/views.py - https://github.com/discountthree/Python1810AXF/blob/master/app/views.py 前端代码是别人用vue写好编译好的,我只写了后端代码(python3.6.8,Django3.2.2),且是根据前端定好的接口(浏览器Console中能看到接口地址,详细原因看"前言"的最后部分)写的。所以接口的命名和一些前端传给后端的参数的命名,是前端定好的,后端在定义时只能按照前端的用,不建议修改,想修改的话看"启动前端代码"的最后部分。写完后端代码我才写的接口文档。 每个应用中urls.py中app_name和name(路由的别名),在代码实际运行时都没用到,可以删掉。 home/model.py的内容是用sql文件(在sql.zip中)导入数据后,用`python manage.py inspectdb > 应用名/models.py`生成的,里面是这个项目所有的模型。然后需要对模型代码做一些修改(前两点我的代码已修改)。你可以直接用我的models.py,无需做下面的修改;也可以导入数据后再自己生成,自己生成时才需要做下面的修改。 - 将AxfOrder模型的o_time字段的数据类型加参数`auto_now=True`,意思是创建或修改该模型对象时,自动将当前时间设为o_time字段的值(即自动更新该字段的值),加完参数不用再迁移数据库。order/views.py中ListCreateOrderView类中create()方法中创建订单时用到,不加的话创建AxfOrder()类对象时,要手动给对象的o_time属性赋值;同理更新对象时也要手动赋值。 - 将AxfOrdergoods模型的o_order字段添加`related_name='goods'`,o_order字段用于通过订单中的商品去查询订单,反向查询(通过订单去查询商品)用related_name,即goods,order/order_serializers.py中OrderSerializer类中to_representation()方法中用到这个goods。 - AxfUser模型(axf_user表)中is_active字段没赋默认值1,所以我在创建用户时(user/user_serializers.py中UserRegisterSerializer类中create()方法中)赋了默认值1。你也可以在模型中赋默认值。 向购物车添加商品、从购物车中增加/减少商品数量时,没考虑当前商品的库存数量。 **这个项目的**前端的报错和后端返回的数据,在浏览器Console中都能看到。应该是前端手动打印了报错和数据,我没具体看前端代码。 用户登录成功时,**这个项目**中token会打印在浏览器Console中;登录后访问购物车页时,pycharm的Terminal中显示的访问的路由中也可以看到token。 ## 启动项目 ### MySQL导入数据 1. 解压 sql.zip 2. 用 axf.sql 建表 3. 用其他三个文件导入数据 4. 看前言,自行决定是自己生成模型代码再修改,还是直接用我的 ### 启动前端代码 前端代码的效果是针对手机的,所以建议浏览器访问时改为手机,达到最佳显示效果。 这是用cmd启动的方法: 1. 解压 前端代码.zip 得到 axf_vue 文件夹 2. 用cmd的cd命令进入axf_vue文件夹 3. 切换到虚拟环境(若有),执行`python manage.py runserver 8880` 4. 访问`127.0.0.1:8880/static/index.html`就是纯前端页面,此时无图片,无后端数据 > 没有虚拟环境但是想用虚拟环境,看https://blog.csdn.net/fj_changing/article/details/112623084 若用pycharm启动,则用pycharm打开axf_vue文件夹,再指定当前项目的python解析器,再执行`python manage.py runserver 8880` 前端启动端口需是除8000外的端口,因vue中设置的从后端的8000端口获取后端返回的数据。也不建议用8888端口,`127.0.0.1:8888`是Fiddler用的,若开了Fiddler会冲突。 我用cmd启动的,因为用pycharm的话,一会儿还要启动后端代码,任务栏会有两个pycharm,若要和其他软件多窗口切换,容易点错pycharm(点到前端的)。 此时访问前端页面时,浏览器Console中的报错(下面两个)是正常的,启动后端代码后再刷新页面,就有后端数据了。但即便启动了后端代码,前端依然加载不出商品图片,浏览器Console中有很多加载失败的报错,因为数据库中的商品图片链接失效了,链接无法访问,但不影响项目运行,你在意的话可以去数据库中修改商品图片链接,是AxfGoods模型(axf_goods表)的productimg字段。 - Error: Network Error Home.vue:154 at e.exports (createError.js:16) at XMLHttpRequest.f.onerror (xhr.js:83) - GET http://127.0.0.1:8000/api/goods/home/ net::ERR_CONNECTION_REFUSED 若是部署到服务器,解压得到的axf_vue文件夹,再打开里面的static文件夹,里面有index.html和static文件夹,把它俩放在服务器的静态资源文件夹中就能用。它俩就是vue写好编译好的,不能大范围地修改,只能简单地修改一些js文件(如app.XXX.js,这是编译过的前端的核心代码,简单地修改后不用再重新编译,可以直接生效);大范围地修改需要先对 app.XXX.js.map 反编译,得到vue源码后再修改,修改完再重新编译。反编译[参考链接](https://www.jianshu.com/p/ef8050cfb9ad)1,[参考链接](https://www.cnblogs.com/xiaoguang911/p/14754991.html)2,[参考链接](https://segmentfault.com/q/1010000011328782)3。 ### 启动后端代码 1. 进入虚拟环境(若有) 2. pip install -r requirements.txt 3. 修改 26-project-AiXianFeng/settings.py 中DATABASES,即改成你自己的数据库信息 4. python manage.py runserver requirements.txt中不只是这个项目的扩展库,还包含我的其他Django项目的,写这个项目时没新建虚拟环境。 后端代码只能用8000端口,原因在启动前端代码中说了,因vue中设置的从后端的8000端口获取后端返回的数据。Django的runserver默认是8000端口,所以后面不用加8000。 ## 修改前端代码及一些前端代码的说明 ### 前端代码问题 点击添加到购物车按钮后,浏览器Console报错 `Uncaught (in promise) ReferenceError: data is not defined at Market.vue:142` 点击查看第142行代码是 `console.log(data)` 因它上面创建data的代码被注释了 ```javascript // const data = resp.data; // this.goods_list = data.goods_list; // this.order_rule_list = data.order_rule_list; // this.foodtype_childname_list = data.foodtype_childname_list; console.log(data); ``` 所以第142行这里打印data会报错,它刚好是当前代码块的最后一句,所以不影响后续代码运行。 ### 解决方法 1. 打开static/js/app.f1114a603b196efe1b43.js,用Atom的atom-beautify插件按`Ctrl+Alt+B`格式化代码。VSCode我没装插件,它格式化后样子几乎没变,还是不利于阅读。 2. 删掉第319行的`, console.log(data)`,注意含前面的逗号和空格 3. 保存,重新打开浏览器,console里就不报这一行的错了。 搜索`console.log(data)`时,搜到三处,第一处是第319行,第二处是第578行,这两处的路由都是/api/cart/cart/add_cart/,没删第578行的,暂时没发现问题。pycharm格式化后的代码行数和Atom不一致,pycharm格式化后第一处在第167行,第二处在第322行。 ### 一些前端代码的说明 购物车页最上面的收货人信息(姓名,电话,地址)是在vue中写好的。 查看订单时,打开浏览器Console,点我的页右侧的全部订单按钮,再点待付款,此时Console中打印了返回值,点最右侧的OrderList.vue:106,在第80、88、98行分别判断了msg的值,并给o_status赋值(not_pay对应待付款页、not_send对应待收货页、默认值all对应全部页),再将o_status的值以GET请求传给服务端。这一段针对order/OrderFilters.py中OrderFilter类中filter_order_status()方法中value的值。 我的页中虽然有很多功能按钮,但前端只实现了"未登录"、"注册"、我的页右侧的"全部订单"。其他按钮点击时浏览器Console中没有任何打印(前言中说了Console中会打印前端的报错和后端返回的数据),浏览器Network中没有任何网络请求(注意选All),说明是前端未实现这些功能。 # 接口文档 除了这个接口文档,我还用了coreapi,它自动生成的接口文档在`127.0.0.1:8000/docs/` ## 一.首页 - 简要描述 - 首页的轮播、推荐,每日生鲜、便利店、商品展示 - 请求地址 - `127.0.0.1:8000/api/goods/home/` - 请求方式 - GET - 请求参数 - 无 - 成功时的返回示例 ```json { "code": 200, "msg": "请求成功", "data": { "main_wheels": [ { "id": 1, "img": "http://img01.bqstatic.com//upload/activity/2017031716035274.jpg@90Q.jpg", "name": "酸奶女王", "trackid": 21870 }, { "id": 2, "img": "http://img01.bqstatic.com//upload/activity/2017031710450787.jpg@90Q.jpg", "name": "优选圣女果", "trackid": 21869 }, ... # 省略后面的内容,格式与前面一样 ], "main_navs": [ { "id": 1, "img": "http://img01.bqstatic.com//upload/activity/2017032016495169.png", "name": "每日必抢", "trackid": 21851 }, { "id": 2, "img": "http://img01.bqstatic.com//upload/activity/2016121920130294.png", "name": "每日签到", "trackid": 21753 }, ... ], "main_mustbuys": [ { "id": 1, "img": "http://img01.bqstatic.com//upload/activity/2017031715194326.jpg@90Q.jpg", "name": "酸奶女王", "trackid": 21870 }, { "id": 2, "img": "http://img01.bqstatic.com//upload/activity/cms_118826_1489742316.jpg@90Q", "name": "鲜果女王", "trackid": 21861 }, ... ], "main_shops": [ { "id": 1, "img": "http://img01.bqstatic.com//upload/activity/2016121616565087.png@90Q.png", "name": "闪送超市", "trackid": 1464 }, { "id": 2, "img": "http://img01.bqstatic.com//upload/activity/2017031018405396.png@90Q.png", "name": "热销榜", "trackid": 104749 }, ... ], "main_shows": [ { "id": 1, "img": "http://img01.bqstatic.com//upload/activity/2017031018205492.jpg@90Q.jpg", "name": "优选水果", "trackid": 21782, "categoryid": 103532, "brandname": "爱鲜蜂", "img1": "http://img01.bqstatic.com/upload/goods/201/701/1916/20170119164159_996462.jpg@200w_200h_90Q", "childcid1": 103533, "productid1": 118824, "longname1": "爱鲜蜂·特小凤西瓜1.5-2.5kg/粒", "price1": 25.8, "marketprice1": 25.8, "img2": "http://img01.bqstatic.com/upload/goods/201/611/1617/20161116173544_219028.jpg@200w_200h_90Q", "childcid2": 103534, "productid2": 116950, "longname2": "蜂觅·越南直采红心火龙果350-450g/盒", "price2": 15.3, "marketprice2": 15.8, "img3": "http://img01.bqstatic.com/upload/goods/201/701/1916/20170119164119_550363.jpg@200w_200h_90Q", "childcid3": 103533, "productid3": 118826, "longname3": "爱鲜蜂·海南千禧果400-450g/盒", "price3": 9.9, "marketprice3": 13.8 }, { "id": 2, "img": "http://img01.bqstatic.com//upload/activity/2017031018205492.jpg@90Q.jpg", "name": "牛奶面包", "trackid": 21782, "categoryid": 103532, "brandname": "爱鲜蜂", "img1": "http://img01.bqstatic.com/upload/goods/201/701/1916/20170119164159_996462.jpg@200w_200h_90Q", "childcid1": 103533, "productid1": 118824, "longname1": "爱鲜蜂·特小凤西瓜1.5-2.5kg/粒", "price1": 25.8, "marketprice1": 25.8, "img2": "http://img01.bqstatic.com/upload/goods/201/611/1617/20161116173544_219028.jpg@200w_200h_90Q", "childcid2": 103534, "productid2": 116950, "longname2": "蜂觅·越南直采红心火龙果350-450g/盒", "price2": 15.3, "marketprice2": 15.8, "img3": "http://img01.bqstatic.com/upload/goods/201/701/1916/20170119164119_550363.jpg@200w_200h_90Q", "childcid3": 103533, "productid3": 118826, "longname3": "爱鲜蜂·海南千禧果400-450g/盒", "price3": 9.9, "marketprice3": 13.8 }, ... ] } } ``` - 返回参数说明 - 无 ## 二.闪送超市 ### 1.商品类型 - 简要描述 - 闪送超市获取商品大类型信息 - 请求地址 - `127.0.0.1:8000/api/goods/foodtype/` - 请求方式 - GET - 请求参数 - 无 - 成功时的返回示例 ```json { "code": 200, "msg": "请求成功", "data": [ { "id": 1, "typeid": 104749, "typename": "热销榜", "childtypenames": "全部分类:0", "typesort": 1 }, { "id": 2, "typeid": 104747, "typename": "新品尝鲜", "childtypenames": "全部分类:0", "typesort": 2 }, { "id": 3, "typeid": 103532, "typename": "优选水果", "childtypenames": "全部分类:0#进口水果:103534#国产水果:103533", "typesort": 3 }, ... # 省略后面的内容,格式与前面一样 ] } ``` - 返回参数说明 - 无 ### 2.商品列表 - 简要描述 - 闪送超市展示的商品的列表 - 请求地址 - `127.0.0.1:8000/api/goods/market/` - 请求方式 - GET - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ---------- | -------- | -------- | ------ | -------------------------------------------- | | typeid | 是 | string | 无 | 商品大类型id,对应AxfGoods模型中的categoryid | | childcid | 是 | string | 无 | 商品子类型id,对应AxfGoods模型中的childcid | | order_rule | 是 | string | 无 | 商品排序规则 | order_rule参数介绍,order_rule参数定义在后端代码的主配置文件settings.py中 ```python ORDER_RULE_LIST=[ # 闪送超市排序规则 {'order_name':'综合排序','order_value':0}, # 第二个键值对是当前排序方式的值。综合排序是不排序 {'order_name':'价格升序','order_value':1}, {'order_name':'价格降序','order_value':2}, {'order_name':'销量升序','order_value':3}, {'order_name':'销量降序','order_value':4} ] ``` 请求示例: ```json { 'typeid':'104749', 'childcid':'0', 'order_rule':'0' } ``` - 成功时的返回示例 ```json { "code": 200, "msg": "请求成功", "data": { "goods_list": [ { "id": 495, "productid": 119570, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.qingting.fm%2F2015%2F0108%2F20150108123232252.jpg%21200&refer=http%3A%2F%2Fpic.qingting.fm&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632283587&t=7d6ecfc7ba50304c4bd70766a42d3307", "productname": "麻辣味鲅鱼", "productlongname": "麻辣味鲅鱼32g", "isxf": 1, "pmdesc": 1, "specifics": "32g", "price": 1.0, "marketprice": 1.0, "categoryid": 104749, "childcid": 103543, "childcidname": "膨化食品", "dealerid": 4858, "storenums": 50, "productnum": 100003541 }, { "id": 496, "productid": 109108, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg58.nipic.com%2F20140813%2F19404963_171801578457_1.jpg&refer=http%3A%2F%2Fimg58.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632285389&t=ea307c93684619b0e926b44e5fe4b797", "productname": "三元轻能黄桃+大麦优酪乳", "productlongname": "三元轻能黄桃+大麦优酪乳250g", "isxf": 1, "pmdesc": 1, "specifics": "250g", "price": 8.9, "marketprice": 15.0, "categoryid": 104749, "childcid": 103537, "childcidname": "酸奶乳酸菌", "dealerid": 4858, "storenums": 50, "productnum": 100003903 }, { "id": 497, "productid": 113619, "productimg": "http://img01.bqstatic.com/upload/goods/201/608/2618/20160826185419_023449.jpg@200w_200h_90Q", "productname": "骑士1992酸牛奶", "productlongname": "骑士1992酸牛奶180g", "isxf": 1, "pmdesc": 1, "specifics": "180g", "price": 6.8, "marketprice": 9.9, "categoryid": 104749, "childcid": 103537, "childcidname": "酸奶乳酸菌", "dealerid": 4858, "storenums": 50, "productnum": 100002542 } ], "order_rule_list": [ { "order_name": "综合排序", "order_value": 0 }, { "order_name": "价格升序", "order_value": 1 }, { "order_name": "价格降序", "order_value": 2 }, { "order_name": "销量升序", "order_value": 3 }, { "order_name": "销量降序", "order_value": 4 } ], "foodtype_childname_list": [ { "child_name": "全部分类", "child_value": "0" } ] } } ``` - 返回参数说明 - goods_list:闪送超市展示的商品的列表 - order_rule_list:排序方式的列表 - foodtype_childname_list:商品大类型下的子类型的列表 ## 三.购物车 ### 1.添加商品 - 简要描述 - 闪送超市页添加购物车(每个商品右下角的button,黄色边框的空心圆,里面有一个红色边框的长方形,点击按钮将商品添加到购物车)。同时也是购物车页增加一种商品的数量(购物车页的加号)。 - 请求地址 - `127.0.0.1:8000/api/cart/cart/add_cart/` - 请求方式 - POST - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ------- | -------- | -------- | ------ | ---------------------------------- | | token | 是 | string | 无 | 登录标识 | | goodsid | 是 | int | 无 | 商品id,对应AxfGoods模型中的id或pk | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "c_goods_num": 1 # 根据服务端传来的值决定 } } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 数据库(AxfGoods模型,axf_goods表)中没有当前商品 ```json { "code": 404, "msg": "该商品不存在", "data": {} # 写死的空字典 } ``` - 返回参数说明 - c_goods_num:添加成功后购物车中当前商品的数量 ### 2.购物车展示商品 - 简要描述 - 获取购物车页数据 - 请求地址 - `127.0.0.1:8000/api/cart/cart/` - 请求方式 - GET - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ------ | -------- | -------- | ------ | -------- | | token | 是 | string | 无 | 登录标识 | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "title": "购物车", "is_all_select": false, # 根据服务端传来的值决定 "total_price": 17.8, "carts": [ { "id": 33, "c_goods": { "id": 557, "productid": 119598, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbaike.soso.com%2Fp%2F20090717%2F20090717163058-1382558140.jpg&refer=http%3A%2F%2Fbaike.soso.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632285339&t=4000755d5bf94330f617c0a34b7995af", "productname": "辉山十天风味酸乳", "productlongname": "辉山十天风味酸乳185g", "isxf": 1, "pmdesc": 1, "specifics": "185g", "price": 8.9, "marketprice": 8.9, "categoryid": 103536, "childcid": 103537, "childcidname": "酸奶乳酸菌", "dealerid": 4858, "storenums": 50, "productnum": 100002115 }, "c_goods_num": 2, "c_is_select": 1, "c_user": 1 }, { "id": 34, "c_goods": { "id": 495, "productid": 119570, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.qingting.fm%2F2015%2F0108%2F20150108123232252.jpg%21200&refer=http%3A%2F%2Fpic.qingting.fm&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632283587&t=7d6ecfc7ba50304c4bd70766a42d3307", "productname": "麻辣味鲅鱼", "productlongname": "麻辣味鲅鱼32g", "isxf": 1, "pmdesc": 1, "specifics": "32g", "price": 1.0, "marketprice": 1.0, "categoryid": 104749, "childcid": 103543, "childcidname": "膨化食品", "dealerid": 4858, "storenums": 50, "productnum": 100003541 }, "c_goods_num": 5, "c_is_select": 0, "c_user": 1 } ] } } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 返回参数说明 - is_all_select:购物车中的商品是否已全选 - total_price:购物车中已选择的商品的总价 - carts:购物车中的所有商品 ### 3.减少商品 - 简要描述 - 购物车页减少一种商品的数量(购物车页的减号) - 请求地址 - `127.0.0.1:8000/api/cart/cart/sub_cart/` - 请求方式 - POST - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ------- | -------- | -------- | ------ | ---------------------------------- | | token | 是 | string | 无 | 登录标识 | | goodsid | 是 | int | 无 | 商品id,对应AxfGoods模型中的id或pk | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "c_goods_num": 1 # 根据服务端传来的值决定 } } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 购物车(AxfCart模型,axf_cart表)或数据库(AxfGoods模型,axf_goods表)中没有当前商品 ```json { "code": 404, "msg": "该商品不存在", "data": {} # 写死的空字典 } ``` - 返回参数说明 - c_goods_num:减少成功后购物车中当前商品的数量 ### 4.选择/取消选择 商品 - 简要描述 - 购物车页选择或取消选择一项商品 - 请求地址 - `127.0.0.1:8000/api/cart/cart/` - **实际应该用请求参数中的示例** - 请求方式 - PATCH - 请求参数 | 参数名 | 是否必选 | 请求方式 | 参数类型 | 默认值 | 说明 | | ------ | -------- | -------- | -------- | ------ | ----------------------------------------------- | | token | 是 | PATCH | string | 无 | 登录标识 | | id | 是 | 路由 | int | 无 | 购物车中的商品的序号,对应AxfCart模型中的id或pk | **示例**:`127.0.0.1:8000/api/cart/cart/1/` - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": {} # 写死的空字典 } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 购物车(AxfCart模型,axf_cart表)或数据库(AxfGoods模型,axf_goods表)中没有当前商品 ```json { "code": 404, "msg": "购物车中该商品不存在", "data": {} # 写死的空字典 } ``` - 返回参数说明 - 无 ### 5.全选/取消全选 商品 - 简要描述 - 购物车页全选或取消全选 - 请求地址 - `127.0.0.1:8000/api/cart/cart/change_select/` - 请求方式 - PATCH - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ------ | -------- | -------- | ------ | -------- | | token | 是 | string | 无 | 登录标识 | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": {} # 写死的空字典 } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 购物车是空的 ```json { "code": 404, "msg": "购物车是空的", "data": {} # 写死的空字典 } ``` - 返回参数说明 - 无 ## 四.订单 ### 1.提交订单 - 简要描述 - 创建订单 - 请求地址 - `127.0.0.1:8000/api/orders/orders/` - 请求方式 - POST - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ------ | -------- | -------- | ------ | -------- | | token | 是 | string | 无 | 登录标识 | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "order_id": 6 # 根据服务端传来的值决定 } } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 返回参数说明 - order_id:当前订单的id ### 2.订单展示 - 简要描述 - 获取订单数据,显示订单内容 - 请求地址 - `127.0.0.1:8000/api/orders/orders/` - 请求方式 - GET - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | -------- | -------- | -------- | ------ | -------------------- | | token | 是 | string | 无 | 登录标识 | | o_status | 否 | string | all | 筛选订单时的订单状态 | o_status参数介绍,o_status参数的值定义在后端代码的order/order_status_constant.py中,即下面代码段中的1、2、3,本项目实际用到了1和2,3及后面的状态都未实现,且1和2的切换需要去数据库(AxfOrder模型,axf_order表)手动修改,项目中未实现修改订单状态的功能。关于o_status的其他说明,看"一些前端代码的说明"。 ```python # from https://github.com/fangweiren/AXF/blob/master/App/views_constant.py # ORDER STATUS # 已下单未付款 ORDER_STATUS_NOT_PAY = 1 # 已下单已付款未发货 ORDER_STATUS_NOT_SEND = 2 # 已下单已付款已发货未收货 ORDER_STATUS_NOT_RECEIVE = 3 # 已下单已付款已发货已收货未确认 # 已下单已付款已发货已收货已确认未评价 # 已下单已付款已发货已收货已确认已评价未追评 # 已下单已付款已发货已收货已确认已评价 # 申请售后 # 退货 # 换货 # 返修 ``` - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": [ { "id": 1, "o_price": 20.8, "o_time": "2021-08-25T18:38:56.150166+08:00", "o_status": 1, "o_user": 1, "order_goods_info": [ { "id": 1, "o_goods": { "id": 495, "productid": 119570, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.qingting.fm%2F2015%2F0108%2F20150108123232252.jpg%21200&refer=http%3A%2F%2Fpic.qingting.fm&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632283587&t=7d6ecfc7ba50304c4bd70766a42d3307", "productname": "麻辣味鲅鱼", "productlongname": "麻辣味鲅鱼32g", "isxf": 1, "pmdesc": 1, "specifics": "32g", "price": 1.0, "marketprice": 1.0, "categoryid": 104749, "childcid": 103543, "childcidname": "膨化食品", "dealerid": 4858, "storenums": 50, "productnum": 100003541 }, "o_goods_num": 3, "o_order": 1 }, { "id": 2, "o_goods": { "id": 496, "productid": 109108, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg58.nipic.com%2F20140813%2F19404963_171801578457_1.jpg&refer=http%3A%2F%2Fimg58.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632285389&t=ea307c93684619b0e926b44e5fe4b797", "productname": "三元轻能黄桃+大麦优酪乳", "productlongname": "三元轻能黄桃+大麦优酪乳250g", "isxf": 1, "pmdesc": 1, "specifics": "250g", "price": 8.9, "marketprice": 15.0, "categoryid": 104749, "childcid": 103537, "childcidname": "酸奶乳酸菌", "dealerid": 4858, "storenums": 50, "productnum": 100003903 }, "o_goods_num": 2, "o_order": 1 } ] }, { "id": 2, "o_price": 20.8, "o_time": "2021-08-25T18:49:11.920808+08:00", "o_status": 2, "o_user": 1, "order_goods_info": [ { "id": 3, "o_goods": { "id": 277, "productid": 2514, "productimg": "//image.suning.cn/uimg/b2c/newcatentries/0070168601-000000000670336700_1.jpg_200w_200h_4e", "productname": "小浣熊,干脆面,烤肉味", "productlongname": "统一小浣熊有肉任性烤味50g", "isxf": 0, "pmdesc": 0, "specifics": "50g", "price": 1.3, "marketprice": 2.0, "categoryid": 103557, "childcid": 103558, "childcidname": "方便面", "dealerid": 4858, "storenums": 200, "productnum": 618 }, "o_goods_num": 3, "o_order": 2 }, { "id": 4, "o_goods": { "id": 417, "productid": 9630, "productimg": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg74.nipic.com%2Ffile%2F20160609%2F10070847_223819077000_1.jpg&refer=http%3A%2F%2Fimg74.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632285246&t=f72d7c20495ef8048e7d80faf36f8fe8", "productname": "维达超韧纸面巾3层150抽(小)", "productlongname": "维达超韧纸抽3包/提", "isxf": 0, "pmdesc": 0, "specifics": "3包", "price": 13.8, "marketprice": 13.8, "categoryid": 103575, "childcid": 103578, "childcidname": "纸品", "dealerid": 4858, "storenums": 200, "productnum": 123 }, "o_goods_num": 2, "o_order": 2 } ] }, ... # 省略后面的内容,格式与前面一样 ] } ``` - 失败 - token错误或过期 ```json { "detail": "身份认证信息未提供。" } ``` - 返回参数说明 - o_price:当前订单的总价(未实现优惠券、打折等优惠功能) - o_time:当前订单的提交时间 - o_status:当前订单的状态 - o_user:当前订单的购买者 - order_goods_info:当前订单中商品的详细信息 ## 五.用户管理 ### 1.用户信息 - 简要描述 - 获取我的页用户数据 - 请求地址 - `127.0.0.1:8000/api/user/auth/` - 请求方式 - GET - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ------ | -------- | -------- | ------ | -------- | | token | 是 | string | 无 | 登录标识 | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "user_info": { "id": 1, "u_username": "asdfgh", "u_password": "pbkdf2_sha256$260000$gwIbgN7qMOjdknBfWPMxx9$5xraktEyuQ+MOwNakYbobbGEY9LB0AFBddYeHEH16wY=", "u_email": "yui@qq.com", "is_active": 1, "is_delete": 0 }, 'orders_not_pay_num': 0, # 待付款。后端代码未实现,实际不会返回此项。 'orders_not_send_num': 0 # 待收货。后端代码未实现,实际不会返回此项。 } } ``` - 失败 - token错误或过期 ```json { "code": 401, "msg": "token错误,请重新登录", "data": {} # 写死的空字典 } ``` - token正确后,此时该用户刚好被从数据库中删除 ```json { "code": 404, "msg": "该用户不存在", "data": {} # 写死的空字典 } ``` - 返回参数说明 - user_info:用户的个人信息 ### 2.用户注册 - 简要描述 - 我的页注册 - 请求地址 - `127.0.0.1:8000/api/user/auth/register/` - 请求方式 - POST - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ----------- | -------- | -------- | ------ | -------- | | u_username | 是 | string | 无 | 用户名 | | u_password | 是 | string | 无 | 密码 | | u_password2 | 是 | string | 无 | 确认密码 | | u_email | 是 | string | 无 | 邮箱 | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "user_id": 2 } } ``` - 失败 - 未输入用户名,其他参数都符合要求 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_username": [ "该字段是必填项。" ] } } } ``` - 密码或确认密码的长度不符合要求,其他参数都符合要求,且此时密码和确认密码的值一致 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_password": [ "最小长度不少于6位" # 或最大长度不超过18位 ], "u_password2": [ "最小长度不少于6位" # 或最大长度不超过18位 ] } } } ``` - 未输入邮箱,其他参数都符合要求 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_email": [ "该字段是必填项。" ] } } } ``` - 用户名已被使用 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_username": { "username": "该用户名已被使用,请更换用户名" } } } } ``` - 邮箱已被使用 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_email": { "email": "该邮箱已被使用,请更换邮箱" } } } } ``` - 两次输入的密码不一致 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "password": [ "两次输入的密码不一致" ] } } } ``` - 未输入密码或未输入确认密码 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_password2": [ # 这是未输入确认密码的例子。密码和确认密码都未输入时,info中同时有u_password和u_password2,格式类似密码或确认密码的长度不符合要求的返回值。 "该字段是必填项。" ] } } } ``` - 邮箱格式不正确 ```json { "code": 400, "msg": "请求参数校验失败", "data": { "info": { "u_email": [ "请输入合法的邮件地址。" ] } } } ``` - 失败的情况的总结 1. 未输入用户名 2. 密码或确认密码的长度不正确 3. 未输入邮箱 4. 用户名已被使用 5. 邮箱已被使用 6. 两次输入的密码不一致 7. 未输入密码或未输入确认密码 8. 邮箱格式不正确 - 返回参数说明 - user_id:用户id - info:详细错误信息 ### 3.用户登录 - 简要描述 - 我的页登录,未登录时点我的页的"未登录"。 - 用户登录后,token有效期3600秒,可以在user/util.py中Token类中check_activate_token()方法中修改(这是定义处),也可以在实际调用处修改。 - 请求地址 - `127.0.0.1:8000/api/user/auth/login/` - 请求方式 - POST - 请求参数 | 参数名 | 是否必选 | 参数类型 | 默认值 | 说明 | | ---------- | -------- | -------- | ------ | ------ | | u_username | 是 | string | 无 | 用户名 | | u_password | 是 | string | 无 | 密码 | - 返回示例 - 成功 ```json { "code": 200, "msg": "请求成功", "data": { "user_id": 1, "token": "MQ.YS34ew.YZLLjhj3oNiNnhuzo17mjXYWmV4" } } ``` - 失败 - 用户名不存在 ```json { "code": 401, "msg": "请求参数校验失败", "data": { "error": { "error": [ "用户名不存在" # 最好提示'用户名或密码错误',防止确认用户名正确后暴破密码。现在这样写是方便测试那些登录失败的判断是否生效 ] }, "token": null # 写死的null,后端定义时是None,前端接收后是null } } ``` - 密码错误 ```json { "code": 401, "msg": "请求参数校验失败", "data": { "error": { "error": [ "用户名或密码错误" ] }, "token": null # 写死的null,后端定义时是None,前端接收后是null } } ``` - 未输入用户名或未输入密码 ```json { "code": 401, "msg": "请求参数校验失败", "data": { "error": { "u_password": [ # 这是未输入密码的例子。用户名和密码都未输入时,error中同时有u_username和u_password,格式类似密码或确认密码的长度不符合要求的返回值。 "该字段是必填项。" ] }, "token": null # 写死的null,后端定义时是None,前端接收后是null } } ``` - 返回参数说明 - user_id:用户id - error:详细错误信息