• 安装模块

    • pip install django-redis
  • 后端代码
  1. # 购物车
  2. class CartView(APIView):
  3. # 初始化函数
  4. def __init__(self):
  5. self.conn = get_redis_connection('default')
  6.  
  7. # 获取购物车信息
  8. def get(self,request):
  9. # 读取数据 (获取前端传来的id)
  10. uid = request.GET.get('id')
  11. key = 'cart_{}'.format(uid) # cart_1
  12. tmp = self.conn.hgetall(key) # {b'a9':b'20',b'a10':b'13'}
  13. if not tmp:
  14. return Response({
  15. "status":201,
  16. "msg":"购物车为空"
  17. })
  18. data = {k.decode('utf-8')[1:]:v.decode('utf-8') for k,v in tmp.items()}
  19. # 如何获取商品Id
  20. goods = models.Goods.objects.filter(id__in=data).all()
  21. data_list = []
  22. datax = {k.decode('utf-8'): v.decode('utf-8') for k, v in tmp.items()} # {'a10': '13', 'a9': '20'}
  23. for good in goods:
  24. gid = good.id
  25. info = {"id":gid,"name":good.name,"store":good.store,"price":float(good.price),"img":good.img,"count":datax.get('a'+str(gid))}
  26. data_list.append(info)
  27. return Response({
  28. "status":200,
  29. "msg": "",
  30. "data":data_list
  31. })
  32. # 添加购物车信息
  33. def post(self,request):
  34. data = request.data
  35. uid = data.get('uid','')
  36. gid = 'a'+ str(data.get('gid',''))
  37. count = data.get('count',0)
  38. # 存入redis
  39. key = 'cart_'+ str(uid)
  40. self.conn.hset(key,gid,count)
  41. return Response({
  42. "msg":"已设置"
  43. })
  44.  
  45. # 删除购物车信息
  46. def delete(self,request):
  47. uid = request.data.get('uid',"")
  48. gid = request.data.get('gid',"")
  49. key = 'cart_{}'.format(uid)
  50. field = 'a{}'.format(gid)
  51. tmp = self.conn.hdel(key,field)
  52. print(tmp)
  53. return Response({
  54. "msg":""
  55. })
  • 前端
  1. <template>
  2. <div id='cart'>
  3. <div class="total_count">全部商品<em>2</em></div>
  4. <ul class="cart_list_th clearfix">
  5. <li class="col01">商品名称</li>
  6. <li class="col03">商品价格</li>
  7. <li class="col04">数量</li>
  8. <li class="col05">小计</li>
  9. <li class="col06">操作</li>
  10. </ul>
  11. <ul class="cart_list_td clearfix" v-for="(i,index) in goods">
  12. <li class="col01"></li>
  13. <li class="col02"><img :src="src+i.img"></li>
  14. <li class="col03">{{i.name}}</li>
  15. <li class="col05">{{i.price}}元</li>
  16. <li class="col06">
  17. <div class="num_add">
  18. <a href="javascript:;" class="add fl" @click="add(index)">+</a>
  19. <input type="text" class="num_show fl" v-model="i.count">
  20. <a href="javascript:;" class="minus fl" @click="minus(index)">-</a>
  21. </div>
  22. </li>
  23. <li class="col07">{{i.count*i.price}}元</li>
  24. <li class="col08"><a href="javascript:;" @click="delx(i.id)">删除</a></li>
  25. </ul>
  26. <ul class="settlements">
  27. <li class="col01"></li>
  28. <li class="col02"></li>
  29. <li class="col03">合计(不含运费):<span>¥</span><em>{{totalPrice}}</em><br>共计<b>2</b>件商品</li>
  30. <li class="col04"><a @click="pay">去结算</a></li>
  31. </ul>
  32. </div>
  33. </template>
  34. <script>
  35. export default {
  36. name:'cart',
  37. data() {
  38. return {
  39. goods:[],
  40. src:'/hou/static/goods/',
  41. totalPrice:0
  42. }
  43. },
  44. // 页面加载之前获取购物车参数信息
  45. mounted(){
  46. // 方法共用
  47. this.get_data()
  48. },
  49. methods:{
  50. // 添加点击事件 加一
  51. add:function(index){
  52. this.goods[index].count++;
  53. this.totalPricefn(index,'+');
  54. },
  55. // 添加点击事件 减一
  56. minus:function(index){
  57. if(this.goods[index].count>1){
  58. this.goods[index].count--;
  59. this.totalPricefn(index,'-');
  60. }
  61.  
  62. },
  63. // 计算总价
  64. totalPricefn:function(index,params){
  65. if(params=='+'){
  66. this.totalPrice += this.goods[index].price*1;
  67. }else if(params =='-'){
  68. this.totalPrice -= this.goods[index].price*1;
  69. }else{
  70. this.totalPrice += this.goods[index].price*this.goods[index].count;
  71. }
  72. },
  73. // 支付
  74. pay:function(){
  75. let data = {
  76. "total":this.totalPrice,
  77. }
  78.  
  79. this.axios({
  80. url:'/api/pay/pay/',
  81. method:'get',
  82. params:data
  83. }).then(res=>{
  84. //
  85. let url = res.data.url;
  86. location.href = url;
  87. })
  88. },
  89. // 删除商品
  90. delx:function(id){
  91. let data = {
  92. 'uid':localStorage.getItem('uid'),
  93. 'gid':id
  94. }
  95. this.axios({
  96. url:'/api/goods/cart/',
  97. method:'delete',
  98. data:data
  99. }).then(res=>{
  100. this.get_data();
  101. })
  102. },
  103. // 获取初始信息
  104. get_data:function(){
  105. this.axios({
  106. url:'/api/goods/cart/',
  107. method:'get',
  108. params:{"id":localStorage.getItem('uid')}
  109. }).then(res=>{
  110. this.goods = res.data.data;
  111. this.totalPrice = 0;
  112. this.goods.forEach((item,index)=>{
  113. this.totalPricefn(index,'');
  114. })
  115.  
  116. })
  117. }
  118. }
  119. }
  120. </script>

python代码实现购物车(django的redis与vue)的更多相关文章

  1. Python代码样例列表

    扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│    ...

  2. 【updating】python读书笔记-The Django Book2.0(for django1.4)

    原文:http://www.djangobook.com/en/2.0/frontmatter.html 译文:http://djangobook.py3k.cn/2.0/ 或者http://docs ...

  3. python 全栈开发,Day101(redis操作,购物车,DRF解析器)

    昨日内容回顾 1. django请求生命周期? - 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者po ...

  4. python用Django+Celery+Redis 监视程序(一)

    C盘创建一个目录就叫DjangoDemo,然后开始在该目录下操作. 1.新建Django工程与应用 运行pip install django 安装django 这里我们建一个名为demo的项目和hom ...

  5. python代码自动补全配置及Django入门Demo

    django入门代码示例小博客:https://pan.baidu.com/s/1pLjLPSv 1.自动补全功能 许多人都知道 iPython 有很好的自动补全能力,但是就未必知道 python 也 ...

  6. [转载]基于Redis的Bloomfilter去重(附Python代码)

    前言: “去重”是日常工作中会经常用到的一项技能,在爬虫领域更是常用,并且规模一般都比较大.去重需要考虑两个点:去重的数据量.去重速度.为了保持较快的去重速度,一般选择在内存中进行去重. 数据量不大时 ...

  7. 【Azure Redis 缓存】使用Python代码获取Azure Redis的监控指标值 (含Powershell脚本方式)

    问题描述 通过Metrics监控页面,我们能得知当前资源(如Redis)的运行情况与各种指标.如果我们需要把指标下载到本地或者生成JSON数据导入到第三方的监控平台呢?Azure是否可以通过Pytho ...

  8. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

  9. django celery redis 定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

随机推荐

  1. 8 ~ express ~ 基于数据库的验证

    1,首先 在router/api.js 中引入数据库定义好的模型  /models/User.js var User = require('../models/User') //User返回的是一个构 ...

  2. Python安装和虚拟环境创建以及外部库的安装

    Python.虚拟环境.外部库的安装 一 安装Python 1 Windows 到官网下载对应的版本 下载地址 我选择的是Python3.6.8 下载完成后双击运行 !!!勾选Add Python 3 ...

  3. 如何在Swift的代码中使用OC的代码, 在OC的代码中使用Swift的代码?

    https://www.cnblogs.com/upliver/p/5138160.html 如何在Swift的代码中使用OC的代码, 在OC的代码中使用Swift的代码? 随着苹果公司对Swift的 ...

  4. HZNU-ACM寒假集训Day7小结 背包DP

    背包问题 01背包 状态:f(i,j) 表示只能装前i个物品的情况下,容量为j的背包所能达到的最大总价值 状态转移方程:  f(i,j)=max(f(i-1,j),f(i-1,j-w[i])+v[i] ...

  5. VUE.js入门学习(5)- 插槽和作用域插槽

    插槽: (1)用法 以前的写法:如果内容很多的话,就很烂了- 插槽写法:(PS:组建名不能用保留关键字) (2)具名插槽 (3)作用域插槽 必须template开始和结尾,这个插槽要声明我从子组建接收 ...

  6. CountUp.js 数字跳转效果小插件

    CountUp.js  实现数字跳转效果的小插件 //调用方法 const easingFn = function (t, b, c, d) { var ts = (t /= d) * t; var ...

  7. JZOJ-2019-11-8 A组

    T1 给定\(n\)个点的坐标(\(0 \leq xi,yi \leq 10000\))求选出任意三个点能组成的三角形的总面积. Input 第一行\(n\)表示点数.接下来每行两个数\(x_i\), ...

  8. css 的基础样式--border--padding--margin

    border 边框复合写法 border:border-width border-style border-color; border-width 边框宽度 border-style 边框样式:sol ...

  9. 2020牛客寒假算法基础集训营5 G街机争霸

    题目描述 哎,又是银首,要是你这个签到题少WA一发就金了 牛牛战队的队员打完比赛以后又到了日常甩锅的时间.他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo.牛牛和牛能进入了一个迷宫,这个迷宫 ...

  10. Windows如何设置指定的IP走专线?

    很多时候在工作中难免有多重网络环境的情况,为了方便之间的互访,可能会用的VPN等虚拟专线,作为网络管理员,route命令是必会的基础技能. 我们一般连接到专线vpn以后,默认会启用远程网关,这样我们所 ...