【网站项目】SpringBoot454电子商城管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。

  1. 代码可以私聊博主获取。🌹
  2. 赠送计算机毕业设计600个选题excel文件,帮助大学选题。
  3. 赠送开题报告模板,帮助书写开题报告。

作者完整代码目录供你选择:

  1. 《Springboot网站项目》400套
  2. 《ssm网站项目》800套
  3. 《小程序项目》300套
  4. 《App项目》500套
  5. 《python网站项目》600套

⚡感兴趣大家可以点点关注收藏,后续更新更多项目资料。⚡

项目演示

摘  要

采用原始的用纸张书写相关信息,不仅仅容易造成数据的损坏和丢失,最重要的是书写过的内容如何更快速的分发,快速的被整理出来得到汇总的数据。用纸张书写的信息在传递过程中不能实时更新,在这个快速发展的时代是会被淘汰的。本次课题用互联网信息技术作为媒介,针对用户购物信息的管理,开发电子商城管理系统来进行相关数据信息的管理和分发,可以在最短的时间内响应操作,最重要的是数据移植起来非常方便,可以做无人动态备份设置,只要有数据更新就可以指定备份到相应的位置进行存放关键数据,在效率上面是比传统的纸张书写方便很多。

电子商城管理系统可以实现用户在线购买商品,查看商家,管理收货地址和个人购买商品的订单。商家主要管理销售的商品和商品订单以及商品评价。管理员管理商家和用户,管理公告,管理商品和订单等功能,系统选用当前最先进的Spring boot框架开发技术和Java开发语言,可以让电子商城管理系统在使用效果上面达到很好的预期。

关键词:电子商城管理系统;Spring boot框架;Java

1 绪论

1.1 选题背景

当前国内的经济快速发展,有互联网的一份功劳。通过互联网的信息传播优势,可以实时更新最新数据,计算机软件解决用户实际问题,互联网实现信息传递,让每个实体行业都感受到了互联网的魅力。小到路面买菜,大到一个国家的春节运输数据,都通过互联网的更新,互联网已经变成了一个产业链,围绕着人们生活的方方面面。国内通过不间断的九年义务教育,现在社会识字率很高,基本上操作软件都没有什么困难。互联网的蓬勃发展,离不开背后的设计者和开发者,每个计算机应用都有客户端和管理端,所有的用户都只能看到自己相关的数据,具体用户数据的汇总以及数据安全问题,都由专门人员进行负责。互联网让所有人的都可以在虚拟的世界里有自己的数据留存。本次课题对于用户购物管理方面,通过计算机相关技术开发一款电子商城管理系统来实现数据的存储与管理。

1.2 目的和意义

任何一款软件,都需要解决特定的事情。小到一个博客网站,能解决用户想要发表的一些观点内容,大到一些ERP应用,打通各个生成环节之间的数据,或者是更大的软件系统,全国人口户籍信息等。人们的日常生活会发生各种各样的事情,如何用数据的形式来记录人们的日常生活,并且可以长时间内为人们的生活和工作提供便利的条件,这是一个很有研究意义的事情。目前市面上办公行业最流行的还是用电脑办公,而采用电脑办公一般有两种使用方法,一种是使用特定的软件来实现某些功能,如果电脑出现故障,只能重新购买或者换台电脑,安装好指定软件才能正常使用,另一种是采用每台电脑都有的浏览器,只要一个地址就能访问,并且可以通过浏览器来进行办公。软件平台化,数据安全化,是软件行业的一个趋势。电子商城管理系统的设计是跟得上时代潮流的软件。

1.3 论文结构安排

本文共分为六章,主要描述电子商城管理系统从开发到实现的具体过程。

第1章:介绍系统的选题动因和意义;

第2章:介绍系统选用的开发语言,开发技术等内容;

第3章:介绍系统的功能和非功能需求以及系统流程;

第4章:介绍系统的数据库和功能的设计;

第5章:介绍系统的实现界面;

第6章:介绍系统的测试特点和功能测试。


2 开发环境与技术

2.1 Java语言

Java语言不仅仅是一种语言,也是一种平台,采用Java语言和规则开发的程序在Java平台的虚拟机里进行运行,完美的让Java变成了高级程序员开发语言之中的常青树。所有的程序开发人员都喜欢一种可以减少工作量的开发过程,这样能提升工作的效率。Java语言不是平白无故的诞生的,也是站在了巨人的肩膀之上,那个巨人就是C语言。C语言可以操作内存指针,功能是很强大,对各种开发阶段都有一个很好的支持,执行效率是最高的语言,但是学习成本很高。正常开发人员的开发过程完全是围绕着复杂的业务逻辑来进行处理的,没事都要搞一下垃圾回收,这样真的很麻烦,Java就想到了一种自动垃圾回收机制和忽略程序开发人员对内存的操作,让程序开发人员的注意力都集中到业务开发上来,这样极大的提高了开发效率,深受广大开发人员的喜爱。让高明C语言程序员做底层最麻烦最啰嗦的操作,研究出一种Java的虚拟机环境,让Java公司的人员着重与规则的建立和与机器内存的沟通,让使用Java的程序员完全不用考虑以后会在哪个平台运行,一次开发,可以任意运行,省时省力的Java就是这么强大。

2.2 Navicat简介

Navicat是专业的数据库管理工具,可以对各种类型的数据库进行管理,提高数据库开发者的开发效率。当我们学习SQL的规则以及语句命令的时候,会发现需要使劲的记住各种单词的组合结构以及各种语法,需要花费我们大量的精力来学习,这样一个人学习浪费一个人的时间,好多人学习浪费的就是社会资源了,那么有没有一种工具可以提高数据库的初学者以及后续的开发者使用效率呢,这个就是Navicat软件。Navicat提供了针对各种数据库的操作版本以及可以满足各种用户的需求,比如协同合作,可以让多个数据库管理人员管理多个线上的数据库,也可以管理本地数据库,只需要把相应的数据库连接保存就行,不需要写代码,对数据库表内容操作也有很显眼的操作步骤,只要能看懂中文就能够使用,对数据库表结构的创建使用,不用任何命令,完全能满足使用要求,能减少学习的时间成本。Navicat有商业版和免费版,商业版自然功能能强大,价钱也不菲,免费版则需要自己去Navicat官网申请了,不过一般软件都有免费的试用期,在试用期期间也足够使用了。

2.3 Spring boot 框架

Spring Boot框架主要是Spring配置臃肿的主要解决方案。长期以来,Java主要作为平台而存在,只是提供最基础也是最基本的实现逻辑,如果采用原生的Java提供的方法来进行项目开发,会导致开发的过程无限期延长,复杂度增加,维护增加百倍困难。所以当今开发者需要开发一些Java平台的应用程序时,不免会选择一些已经存在的比较好用的框架了方便开发,这样可以提高开发效率,Spring Boot框架则是现在最流行的Java项目的开发框架之一。

2.4 Vue框架

Vue是国人进行创造的,在国内只要是学习有关网页开发的学习了基础知识之外,必然会学习Vue。首先在Vue官网上会发现文档很详细,最主要的是创造者与学习者都是国内人士,在沟通上面没有障碍,也不需要翻译国外的一些东西,学习起来很轻松。Vue主要是对前端页面数据进行绑定的,当然,数据绑定不算是一个稀罕的东西,问题是渐进式框架的含义,不管对Vue的熟练程度如何,如果有些页面功能感觉使用其他的技术更熟练,完全不需要全面使用Vue框架,这一点是最友好的。要知道只要是框架,必然是要学习很多的东西,都是国外翻译过来的,本身就有交流隔阂,并且框架在使用过程中必须按照框架来进行描述,如果有时候忘记了可能都想不到如何更改,但是在使用Vue的过程中,如果发现有些地方还是用简单的JavaScript或者原生的操作更简单,可以直接不使用Vue即可。


第3 系统分析

在系统分析阶段,需要对基本的需求进行流程的确定和细分,需要阅读大量的相关资料,才能科学的分析系统的功能实现,如果没有系统分析,只是盲目的确定功能模块,将不利于后续的功能确定。

3.1 可行性分析

虽然功能点感觉可以实现,但是感觉毕竟是感觉,还是需要从一些其他的角度来进行可行性分析的,这是一个科学的分析环节。

(1)运行可行性

项目的开发和运行是需要一定的硬件基础,比如像当初的XP系统就有点古老了,不适合作为开发使用的环境。目前主流的操作系统是Windows10和Windows11,正好自己有相关的电脑,并且硬件上面符合开发和运行的条件,硬盘采用的也是固态硬盘,完全可以快速的搭建运行环境。

(2)经济可行性

经济上分析主要是针对项目的开发以及运行阶段可能用到的经济投入进行分析,现有设备符合开发和运行需求,技术上用开源免费的,所以经济上的考虑可以忽略不计。

(3)技术可行性

自己在学校就学习了相关的软件开发技术,并且可以通过这些技术在网络上面找到类似的功能进行学习,不需要太多的技术成本投入。

通过上面三个角度分析,更加提升了自己的开发信息,不需要额外的考虑太多复杂的投入,只需要按部就班的实现电子商城管理系统的开发即可。

3.2 系统非功能需求

系统分析的过程也需要对系统非功能方面进行分析,因为能够对系统运行之后的最终目标产生影响的过程不仅有对系统的功能分析这一步骤,也包括对系统的非功能层面的分析这一步骤,这两者都是不可缺少的。像确定系统具体能够提供的功能点这样的分析属于功能分析,而功能扩展性,操作性等描述系统性能的分析就属于系统非功能层面上的分析。

(1)系统要有可扩展性的特点

本系统的开发是首次开发的产品,在投入市场经过市场使用之后,会在其上进行再次开发,常见的包括功能模块的新增,角色的新增等内容,这些都是属于二次开发。因此,功能可扩展性这样的性能特点本系统就要具备,而且还要在系统的层次结构设计上尽可能清晰,在扩展类型的设计上,对程序的接口设计,还有对程序抽象类的设计尽可能科学合理。

(2)系统要有自适应性的特点

系统就是为了解决一些特定问题而被人为进行开发,投入使用后,跟系统打交道也是通过人机交互,只要是人为操作系统,就会出现一些人为错误,所以,系统的自适应性特点就需要在人为操作出现问题时表现出系统的纠错能力。而这一指标也被程序员看重,他们通常会设置智能提示来反馈给用户问题,或者编写一些验证数据的代码来提升系统的纠错能力。

(3)系统要有较强的操作性的特点

为了避免系统在处理具体事务时产生处理流程混乱的现象,或者是避免一个系统到处可见超级链接,影响使用者使用系统。就有必要遵循较高的系统操作性方面的标准,从而合理布局系统功能,让用户在使用系统功能时能够一气呵成。

(4)系统要有易用性的特点

系统提供的不同功能能够解决不同问题,对于使用者来讲,当一个系统功能点太多时,会非常耗费寻找功能的时间,所以这就要求系统的界面设计要合格,这就需要在功能模块上进行整合,避免功能模块上出现冗余现象,也需要尽可能的实现人性化的操作界面,也要对系统界面的美观度以及界面展示的功能点提出要求。毕竟每个功能都是用户与系统界面进行数据交互,所以合理的界面设计还是非常重要的。系统通常是让用户通过界面输入数据来获取信息,当遇到用户错误的数据输入现象,或者是表单数据输入项太多,用户漏掉了某些数据项的数据输入这样的情形时,系统应当及时提醒用户。当遇到系统的输出数据比较多时,系统也应合理规划数据布局,或者是通过报表形式呈现输出的数据。让使用者使用较短时间就能通过产品说明书操作系统,或者经人简单指点也能与系统进行无障碍数据交互。

3.3 系统功能需求

为了方便使用者访问电子商城管理系统,系统在使用者的使用权限上划分比较明确,不同权限分配不同的功能。电子商城管理系统的权限设置有管理员,商家,用户三种操作权限。

电子商城管理系统分配给管理员的功能通过图3.1进行展示。管理员对商家和用户以及系统公告进行管理,管理用户在论坛模块发布的帖子以及帖子的回复信息,管理商家销售的商品和商品订单等。

图3.1 管理员用例图

电子商城管理系统分配给商家的功能通过图3.2进行展示。商家需要管理需要销售的商品的信息,管理已经销售的商品的订单信息,管理用户发布的对商家销售的商品的评论信息。

图3.2 商家用例图

电子商城管理系统分配给用户的功能通过图3.3进行展示。用户可以在论坛模块发布帖子,评论自己查看的帖子,购买商品,查看购买商品的所属商家信息,管理购物车,下单支付购买商品的订单,管理商品的订单,管理收货地址,评价订单商品等。

图3.3 用户用例图

3.4 系统流程分析

(1)添加信息流程如图3.3所示。

图3.3 添加信息流程

电子商城管理系统在开发过程中,就已经提前设置了各个功能的操作逻辑以及验证判断信息,所以任何一个能够完整运行的系统,无论用户怎么操作系统的功能,系统都会根据预先设置的规则以及处理不同事务的逻辑进行操作。比如说系统的添加功能,用户根据信息提示,填写相应的数据,如果用户登记的数据格式不对,比如应该登记的数值数据,被用户登记了文本数据,系统就会提示用户及时更正。因此,能够正常提交的用户录入的数据,证明其登记的数据相对来说比较准确。

(2)修改信息流程如图3.4所示。

图3.4 修改信息流程

系统的某项数据是由众多字段组成,所以修改数据相对录入数据比较省时间,只需更改有错误的字段数据即可。

(3)查询信息流程如图3.5所示。

图3.5 查询信息流程

电子商城管理系统可以保存的数据信息有很多,如果只是人为查找数据,将会产生巨大的工作量,因此为了方便使用者,系统提供数据查询功能,用户只要在查询功能区登记要查询数据的关键字,电子商城管理系统就会查询出完整的用户需要的数据信息并显示。


4 系统设计

系统设计必须参考当前社会最主流的页面设计,因为不主流的就是已经被淘汰的,随着软件设计多年发展,已经有了完整的设计理念。

4.1 界面设计原则

针对界面的模块以及操作部分,有些规则是需要提前设定的。

第一点:前后台主界面必须统一。统一的有整个网站的上部以及下部,中间显示关键内容,后台的菜单栏必须在左侧。颜色也要统一,不能有很明显的突兀,产生视觉厌恶的效果。

第二点:导航条必须美化。界面统一后,导航就是一个门户入口,就像大门一样,非常的引人注目,如果导航条不美化,随便弄一个导航条会与界面不匹配,并且有种设计不上档次的感觉。

第三点:输入框必须格式统一,并且相关核心数据要尽量的放到前面,要符合人们的正常认知。比如用户的属性有账号密码或者性别电话或者详细说明等这些,一般设定详细说明的为补充部分,尽量放到最下面,不能说把姓名或者电话放到最下面,这样一方面是页面布局不美观,另一方面就是违反人们的日常生活认知。

第四点:界面设计必须要考虑用户对象,他们可能对计算机的认知也就仅仅处于操作使用阶段,尽量要用贴合人们日常生活和操作的习惯设计到项目里面使用。

4.2 功能结构设计

站在使用者的角度来分析电子商城管理系统的详细功能,最后使用结构图来展示设计结果。

管理员功能结构设计见图4.1。管理员主要是对商家,用户,论坛帖子,商家销售的商品,用户购买商品的订单等进行管理。

图4.1 管理员功能结构图

商家功能结构设计见图4.2。商家主要是发布需要销售的商品信息,管理已经销售的商品订单,查看和回复用户对商家销售的商品的评论信息。

图4.2 商家功能结构图

用户功能结构设计见图4.3。用户在前台购买商品,查看商家信息,在论坛模块发布帖子,评论帖子,管理自己的收货地址,对商品订单进行退款,收货,评价,支付等。

图4.3 用户功能结构图

4.3 数据库设计

能满足当前项目数据所需要的数据库模式采用的是关系型数据库。首先关系型数据库发展历史悠久,功能完善,性价比也比较高,不管是开发成本还是使用成本都可以接收,不需要重新创建一种新的数据模型。

4.3.1 数据库E-R图设计

数据需要提前设计清楚,如何简单明了的表示数据实体与属性之间的关系,目前最优解决方法是采用画E-R图的方式来进行描述,用E-R图的好处有以下几点:

第一点:数据筛选,有时候用文字描述的数据不太直观,当用E-R来描述的时候可以更直观的看到数据之间的关系,有助于清空冗余的数据表达,让数据更清晰;

第二点:可以通过优化的E-R对数据进行优化,能提前对数据量进行预估,提前设定相关规则,避免数据混乱;

第三点:可以提高数据的完整性,当E-R画出的过程也是对文字逻辑的梳理过程,有助于大脑的理解;

第四点:优化好的数据在检索方面可以人为的提高检索效率;

本章主要表达各个数据模型直接有任何关系,通过E-R图可以更清楚的判断,有助于提高数据存储格式等一系列的后续操作的效率,优化开发步骤。

(1)图4.3为商品实体图。

图4.3 商品实体图

(2)图4.4为用户实体图。

图4.4 用户实体图

(3)图4.5为商品订单实体图。

图4.5 商品订单实体图

(4)图4.6为购物车实体图。

图4.6 购物车实体图

(5)图4.7为上述实体间关系E-R图。

4.3.2 数据库表结构设计

三大范式基本上概括了数据库设计的必要规范,只有符合三大范式的数据才是合理的数据。

范式第一条:表与表之间,字段与字段之间,每个名字都不能产生混淆的概念,必须不一样,必须确保唯一性的存在。

范式第二条:在满足第一条范式的前提上要对主键进行规定,不能这个表的主键在第一列,后面的表的主键位置列数就变了,这样不可以,必须保证统一,让主键在相同列上。

范式第三条:满足前两条范式的同时,如果获取数据,必须可以通过主键就能查询到相关数据,尽量不要跨表获取。

三大范式是继续关系,每一个范式都要继承前面范式的要求,就像盖房子一样,必须先打地基,然后再在上面做其他事情,范式就是这样。通过三大范式要求的数据,不仅能规范数据库的设定,还可以提高数据库检索效率。

下面展示设计的电子商城管理系统的数据表结构。

表4.1 shangjia 商家信息表  

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

username

varchar(200)

账户

允许空

password

varchar(200)

密码

允许空

shangjia_name

varchar(200)

商家名称

允许空

shangjia_phone

varchar(200)

联系方式

允许空

shangjia_email

varchar(200)

邮箱

允许空

shangjia_photo

varchar(200)

营业执照展示

允许空

shangjia_types

int(11)

商家类型

允许空

new_money

decimal(10,2)

现有余额

允许空

shangjia_content

longtext

商家介绍

允许空

shangjia_delete

int(11)

逻辑删除

允许空

create_time

timestamp

创建时间

允许空

表4.2 address 收货地址信息表

字段

类型

说明

允许空

id (主键)

int(20)

主键

不允许空

yonghu_id

int(20)

创建用户

不允许空

address_name

varchar(200)

收货人

不允许空

address_phone

varchar(200)

电话

不允许空

address_dizhi

varchar(200)

地址

不允许空

isdefault_types

int(11)

是否默认地址

不允许空

insert_time

timestamp

添加时间

不允许空

update_time

timestamp

修改时间

不允许空

create_time

timestamp

创建时间

不允许空

表4.3 shangpin 商品信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

shangjia_id

int(11)

商家

允许空

shangpin_uuid_number

varchar(200)

商品编号

允许空

shangpin_name

varchar(200)

商品名称

允许空

shangpin_photo

varchar(200)

商品照片

允许空

shangpin_types

int(11)

商品类型

允许空

shangpin_kucun_number

int(11)

商品库存

允许空

shangpin_old_money

decimal(10,2)

商品原价

允许空

shangpin_new_money

decimal(10,2)

现价

允许空

shangpin_clicknum

int(11)

商品热度

允许空

shangpin_content

longtext

商品介绍

允许空

shangxia_types

int(11)

是否上架

允许空

shangpin_delete

int(11)

逻辑删除

允许空

insert_time

timestamp

录入时间

允许空

create_time

timestamp

创建时间

允许空

表4.4 forum 论坛信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

forum_name

varchar(200)

帖子标题

允许空

yonghu_id

int(11)

用户

允许空

shangjia_id

int(11)

商家

允许空

users_id

int(11)

管理员

允许空

forum_content

longtext

发布内容

允许空

super_ids

int(11)

父id

允许空

forum_state_types

int(11)

帖子状态

允许空

insert_time

timestamp

发帖时间

允许空

update_time

timestamp

修改时间

允许空

create_time

timestamp

创建时间

允许空

表4.5 news 公告信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

news_name

varchar(200)

公告标题

允许空

news_types

int(11)

公告类型

允许空

news_photo

varchar(200)

公告图片

允许空

insert_time

timestamp

添加时间

允许空

news_content

longtext

公告详情

允许空

create_time

timestamp

创建时间

允许空

表4.6 cart 购物车信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

yonghu_id

int(11)

所属用户

允许空

shangpin_id

int(11)

商品

允许空

buy_number

int(11)

购买数量

允许空

create_time

timestamp

添加时间

允许空

update_time

timestamp

更新时间

允许空

insert_time

timestamp

创建时间

允许空

表4.7 shangpin_collection 商品收藏信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

shangpin_id

int(11)

商品

允许空

yonghu_id

int(11)

用户

允许空

shangpin_collection_types

int(11)

类型

允许空

insert_time

timestamp

收藏时间

允许空

create_time

timestamp

创建时间

允许空

表4.8 yonghu 用户信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

username

varchar(200)

账户

允许空

password

varchar(200)

密码

允许空

yonghu_name

varchar(200)

用户姓名

允许空

yonghu_phone

varchar(200)

联系方式

允许空

yonghu_id_number

varchar(200)

身份证号

允许空

yonghu_photo

varchar(200)

用户头像

允许空

sex_types

int(11)

性别

允许空

yonghu_email

varchar(200)

电子邮箱

允许空

new_money

decimal(10,2)

余额

允许空

create_time

timestamp

创建时间

允许空

表4.9 shangpin_order 商品订单信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

shangpin_order_uuid_number

varchar(200)

订单号

允许空

address_id

int(11)

收货地址

允许空

shangpin_id

int(11)

商品

允许空

yonghu_id

int(11)

用户

允许空

buy_number

int(11)

购买数量

允许空

shangpin_order_true_price

decimal(10,2)

实付价格

允许空

shangpin_order_courier_name

varchar(200)

快递公司

允许空

shangpin_order_courier_number

varchar(200)

订单快递单号

允许空

shangpin_order_types

int(11)

订单类型

允许空

shangpin_order_payment_types

int(11)

支付类型

允许空

insert_time

timestamp

订单创建时间

允许空

create_time

timestamp

创建时间

允许空

表4.10 users 管理员信息表

字段

类型

说明

允许空

id (主键)

bigint(20)

主键

不允许空

username

varchar(100)

用户名

不允许空

password

varchar(100)

密码

不允许空

role

varchar(100)

角色

允许空

addtime

timestamp

新增时间

不允许空

表4.11 shangpin_commentback 商品评价信息表

字段

类型

说明

允许空

id (主键)

int(11)

主键

不允许空

shangpin_id

int(11)

商品

允许空

yonghu_id

int(11)

用户

允许空

shangpin_commentback_text

longtext

评价内容

允许空

insert_time

timestamp

评价时间

允许空

reply_text

longtext

回复内容

允许空

update_time

timestamp

回复时间

允许空

create_time

timestamp

创建时间

允许空


5 系统实现

系统实现就是把项目的功能点准确清晰的描述起来。对项目的功能设计和数据库表的设计,只是概念性设计的一个阶段,系统实现则是对所有设计好的功能的具体呈现。当设计变成现实可操作的功能,就需要用文字与图片的形式对应起来,这样可以更直观的感受系统实现的具体操作。

5.1 管理员功能实现

5.1.1 商家管理

商家管理界面如图5.1所示。

图5.1 商家管理界面

商家管理包括的基本信息有商家的联系方式,商家的名称,商家的账户等信息。作为管理员,其可以在商家管理界面为商家的账户进行密码重置,可以修改商家的部分信息,以及可以删除商家。

5.1.2 论坛管理

论坛管理界面如图5.2所示。

图5.2 论坛管理界面

论坛管理包括的基本信息有发布论坛帖子的人的姓名,身份,手机号,帖子标题等信息。作为管理员,其可以在论坛管理界面查看每条帖子信息的相关回复信息,对部分帖子的内容进行修改,或者删除论坛的帖子。

5.1.3 用户管理

用户管理界面如图5.3所示。

图5.3 用户管理界面

用户管理包括的基本信息有用户的姓名,用户的性别,用户的账户所剩的余额信息,用户每次购买商品都是使用账户的余额进行支付,所以当用户的账户余额小于所买商品的价格时,用户需要充值,充值之后,其账户余额就会相应增加。而作为管理员,其主要还是增删改查用户的信息。

5.1.4 商品收藏管理

商品收藏管理界面如图5.4所示。

图5.4 商品收藏管理界面

商品收藏管理包括的信息有收藏的商品的名称,商品照片,收藏商品的用户姓名以及收藏时间等信息,作为管理员,其可以查看所有的用户已经收藏的商品的信息,而前台商品界面所展示的商品的推荐信息,基本都是根据用户收藏的商品来进行相应的推荐。

5.1.5 公告信息管理

公告信息管理界面如图5.5所示。

图5.5 公告信息管理界面

公告信息管理包括的基本信息公告的标题,添加时间,公告的图片等信息。作为管理员,其可以对本界面展示的所有的公告的信息进行信息修改,或者删除一些不需要的公告信息。本系统设置的三个角色,商家和用户只能查看公告的内容,但是只有管理员才可以发布公告,管理公告。

5.2 商家功能实现

5.2.1 商品管理

商品管理界面如图5.6所示。

图5.6 商品管理界面

商品管理包括的基本信息有商品的库存,商品的热度,商品的名称,商品是否上架等信息。只有上架的商品才可以展示在前台进行销售,下架的商品是不能进行销售的,也就是不能在前台的商品界面展示。作为商家,其可以编辑需要销售的商品的信息进行发布,可以修改商品,删除不需要销售的商品的信息。

5.2.2 商品评价管理

商品评价管理界面如图5.7所示。

图5.7 商品评价管理界面

商品评价管理包括的基本信息有评价商品的用户信息,评价的内容,评价的商品等信息。商品评价是用户在已经收到购买的商品之后,也就是订单状态结束时,才可以评价购买的商品,而作为商家就需要对来自用户的对自己销售的商品的评价内容进行查看和回复。

5.2.3 商品订单管理

商品订单管理界面如图5.8所示。

图5.8 商品订单管理界面

商品订单管理包括的基本信息有订单号,用户姓名,快递公司,支付价格,商品名称等信息。商品订单管理包括了所有用户购买该商家销售的商品所产生的订单,每种商品订单由于所处的状态不同,所以需要商家进行不同的操作,如果是刚支付的订单,那么商家就需要及时发货,对商品订单进行发货也需要备注快递公司和快递单号信息,如果是已经退款的订单或者是已经发货的订单,那么商家可以查看订单的详情。

5.3 用户功能实现

5.3.1 商家信息

商家信息界面如图5.9所示。

图5.9 商家信息界面

用户在本界面查看商家的联系方式,可以点击界面下方的“查看当前商家下所有商品”超链接来查看该商家上架销售的所有商品信息。

5.3.2 商品信息

商品信息界面如图5.10所示。

图5.10 商品信息界面

用户在商品信息界面可以查看该商品的评论,可以查看该商品所属的商家的详细介绍信息,前提是点击界面上的“商家名称”超链接才可以查看商家的信息。本界面提供用户购买商品的功能,有“添加到购物车”“立即购买”这两个按钮都能进行点击,其实现的功能都可以帮助用户下单购买商品,只是立即购买可以帮助用户无需等待,直接下单付款,但是添加购物车则是允许用户继续购物,最后统一结账。

5.3.3 购物车

购物车界面如图5.11所示。

图5.11购物车界面

用户在购物车界面可以移除不需要购买的商品,可以查看每种商品的数量,单价,以及每种商品的总金额信息,界面下方显示了商品的件数以及所有商品的总金额信息,如果用户需要购买这些商品,可以点击“下单”按钮提交购物信息。

5.3.4 确认下单

确认下单界面如图5.12所示。

图5.12确认下单界面

用户在确认下单界面可以查看下单流程,主要是选购商品,确认下单,完成订单这三个步骤。所以在确认下单界面不仅需要查看购买的商品的详细信息,查看收货地址信息,并选择需要的收货地址,最后,查看该订单的总价信息以及需要支付的总金额信息,最后可以点击“确定提交”按钮进行下单和支付。

5.3.5 商品订单

商品订单界面如图5.13所示。

图5.13商品订单界面

用户在商品订单界面可以查看全部订单,可以根据订单状态分类查看订单信息,包括已评价订单,已支付订单,已发货订单等信息。不同订单需要用户进行的操作也不一样,但是用户对订单商品收货,只能对商家发货订单进行收货操作,用户评价订单需要对订单状态已经结束的订单进行订单商品的评价。

5.3.6 收货地址 

收货地址界面如图5.14所示。

图5.14收货地址界面

用户在收货地址界面可以发布新的地址信息,可以对本界面显示的地址的部分信息进行修改,可以删除不用的地址信息。


6 系统测试

测试环节一般在程序开发完成后需要进行的环节。这个环节主要是针对不同的测试要点设定不同的测试方法,用测试方法来发现程序运行的问题所在,只有发现问题才能解决问题,所以说系统测试是一个很重要的环节。

6.1 测试任务

测试是有一定的任务的,需要把测试的步骤以及想要达到的测试效果都要有提前量的准备。所谓的测试提前量就是根据系统的设定需求,整理出几种不同的测试方案,测试任务的体现要符合操作人的正常操作逻辑顺序,并且要结合测试项目的具体功能,这样才是符合规范的测试任务。测试出的问题多少,代表着程序的完整度的多少。并且每次程序根据测试结果修复完毕会继续进行下一轮的测试,科学的测试能从侧面协助程序的运行出错几率降到最低。

6.2 测试目标

测试任务会规定一些具体的测试对象,也就是测试目标。测试虽然是针对性的测试,但是目标一般是不会进行变更的,不管是什么样子的测试目标都是为了测试目标的编码实现。编码实现过程中,程序开发人员毕竟不是整个程序都是一个人开发的,可能为了实现自己写的某个功能会忽略某些特殊的参数之类的,或者某些功能都不是一个人进行开发的,这样出现问题的几率也比较大,再加上加班加点的编码,可能会出现一些低级的错误,毕竟人为的编码毕竟会出现疲劳。所以会从功能,性能,等各个环节来验证程序的编码问题。

6.3 测试方案

本系统的测试方案有模块测试,集成测试以及验收测试。

1.模块测试

单元测试也叫模块测试,主要检测数据在某个模块内的测试或者某个数据流在另一个模块之间的引用测试是否会出现异常。一般模块测试会从下面几个方向来进行测试。

(1)路径测试问题:不管是什么样的程序,不管是数据还是文件,其实只要是在硬盘中都有其位置,也就是是说不管是操作系统还是其他,其实都是文件的集合,既然是文件的集合,那么就会出现路径问题。操作系统对文件的路径有一定的规范,并且对文件属性也有规范,比如路径下面的权限问题,可以对某个文件夹或者文件设置只读或者不可以操作,如果程序的功能有这方面的需求,需要在某个文件里面存储或者操作某些文件,就不可避免要测试路径问题,检查上传文件是否真正把文件写入到指定的目录里面,有权限操作还是没有权限操作,是相对路径还是绝对路径,这些都要进行路径测试。

(2)接口测试问题:每个功能模块之间的接口是否有重复的,是否是唯一的,这些也需要进行测试,举个简单的例子,用户登录的接口与管理员登录的接口是否不一样,如果一样,如何区分,如果不一样,是否引用的有问题,如果管理员账号和用户账号都一样的存在,那么互相登录是否会出现异常还是不会出现异常,这些都需要进行接口测试。

(3)数据结构问题:数据问题主要体现在数据库数据类型与编码语言类型直接的包装盒转换以及计算方面。

(4)异常处理问题:所谓的异常处理问题其实很好理解,用户登录成功和登录失败,其实就是把用户登录的账号和密码进行提交与数据库里面查询相关表里面的内容进行数据比较,那么只会出现两种情况,一种是没有符合的数据,一种是符合的数据。如果查询到符合的数据就提示登录成功即可,如果没有查询到数据就提示登录失败,具体失败的原因是账号还是密码,这个根据异常来进行编辑即可。

(5)边界测试问题:数据分类型,还分数据量的大小,那么就是检测输入的数据最大量和最小量。如果超出设定的最大量就必须要求用户输入合法数据,不能让用户输入超出数据边界的操作还能进行提交,如果不这样,会出现更多的问题。

模块测试是必不可少的,也是不可忽略的环节之一。

2.集成测试

模块测试之后就是集成测试的开始,集成测试会跳过模块测试,专门针对模块之间的联系进行测试,只要是某个数据相关联的模块都要进行测试,这样一个数据的整个流程都测试一遍,才能确定程序开发是否符合需求。渐进式测试是集成测试的一种方式。

优点一:采用数据的生成,以及数据的流通,一站式测试,能更彻底的测试数据之间的逻辑和调用。

优点二:节省时间和成本,能更好的发现是哪个环节的问题。

优点三:更快的反馈并且处理问题。

用渐进式的测试必用混合法,也就是从上到下的测试或者从下到上的测试,从程序的任何一点逻辑进行测试都能测试环节的正义性。这就是集成测试。

3.验收测试

验收测试一般是最后的测试环节了。甲方委托相关人员来进行测试,一般交付之前的必要测试环节,因为甲方不参与具体开发步骤,只是讨论相关需求,而需求只是代表着甲方对于一些必要性必须实现的功能流程的要求,也许在测试环节会提出一些不符合程序开发流程的操作,这些也都是有可能的,毕竟一个需求的设定,编码都是根据这个需求进行编写的,如果更改需求那么就需要重新编码,所以验收测试有时候不代表编码问题,很有可能是需求改变导致的问题。一般经过各项科学测试之后的程序出现的问题很小。

6.4 功能测试

功能测试是一件很重要的任务环节,通过功能测试可以有效的看到程序设计是否符合设计预期。

(1)登录功能测试

登录基本上是所有软件都会有的功能,见微知著,不能因为所有软件都有的功能就不进行测试,恰好登录是所有软件功能的一个开端,只有合理合法的登录才是一个程序的品质保障。下面是登录测试表。

表6.1 登录功能测试表

测试功能

测试数据

预期结果

实际结果

是否通过测试

使用管理员角色进行登录

用户名:输入管理员的正确账号xiaohua

密码:输入管理员的正确密码xiaohua,最后点击“登录”按钮提交信息

系统跳转到管理员的功能操作界面

系统登录成功,管理员进入指定操作界面

使用管理员角色进行登录

用户名:输入管理员的错误账号huahua

密码:输入管理员的正确密码xiaohua,最后点击“登录”按钮提交信息

  

系统清空所有的输入信息,并提示账号有误

系统登录失败,界面仍然停留在登录界面

使用管理员角色进行登录

用户名:输入管理员的正确账号xiaohua

密码:输入管理员的错误密码huahua,最后点击“登录”按钮提交信息

系统清空密码输入信息,并提示请输入正确的密码

系统登录失败,界面仍然停留在登录界面

使用管理员角色进行登录

用户名:输入管理员的账号有特殊字符xiaohu%

密码:输入管理员的正确密码xiaohua,最后点击“登录”按钮提交信息

系统提示账号存在非法字符,请输入正确的账号

系统登录失败,界面仍然停留在登录界面

(2)商品查询功能测试

查询是所有程序必备的功能,任何程序的信息录入,都是为了可以及时的对数据进行处理,处理的过程可以不用肉眼看到,但是信息的查询结果就必须符合设计的要求,根据设定条件查询数据是一件常规操作。查询测试操作如下。

表6.2 商品查询功能测试表

测试功能

测试数据

预期结果

实际结果

是否通过测试

测试系统的商品查询功能

商品名称:输入商品名称关键字,比如商品名称4,最后点击“查询”按钮提交信息

系统显示出与查询关键字相匹配的信息

系统可以成功查询指定信息

测试系统的商品查询功能

商品名称:输入含有特殊字符的信息,比如&%*,最后点击“查询”按钮提交信息

系统清空查询输入框中的信息,然后提示存在非法字符

系统不能实现查询功能,仍停留在查询界面

测试系统的商品查询功能

商品名称:输入数据库中不存在的商品名称关键字,比如珍珠手链,最后点击“查询”按钮提交信息

系统提示信息不存在

系统不能查询信息,仍停留在查询界面

6.5 测试结果分析

电子商城管理系统经过了几轮测试,并且已经修复了测试中提交的各种问题,经过几轮回归测试,暂时没有发现其他问题,符合设计预期。


  

截至目前,电子商城管理系统已经初步完成。此系统根据使用者需求划分为多个功能模块,其中包括商品信息管理,商家信息管理,论坛信息管理,用户信息管理,公告信息管理,商品订单信息管理等功能。通过数据库MySQL技术实现了数据的存储与管理,运用Java编程技术不仅可以高效,安全开发电子商城管理系统,还可以保证电子商城管理系统的健壮性,同时可以满足已经开发的电子商城管理系统实现跨平台运用。总而言之,电子商城管理系统从无到最终的实现,其开发过程完全遵循软件开发规范进行,期间的需求分析,设计,实现等工作都有相应的理论知识进行支撑,所以开发的电子商城管理系统具有一定的使用价值和社会价值,其可以简单的针对性的处理一些数据问题,包括录入数据,检索数据,更改数据等。而且开发所用成本比较低,带给使用者的便利可是非常大的,因为此系统在保证数据信息安全可靠的前提下,可以批量进行数据处理,真正实现无纸化操作。

电子商城管理系统开发前期参考了网上很多的资料,也借鉴了一些相似系统的开发方案,但是此系统把功能需求的重点还是放在使用者身上,以使用的用户的要求为前提条件进行研究和开发。其具有的特点如下:

第一个特点就是电子商城管理系统性能稳定,使用者操作系统,提交任何功能操作的请求,系统都会在短时间给出反馈,同时,系统经过多次检测,其出故障的几率比较小,几乎可以保证7*24小时运行,就算系统真的出现故障了,由于各个功能相互独立,不会导致其它功能无法正常操作,整个系统还是不容易崩溃,能够保证运行稳定。

第二个特点就是系统预先设立了一些可供二次开发的接口,这些接口都是根据相应的规范进行设计的,为今后电子商城管理系统的权限新增以及功能扩展提供了便利。

第三个特点就是系统的整体布局合理,重要的功能都会展示在界面的顶部或者左侧区域,字体设置的大小,粗细以及颜色的搭配都是以引人注目为目的,便于使用者及时发现,从而达到快速导航的目的。另外系统展示的图片大小合理,分类明确。

电子商城管理系统尽管已经开发完成,也具备需求分析中所要求的功能,并能够无故障运行,但是系统本身还是一个初步形成的模型,里面还存在很多不足。

首先是数据库中有很多重复数据,导致数据库占用过多存储空间。

其次是系统的后台代码不够简洁,有很多重复的代码片段,有很多事务处理的逻辑不是很严密。

最后是系统的界面风格采用的CSS模板样式比较单一,不够丰富。

综上所述,电子商城管理系统还需要更多的精力和时间上的投入来进行研究和完善。对我自己也要要求技术上以及理论知识上的进一步提升。


参考文献

[1]崔祥.基于Web的在线购物系统设计[J].无线互联科技,2022,19(24):71-74.

[2]任建新,王一鸣,李鑫,刘曜嘉,孙岩琦.基于Java Web的智慧商城购物系统设计[J].信息技术与信息化,2022,(07):23-27.

[3]张科.计算机软件开发JAVA编程语言应用分析[J].科技风,2020(01):66.

[4]彭影.优化Java数据库访问效率的策略研究[J].计算机产品与流通,2020(02):21.

[5]邹青松.计算机软件Java编程特点及其技术运用[J].黑龙江科学,2020,11(06):62-63.

[6]赵光亮,舒小松.Navicat for MySQL平台中的SQL语言分析与应用[J].无线互联科技,2017,(19):74-75.

[7]朱运乔.基于SpringBoot+SSM框架的Web应用系统搭建与实现[J].电脑编程技巧与维护,2019(10):23-25.

[8]王丹,孙晓宇,杨路斌,高胜严.基于SpringBoot的软件统计分析系统设计与实现[J].软件工程,2019,22(03):40-42.

[9]褚建萍.基于Vue的数据可视化系统研究[J].电子技术与软件工程,2022,(18):234-237.

[10]姜全坤.基于Vue的通用后台管理系统设计与实现[J].现代信息科技,2022,6(08):33-35+38.

[11]朱庆国.计算机应用技术和信息管理的整合分析[J].网络安全技术与应用,2019(10):6-7.

[12]尹希垚.软件开发信息管理系统设计及应用[J].电子技术与软件工程,2019(19):53-54.

[13]韩禄.计算机软件开发中影响软件质量的因素[J].信息与电脑(理论版),2020,32(18):114-116.

[14]浦天宏.计算机软件开发设计的难点和对策[J].信息与电脑(理论版),2020,32(18):117-119.

[15]Siyi Liu.Explore Java Language and Android Mobile Software Development[J].International Journal of Frontiers in Engineering Technology,2021,3.0(2.0).

[16]Anonymous.LDRA;LDRA Adds Java Language and Certification Support[J].Computer Weekly News,2010.


  

不经意间,我的本科学习生涯即将结束。想想自己这四年来的求学生活,虽然充满辛酸,但也有许多幸福的时刻。四年来,我不仅学会了许多专业知识,也在校结识了许多朋友,还认识了很多非常优秀的老师,也得到过他们的无私帮助。尽管毕业意味着结束大学生涯,但对我来说却又是步入社会的新开始,将会开启一段新征程。在毕业论文写作的尾声,我想感谢许多人。

首先需要感谢父母和家人,我能考入这所大学,并能够安心学习知识,是你们在背后默默的付出,为我的生活提供后勤保障,也是你们常常教育我好好做人,认真做事,也总是你们在我灰心丧气时提供心理上的安慰与鼓励,也是你们在我满足现状的时候,激励我,让我要挑战自己,不要甘于现状,这样我才能够一直保持学习的热情。总之,感谢你们在背后为我做的一切。

这四年来,有大部分时间都是老师和同学陪着我一起度过。我的老师们主要是传授给我各种知识,其中也包括文档排版,软件安装等知识。这些知识对我来说非常有用,谢谢你们!

与同学们的相互交流和陪伴中,让我在毕业论文写作中少了很多焦虑,并能够安心写作。所以这些同学们,我也是非常感谢你们!

我的指导老师从开题以来,一直严格要求我认真对待自己选择的课题,并从多方面进行指导,包括专业知识理论,也包括心理上的开导等,在任何时候,只要我的课题还在进展中,您就会定期询问我已经完成了课题的多少内容了,下一步该如何开展等问题,遇到问题找导师,您也从来没让人失望过。所以,当我能够把毕业作品呈现出来的那一刻,我内心是非常激动的,也是非常感谢您。您就是我今后道路的好榜样,这不仅仅是您渊博的学识让我无比钦佩,也是您给学生指导时给人的感觉一直都是那么的平易近人,这也让我很感动。再次谢谢您,我的导师!

核心代码展示

/**
 * 公告通知
 * 后端接口
 * @author 
 * @email 
 * @date 2021-03-09 11:33:59
 */
@RestController
@RequestMapping("/news")
public class NewsController {
    @Autowired
    private NewsService newsService;
    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
        EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
		PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,NewsEntity news, HttpServletRequest request){
        EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
		PageUtils page = newsService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, news), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( NewsEntity news){
       	EntityWrapper<NewsEntity> ew = new EntityWrapper<NewsEntity>();
      	ew.allEq(MPUtil.allEQMapPre( news, "news")); 
        return R.ok().put("data", newsService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(NewsEntity news){
        EntityWrapper< NewsEntity> ew = new EntityWrapper< NewsEntity>();
 		ew.allEq(MPUtil.allEQMapPre( news, "news")); 
		NewsView newsView =  newsService.selectView(ew);
		return R.ok("查询公告通知成功").put("data", newsView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        NewsEntity news = newsService.selectById(id);
        return R.ok().put("data", news);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        NewsEntity news = newsService.selectById(id);
        return R.ok().put("data", news);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody NewsEntity news, HttpServletRequest request){
    	news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(news);
        newsService.insert(news);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody NewsEntity news, HttpServletRequest request){
    	news.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(news);
        newsService.insert(news);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody NewsEntity news, HttpServletRequest request){
        //ValidatorUtils.validateEntity(news);
        newsService.updateById(news);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        newsService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<NewsEntity> wrapper = new EntityWrapper<NewsEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = newsService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栗豆包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值