三一在线学习平台之订单管理 和课程推荐模块的设计与实现

      内容摘要:

我们已经进入2020年,中国社会快速地发展。在信息产业方面的成长也非常迅猛,对教育也起着重要影响,Internet带给我们的不仅是无限数量的信息,使教育模式也发生了排山倒海一般的变革,在线教育也成为了当前的一种教育趋势,在线学习的视频网站成为教育中的一项重要部分。因此我们决定做一个在线教育的视频项目,该项目具有视频管理,视频播放,用户登录注册,用户权限管理,订单管理,积分系统等。有了网上学习平台,打破了以往只能在学校学习的传统教育模式。

我主要研究的内容是课程推荐和订单管理模块,课程推荐可以在后台对首页课程进行管理,可以实现课程种类增删改查和每个课程的增删改查,还可以决定课程和课程种类是否在首页显示。对于订单,用户可以登录注册后,创建订单,支付订单,通过订单进入课程。本文基于B/S结构和Html+Thymeleaf技术,采用Java语言和sts4的编译工具、MySQL数据语言进行编写的项目模块。B/S结构模式统一了客户端,将我的项目模块实现的核心部分集中到服务器上,简化了模块的开发和使用,升级和开发方式简单,成本不高,选择比较多。

本项目还使用了jquery、vue的js框架、LayUI的前端框架、Springboot、Spring、SpringMVC、Spring Data Jpa开发等相关技术。

本课题的设计目标是实现一个在线学习课程视频的网站,用户会员首先能够注册及登录,可以对想要看的课程进行购买,进入课程详情后可以收藏,可以评价,可以点击视频进行播放等功能。后台管理员能够创建用户去指定管理员,并且添加想授予用户的权限。本次毕设模块采用分层的设计和编写的理念,将整个项目分为前台适合用户需求的功能模块和后台管理功能的模块,任务完成后结果是完整的前台在线学习界面和后台数据管理界面,实现设计目标中我的模块所有功能,就是课程推荐和订单管理。

关键词:课程推荐,订单,springboot技术,课程管理,订单管理

第1章绪论

1.1选题的背景、目的和意义

1.1.1选题背景

随着社会经济及网络技术的不断发展,知识付费在网络上异军突起[4]。付费课程、专栏订阅、内容赞赏、有偿问答、社群等多样的形式,以及自主性和针对性较强、价格大多亲民的特点,使其迅速引发关注和热烈讨论[4]。在极短的时间内,知识付费迅速发展[4]。中国知识付费市场研究报告显示:2017 年中国知识付费产业规模约为 49 亿元,预计 2020 年达到 235 亿元[4];内容付费渗透率全面提升,这表明越来越多的用户愿意为有偿知识掏腰包[4]。付费课程是知识付费形式中发展较为成熟的一种类型。在互联网全面普及的现代,复制粘贴即可获取的信息成本几乎为零,而信息过载又十分严重,导致人们淹没在海量良莠不齐的知识中难以抉择[4]。 知识付费的出现,既给消费者们带来了更多学习资源,同时也有效地提升其原创知识作者的创作积极性[4]。同时,知识付费并非一次性服务,具有一定用户黏性,这样的良性行业生态一旦形成, 能够从根本上撼动信息爆炸时代的劣质信息问题,提升用户的知识获取体验[4]。长此以往,这样稳定优质的知识平台会吸引越来越多的消费者,消费需求逐步扩大,从而使知识付费的经济总量不断增加。同时,它能促使优质知识不断产生,促进知识传播与交流,带来积极的社会效益[4]。

1.1.2选题目的和意义

XXX,我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。如何解决教育领域的这一对矛盾,是当前和今后教育改革和发展的重中之重,教育是支持一个国家和社会发展的重要力量,走进2020年,我们已经走进了信息时代。信息产业的速度发展非常快速,并且推动着各行业的进步。对教育也起着重要影响。因特网带给我们的不仅是无穷无尽的信息,此外,网络对教育模式和机构也发生了巨大变革,在线网络教学也慢慢成了现在的一种新的教育趋势。因为计算机行业的迅速发展给为信息的快速交流提供了物质上的保证,从而为先进知识的交流和传播提供前提,因而在线教育成为一种领先的教育趋势。另外随着学校与网络方面的联系不断提高,学校里老师的各种优秀的教学课程不断增加,避免教学资源出现混乱,为了更好服务于学生,让学生因为课程太难可以反复学习课程,建立了一个在线教育学习系统也显得尤为重要。三一在线学习平台采用B/S结构,市场上类似的平台有:网易云课堂、腾讯课堂等,三一在线学习平台的特点是全职业课程在线学习。原理上借鉴了MOOC的设计思想,是一个提供全职业课程在线学习的平台,它为学生和已经参加工作的人才提供在线学习服务,用户通过在线学习、在线练习等学习内容,最终掌握所学的技能,并能在工作生活中熟练应用。该课题中比较重要的模块有订单管理和热门课程的推荐,用户授权等。

本课题研究工作主要是订单管理和热门课程推荐。学成在线的课程分为免费和收费两种。对于收费课程,用户需提交订单并完成支付方可在线学习。课程需要花钱购买才可以学习,高质量的课程内容付费具备很大的优势,用户因为相信老师的能力、认可老师的教学观点而付费学习,自然会更加认可老师持续创作出教学内容,这将激励老师创作更优秀的课程服务于学生,课程订单就形成了一个正向循环的激励,现在在信息很泛滥,鱼龙混杂,学生用户会认为付费的购买的课程内容更优秀,更加珍贵。而且是自己认可的,并且已经为此支付了一笔钱,学生为了珍惜钱,为了物超所值,一定会长时间保留课程并且认真学习来提高自己的知识水平,通过课程订单,学校的老师们只需要把时间更多的花在专注内容创作上,制作出学生需要的课程。节省了时间成本,老师创作的课程更加高质,自然容易带来更多的付费的用户。反过来又会给予教师正向的刺激。在正向的反馈循环下,在线学习平台会更加健康。而热门课程推荐将面向学生,可以让学生更加快捷地了解自己所需要地优质课程,做出自己地选择,提供人性化服务,吸引更多地学生参加,使三一在线学习平台吸引更多的人。

1.2国内外研究现状

国内研究现状:随着社会经济及网络技术的不断发展,知识付费在网络上异军突起[4]。付费课程、专栏订阅内容赞赏、有偿问答、社群等多样的形式,以及自主性和针对性较强、价格大多亲民的特点,使其迅速引发关注和热烈讨论。在极短的时间内,知识付费迅速发展[4]。 中国知识付费市场研究报告显示:2017 年中国知识付费产业规模约为 49 亿元,预计 2020 年达到 235 亿元[4];内容付费渗透率全面提升,这表明越来越多的用户愿意为有偿知识掏腰包[4]。

国外研究现状:国外的知识付费并没有如国内一般演化出多种形式的知识平台,一方面国外的移动支付不够普及,另一方面国外的免费资源平台做的足够优秀,用户的需求可以以免费的形式满足,自然不再需要付费,因此国外的知识付费平台要花更多心思在产品设计、平台运营与知识服务上面,让用户认为在这些平台上付费获取知识是值得的[5]。

1.3本文研究内容

本课题是一个涉及范围相当大的内容,其整个工作需要几年时间甚至更长时间的科研才有可能作出一些成果。由于该课题的周期是很长的,我们一个组有十个人,大学刚刚毕业,不可能超过腾讯,阿里等一流大厂的项目,做三一在线学习平台将分模块完成,所以我制定的作为毕业设计的工作内容为:加深对该课题背景知识和基础知识的了解,尤其是是制作在线学习平台所涉及的java专业知识,认真做好我的模块,也就是对课程的订单管理和热门课程推荐,做项目时要与大家沟通好,还要多了解框架和前后端的相关专业知识,认认真真把我的部分做好,并且帮助组里同学共同把项目完成。

各模块功能:

主要负责订单和热门课程推荐这两个模块。

订单管理模块可以实现订单的创建,支付后才能提交并且创建订单,订单信息保存到订单数据库,订单支付后,学生对订单进行管理,可以通过订单信息进入课程,管理员可以实现对订单的查看。

热门课程推荐是用户打开首页门户网站后,有精品课程推荐,管理员可以对热门课程进行管理,决定是否显示在首页,除了添加首页课程种类也可以添加首页具体课程。

预测成果:

设计并制作课程的订单管理,实现热门课程推荐,与我的模块部分相关的部分也试着完成,并且与其它子系统共同完成三一学习平台。

1.4 本章小结(每章必须有本章小结)

对项目的背景,国内外现状,研究内容有了明确理解,这次毕设一个组分模块做,有些困难,但还是会努力认真完成。

第2章系统需求分析

2.1 可行性分析

2.1.1操作可行性

学校今年要求一个组的人分模块做,做完后想整合怕是很困难,如果没法合到一起,整个项目就乱了,估计所有人都没法完成,我只能尽力完成我的模块。本系统的开发是估计是4个月的时间内完成。前期主要是以学习springboot,框架技术,以及查看模块需求的资料为主,接下来就是对三一在线学习平台我的模块进行分析,设计数据库,前后端,以及中间的连接。对于用户使用者来说,用户对java语言和sql语言不需要理解,通过前端页面就可以达到基本功能需求,可以实现登录注册,修改密码,购买课程,观看视频等功能以及对用户,课程,订单等信息的增删改查管理,用户只要有普通电脑或手机就可以操作,所以在操作上对用户来说是可行的。

2.1.2 经济可行性

经济可行性主要是对模块的花钱和使用进行评价的。这次毕设我的编程工具用的是SpringToolSuite4,mysql和sqlyog图形工具,还有maven库都可以达到不花钱就可以使用,方便开发,关于前端页面开发可以使用LayUI框架方便构建前端,方便美化页面,方便使用。

2.1.3 技术可行性

技术上,三一学习平台主要依赖的是java语言技术,可移植性好,此外,springboot框架已经很成熟,方便使用,前端又有LayUI框架构建前端页面,js,css又很成熟,js也有vue.js,jquery.js。因而开发课程推荐和订单模块在代码编写和使用上是可行的。

2.2系统开发环境及运行环境

 2.2.1 java技术介绍

Java是一种面向对象的编程语言。java有C++的很多优点,但舍弃了C++中一些难以理解的内容,比如指针,Java语言功能强大和而且简单易用,网上也有很成熟的CSDN论坛帮助解决java错误,Java具有简单性、分布式、健壮性、安全性、等特点。在java应用方面,有很多地方可以使用java,比如桌面应用程序、Web应用程序。这次毕业设计做的三一在线网站视频课程学习平台就要用到java,正好可以完成web应用程序,此外,有了java框架SpringBoot的使用,使得项目开发起来比较容易。

 2.2.2 MySql介绍

MySQL是一种关系型数据库。所用的 SQL 是访问数据库的标准化语言。安装一个MySQL远不如一个游戏占的容量大,此外运行速度快、成本不高、有开放的源代码,有着非常多的应用,所以选择MySQL很适合三一在线网站的模块开发。此外MySQL为java提供了API,因此和java接合使用可以更方便地编写毕设项目,安装好Mysql后用sqlyog图形化管理工具可以更方便地管理数据库,大大减轻了负担和操作难度。

 2.2.3 Spring Data Jpa介绍

Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门提供dao层便利地编写。JPA是一种规范,内部是有接口和抽象类。hibernate是一套ORM框架,实现了JPA规范。ORM 表示对象关系映射,也就是实体类和拥有的属性与mysql表里的列进行一一对应。在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中,也就是Mysql。只要有一套程序能够做到建立对象与数据库的关联,操作对象就可以直接操作数据库数据。此外JpaRepository封装了基本的CRUD方法,JpaSpecificationExecutor又可以实现复杂查询,因此选择Spring Data JPA最合适。先创建实体类,通过注解和数据库一一联系,创建实体类的同时进而自动创建数据库表。

 2.2.4 SpringBoot介绍

springboot框架提供了一个强大的自动配置Spring的开发环境,创建起来简单省力,如果用的是SSM,那它已经把SSM之间的复杂配置整合已经做好了,只认真思考逻辑业务就行,使用SpringBoot开发框架可以快速提高开发速度.其主要特性有:

(1)没有XML的配置文件,没有复杂难以理解的代码产生;

(2)可以把应用服务器比如tomcat内嵌其中,自己可以不用太费力地去配置。

(3)根据项目依赖性自动生成Spring框架;

(4)提供支持强大的Restful风格的编码,非常简洁;

(5)很方便的把很多技术整合在一起,方便开发。

2.3方案的设计与比较

目前网络应用软件运行的模式主要有:Client/Server模式,Browser/Server模式。B/S是Internet迅速发展起来的一种新的模式,B/S的客户端是一个标准的浏览器,比如Chrome(谷歌),服务器端是web server,而Web server与数据库和应用服务器的紧密结合,使得这种模式的应用范围不断扩大,有很多企业部门的业务系统项目,企业的MIS系统都会采用B/S,它的优点是便于扩展应用、升级维护简便、不需要开发专门的客户端、不需要特别提醒用户进行特殊的环境设置和软件安装,方便用户操作,也降低了维护项目的成本,客户端只要有热门流行的浏览器就可以了。而相比之下C/S维护、升级不仅麻烦。而且开发服务器端的同时还要开发客户端,费时费力;所以我选择B/S模式。

2.4系统基本功能需求

2.4.1 系统结构

主要功能有:

用户登录注册,首页课程推荐,收藏,视频观看,视频支付,用户管理,广告,订单管理,对课程评论,进入聊天室谈论课程,用户记笔记等功能。

我所做的是订单管理和首页课程推荐模块。首页课程推荐分为课程种类推荐和具体的课程推荐,在后台超级管理员可以对首页展示的课程进行添加,修改,删除,查看具体信息,也可以决定是否在首页显示。

订单管理部分的需求,用户拥有个人中心,用户点击首页的课程进入课程详情后,必须购买才能进入课程,查看视频课程进行学习,用户可以查看订单,删除订单,通过订单进入课程,也可以查看订单具体信息,特别是订单状态,对于未支付的订单可以删除。但支付后,因为订单的重要和特殊性,所以不做订单删除功能。后台管理员可以查看订单的具体信息,最重要的是订单状态,也就是支付还是未支付,很重要的一点是后台管理员无权删除用户的订单,那样用户已经支付的订单被删除后,用户体验性会变差,。订单有未支付和已支付两种状态,支付后才可以进入课程的章节进行学习。

2.4.2系统性能需求

正确性需求:用户可以进入课程进行购买,同时创建订单,订单有未支付和已支付两种状态,支付之后可以进入课程看视频,用户会员能对没有支付的订单进行删除,支付等操作。管理员可以对课程和课程种类进行管理,能查看订单的信息,可以决定课程是否可以在首页显示,来达到推荐课程的目的。

安全性需求:超级管理员对用户权限管理,不允许前台查看课程视频的用户会员随便接触后台数据。

界面需求:界面美观,好看,有轮播图,广告,课程封面各式各样,很好看。

完整需求:项目模块完成后,可以和其他模块整合,达到项目的完整性,与其他模块完美配合,成为一个完整项目,达到用户最终需求。

2.5 模块流程图

2.5.1订单模块,首先用户要注册登录才能购买,然后创建订单,支付后,订单状态改变,成为已支付后可以进入课程查看视频

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

2.5.2课程推荐模块。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

2.6用例图

用例图可以确定参与者与模块功能之间的关系。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

2.7本章小结

本章基于课程推荐和订单管理的项目模块开发,从各方面进行分析得出模块代码可以编写。除此之外,通过对模块的需求分析,分别画出模块的流程图,用例图。分析模块得出了需要的编译工具,编写环境,工具的运行环境,特别是java,maven,sql。

第3章系统设计

3.1 系统模式的设计

本系统的设计分为前端网站的普通用户和后台管理员。权限不一样,超级管理员可以添加不同用户,并且授予不同的权限;

3.2系统设计的技术选择

框架用spring boot开发。

spring boot 核心技术是 spring + SpirngMVC

Spring JPA (底层是hibernate) 操作数据库 增删除改查的

数据库是mysql

UI框架是layui

3.3系统的运行环境

系统:Windows 7及其以上版本Java运行环境1.8(3).Web服务器:Tomcat7及其以上版本

(4).数据库服务器:MySql

(5).浏览器:Chrome

3.4数据库E-R图

3.4.1视频种类E-R图

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

3.4.2视频信息E-R图

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

3.4.4用户信息E-R图

3.5逻辑结构设计

1.视频课程信息和视频课程种类的关系是多对一,一种课程有多个具体的课程,多个视频课程属于同一种。

2.订单信息的实体和课程信息实体的关系是多对一。

3.用户会员的实体和订单信息表的关系式一对多,一个用户可以有多个订单,多个订单只能属于一个用户。

3.6实体间的关系

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

3.7数据库表的设计

(1)视频种类表

字段名 数据类型 长度 是否主键 非空 自增 描述
id Int 11
count bigint 20
create_date_time datetime 创建时间
name varchar 50 名称
sort int 11 排序
update_date_time datetime 更新时间
use_it int 11 是否显示
image_url varchar 150 封面
字段名 数据类型 长度 是否主键 非空 自增 描述
id Int 11
click_hit int 11 点击量
content longtext Html视频代码
create_date_time datetime 创建时间
image_url varchar 150 封面
reply_hit int 11 回复次数
state int 11 状态
title varchar 200 标题
video varchar 500 视频内容
video_desc varchar 200 视频描述
venue_type_id int 11 视频种类
top int 11 是否首页显示
sort int 11 排序
search_hit int 11 搜索次数
hot int 11 是否热门
price decimal 10,2 价格

(2)视频信息表

(3)订单表

字段名 数据类型 长度 是否主键 非空 自增 描述
id Int 11
amount decimal 10,2 订单价格
create_date_time datetime 创建时间
num varchar 100 订单号
member_id int 11 对应用户
venue_id int 11 对应课程
state int 11 状态

用户会员表

字段名 数据类型 长度 是否主键 非空 自增 描述
id Int 11
create_date_time datetime 创建时间
name varchar 50 用户名
nick_name varchar 200 昵称
phone varchar 200 电话号
pwd varchar 200 密码
sex int 11 性别
introduction varchar 100 个人介绍
image_url varchar 200 封面
balance decimal 10,2 余额

3.8本章小结

本章根据系统需求,确定了开发三一在线学习平台所需要的环境,开发用到的技术知识,开发用到的软件编译工具。订单管理和课程推荐的数据库设计是重点,分析表之间互相依赖的逻辑关系,画出E-R实体关系图。然后完成数据表的设计,给表中字段每列做出解释。

第4章系统实现

4.1后台系统搭建

用SpringToolSuite4创建springboot项目,导入相关依赖。然后对项目后台进行分层,配成controller页面交互层,service服务层,entity实体类层,util工具层,config配置层,dao数据库交互层。配置好启动类,在pom.xml中导入需要的依赖。

在resource中添加application.properties。在里面配置:

server.port=80

server.servlet.context-path=/

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.url=jdbc:mysql://localhost:3306/Ke_Tang

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.servlet.multipart.maxFileSize=1000MB

spring.servlet.multipart.maxRequestSize=1020MB

spring.jpa.hibernate.ddl-auto=update

spring.jpa.show-sql=true

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

spring.thymeleaf.cache=false

4.2数据库的创建

以订单表为例,主要代码如下:

@ToString

@Data

@Entity

@Table(name = “t_order”)

publicclassOrder {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateInteger id;

@Column(length=100)

privateString num;//订单号不妨用时间信息来显示

@Temporal(TemporalType.TIMESTAMP)

privateDate createDateTime;//创立时段

@Column(precision = 10, scale = 2)

privateBigDecimal amount;//订单要花的钱

@ManyToOne

@JoinColumn(name=”memberId”)

privateMember member; // 对应的会员

@ManyToOne

@JoinColumn(name=”venueId”)

privateVenue venue; // 对应的具体课程

@Column(length=10)

privateInteger state;

}

创造Order实体类,@ToString,@Data是导入lombok依赖后,可以代替实体类中的Get,Set方法,ToString方法。达到简便的作用。@Entity表明Order类为实体类,@GeneratedValue设置为Mysql的自增,@Id为主键,@Column对应的是mysql表里的列,length长度表示内容的范围。@Temporal表示对时间举行格式化,让人能明白。@ManyToOne,@JoinColumn表明了逻辑关系是多对一,意思就是一个普通用户可以有多个订单,@NotNull表明所在的列数据不能为空,@Table(name =”t_order”)对应数据库表的名称为”t_order”。用同样的步骤和方法也可以用于视频种类和视频课程的实体类。至于set和get方法尚且还有ToString的功用是用来设置值,获得值,ToString方法将能够返回一个目标字符串,便利地显示消息,这个信息让人开发的时候容易看明白。通过这样的方法来完成实体类的同时,通过JPA自动创建数据库表,一举两得。

课程表的实体类主要代码如下:

@ToString

@Data

@Entity

@Table(name=”t_b_venue”)

publicclassVenue {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateInteger id;

@NotEmpty(message=”题目不能是空!”)

@Column(length=200)

privateString title;

@NotEmpty(message=”不能为空!”)

@Column(length=500)

privateString video; //视频

@Column(length=200)

privateString videoDesc; //视频介绍

@Temporal(TemporalType.TIMESTAMP)

privateDate createDateTime;

@Column(length=10)

privateInteger clickHit;

@Column(length=10)

privateInteger replyHit;

@Column(length=10)

privateInteger state;//0未审校 1已审核

@Lob

@Basic(fetch=FetchType.LAZY)

privateString content; //html代码 long text

@Column(length=150)

privateString imageUrl;//封面

@ManyToOne

@JoinColumn(name=”venueTypeId”)

privateVenueType venueType; //类型

@Column(length=10)

privateInteger top;//首页 显示 0 1

@Column(length=10)

privateInteger sort;//排序

@Column(length=10)

privateInteger searchHit; //搜索次数

@Column(length=10)

privateInteger hot;//是否显示 热门

@Column(precision = 10, scale = 2)

privateBigDecimal price;

}

在这个课程类中,@Lob注解的作用是标注内容是长字符串,@Basic(fetch=FetchType.LAZY)表示进行懒加载。Price代指价钱,在precision诠释了精度是10位有效数字,scale是2表示有2位小数,这里由于金额的重要性,所以设为BigDecimal类,而不是double或float类。对我的课程推荐模块来说,我需要的是这张表的数据,通过改变top这一属性的状态来实现对三一在线学习平台的首页课程进行管理,决定显示与否。

课程种类表的实体类如下:

@ToString

@Data

@Entity

@Table(name=”t_a_venue_type”)

publicclassVenueType {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateInteger id;

@NotNull(message=”类型名称不能为空!”)

@Column(length=50)

privateString name; //视频名字

@Column(length=11)

privateInteger useIt; //是否显示 0 1

@NotNull(message=”排序号不能为空!”)

@Column(length=10)

privateInteger sort;

@Temporal(TemporalType.TIMESTAMP)

privateDate createDateTime;

@Temporal(TemporalType.TIMESTAMP)

privateDate updateDateTime;

@Column(length=150)

privateString imageUrl;//封面

}

我的课程推荐模块里,不仅有普通课程推荐,也有课程种类的推荐,管理员在后台通过改变useIt属性的状态来决定首页课程是否显示来达到管理课程推荐的目的。

用户表的实体类主要代码如下:

@ToString

@Data

@Entity

@Table(name = “t_a_user”)

publicclassUser {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

privateInteger id;

@NotNull(message=”用户名必须拥有!”)

@Column(length=30)

privateString name;

@ManyToOne

@JoinColumn(name=”roleId”)

privateRole role;

@Column(length=200)

privateString pwd;

@NotNull(message=”真实姓名不能为空!”)

@Column(length=200)

privateString trueName;

@Column(length=200)

privateString remark;

@NotNull(message=”排序号不能为空!”)

@Column(length=10)

privateInteger orderNo;

@Temporal(TemporalType.TIMESTAMP)

privateDate createDateTime;

@Temporal(TemporalType.TIMESTAMP)

privateDate updateDateTime;

@Column(length=200)

privateString imageUrl;

}

这是普通用户的实体类,在订单模块中,前端网站用户会员对订单管理,也能对订单的详细消息进行查看,也需要显示用户的一些信息。后台管理员更需要对用户的订单信息详情进行查看。

4.3持久层构建

关于dao层持久层,可以创建dao层接口,继承JpaRepository和JpaSpecificationExecutor,jpa里面封装了CRUD的常用方法,JpaSpecificationExecutor用于满足繁杂的多条件查询。主要代码以视频种类的dao层接口为例:

publicinterfaceVenueTypeDao extendsJpaRepository<VenueType,Integer>,JpaSpecificationExecutor<VenueType> {

@Query(value=”select * from t_a_venue_type where id = ?1″,nativeQuery = true)

publicVenueTypefindId(Integer id);

}

在接口里面findId方法,通过注解@Query编写sql语句来实现与数据库联系与操作,在sql语句的id=?1中,?1表示与括号中第1个参数对应,nativeQuery = true表示执行原生sql语句,使value里面的sql语句和数据库表中的表名,列名一一对应。然后用同样的方法实现订单和具体课程的dao层接口。

订单的Dao层主要代码如下:

publicinterfaceOrderDao extendsJpaRepository<Order,Integer>,JpaSpecificationExecutor<Order> {

@Query(value=”select * from t_order where id = ?1″,nativeQuery = true)

publicOrder findId(Integer id);

@Query(value=”select COUNT(*) from t_order where member_id = ?1 and venue_id = ?2″,nativeQuery = true)

publicInteger find_memberId_venueId(Integer memberId,Integer venudId);

}

课程的Dao层主要代码如下:

publicinterfaceVenueDao extendsJpaRepository< Venue,Integer>,JpaSpecificationExecutor< Venue> {

@Query(value=”select * from t_b_venue where id = ?1″,nativeQuery = true)

publicVenue findId(Integer id);

publicVenue findByContent(String content);

publicVenue findByTitle(String title);

public List<Venue> findByVenueType(VenueType venueType);

}

在课程的接口dao层中,可以看到很多与数据库交互的方法没有@Query注解,也没有写sql的语句,因为在JPA中,对与数据库交互的方法的名字有特别的规则约束,底层都让JpaRepository封装实现。可以省很多事情。

4.4课程推荐的实现。

thymeLeaf是使用html的标签来完成逻辑和数据的传入,作用上达到jsp的效果,同时前端代码和后端java代码分离,编写和理解起来比较方便。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

课程推荐分为课程种类推荐和课程推荐。图片是课程推荐的前端页面展示,课程种类和课程的推荐主要的前端代码如下:

<divclass=”model”style=”background-color: white; ” >

<divclass=”content”style=”min-height: 10px; “>

<divstyle=”margin-top: 50px; overflow: hidden;”>

<div>

<spanstyle=”border-bottom: 4px solid #009688; padding: 12px 7px;”>

<spanstyle=”line-height: 55px; height: 60px;

font-size: 16px;”>课程分类:</span>

</span>

</div>

</div>

<divstyle=”margin-top: 10px; overflow: hidden;”>

<astyle=”float: left; margin-right: 25px;” th:href=”|/venue/type/${type.id}|”th:each=”type : ${typeList}”>

<imgstyle=”width: 150px; height: 150px; border-radius: 5px;” th:src=”${type.imageUrl}”/>

<divstyle=” text-align: center;” th:text=”${type.name}”></div>

</a>

</div>

</div></div>

<divclass=”model”style=”background-color: white;” >

<divclass=”content”style=”min-height: 100px;”>

<divstyle=”margin-top: 50px; overflow: hidden;”>

<div>

<spanstyle=”border-bottom: 4px solid #009688; padding: 12px 7px;”>

<spanstyle=”line-height: 55px; height: 55px; font-weight: bold;

font-size: 16px;”>热门课程</span>

</span>

</div>

</div>

<divstyle=”margin-top: 10px; overflow: hidden;”>

<divstyle=” padding:10px; margin-bottom: 12px;display: -webkit-flex;” th:each=”venue : ${venueList}”>

<ath:href=”|/venue/${venue.id}|”><imgstyle=”width: 150px; height: 150px; border-radius: 5px;” th:src=”${venue.imageUrl}”/></a>

<divstyle=”overflow: hidden; flex:1;-webkit-flex:1; padding-left: 10px;”>

<divstyle=”font-size: 18px; “><ath:href=”|/venue/${venue.id}|”th:text=”${venue.title}”></a></div>

<divth:text=”${venue.videoDesc}”style=”border: 1px solid #eee; height: 111px; color: #5d5d5d; overflow: hidden;”>

</div>

<divstyle=”color: #5d5d5d; border: 2px ;”>

<spanstyle=”margin-right: 15px;” th:text=”|创建时间:${#dates.format(venue.createDateTime, ‘yyyy-MM-dd HH:mm:ss’)}|”></span>

<spanstyle=”margin-right: 15px;” th:text=”|浏览量:${venue.clickHit}|”></span>

</div>

</div>

</div>

</div>

</div>

</div>

这是课程推荐里前端代码,而这部分如果要展示数据,也需要和后台controller层进行交互,才能得到数据并且显示页面。后台的控制器那一层的代码如下:

@RequestMapping(“/”)

publicModelAndView index_1(HttpServletResponse res,HttpServletRequest req) throwsException {

ModelAndView mav= newModelAndView();

mav.setViewName(“/pc/index”);

Pageable pageable= PageRequest.of(0, 100, Sort.Direction.ASC,”sort”);

Page<HotWord> pageList= hotWordDao.findAll(pageable);

List<HotWord> hotWordList= pageList.getContent();//拿到list集合

mav.addObject(“hotWordList”, hotWordList);

Map<String, Object> map= newHashMap<String, Object>();

map.put(“useIt”,1);

List<VenueType> typeList= venueTypeService.list(map, 0, 100);

mav.addObject(“typeList”, typeList);

map.put(“state”,1);

map.put(“top”,1);

List<Venue> venueList= venueService.list(map, 0, 100);

mav.addObject(“venueList”, venueList);

mav.addObject(“title”, “首页”);

returnmav;

}

通过这种方式,用户访问首页,就会与controller层进行交互,controller层方法得到数据并且推送至前端,前端接收数据,并且在首页页面展示。但除此之外,后台管理员也要对首页课程进行管理,决定是否在首页显示来推荐给用户。管理员的课程管理界面如下:

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

通过来控制是否显示的按钮来改变数据库中对应的状态值,来管理首页课程是否显示,我主要负责的模块是课程推荐,这部分与课程管理有关,所以不详细论述。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

点击导航栏的近期热门,页面分成两个部分,一个是课程的收藏量和浏览量柱状图,一个是显示近期热门。近期热门的课程展示和首页课程推荐的编写过程是一致的,管理员可以对近期热门课程的展示进行管理,确定是否显示。

4.5订单模块的实现

订单模块普通用户需要注册登录,点击首页的课程进入课程的详细页面

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

进入课程详情页面后,点击购买,会进入确认订单的页面

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

“我的订单”是在个人中心的页面里左边导航栏里,能够看到这个页面,用户首先必须登录。点击创建订单后进入支付界面,进入支付界面,如果没有点击支付,这个时候点击“我的订单”,刚刚创建的订单状态会显示为未支付,这时候未支付的订单能删除,订单如果支付了,状态会发生改变,同时普通用户会员的订单管理界面订单操作按钮会改为查看订单和进入课程。对于因为已经支付后的订单信息的重要性,所以不允许随意删除,但未支付的订单没有多重要,一直存在而且不删除会影响用户体验。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

进入订单详情后,订单详情展示的是下单时间,订单编号,订单价格,是否支付,用户会员名字等信息。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

这是前端用户会员的订单功能。除此之外后台管理员也能查看订单。后台管理员能查看订单信息,点击查看后显示具体详情,特别是支付状态会根据是否支付而显示不同的订单状态,因为逻辑需求和订单模块的重要性,不添加管理员删除订单的功能,因为管理员如果删除了订单,则普通用户就无法使用创建的订单,对用户的体验是一种破坏。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

与订单有关的一些主要的部分代码:

订单创建:

<divclass=”model”style=”background-color: #c7c7c733; ” >

<divclass=”content”style=” min-height: 500px; padding-top: 20px;”>

<h1style=”text-align: center; line-height: 75px;” th:text=”${title}”></h1>

<divstyle=” display: flex;display: -webkit-flex; border-radius: 7px; padding: 10px;background-color: white;”>

<imgstyle=”width: 150px;” th:src=”${venue.imageUrl}”/>

<divstyle=” flex:1;-webkit-flex:1; padding-left: 19px;”>

<divstyle=”line-height: 20px; min-height: 60px;” th:text=”${venue.title}”></div>

<divstyle=”color: red; font-size: 22px; font-weight: bold;” th:text=”|¥${venue.price}|”>22.36</div>

</div>

</div>

</div>

</div>

<divclass=”model”style=”background-color: #c7c7c733; ” >

<divclass=”content”style=” overflow: hidden; padding: 20px 0px 20px 0px; min-height: 51px; “>

<divclass=”jiesuan”>

<divclass=”jiesuan_heji”>

<divstyle=” color: #797373; line-height: 50px; font-size: 16px; letter-spacing: 2px;”>

订单金额:<spanid=”total_heji”style=”color: #E91E63; font-weight: bold;” th:text=”|¥${venue.price}|”>¥0.00</span>

</div>

</div>

<divclass=”pay_btn”onclick=”pay()”>

创建订单

</div>

</div>

</div>

</div>

functionpay(){

$.post(“/api/order/add”, {venueId:'[[${venue.id}]]’}, function(result) {

layer.closeAll();

if(result.success){

layer.alert(‘订单创建成功’, {

skin: ‘layui-layer-lan’//样式类名

,closeBtn: 0

}, function(){

layer.closeAll();

$(“.pay_btn”).attr(“onclick”,”void();”);

$(“.pay_btn”).text(“订单创建成功”);

window.location.href = “/order/”+result.orderId;

});

}else{

layer.msg(result.msg);

}

}, ‘json’);

}

用户的订单列表:

<script>

vartable;

layui.use([ ‘laydate’, ‘laypage’, ‘layer’,’form’, ‘table’, ‘carousel’,

‘upload’, ‘element’], function() {

table = layui.table;

});

functionreload_data(){

varstate = $(“#state”).val();

table.reload(‘table’, {where: {state:state },page: {curr: 1 }

});

}

functiondel(ids){

varindex = layer.load(1, {

shade: [0.1,’#fff’]

});

$.post(‘/api/order/delete’,{ids:ids},function(result){

if(result.success){

layer.closeAll();

layer.msg(‘删除成功’);

reload_data();

}else{

layer.closeAll();

layer.msg(result.msg);

}

},’json’);

}

functiongo(id){

window.location.href = “/order/”+id;

}

</script>

<body>

<divclass=”wrap”>

<divclass=”model”style=”background-color: white; ” >

<divclass=”content”style=” min-height: 700px; overflow: hidden; display: flex;display: -webkit-flex; “>

<divth:include=”/pc/member/left_menu.html”style=”width: 250px; padding-top: 15px; padding-bottom: 15px; “>

</div>

<divstyle=”flex:1;-webkit-flex:1;padding-top: 15px; “>

<divclass=”layui-table-toolbar”style=”margin-bottom: 3px; “>

<divclass=”layui-btn-group”>

<buttonclass=”layui-btn layui-btn-sm”onclick=”reload_data()”><iclass=”layui-icon”></i>刷新</button>

</div>

</div>

<divclass=”layui-form layui-form-pane”style=”margin-bottom: 3px; ” >

<divclass=”layui-form-item”style=”min-width:1048px;margin-bottom: 1px; “>

<labelclass=”layui-form-label”style=”width: 105px;”>状态</label>

<divclass=”layui-input-inline”style=” margin-right: 2px;width: 120px;”>

<selectname=”state”id=”state”lay-filter=”state”>

<optionvalue=””>全部</option>

<optionvalue=”0″>未付款</option>

<optionvalue=”1″>已付款</option>

</select>

</div>

<divclass=”layui-input-inline”style=” width: 113px;”>

<aclass=”layui-btn”onclick=”reload_data()”>查询</a>

</div>

</div>

</div>

<tableclass=”layui-hide”id=”table”lay-filter=”table”></table>

</div>

</div>

</div>

<!– 底部 内容 模块 –>

<divth:include=”/pc/common/foot”>

</div>

<!– 底部 内容 模块 –>

</div>

</body>

<scripttype=”text/html”id=”table_bar”>

<div class=”layui-btn-group”>

{{# if(d.state==0){ }}

<a class=”layui-btn layui-btn-xs layui-btn-warm” lay-event=”go”>立即付款</a>

<a class=”layui-btn layui-btn-xs layui-btn-normal” lay-event=”del”>删除</a>

{{# } else if(d.state==1){ }}

<a class=”layui-btn layui-btn-xs layui-btn-normal” lay-event=”go”>查看订单</a>

<a class=”layui-btn layui-btn-xs layui-btn-normal” lay-event=”kecheng”>进入课程</a>

{{# } }}

</div>

</script>

<scripttype=”text/html”id=”format_venue”>

{{# if(d.venue){ }}

{{ d.venue.title}}

{{# } }}

</script>

<scripttype=”text/html”id=”format_type”>

{{# if(d.venue.venueType){ }}

{{ d.venue.venueType.name}}

{{# } }}

</script>

<scripttype=”text/html”id=”format_state”>

{{# if(d.state==0){ }}

未付款

{{# } else if(d.state==1){ }}

<beg>已付款</beg>

{{# } }}

</script>

<script>

layui.use([ ‘laydate’, ‘laypage’, ‘layer’, ‘table’, ‘carousel’,

‘upload’, ‘element’], function() {

varlaydate = layui.laydate //日期

, laypage = layui.laypage //分页

,layer = layui.layer //弹层

, table = layui.table //表格

, carousel = layui.carousel

, upload = layui.upload

, element = layui.element; //元素操作

table.render({

elem: ‘#table’

,url: ‘/admin/order/list?memberId=[[${member.id}]]’

,height: ‘630’

,totalRow: true

,cols: [ [

{field:’num’, title: ‘订单号’, width:150,style:’font-size: 11px;’}

,{field:’amount’, title: ‘订单金额’, width:120,style:’font-size: 12px;’}

,{field:’venue’, title: ‘标题’, width:120,style:’font-size: 11px;’,templet: ‘#format_venue’}

,{field:’state’, title: ‘订单状态’, width:120,style:’font-size: 12px;’,templet: ‘#format_state’}

,{field:’createDateTime’, title: ‘创建时间’, width:150,style:’font-size: 12px;’}

,{fixed:’right’, width:160,title: ‘操作’, toolbar: ‘#table_bar’}

] ]

,id: ‘table’

,page: true

,limits:[500,1000,2000,3000],

limit:100

});

//监听工具条 table_bar

table.on(‘tool(table)’, function(obj) {

vardata = obj.data

, layEvent = obj.event;

if(layEvent === ‘go’){

go(data.id);

}

if(layEvent === ‘del’){

del(data.id);

}

elseif(layEvent === ‘kecheng’){

window.location.href = “/venue/”+data.venue.id;

}

});

});

</script>

订单信息的查看:

<divclass=”my_list”style=”margin-top: 6px;” >

<divclass=”my_list_item”>

<divstyle=”color: #636262;padding: 10px;font-size: 13px; “>

课程信息

</div>

</div>

<divclass=”my_list_item”>

<divstyle=”color: #636262;padding: 10px; font-size: 13px; “>

<divstyle=”display: flex;display: -webkit-flex;”>

<imgstyle=”width: 150px;” src=”/static/upload_image/venue_cover/下载.jpg”/>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 17px;”>

<divstyle=”font-size: 18px; line-height: 30px; min-height: 60px;” th:text=”|${order.venue.title}|”></div>

<divclass=”ber”th:text=”|¥${order.venue.price}|”></div>

</div>

</div>

</div>

</div>

</div>

<divclass=”my_list”style=”margin-top: 6px;” >

<divclass=”my_list_item”>

<divstyle=”padding: 10px;font-size: 14px; color: #636262;”>

订单信息

</div>

</div>

<divclass=”my_list_item”>

<divstyle=”padding: 10px; font-size: 14px; color: #636262;”>

<divstyle=”padding: 6px 1px 6px 1px;display: flex;display: -webkit-flex; “>

<divclass=”beg”style=”width: 90px;” >下单时间:</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:text=”${#dates.format(order.createDateTime, ‘yyyy-MM-dd HH:mm’)}”>xx</div>

</div>

<divstyle=”padding: 6px 1px 6px 1px;display: flex;display: -webkit-flex; “>

<divclass=”beg”style=”width: 90px;” >订单编号:</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:text=”${order.num}”></div>

</div>

<divstyle=”padding: 6px 1px 6px 1px;display: flex;display: -webkit-flex; “>

<divclass=”beg”style=”width: 90px;” >订单金额:</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:text=”${order.amount}”></div>

</div>

<divstyle=”padding: 6px 1px 6px 1px;display: flex;display: -webkit-flex; “>

<divclass=”beg”style=”width: 90px;” >用户昵称:</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:text=”${order.member.nickName}”></div>

</div>

<divstyle=”padding: 6px 1px 6px 1px;display: flex;display: -webkit-flex; “>

<divclass=”beg”style=”width: 90px;” >联系电话:</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:text=”${order.member.phone}”></div>

</div>

<divstyle=”padding: 6px 1px 6px 1px;display: flex;display: -webkit-flex; “>

<divclass=”beg”style=”width: 90px;” >订单状态:</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:if=”${order.state==0}”>待付款</div>

<divstyle=”flex:1;-webkit-flex:1; padding-left: 15px;” th:if=”${order.state==1}”>已付款</div>

</div>

如果没有支付的话会显示确定支付的按钮:

<divth:if=”${order.state==0}”id=”pay_div”class=”my_list”style=”margin-top: 6px;” >

<divclass=”my_list_item”>

<divstyle=”color: #636262; padding: 10px;text-align: center;font-size: 15px; “>

<buttonid=”pay_btn”type=”button”onclick=”pay()”class=”layui-btn”>确定支付</button>

</div>

</div>

</div>

这样订单模块的的基本功能就已经完成了。在订单管理这一部分前提是需要登录后才能购买和管理,这不是我的模块,我不多论述。

系统测试系统测试是为了找出错误而执行程序测试的流程,好的测试是发现了还没觉察的新问题,有助于改善我的模块。测试的目标就是期望可以用比较少的代价去找到问题所在。

一个好的测试流程常常有以下几个步骤:制定测试计划,编制测试方案,根据测试方案生成测试用例,编写测试的计划书,然后进行测试,把每一次测试的结果记下来。

这次因为分模块做,我的模块是订单管理和课程推荐,主要测试这两个模块。

测试结果:

通过以上的功能测试和可用性测试得出后台管理员通过课程管理,可以控制首页课程是否显示,是否热门,通过这种方法来实现课程的推荐,在首页获得不同的课程。通过对订单模块的测试,用户可以对未支付的订单进行成功删除,和支付,对已经支付的订单,可以查看具体的订单信息,同时可以通过订单进入课程。除此之外,对于后台管理员,可以查看订单的基本信息和详细信息。

通过测试获得的结果和预期设想的结果一致,基本功能可以成功运行,系统性能比较良好,我的模块基本完成。

第5章结论

经过一段时间的努力,毕业设计终于结束了。本文是关于在线课程视频学习的系统,通过阅读本论文可以对我的课程推荐和订单管理模块有一定的了解。本文介绍了系统模块开发所用到的技术,编程语言,运行环境等。在我对这些部分做了深刻剖析搜查之后,对三一在线学习平台中订单模块和课程推荐做了多方面需求分析,有从用户会员的前端网站需求进行分析,也有从后台管理的角度分析课程推荐和订单查看的需求。除了分析自己的模块,也分析与我的模块有接合地方的其他人的模块。之后对模块的概要设计以及详细设计也做了具体的说明,包括系统的前端ui设计,所用的框架,dao层所用的交互方法,以及mysql数据库中几张表的设计,以及对表的解释。

系统的主要特点有:用户会员能看懂,不用特意去学习,不管是管理员还是用户,都会有比较好的提示,页面看起来比较漂亮,操作简单方便,容易使用。

虽然我的模块已经结束了,但由于本人的能力有限,只是刚刚毕业的大四学生,再加上知识欠缺,以及对的企业级业务的需求和逻辑不熟悉,我主要研究java,因为学习java时间短,并不熟练,此外对于Html的页面美工更是非常外行,就连jpa也是做模块期间赶时间新学习的。另外我的测试功能不完善,模块功能太简单、系统的界面不是太漂亮,所以本模块还有很多地方有待完善,等工作后本领知识提高更多的时候,我会继续把项目模块做的更好,更会牢记毕设给我的成长。

参考文献

[1]《2019-2024年中国在线教育市场前景及投资机会研究报告》.中商产业研究院

[2]《艾媒报告|2018中国在线教育行业白皮书》.艾媒研究院

[3]巩雪. 中国在线教育的发展现状和对策研究[J]. 山东青年, 2015(12).

[4]熊中励. 知识付费课程发展现状研究[J]. 祖国, 2018(20).

[5]杨舒怡. 国内外知识付费平台的对比分析[J]. 情报探索, 2019, 1(6).

[6]《2018-2019中国知识付费行业研究与商业投资决策分析报告》.艾媒研究院

[7]Krause M , Hall M , Williams J J , et al. Connecting Online Work and Online Education at Scale.[J]. Social Science Electronic Publishing, 2017:3536-3541.

[8]Mayadas A F , Bourne J , Bacsich P . Online Education Today[J]. Science, 323.

[9]Xu J . A Study of Extension Strategies of Multimedia Online Teaching Platform in Sports Teaching of Universities[J]. Journal of Computational and Theoretical Nanoscience, 2017.

[10]Mayadas A F , Bourne J , Bacsich P . Online Education Today[J]. Science, 323.

致谢

这次对三一在线学习课程平台的开发,我对课程推荐和订单管理模块的开发已经有了非常清楚的了解。在一个系统模块的开发过程中,首先必须理解模块的业务需求,然后明确需要的技术知识和编译工具以及系统运行的环境,之后设计E-R实体关系,数据库表的设计,最后完成系统模块详细设计和软件测试等流程,通过这次毕设,我对很多技术知识有了新的理解。同时,项目模块的流程已经有了一个完整的认识,在其中我收获到了很多东西。今年学校要求分模块编写程序,难度太大,项目又难,但还是完成了自己的模块部分,收获很多。

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

三一在线学习平台之订单管理 和课程推荐模块的设计与实现

价格 ¥9.90 发布时间 2023年5月5日
已付费?登录刷新
下载提示:

1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。

2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。

3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。

原创文章,作者:1158,如若转载,请注明出处:https://www.447766.cn/chachong/134762.html,

Like (0)
1158的头像1158编辑
Previous 2023年5月5日
Next 2023年5月5日

相关推荐

My title page contents