vue+go-gin+nginx实现后台管理系统

2023-10-26

前后端分离的经典后台管理系统。

主要用到的技术和组件:

前端:vuejs,组件element ui、ant vue、axios

后端:golang,框架go-gin,swagger组件

服务代理:nginx

 

过程中的疑难问题和关键点记录:

一、nginx反向代理:

mac下修改/usr/local/etc/nginx/nginx.conf.default文件:修改后需要重启nginx。

server {
        listen       80;
        server_name xxx.com;
        root /data/nginx/cpmWeb;
        index index.html index.htm;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-                        
        revalidate, max-age=0';
        try_files $uri $uri/ /index.html;
        }
        location /api {
        proxy_pass http://127.0.0.1:8080/;
        }
        location /api/swagger/index.html {
        proxy_pass http://127.0.0.1:8080/swagger/index.html;
       }

后端的服务是在8080端口,利用proxy_pass实现反向代理,也就是任何访问127.0.0.1:80/api或者127.0.0.1:80/api/swagger/index.html,都会反向代理到后端服务的8080端口相应路径上。这样做是能够让前端中的api访问找到对应路径,比如前端需要访问后端某个api,localhost:80/api/xxx。会访问到对应后端的api。

 

二、get方法的参数大小限制

get方法一般采用在url最后添加参数,比如xxx:80/api/getusername?username=xxx。其中?后面的就是我们可以通过get方法传递的参数(params)。但是这个参数是有长度限制的。浏览器和服务器都对这个参数有限制。对于长参数,建议采用post方法。

浏览器:

1、IE
IE浏览器(Microsoft Internet Explorer) 对url长度限制是2083(2K+53),超过这个限制,则自动截断(若是form提交则提交按钮不起作用)。

2、firefox
firefox(火狐浏览器)的url长度限制为 65 536字符,但实际上有效的URL最大长度不少于100,000个字符。

3、chrome
chrome(谷歌)的url长度限制超过8182个字符返回本文开头时列出的错误。

4、Safari
Safari的url长度限制至少为 80 000 字符。

5、Opera
Opera 浏览器的url长度限制为190 000 字符。Opera 9 地址栏中输入190 000字符时依然能正常编辑。

服务器:

1、Apache
Apache能接受url长度限制为8 192 字符

2、IIS
Microsoft Internet Information Server(IIS)能接受url长度限制为16 384个字符。
这个是可以通过修改的(IIS7)configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryStringsetting.<requestLimits maxQueryString="length"/>

3、Perl HTTP::Daemon
Perl HTTP::Daemon 至少可以接受url长度限制为8000字符。Perl HTTP::Daemon中限制HTTP request headers的总长度不超过16 384字节(不包括post,file uploads等)。但当url超过8000字符时会返回413错误。
这个限制可以被修改,在Daemon.pm查找16×1024并更改成更大的值。

4、ngnix
可以通过修改配置来改变url请求串的url长度限制。

client_header_buffer_size 默认值:client_header_buffer_size 1k

large_client_header_buffers默认值 :large_client_header_buffers 4 4k/8k

修改后需重启nginx服务。

 

三、实现本地图片裁剪和预览

利用element的el-image元素:

<el-image
    style="width: 100px; height: 100px"
    :src="require('/Users/xxx/go/src/flow-system/output.jpeg')"
    :preview-src-list="[require('/Users/xxx/go/src/flow-system/output.jpeg')]">
</el-image>

style裁剪图片为100*100大小,src就是本地图片,需要用到require(本地路径),对于url图片,可直接src=http://xxx。preview-src-list是预览图片,预览本地图片,需要[require(本地路径)]。对于url图片,直接preview-src-list=http://xxx。

效果如下:

点击图片可预览:

 

四、对不确定元素的数据传输和解析。

有时候,前端向后端发送请求,后端返回的数据是无规律的,不知道有几个,也不知道有什么字段,这种情况下,无法通过强类型表示和传输。因此采用go的interface,可以表示任何数据。

 比如:

type Base64resp struct {
	Format string `json:"format"`
	Width string `json:"width"`
	Height string `json:"height"`
	Size string `json:"size"`
	Exif interface{} `json:"exif"`
}

其中exif就是interface类型。传递给前端后,怎么解析呢?

如果不解析,直接打印出来,就是一串json字符串,不够美观和直观。

因此需要解析:

可以对这串进行分解成数组,然后通过vue打印数组的方式在网页上打印出来。

this.printObject(response.data.data.exif),response.data.data.exif就是那串字符串,printObject是解析方法:
printObject(obj){
        var temp = new Array(20).fill("");
        let index = 0
        for(var i in obj){
            temp[index] += i+":"+obj[i];
            index++;

        }
        this.exif = temp
    },

其中temp就是暂时存放的数组,this.exif就是要在div中显示的数组。再看看div中如何表示exif这个数组。

首先是初始化,exif为空数组。

export default {
        data() {
            return { 
                   exif: [],
                   }
              }
            }

然后在div处显示数组中的每个元素,并且要换行:

 <div style="border:1px solid #a5b6c8;background:#eef3f7; height: 150px; overflow: scroll">
            <ul>
                <li v-for="a in exif">{{a}}</li>
            </ul>
  </div>

利用v-for属性来轮询exif数组,然后打印轮询出的数据。

效果如下:

ComponentsConfiguration:

ExifIFDPointer:90

ExifVersion:0221

FlashpixVersion:0100

Orientation:1

PixelXDimension:4032

PixelYDimension:3024

ResolutionUnit:2

SceneCaptureType:0

XResolution:72/1

YResolution:72/1

 

五、axios的pos方法要设置"Content-Type"为"application/x-www-form-urlencoded"

如果post方法传递参数,没有设置该content-type,会报错:

has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

axios默认的Content-Type为application/json,因此需要设置该值为application/x-www-form-urlencoded。

 await axios
                       .post('http://127.0.0.1:8080/flow/test',{
                               base64info:input,
                       }, {
                               headers:{
                                   "Content-Type": "application/x-www-form-urlencoded"
                               }
                           })
                       .then(response => {xxx})

 

六、多个div放在同一行中:给所有的div加上这个标签,<div class="upload-class">

    .upload-class {
        display: inline-block;
        vertical-align: top;

    }

 

七、其他前端小tips:

1、在设计布局时,首先要用div进行划分块。才能保证组件之间不会互相影响位置。

2、div的style中的width和height尽量使用绝对值,xxxpx,不要用百分比,不然在页面缩放或者分辨率不同的屏幕上,元素的位置排列会乱。

3、善用Chrome浏览器调试前端页面,console.log,还有布局选择箭头。如下图所示

 

点击后,可以选择某个组件查看其属性,点击某组件后可以在右边查看其style,然后直接在这里修改其值,页面也会跟着变化,多用于确认元素大小、方位。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+go-gin+nginx实现后台管理系统 的相关文章

  • 如何使用 Nodejs 创建 Excel 文件?

    我是一名 Nodejs 程序员 现在我有一个数据表 我想将其保存为 Excel 文件格式 我该怎么做呢 我找到了一些 Node 库 但其中大多数是 Excel 解析器而不是 Excel 编写器 我使用的是 Linux 服务器 因此需要一些可
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 使用端口 80 的 AWS Elastic Beanstalk 上的 WebSocket 问题

    我正在将一个 node js 应用程序从 Heroku 迁移到在端口 80 上使用 WebSocket 的 AWS Elastic Beanstalk WebSocket 在 AWS Elastic Beanstalk 上返回 301 错误
  • Mongodb更新很多

    我正在使用express js 和 npm 模块 mongodb 进行开发 并以 mongodb 作为数据库 我有两个集合 即 用户 和 活动 一个用户可能有数千个活动 首先 我将用户的 id 姓名和图片 url 存储到 关系的活动文件 请
  • 如何将 Gulp 添加到我的项目中?

    我正在使用 Windows 7 Visual Studio 2013 我正在尝试在我的客户项目中设置 Gulp 我已将这些 Nuget 添加到项目中 Node js 版本 0 12 0 Npm js 版本 1 3 15 10 由于某种原因我
  • S3.getSignedUrl 接受多种内容类型

    我正在使用react s3 uploader节点包 它接受一个signingUrl用于获取用于将对象存储到 S3 中的signedUrl 目前 我已经配置了一个 lambda 函数 带有 API 网关端点 来生成此signedUrl 经过一
  • nodejs (libuv) 事件循环是否在一个阶段(队列)中执行所有回调,然后再进入下一阶段或以循环方式运行?

    我正在研究 Node js 中 libuv 提供的事件循环 我遇到了关注 Deepal Jayasekara 的博客 https blog insiderattack net event loop and the big picture n
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • 为 Node.js 客户端应用程序保留 Firebase 用户

    我正在使用 Firebase 构建 Node js 命令行界面 CLI 用于与后端进行身份验证 我想避免让用户每次运行命令时都输入密码 相反 我想实现一个 登录 流程 将凭证保留到文件系统 该凭证可用于后续的无密码身份验证 直到用户 注销
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll
  • NodeJS:调用 global.gc() 不会将内存减少到最低限度?

    为了调查内存泄漏 我设置了一条触发的路线global gc 在每个POST gc app post gc function req res global gc 但是 我注意到 如果我发送垃圾邮件此请求 每次都会越来越多地减少内存使用量 不应
  • 使用 PM2 将节点作为服务运行 - 连接被拒绝

    我正在关注this https www digitalocean com community tutorials how to set up a node js application for production on ubuntu 16
  • 无法在适当的时间对域调用 dispose

    我有一个问题domain模块 目前 我正在尝试捕获请求中引发的任何未捕获的错误 使用express中间件和域 所有请求在调用之前都会通过此函数路由next并继续走正确的路线 app use req res next gt domain cr
  • Golang中如何获得100%的代码覆盖率? [复制]

    这个问题在这里已经有答案了 我无法获得 100 的代码覆盖率 因为我无法在 Golang 中测试 Fatals 我发现了一些问答 包括this one https stackoverflow com questions 30688554 h
  • 从 Nodejs 提供二进制/缓冲区/base64 数据

    我在从节点提供二进制数据时遇到问题 我开发了一个名为的节点模块节点说话它执行 TTS 文本到语音 并返回 Base64 编码的音频文件 到目前为止 我这样做是为了转换base64到缓冲区 二进制文件 然后提供它 var src Base64
  • Access-Control-Allow-Origin值跨站缓存

    我正在尝试编写一个 nginx 配置来处理 http 和 https 上的两个站点 只要客户端从不访问这两个站点 它似乎就可以工作 但如果它们这样做 就会出现缓存 跨站点问题 Allow cross origin location eot
  • 在同一个 nginx 服务器块上公开多个 api uri

    Goal 我的目标是在同一个 nginx 服务器上设置多个后端 api 容器 http localhost 80 api account gt 调用 http account service 9000 http localhost 80 a
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 使用 Mongoose 无法找到按 ObjectId 搜索的文档

    Campaign find client id req param client id error campaigns gt if error response error error message else for campaign i

随机推荐

  • GANet: A Keypoint-based Global Association Network for Lane Detection (CVPR 2022)

    GANet A Keypoint based Global Association Network for Lane Detection 一种用于车道检测的基于关键点的全局关联网络 CVPR 2022 摘要 1 引言 2 相关工作 2 1
  • “Object reference not set to an instance of an object”报错

    Object reference not set to an instance of an object 报错原因 对象的实例化Instantiate X Instance gameObject 在引用外部脚本过程中 无法实现并报错 Obj
  • 基于MybatisPlus的多表查询

    基于MybatisPlus的多表查询 mybaitsPlus配置文档 mybatis3 x文档 目录 一对一查询 方式一 非select配置方式 方式二 通过select进行多表查询 一对多查询 用户对应多账户示例 方式一 非select配
  • 2021-06-10其他常用类

    StringUtils isNotBlank 判断不为空且也不是空字符串
  • 生成对抗性网络简介

    生成对抗性网络简介 1 原理 1 GANs如何工作 2 GAN架构 3 培训GAN 4 艺术家与评论家 5 评估指标 6 GAN变体 7 GAN应用 8 图像合成 Image synthesis 9 图像到图像的转换 Image to im
  • MySQL之InnoDB存储结构

    1 InnoDB存储引擎 InnoDB存储引擎最早由Innobase Oy公司开发 属第三方存储引擎 从MySQL 5 5版本开始作为表的默认存储引擎 该存储引擎是第一个完整支持ACID事务的MySQL存储引擎 特点是行锁设计 支持MVCC
  • 解决eclipse无法解析导入org.eclipse.swt库

    右键点击项目 gt Build Path gt Config Build Path 然后选择Libraries标签页 点击Add External JARs 再到你的eclipse安装目录下的plugins目录下寻找 org eclipse
  • JNI手动释放内存(避免内存泄露)

    1 哪些需要手动释放 不要手动释放 基本类型 jint jlong jchar 需要手动释放 引用类型 数组家族 jstring jobject jobjectArray jintArray jclass jmethodID 2 释放方法
  • 并发编程-CompletableFuture解析

    1 CompletableFuture介绍 CompletableFuture对象是JDK1 8版本新引入的类 这个类实现了两个接口 一个是Future接口 一个是CompletionStage接口 CompletionStage接口是JD
  • launch the mysql_MySQL安装最后一步无响应解决方法

    一 卸载及安装 MySQL安装到最后一步就卡住 如图 卸载原来安装的MySQL1 首先 卸载MySQL 2 然后 删除C盘下 C ProgramData MySQL 文件 然后重新安装MySQL 但是 这里要注意了 安装图1中时不要勾上 L
  • App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.

    app涉及到http访问时 会出现这个错误 App Transport Security has blocked a cleartext HTTP http resource load since it is insecure 解决方法是
  • 【libevent 】libevent 多线程实现高并发

    当你看到这篇文章时 想必你对libevent已经有了足够的了解 笔者在此就不多做描述了 直接进入正题 1 起因 最近在做Redis中间件 目标实现集群管理 分布式数据处理 高性能 由于在某些情况下 单个节点的Redis性能可能无法满足需求
  • 近半数年轻人存款不过十万,这届年轻人是存不下钱吗?

    近期 关于年轻人存款多少的话题 再一度登上了微博热搜 某媒体以一线和新一线城市年轻人为主要对象开展了抽样调查 结果显示 在1852位受访者中 存款低于1万的约有五分之一 而另一个分界点是10万 属于1 10万这个区间的人数最多 如果你的存款
  • linux 配置nginx文件下载页面

    root localhost conf vim nginx conf user nobody worker processes 1 events worker connections 1024 http include mime types
  • 从原理到应用教你了解毫米波雷达

    关注公众号 发现CV技术之美 本文转自西湖大学智能无人系统课题组 作者丁苏生 毫米波雷达基础知识 简介 毫米波雷达 mmWave Rader 采用毫米波作为电磁波发送信号 捕捉并处理电磁波经过路径障碍物的反射信号后可获取目标物体的 速度 距
  • Windows 让cmd启动的程序在后台运行

    在Linux下要使程序后台运行 可通过 java jar Client jar 来实现 在Windows下 则通过 start b java jar Client jar 来实现 20181227更新 这里说的后台运行是指在当前Termin
  • spring 配置

    不配置 启动事务 会报错 404 启用事务管理 EnableTransactionManagement SpringBootApplication scanBasePackages w sh EnableJpaRepositories ba
  • CentOS7安装redis5.0并且搭建集群

    记录在两台虚拟机 版本 CentOS7 上搭建Redis集群 Redis版本 redis 5 0 4 过程如下 1 下载安装 首先在一台虚拟机A IP 192 168 1 103 上新建目录redis 接着进入该目录下 下载redis 5
  • openmp设置线程数目_线程池的参数、配置、基本概念

    线程池的概念和工作机制 概念 首先系统空闲时在创建大量线程 这些线程的集合成为线程池 线程的生老病死都由线程池来决定 工作机制 当有任务到来时 提交给线程池 由线程池来指定线程执行任务 线程池会在内部寻找是否有可以执行任务的线程 任务执行完
  • vue+go-gin+nginx实现后台管理系统

    前后端分离的经典后台管理系统 主要用到的技术和组件 前端 vuejs 组件element ui ant vue axios 后端 golang 框架go gin swagger组件 服务代理 nginx 过程中的疑难问题和关键点记录 一 n