基于SSH框架的电影订票系统网站的设计与实现

Galaxy

发布日期: 2018-10-05 23:12:23 浏览量: 1661
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 总体描述

1.1 产品前景

目前国内市场上的电影购票网站很多,各个网站都有一定的用户量。用户还处于一种培养习惯的阶段。鉴于目前各个购票网站的质量参差不齐,许多网站都把大部分内容堆积在其首页,我们如果能够做一款用户体验极佳的购票网站,用户有好的体验过程,再加上我们网站特有的功能,用户就会慢慢习惯使用我们的网站,长远看来这有很大的商业机遇。

在我们购票网站中,我们可以通过与影片制片方合作,在我们网页中推荐其即将上映的影片,只要我们的网站流量足够,这无疑会是一个很大的商机。

1.2 产品功能

  • 记录销售交易与实时票务统计
  • 支付交易(使用第三方交易网站进行交易)
  • 用户账号的安全性管理
  • 电影的介绍以及基本了解
  • 提供喜欢电影的推荐以及提醒功能
  • 针对不同使用场景下的自适应界面
  • 基于行业标准,与第三方库进行实时交易,包括电影票务、支付、院线、选座系统等

1.3 用户类及其特征

  • 普通用户:以消遣为主,内容消费较少,对网站的使用体验比较在意,对网 站能够提供的附加功能比较敏感
  • 电影爱好者:对于电影有内容和题材偏好,有喜欢的导演和演员。在意网站 推荐的的电影,在意网站提供关于影片的评价
  • 专业影评人:很在意网站上的评论功能,提供好的评论交互方式会吸引这样 的用户

1.4 运行环境

支持PC端网页访问,移动端暂不支持

1.5 开发环境和工具

  • 终端支持:PC

    开发语言框架:HTML5,CSS3,JavaScript

  • 服务器端支持

    语言:Java,Python

    Web框架:Struts MVC + Spring Boot,Hibernate

    关系数据库:MySQL

    负载均衡机制:Nginx

  • 开发平台与工具

    IDE:eclipse

    集成与测试:Travis

    源代码管理:Github

    项目管理与自动构建:maven

1.6 开发规范

  • WEB前端

    语言:Javascript,html,CSS

    代码风格:JS ES5代码风格;ES6代码风格;CSS代码风格;HTML/CSS代码风格

    自动化检测工具:ESLint

  • WEB后端

    语言:Java

    代码风格 Google Java Style(科学上网),中文翻译

    自动化检测工具:Checkstyle(Ecplise 插件安装教程)

  • 爬虫脚本

    语言:Python 3.6+

    代码风格:Python风格规范

1.7 设计和实现上的约束

  • 设计约束:改变现有购票网站较为杂乱的整体局面,剔除购票流程的冗 余过程,符合现代年轻人审美,尽量做到简洁、美观、大方

  • 可用性:系统需要提供较为完整的第三方接口,以供院线使用。功能完 备,贴合用户要求,能够提供较好的电影购票体验

  • 可靠性:使用行业标准,以便于部不同的第三方接口进行信息交换。有 一定的防差错功能,能保证高峰时期的购票正常

  • 可支持性:标准的接口,在进行信息交换的时候流畅无差错。

1.8 假设和依赖

本平台依赖于PC端运行环境,后台是使用了JAVA进行编写,使用了MySQL数据库管理系统对用户信息、电影及影院信息进行管理,前端页面显示使用了MVC框架。

2 系统功能

ID Name Imp Est How to demo Notes
0 搜索框 7 8 可搜索影片、影院
1 电影 (按钮) 8 12 点击主页面上方“电影”按钮,根据当前电影热度,票房,评分等列出现在上映的所有电影,每个电影的小项里包括名字,影片时长,类型,主演,评分以及选座购票按钮 需要用户授权定位,也可点击定位,手动选择定位
2 影片详情 9 12 页面包括名字,影片时长,上映日期,影片简介,影片评分,影片海报,可选影院部分(推荐)列表,导演编剧等各项信息及选座购票按钮 影片评分我们提供豆瓣,烂番茄,时光网等不同影评网站的评分,使用户参考更多样
3 选座购票 10 9 从影片列表或者影片详情页都可点击选座购票 会有影院列表,点击进去就会看到场次票价,用户可根据需求选择场次,座次
4 即将上映 5 6 在主页面中,给出近期即将上映的所有电影 点击每个分项会进入影片详情页
5 登录 3 11 点击主页面“登录”,进入登录界面,输入用户名密码即登陆成功 在登录界面包含注册按钮,账户可与社交账号绑定或绑定邮箱,要与手机绑定(用于短信提醒)
6 我的主页 6 8 登陆成功后,点击主页面“我的”,进入我的主页 含有电影票订单、优惠方式、收藏三大类,其中优惠方式包含折扣卡、红包、现金券等;收藏分为电影收藏、影院收藏、活动收藏

3 数据库

实体关系图

实体定义

  • user 表:用户表,记录用户的信息,用户名,密码的 MD5,电话,邮箱
  • movie 表:记录电影的信息,包括中文名,英文名,电影类型,电影时长,上映日期,电影简介,电影海报的 URL,参演人员名单
  • person 表:记录电影人的信息,通过 type 列区别是导演还是演员,包括名字,照片 URL,type 电影人的类型(导演/演员)
  • cinema 表:订单编号,电影 id、影院 id、场次 id、座位 id
  • screen 表:荧屏 id,语言,价格,房间 id,时间,影院 id,电影名字,座位 id
  • admin 表:id,名字,密码,email,电话号码
  • movie 表和 person 表是一对多的关联映射关系

四、总体设计

4.1 概念术语描述(后端)

4.1.1 Java

  • java是纯面向对象编程的语言
  • 平台无关性 (一次编译,到处运行;Write Once,Run Anywhere)
  • java提供了许多内置的类库,通过这些类库,简化了开发人员的设计工作,同时缩短了项目开发时间
  • 提供了对Web应用开发的支持,例如,Applet,Servlet,和JSP可以用来开发Web应用程序,,Socket,RMI可以用来开发分布式应用程序的类库
  • 去除了c++中难以理解,容易混淆的特性(如c++中的多继承,头文件,指针,结构,单元,运算符重载,虚拟基础类,使得程序更加严谨,整洁
  • 具有较好的安全性和健壮性。java语言经常会被用在网络环境中,为了增强程序的安全性

4.1.2 Spring

Spring Framework(简称Spring)是根据Rod Johnson著名的《Expert One-on-One J2EE Design and Development》而开发的J2EE应用程序框架。目前主要根据Rod Johnson和Juergen Hoeller而进行开发的,目前发布的最新版为1.1.4。 Spring是J2EE应用程序框架,不过,更严格地讲它是针对Bean的生命周期进行管理的轻量级容器(Lightweight container),可以单独利用Spring构筑应用程序,也可以和Struts,Webwork,Tapestry等众多Web应用程序框架组合使用,并且可以与Swing等桌面应用程序API组合。所以Spring并不仅仅只能应用在J2EE中,也可以应用在桌面应用及小应用程序中。针对Spring开发的组件不需要任何外部库。

优点:

  • Spring能有效地组织你的中间层对象
  • Spring能消除在许多工程中常见的对Singleton的过多使用
  • Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化
  • Spring能够帮助我们真正意义上实现针对接口编程
  • 在Spring应用中的大多数业务对象没有依赖于Spring
  • 使用Spring构建的应用程序易于单元测试
  • Spring支持JDBC和O/R Mapping产品(Hibernate)
  • MVC Web框架,提供一种清晰,无侵略性的MVC实现方式
  • JNDI抽象层,便于改变实现细节,可以方便地在远程服务和本地服务间切换
  • 简化访问数据库时的例外处理
  • Spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理
  • 提供了JavaMail或其他邮件系统的支持

4.2 概念术语描述(前端)

5.2.1 Vue.js

Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

优点:

  • 响应式编程:mvvm框架,实现数据的双向绑定
  • 组件化:一切都是组件,组件可以套其他组件,增强了可复用性
  • 模块化:我们用一个模块打包工具来配合 Vue.js,比如Webpack或者Browserify,然后再加上 ES2015。每一个 Vue 组件都可以看做一个独立的模块
  • 动画:Vue 自带简洁易用的过渡动画系统。有很多获奖的互动类网站是用 Vue 开发的。Vue 的反应式系统也使得它可以用来开发高效的数据驱动的逐帧动画
  • 路由:Vue 本身是不带路由功能的。但是,有vue-router这个可选的库来配合。vue-router 可以将嵌套的路径映射到嵌套的组件,并且提供了细致的路径跳转控制
  • 文档和配套设施:文档和配套设施完善,社区活跃,生态系统完备,易于上手

4.2.2 ES6(ECMAScript 6)

新一代的javascript也被称为ECMAScript 6(也称为 ES6 or Harmony)。

优点:

  • 糖语法:首先,语法糖是一种语法,使得语言更容易理解和更具有可读性,它使语言相对我们来说变得更”甜”。这也意味着ES6的一些”新”的特点并不是真的新,只是试图简化语法而已,让我们编程更容易。这样就无需使用老式的取巧的方法编写你的代码,而是可以一种更简单的方式来编写代码,那就是使用糖语法
  • 模块Module:如果你想将所有js放在一个文件中,或者你要在应用的不同地方使用相同的功能,你就要使用模块,关键词是export
  • let和const:在一段代码块中用let或者const声明的变量会限制它们只在这个块中可见。这叫做块级作用域

4.3 基本设计描述

4.3.1 系统总体逻辑结构图

4.3.2 系统部署结构图

4.4 主要界面流程描述

4.5 模块列表

4.5.1 模块划分

后端 前端

4.5.2 前端结构

4.6 Web服务器

4.6.1 返回的状态码

类型 stateCode info
成功 200 NULL
错误 500 错误信息

4.6.2 用户登录/注册

路由 方法 说明 提交格式 测试
/api/login POST 提交用户登录表单 username, password, 允许邮箱/手机/用户名登录 OK
/api/signup POST 提交用户注册表单 username, password, email, phone OK
/api/logout PUT 登出 OK
/api/user GET 获取当前用户信息 OK
/api/user PUT 修改当前用户信息,填写需要修改的项,username,email,phone,oldPassword,newPassword OK
/api/user/order GET 查看该用户的所有订单 OrderModel OK
/api/user/screen/{id} PUT 锁定/购买座位,需要上传 需要用户登录后 eat={88长字符串, 锁定的位置用1表示,购买位置用2表示,其他用0填充}
  1. // 购票例子:
  2. // 表单格式:
  3. seat=1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  4. // 表示锁定第1,2个位置
  5. seat=0022000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  6. // 表示购买第1,2个位置
  7. // 购买前需要先锁定
  8. public class OrderModel {
  9. private List<FilmOrder> filmOrderModelList;
  10. }
  11. public class FilmOrder {
  12. private Integer id;
  13. private User user;
  14. private Integer screenId;
  15. private String seat;
  16. }

4.6.3 管理员账号

路由 方法 说明 提交格式
/api/admin/login POST adminname, password 登录
/api/admin/logout PUT 登出
/api/admin/newMovie POST 需要填写的域chineseName,englishName,pictureUrl,type,length,releaseDate,introduction
/api/admin/{id} DELETE 当初对应id的电影
/api/admin/{id} PUT 更新电影信息,只需要填写需要更新的域,和创建电影的域名字相同
/api/admin/cinema/{id} DELETE 参数对应id的影院
/api/admin/cinema/create POST 创建一个影院 CinemaModel
/api/admin/cinema/{id} PUT 修改一个影院信息 CinemaModel
  1. CinemaModel {
  2. private String name;
  3. private String address;
  4. private String phone;
  5. private List<Screen> screens;
  6. }

4.6.4 获取电影信息

路由 方法 说明 返回值 测试
/api/movie/name/{查询电影名} GET 返回电影名对应信息,允许查询中英文电影名,返回一条记录或空 SimpMovie OK
/api/movie/type/{type}?id=ID GET 返回电影类型列表, 数目为从id开始往后20条,默认id = 0 List OK
/api/movie/date/day/20170501 GET 返回2017-05-01上映的电影列表,如果输入非法日期,返回当天上映列表 List OK
/api/movie/date/month/201705 GET 返回2017-05上映的电影列表,如果输入非法日期,返回当月上映列表 List OK
/api/movie/date/year/2017 GET 返回2017上映的电影列表,如果输入非法日期,返回当年上映列表 List OK
/api/movie/{id} GET 返回ID=id的电影详细信息 Movie OK
/api/movie/showing/{number} GET 返回最近一个月上映的电影列表,number条 List OK
/api/movie/query/count?type={}&area={}&year={} GET year=2007, 允许type,area,year字段为”all” Integer OK
/api/movie/query?type={}&area={}&year={}&page={}&step={} GET 返回 [pagestap, pagestep+step]的数据,允许type,area,year字段为”all” List OK
  1. SimpMovie {
  2. private String name;
  3. private Integer id;
  4. private String url;
  5. }

4.6.5 获取演员/导演信息

路由 方法 说明 返回值 测试
/api/person/{id} GET 通过演员/导演的ID获取 Person OK
/api/person/movie/{id} GET 获取电影ID的演员/导演名单 List OK
  1. Person {
  2. private Integer id;
  3. // 名字
  4. private String name;
  5. // 照片的URL
  6. private String url;
  7. // 表示是导演还是演员
  8. private String type; // "actor", "director"
  9. }

4.6.6 获取影院信息

路由 方法 说明 接受内容 返回值 测试
/api/cinema?number={}&address={} GET number选填默认10,address必填 List
/api/cinema/{id} GET 返回影院详细信息 Cinema OK
/api/cinema/showing?id={id} GET 返回正在该影院上映的电影简要信息列表 List OK
  1. SimpCinema {
  2. private Integer id;
  3. private String name;
  4. }
  5. Cinema {
  6. private Integer id;
  7. private String name;
  8. private String address;
  9. private String phone;
  10. private List<Screen> screens;
  11. }

4.6.7 获取排片信息

路由 方法 说明 接受内容 返回值 测试
/api/screen?cinemaid={}&movieid={}&date={}&time={} GET 获取对应影院对应电影的排片情况列表 List OK
/api/screen/{id} GET 获取对应id的排片情况 Screen OK
  1. Seat {
  2. private List<Integer> vacancy;
  3. private List<Integer> soldOut;
  4. private List<Integer> locking;
  5. }
  6. Screen {
  7. private Integer id;
  8. private Date time;
  9. private String language;
  10. private String room;
  11. private Double price;
  12. private Cinema cinema;
  13. private String movieName;
  14. private String seats; // '0'->空位,'1'->被锁定,'2'->已售出 8x11 列优先, 比如2行1列下标为8
  15. }

4.6.8 搜索功能

路由 方法 说明 返回值 测试
/api/search?query={}

五、软件设计技术

5.1 前后端分离

5.1.1 理解MVC

MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器。

其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的java Bean,包含一系列的成员变量及其getter/setter方法。对于视图而言,它更加偏重于展现,也就是说,视图决定了界面到底长什么样子,在Java中可通过JSP来充当视图,或者通过纯HTML的方式进行展现,而后者才是目前的主流。模型和视图需要通过控制器来进行粘合,例如,用户发送一个HTTP请求,此时该请求首先会进入控制器,然后控制器去获取数据并将其封装为模型,最后将模型传递到视图中进行展现。

综上所述,MVC的交互过程如图1所示。

5.1.2 MVC模式的优点与不足

MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强。MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Struts、spring MVC等框架。正是因为这些MVC框架的出现,才让MVC模式真正落地,让开发更加高效,让代码耦合度尽量减小,让应用程序各部分的职责更加清晰。

既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:

  • 每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂。

  • 实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果。

  • 渲染视图的过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化。

为了使数据展现过程更加直接,并且提供更好的用户体验,我们有必要对MVC模式进行改进。不妨这样来尝试,首先从浏览器发送AJAX请求,然后服务端接受该请求并返回JSON数据返回给浏览器,最后在浏览器中进行界面渲染。

改进后的MVC模式如图2所示。

也就是说,我们输入的是AJAX请求,输出的是JSON数据,市面上有这样的技术来实现这个功能吗?答案是REST。

REST全称是Representational State Transfer(表述性状态转移),它是RoyFielding博士在2000年写的一篇关于软件架构风格的论文,此文一出,威震四方!国内外许多知名互联网公司纷纷开始采用这种轻量级的Web服务,大家习惯将其称为RESTful Web Services,或简称REST服务。]

如果将浏览器这一端视为前端,而服务器那一端视为后端的话,可以将以上改进后的MVC模式简化为以下前后端分离模式,如图3所示。

可见,有了REST服务,前端关注界面展现,后端关注业务逻辑,分工明确,职责清晰。那么,如何使用REST服务将应用程序进行前后端分离呢?我们接下来继续探讨,首先我们需要认识REST。

5.1.3 认识REST

REST本质上是使用URL来访问资源种方式。众所周知,URL就是我们平常使用的请求地址了,其中包括两部分:请求方式与请求路径,比较常见的请求方式是GET与POST,但在REST中又提出了几种其它类型的请求方式,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。尤其是前四种,正好与CRUD(Create-Retrieve-Update-Delete,增删改查)四种操作相对应,例如,GET(查)、POST(增)、PUT(改)、DELETE(删),这正是REST与CRUD的异曲同工之妙!需要强调的是,REST是“面向资源”的,这里提到的资源,实际上就是我们常说的领域对象,在系统设计过程中,我们经常通过领域对象来进行数据建模。

REST是一个“无状态”的架构模式,因为在任何时候都可以由客户端发出请求到服务端,最终返回自己想要的数据,当前请求不会受到上次请求的影响。也就是说,服务端将内部资源发布REST服务,客户端通过URL来访问这些资源,这不就是SOA所提倡的“面向服务”的思想吗?所以,REST也被人们看做是一种“轻量级”的SOA实现技术,因此在企业级应用与互联网应用中都得到了广泛应用。

下面我们举几个例子对REST请求进行简单描述:可以查看API来更好地理解。

可见,请求路径相同,但请求方式不同,所代表的业务操作也不同,例如,/advertiser/1这个请求,带有GET、PUT、DELETE三种不同的请求方式,对应三种不同的业务操作。

虽然REST看起来还是很简单的,实际上我们往往需要提供一个REST框架,让其实现前后端分离架构,让开发人员将精力集中在业务上,而并非那些具体的技术细节。下面我们将使用Java技术来实现这个REST框架,整体框架会基于Spring进行开发。

5.2 Vue渐进式框架

5.2.1 为什么要有框架

框架的存在是为了帮助我们应对复杂度

前端框架特别多,那么为什么要有框架呢?框架的存在是为了帮助我们应对复杂度。当我们需要解决一些前端上工程问题的时候,这些问题会有不同的复杂度。如果你用太简陋的工具应对非常复杂的需求,就会极大地影响你的生产力。所以,框架本身是帮我们把一些重复的并且已经受过验证的模式,抽象到一个已经帮你设计好的API封装当中,帮助我们去应对这些复杂的问题。

框架自身也有复杂度

框架本身也会带来复杂度。相信大家在调研各种框架或学习各种框架时,会遇到学习曲线问题——有些框架会让人一时不知如何上手。

工具复杂度是为了处理内在复杂度所做的投资

工具的复杂度是可以理解为是我们为了处理问题内在复杂度所做的投资。为什么叫投资?那是因为如果投的太少,就起不到规模的效应,不会有合理的回报。这就像创业公司拿风投,投多少是很重要的问题。如果要解决的问题本身是非常复杂的,那么你用一个过于简陋的工具应付它,就会遇到工具太弱而使得生产力受影响的问题。

反之,是如果所要解决的问题并不复杂,但你却用了很复杂的框架,那么就相当于杀鸡用牛刀,会遇到工具复杂度所带来的副作用,不仅会失去工具本身所带来优势,还会增加各种问题,例如培训成本、上手成本,以及实际开发效率等。

Pick the right tool for the job

“Pick theright tool for the job”——在国外,跟开发者讨论一些框架选型问题时,大家都会说这句话——一切都要看场景。因为,前端开发原生开发或者桌面开发模式相比,有自己的独特之处,它跟其实并不那么固定。在Web上面,应用可以有非常多的形态,不同形态的Web应用可能有完全不同程度的复杂度。这也是为什么要谈工具复杂度和所要做的应用复杂度的问题。

怎么看前端框架的复杂度

目前的前端开发已经越来越工程化,而我们需要解决的实际问题也是不同的。我们就下图进行分析。

我们可能在任何情况下都需要声明式的渲染功能 ,并希望尽可能避免手动操作,或者说是可变的命令式操 ,希望尽可能地让DOM的更新操作是自动的,状态变化的时候它就应该自动更新到正确的状态;我们需要组件系统,将一个大型的界面切分成一个一个更小的可控单元; 客户端路由 ——这是针对单页应用而言,不做就不需要,如果需要做单页应用,那么就需要有一个URL对应到一个应用的状态,就需要有路由解决方案; 大规模的状态管理 ——当应用简单的时候,可能一个很基础的状态和界面映射可以解决问题,但是当应用变得很大,涉及多人协作的时候,就会涉及多个组件之间的共享、多个组件需要去改动同一份状态,以及如何使得这样大规模应用依然能够高效运行,这就涉及大规模状态管理的问题,当然也涉及到可维护性,还有构建工具。现在,如果放眼前端的未来,当HTTP2普及后,可能会带来构建工具的一次革命。但就目前而言,尤其是在中国的网络环境下,打包和工程构建依然是非常重要且不可避免的一个环节。

5.2.2 渐进式框架Vue.js

Vue.js现状

以下数据可以体现出Vue.js的现状。

前一段时间突破了三万星(如下图所示),总下载量过百万。

官网上每个月的用户量为26万,这个应该是不包含中国区数据。官方开发者插件的周活跃用户数在5万5左右。这个数据是我觉得最有说服力的数据。安装并且使用开发者插件的Vue用户,应该会在实际生产中真正频繁使用Vue。

Google搜索趋势的相关数据如下图所示。图中,绿色的是Backbone的数据,黄色是Ember,红色是React,蓝色是Vue。可以看出React和Vue近两年发展势头都比较迅猛。可以看出,Vue的曲线开始的是很早,2013年已经开始,但是有很长一段时间的增长是比较低的。因为在那一段时间我还在谷歌工作,Vue基本上是作为个人项目在运营。在过去一两年中,Vue获得了非常大的突破性发展。这个图里没有Angular,因为Angular的量还是非常大的,如果放进去就破表了。

这些数据并不能绝对地代表框架当前的热度,但有一定的参考价值。可以看到React的势头很足。而由Vue的曲线还可以看出它的增长速度还在不停上扬。

Vue的定位

它与其他框架的区别就是渐进式的想法,也就是“Progressive”——这个词在英文中定义是渐进,一步一步,不是说你必须一竿子把所有的东西都用上。

Vue的设计

接下来我们回到之前看的图:

Vue从设计角度来讲,虽然能够涵盖这张图上所有的东西,但是并不需要一上手就把所有东西全用上 ,因为没有必要。无论从学习角度,还是实际情况,这都是可选的。声明式渲染和组建系统是Vue的核心库所包含内容,而客户端路由、状态管理、构建工具都有专门解决方案。这些解决方案相互独立,你可以在核心的基础上任意选用其他的部件,不一定要全部整合在一起。

6 系统演示

电影订票网站首页

会员注册

会员登录

查找电影

上传的附件 cloud_download 基于SSH框架的电影订票系统网站的设计与实现.7z ( 44.31mb, 76次下载 )
error_outline 下载需要12点积分

keyboard_arrow_left上一篇 : 基于Python实现的抓包分析软件 基于JAVA实现的游戏大厅 : 下一篇keyboard_arrow_right



Galaxy
2018-10-05 23:14:10
电影订票系统网站,目前只支持PC端,暂不支持移动端;前端开发:HTML5,CSS3,JavaScript;后台开发:Struts MVC + Spring Boot,Hibernate;
赵六神
2019-05-15 21:07:29
数据库在那里

发送私信

人生如下棋,必有远见方能获胜

6
文章数
9
评论数
最近文章
eject