相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统

作者简介:全栈开发工程,从事Java、Python、前端、小程序方面的开发和研究,对大数据应用与开发比较感兴趣,

主要内容:Java项目、前端项目、Python项目、小程序开发、大数据项目、单片机

收藏点赞不迷路  关注作者有好处

文末获取源码 

感谢您的关注,请收藏以免忘记,点赞以示鼓励,评论给以建议,爱你哟

项目编号: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所示:

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第1张图片

图1 前端用户用例图

前端用户用例描述:前端用户注册登陆后,主要可以实现在线浏览公告信息、浏览自己的相册信息、在交论坛交流、留言反馈,并可以在个人中心中管理自己的个人信息和相册信息等。

后台管理员的操作用例图如下图2所示:

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第2张图片

图2 后台用户用例图

后台管理员用例图描述:后台管理员登陆相册管理平台,主要的职责是对全局的信息进行相关的管理操作,主要包含对于前端注册用户的管理、管理员信息管理、相册信息管理、论坛管理、公告管理、留言板管理、基础数据管理、轮播图展示管理等。

在对整个相册管理平台做了充分的需求分析和架构设计之后,最终确定了本次开发设计的相册管理系统要实现的功能目标,具体展示如下图3所示。

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第3张图片

对于本课题要实现的功能,下面进行一下相应的介绍。

前端用户的功能描述:

(1)注册登陆:相册管理平台的用户如果以游客身份进入平台,主要可以进行信息的浏览操作,其它的相册管理、在线留言等模块是无权限操作的。只有注册为会员用户,并根据注册时指定的账户登陆平台,才可以获得平台的授权来进行相关操作。

(2)相册浏览:点击相册链接即可进入相册详情展示页,相册里有多个所属的图片可供浏览,同时相册添加时可指定相册的背景音乐,增强了客户浏览的体验感。

(3)相册管理:用户在个人中心中可以管理自己相册,创建相册,并在相册里上传自己的多张照片。

(4)公告浏览:平台可以根据需要发布一些新闻或系统公告,来让用户浏览了解。

(5)在线留言:给注册的会员用户提供了一个在线反馈的机制,以收集客户的需求和建议。

(6)个人中心:在个人中心处主要完成对个人基本信息管理,以及自己的相册和相册的管理。

(7)论坛讨论:主要为用户提供一个在线交流互动的功能。

后台管理员的操作功能描述如下:

(1)用户管理:主要实现对在相册管理平台注册的用户信息和平台管理员的管理操作。

(2)公告分类管理:主要完成对系统公告分类信息的管理操作,方便用户分类进行公告信息的查看。

(3)相册管理:完成对前端所有用户创建的相册管理操作。

(4)相片管理:对用户在相册中添加的相关进行管理操作。

(5)留言管理:主要是对前端用户在线留言进行管理。

(6)轮播图管理:管理前端展示的轮播图片。

(7)论坛管理:管理前端用户在线讨论的贴子信息。

三,系统展示

用户登录:

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第4张图片

 用户注册

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第5张图片

 相册浏览

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第6张图片

 相片浏览

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第7张图片

公告浏览

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第8张图片

论坛互动

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第9张图片

 在线留言

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第10张图片

个人相册管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第11张图片

 相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第12张图片

后台管理员功能

用户管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第13张图片

公告分类管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第14张图片

相册封面管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第15张图片

相册管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第16张图片

轮播图管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第17张图片

公告管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第18张图片

论坛管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第19张图片

 留言管理

相册管理系统|基于Springboot+Vue实现前后端分离的相册管理系统_第20张图片

四,核心代码展示

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 params) {
        logger.debug("饼状图求和:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.pieSum(params);
        return R.ok().put("data", result);
    }

    /**
     * 饼状图统计
     * @return
     */
    @RequestMapping("/pieCount")
    public R pieCount(@RequestParam Map params) {
        logger.debug("饼状图统计:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.pieCount(params);
        return R.ok().put("data", result);
    }

    /**
     * 柱状图求和单列
     * @return
     */
    @RequestMapping("/barSumOne")
    public R barSumOne(@RequestParam Map params) {
        logger.debug("柱状图求和单列:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.barSumOne(params);

        List xAxis = new ArrayList<>();//报表x轴
        List> yAxis = new ArrayList<>();//y轴
        List legend = new ArrayList<>();//标题
        List yAxis0 = new ArrayList<>();
        yAxis.add(yAxis0);
        legend.add("");
        for(Map map :result){
            String oneValue = String.valueOf(map.get("name"));
            String value = String.valueOf(map.get("value"));
            xAxis.add(oneValue);
            yAxis0.add(value);
        }
        Map 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 params) {
        logger.debug("柱状图统计单列:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.barCountOne(params);

        List xAxis = new ArrayList<>();//报表x轴
        List> yAxis = new ArrayList<>();//y轴
        List legend = new ArrayList<>();//标题

        List yAxis0 = new ArrayList<>();
        yAxis.add(yAxis0);
        legend.add("");
        for(Map map :result){
            String oneValue = String.valueOf(map.get("name"));
            String value = String.valueOf(map.get("value"));
            xAxis.add(oneValue);
            yAxis0.add(value);
        }
        Map 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 params) {
        logger.debug("柱状图统计双列:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.barSumTwo(params);
        List xAxis = new ArrayList<>();//报表x轴
        List> yAxis = new ArrayList<>();//y轴
        List legend = new ArrayList<>();//标题

        Map> dataMap = new LinkedHashMap<>();
        for(Map 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 name1Data = new HashMap<>();
                name1Data.put(name2Value,value);
                dataMap.put(name1Value,name1Data);
            }

        }

        for(int i =0; i());
        }

        Set keys = dataMap.keySet();
        for(String key:keys){
            xAxis.add(key);
            HashMap map = dataMap.get(key);
            for(int i =0; i 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 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 params) {
        logger.debug("柱状图统计双列:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.barCountTwo(params);
        List xAxis = new ArrayList<>();//报表x轴
        List> yAxis = new ArrayList<>();//y轴
        List legend = new ArrayList<>();//标题

        Map> dataMap = new LinkedHashMap<>();
        for(Map 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 name1Data = new HashMap<>();
                name1Data.put(name2Value,value);
                dataMap.put(name1Value,name1Data);
            }

        }

        for(int i =0; i());
        }

        Set keys = dataMap.keySet();
        for(String key:keys){
            xAxis.add(key);
            HashMap map = dataMap.get(key);
            for(int i =0; i 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 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 params) {
        logger.debug("queryScore:,,Controller:{},,params:{}",this.getClass().getName(),params);
        Map queryScore = commonService.queryScore(params);
        return R.ok().put("data", queryScore);
    }

    /**
     * 查询字典表的分组统计总条数
     *  tableName  		表名
     *	groupColumn  	分组字段
     * @return
     */
    @RequestMapping("/newSelectGroupCount")
    public R newSelectGroupCount(@RequestParam Map params) {
        logger.debug("newSelectGroupCount:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.newSelectGroupCount(params);
        return R.ok().put("data", result);
    }

    /**
     * 查询字典表的分组求和
     * tableName  		表名
     * groupColumn  		分组字段
     * sumCloum			统计字段
     * @return
     */
    @RequestMapping("/newSelectGroupSum")
    public R newSelectGroupSum(@RequestParam Map params) {
        logger.debug("newSelectGroupSum:,,Controller:{},,params:{}",this.getClass().getName(),params);
        List> result = commonService.newSelectGroupSum(params);
        return R.ok().put("data", result);
    }

    /**
     * 柱状图求和 老的
     */
    @RequestMapping("/barSum")
    public R barSum(@RequestParam Map 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 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 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 joinTable = (Map) 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 joinTable = (Map) 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 joinTable = (Map) 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> result = commonService.barSum(params);

        List xAxis = new ArrayList<>();//报表x轴
        List> yAxis = new ArrayList<>();//y轴
        List legend = new ArrayList<>();//标题

        if(StringUtil.isEmpty(two)){//不包含第二列
            List yAxis0 = new ArrayList<>();
            yAxis.add(yAxis0);
            legend.add("");
            for(Map map :result){
                String oneValue = String.valueOf(map.get(one));
                String value = String.valueOf(map.get("value"));
                xAxis.add(oneValue);
                yAxis0.add(value);
            }
        }else{//包含第二列
            Map> dataMap = new LinkedHashMap<>();
            if(StringUtil.isNotEmpty(two)){
                for(Map 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 oneData = new HashMap<>();
                        oneData.put(twoValue,value);
                        dataMap.put(oneValue,oneData);
                    }

                }
            }

            for(int i =0; i());
            }

            Set keys = dataMap.keySet();
            for(String key:keys){
                xAxis.add(key);
                HashMap map = dataMap.get(key);
                for(int i =0; i 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 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 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 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 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 joinTable = (Map) 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 joinTable = (Map) 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 joinTable = (Map) 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> result = commonService.barCount(params);

        List xAxis = new ArrayList<>();//报表x轴
        List> yAxis = new ArrayList<>();//y轴
        List legend = new ArrayList<>();//标题

        if(StringUtil.isEmpty(two)){//不包含第二列
            List yAxis0 = new ArrayList<>();
            yAxis.add(yAxis0);
            legend.add("");
            for(Map map :result){
                String oneValue = String.valueOf(map.get(one));
                String value = String.valueOf(map.get("value"));
                xAxis.add(oneValue);
                yAxis0.add(value);
            }
        }else{//包含第二列
            Map> dataMap = new LinkedHashMap<>();
            if(StringUtil.isNotEmpty(two)){
                for(Map 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 oneData = new HashMap<>();
                        oneData.put(twoValue,value);
                        dataMap.put(oneValue,oneData);
                    }

                }
            }

            for(int i =0; i());
            }

            Set keys = dataMap.keySet();
            for(String key:keys){
                xAxis.add(key);
                HashMap map = dataMap.get(key);
                for(int i =0; i 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 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)编写与执行针对本系统的测试用例。

本次开发设计的相册管理平台,主要是通过网络存储的方式来实现个人相册和相片的管理。目前图片数据的存储主要存储在个人服务器端,如果业务量大了以后这种存储方式就不太适合。所以后期可以考虚结合阿里云存储或七牛云存储平台来实现将客户的相片信息存储在云端,这些专业的存储平台有着更好的安全和性能服务。

你可能感兴趣的:(网站平台类项目,Java项目实战,spring,boot,后端,java,相册管理,个人相册管理)