计算机毕业设计选题推荐-网购平台-线上商城-Python项目实战

作者主页:IT毕设梦工厂✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目

一、前言

随着互联网技术的快速发展,线上购物已成为人们日常生活的重要组成部分。线上商城作为线上购物的核心平台,其用户体验和服务质量对消费者购买决策具有重要影响。因此,对线上商城的功能设计和优化成为了一个重要的研究课题。本课题从用户和管理人员两个角度出发,对线上商城的功能进行深入分析和研究,以提高其用户体验和服务质量。

目前,许多线上商城虽然提供了基本购物功能,但在用户体验、商品信息管理、公告信息管理、订单管理等方面存在不少问题。例如,用户无法快速找到所需商品、无法便捷地查看商品信息、无法及时获取公告信息、无法联系在线客服等。此外,管理人员在管理用户、商品分类、商品信息、公告信息等方面也存在一定的困难。这些问题不仅影响了用户的购物体验,也影响了线上商城的销售业绩。因此,本课题的研究对于解决这些问题具有重要意义。

本课题旨在设计和实现一个具有良好用户体验和管理功能的线上商城系统。具体来说,本课题的研究目的包括:
针对用户角色,提供商品信息查询、公告信息查看、在线客服沟通、购物车管理、我的订单查询、我的地址管理等基本功能;
针对管理人员角色,提供用户管理、商品分类管理、商品信息管理、公告信息管理、在线客服管理、订单管理等基本功能;
通过数据分析和挖掘,提高线上商城的运营效率和服务质量;
通过用户反馈和评价,不断优化线上商城的功能和服务。

本课题的研究意义在于提高线上商城的用户体验和服务质量,从而增强其市场竞争力。具体来说,本课题的研究意义包括:
提高用户体验:通过优化用户界面和交互设计,提高用户在使用线上商城时的便利性和舒适度;
提高服务质量:通过实现智能化推送和个性化服务,提高线上商城的服务水平;
增强市场竞争力:通过改进现有的功能和流程,提高线上商城的市场竞争力;
推动电子商务的发展:通过本课题的研究和实现,为电子商务的发展提供有益的参考和借鉴。

二、开发环境

  • 开发语言:Python
  • 数据库:MySQL
  • 系统架构:B/S
  • 后端:Django
  • 前端:Vue

三、系统功能模块

  • 角色:用户、管理员
  • 功能:
    用户
    商品信息、公告信息、在线客服、购物车、我的订单、我的地址;
    管理员
    用户管理、商品分类管理、商品信息管理、公告信息管理、在线客服、订单管理。

四、系统界面展示

  • 网购平台-线上商城系统界面展示:
    网购平台-线上商城-商品信息推荐
    网购平台-线上商城-商品信息
    网购平台-线上商城-商品信息详情
    网购平台-线上商城-我的订单
    网购平台-线上商城-购物车
    网购平台-线上商城-商个人中心
    网购平台-线上商城-商品分类管理
    网购平台-线上商城-商品信息管理
    网购平台-线上商城-订单管理-发货
    网购平台-线上商城-我的订单-收货

五、部分代码设计

  • Python项目实战-代码参考:
class CateView(Resource):
    def get(self):
        try:
            id = request.args.get('id')
            good = Goods.query.filter(Goods.id==id).first()
            if good:
                return to_dict_msg(200,good.to_dict(),'获取商品分类成功!')
            else:
                return to_dict_msg(10006)
        except Exception:
            return to_dict_msg(8888)
    
    def post(self):
        try:
            name = request.form.get('name') if request.form.get('name') else ''
            level = int(request.form.get('level')) if request.form.get('level') else 0
            pid = int(request.form.get('pid')) if request.form.get('pid') else None
            if name:
                if pid:
                    goods = Goods(name=name,level=level,pid=pid)
                else:
                    goods = Goods(name=name,level=level)
                db.session.add(goods)
                db.session.commit()
                return to_dict_msg(200,msg="增加商品分类成功")
            else:
                return to_dict_msg(10000)
        except Exception:
            return to_dict_msg(8888)

    def put(self):
        try:
            id = int(request.form.get('id'))
            name = request.form.get('name') if request.form.get('name') else ''
            goods = Goods.query.filter(Goods.id==id).first()
            if goods:
                goods.name = name
                db.session.commit()
                return to_dict_msg(200,goods.to_dict(),'修改商品分类名称成功!')
            else:
                return to_dict_msg(10006)
        except Exception:
            return to_dict_msg(8888)

    def delete(self):
        try:
            id = int(request.args.get('id'))
            goods = Goods.query.filter(Goods.id==id).first()
            if goods:
                db.session.delete(goods)
                db.session.commit()
                return to_dict_msg(200,msg='删除商品分类成功!')
            else:
                return to_dict_msg(10006)
        except Exception:
            return to_dict_msg(8888)



class GoodsView(Resource):
    def get(self):
        '''
        1. 先确定分不分页
        2. 再确定遍历哪一level
        3. 最后确定是否遍历子节点
        '''
        try:
            level = int(request.args.get('level')) if request.args.get('level') and  int(request.args.get('level')) <= 3 else 1
            children = int(request.args.get('children')) if request.args.get('children') else 3
            pnum = int(request.args.get('pnum')) if request.args.get('pnum') else 0
            psize = int(request.args.get('psize')) if request.args.get('psize') else 0
            name = request.args.get('name').strip()  if request.args.get('name') else ''
            goods_list = []
            # 如果没有传pnum和psize表示不分页
            if all([pnum,psize]):
                if name:
                    base_query = Goods.query.filter(Goods.name.like(f'%{name}%')).paginate(pnum,psize)
                else:    
                    base_query = Goods.query.filter(Goods.level==level).paginate(pnum,psize)
                totalPage = base_query.total
                goods_list = base_query.items
                rs_list = self.tree_iter(goods_list,level,children)
                return to_dict_msg(200,data={
                        'pnum': pnum,
                        'psize': psize,
                        'totalPage':totalPage,
                        'goods_list':rs_list
                        },msg='查询商品分类树成功!')
            else:
                if name:
                    goods_list = Goods.query.filter(Goods.name.like(f'%{name}%')).all()
                else:    
                    goods_list = Goods.query.filter(Goods.level==level).all()
                rs_list = self.tree_iter(goods_list,level,children)
                return to_dict_msg(200,data=rs_list,msg='查询商品分类树成功!')
        except Exception as e:
            return to_dict_msg(8888)

    def tree_iter(self,goods_list,level=1,children=3):
        '''
        input:
        ----
        goods_list: 商品分类列表
        level: 开始遍历的等级
        children: 遍历结束的等级
        如果不设置以上两个参数,默认全部遍历

        return:
        ---
        rs_list: 树形列表
        '''
        rs_list = []
        for i in goods_list:
            if level == children:
                i_dict = i.to_dict(children_list=False)
                rs_list.append(i_dict)
            else:
                i_dict = i.to_dict(children_list=True)
                i_dict['children'] = self.tree_iter(i.children,level=level+1,children=children)
                rs_list.append(i_dict)
        return rs_list

class GoodsAttributeView(Resource):
    def get(self):
        try:
            id = int(request.args.get('id'))
            attr = Attribute.query.filter(Attribute.id == id).first()
            if attr:
                return to_dict_msg(200,data=attr.to_dict(),msg='查询数据成功!')
            else:
                return to_dict_msg(10006)
        except Exception:
            return to_dict_msg(8888)

    def post(self):
        try:
            name = request.form.get('name').strip()  if request.form.get('name') else ''
            cid = int(request.form.get('cid')) if request.form.get('cid') else 0
            _type = request.form.get('_type') if request.form.get('_type') else 'static'
            val = request.form.get('val') if request.form.get('val') else ''
            if all([name,cid,_type]):
                if _type not in ['static','dynamic']:
                    return to_dict_msg(10010,msg='type属性只能是static或dynamic')
                if val:
                    attribute = Attribute(name=name,cid=cid,_type=_type,val=val)
                else:
                    attribute = Attribute(name=name,cid=cid,_type=_type)
                db.session.add(attribute)
                db.session.commit()
                return to_dict_msg(200,data=attribute.to_dict(),msg='新增分类属性成功!')
            else:
                return to_dict_msg(10010)
        except Exception:
            return to_dict_msg(8888)

    def put(self):
        try:
            id = int(request.form.get('id'))
            name = request.form.get('name').strip()  if request.form.get('name') else ''
            val = request.form.get('val') if request.form.get('val') else ''
            cid = int(request.form.get('cid')) if request.form.get('cid') else 0
            if all([id,name,cid]):
                attr = Attribute.query.filter(Attribute.id == id).first()
                if attr:
                    attr.name = name
                    attr.cid = cid
                    attr.val = val
                    db.session.commit()
                    return to_dict_msg(200,data=attr.to_dict(),msg='修改数据成功!')
                else:
                    return to_dict_msg(10006)
            else:
                return to_dict_msg(10000)
        except Exception:
            return to_dict_msg(8888)

    def delete(self):
        try:
            id = int(request.args.get('id'))
            attr = Attribute.query.filter(Attribute.id == id).first()
            if attr:
                db.session.delete(attr)
                db.session.commit()
                return to_dict_msg(200,msg='删除数据成功!')
            else:
                return to_dict_msg(10006)
        except Exception:
            return to_dict_msg(8888)

class AttributeListView(Resource):
    def get(self):
        try:
            cid = request.args.get('cid')
            _type = request.args.get('_type') if request.args.get('_type') else 'static'
            if all([cid,_type]):
                goods = Goods.query.filter(Goods.id==cid).first()
                attr_list = []
                if goods:
                    if _type == 'static':
                        attr_list = [a.to_dict() for a in goods.attrs if a._type=='static']
                    else:
                        attr_list = [a.to_dict() for a in goods.attrs if a._type=='dynamic']
                    return to_dict_msg(200,attr_list,'获取分类属性列表成功!')
                else:
                    return to_dict_msg(10006,msg="无此CID")
            else:
                return to_dict_msg(10000)
        except Exception:
            return to_dict_msg(8888)

class GoodsStatistics(Resource):
    def get(self):
        group_data = db.session.query(Goods.level,func.count(1).label('count')).group_by(Goods.level).having(Goods.level>0).all()
        data = {
            'legend_data': '数量',
            'xAxis_data': [f'{i[0]}级分类' for i in group_data],
            'series_data': [i[1] for i in group_data],
        }
        return to_dict_msg(200,data=data)


goods_api = Api(goods_bp)
goods_api.add_resource(CateView,'/cate/',endpoint='cate')
goods_api.add_resource(GoodsView,'/cate_list/',endpoint='cate_list')
goods_api.add_resource(AttributeListView,'/attr_list/',endpoint='attr_list')
goods_api.add_resource(GoodsAttributeView,'/attribute/',endpoint='attribute')
goods_api.add_resource(GoodsStatistics,'/statistics_level/',endpoint='statistics_level')
class ThingsView(Resource):
    def get(self):
        try:
            name = request.args.get('name').strip()
            pnum = int(request.args.get('pnum')) if request.args.get('pnum') else 1
            psize = int(request.args.get('psize'))  if request.args.get('psize') else 5
            if name:
                things = Things.query.filter(Things.name.like(f'%{name}%')).paginate(pnum,psize)
            else:
                things = Things.query.paginate(pnum,psize)
            data = {
                'pnum': pnum,
                'totalPage':things.total,
                'things':[i.to_dict() for i in things.items]
            }
            return to_dict_msg(200,data,'获取商品列表成功!')
        except Exception:
            return to_dict_msg(10002)

    def post(self):
        try:
            name = request.form.get('name')
            price = float(request.form.get('price'))
            number = int(request.form.get('number'))
            weight = int(request.form.get('weight'))
            cid_1 = int(request.form.get('cid_1'))
            cid_2 = int(request.form.get('cid_2'))
            cid_3 = int(request.form.get('cid_3'))
            pics = request.form.get('pics')
            introduce = request.form.get('introduce')
            staticAttrList = request.form.get('staticAttrList')
            dynamicAttrList = request.form.get('dynamicAttrList')
            if all([name,price,number,weight]):
                goods = Things(name=name,price=price,number=number,weight=weight,
                                cid_1=cid_1,cid_2=cid_2,cid_3=cid_3,introduce=introduce)
                db.session.add(goods)
                db.session.commit()
                for p in eval(pics):
                    pic = Picture(tid=goods.id,path=p)
                    db.session.add(pic)
                try:
                    for s in eval(staticAttrList):
                        static = ThingAttr(tid=goods.id,aid=s.get('id'),val=s.get('val'),_type='static')
                        db.session.add(static)
                except Exception:
                    return to_dict_msg(10000, msg='静态属性不全或填写有误')
                try:
                    for d in eval(dynamicAttrList):
                        dynamic = ThingAttr(tid=goods.id,aid=d.get('id'),val=d.get('val'),_type='dynamic')
                        db.session.add(dynamic)
                    db.session.commit()
                except Exception:
                    return to_dict_msg(10000, msg='动态属性不全或填写有误')
                return to_dict_msg(200,msg='添加商品成功')
            else:
                return to_dict_msg(10000)
        except Exception:
            return to_dict_msg(8888)

    def delete(self):
        try:
            id = int(request.args.get('id')) if request.args.get('id') else ''
            things = Things.query.filter(Things.id == id).first()
            if things:
                db.session.delete(things)
                db.session.commit()
                return to_dict_msg(200,msg='删除商品成功!')
            else:
                return to_dict_msg(10006)
        except Exception:
            return to_dict_msg(8888)

class GoodsImgView(Resource):
    def allowed_img(self,filename):
        return '.' in filename and filename.rsplit('.',1)[1] in current_app.config['ALLOWED_IMGS']
    
    def post(self):
        img_file = request.files.get('file')
        if img_file:
            if self.allowed_img(img_file.filename):
                floder = current_app.config['SERVER_IMG_UPLOADS']
                endfix = img_file.filename.rsplit('.',1)[1]
                file_name = md5_get()
                img_file.save(f'{floder}/{file_name}.{endfix}')
                data = {
                    'path': f'/static/img/{file_name}.{endfix}',
                    'url': f'http://127.0.0.1:5000/static/img/{file_name}.{endfix}',
                }
                return to_dict_msg(200,data,msg="上传图片成功")
            else:
                return to_dict_msg(10000,msg='上传图片格式失败')
        else:
            return to_dict_msg(10000,msg="请上传图片后再试")


things_api = Api(things_bp)
things_api.add_resource(ThingsView,'/things_list/',endpoint='things_list')
things_api.add_resource(GoodsImgView,'/upload_img/',endpoint='upload_img')
class LoginView(Resource):
    def get(self,msg = None):
        try:
            id = int(request.args.get('id').strip())
            user = User_login.query.filter(User_login.id==id).first()
            if user:
                return to_dict_msg(200,data=user.to_dict())
            else:
                return to_dict_msg(200,[],'没有此用户')
        except Exception:
            return to_dict_msg(10000)


    def post(self):
        uname = request.form.get('uname')
        pwd = request.form.get('pwd')
        # 下面这个可以避免空提交,造成数据库查询过大
        if not all([uname,pwd]):
            return to_dict_msg(10000)

        user = User_login.query.filter(User_login.uname == uname).first()
        if user:
            if user.check_password(pwd):
                # 创建token,然后返回给用户
                token = generate_auth_token(user.id,50000)
                return to_dict_msg(200,data={'token':token})
        return to_dict_msg(10001)

class RegisterView(Resource):
    # 重置密码操作
    def get(self,msg = None):
        try:
            id = int(request.args.get('id').strip())
            user = User_login.query.filter(User_login.id==id).first()
            if user:
                user.password = '123'
                db.session.commit()
            else:
                return to_dict_msg(10005)
            return to_dict_msg(200,msg='重置密码成功,密码为123')
        except Exception:
            return to_dict_msg(8888)

    def post(self):
        uname = request.form.get('uname')
        pwd = request.form.get('pwd')
        pwd2 = request.form.get('pwd2')
        nick_name = request.form.get('nick_name')
        age = request.form.get('age')
        tel = request.form.get('tel')
        email = request.form.get('email')
        rid = int(request.form.get('role_name')) if request.form.get('role_name') else 0
        # 下面这个可以避免空提交,造成数据库查询过大
        if not all([uname,pwd,pwd2,nick_name,tel,email]):
            return to_dict_msg(10010)

        # 如果手机号有一样的
        if User_login.query.filter(User_login.tel==tel).all():
            return to_dict_msg(10011)
        # 如果手机号不一样,用户名一样
        elif User_login.query.filter(User_login.uname == uname).all():
            return to_dict_msg(10012)
        # 如果手机号与用户名都不一样
        elif pwd != pwd2:
            return to_dict_msg(10013)
        elif not re.match(r'1[3-9]\d{9}',tel):
            return to_dict_msg(10014)
        elif not re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$',email):
            return to_dict_msg(10015)
        else:
            try:  
                # 注意要给password函数赋值
                user = User_login(uname=uname,password=pwd,nick_name=nick_name,age=age,tel=tel,email=email,rid=rid)
                db.session.add(user)
                db.session.commit()
                return to_dict_msg(200)
            except Exception:
                return to_dict_msg(10002)

    def put(self):
        # 修改数据操作
        try:
            id = int(request.form.get('id').strip())
            tel = (request.form.get('tel').strip()) if request.form.get('tel') else ''
            nick_name = (request.form.get('nick_name').strip()) if request.form.get('nick_name') else ''
            email = (request.form.get('email').strip()) if request.form.get('email') else ''
            rid = int(request.form.get('role_name').strip()) if request.form.get('role_name') else 0
            user = User_login.query.filter(User_login.id==id).first()
            if user:
                if tel:
                    user.tel = tel
                    user.nick_name = nick_name
                    user.email = email
                    user.rid = rid
                db.session.commit()
            else:
                return to_dict_msg(10005)
            return to_dict_msg(200,msg='修改数据成功!')
        except Exception:
            return to_dict_msg(8888)
    
    def delete(self):
        try:
            id = int(request.args.get('id').strip())
            user = User_login.query.filter(User_login.id==id).first()
            if user:
                db.session.delete(user)
                db.session.commit()
            else:
                return to_dict_msg(10005)
            return to_dict_msg(200,msg='删除用户成功!')
        except Exception:
            return to_dict_msg(8888)
    

class UserView(Resource):
    @login_required
    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('uname',type=str)
        parser.add_argument('punm',type=int)
        parser.add_argument('psize',type=int)
        try:
            args = parser.parse_args()
            name = args.get('uname')
            pnum = args.get('pnum') if args.get('pnum') else 1
            psize = args.get('psize')  if args.get('psize') else 5
            if name:
                users = User_login.query.filter(User_login.uname.like(f'%{name}%')).paginate(pnum,psize)
            else:
                users = User_login.query.paginate(pnum,psize)
            data = {
                'pnum': pnum,
                'totalPage':users.total,
                'users':[i.to_dict() for i in users.items]
            }
        except Exception:
            return to_dict_msg(10000)
        return to_dict_msg(200,data,'获取用户列表成功')



user_api = Api(user_bp)
user_api.add_resource(LoginView,'/login/',endpoint='login')
user_api.add_resource(RegisterView,'/register/',endpoint='register')
user_api.add_resource(UserView,'/user_list/',endpoint='user_list')

六、论文参考

  • 计算机毕业设计选题推荐_网购平台-线上商城系统-论文参考:
    计算机毕业设计选题推荐_网购平台-线上商城系统-论文参考

七、系统视频

网购平台-线上商城系统-项目视频:

Python项目实战:网购平台-线上商城-选题推荐

结语

Python项目实战:网购平台-线上商城-计算机毕业设计选题推荐
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:私信我

精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值