当前位置:网站首页>订单系统功能实现
订单系统功能实现
2022-07-27 05:02:00 【pink_Pig___】
订单系统
订单模型设计
创建模型类
生成迁移文件进行迁移
goods
from users.models import User,Addr
#订单表
PAYSTATUS=(
(1,'待支付'),
(1,'待发货'),
(1,'待收货'),
(1,'待评价'),
(1,'已完成'),
)
class Order(models.Model):
order_id=models.CharField(max_length=100,verbose_name='订单号',primary_key=True)
user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')
addr=models.ForeignKey(Addr,on_delete=models.CASCADE,verbose_name='收货地址')
total_price=models.DecimalField(max_digits=9,decimal_places=2,verbose_name='总价')
total_count=models.IntegerField(verbose_name='总商品数')
pay_method=models.IntegerField(verbose_name='支付方式',choices=((1,'支付宝'),(2,'银联')))
pay_status= models.IntegerField(choices=PAYSTATUS,verbose_name='支付状态')
create_time=models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
update_time=models.DateTimeField(auto_now=True,verbose_name='更新时间')
class Meta:
verbose_name='订单'
verbose_name_plural=verbose_name
def __str__(self):
return self.order_id
class OrderGoods(models.Model):
goods=models.ForeignKey(Goods,on_delete=models.CASCADE,verbose_name='商品信息')
count=models.IntegerField(verbose_name='数量')
price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='单价')
order=models.ForeignKey(Order,on_delete=models.CASCADE,verbose_name='订单')
class Meta:
verbose_name='订单商品'
verbose_name_plural=verbose_name
def __str__(self):
return self.goods.sku_name
后端
#收货地址
class Addrview(APIView):
#查看收货地址
def get(self,request):
user = request.META.get('USER')
if not user:
return Response({
'code': 400,
'msg': '用户未登录'
})
user_id = user['user_id']
#拿到当前用户下面的所有地址信息
addr_list=Addr.objects.filter(user_id=user_id).all()
addr_all=[]
for i in addr_list:
addr_all.append({
'id':i.id,
'name':i.name,
'tel':i.tel,
'addr':i.addr,
'is_default':i.is_default,
})
return Response({
'code':200,
'msg':'地址获取成功',
'addrs':addr_all,
})
#添加收货地址
def post(self,request):
...
#删除收货地址
def delete(self,request):
...
配置路由
from django.urls import path
from users import views
urlpatterns = [
# path('admin/', admin.site.urls),
path('addr/',views.Addrview.as_view()), #用户收获地址
]
前端
订单系统获取用户地址信息及添加地址信息
找到对应的vue文件配置对应的功能函数
例如: ConfirmOrder.vue
created() {
// 未勾选购物车商品时,直接进入确认订单页面,提示信息并返回购物车
if (this.getCheckNum < 1) {
this.notifyError("请勾选商品后再结算");
this.$router.push({
path: "/shoppingCart"});
}
// TODO 获取用户地址信息
this.$axios.get('/user/addr/',{
'headers':{
'token':localStorage.getItem('token')
}
}).then((result) => {
if (result.data.code==200){
this.address=result.data.addrs
}
}).catch((err) => {
console.log(err)
});
},
订单系统添加地址信息
例如:AddMyAddr.vue
// 点击添加地址
addMyAddr() {
// TODO 添加地址
console.log("开始发送请求,添加收货地址...")
this.$axios.post('user/addr/',{
'name':this.LoginUser.receiver,
'tel':this.LoginUser.receive_mobile,
'addr':this.LoginUser.receive_addr,
'is_default':this.LoginUser.is_default
},{
'headers':{
'token':localStorage.getItem('token')
}
}).then((result) => {
this.notifySucceed(result.data.msg)
this.LoginUser.receiver=''
this.LoginUser.receive_mobile=''
this.LoginUser.receive_addr=''
this.LoginUser.is_default=false
this.setAddMyAddr(false)
}).catch((err) => {
console.log(err)
});
},
创建订单
后端
创建订单
goods
from rest_framework.response import Response
from rest_framework.views import APIView
from goods.models import Categroy,Goods,Addr,Order,OrderGoods
from goods.serializers import Goodsser
import redis,random
class Goodsview(APIView):
#生成订单
def post(self,request):
#判断登录
user = request.META.get('USER') # 获取到中间件检测完登录,传递过来的用户信息、
if not user:
return Response({
'code': 400,
'msg': '用户未登录'
})
user_id = user['user_id']
addr_id=request.data.get('addr_id')
goods_list=request.data.get('goods_list') #[{'goods_id':1,'num':2},{'goods_id':2,'num':2}]
pay_method=request.data.get('pay_method')
#获取收货地址并验证
addr_info=Addr.objects.filter(id=addr_id,user_id=user_id).first()
if not addr_info:
return Response({
'code':400,
'msg':'收货地址不存在'
})
#获取商品信息并验证
goods_buy=[]
for i in goods_list:
goods_info=Goods.objects.filter(id=i['goods_id']).first()
if not goods_info:
continue
if goods_info.stock<i['num']:
return Response({
'code':400,
'msg':'%s商品库存不足'%goods_info.sku_name
})
goods_buy.append({
'id':i['goods_id'],
'num':i['num'],
'price':goods_info.selling_price
})
#创建订单
order_info=Order.objects.create(
order_id=str(random.randint(100000,999999)),
user_id=user_id,
addr=addr_info,
total_price=0,
total_count=0,
pay_method=pay_method,
pay_status=1,
)
#创建订单商品
for i in goods_buy:
#创建子订单
OrderGoods.objects.create(
goods_id=i['id'],
count=i['num'],
price=i['price'],
order=order_info,
)
#修改主订单
order_info.total_price+=(i['price']*i['num'])
order_info.total_count+=i['num']
#扣除库存
g_info=Goods.objects.filter(id=i['id']).first()
g_info.stock=i['num']
g_info.save()
order_info.save()
#返回下单成功
return Response({
'code':200,
'msg':'下单成功'
})
配置路由
from django.urls import path
from goods import views
urlpatterns = [
path('goods/',views.Goodsview.as_view()) #订单
]
边栏推荐
- idea远程调试debug
- 整合SSM
- Shell course summary
- JVM Part 1: memory and garbage collection part 8 - runtime data area - Method area
- Differences among bio, NiO and AIO
- 李宏毅机器学习组队学习打卡活动day02---回归
- Simplify the mybits framework of JDBC
- The interface can automatically generate E and other asynchronous access or restart,
- The receiver sets the concurrency and current limit
- B1028 人口普查
猜你喜欢

The difference between strlen and sizeof

弹球小游戏

JVM上篇:内存与垃圾回收篇七--运行时数据区-堆

数据库设计——关系数据理论(超详细)

Bean的生命周期&&依赖注入*依赖自动装配

JVM Part 1: memory and garbage collection part 8 - runtime data area - Method area

2021 OWASP top 5: security configuration error

Scientific Computing Library - numpy

File processing (IO)

How idea creates a groovy project (explain in detail with pictures and texts)
随机推荐
String class
JVM上篇:内存与垃圾回收篇六--运行时数据区-本地方法&本地方法栈
学生管理系统
Alphabetic order problem
SQL数据库→约束→设计→多表查询→事务
Solution and principle analysis of feign call missing request header
李宏毅机器学习组队学习打卡活动day04---深度学习介绍和反向传播机制
Localdatetime and zoneddatetime
B1027 打印沙漏
Create datasource using Druid connection pool
2021 OWASP top 5: security configuration error
The provision of operation and maintenance manager is significantly affected, and, for example, it is like an eep command
JDBC API 详解
During its low-level period, this slave edge causes the instruction number to make a corresponding model
JDBC API details
JVM上篇:内存与垃圾回收篇十二--StringTable
如何快速有效解决数据库连接失败问题
辗转相除法
redis集群
Simplify the mybits framework of JDBC