部署步骤

1.创建数据库

2.修改application.yml文件

把jar包解压,然后修改里面的application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 补充allowPublicKeyRetrieval+useSSL=false,解决宝塔MySQL连接问题
    url: jdbc:mysql://localhost:3306/wuyi_mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
    username: wuyi  # 生产环境建议新建非root账号(如wuyi),降低权限风险
    password: 123456  # 生产环境务必修改为复杂密码,宝塔MySQL面板中同步更新
  application:
    name: wuyi-mall

  jpa:
    hibernate:
      ddl-auto: none  # 生产环境改为none,避免JPA自动修改表结构
    show-sql: false   # 生产环境关闭SQL打印
    # 核心修复:显式指定MySQL8方言,解决启动报错
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: false  # 关闭SQL格式化,提升性能
        use_sql_comments: false
  
  # Jackson配置(生产环境简化)
  jackson:
    mapper:
      ACCEPT_CASE_INSENSITIVE_PROPERTIES: true
    serialization:
      INDENT_OUTPUT: false  # 关闭JSON格式化,提升响应速度
      WRITE_DATES_AS_TIMESTAMPS: false
    deserialization:
      FAIL_ON_UNKNOWN_PROPERTIES: false

  # 文件上传配置
  servlet:
    multipart:
      max-file-size: 2MB
      max-request-size: 10MB

# 文件上传路径(服务器宝塔目录)
file:
  upload:
    path: /www/wwwroot/wuyi_mall_12.21/backend/uploads/  # 服务器存储路径
    prefix: http://47.110.83.xxx/upload/  # 前端访问文件的公网前缀

# 支付宝配置(适配服务器环境)
alipay:
  app-id: 2021000122677777
  private-key: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCVb+xYChdqTRDFoEaHs+k0g9V+x3QawOVmymvLMMOlezNMojUK74oAnF1kJ0EdDffVxU5lyE51CDVLZ5W0iS13TtwgHjyLIkhzBW0KXduzFAV0lak3YJVaOP1dcL+9C1dNNYbYzPdzEy0d2gOV++t6bGmoA0gJvUK78RZfXuKmw67ClnKoBlDDN45Vw5ma5hmwdbiAtiiUCehZTuRSWtgqhz7dZCDhD9fPLxCnmP7PMYqoL0pXr3Rb6IqFIWq/55uANuhD8NEhG5MRvSZ8iP3q8udlqNWpVOgtfqKawzlZuDgGhCpIEr5Ib5MZ7IhEvQBXG1ZnPiYiittXgRl/RoshAgMBAAECggEAElLbBCCYpmw0tkbk3xbsbYgM0bLbRbyJZIVFmnCsTMpCjA8HugONRG3n9bPqhAmGbiv3ZPuewzLydgCJls2LSandzAJpIhZeE9yCdlbz7Y1y7cy8JxIsvhdm2eJNYHzXg5wgoMzhOrcLPTHSZr2xLh3FBtkAKFGQsULqn18fI5uBfj6bPw8nWsosTk/eMWFpH3EuL1hC4a2+VK7bjgk4KJPf1sdkiqP0ciOjh9CfC2zAi/7e7dMdXj3NYZo/P2JyHkVThSeF/1tizHN1KN8MR8qA177og+3HkTPcco5Kx6WmkPz2mDWkYw2op6/iaSp+PQJprCbMJXwxGLkaQV3v0QKBgQD7swojvv876FhD3qIB03WBVfyNHkFN2ODp/p+i1opBf0OInVD1ua1TrqRf2JcrYk91DO9YkfCVBxDzaOPOgfgVrGD+dmSLzclm6gfHa2VVxE4BFUTiA8kBDLmHt5Xkod7qI3sGRSijtUfHoEjTfc18e9KgzV7PEvtpTlH9QHhtqwKBgQCX/ZPoBiHDn1C6tnTp7e9uqGKQKYvZA0N/fMwL757zH5qag6KsLBVzv/MglEI2by7sbIC2HVmYDodzcyhNkViaEMNhH2LiWcaSWz6O+AeWF+bCTt6HHcOatFkfRTVQ9gTw6KhPTI86yqX02I4ar1U4b5Z7SRGqAaj51+1kCQZmYwKBgQDvtYivmIQdut7s7Efgc1ISdiDLCQhqqmUxlLTV8XrEe/6GSkTDcS04aDfVrEH0KHHB6Sq9cGfulkc3eiqTDsaFZaEOVxTU7Iyl/bag3pAoyYb8kxQCKFazMDo1ncscbmkNFfNhelYE623MGcOh38rmhkqHqG9lyQ81MEj3ZwIKdwKBgFicPd7HtGeYOjigpwi67xxUjyH9FssuW+u3lj5fNQwJINl0ZSJ7kQYqolQcG34g0/qCR4flFJbR4aYtPRH76uvnWgEFi2DrdhldmNtBPysCREaENLgRYjiPbGYOs0bAJ6FMAtQ4jkh4XMiieDaWgdilNdYqg2HaFemTOZNYr6KBAoGBAMLsrOVwLiKYn5AYxPDNLSC/uiVjH5jzJO9OcyG6cvY9HDSdxpuvMDYqa0FXPk0WKJFbmYudb+1LuQZxJzDyz7hSDILOxeBhBs8Bexhic0ngsegwD5uqHy7jbRZ5ZVVizmJbNXjMkLdW2peyyHIsuM21M7VTQrAPByN3KWcKiHHI"
  public-key: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9KXiZqGtGr6f0Nk7i6R/fl2eJ17ruNrJbDi3Hwj8Yz7eLqnW5Ju83HEWUdfoXXlAXegK6hcZtVm2C7IfiHODBLjC+tFadY54aq9NbCM3S15ejvJVrs61kORaD+38YZCAJlnP/2sDsdtSgOEGxZjLx4l7CcGyx4+i8Ausx30JxRdUiHHZzTCivYcpXZQncZWV8AxK/gfBtAAMcrO88f6XRZlAl/nQel0tIfTWk7xbffdTFh9cRIoBE+NF6uFHmdxuSerjMx59B17H4kA5iQckqrJNxw7gi3f7Pu4W/u5w3qorktO32lF/H/pr2+fhpeq1qJWBu4MtIpWxrsALjVFp7wIDAQAB"
  notify-url: "http://47.110.83.xxx/api/pay/alipay/notify"  # 服务器回调地址
  return-url: "http://47.110.83.xxx/orders"  # 前端跳转地址

server:
  port: 8081
  # 注释context-path,避免接口路径重复
  # servlet:
  #   context-path: /api
  
  # 静态资源+跨域配置
  web:
    resources:
      static-locations: classpath:/static/,file:${file.upload.path}
    cors:
      allowed-origins: "http://47.110.83.xxx,http://localhost:5173,http://localhost:5174"
      allowed-methods: GET,POST,PUT,DELETE,OPTIONS
      allowed-headers: "*"
      allow-credentials: true
  # 连接超时配置,避免后端响应慢导致502
  tomcat:
    connection-timeout: 30000
    threads:
      max: 200  # 增大线程数,适配并发

# 日志配置(增强排查能力)
logging:
  level:
    root: INFO
    org.springframework.web: INFO
    org.hibernate: WARN  # 降低Hibernate日志级别,减少冗余
    com.wuyi.mall: DEBUG  # 业务包名,按需开启
    com.alipay: DEBUG  # 支付宝日志,排查支付问题
  file:
    name: /www/wwwroot/wuyi_mall_12.21/backend/logs/wuyi-mall.log
  pattern:
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"  # 日志格式优化
  logback:
    rollingpolicy:
      max-file-size: 100MB  # 单个日志文件大小限制
      max-history: 7  # 日志保留7天

然后重新打包jar包

jar uf C:\Users\yzy\Desktop\temp\wuyi-mall-1.0.0.jar -C C:\Users\yzy\Desktop\temp\wuyi-mall-1.0.0 BOOT-INF/classes/application.yml

把jar包上传到宝塔的[文件]里,然后创建yml里规定的文件夹

类型路径(宝塔服务器)用途创建时机权限要求
文件夹/www/wwwroot/wuyi_mall_12.21/项目根目录(包含后端、前端、日志、上传文件)上传 jar 包前755(所有用户可读可执行,所有者可写)
文件夹/www/wwwroot/wuyi_mall_12.21/backend/后端 jar 包存放目录上传 jar 包前755
文件夹/www/wwwroot/wuyi_mall_12.21/backend/uploads/文件上传目录(对应file.upload.path启动 jar 包前755(需让 SpringBoot 有写入权限)
文件夹/www/wwwroot/wuyi_mall_12.21/backend/logs/日志存放目录(对应logging.file.name启动 jar 包前755
配置文件/www/wwwroot/wuyi_mall_12.21/backend/application.yml生产版配置文件(若用 “外部挂载” 方式,需单独上传)上传 jar 包后、启动前644(只读,避免误改)
(可选)文件夹/www/wwwroot/wuyi_mall_12.21/frontend/前端 Vue 打包后的dist目录存放处部署前端前755

后续需要修改的话,就启动时指定加载外部配置文件(优先级高于 jar 内配置)

3.启动 SpringBoot 后端

# 进入后端目录
cd /www/wwwroot/wuyi_mall_12.21
# 启动jar包(替换为你的jar包名称,比如wuyi-mall-1.0.0.jar)
nohup java -jar wuyi-mall-1.0.0.jar > start.log 2>&1 &
# 查看启动日志,无报错则正常
tail -f start.log
# 查看端口是否被占用(8081端口有进程则成功)
netstat -tlnp | grep 8081
#杀死旧进程
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null

4.部署前端 Vue 项目

执行node -vnpm -v,能显示版本号(如v16.18.0)则正常

若项目是刚拉取的 / 依赖未安装,先安装项目依赖:

# 示例:切换到项目目录(替换为你的实际路径)
cd D:\wuyi_mall_12.21\frontend
npm install

生成 dist 文件夹:

npm run build

打包成zip压缩包,上传到宝塔的wuyi_mall_12.21\frontend

然后双击解压

直接访问服务器 IP:打开浏览器,输入http://47.110.83.xxx✅ 成功标志:能看到 Vue 项目首页

宝塔配置前端站点:

宝塔 → 左侧「网站」→ PHP→「添加站点」;
域名:填写你的服务器 IP(47.110.83.xxx)!!!记得换成你的IP;
根目录:选择/www/wwwroot/wuyi_mall_12.21/frontend/dist;
PHP:静态

然后点击站点右侧设置→配置文件,改为:

server
{
    listen 80;
    server_name 47.110.83.xxx;
    # 1. 仅保留index.html(Vue入口),删除PHP相关索引
    index index.html index.htm;
    root /www/wwwroot/wuyi_mall_12.21/frontend/dist;
    
    #CERT-APPLY-CHECK--START
    include /www/server/panel/vhost/nginx/well-known/47.110.83.xxx.conf;
    #CERT-APPLY-CHECK--END
    include /www/server/panel/vhost/nginx/extension/47.110.83.xxx/*.conf;
    
    #SSL-START
    #error_page 404/404.html;
    #SSL-END

    #ERROR-PAGE-START
    error_page 404 /404.html;
    #ERROR-PAGE-END

    # 2. 删除PHP引用(前端是静态文件,无需PHP)
    # include enable-php-00.conf;

    #REWRITE-START
    include /www/server/panel/vhost/rewrite/47.110.83.xxx.conf;
    #REWRITE-END

    # 3. 新增:Vue History路由适配(刷新页面不404)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 4. 新增:反向代理后端API到8081端口
    location /api/ {
        proxy_pass http://127.0.0.1:8081/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    location ~ \.well-known{
        allow all;
    }

    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }
    access_log  /www/wwwlogs/47.110.83.xxx.log;
    error_log  /www/wwwlogs/47.110.83.xxx.error.log;
}

打开上端的反向代理,直接点Nginx修改配置文件为:

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

stream {
    log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
  
    access_log /www/wwwlogs/tcp-access.log tcp_format;
    error_log /www/wwwlogs/tcp-error.log;
    include /www/server/panel/vhost/nginx/tcp/*.conf;
}

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
        include       mime.types;
		#include luawaf.conf;

		include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 100m; # 改1:扩大文件上传限制(默认50m,适配图片/文件上传)
        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;
        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 5;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;

server
    {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
        allow 127.0.0.1;
        allow ::1;
        deny all;

        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
        }

        access_log  /www/wwwlogs/access.log;
    }

# ========== 新增的前端+反向代理配置 start ==========
server
    {
        listen 80;
        listen [::]:80;
        server_name 47.110.83.xxx;
        root /www/wwwroot/wuyi_mall_12.21/frontend/dist;
        index index.html index.htm;

        # 解决Vue路由刷新404
        location / {
            try_files $uri $uri/ /index.html;
        }

        # API接口代理(核心修改:去掉proxy_pass末尾的/)
        location /api/ {
          proxy_pass http://127.0.0.1:8081;  # 去掉末尾的/
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_connect_timeout 30s;
          proxy_send_timeout 30s;
          proxy_read_timeout 30s;
        } 

        # upload文件访问代理(核心修改:去掉proxy_pass末尾的/upload/)
        location /upload/ {
          proxy_pass http://127.0.0.1:8081;  # 去掉末尾的/upload/
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_connect_timeout 30s;
          proxy_send_timeout 30s;
          proxy_read_timeout 30s;
        }

        # 日志配置(开启debug级日志,排查问题用)
        access_log /www/wwwlogs/wuyi-mall-access.log;
        error_log /www/wwwlogs/wuyi-mall-error.log debug;
    }
# ========== 新增的前端+反向代理配置 end ==========

include /www/server/panel/vhost/nginx/*.conf;
}

5.改本地地址为服务器地址

修改文件中的baseURL为’',并将request.js 里的http://localhost:8081进行修改:

String fileUrl = "http://localhost:8081/upload/" + filename;改成String fileUrl = "http://47.110.83.xxx/upload/" + filename;

把所有http://localhost:5174和http://localhost:5173改成http://47.110.83.xxx

更多推荐