一、前言
网络的广泛应用给生活带来了十分的便利。所以把共享厨房信息管理与现在网络相结合,利用java技术建设共享厨房信息系统,实现共享厨房信息的系统化。则对于进一步提高共享厨房信息管理发展,丰富共享厨房信息管理经验能起到不少的促进作用。
共享厨房信息系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知共享厨房信息系统的便捷高效,不仅为群众提供了服务,而且也推广了自己,让更多的群众了解自己。对于共享厨房信息管理而言,若拥有自己的系统,通过系统得到更好的管理,同时提升了形象。
本系统设计的现状和趋势,从需求、结构、数据库等方面的设计到系统的实现,分别为管理员和用户的实现。论文的内容从系统的设计、描述、实现、分析、测试方面来表明开发的过程。本系统根据现实情况来选择一种可行的开发方案,借助java编程语言和MySQL数据库等实现系统的全部功能,接下来对系统进行测试,测试系统是否有漏洞和测试用户权限来完善系统,最终系统完成达到相关标准。
二、开发环境
开发语言:Java
框架:ssm
技术:JSP
JDK版本:JDK1.8
服务器:tomcat7
数据库:mysql 5.7(一定要5.7版本)
数据库工具:Navicat11
开发软件:eclipse/myeclipse/idea
Maven包:Maven3.3.9
浏览器:谷歌浏览器
2.1 Nodejs
Node被初学者会误以为是一种语言,其实node.js是使得JavaScript能在服务端运行的平台,使得 JavaScript 能像其它的后台语言一样可以操作网络、系统等。它的产生是由于Ryan Dahl认为I/O处理地不好,会因为同步执行造成代码阻塞,以前传统的Web服务技术是对每一个请求都启动一个线程进行处理。因此大部分的时间都菜品在了等待线程上,所以需要大量的资源来管理这些线程。造成服务器的“一个请求就开一个线程”这样的方式并不是很好。Ryan Dahl认为软件应该能够处理多任务,并且能够减少等待处理的时间。故node中出现了很多异步处理,node的执行顺序是①next Tick、Promise他们两个相当于vip任何事件都得等他们执行完后,才能开始执行②set immediate()③set timeout()④poll队列中的事件。因为他相当于多线程异步,所以选择node开发,性能消耗低,运行速度快,所以选择node作为后台的开发环境。
2.2 Html
在现在IT比较火热的语言大概大家知道的都是关于Java、Python等,对前端语言可能相对于来说比较陌生。而HTML是前端必不可少的一种语言,他是所以页面能呈现的基础,是一种超文本标记语言,并且还有一定的语义化,例如p标签是段落标签,以h开头的是标题等,他是运行在浏览器的语言,浏览器可以将其解析并呈现出来,在本次的课题中以最新的html5为基准,辅以html4.0作为html5的兼容处理。。
2.3 Javascript
JavaScript是一种单线程解释型语言,在V8引擎问世后,他的性能得到了极大地提升,从此取代了flash成为了浏览器中最好的脚本语言。该语言可通过异步的方式实现“多线程”,并且他自身的特点也很独特,基于对象的表现既可以创建对象也可以使用自己原型链上已有的,使用起来很简单,没有很严格的要求,他主要添加到使用HTML和CSS构建的网站中,他不依附于操作系统,只要浏览器支持即可,因此它的兼容性也极好,市面上的所有浏览器都支持他的运行,理论上可以实现浏览器环境中的任何功能,这个语言因此成为了前端的必需品。。
2.4 数据库介绍
MySQL 是关系型数据库管理系统的代表, 因为MySQL是其免费开源的,而且MySQL的功能已经足够用对于学习和中小型企业来讲,所以开发中小型网站都会选择MySQL作为网站的数据库。[13]
MySQL具有开放性,它是一种关系型数据库管理系统,并且它的源代码可以被大众所熟知[3]。由于MySQL是开放源代码的,因此,只要经过授权就可以在自己需求的基础上对其进行修改。MySQL因为其固有的特点而备受关注,它具有很强的适应性,并且十分可靠,查询速度快。MySQL安装起来非常方便,且数据存储量大,不需要事务化处理。Sql语言拥有很多的方法,在项目中编写sql语句时使用起来是非常方便的,不会像其他语言那样需要编写更多的语句。正因为MySQL使用sql语言进行数据库管理,所以它收到了大多数程序员的热爱。
。
本系统的开发主要应用了sql进行对数据的管理。
(1)数据
数据它是在数据库当中储存的对象,在大多数的人们头脑当中是数字。其实简单的来说数字是一种简单的数据,从广义的角度来说一些文字、数据、图形等等都可以认为是一种数据,这样一来可以给数据就做个定义了。
(2)数据库
数据库简单的来说它就是对数据进行储存,只不过它在计算上要以某种格式进行存放。但是数据库经过长期的在计算机内储存,它是比较有组织模型数据在里边,这样对于拥有较高的数据具有独立性和共享性。
(3)数据库管理系统
数据库的管理系统主要功能表现为以下几点:
1.数据上它可以通过数据对象进行定义。
2.数据库的语言它可以提供数据的操纵,用户可以通过语言的操纵进行删除、查询和修改等。
3.通过数据库的建立它可以创建数据库的输入和转换功能,能为数据库的重新组合做出监视等。还可以帮助数据库的恢复功能。
4.数据库的开始转充个初始密码都可以对数据库进行建立和维护功能。
2.5 Vue介绍
前端框架介绍
A)前端框架有: React/ Facebook/Angular/Google/Vue全世界
B)Angular、Vue、React的区别
Vue与React
React与Vue 都采用虚拟DOM.核心功能都在核心库中,其他类似路由这样的功能则由其他库进行处理React的生态系统更庞大,由ReactNative来进行混合App开发; Vue更轻量. React由独特的JSX语法; Vue是基于传统的Web计数进行扩展(HTML、CSS、NodejsScript),更容易学习.
Vue与Angular
Angular1和Angular2以后的版本 是完全不同的两个框架; 一般Angular1被称作Angular.js, Angular之后的版本被称作 Angular, Vue与Angular的语法非常相似, Vue没有像Angular一样深入开发,只保证了基本功能。 Angular过于笨重, Vue的运行速度比Angular快得多, Angular的脏检查机制带来诸多性能问题。。
2.6 B/s模式
B/S的系统是通过能上网的电脑就可以使用,它最大的优点是不需要安装专门的软件,首先浏览器向服务器发出请求,然后服务器处理请求把信息再返回给浏览器。不需要再次对数据进行存取与计算数据,只要负责显示数据来降低要求,如果说客户端像个“瘦子”,而服务器会越来越“胖”。B/S体系结构与C/S体系结构相比,最大的不同是:B/S体系的应用软件使用网络浏览器作为与用户交互的平台,而C/S则需要开发专用的应用程序。
三、系统功能设计
考虑到实际生活中在共享厨房信息管理方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。
(1)管理员功能需求
管理员登陆后,主要包括主页、个人中心、用户管理、厨房类型管理、共享厨房管理、厨房租用管理、系统管理等功能。管理员用例图如图3-1所示。
(2)用户功能需求
用户登陆后,用户进入系统可以实现首页、共享厨房、共享公告、个人中心、后台管理等内容,点击进入后台管理页面可以对主页、个人中心、厨房租用管理等功能进行详细操作。用户用例图如图3-2所示。
为了更好的去理清本系统整体思路,对该系统以结构图的形式表达出来,设计实现该共享厨房信息系统的功能结构图如下所示:
四、系统数据库设计
ER图是由实体及其关系构成的图,通过E/R图可以清楚地描述系统涉及到的实体之间的相互关系。在系统中对一些主要的几个关键实体如下图:
五、系统功能效果
六、核心代码
package com.interceptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import com.annotation.IgnoreAuth;
import com.entity.EIException;
import com.entity.TokenEntity;
import com.service.TokenService;
import com.utils.R;
/**
* 权限(Token)验证
*/
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
public static final String LOGIN_TOKEN_KEY = "Token";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//支持跨域请求
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
IgnoreAuth annotation;
if (handler instanceof HandlerMethod) {
annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
} else {
return true;
}
//从header中获取token
String token = request.getHeader(LOGIN_TOKEN_KEY);
/**
* 不需要验证权限的方法直接放过
*/
if(annotation!=null) {
return true;
}
TokenEntity tokenEntity = null;
if(StringUtils.isNotBlank(token)) {
tokenEntity = tokenService.getTokenEntity(token);
}
if(tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
request.getSession().setAttribute("tableName", tokenEntity.getTablename());
request.getSession().setAttribute("username", tokenEntity.getUsername());
return true;
}
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try {
writer = response.getWriter();
writer.print(JSONObject.toJSONString(R.error(401, "请先登录")));
} finally {
if(writer != null){
writer.close();
}
}
// throw new EIException("请先登录", 401);
return false;
}
}