博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
更多项目地址 介绍 qq_251836457-CSDN博客
下方有源码获取地址
系统实现结果
电影院管理系统主要是为了管理和控制电影的管理情况,对用户的和用户管理、用户注册、最新电影、电影分类管理、场次管理、电影、订单中心管理、取消订单管理提供了方便的机制。本系统有多类使用者,分别是超级管理员、一般管理员和普通用户。以下是从这三种用户的角度分别介绍本系统所要实现的功能。
普通用户:
注册:首先检查用户名和邮箱是否存在,如果都不存在才能进行注册,并将用户输入的密码进行MD5加密,注册成功后提示注册成功,并将用户保存到数据库中。
登录:使用系统前提是需要登录账号。
留言:进入留言界面,发表个人的留言以及回复已存在的留言,更新后,其他用户可以查看回复的留言。
评价:在电影的基础上发表对电影的评价,评价按时间形成评价列表。
收藏:在电影的基础上对电影的收藏,收藏按时间形成收藏列表,个人对其收藏夹进行维护和整理。
资讯搜索和浏览:资讯展示功能模块主要包括资讯搜索、查看资讯详情功能。未注册用户(游客)和已注册用户均可以在首页进行资讯搜索及查看资讯详情。
电影搜索和浏览:电影展示功能模块主要包括电影搜索、查看电影详情功能。未注册用户(游客)和已注册用户均可以在首页进行电影搜索及查看电影详情。具体功能需求如下:(1)电影搜索:前台用户可以在前台输入关键词进行搜索,搜索成功后返回该电影的动态排序列表,且能够进行分页展示。(2)查看电影详情:用户可点击对应电影,从而查看该电影的电影详情。
电影选座预订:电影已存在的前提下,提供电影的选座预订功能,电影选座预订成功后,可以查看到个人已有的电影选座预订列表。
管理员:
用户管理:(1)新增用户,用于创建新用户。管理员在页面上选择"新增用户",输入用户所需的后保存。(2)查找用户,可根据条件查找用户。管理员第一次点击"用户列表"时,默认用户列表显示出全部的用户,可以根据用户姓名和出生年月进行模糊搜索,系统将查询到的用户显示到用户列表。如果不加限制、直接点击搜索按钮,则查询出全部的用户。(3)删除用户,用于删除已有用户。在用户列表显示出用户后,选择用户进行删除。在确定删除之后,该条记录将从数据库中删除,并提示删除成功,确认后列表会重新刷新。(4)修改用户,在用户列表显示出用户后,选择用户进行编辑。表单将出现已有用户,用户可以对已有进行确认更改。更改完成后选择确认,列表会重新刷新。
电影管理:
(1)电影列表:展示所有电影,形成的列表样式。
(2)电影搜索:通过电影名、电影类目来搜索电影。
(3)图片上传:给电影添加电影图片。
(4)增加电影;
(5)更新电影:更新电影的,如电影名称、电影分类、电影海报、导演、演员、上映日期、放映场次、放映时间、放映厅、影院名称、影院地址、价格、座位总数等。
(6)电影上下架;
资讯数据管理:
(1)图片上传:给资讯添加资讯图片。
(2)增加资讯;
(3)更新资讯:更新资讯的,如资讯标题、内容等。
(4)资讯数据删除销毁;
选座预订记录管理:
(1)按选座预订记录编号查询选座预订记录:
(2)查看选座预订记录详情:
系统非功能需求有非常多,比如性能需求、可承载最大用户数、稳定性、易用性需求等。本系统分析时考虑到易用性需求,因为系统是给人使用的,所以必须充分从用户的角度出发,考虑用户体验,使系统易理解易上手易操作。
1.普通用户主要使用系统的¥电影选座预订业务,下图所示为普通用户的用例图。
图3-1 普通用户用例图
2.管理员主要负责用户管理、电影管理、电影分类管理、留言管理、系统管理、订单管理,下图所示描述管理员的用例图。
图3-2 管理员用例图
软件系统的架构设计主要是有两部分内容组成,包括硬件构架设计和软件架构设计,一个软件系统的在某一给定点的构架是指这个系统重要构件的组织或结构,这些重要的构件就是通过接口与构件(不断减小的构件与接口所组成)来进行交互的。某个软件或者计算系统的软件架构就是组成该系统的一个或多个结构,他们组成了这个软件的各个部分,形成这些组件的外部可见属性即相互间的联系。
系统架构图如下图所示。
图4-1系统架构图
为了将系统从“做什么”落实到“怎么做”,基于系统设计原则,对系统功能进行更适合编码实现的功能划分。根据上图的系统架构设计,整理出规范的系统功能结构图,为系统的实现编码做好准备。
如下图所示为系统功能结构图。
图4-2系统功能结构图
用户管理针对所有用户和管理员。未注册用户点击注册,进入注册页面填写新用户,得到自定义生成账号后,注册完成。未注册用户注册的活动图如下图所示。
图4-3未注册用户注册活动图
用户可进行登录使用更多功能,首先进入用户登录界面,输入用户账号和密码,后台对账号和密码进行核对验证,验证成功则页面直接显示登录用户昵称代表登录成功,否则返回用户登录界面。用户登录活动图如下图。
图4-4用户登录活动图
用户登录后,进入功能页面,可对自己的进行管理,包括个人,用户管理、电影管理、电影分类管理、留言管理、系统管理、订单管理。用户使用功能活动图如下图所示。
图4-5用户使用功能活动图
用户功能界面可对自己的密码进行修改。进入修改密码界面后核对当前密码,核对成功后填写新密码。修改密码活动图如下图所示。
图4-6修改密码活动图
电影院管理系统采用的数据库是MySQL,该部分将根据系统需求和设计,设计合理的数据库。本系统考虑到之后系统的扩展集群,数据库将不使用外键。此外,不用外键时数据管理也较为简单,操作更加方便,性能更高。
E-R图,更加直观的告诉开发人员系统的各个数据的属性,各个数据之间的联系,各个数据的类型。能通过该模型更直观地了解数据库的设计,并根据对其逐渐改善。
本系统图设计,如下图所示。
图4-7系统E-R图
本系统根据第三范式的思想设计数据库,减少最大程度的冗余,总共建立有多个表,用户表、管理员表、电影表、选座预订表。
表结构如下所示。
film_classification表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
film_classification_id | int | 11 | 是 | 是 | 电影分类ID |
classification_name | varchar | 64 | 否 | 否 | 分类名称 |
classification_number | varchar | 64 | 是 | 否 | 分类编号 |
classified_picture | varchar | 255 | 否 | 否 | 分类图片 |
classification_description | text | 否 | 否 | 否 | 分类描述 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
cancellation_of_order表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
cancellation_of_order_id | int | 11 | 是 | 是 | 取消订单ID |
order_number | varchar | 64 | 否 | 否 | 订单编号 |
movie_title | varchar | 64 | 否 | 否 | 电影名称 |
number_of_sessions | varchar | 64 | 否 | 否 | 场次 |
number_of_purchases | varchar | 64 | 否 | 否 | 购买数 |
total | varchar | 64 | 否 | 否 | 合计 |
purchaser | int | 11 | 否 | 否 | 购买人 |
payment_status | varchar | 64 | 否 | 否 | 支付情况 |
contact_number | varchar | 64 | 否 | 否 | 联系电话 |
cancellation_reason | text | 否 | 否 | 否 | 取消原因 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
movie_attendance表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
movie_attendance_id | int | 11 | 是 | 是 | 电影上座率ID |
movie_title | varchar | 64 | 否 | 否 | 电影名称 |
number_of_seats | int | 11 | 否 | 否 | 上座数 |
date | date | 否 | 否 | 否 | 日期 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
order_center表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
order_center_id | int | 11 | 是 | 是 | 订单中心ID |
order_number | varchar | 64 | 否 | 否 | 订单编号 |
number_of_sessions | varchar | 64 | 否 | 否 | 场次 |
price | varchar | 64 | 否 | 否 | 价格 |
movie_number | varchar | 64 | 否 | 否 | 电影编号 |
movie_title | varchar | 64 | 否 | 否 | 电影名称 |
number_of_purchases | int | 11 | 否 | 否 | 购买数 |
total | varchar | 64 | 否 | 否 | 合计 |
purchaser | int | 11 | 否 | 否 | 购买人 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
pay_state | varchar | 16 | 是 | 否 | 支付状态 |
pay_type | varchar | 16 | 否 | 否 | 支付类型 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
seat | varchar | 64 | 是 | 否 | 座位号 |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
session_management表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
session_management_id | int | 11 | 是 | 是 | 场次管理ID |
venue_name | varchar | 64 | 否 | 否 | 场次名称 |
session_details | text | 否 | 否 | 否 | 场次详情 |
session_number | varchar | 64 | 是 | 否 | 场次编号 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
the_latest_movie表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
the_latest_movie_id | int | 11 | 是 | 是 | 最新电影ID |
movie_title | varchar | 64 | 否 | 否 | 电影名称 |
movie_number | varchar | 64 | 否 | 否 | 电影编号 |
cover | varchar | 255 | 否 | 否 | 封面 |
price | varchar | 64 | 否 | 否 | 价格 |
movie_details | varchar | 64 | 否 | 否 | 电影详情 |
film_classification | varchar | 64 | 否 | 否 | 电影分类 |
number_of_sessions | varchar | 64 | 否 | 否 | 场次 |
hits | int | 11 | 是 | 否 | 点击数 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
user_registration表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
user_registration_id | int | 11 | 是 | 是 | 用户注册ID |
gender | varchar | 64 | 否 | 否 | 性别 |
date_of_birth | varchar | 64 | 否 | 否 | 出生日期 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
user_id | int | 11 | 是 | 否 | 用户ID |
create_time | datetime | 否 | 是 | 否 | 创建时间 |
update_time | timestamp | 否 | 是 | 否 | 更新时间 |
系统中应用的开发工具总结如下表所示。
表5-1开发工具
名称 | 工具 | 版本 |
操作系统 IDE(Integrated Development Environment) | Windows Pycharm | 7/8/10 2017 |
数据库 浏览器 界面工具 | MySQL 谷歌 Photoshop | 5.7 6.0 2016 |
未注册用户在用户注册界面uerRegister.html,输入新用户,点击注册后,新用户由界面传入控制层userAction,调用addUser(user)方法,通过userDAOImp向数据库用户表插入用户,由于用户账号是自动生成的,若成功则反馈注册成功,并提示新用户的用户账号;若失败则回到登录界面,并显示登录失败。
注册界面如下所示。
图5-1注册界面
注册界面关键代码如下所示。
/**
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
query.put("username",user.getUsername());
List list = service.select(query, new HashMap<>()).getResultList();
if (list.size()>0){
return error(30000, "用户已存在");
}
user.setUserId(null);
user.setPassword(service.encryption(user.getPassword()));
service.save(user);
return success(1);
}
/**
* 用户ID:[0,8388607]用户获取其他与用户相关的数据
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
/**
* 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
*/
@Basic
@Column(name = "state")
private Integer state;
/**
* 所在用户组:[0,32767]决定用户身份和权限
*/
@Basic
@Column(name = "user_group")
private String userGroup;
/**
* 上次登录时间:
*/
@Basic
@Column(name = "login_time")
private Timestamp loginTime;
/**
* 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
*/
@Basic
@Column(name = "phone")
private String phone;
/**
* 手机认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "phone_state")
private Integer phoneState;
/**
* 用户名:[0,16]用户登录时所用的账户名称
*/
@Basic
@Column(name = "username")
private String username;
/**
* 昵称:[0,16]
*/
@Basic
@Column(name = "nickname")
private String nickname;
/**
* 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
*/
@Basic
@Column(name = "password")
private String password;
/**
* 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
*/
@Basic
@Column(name = "email")
private String email;
/**
* 邮箱认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "email_state")
private Integer emailState;
/**
* 头像地址:[0,255]
*/
@Basic
@Column(name = "avatar")
private String avatar;
/**
* 创建时间:
*/
@Basic
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Timestamp createTime;
@Basic
@Transient
private String code;
}
用户在首页点击登录,进入用户登录界面uerLogin.html,输入用户账号和密码,点击登录,用户账号和密码由界面传入控制层userAction,调用userLogin(user)方法,通过userDAOImp向数据库用户表搜索该用户账号与密码,将最终结果反馈到前端。若成功则回到首页;用户成功登录,若失败则回到登录界面,并显示登录失败。
用户点击注销,清空浏览器session值,然后返回登录页或者首页。
登录界面如下所示。
图5-1登录界面
登录界面关键代码如下所示。
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
登录用户在首页点击进入用户中心userCenter.html,再点击修改个人按钮进入userChangeInfo.html界面,系统根据session中存储的目前登录的用户的账号,向控制层userAction发送请求,搜索当前用户,userAction向userDAOImp调用queryByUserId(user),向数据库的用户表搜索当前用户并将用户以对象的形式层层返回到userChangeInfo.html界面,显示出当前用户的个人。
若用户要对个人进行修改,则通过修改当前之后点击确认,向控制层userAction发送更改后的用户,调用changeUser(user)方法,通过userDAOImp向数据库用户表更新用户,若成功则反馈注册成功,则返回的userChangeInfo.html界面被更改成功;若失败则显示修改失败。
用户可以发表自己的评论。将页面session中的用户账号userId和发表评论文字框内容和评分传入控制层PinglunAction,调用addPinglun方法,通过PinglunDAOImp向数据库评论表插入,将结果返回Pinglun_list.html界面。
评论中心发表界面如下所示。
图5-1评论发表界面
用户在登录状态下浏览电影时可将该电影加入电影选座预订记录,从session中取出该用户的,点击加入电影选座预订记录后前台发起请求,将对应的电影数量shuliang、id参数从前台传递YudingController类里,匹配到add()方法,add()方法调用YudingServiceImpl类的add()方法。
电影界面如下所示。
图5-1电影界面
电影选座预订界面如下所示。
图5-1电影选座预订界面
管理员在后台管理界面点击到所有电影界面dianyingxinxi_list.html,向控制层dianyingxinxiAction发送请求,搜索当前所有最新电影,dianyingxinxiAction向dianyingxinxiDAOImp调用搜索全部电影的请求,向数据库的电影表搜索当前所有电影并将电影以对象的形式层层返回到dianyingxinxi_list.html界面,显示出当前所有最新电影。若要对电影进行修改和删除,则分别进入dianyingxinxi_updt.html或dianyingxinxi_delete.html,通过dianyingxinxiAction向dianyingxinxiDAOImp调用对应的修改或删除方法,向数据库的电影表做相应的持久层操作。
最新电影管理界面如下所示。
图5-1最新电影管理界面
最新电影管理关键代码如下所示。
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
@Transactional
public void delete(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");
sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));
log.info("[{}] - 删除操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
源码 文档下载获取地址
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者