Albumverwaltungssystem | Ein Albumverwaltungssystem basierend auf Springboot+Vue, um eine Front-End- und Back-End-Trennung zu erreichen

Autoren-Homepage: Programmierkompass

Über den Autor: Hochwertiger Entwickler im Java-Bereich, CSDN-Blog-Experte, CSDN-Content-Partner, eingeladener Autor von Nuggets, Alibaba Cloud-Blog-Experte, eingeladener 51CTO-Autor, langjährige Erfahrung im Bereich Architektendesign, Dozent im Tencent-Klassenzimmer

Hauptinhalt: Java-Projekt, Python-Projekt, Front-End-Projekt, künstliche Intelligenz und Big Data, Abschlussdesign, Lebenslaufvorlage, Lernmaterialien, Interviewfragenbank, technische gegenseitige Unterstützung

Favoriten, Likes, verliere dich nicht, es ist gut, dem Autor zu folgen

Den Quellcode finden Sie am Ende des Artikels 

Artikelnummer: BS-PT-100

1. Einführung in die Umwelt

Gebietsschema: Java: jdk1.8

Datenbank: MySQL: mysql5.7

Anwendungsserver: Tomcat: tomcat8.5.31

Entwicklungstools: IDEA oder Eclipse

Hintergrundentwicklungstechnologie: Springboot + Mybatis-plus

Front-End-Entwicklungstechnologie: vue+ElementUI+Nodejs

2. Projekteinführung

Die Entwicklung der Internet-Technologie und die tiefgreifende Anwendung der Informationstechnologie haben in verschiedenen Bereichen eine große Rolle gespielt. Von der Anwendung im täglichen Leben der Menschen bis hin zu verschiedenen Lern- und Büroanwendungen hat die Informationstechnologie den Menschen große Vorteile gebracht. Große Bequemlichkeit. Was die täglichen Fotos und Fotoalben der Menschen betrifft, so wurden sie in der Vergangenheit mit Fotos aufgenommen und professionelle Fotoverarbeitungsunternehmen entwickelten, druckten die Fotos und verarbeiteten sie zu Alben. Diese Methode ist erstens unpraktisch zum Fotografieren und zweitens Die Produktionskosten sind hoch. Heutzutage ermöglicht die Popularität von Smartphones die Integration relativ professioneller Kameras in Mobiltelefone. Menschen können überall Bilder aufnehmen, sie in der Cloud speichern und sie jederzeit und überall ansehen, was sehr praktisch ist. In diesem Projekt wird untersucht, wie ein Online-Fotoalbum-Verwaltungssystem implementiert werden kann, damit Benutzer ihre eigenen Fotos und Fotoalben ganz bequem im Internet verwalten können.

Das in diesem Thema implementierte Fotoalbum-Verwaltungssystem realisiert hauptsächlich die Online-Registrierung und Anmeldung von Benutzern. Sie können Fotoalben auf der Plattform erstellen, Ihre eigenen Fotos in das Fotoalbum hochladen und diese teilen. Um das Erlebnis zu erhöhen, ist Hintergrundmusik vorhanden im Fotoalbum hinzugefügt. Gleichzeitig können Benutzer auch eine Nachricht hinterlassen und online diskutieren und eine interaktive Funktion hinzufügen. Die Plattform bietet Administratoren außerdem grundlegende Informationsverwaltungsfunktionen wie Benutzerverwaltung, Albumtypverwaltung, Albumverwaltung usw.

Dieses Thema wird hauptsächlich basierend auf dem Entwicklungsmodus der Front-End- und Back-End-Trennung entwickelt und implementiert. Das Front-End wird mit dem Vue-Framework implementiert, der Hintergrund mit dem Springboot-Framework. Gleichzeitig die Persistenzschicht Das Framework Mybatis-plus ist integriert, um den Datenpersistenzvorgang abzuschließen. Zur Datenspeicherung wird die Datenbank MYSQL5.7 verwendet, um die von der Albumverwaltungsplattform generierten Geschäftsdaten zu speichern. Das Gesamtdesign des Systems basiert auf einer dreistufigen Architektur und einem MVC-Entwurfsmuster, um die Flexibilität und Skalierbarkeit des Systems sicherzustellen. Die Front-End- und Back-End-Interaktionen werden asynchron realisiert, was das Erlebniserlebnis des Kunden verbessert.

Laut Marktforschung, Benutzerinterviews und Analysen ist bekannt, dass es auf der Albumverwaltungsplattform, die dieses Mal entworfen und implementiert wurde, zwei Arten von Benutzern gibt: einer sind die im Front-End registrierten Mitgliedsbenutzer und der andere ist der von bereitgestellte Administrator Die Plattform zur Verwaltung der grundlegenden Informationen des Systemkontos. Diese beiden Benutzertypen haben unterschiedliche Rollen und Betriebsfunktionsberechtigungen, die unten in Form eines Anwendungsfalldiagramms dargestellt werden.

Das Anwendungsfalldiagramm der im Front-End registrierten Benutzer ist in Abbildung 1 unten dargestellt:

Abbildung 1 Front-End-Benutzer-Anwendungsfalldiagramm

Beschreibung des Anwendungsfalls für Front-End-Benutzer: Nach der Registrierung und Anmeldung können Front-End-Benutzer hauptsächlich Ankündigungsinformationen online durchsuchen, ihre eigenen Fotoalbuminformationen durchsuchen, in sozialen Foren kommunizieren, Nachrichten und Feedback hinterlassen sowie ihre eigenen persönlichen Informationen und Fotos verwalten Albuminformationen im persönlichen Zentrum.

Das Betriebsanwendungsfalldiagramm des Hintergrundadministrators ist in Abbildung 2 unten dargestellt:

Abbildung 2 Hintergrunddiagramm des Benutzeranwendungsfalls

Beschreibung des Anwendungsfalldiagramms des Hintergrundadministrators: Der Hintergrundadministrator meldet sich bei der Albumverwaltungsplattform an. Seine Hauptverantwortung besteht darin, entsprechende Verwaltungsvorgänge für globale Informationen durchzuführen, hauptsächlich einschließlich der Verwaltung registrierter Front-End-Benutzer, der Verwaltung von Administratorinformationen und der Verwaltung von Albuminformationen , Forenverwaltung, Ankündigungsverwaltung, Message-Board-Verwaltung, Basisdatenverwaltung, Verwaltung der Karussellkartenanzeige usw.

Nach einer vollständigen Bedarfsanalyse und einem Architekturentwurf der gesamten Albumverwaltungsplattform werden schließlich die funktionalen Ziele festgelegt, die mit dem entwickelten und gestalteten Albumverwaltungssystem erreicht werden sollen, wie in Abbildung 3 unten dargestellt.

 

Für die in diesem Thema zu realisierenden Funktionen finden Sie unten die entsprechende Einführung.

Funktionsbeschreibung für Frontend-Benutzer:

(1) Registrierung und Anmeldung: Wenn ein Benutzer der Albumverwaltungsplattform als Tourist die Plattform betritt, kann er hauptsächlich Informationen durchsuchen, andere Module wie Albumverwaltung und Online-Nachrichten sind nicht zum Betrieb berechtigt. Nur wenn Sie sich als Mitgliedsbenutzer registrieren und sich mit dem bei der Registrierung angegebenen Konto bei der Plattform anmelden, kann die Plattform zur Durchführung entsprechender Vorgänge autorisiert werden.

(2) Durchsuchen des Albums: Klicken Sie auf den Album-Link, um die Seite mit der Anzeige der Albumdetails aufzurufen. Das Album enthält mehrere Bilder zum Durchsuchen. Gleichzeitig können Sie beim Hinzufügen eines Albums die Hintergrundmusik des Albums angeben, was das Bild verbessert Browsing-Erlebnis des Kunden.

(3) Albumverwaltung: Benutzer können ihre eigenen Alben im persönlichen Zentrum verwalten, Alben erstellen und mehrere Fotos von sich selbst in das Album hochladen.

(4) Durchsuchen von Ankündigungen: Die Plattform kann nach Bedarf einige Nachrichten oder Systemankündigungen veröffentlichen, damit Benutzer sie durchsuchen und verstehen können.

(5) Online-Nachricht: Stellen Sie registrierten Mitgliedsbenutzern einen Online-Feedback-Mechanismus zur Verfügung, um Kundenbedürfnisse und -vorschläge zu sammeln.

(6) Persönliches Zentrum: Im persönlichen Zentrum wird hauptsächlich die Verwaltung persönlicher Basisinformationen sowie die Verwaltung des eigenen Fotoalbums und Fotoalbums abgeschlossen.

(7) Forumsdiskussion: Es bietet Benutzern hauptsächlich eine Online-Kommunikations- und Interaktionsfunktion.

Die Bedienfunktionen des Hintergrundadministrators werden wie folgt beschrieben:

(1) Benutzerverwaltung: Sie realisiert hauptsächlich die Verwaltung und den Betrieb von Benutzerinformationen, die auf der Albumverwaltungsplattform und den Plattformadministratoren registriert sind.

(2) Ankündigungsklassifizierungsverwaltung: Es vervollständigt hauptsächlich den Verwaltungsvorgang der Systemankündigungsklassifizierungsinformationen, sodass Benutzer die Ankündigungsinformationen bequem nach Klassifizierung anzeigen können.

(3) Albumverwaltung: Schließen Sie die von allen Front-End-Benutzern erstellten Albumverwaltungsvorgänge ab.

(4) Fotoverwaltung: Verwalten Sie die vom Benutzer im Fotoalbum hinzugefügten Fotos.

(5) Nachrichtenverwaltung: hauptsächlich zur Verwaltung der Online-Nachrichten von Front-End-Benutzern.

(6) Karussellbildverwaltung: Verwalten Sie die im Frontend angezeigten Karussellbilder.

(7) Forenverwaltung: Verwalten Sie Beitragsinformationen von Online-Diskussionen von Front-End-Benutzern.

Drei, Systemanzeige

Benutzer-Anmeldung:

 Benutzer Registration

 Durchsuchen von Alben

 Durchsuchen von Fotos

Durchsuchen der Ankündigungen

 

Interaktion im Forum

 

 Online-Nachricht

 

Persönliche Albumverwaltung

 

Hintergrundadministratorfunktion

Benutzerverwaltung

 

Verwaltung der Ankündigungsklassifizierung

 

Verwaltung des Albumcovers

 

Albumverwaltung

 

Karussellverwaltung

 

Ankündigungsmanagement

 

Forenverwaltung

 

 Nachrichtenverwaltung

 

Viertens die Kerncode-Anzeige

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);
    }
}

V. Projektzusammenfassung

In diesem Artikel werden nicht nur die Machbarkeit, die Anforderungen und das Gesamtdesign der Java-basierten Fotoalbum-Verwaltungsplattform im Baugewerbe analysiert, sondern auch die verwendeten Technologien eingehend untersucht und vorgestellt. Der Hauptforschungsinhalt dieser Arbeit umfasst hauptsächlich die folgenden sechs Aspekte:

(1) Recherchiert und stellt den Hintergrund, den Status Quo im In- und Ausland sowie die Entwicklungstrends von Cloud-Fotoalben im Detail vor.

(2) Die Anforderungen der vorderen und hinteren Subsysteme des Cloud-Albums werden detailliert analysiert.

(3) Die vom Albumverwaltungssystem benötigte Datenbanktabellenstruktur angemessen analysiert und entworfen.

(4) Die Geschäftslogik des Albumsystems wird ausführlich beschrieben und der Implementierungscode angegeben.

(5) Studieren Sie, wie Sie das Springboot-Framework und das Vue-Framework auf das Fotoalbumsystem anwenden und spezifische Geschäftsfunktionen auf diesem Framework realisieren.

(6) Testfälle für dieses System schreiben und ausführen.

Die diesmal entwickelte und gestaltete Albumverwaltungsplattform realisiert hauptsächlich die Verwaltung persönlicher Alben und Fotos über Netzwerkspeicher. Derzeit wird die Speicherung von Bilddaten hauptsächlich auf der Seite des persönlichen Servers gespeichert. Wenn das Geschäftsvolumen groß ist, ist diese Speichermethode nicht geeignet. Daher kann es in einer späteren Phase mit Alibaba Cloud Storage oder der Qiniu Cloud Storage Platform kombiniert werden, um die Fotoinformationen der Kunden in der Cloud zu speichern. Diese professionellen Speicherplattformen bieten bessere Sicherheits- und Leistungsdienste.

Supongo que te gusta

Origin blog.csdn.net/whirlwind526/article/details/131269269
Recomendado
Clasificación