个人网站开发——全栈项目开发日记

article/2025/5/13 21:38:40

文章目录

  • 第一种部署方式(前端打包到后端)
    • 打包
      • 前端
      • 后端
  • 第二种部署方式(Nginx代理-推荐)
    • nginx代理配置
      • 访问路径端口
      • 后端端口
    • 服务器运行
      • 传到服务器
      • 在服务器后台运行
  • 功能实现记录
    • axios请求使后端响应数据
      • 对访问者ip获取
      • 对访问者ip记录
    • 连接mysql数据库
      • 用户登录功能开发
  • 开发、测试环境注意修改内容
    • 测试运行
      • 第一种方法
      • 第二种方法
    • 前端vue
      • login组件
    • 后端Spring boot
      • yml数据库
      • 本地数据库
  • 前端vue注意事项
    • 全局事件总线
  • 后端java注意事项
  • webstorm运行项目
  • 运行上线时可能会遇到的各种bug
    • 请求外网api异常时,不要强制请求
    • mysql连接池爆掉
    • 外网无法访问服务器
      • 解决方案
  • linux进程操作

第一种部署方式(前端打包到后端)

打包

前端

webstrom打包
在这里插入图片描述

后端

把dist直接丢到static文件夹里面
在这里插入图片描述
打包
在这里插入图片描述

第二种部署方式(Nginx代理-推荐)

linux使用nginx代理服务器
实现步骤,前端打包,传到nginx默认路径
后端打包jar,随便在某个位置运行即可

java -jar "jar包名"

nginx代理配置

访问路径端口

在这里插入图片描述
比如这里,我们要访问81端口,才能访问到资源
在这里插入图片描述
在这里插入图片描述

后端端口

只影响api请求地址
比如前端注意
在这里插入图片描述
后端注意
在这里插入图片描述

服务器运行

传到服务器

winSCP链接服务器
在这里插入图片描述
后端target文件复制到这里即可
在这里插入图片描述

在服务器后台运行

安装screen

yum install screen

开启新的窗口

screen -S taotao

安装jdk后使用下面命令运行项目

java -jar 项目名

功能实现记录

axios请求使后端响应数据

需要安装axios并在组件中引入

npm install axios --save-D
import axios from 'axios'

成功
在这里插入图片描述

对访问者ip获取

import axios from 'axios'
//引入组件
export default {name: 'Home',mounted() {//向服务端发送请求axios({method: 'post',url: 'http://43.142.56.133:80/Test/demo',url: 'http://www.guiguimaster.xyz:80/Test/demo',})console.log('home组件挂载了')},
}
package com.taotao;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/*** create by 刘鸿涛* 2022/12/2 17:01*/
@SuppressWarnings({"all"})
@RestController
@RequestMapping("/Test")
public class Test {int count = 0;@PostMapping("/demo")public void getIP(HttpServletRequest request) {if (request.getHeader("x-forwarded-for") == null) {System.out.println(request.getRemoteAddr());} else {System.out.println(request.getHeader("x-forwarded-for"));}System.out.println("执行成功,您的服务器被访问了 " + (++count) + " 次");}
}

效果
在这里插入图片描述

对访问者ip记录

package com.taotao;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;/*** create by 刘鸿涛* 2022/12/2 17:01*/
@SuppressWarnings({"all"})
@RestController
@RequestMapping("/Test")
public class Test {//全局静态变量,统计访问次数public static int VisitCount = 0;@PostMapping("/demo")public void getIP(HttpServletRequest request) {String visitorIP = "";if (request.getHeader("x-forwarded-for") == null) {visitorIP =  request.getRemoteAddr();} else {visitorIP = request.getHeader("x-forwarded-for");}System.out.println("执行成功,您的服务器被访问了 " + (++VisitCount) + " 次");//调用文件流方法WriteServerLogs(visitorIP);}public static void WriteServerLogs(String write) {//文件流String serverLogs = "/MyWeb/server.logs";File file = new File(serverLogs);//如果不存在if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {System.out.println("创建server.logs文件失败");}} else {System.out.println("文件已存在,准备写入文件");}//创建bw准备写入数据BufferedWriter bw = null;try {//append参数代表追加,不覆盖文件bw = new BufferedWriter(new FileWriter(file,true));} catch (IOException e) {System.out.println("BufferedWriter对象创建失败");}//写入内容try {//这里传入参数,注意换行时使用转义字符,\r\n,实现换行bw.write(write + "\r\n");} catch (IOException e) {System.out.println("写入错误");}//关闭流if (bw != null) {try {bw.close();} catch (IOException e) {System.out.println("关闭流异常");}}}
}

连接mysql数据库

更改yml文件

spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://43142.56.133:3306/mybatis?serverTimezone=UTCusername: rootpassword: xxxxxxxx

添加依赖

        <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

用户登录功能开发

在这里插入图片描述

连上了,准备先自己写个用户登录业务,不过使用boot框架的话确实学不到什么东西,都已经忘了连接数据库的jdbc代码了,boot全是封装好的注解

前端向后端提交表单数据有点蒙
请添加图片描述
就这么一个表单,我还是准备用axios请求
在这里插入图片描述
使用vue双向绑定,提交时候走这个axios请求就行了
在这里插入图片描述
跨域问题,实际开发中跨域问题要经常处理
在这里插入图片描述
但是我不明白为何requestbody没有正常得到前端数据

请添加图片描述

在这里插入图片描述
请添加图片描述

后端功能正常,前端接收后端回返数据正常,登录成功,还需要设计下前端login按钮位置,以及如何展示后端这些数据的问题
在这里插入图片描述
这样的话就有点感觉了
然后前端根据后端的json数据,可以判断用户登录状态,并且做出相应的反应
这是密码错误状态
在这里插入图片描述
这边是用户名不存在情况
在这里插入图片描述
业务中直接获取了表单中username的值,调试后发现这个表单数据还是存在与vue实例中的
在这里插入图片描述
在这里插入图片描述

开发、测试环境注意修改内容

测试运行

有两种方法

第一种方法

后端项目与前端项目分别启动即可,前端依然可以测试数据库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二种方法

单独从后端启动
前端项目打包后的dist文件夹内容复制到后端的static文件夹下下运行后端,然后在idea中启动

前端vue

login组件

在这里插入图片描述

后端Spring boot

yml数据库

在这里插入图片描述

本地数据库

在这里插入图片描述

前端vue注意事项

全局事件总线

前提有3个组件互相传递数据,其中两个组件都开启过监听事件,在你用完第三个组件准备在销毁组件时释放全局事件总线,那么,之前两个组件中的监听事件也会关闭,需要重新开启

  beforeDestroy() {//释放全局事件总线bus,已经有开启的组件并还需要使用时,不能随便释放,否则会导致其他组件监听重置,需要重新开启监听// this.$bus.$off()}

后端java注意事项

webstorm运行项目

在这里插入图片描述
在这里插入图片描述

运行上线时可能会遇到的各种bug

请求外网api异常时,不要强制请求

这是我初始化ai性格的地方,但是需要外网,但是我的域名使用外网进不去,所以就很冲突,导致这个api请求失败,导致项目中其他api请求失败
在这里插入图片描述

mysql连接池爆掉

errorCode 1129, state HY000, Host ‘xxx‘ is blocked because of many connection errors
查看连接池容量,默认100

show global variables like '%max_connect_errors%'

在这里插入图片描述

改为99999

set global max_connect_errors=99999

外网无法访问服务器

原因是因为screen运行的jar包,因为服务器站点在国内,所以这样运行导致外网不能访问

解决方案

使用nginx代理服务器来进行服务器上传

linux进程操作

查询关于java的进程

ps -ef|grep java

关闭进程

kill -9 进程id

http://chatgpt.dhexx.cn/article/n4yXQgHJ.shtml

相关文章

c语言:输入字符串,并判断字符串的长度

c语言中表示输入数据的类型&#xff0c;其格式符和意义下表所示。 格式 字符意义 d 输入十进制整数 o 输入八进制整数 x 输入十六进制整数 u 输入无符号十进制整数 f或e 输入实型数(用小数形式或指数形式) c 输入单个字符 s 输入字符串 转义字符 转义字符是一种特殊的字符常量。…

C语言:字符数组的输入输出

目录 用printf输出 用scanf输入 用gets输入 用puts输出 用printf输出 输出方法1&#xff1a;printf 逐个字符输出。 void main(void){ char c[ ] "I am happy"; int i; for(i 0; i < 10; i){ printf("%c", c[i]); } pri…

c语言---字符输入

1 getchar() getchar接受一个字符 可输入任何字符 结束标志由自己决定,需在后面手动补全\0 输入 &#xff1a;abcd d 打印&#xff1a;6 2 fgets() fgets(); 函数原型 char *fgets(char *str, int n, FILE *stream) 输入读取&#…

C语言学习(十一)之字符输入/输出

文章目录 一、单字符I/O&#xff1a;getchar()和putchar()二、缓冲区2.1 什么是缓冲区2.2 为什么需要缓冲区2.3 缓冲区分类2.3.1 完全缓冲I/O2.3.2 行缓冲I/O 三、结束键盘输入3.1 文件、流和键盘输入3.2 文件结尾 四、重定向和文件4.1 重定向输入4.2 重定向输出4.3 组合重定向…

C语言_输出字符串和获取字符串

输出字符串和获取字符串 01——输出字符串 使用puts函数来输出字符串 使用printf函数来输出字符串 通过puts函数和printf函数都能够实现字符串输出 02——获取字符串 使用scanf函数来获取字符串 使用gets()函数来获取字符串. gets函数原型&#xff1a;char* gets(char *st…

c语言之printf函数输出字符数据

//用printf函数输出字符数据 #include <stdio.h> int main() {//定义两个变量char c a;int i 97;//输出变量%c以字符形式输出&#xff0c;%d以十进制整型形式输出printf("c%c,c%d\n", c, c);printf("i%c,i%d\n", i, i);return 0; } 运行结果&…

在C语言中怎样定义一个字符串并输入输出

在C语言中没有字符串类型&#xff0c;用字符数组处理字符串 字符数组定义&#xff1a;char 数组名 [常量表达式][常量表达式] 说明&#xff1a;一维字符数组&#xff0c;用于存储和处理一个字符串 。二维字符数组&#xff0c;用于同时存储和处理多个字符串 输入输出方法&…

用C语言输出一个字符串的所有子串

前言 啥是子串? 串中任意个连续字符组成的子序列称为该串的子串。 包含子串的串相应地称为主串。 ①空串是任意串的子串。 ②任意串是其自身的子串。 例&#xff1a;字符串"12"它的字串为"1",“2”,“12”,空串。共四个字串。 原理 懂了子串的概念我们…

C语言 字符数据输入输出

文章目录 C语言的标准库函数头文件 字符数据的输入输出putchar 函数&#xff08;单字符输出函数&#xff09;输出一个字符&#xff1a;输出控制字符输出转义字符 getchar 函数&#xff08;单字符输入函数&#xff09; 所谓数据的输入输出是从计算机角度出发的。 C语言本身没有…

c语言输出汉字字符串,c语言怎么输出字符串

C语言输出简单的字符串&#xff0c;例如个人信息的相关字符串&#xff0c;包括姓名、出生日期、号码。我们可以通过printf()函数直接打印输出指定信息字符串。 推荐教程&#xff1a;《C视频教程》 下面我们就通过简单的代码示例&#xff0c;给大家介绍c语言输出个人信息相关字符…

C语言程序——输出字符

为学日益&#xff0c;为道日损 文章目录 前言一、使用C语言一般格式显示字符二、编写代码2.运行结果 总结 前言 一个标准的C语言程序具有的一般格式&#xff1a; 预处理命令和全局性的声明 main() 主函数 { 局部变量声明 语句序列 } fun1()函数1 { 局部变量声明 语句序列 } fu…

C语言字符和字符串的输入与输出

C语言 一、输入单个字符 1、scanf函数输入单个字符 C语言scanf输入时缓冲区问题 scanf函数是标准输入流&#xff08;从键盘接收数据)&#xff0c;接收的数据放入输入缓冲区中&#xff0c;其中就包括在键盘输入的空格、回车这类字符&#xff0c;当你用%d接收时是不会影响的&a…

【C语言--字符数据的输入输出】

1、putchar函数–字符输出函数 功能是在显示器上输出单个字符。形式为&#xff1a;putchar(字符变量); 例如&#xff1a; putchar(A);//输出大写字母A putchat(x);//输出字符变量x的值2、getchar函数–键盘输入函数 功能是从键盘上输入一个字符。形式为&#xff1a;getchar(…

C语言打印输出字符串的几种方法

思路分析 知识点补充 1&#xff0c;在C语言中&#xff0c;一维数组的数组名实际上就是指向数组首项元素的指针。 2&#xff0c;如果指针p已经指向一个字符串&#xff0c;判断字符串是否结束&#xff0c;一般采用while(*p!\0)的办法。 以打印输出arr[30]"hello world&qu…

C语言——字符串、打印字符串的三种方式

文章目录 前言一、字符串1.字符串常量2.注意 scanf() 读取字符串例如&#xff0c;scanf() 输入中间有空格的字符串后观察打印情况 3.sizeof()函数计算字符串尺寸&#xff0c;strlen()函数计算字符串长度例子&#xff1a; 4.字符数组定义和初始化(1)传统的字符集合赋值&#xff…

C语言 格式输入输出与字符输入输出

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、 格式输入输出 1、格式输出——printf函数 &#xff08;1&#xff09;格式 printf("格式控制"&#xff0c;输出列表项)&#xff1b; 格式控制分为格式声明&#xff08;%和格式字符&am…

jmeter+ant+jenkins-接口自动化持续集成(与之类似的postman+newman+Jenkins接口自动化持续集成)

jmeterantjenkins-接口自动化持续集成 jmeterantjenkins-接口自动化持续集成基本安装配置Ant配置Jmeter配置Jenkins&#xff0c;构建持续集成 jmeterantjenkins-接口自动化持续集成 Jmeter可以做接口测试&#xff0c;也能做压力测试&#xff0c;而且是开源软件 Ant是基于Java的…

MAC jmeter+ant 实现接口测试并将接口测试报告以邮件的形式发出-超详细

最近项目组涉及到接口测试&#xff0c;然后自己想着如何输出接口测试的报告&#xff0c;经过自己的了解&#xff0c;发现测试行业中每个公司每个测试人员输出的方式都不一样的。常规的有以下几种 使用表格的形式&#xff0c;手动去写&#xff0c;以总结的形式&#xff0c;给到…

jmeter+ant+jenkins接口自动化测试框架搭建

一个完整的接口测试框架需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter可以做接口测试&#xff1b;Ant是基于Java的构建工具&#xff0c;完成脚本执行并收集结果生成报告&#xff0c;可以跨平台&#xff1b;Jenkins是持续集成工具。将这…

windows下,jmeter+jenkins+ant接口自动化测试环境搭建

&#xff08;一&#xff09;jdk安装与配置 利用jmeter进行接口自动化&#xff0c;需要用到jdk&#xff0c;因此需要下载并安装jdk&#xff0c;下载jdk并配置好环境变量&#xff08;可参考网上教程&#xff09; &#xff08;二&#xff09;ant安装与配置 1.下载ant&#xff0…