项目编号:BS-PT-100
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:Springboot+Mybatis-plus
前台开发技术:vue+ElementUI+Nodejs
二,项目简介
互联网技术的发展和信息化技术的深度应用,己经在各种领域发挥了很大的作用,从人们的日常生活应用到学习和办公类的各式应用,信息化技术都给人们带来很大的便利性。就以人们的日常照片和相册来讲,以往都是通过相拍照并通过专业的洗照片的商家将照洗印出来并制作成册,这种方式一是拍照不方便,二是制作成本高。现在智能手机的普通使得手机也可以集成相对专业的相机,人们随处可以拍照,并可以将照片存储云端,随时随地进行查看,非常便利。本次课题要研究的就是如何实现一个在线的相册管理系统,使得人们非常方便的在网络上管理自己的照片和相册。
本课题所实现的相删册管理系统,主要实现用户在线注册登陆,在平台可以创建相册,在相册里上传自己的照片并可以进行分享,为了增加体验,在相册里增加了背景音乐,同时用户也可以在线留言和讨论,增加了互动的功能。平台也为管理员提供了基础信息的管理功能,比如用户管理,相册类型管理,相册管理等。
本课题主要基于前后端分离的开发模式进行开发实现,前端采用Vue框架实现,后台采用Springboot框架,同时集成持久层框架Mybatis-plus来完成数据的持久化操作。在进行数据存储上,使用MYSQL5.7数据库来存储相册管理平台产生的业务数据。系统整体设计上采用三层架构和MVC设计模式,保证了系统的灵活性和可扩展性,前后端交互通异步的方式来进行实现,增强了客户的体验感。
根据市场调研和用户走访,并进行整理分析,得知本次设计实现的相册管理平台用户有两类,一是前端注册的会员用户,一类是平台提供的用于管理系统基本信息的管理员账户。这两类用户的角色和操作功能权限不同,下面通过用例图的方式来进行展示。
前端注册用户的用例图如下图1所示:
图1 前端用户用例图
前端用户用例描述:前端用户注册登陆后,主要可以实现在线浏览公告信息、浏览自己的相册信息、在交论坛交流、留言反馈,并可以在个人中心中管理自己的个人信息和相册信息等。
后台管理员的操作用例图如下图2所示:
图2 后台用户用例图
后台管理员用例图描述:后台管理员登陆相册管理平台,主要的职责是对全局的信息进行相关的管理操作,主要包含对于前端注册用户的管理、管理员信息管理、相册信息管理、论坛管理、公告管理、留言板管理、基础数据管理、轮播图展示管理等。
在对整个相册管理平台做了充分的需求分析和架构设计之后,最终确定了本次开发设计的相册管理系统要实现的功能目标,具体展示如下图3所示。
对于本课题要实现的功能,下面进行一下相应的介绍。
前端用户的功能描述:
(1)注册登陆:相册管理平台的用户如果以游客身份进入平台,主要可以进行信息的浏览操作,其它的相册管理、在线留言等模块是无权限操作的。只有注册为会员用户,并根据注册时指定的账户登陆平台,才可以获得平台的授权来进行相关操作。
(2)相册浏览:点击相册链接即可进入相册详情展示页,相册里有多个所属的图片可供浏览,同时相册添加时可指定相册的背景音乐,增强了客户浏览的体验感。
(3)相册管理:用户在个人中心中可以管理自己相册,创建相册,并在相册里上传自己的多张照片。
(4)公告浏览:平台可以根据需要发布一些新闻或系统公告,来让用户浏览了解。
(5)在线留言:给注册的会员用户提供了一个在线反馈的机制,以收集客户的需求和建议。
(6)个人中心:在个人中心处主要完成对个人基本信息管理,以及自己的相册和相册的管理。
(7)论坛讨论:主要为用户提供一个在线交流互动的功能。
后台管理员的操作功能描述如下:
(1)用户管理:主要实现对在相册管理平台注册的用户信息和平台管理员的管理操作。
(2)公告分类管理:主要完成对系统公告分类信息的管理操作,方便用户分类进行公告信息的查看。
(3)相册管理:完成对前端所有用户创建的相册管理操作。
(4)相片管理:对用户在相册中添加的相关进行管理操作。
(5)留言管理:主要是对前端用户在线留言进行管理。
(6)轮播图管理:管理前端展示的轮播图片。
(7)论坛管理:管理前端用户在线讨论的贴子信息。
三,系统展示
用户登录:
用户注册
相册浏览
相片浏览
公告浏览
论坛互动
在线留言
个人相册管理
后台管理员功能
用户管理
公告分类管理
相册封面管理
相册管理
轮播图管理
公告管理
论坛管理
留言管理
四,核心代码展示
package com.controller; import java.io.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*; import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson.JSON; import com.utils.StringUtil; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.annotation.IgnoreAuth; import com.baidu.aip.face.AipFace; import com.baidu.aip.face.MatchRequest; import com.baidu.aip.util.Base64Util; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.entity.ConfigEntity; import com.service.CommonService; import com.service.ConfigService; import com.utils.BaiduUtil; import com.utils.FileUtil; import com.utils.R; /** * 通用接口 */ @RestController public class CommonController { private static final Logger logger = LoggerFactory.getLogger(CommonController.class); @Autowired private CommonService commonService; /** * Java代码实现MySQL数据库导出 * * @param mysqlUrl MySQL安装路径 * @param hostIP MySQL数据库所在服务器地址IP * @param userName 进入数据库所需要的用户名 * @param hostPort 数据库端口 * @param password 进入数据库所需要的密码 * @param savePath 数据库文件保存路径 * @param fileName 数据库导出文件文件名 * @param databaseName 要导出的数据库名 * @return 返回true表示导出成功,否则返回false。 */ @IgnoreAuth @RequestMapping("/beifen") public R beifen(String mysqlUrl, String hostIP, String userName, String hostPort, String password, String savePath, String fileName, String databaseName) { File saveFile = new File(savePath); if (!saveFile.exists()) {// 如果目录不存在 saveFile.mkdirs();// 创建文件夹 } if (!savePath.endsWith(File.separator)) { savePath = savePath + File.separator; } PrintWriter printWriter = null; BufferedReader bufferedReader = null; try { Runtime runtime = Runtime.getRuntime(); String cmd = mysqlUrl + "mysqldump -h" + hostIP + " -u" + userName + " -P" + hostPort + " -p" + password + " " + databaseName; runtime.exec(cmd); Process process = runtime.exec(cmd); InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8"); bufferedReader = new BufferedReader(inputStreamReader); printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8")); String line; while ((line = bufferedReader.readLine()) != null) { printWriter.println(line); } printWriter.flush(); } catch (Exception e) { e.printStackTrace(); return R.error("备份数据出错"); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } if (printWriter != null) { printWriter.close(); } } catch (Exception e) { e.printStackTrace(); } } return R.ok(); } /** * Java实现MySQL数据库导入 * * @param mysqlUrl MySQL安装路径 * @param hostIP MySQL数据库所在服务器地址IP * @param userName 进入数据库所需要的用户名 * @param hostPort 数据库端口 * @param password 进入数据库所需要的密码 * @param savePath 数据库文件保存路径 * @param fileName 数据库导出文件文件名 * @param databaseName 要导出的数据库名 */ @IgnoreAuth @RequestMapping("/huanyuan") public R huanyuan(String mysqlUrl, String hostIP, String userName, String hostPort, String password, String savePath, String fileName, String databaseName) { try { Runtime rt = Runtime.getRuntime(); Process child1 = rt.exec(mysqlUrl+"mysql.exe -h" + hostIP + " -u" + userName + " -P" + hostPort + " -p" + password + " " + databaseName); OutputStream out = child1.getOutputStream();//控制台的输入信息作为输出流 String inStr; StringBuffer sb = new StringBuffer(""); String outStr; BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(savePath+"/"+fileName), "utf-8")); while ((inStr = br.readLine()) != null) { sb.append(inStr + "\r\n"); } outStr = sb.toString(); OutputStreamWriter writer = new OutputStreamWriter(out, "utf8"); writer.write(outStr); // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免 writer.flush(); out.close(); br.close(); writer.close(); } catch (Exception e) { e.printStackTrace(); return R.error("数据导入出错"); } return R.ok(); } /** * 饼状图求和 * @return */ @RequestMapping("/pieSum") public R pieSum(@RequestParam Map<String,Object> params) { logger.debug("饼状图求和:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.pieSum(params); return R.ok().put("data", result); } /** * 饼状图统计 * @return */ @RequestMapping("/pieCount") public R pieCount(@RequestParam Map<String,Object> params) { logger.debug("饼状图统计:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.pieCount(params); return R.ok().put("data", result); } /** * 柱状图求和单列 * @return */ @RequestMapping("/barSumOne") public R barSumOne(@RequestParam Map<String,Object> params) { logger.debug("柱状图求和单列:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.barSumOne(params); List<String> xAxis = new ArrayList<>();//报表x轴 List<List<String>> yAxis = new ArrayList<>();//y轴 List<String> legend = new ArrayList<>();//标题 List<String> yAxis0 = new ArrayList<>(); yAxis.add(yAxis0); legend.add(""); for(Map<String, Object> map :result){ String oneValue = String.valueOf(map.get("name")); String value = String.valueOf(map.get("value")); xAxis.add(oneValue); yAxis0.add(value); } Map<String, Object> resultMap = new HashMap<>(); resultMap.put("xAxis",xAxis); resultMap.put("yAxis",yAxis); resultMap.put("legend",legend); return R.ok().put("data", resultMap); } /** * 柱状图统计单列 * @return */ @RequestMapping("/barCountOne") public R barCountOne(@RequestParam Map<String,Object> params) { logger.debug("柱状图统计单列:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.barCountOne(params); List<String> xAxis = new ArrayList<>();//报表x轴 List<List<String>> yAxis = new ArrayList<>();//y轴 List<String> legend = new ArrayList<>();//标题 List<String> yAxis0 = new ArrayList<>(); yAxis.add(yAxis0); legend.add(""); for(Map<String, Object> map :result){ String oneValue = String.valueOf(map.get("name")); String value = String.valueOf(map.get("value")); xAxis.add(oneValue); yAxis0.add(value); } Map<String, Object> resultMap = new HashMap<>(); resultMap.put("xAxis",xAxis); resultMap.put("yAxis",yAxis); resultMap.put("legend",legend); return R.ok().put("data", resultMap); } /** * 柱状图统计双列 * @return */ @RequestMapping("/barSumTwo") public R barSumTwo(@RequestParam Map<String,Object> params) { logger.debug("柱状图统计双列:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.barSumTwo(params); List<String> xAxis = new ArrayList<>();//报表x轴 List<List<String>> yAxis = new ArrayList<>();//y轴 List<String> legend = new ArrayList<>();//标题 Map<String, HashMap<String, String>> dataMap = new LinkedHashMap<>(); for(Map<String, Object> map :result){ String name1Value = String.valueOf(map.get("name1")); String name2Value = String.valueOf(map.get("name2")); String value = String.valueOf(map.get("value")); if(!legend.contains(name2Value)){ legend.add(name2Value);//添加完成后 就是最全的第二列的类型 } if(dataMap.containsKey(name1Value)){ dataMap.get(name1Value).put(name2Value,value); }else{ HashMap<String, String> name1Data = new HashMap<>(); name1Data.put(name2Value,value); dataMap.put(name1Value,name1Data); } } for(int i =0; i<legend.size(); i++){ yAxis.add(new ArrayList<String>()); } Set<String> keys = dataMap.keySet(); for(String key:keys){ xAxis.add(key); HashMap<String, String> map = dataMap.get(key); for(int i =0; i<legend.size(); i++){ List<String> data = yAxis.get(i); if(StringUtil.isNotEmpty(map.get(legend.get(i)))){ data.add(map.get(legend.get(i))); }else{ data.add("0"); } } } System.out.println(); Map<String, Object> resultMap = new HashMap<>(); resultMap.put("xAxis",xAxis); resultMap.put("yAxis",yAxis); resultMap.put("legend",legend); return R.ok().put("data", resultMap); } /** * 柱状图统计双列 * @return */ @RequestMapping("/barCountTwo") public R barCountTwo(@RequestParam Map<String,Object> params) { logger.debug("柱状图统计双列:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.barCountTwo(params); List<String> xAxis = new ArrayList<>();//报表x轴 List<List<String>> yAxis = new ArrayList<>();//y轴 List<String> legend = new ArrayList<>();//标题 Map<String, HashMap<String, String>> dataMap = new LinkedHashMap<>(); for(Map<String, Object> map :result){ String name1Value = String.valueOf(map.get("name1")); String name2Value = String.valueOf(map.get("name2")); String value = String.valueOf(map.get("value")); if(!legend.contains(name2Value)){ legend.add(name2Value);//添加完成后 就是最全的第二列的类型 } if(dataMap.containsKey(name1Value)){ dataMap.get(name1Value).put(name2Value,value); }else{ HashMap<String, String> name1Data = new HashMap<>(); name1Data.put(name2Value,value); dataMap.put(name1Value,name1Data); } } for(int i =0; i<legend.size(); i++){ yAxis.add(new ArrayList<String>()); } Set<String> keys = dataMap.keySet(); for(String key:keys){ xAxis.add(key); HashMap<String, String> map = dataMap.get(key); for(int i =0; i<legend.size(); i++){ List<String> data = yAxis.get(i); if(StringUtil.isNotEmpty(map.get(legend.get(i)))){ data.add(map.get(legend.get(i))); }else{ data.add("0"); } } } System.out.println(); Map<String, Object> resultMap = new HashMap<>(); resultMap.put("xAxis",xAxis); resultMap.put("yAxis",yAxis); resultMap.put("legend",legend); return R.ok().put("data", resultMap); } /** tableName 查询表 condition1 条件1 condition1Value 条件1值 average 计算平均评分 取值 有值 Number(res.data.value.toFixed(1)) 无值 if(res.data){} * */ @IgnoreAuth @RequestMapping("/queryScore") public R queryScore(@RequestParam Map<String, Object> params) { logger.debug("queryScore:,,Controller:{},,params:{}",this.getClass().getName(),params); Map<String, Object> queryScore = commonService.queryScore(params); return R.ok().put("data", queryScore); } /** * 查询字典表的分组统计总条数 * tableName 表名 * groupColumn 分组字段 * @return */ @RequestMapping("/newSelectGroupCount") public R newSelectGroupCount(@RequestParam Map<String,Object> params) { logger.debug("newSelectGroupCount:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.newSelectGroupCount(params); return R.ok().put("data", result); } /** * 查询字典表的分组求和 * tableName 表名 * groupColumn 分组字段 * sumCloum 统计字段 * @return */ @RequestMapping("/newSelectGroupSum") public R newSelectGroupSum(@RequestParam Map<String,Object> params) { logger.debug("newSelectGroupSum:,,Controller:{},,params:{}",this.getClass().getName(),params); List<Map<String, Object>> result = commonService.newSelectGroupSum(params); return R.ok().put("data", result); } /** * 柱状图求和 老的 */ @RequestMapping("/barSum") public R barSum(@RequestParam Map<String,Object> params) { logger.debug("barSum方法:,,Controller:{},,params:{}",this.getClass().getName(), com.alibaba.fastjson.JSONObject.toJSONString(params)); Boolean isJoinTableFlag = false;//是否有级联表相关 String one = "";//第一优先 String two = "";//第二优先 //处理thisTable和joinTable 处理内容是把json字符串转为Map并把带有,的切割为数组 //当前表 Map<String,Object> thisTable = JSON.parseObject(String.valueOf(params.get("thisTable")),Map.class); params.put("thisTable",thisTable); //级联表 String joinTableString = String.valueOf(params.get("joinTable")); if(StringUtil.isNotEmpty(joinTableString)) { Map<String, Object> joinTable = JSON.parseObject(joinTableString, Map.class); params.put("joinTable", joinTable); isJoinTableFlag = true; } if(StringUtil.isNotEmpty(String.valueOf(thisTable.get("date")))){//当前表日期 thisTable.put("date",String.valueOf(thisTable.get("date")).split(",")); one = "thisDate0"; } if(isJoinTableFlag){//级联表日期 Map<String, Object> joinTable = (Map<String, Object>) params.get("joinTable"); if(StringUtil.isNotEmpty(String.valueOf(joinTable.get("date")))){ joinTable.put("date",String.valueOf(joinTable.get("date")).split(",")); if(StringUtil.isEmpty(one)){ one ="joinDate0"; }else{ if(StringUtil.isEmpty(two)){ two ="joinDate0"; } } } } if(StringUtil.isNotEmpty(String.valueOf(thisTable.get("string")))){//当前表字符串 thisTable.put("string",String.valueOf(thisTable.get("string")).split(",")); if(StringUtil.isEmpty(one)){ one ="thisString0"; }else{ if(StringUtil.isEmpty(two)){ two ="thisString0"; } } } if(isJoinTableFlag){//级联表字符串 Map<String, Object> joinTable = (Map<String, Object>) params.get("joinTable"); if(StringUtil.isNotEmpty(String.valueOf(joinTable.get("string")))){ joinTable.put("string",String.valueOf(joinTable.get("string")).split(",")); if(StringUtil.isEmpty(one)){ one ="joinString0"; }else{ if(StringUtil.isEmpty(two)){ two ="joinString0"; } } } } if(StringUtil.isNotEmpty(String.valueOf(thisTable.get("types")))){//当前表类型 thisTable.put("types",String.valueOf(thisTable.get("types")).split(",")); if(StringUtil.isEmpty(one)){ one ="thisTypes0"; }else{ if(StringUtil.isEmpty(two)){ two ="thisTypes0"; } } } if(isJoinTableFlag){//级联表类型 Map<String, Object> joinTable = (Map<String, Object>) params.get("joinTable"); if(StringUtil.isNotEmpty(String.valueOf(joinTable.get("types")))){ joinTable.put("types",String.valueOf(joinTable.get("types")).split(",")); if(StringUtil.isEmpty(one)){ one ="joinTypes0"; }else{ if(StringUtil.isEmpty(two)){ two ="joinTypes0"; } } } } List<Map<String, Object>> result = commonService.barSum(params); List<String> xAxis = new ArrayList<>();//报表x轴 List<List<String>> yAxis = new ArrayList<>();//y轴 List<String> legend = new ArrayList<>();//标题 if(StringUtil.isEmpty(two)){//不包含第二列 List<String> yAxis0 = new ArrayList<>(); yAxis.add(yAxis0); legend.add(""); for(Map<String, Object> map :result){ String oneValue = String.valueOf(map.get(one)); String value = String.valueOf(map.get("value")); xAxis.add(oneValue); yAxis0.add(value); } }else{//包含第二列 Map<String, HashMap<String, String>> dataMap = new LinkedHashMap<>(); if(StringUtil.isNotEmpty(two)){ for(Map<String, Object> map :result){ String oneValue = String.valueOf(map.get(one)); String twoValue = String.valueOf(map.get(two)); String value = String.valueOf(map.get("value")); if(!legend.contains(twoValue)){ legend.add(twoValue);//添加完成后 就是最全的第二列的类型 } if(dataMap.containsKey(oneValue)){ dataMap.get(oneValue).put(twoValue,value); }else{ HashMap<String, String> oneData = new HashMap<>(); oneData.put(twoValue,value); dataMap.put(oneValue,oneData); } } } for(int i =0; i<legend.size(); i++){ yAxis.add(new ArrayList<String>()); } Set<String> keys = dataMap.keySet(); for(String key:keys){ xAxis.add(key); HashMap<String, String> map = dataMap.get(key); for(int i =0; i<legend.size(); i++){ List<String> data = yAxis.get(i); if(StringUtil.isNotEmpty(map.get(legend.get(i)))){ data.add(map.get(legend.get(i))); }else{ data.add("0"); } } } System.out.println(); } Map<String, Object> resultMap = new HashMap<>(); resultMap.put("xAxis",xAxis); resultMap.put("yAxis",yAxis); resultMap.put("legend",legend); return R.ok().put("data", resultMap); } /** * 柱状图统计 老的 */ @RequestMapping("/barCount") public R barCount(@RequestParam Map<String,Object> params) { logger.debug("barCount方法:,,Controller:{},,params:{}",this.getClass().getName(), com.alibaba.fastjson.JSONObject.toJSONString(params)); Boolean isJoinTableFlag = false;//是否有级联表相关 String one = "";//第一优先 String two = "";//第二优先 //处理thisTable和joinTable 处理内容是把json字符串转为Map并把带有,的切割为数组 //当前表 Map<String,Object> thisTable = JSON.parseObject(String.valueOf(params.get("thisTable")),Map.class); params.put("thisTable",thisTable); //级联表 String joinTableString = String.valueOf(params.get("joinTable")); if(StringUtil.isNotEmpty(joinTableString)) { Map<String, Object> joinTable = JSON.parseObject(joinTableString, Map.class); params.put("joinTable", joinTable); isJoinTableFlag = true; } if(StringUtil.isNotEmpty(String.valueOf(thisTable.get("date")))){//当前表日期 thisTable.put("date",String.valueOf(thisTable.get("date")).split(",")); one = "thisDate0"; } if(isJoinTableFlag){//级联表日期 Map<String, Object> joinTable = (Map<String, Object>) params.get("joinTable"); if(StringUtil.isNotEmpty(String.valueOf(joinTable.get("date")))){ joinTable.put("date",String.valueOf(joinTable.get("date")).split(",")); if(StringUtil.isEmpty(one)){ one ="joinDate0"; }else{ if(StringUtil.isEmpty(two)){ two ="joinDate0"; } } } } if(StringUtil.isNotEmpty(String.valueOf(thisTable.get("string")))){//当前表字符串 thisTable.put("string",String.valueOf(thisTable.get("string")).split(",")); if(StringUtil.isEmpty(one)){ one ="thisString0"; }else{ if(StringUtil.isEmpty(two)){ two ="thisString0"; } } } if(isJoinTableFlag){//级联表字符串 Map<String, Object> joinTable = (Map<String, Object>) params.get("joinTable"); if(StringUtil.isNotEmpty(String.valueOf(joinTable.get("string")))){ joinTable.put("string",String.valueOf(joinTable.get("string")).split(",")); if(StringUtil.isEmpty(one)){ one ="joinString0"; }else{ if(StringUtil.isEmpty(two)){ two ="joinString0"; } } } } if(StringUtil.isNotEmpty(String.valueOf(thisTable.get("types")))){//当前表类型 thisTable.put("types",String.valueOf(thisTable.get("types")).split(",")); if(StringUtil.isEmpty(one)){ one ="thisTypes0"; }else{ if(StringUtil.isEmpty(two)){ two ="thisTypes0"; } } } if(isJoinTableFlag){//级联表类型 Map<String, Object> joinTable = (Map<String, Object>) params.get("joinTable"); if(StringUtil.isNotEmpty(String.valueOf(joinTable.get("types")))){ joinTable.put("types",String.valueOf(joinTable.get("types")).split(",")); if(StringUtil.isEmpty(one)){ one ="joinTypes0"; }else{ if(StringUtil.isEmpty(two)){ two ="joinTypes0"; } } } } List<Map<String, Object>> result = commonService.barCount(params); List<String> xAxis = new ArrayList<>();//报表x轴 List<List<String>> yAxis = new ArrayList<>();//y轴 List<String> legend = new ArrayList<>();//标题 if(StringUtil.isEmpty(two)){//不包含第二列 List<String> yAxis0 = new ArrayList<>(); yAxis.add(yAxis0); legend.add(""); for(Map<String, Object> map :result){ String oneValue = String.valueOf(map.get(one)); String value = String.valueOf(map.get("value")); xAxis.add(oneValue); yAxis0.add(value); } }else{//包含第二列 Map<String, HashMap<String, String>> dataMap = new LinkedHashMap<>(); if(StringUtil.isNotEmpty(two)){ for(Map<String, Object> map :result){ String oneValue = String.valueOf(map.get(one)); String twoValue = String.valueOf(map.get(two)); String value = String.valueOf(map.get("value")); if(!legend.contains(twoValue)){ legend.add(twoValue);//添加完成后 就是最全的第二列的类型 } if(dataMap.containsKey(oneValue)){ dataMap.get(oneValue).put(twoValue,value); }else{ HashMap<String, String> oneData = new HashMap<>(); oneData.put(twoValue,value); dataMap.put(oneValue,oneData); } } } for(int i =0; i<legend.size(); i++){ yAxis.add(new ArrayList<String>()); } Set<String> keys = dataMap.keySet(); for(String key:keys){ xAxis.add(key); HashMap<String, String> map = dataMap.get(key); for(int i =0; i<legend.size(); i++){ List<String> data = yAxis.get(i); if(StringUtil.isNotEmpty(map.get(legend.get(i)))){ data.add(map.get(legend.get(i))); }else{ data.add("0"); } } } System.out.println(); } Map<String, Object> resultMap = new HashMap<>(); resultMap.put("xAxis",xAxis); resultMap.put("yAxis",yAxis); resultMap.put("legend",legend); return R.ok().put("data", resultMap); } }
五,项目总结
本文不但对基于Java实现的相册管理平台在建设中的可行性、需要及其总体设计等诸多方面做出了分析,还对所用得到的技术做了深刻地探究与介绍。本文主要研究的内容主要包括以下六个方面:
(1)研究并详细介绍了云相册的背景、国内外现状和发展趋势。
(2)对云相册的前后台两个子系统的需求进行了详细地分析。
(3)合理地分析与设计了相册管理系统需要用到的数据库表结构。
(4)对相册系统的业务逻辑进行了详细阐述,并给出了实现代码。
(5) 研究如何将Springboot框架和Vue框架应用到相册系统,并在此框架上实现了具体的业务功能。
(6)编写与执行针对本系统的测试用例。
本次开发设计的相册管理平台,主要是通过网络存储的方式来实现个人相册和相片的管理。目前图片数据的存储主要存储在个人服务器端,如果业务量大了以后这种存储方式就不太适合。所以后期可以考虚结合阿里云存储或七牛云存储平台来实现将客户的相片信息存储在云端,这些专业的存储平台有着更好的安全和性能服务。