nginx404
可能因为(前端)nginx缺少配置
可以加一段配置:
location / {
try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
index index.html index.htm;
}
#对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
#因此需要rewrite到index.html中,然后交给路由在处理请求资源
location @router {
rewrite ^.*$ /index.html last;
}
莫名其妙的跨域
No 'Access-Control-Allow-Origin' header is present on the requested resource.
可能的解决办法:换个浏览器
vue3本地编译前端项目后,serve访问显示空白并报错
报错:Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "video/mp2t". Strict MIME type checking is enforced for module scripts per HTML spec.
问题原因:
本地开发环境是Win 10, 在Linux上编译并运行没有这个错误,一切正常。原因是win 10注册表默认将将 javascript 类型文件Content-Type更改为 text/plain, 而Linux行访问的Content-Type是text/html。
前端打包时因typescript报错
可以把build命令中的vue-tsc直接删掉
单机锁(synchronized)
synchronized (this){
// 需要加锁的代码
}
防止用户快速重复点击导致绕过校验
这里的锁是加在对象上的,所以括号内参数不能new一个对象
vercel 前端部署
npm install -g vercel
命令:vercel --prod
(但是vercel的跨域问题解决起来似乎比较麻烦,而且国内不方便访问,不推荐作为一个方案)
怎么对所有用户匹配,取TOP-N
直接取出所有用户,依次和当前用户计算分数,取TOP-N(54秒)
优化方法
1.切忌不要在数据量大的时候循环输出日志(取消掉日志后20秒)
2.Map存了所有的分数信息,占用内存
解决:维护一个固定长度的有序集合(sortedSet)),只保留分数最高的几个用户(时间换空间)
e.g.【3,4,5,6,7】取TOP 5, id为1的用户就不用放进去了
类比大数据推荐机制
https://www.yuque.com/chuanzhongyun/et8i24/fwmkhgway4dew19q
前端不同页面怎么传递数据
1.url querystring (xxx?id=1)
2.url (/team/:id, xxx/1)
(跳转页面用的)
3.hash(/team#1)
4.localStorage
5.context(全局变量,同页面或者整个项目需要用的)
mybatis-plus打印sql语句
在application.yml中配置
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
@EqualsAndHashCode(callSuper = true)
假设你有一个继承自某个类的子类,并且你想要在这个子类中实现 equals() 和 hashCode() 方法,同时考虑父类的状态。如果不使用 Lombok 或者不使用 callSuper = true,你将需要手动编写这些方法,并在其中调用父类的 equals() 和 hashCode() 方法,以确保继承链中所有相关字段都被考虑。
原文链接:https://blog.csdn.net/chenyu_Yang/article/details/140849544
BeanUtils.copyProperties(A,B);
把一个对象A的参数值传给另一个对象B
可以用在把request请求的参数传入domain对象中
mysql数据库突然连接不到
java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
这里只要在服务里重启一下mysql服务即可
vue找不到引入
编译器自动引入会出问题,要在文件名结尾加上“.vue”
localhost和127.0.0.1不能互相替换
localhost和127.0.0.1都表示本地主机,并且php5.2都支持二者,但不表示可以随意使用。比如在localhost下建立的session变量在127.0.0.1下并不能使用。
session不认为localhost和127.0.0.1是同一个主机。
登录时种cookie
后端处理(非必要,但是有多个前端时是需要的)
domain位置写种cookie的地址
前端处理
以及,前端用axios时要设置好种cookie
(这里还会涉及到跨域问题,需要在后端再添加个↓)
@Crossorigin(origins http://127.0.0.1:5173"},allowCredentials"true")
动态表示变量:[editUser.value.editKey]
一种JS语法,如:{
[editUser.value.editKey] = XXXX
}
会报红色,但不影响运行
但也可以通过[editUser.value.editKey as string] 的方式指定类型,来解决爆红
package打包失败
Please refer to XXXXXXXXXX for the individual test results.
直接跳过测试即可
为什么服务器A登录后,请求发到服务器B,不认识该用户?
用户在A登录,所以session(用户登录信息)存在了A上
结果请求B时,B没有用户信息,所以不认识。
解决方案:共享存储,而不是把数据放到单台服务器的内存中
如何共享存储?
1.Redis(基于内存的K/V数据库)此处选择Redis,因为用户信息读取/是否登录的判断极其频繁,Redis基于内存,读写性能很高,简单的数据单机qPs5w-10w
2.MySQL
3.文件服务器ceph
Session共享
种session的时候注意范围,cookie.domain
比如两个域名:
aaa.yupi.com
bbb.yupi.com
如果要共享cookie,可以种一个更高层的公共域名,比如yupi.com
可用Redis实现
https://www.yuque.com/chuanzhongyun/et8i24/tdzcxm98d1h4vagv
Get请求常见错误:后端无法接收参数
这是因为参数放在url中时,可能由于特殊的字符,后端无法接收
解决办法:qs库(参数序列化)
qs参数(indices、brackets和repeat的含义)解释:
跨域(后端)
跨域问题解决
浏览器为了用户的安全,仅允许向同域名、同端口的服务器发送请求。
如何解决跨域?
最直接的方式:把域名、端口改成相同的
添加跨域头
让服务器告诉浏览器:允许跨域(返回cross-origin-allow响应头)
1.网关支持(Nginx)
# 跨域配置
location ^~ /api/ {
proxy_pass http://127.0.0.1:8080/api/;
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers '*';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}
2.修改后端服务
1.配置@CrossOrigin注解
2.添加web全局请求拦截器
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的路径
registry.addMapping("/**")
//设置允许跨域请求的域名
//当 **Credentials为true时,** Origin不能为星号,需为具体的ip地址【如果接口不带cookie,ip无需设成具体ip】
.allowedOrigins("http://localhost:9527", "http://127.0.0.1:9527", "http://127.0.0.1:8082", "http://127.0.0.1:8083")
//是否允许证书 不再默认开启
.allowCredentials(true)
//设置允许的方法
.allowedMethods("*")
//跨域允许时间
.maxAge(3600);
}
}
3.定义新的corsFilter Bean,参考:https:/www.jianshu.com/p/b02099a435bd
运行项目时打个小广告
在resources文件夹下新建一个banner.txt,里面写上内容,每次运行项目就会展示
图片防盗链-no-referrer
前端使用图片打不开,可能是用的图片有防盗链,可以在index.html里加上no-referrer代码(百度一下就能找到代码)
@Profile(“在特定条件下激活”注解)
如@Profile("dev"),指【这个注解下的内容】在dev环境才会激活
EasyExcel
两种读对象的方式
1.确定表头,建立对象,和表头形成映射关系
2.不确定表头,每一行数据映射为Map<String, Object>
两种读取方式
1.监听器:先创建监听器,在读取文件时绑定监听器。好处是,单独抽离处理逻辑,代码清晰易维护,一条条处理数据,适用于数据量大的场景
2.同步读:无需创建监听器,一次性获取完整数据。方便简单,但是数据量大时会有等待时常,也可能内存溢出。
Swagger2配置(接口文档)
1.引入依赖(swagger或knife4j)
2.自定义一个swagger配置类(直接复制粘贴即可,只是要对其中一个方法修改一些文字性的说明)
3.定义需要生成接口文档的位置(controller位置)
如果只想部分生成接口文档,那么对PathSelectors换个函数,尤其是注意线上不要把接口全暴露出去,可以通过@Profile来限制生效
坑:
1.如果springboot version >= 2.6,需要在application.yml中添加如下配置
spring:
mvc:
pathmatch:
matching-strategy:ANT_PATH_MATCHER
2.这两个包冲突,启动不起来时删掉其中一个↓
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.9</version>
</dependency>
可以通过在controller方法上添加@Api、@ApilmplicitParam(name="name",value='姓名",required=true)@ApiOperation(value="向客人问好")等注解来自定义生成的接口描述信息
弄好后可以打开http://localhost:8080/api/doc.html查看后端文档
前端处理数组 flatmap
tagList.value = originTagList.map(parentTag => parentTag.children)