博主介绍:
✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生完成毕业项目和技术提升。技术范围:
我熟悉的技术领域涵盖SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等方面的设计与开发。如果你有任何技术难题,我都乐意与你分享解决方案。主要内容:
我的服务内容包括:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文撰写与辅导、论文降重、长期答辩答疑辅导。此外,我还提供腾讯会议一对一的专业讲解和模拟答辩演练,帮助你全面掌握答辩技巧与代码逻辑。🍅获取源码请在文末联系我🍅
如果你对我的内容感兴趣,记得先收藏!对于毕设选题、项目开发或论文撰写等相关问题,随时欢迎留言咨询,我会尽力帮助更多同学顺利完成学业。
最主要的是免费咨询相关问题!!
文档学习资料:
系统简介:
在当前的网络购物时代,消费者经常面临着在众多在线商城中比较商品价格以寻找性价比最高产品的挑战。为了解决这一问题,开发出了一种基于Python的网上商城比价系统。
该系统利用Python语言开发,结合Django框架和MySQL数据库,以及爬虫技术,有效地从不同的电商平台收集商品数据,进行价格、好评率及综合评价的比较。系统特别为用户设计了友好的界面,包括商品搜索、比价、用户注册与登录、个人中心、收藏功能以及交流论坛等,旨在为用户提供全面的购物决策支持。管理员端包含系统管理、用户和商品信息管理、爬虫配置等功能,确保系统的高效运行和数据的实时更新。这个项目不仅提升了在线购物的便利性和效率,也为消费者节省了宝贵的时间和金钱,它展示了数据爬取和分析技术在电子商务领域的实际应用价值。
.
核心技术介绍
Mysql技术介绍
MySQL是一种流行的开源关系型数据库管理系统,广泛应用于各种网站和应用程序中,以其高性能、高可靠性和易用性著称。作为一个关系数据库,MySQL允许存储数据在不同的表中,而这些表又可以通过关键字相互关联,这样的结构便于高效地组织和检索大量数据。安装MySQL过程简洁[4],支持多种操作系统,如Linux、Windows等,能够适应多种不同的应用环境和需求。
MySQL提供了丰富的数据类型,支持复杂的查询、事务处理、索引创建等功能,这些特性使得MySQL能够快速地处理大量数据,保证数据的完整性和一致性。通过添加索引,MySQL能够加速查询速度,优化数据访问性能。此外,MySQL具有良好的可扩展性和灵活性,支持分布式数据库,可以通过增加硬件和配置进行横向扩展,满足大数据量处理的需求。
MySQL还具有强大的安全机制,包括权限认证和加密,保障数据安全。用户通过账号和密码登录,可以对数据库进行操作,这属于典型的客户端-服务器(C/S)模型。对于数据库的管理和维护[5],MySQL提供了图形界面工具,如MySQL Workbench,这些工具使得数据库的设计、管理和优化变得更加直观和方便。
Python语言介绍
Python是一种高级编程语言,以其简洁明了的语法和强大的可读性而闻名,被广泛应用于各种软件开发领域,包括网页和应用程序开发、数据分析、人工智能等。Python的设计哲学强调代码的可读性和简洁的语法,其允许程序员使用更少的代码行来表达想法,相比其他编程语言,Python使得开发过程更加快速和高效。
Python是一种解释型语言,意味着开发者可以在编码时即时运行程序,方便快捷地测试和调试代码。它支持多种编程范式,包括面向对象、命令式、函数式和过程式编程,使得Python非常灵活,能够满足不同的编程需求。Python具有丰富的标准库和第三方库,覆盖网络服务、文本处理、数据序列化、数据库接口、数学运算等多个领域,极大地扩展了Python的应用范围[6]。
Python的另一个显著特点是其开源性质,拥有一个活跃的社区,为用户提供大量的资源、工具和文档,促进了知识的共享和技术的快速发展。社区成员贡献的各种库和框架,如Django、Flask等,进一步简化了网页和应用程序的开发过程。
在开发基于Python的网上商城比价系统时,Python的这些特性——易于学习和使用、强大的库支持、灵活的编程范式以及丰富的社区资源,都能够提高开发效率,帮助快速实现系统功能。选择Python作为开发语言,对于本项目来说是一个理想的选择。
Django框架简介
Django框架是一个开源的高级Python Web框架,旨在快速开发安全和维护性高的网站。它采用了“不重复自己”(DRY)的设计哲学,鼓励快速开发,减少代码重复。Django的出现时间是在2005年,自那以后,经过不断的发展和完善,成为了一款广泛应用于各种网页和应用程序开发的框架。
Django框架提供了一整套Web开发所需的功能,包括但不限于用户认证、内容管理、站点地图、RSS订阅等。它的核心组成部分包括用于创建模型的对象关系映射(ORM),能够将写好的Python类转换为数据库表[7];一个功能强大的自动化管理工具,用于执行各种网站管理任务;以及一个可扩展的URL分发器,允许设计干净、易于维护的URL结构。
Django遵循MVC(模型-视图-控制器)架构,但在Django中通常被称为模型-模板-视图(MTV)。模型定义了数据的结构,模板负责如何展示页面,而视图则是业务逻辑的所在,处理用户请求并返回响应。这种分离的设计使得Django项目易于管理和扩展。
Django还注重安全性,内置了多种安全功能,如跨站请求伪造(CSRF)保护、SQL注入防护等,帮助开发者构建安全的网站。此外,Django有一个活跃的开源社区,提供大量的第三方包,可以扩展Django的功能,满足几乎所有的Web开发需求。
Django框架以其全面的功能、高效的开发流程和强大的社区支持,在Web开发领域享有极高的声誉,是开发基于Python的网上商城比价系统的理想选择。
Scrapy框架简介
Scrapy框架是一个快速、高层次的Web爬虫和网页抓取框架,用于抓取网站数据并从页面中提取结构化的数据。它是用Python编写的,为需要进行数据抓取和处理的应用提供了一个完整的工具集。Scrapy框架以其强大的功能和灵活性而闻名,特别适用于数据挖掘、监测和自动化测试等领域[8]。
Scrapy采用了一种基于Twisted的异步处理框架,使得它能够以非阻塞的方式处理数千个并发请求,显著提高了抓取效率。它定义了一套丰富的API,让用户可以方便地编写爬虫规则。这些规则包括如何跟踪网页链接、如何提取和处理数据等。Scrapy还提供了数据管道的概念,允许开发者通过定义一系列的处理模块来清洗、验证和存储抓取的数据。
Scrapy的架构是组件化的,主要包括引擎、调度器、下载器、爬虫、项目管道、中间件等部分。这种设计使得Scrapy在功能上非常灵活,开发者可以根据需要自定义或扩展各个组件。例如,通过编写不同的中间件,可以轻松实现请求代理、用户代理旋转、cookies管理等高级功能[9]。
此外,Scrapy还提供了强大的选择器(Selector)功能,支持XPath和CSS选择器,这使得从复杂的网页中提取数据变得简单直接。它还内置了对多种输出格式的支持,包括JSON、CSV和XML等,方便数据的后续处理和分析。
Scrapy框架以其高效的数据抓取能力、强大的定制性以及广泛的社区支持,成为开发复杂且高性能的爬虫项目的优选框架。在基于Python的网上商城比价系统中,利用Scrapy进行数据爬取和处理,能够有效地从各大电商平台获取商品信息,为系统提供丰富的数据资源。
Hadoop介绍
Hadoop是一个开源的软件框架,旨在用于分布式存储和处理大规模数据集的计算。它基于Google的MapReduce算法和Google文件系统(GFS)的概念设计而成,现在由Apache软件基金会进行维护。Hadoop能够在普通的硬件集群上运行,提供了一个高度可扩展和可靠的环境[10]。
Hadoop框架主要包括Hadoop分布式文件系统(HDFS)和Hadoop MapReduce。HDFS是一个高度容错的系统,用于存储数据,可以在成百上千的节点上运行,实现了高吞吐量的数据访问,非常适合那些有大量数据集的应用程序。MapReduce是一个计算模型和软件框架,用于编写能在大规模数据集上并行运行的应用程序。
由于Hadoop的设计允许用户在不同的层次上对框架进行控制,它非常适合于进行复杂的数据分析、数据挖掘和机器学习任务。Hadoop已经成为处理大数据问题的事实标准,被广泛应用于互联网企业、科研机构和其他需要处理大量数据的场合。
随着大数据时代的到来,Hadoop的重要性愈发凸显。它不仅能够处理结构化数据,也非常适合处理半结构化或非结构化数据[10],Hadoop生态系统已经发展出了一系列的项目,如Hive、Pig、HBase等,这些项目进一步扩展了Hadoop的应用范围,使得用户可以更方便地进行数据分析和处理。
在基于Python的网上商城比价系统中,虽然直接使用Hadoop并不是必需的,但对于处理和分析大量电商数据,特别是在需要进行复杂的数据处理任务时,利用Hadoop的分布式计算和存储能力可以显著提高效率和准确性。
系统概述
网上商城比价系统的设计与开发是指对该系统的各个功能模块进行详细设计,力求每个模块都能够满足用户的要求,系统开发完成后还需对系统进行单元测试和系统测试,发现系统中存在的问题并解决,确保系统正常稳定的运行。网上商城比价系统工作原理图如图4.1所示:
系统结构设计
系统结构设计必须要满足用户的业务需求,系统结构设计完成后要形成系统结构设计文档,开发人员就可根据模块接口说明进行接口开发,接口开发完需进行功能测试,目的是发现并解决系统漏洞,同时还得保证系统的可扩展性和稳定性,满足用户对系统的要求。系统设计需满足以下要求,如下图4.2系统结构框架图。
系统详细介绍:
详细视频可以咨询下方视频咨询我!
实现代码:
#coding:utf-8
__author__ = "ila"
import base64, copy, logging, os, sys, time, xlrd, json, datetime, configparser
from django.http import JsonResponse
from django.apps import apps
from django.db.models.aggregates import Count,Sum
from django.db.models import Case, When, IntegerField, F
from django.forms import model_to_dict
from .models import discussxinpintuijian
from util.codes import *
from util.auth import Auth
from util.common import Common
import util.message as mes
from django.db import connection
import random
from django.core.mail import send_mail
from django.conf import settings
from django.shortcuts import redirect
from django.db.models import Q
from util.baidubce_api import BaiDuBce
from .config_model import config
from dj2.settings import executor
from util.spark_func import spark_read_mysqldef discussxinpintuijian_register(request):if request.method in ["POST", "GET"]:msg = {'code': normal_code, "msg": mes.normal_code}req_dict = request.session.get("req_dict")error = discussxinpintuijian.createbyreq(discussxinpintuijian, discussxinpintuijian, req_dict)if error != None:msg['code'] = crud_error_codemsg['msg'] = "用户已存在,请勿重复注册!"return JsonResponse(msg)def discussxinpintuijian_login(request):if request.method in ["POST", "GET"]:msg = {'code': normal_code, "msg": mes.normal_code}req_dict = request.session.get("req_dict")datas = discussxinpintuijian.getbyparams(discussxinpintuijian, discussxinpintuijian, req_dict)if not datas:msg['code'] = password_error_codemsg['msg'] = mes.password_error_codereturn JsonResponse(msg)try:__sfsh__= discussxinpintuijian.__sfsh__except:__sfsh__=Noneif __sfsh__=='是':if datas[0].get('sfsh')!='是':msg['code']=other_codemsg['msg'] = "账号已锁定,请联系管理员审核!"return JsonResponse(msg)req_dict['id'] = datas[0].get('id')return Auth.authenticate(Auth, discussxinpintuijian, req_dict)def discussxinpintuijian_logout(request):if request.method in ["POST", "GET"]:msg = {"msg": "登出成功","code": 0}return JsonResponse(msg)def discussxinpintuijian_resetPass(request):''''''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code}req_dict = request.session.get("req_dict")columns= discussxinpintuijian.getallcolumn( discussxinpintuijian, discussxinpintuijian)try:__loginUserColumn__= discussxinpintuijian.__loginUserColumn__except:__loginUserColumn__=Noneusername=req_dict.get(list(req_dict.keys())[0])if __loginUserColumn__:username_str=__loginUserColumn__else:username_str=usernameif 'mima' in columns:password_str='mima'else:password_str='password'init_pwd = '123456'recordsParam = {}recordsParam[username_str] = req_dict.get("username")records=discussxinpintuijian.getbyparams(discussxinpintuijian, discussxinpintuijian, recordsParam)if len(records)<1:msg['code'] = 400msg['msg'] = '用户不存在'return JsonResponse(msg)eval('''discussxinpintuijian.objects.filter({}='{}').update({}='{}')'''.format(username_str,username,password_str,init_pwd))return JsonResponse(msg)def discussxinpintuijian_session(request):''''''if request.method in ["POST", "GET"]:msg = {"code": normal_code,"msg": mes.normal_code, "data": {}}req_dict={"id":request.session.get('params').get("id")}msg['data'] = discussxinpintuijian.getbyparams(discussxinpintuijian, discussxinpintuijian, req_dict)[0]return JsonResponse(msg)def discussxinpintuijian_default(request):if request.method in ["POST", "GET"]:msg = {"code": normal_code,"msg": mes.normal_code, "data": {}}req_dict = request.session.get("req_dict")req_dict.update({"isdefault":"是"})data=discussxinpintuijian.getbyparams(discussxinpintuijian, discussxinpintuijian, req_dict)if len(data)>0:msg['data'] = data[0]else:msg['data'] = {}return JsonResponse(msg)def discussxinpintuijian_page(request):''''''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}req_dict = request.session.get("req_dict")global discussxinpintuijian#获取全部列名columns= discussxinpintuijian.getallcolumn( discussxinpintuijian, discussxinpintuijian)if "vipread" in req_dict and "vipread" not in columns:del req_dict["vipread"]#当前登录用户所在表tablename = request.session.get("tablename")#authColumn=list(__authTables__.keys())[0]#authTable=__authTables__.get(authColumn)# if authTable==tablename:#params = request.session.get("params")#req_dict[authColumn]=params.get(authColumn)'''__authSeparate__此属性为真,params添加userid,后台只查询个人数据'''try:__authSeparate__=discussxinpintuijian.__authSeparate__except:__authSeparate__=Noneif __authSeparate__=="是":tablename=request.session.get("tablename")if tablename!="users" and 'userid' in columns:try:req_dict['userid']=request.session.get("params").get("id")except:pass#当项目属性hasMessage为”是”,生成系统自动生成留言板的表messages,同时该表的表属性hasMessage也被设置为”是”,字段包括userid(用户id),username(用户名),content(留言内容),reply(回复)#接口page需要区分权限,普通用户查看自己的留言和回复记录,管理员查看所有的留言和回复记录try:__hasMessage__=discussxinpintuijian.__hasMessage__except:__hasMessage__=Noneif __hasMessage__=="是":tablename=request.session.get("tablename")if tablename!="users":req_dict["userid"]=request.session.get("params").get("id")# 判断当前表的表属性isAdmin,为真则是管理员表# 当表属性isAdmin=”是”,刷出来的用户表也是管理员,即page和list可以查看所有人的考试记录(同时应用于其他表)__isAdmin__ = NoneallModels = apps.get_app_config('main').get_models()for m in allModels:if m.__tablename__==tablename:try:__isAdmin__ = m.__isAdmin__except:__isAdmin__ = Nonebreak# 当前表也是有管理员权限的表if __isAdmin__ == "是" and 'discussxinpintuijian' != 'forum':if req_dict.get("userid") and 'discussxinpintuijian' != 'chat':del req_dict["userid"]else:#非管理员权限的表,判断当前表字段名是否有useridif tablename!="users" and 'discussxinpintuijian'[:7]!='discuss'and "userid" in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian):req_dict["userid"] = request.session.get("params").get("id")#当列属性authTable有值(某个用户表)[该列的列名必须和该用户表的登陆字段名一致],则对应的表有个隐藏属性authTable为”是”,那么该用户查看该表信息时,只能查看自己的try:__authTables__=discussxinpintuijian.__authTables__except:__authTables__=Noneif __authTables__!=None and __authTables__!={} and __isAdmin__ == "是":try:del req_dict['userid']# tablename=request.session.get("tablename")# if tablename=="users":# del req_dict['userid']except:passfor authColumn,authTable in __authTables__.items():if authTable==tablename:params = request.session.get("params")req_dict[authColumn]=params.get(authColumn)username=params.get(authColumn)breakq = Q()msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \msg['data']['pageSize'] =discussxinpintuijian.page(discussxinpintuijian, discussxinpintuijian, req_dict, request, q)return JsonResponse(msg)def discussxinpintuijian_autoSort(request):'''.智能推荐功能(表属性:[intelRecom(是/否)],新增clicktime[前端不显示该字段]字段(调用info/detail接口的时候更新),按clicktime排序查询)
主要信息列表(如商品列表,新闻列表)中使用,显示最近点击的或最新添加的5条记录就行'''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}req_dict = request.session.get("req_dict")if "clicknum" in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian):req_dict['sort']='clicknum'elif "browseduration" in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian):req_dict['sort']='browseduration'else:req_dict['sort']='clicktime'req_dict['order']='desc'msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \msg['data']['pageSize'] = discussxinpintuijian.page(discussxinpintuijian,discussxinpintuijian, req_dict)return JsonResponse(msg)#分类列表
def discussxinpintuijian_lists(request):if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data":[]}msg['data'],_,_,_,_ = discussxinpintuijian.page(discussxinpintuijian, discussxinpintuijian, {})return JsonResponse(msg)def discussxinpintuijian_list(request):'''前台分页'''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data":{"currPage":1,"totalPage":1,"total":1,"pageSize":10,"list":[]}}req_dict = request.session.get("req_dict")#获取全部列名columns= discussxinpintuijian.getallcolumn( discussxinpintuijian, discussxinpintuijian)if "vipread" in req_dict and "vipread" not in columns:del req_dict["vipread"]#表属性[foreEndList]前台list:和后台默认的list列表页相似,只是摆在前台,否:指没有此页,是:表示有此页(不需要登陆即可查看),前要登:表示有此页且需要登陆后才能查看try:__foreEndList__=discussxinpintuijian.__foreEndList__except:__foreEndList__=Noneif __foreEndList__=="前要登":tablename=request.session.get("tablename")if tablename!="users" and 'userid' in columns:try:req_dict['userid']=request.session.get("params").get("id")except:pass#forrEndListAuthtry:__foreEndListAuth__=discussxinpintuijian.__foreEndListAuth__except:__foreEndListAuth__=None#authSeparatetry:__authSeparate__=discussxinpintuijian.__authSeparate__except:__authSeparate__=Noneif __foreEndListAuth__ =="是" and __authSeparate__=="是":tablename=request.session.get("tablename")if tablename!="users":req_dict['userid']=request.session.get("params",{"id":0}).get("id")tablename = request.session.get("tablename")if tablename == "users" and req_dict.get("userid") != None:#判断是否存在userid列名del req_dict["userid"]else:__isAdmin__ = NoneallModels = apps.get_app_config('main').get_models()for m in allModels:if m.__tablename__==tablename:try:__isAdmin__ = m.__isAdmin__except:__isAdmin__ = Nonebreakif __isAdmin__ == "是":if req_dict.get("userid"):# del req_dict["userid"]passelse:#非管理员权限的表,判断当前表字段名是否有useridif "userid" in columns:try:passexcept:pass#当列属性authTable有值(某个用户表)[该列的列名必须和该用户表的登陆字段名一致],则对应的表有个隐藏属性authTable为”是”,那么该用户查看该表信息时,只能查看自己的try:__authTables__=discussxinpintuijian.__authTables__except:__authTables__=Noneif __authTables__!=None and __authTables__!={} and __foreEndListAuth__=="是":for authColumn,authTable in __authTables__.items():if authTable==tablename:try:del req_dict['userid']except:passparams = request.session.get("params")req_dict[authColumn]=params.get(authColumn)username=params.get(authColumn)breakif discussxinpintuijian.__tablename__[:7]=="discuss":try:del req_dict['userid']except:passq = Q()msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \msg['data']['pageSize'] = discussxinpintuijian.page(discussxinpintuijian, discussxinpintuijian, req_dict, request, q)return JsonResponse(msg)def discussxinpintuijian_save(request):'''后台新增'''request.funname = __name__+"."+discussxinpintuijian_save.__name__request.operation = "新增新品推荐评论表"if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}req_dict = request.session.get("req_dict")if 'clicktime' in req_dict.keys():del req_dict['clicktime']tablename=request.session.get("tablename")__isAdmin__ = NoneallModels = apps.get_app_config('main').get_models()for m in allModels:if m.__tablename__==tablename:try:__isAdmin__ = m.__isAdmin__except:__isAdmin__ = Nonebreak#获取全部列名columns= discussxinpintuijian.getallcolumn( discussxinpintuijian, discussxinpintuijian)if tablename!='users' and req_dict.get("userid")!=None and 'userid' in columns and __isAdmin__!='是':params=request.session.get("params")req_dict['userid']=params.get('id')if 'addtime' in req_dict.keys():del req_dict['addtime']error= discussxinpintuijian.createbyreq(discussxinpintuijian,discussxinpintuijian, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn JsonResponse(msg)def discussxinpintuijian_add(request):'''前台新增'''request.funname = __name__+"."+discussxinpintuijian_add.__name__request.operation = "新增新品推荐评论表"if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}req_dict = request.session.get("req_dict")tablename=request.session.get("tablename")#获取全部列名columns= discussxinpintuijian.getallcolumn( discussxinpintuijian, discussxinpintuijian)try:__authSeparate__=discussxinpintuijian.__authSeparate__except:__authSeparate__=Noneif __authSeparate__=="是":tablename=request.session.get("tablename")if tablename!="users" and 'userid' in columns:try:req_dict['userid']=request.session.get("params").get("id")except:passtry:__foreEndListAuth__=discussxinpintuijian.__foreEndListAuth__except:__foreEndListAuth__=Noneif __foreEndListAuth__ and __foreEndListAuth__!="否":tablename=request.session.get("tablename")if tablename!="users":req_dict['userid']=request.session.get("params").get("id")if 'addtime' in req_dict.keys():del req_dict['addtime']error= discussxinpintuijian.createbyreq(discussxinpintuijian,discussxinpintuijian, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn JsonResponse(msg)def discussxinpintuijian_thumbsup(request,id_):'''点赞:表属性thumbsUp[是/否],刷表新增thumbsupnum赞和crazilynum踩字段,'''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}req_dict = request.session.get("req_dict")id_=int(id_)type_=int(req_dict.get("type",0))rets=discussxinpintuijian.getbyid(discussxinpintuijian,discussxinpintuijian,id_)update_dict={"id":id_,}if type_==1:#赞update_dict["thumbsupnum"]=int(rets[0].get('thumbsupnum'))+1elif type_==2:#踩update_dict["crazilynum"]=int(rets[0].get('crazilynum'))+1error = discussxinpintuijian.updatebyparams(discussxinpintuijian,discussxinpintuijian, update_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn JsonResponse(msg)def discussxinpintuijian_info(request,id_):''''''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}data = discussxinpintuijian.getbyid(discussxinpintuijian,discussxinpintuijian, int(id_))if len(data)>0:msg['data']=data[0]if msg['data'].__contains__("reversetime"):if isinstance(msg['data']['reversetime'], datetime.datetime):msg['data']['reversetime'] = msg['data']['reversetime'].strftime("%Y-%m-%d %H:%M:%S")else:if msg['data']['reversetime'] != None:reversetime = datetime.datetime.strptime(msg['data']['reversetime'], '%Y-%m-%d %H:%M:%S')msg['data']['reversetime'] = reversetime.strftime("%Y-%m-%d %H:%M:%S")#浏览点击次数try:__browseClick__= discussxinpintuijian.__browseClick__except:__browseClick__=Noneif __browseClick__=="是" and "clicknum" in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian):try:clicknum=int(data[0].get("clicknum",0))+1except:clicknum=0+1click_dict={"id":int(id_),"clicknum":clicknum}ret=discussxinpintuijian.updatebyparams(discussxinpintuijian,discussxinpintuijian,click_dict)if ret!=None:msg['code'] = crud_error_codemsg['msg'] = retreturn JsonResponse(msg)def discussxinpintuijian_detail(request,id_):''''''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}data =discussxinpintuijian.getbyid(discussxinpintuijian,discussxinpintuijian, int(id_))if len(data)>0:msg['data']=data[0]if msg['data'].__contains__("reversetime"):if isinstance(msg['data']['reversetime'], datetime.datetime):msg['data']['reversetime'] = msg['data']['reversetime'].strftime("%Y-%m-%d %H:%M:%S")else:if msg['data']['reversetime'] != None:reversetime = datetime.datetime.strptime(msg['data']['reversetime'], '%Y-%m-%d %H:%M:%S')msg['data']['reversetime'] = reversetime.strftime("%Y-%m-%d %H:%M:%S")#浏览点击次数try:__browseClick__= discussxinpintuijian.__browseClick__except:__browseClick__=Noneif __browseClick__=="是" and "clicknum" in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian):try:clicknum=int(data[0].get("clicknum",0))+1except:clicknum=0+1click_dict={"id":int(id_),"clicknum":clicknum}ret=discussxinpintuijian.updatebyparams(discussxinpintuijian,discussxinpintuijian,click_dict)if ret!=None:msg['code'] = crud_error_codemsg['msg'] = retreturn JsonResponse(msg)def discussxinpintuijian_update(request):''''''request.funname = __name__+"."+discussxinpintuijian_update.__name__request.operation = "更新新品推荐评论表"if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}req_dict = request.session.get("req_dict")if 'clicktime' in req_dict.keys() and req_dict['clicktime']=="None":del req_dict['clicktime']if req_dict.get("mima") and "mima" not in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian) :del req_dict["mima"]if req_dict.get("password") and "password" not in discussxinpintuijian.getallcolumn(discussxinpintuijian,discussxinpintuijian) :del req_dict["password"]try:del req_dict["clicknum"]except:passerror = discussxinpintuijian.updatebyparams(discussxinpintuijian, discussxinpintuijian, req_dict)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn JsonResponse(msg)def discussxinpintuijian_delete(request):'''批量删除'''request.funname = __name__+"."+discussxinpintuijian_delete.__name__request.operation = "删除新品推荐评论表"if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}req_dict = request.session.get("req_dict")error=discussxinpintuijian.deletes(discussxinpintuijian,discussxinpintuijian,req_dict.get("ids"))if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn JsonResponse(msg)def discussxinpintuijian_vote(request,id_):'''浏览点击次数(表属性[browseClick:是/否],点击字段(clicknum),调用info/detail接口的时候后端自动+1)、投票功能(表属性[vote:是/否],投票字段(votenum),调用vote接口后端votenum+1)
统计商品或新闻的点击次数;提供新闻的投票功能'''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": mes.normal_code}data= discussxinpintuijian.getbyid(discussxinpintuijian, discussxinpintuijian, int(id_))for i in data:votenum=i.get('votenum')if votenum!=None:params={"id":int(id_),"votenum":votenum+1}error=discussxinpintuijian.updatebyparams(discussxinpintuijian,discussxinpintuijian,params)if error!=None:msg['code'] = crud_error_codemsg['msg'] = errorreturn JsonResponse(msg)def discussxinpintuijian_importExcel(request):request.funname = __name__+"."+discussxinpintuijian_importExcel.__name__request.operation = "导入新品推荐评论表"if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": {}}excel_file = request.FILES.get("file", "")file_type = excel_file.name.split('.')[1]if file_type in ['xlsx', 'xls']:data = xlrd.open_workbook(filename=None, file_contents=excel_file.read())table = data.sheets()[0]rows = table.nrowstry:for row in range(1, rows):row_values = table.row_values(row)req_dict = {}discussxinpintuijian.createbyreq(discussxinpintuijian, discussxinpintuijian, req_dict)except:passelse:msg = {"msg": "文件类型错误","code": 500}return JsonResponse(msg)def discussxinpintuijian_autoSort2(request):return JsonResponse({"code": 0, "msg": '', "data":{}})# (按值统计)时间统计类型
def discussxinpintuijian_value(request, xColumnName, yColumnName, timeStatType):if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": {}}where = ' where 1 = 1 'sql = ''if timeStatType == '日':sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, sum({1}) total FROM discussxinpintuijian {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d')".format(xColumnName, yColumnName, where, '%Y-%m-%d')if timeStatType == '月':sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, sum({1}) total FROM discussxinpintuijian {2} GROUP BY DATE_FORMAT({0}, '%Y-%m')".format(xColumnName, yColumnName, where, '%Y-%m')if timeStatType == '年':sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, sum({1}) total FROM discussxinpintuijian {2} GROUP BY DATE_FORMAT({0}, '%Y')".format(xColumnName, yColumnName, where, '%Y')func_name = sys._getframe().f_code.co_nametable_name = func_name.split('_')[0]json_filename=f'{table_name}_value_{xColumnName}_{yColumnName}.json'if os.path.exists(json_filename) == True:with open(json_filename, encoding='utf-8') as f:msg['data'] = json.load(f)else:L = []cursor = connection.cursor()cursor.execute(sql)desc = cursor.descriptiondata_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]for online_dict in data_dict:for key in online_dict:if 'datetime.datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d %H:%M:%S")else:passL.append(online_dict)msg['data'] = Lexecutor.submit(spark_read_mysql, f"({sql}) {table_name}", json_filename)return JsonResponse(msg)# 按值统计
def discussxinpintuijian_o_value(request, xColumnName, yColumnName):if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": {}}where = ' where 1 = 1 'sql = "SELECT {0}, sum({1}) AS total FROM discussxinpintuijian {2} GROUP BY {0} LIMIT 10".format(xColumnName, yColumnName, where)func_name = sys._getframe().f_code.co_nametable_name = func_name.split('_')[0]json_filename = f'{table_name}_o_value_{xColumnName}_{yColumnName}.json'if os.path.exists(json_filename) == True:with open(json_filename, encoding='utf-8') as f:msg['data'] = json.load(f)else:L = []cursor = connection.cursor()cursor.execute(sql)desc = cursor.descriptiondata_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]for online_dict in data_dict:for key in online_dict:if 'datetime.datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d %H:%M:%S")else:passL.append(online_dict)msg['data'] = Lexecutor.submit(spark_read_mysql, f"({sql}) {table_name}", json_filename)return JsonResponse(msg)# (按值统计)时间统计类型(多)
def discussxinpintuijian_valueMul(request, xColumnName, timeStatType):if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": []}req_dict = request.session.get("req_dict")where = ' where 1 = 1 'for item in req_dict['yColumnNameMul'].split(','):sql = ''if timeStatType == '日':sql = "SELECT DATE_FORMAT({0}, '%Y-%m-%d') {0}, sum({1}) total FROM discussxinpintuijian {2} GROUP BY DATE_FORMAT({0}, '%Y-%m-%d') LIMIT 10".format(xColumnName, item, where, '%Y-%m-%d')if timeStatType == '月':sql = "SELECT DATE_FORMAT({0}, '%Y-%m') {0}, sum({1}) total FROM discussxinpintuijian {2} GROUP BY DATE_FORMAT({0}, '%Y-%m') LIMIT 10".format(xColumnName, item, where, '%Y-%m')if timeStatType == '年':sql = "SELECT DATE_FORMAT({0}, '%Y') {0}, sum({1}) total FROM discussxinpintuijian {2} GROUP BY DATE_FORMAT({0}, '%Y') LIMIT 10".format(xColumnName, item, where, '%Y')L = []cursor = connection.cursor()cursor.execute(sql)desc = cursor.descriptiondata_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] for online_dict in data_dict:for key in online_dict:if 'datetime.datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d %H:%M:%S")else:passL.append(online_dict)msg['data'].append(L)return JsonResponse(msg)# (按值统计(多))
def discussxinpintuijian_o_valueMul(request, xColumnName):if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": []}req_dict = request.session.get("req_dict")where = ' where 1 = 1 'for item in req_dict['yColumnNameMul'].split(','):sql = "SELECT {0}, sum({1}) AS total FROM discussxinpintuijian {2} GROUP BY {0} LIMIT 10".format(xColumnName, item, where)L = []cursor = connection.cursor()cursor.execute(sql)desc = cursor.descriptiondata_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] for online_dict in data_dict:for key in online_dict:if 'datetime.datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d %H:%M:%S")else:passL.append(online_dict)msg['data'].append(L)return JsonResponse(msg)def discussxinpintuijian_security(request):'''获取密保接口'''if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": {}}req_dict = request.session.get("req_dict")sql = "SELECT * FROM discussxinpintuijian where ='{0}'".format(req_dict['username'])record = {}cursor = connection.cursor()cursor.execute(sql)desc = cursor.descriptiondata_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()] for online_dict in data_dict:record = online_dictmsg['data'] = recordreturn JsonResponse(msg)def discussxinpintuijian_group(request, columnName):if request.method in ["POST", "GET"]:msg = {"code": normal_code, "msg": "成功", "data": {}}where = ' where 1 = 1 'sql = "SELECT COUNT(*) AS total, " + columnName + " FROM discussxinpintuijian " + where + " GROUP BY " + columnNamefunc_name = sys._getframe().f_code.co_nametable_name = func_name.split('_')[0]json_filename=f'{table_name}_group_{columnName}.json'if os.path.exists(json_filename)==True:with open(json_filename,encoding='utf-8') as f:msg['data']=json.load(f)else:L = []cursor = connection.cursor()cursor.execute(sql)desc = cursor.descriptiondata_dict = [dict(zip([col[0] for col in desc], row)) for row in cursor.fetchall()]for online_dict in data_dict:for key in online_dict:if 'datetime.datetime' in str(type(online_dict[key])):online_dict[key] = online_dict[key].strftime("%Y-%m-%d")else:passL.append(online_dict)msg['data'] = Lexecutor.submit(spark_read_mysql, f"({sql}) {table_name}",json_filename)return JsonResponse(msg)
开发的项目经验展示(项目案例):
为什么选择我:
我是程序员阿龙,专注于软件开发,拥有丰富的编程能力和实战经验。在过去的几年里,我辅导了上千名学生,帮助他们顺利完成毕业项目,同时我的技术分享也吸引了超过50W+的粉丝。我是CSDN特邀作者、博客专家、新星计划导师,并在Java领域内获得了多项荣誉,如博客之星。我的作品也被掘金、华为云、阿里云、InfoQ等多个平台推荐,成为各大平台的优质作者。
在Java技术领域和学生毕业项目实战中,我积累了深厚的知识与经验,并与高校老师、讲师及行业内的同行前辈保持着广泛的交流与合作。我的专业背景和丰富的实战经验使我能够为你提供高质量的辅导和技术支持,助你在编程学习和项目开发中取得更好的成果。选择我,你将获得的不仅是技术上的提升,更是对项目的全面理解与掌控。
免费赠送相关学习资料:
系统测试运行
系统代码编写完成之后还需要对系统进行模块测试和整体测试,在系统编写的过程当中,难免会有很多没有 被发现的错误,因此需要对系统进行测试。
模块测试
要对系统的模块进行测试,可以按以下方面进行测试:
(1)对系统服务类接口进行测试
(2)对控制器类中的局部变量进行测试
(3)对重要语句要进行逻辑调试
(4)如果有错误的代码的话则要对其进行标记
(5)测试前后端交互是否正常
在测试系统之前需要使用tomcat和编译器编译运行系统,在页面当中输入数据对系统简单测试,在后端逻辑代码中打上断点调试代码,从控制台当中查看数据是否符合要求,对系统出错的地方要进行标记。
系统整体测试
系统整体测试之前需要对系统单个模块测试,在测试的时候,要区分模块测试,之前在进行整体测试,在区分模块测试的时候,还需要注意先测试主模块,如果出现了问题那就需要尽快改进,主模块测试完成之后就可以对次要模块进行测试。
在测试的时候用到的技术有:
(1)利用编译器的调试功能,对系统进行调试测试,在控制器类中获得前端页面传递过来的数据
(2)页面传递过来的数据。
(3)可以利用代码中的输出功能,观察控制台的异常
(4)在控制器代码中设置断点观察变量的值的情况
评估运行的可靠性问题:
(1)通过编译器的调试功能从而观察变量的运行情况
(2)观察后端逻辑处理代码处理效率并对其进行改进
(3)对代码进行重构改造,使空间复杂度和时间复杂度减小
(4)点击页面观察页面响应时间,调整代码复杂性等。
测试过程
(1)用户登录场景测试
用户登录场景测试是针对用户登录进行的测试。用户在登录界面选择对应身份并输入正确的用户名和密码即可进入系统。如表6.1所示,测试结果正常。
表6.1 登录场景
序号 | 用户名 | 密码 | 预期结果 | 测试结果 |
1 | admin | 123456 | 系统成功进入 | 正常 |
2 | admin | 111111 | 系统提示用户名、密码不正确,请检查 | 正常 |
3 | 空 | 123456 | 系统提示用户名不能为空 | 正常 |
4 | admin | 空 | 系统提示密码不能为空 | 正常 |
(1)用户注册场景测试
用户注册场景测试是针对用户注册进行的测试。用户在注册界面选择对应身份进行注册,注册所填信息包含用户名、密码、姓名、性别、手机等,若用户未输入对应信息,系统则会提示用户填写,密码与确认密码填写需一致。如表6.2所示,测试结果正常。
表6.2 注册场景
序号 | 用户名 | 密码 | 确认密码 | 预期结果 | 测试结果 |
1 | 111 | 123456 | 123456 | 系统提示注册成功 | 正常 |
2 | 111 | 222222 | 222222 | 注册失败,系统提示用户名已被注册 | 正常 |
3 | 空 | 123456 | 123456 | 注册失败,系统提示用户名不能为空 | 正常 |
4 | 111 | 空 | 空 | 注册失败,系统提示密码不能为空 | 正常 |
5 | 111 | 123456 | 空 | 注册失败,系统提示确认密码不能为空 | 正常 |
测试结果
开发完系统之后会有很多潜在的错误还没有被发现,因此需要使用黑盒和白盒的方法对系统进一步测试查找出问题。
黑盒测试目的为对系统功能进行测试,黑盒在测试过程中是专注于系统的功能,不注重于程序内部是怎么实现的,主要目的为发现系统存在的不足,系统在测试的时候会分为很多个功能,黑盒测试目的为保证系统功能能够正常使用。
白盒测试主要目的为检测编码过程中出现的错误,编码人员的编码能力最终会影响到系统的建立。系统中基本的语法错误能够被发现从而进行改正。白盒测试专注于源代码的结构,而不专注于对系统功能测试。
黑盒测试能够不考虑系统内部结构从而对接口进行测试。白盒测试能够对系统内部进行检查,在测试的过程中要注意测试的次序,在编译器中导入junit框架,在测试的过程中要注意顺序,先对系统的子模块进行测试,最后对一个完整的系统进行测试。在测试的过程中要注意不能够输入错误的数据值。