详细记录Docker部署前后端分离项目的过程

虚拟机软件下载

VMware安装 (一直下一步就行。)

VMware下载

VMware认证秘钥

CentOS镜像下载

虚拟机创建

然后启动,就会在虚拟机中安装导入的centos镜像。

远程管理服务器

我们不可能在虚拟机centos系统的终端操作命令,很麻烦。所以我们需要一个可以通过ssh客户端,这里使用xshell

上传服务器文件

为了更好地操作文件,我们需要通过ftp协议去连接服务器,然后进行文件操作,这里选择filezilla。因为linux系统没有GUI,所以编辑起来比较麻烦。

linux默认是不开启ftp协议的,开启的是SFTP协议。

linux优点

  • 跨平台的硬件支持
  • 丰富的软件支持。CentOS,通过yum安装软件,Ubuntu,通过apt安装软件。
  • 多用户多任务。
  • 可靠的安全性。(权限管理非常完善)
  • 良好的稳定性。
  • 完善的网络功能。(强大的防火墙)

linux目录结构

文件或者文件夹都放在根目录下。

  • /bin:存放系统的可执行二进制文件,如ls、cp、mv等命令。
  • /boot:存放引导系统启动所需的文件,包括内核镜像和引导加载程序。
  • /dev:存放抽象硬件,设备文件目录,包含Linux系统中所有的设备文件,如磁盘、终端设备、打印设备等。
  • /etc:存放系统配置文件,包括用户帐号和密码、网络配置、服务配置等。
  • /home:存放用户的主目录,每个用户通常在此目录下有一个与用户名相同的子目录。
  • /lib:存放系统和应用程序使用的共享库(类似于Windows的动态链接库)。
  • /media:挂载点目录,用于挂载可移动介质,如光盘、USB存储设备等。
  • /mnt:挂载点目录,用于挂载临时文件系统,如NFS共享、临时挂载Windows分区等。
  • /opt:存放可选的应用程序包、第三方软件等。(大型软件存放目录)
  • /proc:虚拟文件系统,提供有关系统内核和进程的信息。
  • /root:超级用户(root)的主目录。
  • /sbin:存放系统管理员使用的系统管理和维护命令。
  • /tmp:临时文件目录,用于存放临时文件,该目录下的文件在系统重启时会被清空。
  • /usr:存放用户程序和数据的目录,包括系统应用程序、库文件、文档等。(存放安装程序,程序默认目录)
  • /var:存放系统运行时需要修改的文件,如日志文件、缓存文件、邮件等。(存放经常变化的文件)

查看linux文件信息

ls -l <dirname / filename>, ll

文件属性共有10位组成,第一位表示文件类型,其他9位表示权限信息。每三位一组。

文件类型

  • d 目录
  • - 文件
  • l 软连接
  • b 存储设备。例如移动硬盘的信息。
  • c 串行设备。鼠标键盘等。

属主权限,属组权限,其他用户权限

  • r
  • w
  • x 执行
文件类型,操作权限 文件数量(文件是1,文件夹统计的是内部文件数量,注意不会递归统计,只会统计当前目录下的) 创建该文件用户的名字 创建该文件所属的用户组名字 大小(字节Byte) 文件创建时间信息 文件名
drwxr-xr-x. 2 root root 6 Aug 5 12:49 llm

修改文件或者目录权限

shell 复制代码
chmod id <dirname / filename>

创建用户

shell 复制代码
adduser <username>

passwd <username>

login # 登陆
su - <username> # 切换用户

切换用户

创建用户,操作文件,权限不足

修改权限

CentOS7 防火墙

默认安装了firewalld防火墙。利用防火墙我们可以允许或者限制传输的数据通过。

例如我们访问远程服务器上的mysql数据库,如果远程服务器中未开启3306端口,我们将不能访问远程服务器中的mysql。

shell 复制代码
# 查看
firewall-cmd --state
# 启动
service firewall start
# 关闭
service firewall stop
# 重启
service firewall restart

普通用户无法查看防火墙,必须是超级用户,即root。

管理防火墙

端口管理

shell 复制代码
    # 开启 8080 - 8085 这范围的端口
    firewall-cmd --permanent --add-port=8080-8085/tcp
    # 加载最新设置
    firewall-cmd --reload
    # 查看开放哪些端口
    firewall-cmd --permanent --list-ports
    # 删除端口
    firewall-cmd --permanent --remove-port=8080-8085/tcp

查看开启的端口和服务

shell 复制代码
# 查看开放的网络端口
firewall-cmd --permanent --list-ports 
# 有哪些服务使用了互联网
firewall-cmd --permanent --list-services

Docker

Docker 是一个流行的容器化平台,可以帮助简化和改进项目的部署过程。镜像是用来创建容器的。容器是从镜像中创建出来的虚拟实例。

1.轻量和可移植性:Docker 容器非常轻量,只包含运行应用程序所需的最小依赖项,因此可以更有效地利用系统资源。Docker 容器还具有良好的可移植性,可以在不同的运行环境中进行部署,而无需担心依赖项或配置的不兼容性。

2.一致的开发和生产环境:Docker 允许开发人员在本地创建容器,以在与生产环境相同的环境中运行和测试应用程序。这种一致性可以减少由于环境差异而导致的问题,并提高开发团队之间的合作效率。

3.快速部署和扩展:使用 Docker 部署项目可以更快地进行部署和扩展。由于容器是轻量级的,可以在几秒钟内启动和停止,从而大大缩短了项目的部署时间。此外,可以使用 Docker Compose 或 Docker Swarm 这样的工具轻松扩展应用程序的容器实例,以满足不断增长的流量需求。

4.环境隔离和安全性:每个 Docker 容器都是独立且隔离的,具有自己的文件系统、进程和网络空间。这种隔离性可以防止应用程序之间的相互影响,并提供更高的安全性。即使一个容器中的应用程序出现问题,它也不会对其他容器或宿主机造成影响。

5.持续集成和交付:Docker 容器可以与持续集成和持续交付(CI/CD)流程无缝集成。开发团队可以使用容器构建、测试和部署应用程序,从而在开发周期中实现更快的迭代和交付。

总之,Docker 提供了一种方便、可移植、高效和安全的方式来部署和管理项目。它可以提高开发和运维的效率,并促进团队的协作和软件交付的可靠性。

docker创建的所有虚拟实例共用同一个linux内核,对硬件占用较小,属于轻量级虚拟机。

安装Docker

shell 复制代码
# 先更新yum软件管理器
yum -y update

yum install -y docker

切换docker镜像源

shell 复制代码

管理docker

shell 复制代码
# 启动
service docker start
# 关闭
service docker stop
# 重启
service docker restart

docker相关指令

容器管理相关指令

  • 创建容器:docker create
  • 启动容器:docker start
  • 停止容器:docker stop
  • 重启容器:docker restart
  • 删除容器:docker rm
  • 查看容器状态:docker ps
  • 进入运行中的容器:docker exec
  • 暂停容器:docker pause
  • 恢复容器的运行:docker unpause

镜像管理相关指令

  • 拉取镜像:docker pull
  • 构建镜像:docker build
  • 查看已安装镜像列表:docker images
  • 删除镜像:docker rmi
  • 导出镜像:docker save
  • 导入镜像:docker load
  • 查看有哪些相关镜像:docker search <keyword>

网络管理相关指令

  • 创建网络:docker network create
  • 查看网络列表:docker network ls
  • 连接容器到网络:docker network connect
  • 断开容器与网络的连接:docker network disconnect

数据管理相关指令

  • 挂载主机目录到容器:docker run -v
  • 查看数据卷:docker volume ls
  • 创建数据卷(目录和目录的映射),文件的映射直接通过-v参数去映射即可:docker volume create
  • 删除数据卷:docker volume rm

日志和信息相关指令

  • 查看容器日志:docker logs
  • 查看容器信息:docker inspect
  • 查看容器内进程信息:docker top

其他常用指令

  • 克隆镜像并修改名称:docker tag <原镜像名称> <修改的名称>
  • 构建并启动容器:docker run
  • 进入容器交互式终端:docker exec -it-it表示启动终端交互界面。如果启动时不加这个参数,那么启动后依旧停留在宿主机交互界面中。
  • 其他指令选项如 -d(后台运行)、-p(端口映射)、-e(环境变量设置)等,用于配置容器运行参数。

mysql集群方案介绍

数据库集群是一种将多个数据库服务器组合在一起以实现高可用性、负载均衡和扩展性的解决方案。

单节点数据库的弊病

  • 单节点数据库无法满足性能上的要求。
  • 单节点数据库没有冗余设计,无法满足高可用。

PXC集群

达到实时同步。每个节点都可以读取和写入数据,如果有一个节点数据未写入成功,那么数据就表示写入失败。

安装PXC镜像。

shell 复制代码
docker pull percona/percona-xtradb-cluster

创建内部网络

出于安全考虑,我们给PXC集群实例创建Docker内部网络。

shell 复制代码
# 创建网段
docker network create net1
# 查看网段信息
docker network inspect net1
# 移除网段
docker network rm net1

创建数据卷,将宿主机中的数据映射到容器中的PXC节点中。一般创建卷映射文件在/var/lib/docker/volumes/中。

shell 复制代码
# 创建数据卷
docker volume create --name v1
# 删除数据卷
docker volume rm v1

创建PXC容器,只需要向PXC镜像传入运行参数就能创建出PXC容器。

shell 复制代码
# 创建出的容器在后台运行,将宿主机端口与容器端口映射。
# 挂载主机目录到容器,通过上面创建的数据卷
# 指定创建容器的mysql密码,集群名称,数据库节点之间同步用到的密码
# 给映射的文件在容器中操作最高的权限。
# 容器起名字
# 使用的内部网段
# 使用的ip地址
# 镜像的名字
docker run -d -p 3306:3306
-v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=password
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=password
--privileged 
--name=node1 
--net=net1 
--ip 172.18.0.2
pxc

创建服务器集群

shell 复制代码
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
shell 复制代码
# 创建第一个节点
docker run -d -p 3306:3306 
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456 
-v v1:/var/lib/mysql --privileged
--name=node1 --net=net1 --ip 172.18.0.2 pxc

# 创建第二个节点
# CLUSTER_JOIN表示和第几个节点进行同步
docker run -d -p 3307:3306 
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v2:/var/lib/mysql --privileged
--name=node2 --net=net1 --ip 172.18.0.3 pxc

# 创建第三个节点
docker run -d -p 3308:3306 
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1 
-v v3:/var/lib/mysql --privileged
--name=node3 --net=net1 --ip 172.18.0.4 pxc

# 创建第四个节点
docker run -d -p 3309:3306 
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1  
-v v4:/var/lib/mysql --privileged
--name=node4 --net=net1 --ip 172.18.0.5 pxc

# 创建第五个节点
docker run -d -p 3310:3306 
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v5:/var/lib/mysql --privileged
--name=node5  --net=net1 --ip 172.18.0.6 pxc

本地mysql GUI连接数据库

连接上面创建的五个数据库节点

然后操作一个数据库都会影响该集群下的所有数据库。

数据库负载均衡

将请求均匀的分配给集群中的数据库进行操作。使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好。

中间件 开发语言 支持协议 负载均衡算法 高可用性功能 扩展性能力 服务发现和注册 社区支持和文档
Nginx C HTTP, HTTPS, TCP 轮询,IP哈希,最少连接 健康检查,热备份 水平扩展,反向代理 第三方实现,集成zookeeper等 强大的社区支持和文档
HAProxy C HTTP, HTTPS, TCP 轮询,IP哈希,最少连接 健康检查,故障转移 水平扩展,反向代理,SSL终止 主动探测,动态配置管理 社区支持和文档丰富
Envoy C++ HTTP, gRPC, TCP, MQTT 轮询,最少连接,最佳负载 健康检查,故障转移,熔断 水平扩展,HTTP/2支持,过滤器 集成服务发现(如Consul) 活跃的开源社区和文档
Traefik Go HTTP, TCP, UDP 轮询,IP哈希,最少连接 健康检查,故障转移,熔断 水平扩展,反向代理,自动HTTPS 集成服务发现(如Etcd) 活跃的开源社区和文档
Apache Traffic C HTTP, HTTPS, TCP, UDP 轮询,IP哈希,最少连接 健康检查,故障转移,会话保持 水平扩展,反向代理,负载均衡 集成第三方服务发现(如Consul) 社区支持和文档丰富

在docker容器中安装HAProxy镜像。

shell 复制代码
docker pull haproxy:1.8.8

创建HAProxy配置文件,来达到负载均衡。可以参考这里

shell 复制代码
touch /home/soft/haproxy/haproxy.cfg

配置文件内容如下

shell 复制代码
global
	#工作目录
	chroot /usr/local/etc/haproxy
	#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
	log 127.0.0.1 local5 info
	#守护进程运行
	daemon

defaults
	log	global
	mode	http
	#日志格式
	option	httplog
	#日志中不记录负载均衡的心跳检测记录
	option	dontlognull
  #连接超时(毫秒)
	timeout connect 5000
  #客户端超时(毫秒)
	timeout client  50000
	#服务器超时(毫秒)
  timeout server  50000

#监控界面	
listen  admin_stats
	#监控界面的访问的IP和端口
	bind  0.0.0.0:8888
	#访问协议
  mode        http
	#URI相对地址
  stats uri   /dbs
	#统计报告格式
  stats realm     Global\ statistics
	#登陆帐户信息
  stats auth  admin:123456
#数据库负载均衡
listen  proxy-mysql
	#访问的IP和端口
	bind  0.0.0.0:3306  
  #网络协议
	mode  tcp
	#负载均衡算法(轮询算法)
	#轮询算法:roundrobin
	#权重算法:static-rr
	#最少连接算法:leastconn
	#请求源IP算法:source 
  balance  roundrobin
	#日志格式
  option  tcplog
	#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
  option  mysql-check user haproxy
  server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
  server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
	server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
	server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
	server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
	#使用keepalive检测死链
  option  tcpka 

启动haproxy容器

shell 复制代码
# 将容器中的监控界面端口映射到宿主机4001端口上
# 将容器负载均衡端口映射到宿主机4002端口上
# 将主机目录和容器目录映射

# 使用的内部网段。和数据库集群在同一个网段
docker run -it -d
-p 4001:8888
-p 4002:3306
-v /home/soft/haproxy:/usr/local/etc/haproxy
--privileged
--name h1 
--net=net1
--ip 172.18.0.7
haproxy

启动容器后,打开其终端交互界面

shell 复制代码
docker exec --it h1 bash

进入容器后,指定配置文件路径。既可以访问监控界面了

shell 复制代码
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

在MYSQL中创建一个 haproxy用户,密码为空的账号。用户haproxy容器向数据库发心跳检测登录使用。

mysql 复制代码
# 任何ip都可以通过haproxy登录这个账户
CREATE USER 'haproxy'@'%' IDENTIFIED BY ''

由于单节点Haproxy不具备高可用,必须要冗余设计。设计多个数据库负载均衡节点。

利用keepalived实现双机热备。

从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务。

从狭义上讲,双机热备就是使用互为备份的两台服务器共同执行同一服务,其中一台主机为工作机(Primary Server),另一台主机为备份主机(Standby Server)。在系统正常情况下,工作机为应用系统提供服务,备份机监视工作机的运行情况(一般是通过心跳诊断,工作机同时也在检测备份机是否正常),当工作机出现异常,不能支持应用系统运营时,备份机主动接管工作机的工作,继续支持关键应用服务,保证系统不间断的运行。双机热备针对的是IT核心服务器、存储、网络路由交换的故障的高可用性解决方案。

安装keepalived,keepalived必须要安装到Haproxy所在的容器之内。这里使用apt指令是因为haproxy镜像是通过ubuntu创建的。

我们先更改apt下载的源,不然会报错,或者下载很慢

shell 复制代码
apt-get update
apt-get install keepalived

keepalived在运行时需要争抢虚拟ip,所以需要添加配置文件。

shell 复制代码
# /etc/keepalived/keppalived.conf
vrrp_instance VI_1 {
  # keepalived的身份(master主服务器, backup备用服务器)。主服务器需要抢占虚拟ip,备用服务器不会抢占虚拟ip
  state MASTER
  # 网卡设备
  interface eth0
  # 虚拟路由标识,master和backup的虚拟路由标识必须一致,标识可以是0 - 255
  virtual_router_id 51
  # master权重要高于backup,数字越大优先级越高。
  priority 100
  # master与backup节点间同步检查的时间间隔,单位是秒,准备之间必须一致。
  advert_int 1
  # 主从服务器验证方式。主备必须使用相同的密码才能正常通信。
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  # 虚拟ip地址。可以设置多个虚拟ip地址,每行一个
  virtual_ipaddress {
    172.18.0.201
  }
}

启动keepalived程序。

shell 复制代码
service keepalived start

热备份

将数据备份到寄主机上。创建数据卷

shell 复制代码
# 在宿主机中创建数据卷
docker volume create backup
# 将数据卷映射到pxc节点中
docker run -d -p 3306:3306 
-e MYSQL_ROOT_PASSWORD=12345
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=12345
-v v1:/var/lib/mysql
-v backup:/data
--privileged
-e CLUSTER_JOIN=node2
--name node1
--net=net1
--ip 127.18.0.2 pxc

PXC容器中安装XtraBackup,并执行备份

shell 复制代码
apt-get update
apt-get install percona-xtrabackup-24

# 全量备份
innobackupex --user=root --password=123456 /data/backup/full
# 查看宿主机中的数据卷
docker inspect backup

全量冷还原

  • 删除数据库集群的所有节点
shell 复制代码
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
  • 删除数据库集群关联的数据卷
shell 复制代码
docker vokume rm v1 v2 v3 v4 v5
  • 重新创建数据库集群节点
shell 复制代码
docker volume create v1

docker run -d -p 3306:3306 
-e MYSQL_ROOT_PASSWORD=123456 
-e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456 
-v v1:/var/lib/mysql
# 找到备份的数据卷,映射到集群中
-v backup:/data
--privileged 
--name=node1 
--net=net1 
--ip 172.18.0.2 
pxc
  • 清空mysql数据
shell 复制代码
rm -rf /var/lib/mysql/*
  • 把没有提交事务回滚一下
shell 复制代码
innobackupex 
--user=root 
--password=123456
--apply-back
/data/backup/full
  • 执行冷还原
shell 复制代码
innobackupex 
--user=root 
--password=123456
--copy-back
/data/backup/full
  • 重启集群节点
shell 复制代码
docker restart node1

redis高速缓存

高速缓存利用内存保存数据,读写速度远超硬盘。高速缓存可以减少I/O操作,降低I/O压力。

redis集群方案

  • redisCluster,没有中心节点。客户端与redis节点直连,不需要中间代理层。官方推荐。
  • codis,中间件产品,存在中心节点
  • twemproxy,中间件产品,存在中心节点。

配置RedisCluster集群

  • 安装redis镜像。
shell 复制代码
docker pull yyyyttttwwww/redis
  • 创建网络
shell 复制代码
docker network create --subnet=172.19.0.0/16 net2
  • 运行redis容器
shell 复制代码
docker run -it -d 
# redis默认端口6379
-p 5001:6379
-net=net2
--ip 172.19.0.2
--name r1
redis bash
  • 修改redis的配置文件
shell 复制代码
# /usr/redis/redis.conf

# 运行在后台
daemonize yes 
# 开启集群
cluster-enabled yes
# 集群配置文件
cluster-config-file nodes.conf
# 超时时间
cluster-node-timeout 15000
# 开启AOF模式,开启日志
appendonly yes
  • 启动redis程序
shell 复制代码
# 进入 /usr/redis/src

./redis-server ../redis.conf

依据上面的操作,创建若干redis节点。

nginx负载均衡

安装nginx镜像

shell 复制代码
docker pull nginx

上传nginx.conf文件

ini 复制代码
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
	
	proxy_redirect          off;
	proxy_set_header        Host $host;
	proxy_set_header        X-Real-IP $remote_addr;
	proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
	client_max_body_size    10m;
	client_body_buffer_size   128k;
	proxy_connect_timeout   5s;
	proxy_send_timeout      5s;
	proxy_read_timeout      5s;
	proxy_buffer_size        4k;
	proxy_buffers           4 32k;
	proxy_busy_buffers_size  64k;
	proxy_temp_file_write_size 64k;
	
  # 负载均衡,需要启动多个后台接口容器
	upstream serve_list {
		server 192.168.99.104:6001;
		server 192.168.99.104:6002;
		server 192.168.99.104:6003;
	}
	server {
        listen       6101;
        server_name  192.168.99.104; 
        location / {  
            proxy_pass   http://serve_list;
            index  index.html index.htm;  
        }  

    }
}

启动nginx容器

shell 复制代码
docker run -it -d --name n1 
-v /home/n1/nginx.conf:/etc/nginx/nginx.conf
--net=host
--privileged
nginx

创建两个nginx节点,通过keepalived实现双机热备。

前端也可以实现负载均衡,实现双机热备,防止一个服务器程序挂掉,服务停止响应。 创建多个前端服务,然后通过nginx实现负载均衡,再通过keepalived实现双机热备。

相关推荐
小白小白从不日白7 分钟前
react hooks--useReducer
前端·javascript·react.js
下雪天的夏风19 分钟前
TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
前端·javascript·typescript
diygwcom31 分钟前
electron-updater实现electron全量版本更新
前端·javascript·electron
Hello-Mr.Wang1 小时前
vue3中开发引导页的方法
开发语言·前端·javascript
程序员凡尘1 小时前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
编程零零七5 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
(⊙o⊙)~哦7 小时前
JavaScript substring() 方法
前端
无心使然云中漫步7 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者7 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_8 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js