网上商城
1.引言
随着社会的不断发展,科学技术也在不断的更新。Internet作为新型的工具,他的迅速发展为商业界听欧诺个了更多广阔的信息平台与更多的商机,如催化剂一般刺激着商业经济的快速发展。因此选择设计开发一个企业门户网站拥有重要的意义
因此本次我打算开发一个网上商城。网上商城是前端使用bootstrap框架,后台使用Python制作的类淘宝的网上商城,同样实现了电子商务平台应有的基本功能,如:首页商品展示,商品详情信息,用户注册,修改用户信息,地址管理模块,购物车模块,订单结算模块。整个系统都是围绕这几个模块展开设计的。用户可以很好的浏览商品和选购商品,选择更优质、更实惠的商品。
2.系统结构
2.1.系统流程
用户登录系统后,有不同的使用功能,主要功能流程图如下所示:
图 2-1系统流程图django
2.2.系统主要框架
2.2.1.Django
Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2] 。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
1.用于创建模型的对象关系映射;
2.为最终用户设计较好的管理界面;
3.URL 设计;
4.设计者友好的模板语言;
5.缓存系统。
图 2-2 Flask框架过程图
2.2.2.Mysql
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理
MySQL的特点
MySQL体积小 、使用成本低 、可移植性强 、适用用户范围广
1) MySQL是开源的,所以你不需要支付额外的费用。
2) MySQL支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
3) MySQL使用标准的SQL数据语言形式。
4) MySQL可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
5) MySQL对PHP有很好的支持,PHP是目前最流行的Web开发语言。
6) MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
7) MySQL是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
图 2-3 SQLAlchemy架构图
系统功能
2.3.
2.3.1.登录功能
网上商城登录前端:
图 2-4 登录页面
2.3.2.用户注册功能
注册功能页面:
图 2-5 注册页面
2.3.3.用户中心
图 2-6 用户中心
2.3.4地址管理
、
图 2-7 地址管理
2.3.5选择商品样式
图 2-8 商品选择样式
2.3.6商品详情信息
图 2-9 商品详情信息
2.3.7猜你喜欢
图 2-9 猜你喜欢
2.3.8购物车功能
图 2-10 购物车
2.3.9结算功能
图 2-11 结算
2.3.10订单页面
图 2-11 订单页面
3.部分实现代码
3.1.系统登录功能代码
3.1.1.前端调用代码
{% extends ‘base.html’ %}
{% block title %}
用户登录页面
{% endblock %}
{% block headerjs %}
{% endblock %}
{% block main %}
新用户登录
尊敬的用户,欢迎您回来!
{% endblock %}
{% block footerjs %}
{% endblock %}
3.1.2.后台处理代码
from future import unicode_literals
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.shortcuts import render
from django.views import View
from cart.cartmanager import SessionCartManager
from userapp.models import UserInfo, Area, Address
from utils.code import *
from django.core.serializers import serialize
class RegisterView(View):
def get(self,request):
return render(request,'register.html')
def post(self,request):
#获取请求参数
uname = request.POST.get('uname','')
pwd = request.POST.get('pwd','')
#插入数据库
user = UserInfo.objects.create(uname=uname,pwd=pwd)
#判断是否注册成功
if user:
#将用户信息存放至session对象中
request.session['user'] = user
return HttpResponseRedirect('/user/center/')
return HttpResponseRedirect('/user/register/')
class CheckUnameView(View):
def get(self,request):
#获取请求参数
uname = request.GET.get(‘uname’,’’)
#根据用户名去数据库中查询
userList = UserInfo.objects.filter(uname=uname)
flag = False
#判断是否存在
if userList:
flag = True
return JsonResponse({'flag':flag})
class CenterView(View):
def get(self,request):
return render(request,‘center.html’)
class LogoutView(View):
def post(self,request):
#删除session中登录用户信息
if ‘user’ in request.session:
del request.session[‘user’]
return JsonResponse({'delflag':True})
class LoginView(View):
def get(self,request):
#获取请求参数
red = request.GET.get('redirct','')
return render(request,'login.html',{'redirect':red})
def post(self,request):
#1.获取请求参数
uname = request.POST.get('uname','')
pwd = request.POST.get('pwd','')
#2.查询数据库中是否存在
userList = UserInfo.objects.filter(uname=uname,pwd=pwd)
if userList:
request.session['user'] = userList[0]
red = request.POST.get('redirect','')
if red == 'cart':
#将session中的购物项移动到数据库
SessionCartManager(request.session).migrateSession2DB()
return HttpResponseRedirect('/cart/queryAll/')
elif red == 'order':
return HttpResponseRedirect('/order/order.html?cartitems='+request.POST.get('cartitems',''))
return HttpResponseRedirect('/user/center/')
return HttpResponseRedirect('/user/login/')
class LoadCodeView(View):
def get(self,request):
img,str = gene_code()
#将生成的验证码存放至session中
request.session['sessionCode'] = str
return HttpResponse(img,content_type='image/png')
class CheckCodeView(View):
def get(self,request):
#获取输入框中的验证码
code = request.GET.get(‘code’,’’)
#获取生成的验证码
sessionCode = request.session.get('sessionCode',None)
#比较是否相等
flag = code == sessionCode
return JsonResponse({'checkFlag':flag})
class AddressView(View):
def get(self,request):
user = request.session.get(‘user’, ‘’)
# 获取当前登录用户的所有收货地址
addrList = user.address_set.all()
return render(request, 'address.html', {'addrList': addrList})
def post(self,request):
#获取请求参数
aname = request.POST.get('aname','')
aphone = request.POST.get('aphone','')
addr = request.POST.get('addr','')
user = request.session.get('user','')
#将数据插入数据库
address = Address.objects.create(aname=aname,aphone=aphone,addr=addr,userinfo=user,isdefault=(lambda count: True if count == 0 else False)(user.address_set.all().count()))
#获取当前登录用户的所有收货地址
addrList = user.address_set.all()
return render(request,'address.html',{'addrList':addrList})
class LoadAreaView(View):
def get(self,request):
#获取请求参数
pid = request.GET.get(‘pid’,-1)
pid = int(pid)
#根据父id查询区划信息
areaList = Area.objects.filter(parentid=pid)
#进行序列化
jareaList = serialize('json',areaList)
return JsonResponse({'jareaList':jareaList})
3.2.商品信息代码
3.2.1.前端调用代码
{% endblock %}
{% block main %}
{% for category in categorys %}
- {{ category.cname }}
{% endfor %}
{% for goods in goodsList %}
{% endfor %}
{% if goodsList.has_previous %}
上一页
{% endif %}
{% for page in pagelist %}
{{ page }}
{% endfor %}
{% if goodsList.has_next %}
下一页
{% endif %}
{% endblock %}
{% block footerjs %}
{% endblock %}
3.2.2.后台处理代码
from future import unicode_literals
from django.shortcuts import render
from django.views import View
from goods.models import *
from django.core.paginator import Paginator
import math
class IndexView(View):
def get(self,request,cid=1,num=1):
cid = int(cid)
num = int(num)
#查询所有类别信息
categorys = Category.objects.all().order_by('id')
#查询当前类别下的所有商品信息
goodsList = Goods.objects.filter(category_id=cid).order_by('id')
#分页(每页显示八条记录)
pager = Paginator(goodsList,8)
#获取当前页的数据
page_goodsList = pager.page(num)
# 每页开始页码
begin = (num - int(math.ceil(10.0 / 2)))
if begin < 1:
begin = 1
# 每页结束页码
end = begin + 9
if end > pager.num_pages:
end = pager.num_pages
if end <= 10:
begin = 1
else:
begin = end - 9
pagelist = range(begin, end + 1)
return render(request,'index.html',{'categorys':categorys,'goodsList':page_goodsList,'currentCid':cid,'pagelist':pagelist,'currentNum':num})
def recommend_view(func):
def wrapper(detailView,request,goodsid,*args,**kwargs):
#将存放在cookie中的goodsId获取
cookie_str = request.COOKIES.get(‘recommend’,’’)
#存放所有goodsid的列表
goodsIdList = [gid for gid in cookie_str.split() if gid.strip()]
#:最终需要获取的推荐商品
goodsObjList = [Goods.objects.get(id=gsid) for gsid in goodsIdList if gsid!=goodsid and Goods.objects.get(id=gsid).category_id==Goods.objects.get(id=goodsid).category_id][:4]
#将goodsObjList传递给get方法
response = func(detailView,request,goodsid,goodsObjList,*args,**kwargs)
#判断goodsid是否存在goodsIdList中
if goodsid in goodsIdList:
goodsIdList.remove(goodsid)
goodsIdList.insert(0,goodsid)
else:
goodsIdList.insert(0,goodsid)
#将goodsIdList中的数据保存到Cookie中
response.set_cookie('recommend',' '.join(goodsIdList),max_age=3*24*60*60)
return response
return wrapper
class DetailView(View):
@recommend_view
def get(self,request,goodsid,recommendList=[]):
goodsid = int(goodsid)
#根据goodsid查询商品详情信息(goods对象)
goods = Goods.objects.get(id=goodsid)
return render(request,'detail.html',{'goods':goods,'recommendList':recommendList})
3.3.购物车模块
3.3.1.前端调用代码
{% extends ‘base.html’ %}
{% block title %}购物车{% endblock %}
{% block main %}
-
全选
- 商品信息
- 商品参数
- 单价
- 数量
- 金额
- 操作
{% for cart in cartList %}
-
-
-
颜色:{{ cart.getColor.colorname }}
尺寸:{{ cart.getSize.sname }}
-
¥{{ cart.getGoods.price }}
-
-
¥{{ cart.getTotalPrice }}
-
{% endfor %}
{% csrf_token %}
{% endblock %}
{% block footerjs %}
{% endblock %}
3.3.2.后台处理代码
from future import unicode_literals
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.views import View
from cart.cartmanager import *
class AddCartView(View):
def post(self,request):
request.session.modifed=True
#1.获取当前操作类型
flag = request.POST.get('flag','')
#2.判断当前操作类型
if flag == 'add':
#创建cartManager对象
carManagerObj = getCartManger(request)
#加入购物车操作
carManagerObj.add(**request.POST.dict())
elif flag == 'plus':
# 创建cartManager对象
carManagerObj = getCartManger(request)
#修改商品的数量(添加)
carManagerObj.update(step=1,**request.POST.dict())
elif flag == 'minus':
# 创建cartManager对象
carManagerObj = getCartManger(request)
# 修改商品的数量(添加)
carManagerObj.update(step=-1, **request.POST.dict())
elif flag == 'delete':
# 创建cartManager对象
carManagerObj = getCartManger(request)
#逻辑删除购物车选项
carManagerObj.delete(**request.POST.dict())
return HttpResponseRedirect('/cart/queryAll/')
class CartListView(View):
def get(self,request):
# 创建cartManager对象
carManagerObj = getCartManger(request)
#查询所有购物项信息
cartList = carManagerObj.queryAll()
return render(request,'cart.html',{'cartList':cartList})
4.实验
4.1.数据库的搭建
该请假系统使用了四大类别的表
1.商品类:goods_goods(商品信息表)、goods_category(商品类别表)、goods_goodsdetail(商品详情表)、goods_goodsdetailname(商品详细名表)
goods_inventory(商品库存表)、goods_color(商品颜色表)、goods_size(商品尺寸)。
2.用户类:user_userinfo(用户信息表)、user_address(用户地址表)
3.订单类:order_order(订单表)、order_orderitem(订单项表)、
4.三级联动地区表 area(三级联动地区表)