博主介绍:✌退职 Java 研发工程师、专一于程序设计、源码分享、技术交换、专一于 Java 技术畛域和毕业设计✌
舒适提醒:文末有 CSDN 平台官网提供的老师 Wechat / QQ 名片 :)
项目名称
基于 SSM 的实验室设施仪器样品管理系统 +Android
演示视频
https://ym.maptoface.com/archives/60496
零碎介绍
数字网络技术在晚期的 20 世纪 80 年代 -90 年代开始倒退,逐步成为 21 世纪的支流。
网络倒退也扭转了咱们生存形式,当初曾经有了智能手机的呈现,咱们能够通过手机和电脑上通过网络传输进行数据同步,现目前应用最多的就是 Android 零碎的智能手机,因为从 Android 开发以来始终是开源零碎,让晚期很多不足开发能力和业余技术不齐全的手机厂家找到了“救星”,很快 Android 零碎迅速遍及到全国各个中央。在高校的网络建设中也起到很要害的作用,实验室设施仪器样品管理系统可能高效、便捷的治理实验室的日常工作,并且实验室管理系统的数据共享性能可能是实验室管理人员和学生之间进行无效的沟通,晋升治理设施技术性、专业性,也让实验室的信息程度建设有了质的变动。实验室治理建设和治理的改革工作的无效发展,就须要对实验室设施仪器样品管理系统的无效钻研。
本零碎是基于 SSM 框架加上 MySQL 数据库技术的实验室设施仪器样品管理系统,本文剖析了设计时遵循的软件工程思维,并以此为根据进行零碎的开发。依据查阅的材料和结合实际需要加上参考大量的我的项目来进行剖析和设计,采纳 B / S 框架联合 JSP 技术来开发。为了保证数据长久化须要应用数据库保留数据,应用 MySQL 数据库来保留。依据高校理论需要,零碎实现了管理员的后盾 WEB 零碎端以及基于 Android 的用户手机端,实现了人员治理、设施治理、设施借用、设施偿还、设施分类等实验室常见性能,并且通过一段时间的测试,零碎运行稳固、界面敌对、操作灵便不便、数据查问高效。
关键词:实验室设施治理;Android;SSM;设施借还
1.4.2 性能需要剖析
基于 Android 的实验室样品与器材治理 App 的性能需要剖析旨在解决以下问题:
用户治理:提供对管理员和普通用户的治理性能,确保不同角色的用户能够正确应用零碎。组织设置:解决不同组织架构之间的关系,使得不同学校和学院能够独立治理各自的实验室设施和样品。物品信息管理:实现对实验室设施、仪器和样品的对立治理,不便实验室管理人员对物品进行保护和监控。借用 / 偿还治理:优化设施借用和偿还流程,确保学生能够顺利借用和偿还设施,同时不便管理员对借用和偿还记录进行治理。设施分类管理:对设施、仪器和样品进行分类管理,进步管理效率和便利性。设施搜寻:容许学生在手机端疾速搜寻并获取实验室设施和样品的相干信息。设施借用:简化学生借用设施的流程,同时提供设施借用状态的查问性能。设施偿还:不便学生在手机端进行设施偿还操作,同时提供待偿还和已偿还设施信息的查问性能。
通过这些性能需要剖析,App 的设计和实现将解决实验室设施和样品治理中的痛点问题,进步实验室管理效率,优化学生借用和偿还设施的体验,并简化管理员对实验室资源的监控和保护工作。
1.4.3 用例剖析
1. 学生用例剖析
学生用户次要是应用手机端进行零碎操作的,在手机端进行登录后能够进行设施搜寻、设施借用、查看设施借用状态、设施偿还、查看设施偿还状态、明码批改和退出零碎的操作。学生用例如图 2 - 1 所示。
图 2 -1 用户用例图
2. 管理员用例剖析
在登录胜利后能够操作管理员性能,管理员是整个零碎中权限最大的用户,基本上所有数据的治理和保护管理人员都能够操作。所以管理人员的账号密码须要应用高验证的明码最好。首次启动程序,须要管理员登录后初始化一部分的数据后,我的项目能力失常运行,所以后期最好做肯定的管理员操作培训。
管理员用例如图 2 - 2 所示。
图 2 -2 管理员用例图
2.2 功能模块设计
在零碎的的功能分析当中,须要明确的是零碎用户的所有功能模块并且明确它们的分割,并且还须要对系统的角色进行划分从而明确零碎的性能权限用以设计前端页面。
次要蕴含性能如以下所示:
(1)用户治理:包含了对管理员以及用户的治理性能,能够对用户进行减少、删除、批改、受权、登记、批改明码等数据的批改。
(2)组织设置:零碎用户属于不同的组织架构中,不同的组织架构对应不同的学校学院。
(3)物品信息管理:系统管理员能够对系统的所有设施、仪器以及样品进行对立的增删改查治理。
(4)借用 / 偿还治理:用户在手机端进行设施借用后,管理员进行审核是否批准借用,用户借用设施后进行偿还操作,这一系列操作流程都会留下记录进行治理。
(5)设施分类管理:不同的设施、仪器、样品都属于不同的分类,通过分类来对设施进行分类,治理将会更加粗疏化。
(6)设施搜寻:用户在手机端能够对系统的设施样品进行搜寻,包含分类、所属学校、编号、创立工夫等信息。
(7)设施借用:用户在手机端抉择须要借用的设施填写单据、借用工夫、偿还工夫、借用人员、备注信息后进行借用操作,并且能够查问到审核中以及借用中的设施。
(8)设施偿还:用户在手机端进行设施的偿还,并且能够查问到待偿还以及已偿还的设施信息。
2.2.1 学生功能模块设计
学生功能模块包含登录、设施搜寻、借用操作、偿还操作、批改明码、个人信息、增加借用、借用查问、偿还设施、偿还查问。学生功能模块图如 3 - 2 所示:
图 3 -3 管理员功能模块图
编辑
编辑
编辑
编辑
零碎截图
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
编辑
环境须要
1. 运行环境:最好是 java jdk 1.8,咱们在这个平台上运行的。其余版本实践上也能够。
2.IDE 环境:IDEA,Eclipse,Myeclipse 都能够。举荐 IDEA;
3.tomcat 环境:Tomcat 7.x,8.x,9.x 版本均可
4. 硬件环境:windows 7/8/10 1G 内存以上;或者 Mac OS;
5. 数据库:MySql 5.7 版本;
6. 是否 Maven 我的项目:否;
技术栈
- 后端:Spring+SpringMVC+Mybatis
- 前端:JSP+CSS+JavaScript+jQuery
应用阐明
- 应用 Navicat 或者其它工具,在 mysql 中创立对应名称的数据库,并导入我的项目的 sql 文件;
- 应用 IDEA/Eclipse/MyEclipse 导入我的项目,Eclipse/MyEclipse 导入时,若为 maven 我的项目请抉择 maven;
若为 maven 我的项目,导入胜利后请执行 maven clean;maven install 命令,而后运行; - 将我的项目中 springmvc-servlet.xml 配置文件中的数据库配置改为本人的配置;
- 运行我的项目,在浏览器中输出 http://localhost:8080/ 登录
POM 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- optional=true, 依赖不会传递, 该我的项目依赖 devtools;
之后依赖 boot 我的项目的我的项目如果想要应用 devtools, 须要从新引入 -->
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.1.3.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<!-- webSocket 开始 -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<!-- webSocket 完结 -->
</dependencies>
管理员管理控制层:
package com.sxl.controller.admin;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sxl.controller.MyController;
@Controller(“adminController”)
@RequestMapping(value = “/admin”)
public class AdminController extends MyController {
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)throws Exception {return "/admin/index";}
@RequestMapping(value = "/main")
public String main(Model model, HttpServletRequest request)throws Exception {return "/admin/main";}
@RequestMapping(value = "/tj1")
public String tj1(Model model, HttpServletRequest request)throws Exception {String sql="select DATE_FORMAT(insertDate,'%Y-%m-%d') dates,sum(allPrice) price from t_order order by DATE_FORMAT(insertDate,'%Y-%m-%d') desc";
List<Map> list = db.queryForList(sql);
model.addAttribute("list", list);
System.out.println(list);
return "/admin/tj/tj1";
}
@RequestMapping(value = "/password")
public String password(Model model, HttpServletRequest request)throws Exception {return "/admin/password";}
@RequestMapping(value = "/changePassword")
public ResponseEntity<String> loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {Map admin = getAdmin(request);
if(oldPassword.equals(admin.get("password").toString())){
String sql="update t_admin set password=? where id=?";
db.update(sql, new Object[]{newPassword,admin.get("id")});
return renderData(true,"1",null);
}else{return renderData(false,"1",null);
}
}
}
批改明码业务逻辑:
package com.sxl.controller.admin;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.sxl.controller.MyController;
@Controller(“userController”)
@RequestMapping(value = “/user”)
public class UserController extends MyController {
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)throws Exception {return "/user/index";}
@RequestMapping(value = "/main")
public String main(Model model, HttpServletRequest request)throws Exception {return "/user/main";}
@RequestMapping(value = "/password")
public String password(Model model, HttpServletRequest request)throws Exception {return "/user/password";}
@RequestMapping(value = "/changePassword")
public ResponseEntity<String> loginSave(Model model,HttpServletRequest request,String oldPassword,String newPassword) throws Exception {Map user = getUser(request);
if(oldPassword.equals(user.get("password").toString())){
String sql="update t_user set password=? where id=?";
db.update(sql, new Object[]{newPassword,user.get("id")});
return renderData(true,"1",null);
}else{return renderData(false,"1",null);
}
}
@RequestMapping(value = "/mine")
public String mine(Model model, HttpServletRequest request)throws Exception {
Map user =getUser(request);Map map = db.queryForMap(“select * from t_user where id=?”,new Object[]{user.get(“id”)});model.addAttribute(“map”, map); return “/user/mine”;
}
@RequestMapping(value = "/mineSave")
public ResponseEntity<String> mineSave(Model model,HttpServletRequest request,Long id
,String username,String password,String name,String gh,String mobile) throws Exception{
int result = 0;
String sql="update t_user set name=?,gh=?,mobile=? where id=?";
result = db.update(sql, new Object[]{name,gh,mobile,id});
if(result==1){return renderData(true,"操作胜利",null);
}else{return renderData(false,"操作失败",null);
}
}
}
通用治理模块:
package com.sxl.controller;
import java.nio.charset.Charset;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import com.sxl.util.JacksonJsonUtil;
import com.sxl.util.StringUtil;
import com.sxl.util.SystemProperties;
public class BaseController {
public static final Long EXPIRES_IN = 1000 * 3600 * 24 * 1L;// 1 天
@Autowired
private SystemProperties systemProperties;
/**
* 取得配置文件内容
*/
public String getConfig(String key) {return systemProperties.getProperties(key);
}
/**
* 返回服务器地址 like http://192.168.1.1:8441/UUBean/
*/
public String getHostUrl(HttpServletRequest request) {String hostName = request.getServerName();
Integer hostPort = request.getServerPort();
String path = request.getContextPath();
if (hostPort == 80) {return "http://" + hostName + path + "/";} else {return "http://" + hostName + ":" + hostPort + path + "/";}
}
/***
* 获取以后的 website 门路 String
*/
public static String getWebSite(HttpServletRequest request) {String returnUrl = request.getScheme() + "://"
+ request.getServerName();
if (request.getServerPort() != 80) {returnUrl += ":" + request.getServerPort();
}
returnUrl += request.getContextPath();
return returnUrl;
}
/**
* 初始化 HTTP 头.
*
* @return HttpHeaders
*/
public HttpHeaders initHttpHeaders() {HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("text", "html",
Charset.forName("utf-8"));
headers.setContentType(mediaType);
return headers;
}
/**
* 返回 信息数据
*
* @param status
* @param msg
* @return
*/
public ResponseEntity<String> renderMsg(Boolean status, String msg) {if (StringUtils.isEmpty(msg)) {msg = "";}
String str = "{\"status\":\"" + status + "\",\"msg\":\""+ msg +"\"}";
ResponseEntity<String> responseEntity = new ResponseEntity<String>(str,
initHttpHeaders(), HttpStatus.OK);
return responseEntity;
}
/**
* 返回 obj 数据
*
* @param status
* @param msg
* @param obj
* @return
*/
public ResponseEntity<String> renderData(Boolean status, String msg,
Object obj) {if (StringUtils.isEmpty(msg)) {msg = "";}
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"status\":\"" + status + "\",\"msg\":\""+ msg +"\",");
sb.append("\"data\":" + JacksonJsonUtil.toJson(obj) + "");
sb.append("}");
ResponseEntity<String> responseEntity = new ResponseEntity<String>(sb.toString(), initHttpHeaders(), HttpStatus.OK);
return responseEntity;
}
/***
* 获取 IP(如果是多级代理,则失去的是一串 IP 值)*/
public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();
}
if (ip != null && ip.length() > 0) {String[] ips = ip.split(",");
for (int i = 0; i < ips.length; i++) {if (!"unknown".equalsIgnoreCase(ips[i])) {ip = ips[i];
break;
}
}
}
return ip;
}
/**
* 国际化取得语言内容
*
* @param key
* 语言 key
* @param args
* @param argsSplit
* @param defaultMessage
* @param locale
* @return
*/
public static String getLanguage(String key, String args, String argsSplit,
String defaultMessage, String locale) {
String language = "zh";
String contry = "cn";
String returnValue = defaultMessage;
if (!StringUtil.isEmpty(locale)) {
try {String[] localeArray = locale.split("_");
language = localeArray[0];
contry = localeArray[1];
} catch (Exception e) {}}
try {
ResourceBundle resource = ResourceBundle.getBundle("lang.resource",
new Locale(language, contry));
returnValue = resource.getString(key);
if (!StringUtil.isEmpty(args)) {String[] argsArray = args.split(argsSplit);
for (int i = 0; i < argsArray.length; i++) {returnValue = returnValue.replace("{" + i + "}",
argsArray[i]);
}
}
} catch (Exception e) { }
return returnValue;
}
}